文档服务地址:http://47.92.0.57:3000/ 周报索引地址:http://47.92.0.57:3000/s/NruNXRYmV

Commit b5ea10ef by 王肇一

ready for interactive method

parent e61c02b6
...@@ -6,7 +6,7 @@ import argparse ...@@ -6,7 +6,7 @@ import argparse
from cvBasedMethod.util import * from cvBasedMethod.util import *
from cvBasedMethod.kmeans import kmeans, kmeans_back from cvBasedMethod.kmeans import kmeans, kmeans_back
from cvBasedMethod.threshold import threshold from cvBasedMethod.threshold import threshold
from predict import predict from utils.predict import predict
def method_kmeans(imglist, core = 5): def method_kmeans(imglist, core = 5):
...@@ -32,7 +32,7 @@ def method_newThreshold(imglist, process = 8): ...@@ -32,7 +32,7 @@ def method_newThreshold(imglist, process = 8):
def get_args(): def get_args():
parser = argparse.ArgumentParser(description = 'Identify targets from background by KMeans or Threshold', parser = argparse.ArgumentParser(description = 'Identify targets from background by KMeans or Threshold',
formatter_class = argparse.ArgumentDefaultsHelpFormatter) formatter_class = argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-m', '--method', metavar = 'M', type = int, default = 3, parser.add_argument('-m', '--method', metavar = 'M', type = int, default = 0,
help = '0 for KMeans; 1 for Threshold; 2 for newThreshold; 3 for Unet; 4 for further process', help = '0 for KMeans; 1 for Threshold; 2 for newThreshold; 3 for Unet; 4 for further process',
dest = 'method') dest = 'method')
parser.add_argument('-c', '--core', metavar = 'C', type = int, default = 5, help = 'Num of cluster', dest = 'core') parser.add_argument('-c', '--core', metavar = 'C', type = int, default = 5, help = 'Num of cluster', dest = 'core')
...@@ -59,8 +59,4 @@ if __name__ == '__main__': ...@@ -59,8 +59,4 @@ if __name__ == '__main__':
elif args.method == 1: elif args.method == 1:
method_threshold(path, args.process) method_threshold(path, args.process)
elif args.method == 2: elif args.method == 2:
method_newThreshold(path, args.process) method_newThreshold(path, args.process)
elif args.method == 3: \ No newline at end of file
predict(path, args.load, args.scale, args.mask_threshold)
for exName in filter(lambda x: x != '.DS_Store', os.listdir('data/output')):
draw_bar(exName, os.listdir('data/output/' + exName + '/csv'))
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
\ No newline at end of file from multiprocessing import Pool
from tqdm import tqdm
import argparse
import os
from utils.predict import predict
from resCalc import draw_bar
def get_args():
parser = argparse.ArgumentParser(description = 'A simple toolkit designed by Ulden',
formatter_class = argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--step', '-s', type = int, default = 1,help = "step 1: recognize; step 2: barcharts")
# Unet para
parser.add_argument('--module', '-m', default = 'data/module/MODEL.pth', metavar = 'FILE',
help = "Specify the file in which the model is stored")
parser.add_argument('--mask-threshold', '-t', type = float,
help = "Minimum probability value to consider a mask pixel white", default = 0.5)
parser.add_argument('--scale', '-S', type = float, help = "Scale factor for the input images", default = 0.5)
return parser.parse_args()
if __name__ == '__main__':
args = get_args()
path = [(y, x) for y in filter(lambda x: x != '.DS_Store', os.listdir('data/imgs')) for x in filter(
lambda x: x.endswith('.tif') and not x.endswith('dc.tif') and not x.endswith('DC.tif') and not x.endswith(
'dc .tif'), os.listdir('data/imgs/' + y))]
if args.step == 1:
predict(path, args.load, args.scale, args.mask_threshold)
for exName in filter(lambda x: x != '.DS_Store', os.listdir('data/output')):
draw_bar(exName, os.listdir('data/output/' + exName + '/csv'))
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from sklearn.cluster import KMeans from sklearn.cluster import KMeans
from cvBasedMethod.util import * from cvBasedMethod.util import *
import matplotlib.pyplot as plt
from resCalc import save_img,calcRes
def kmeans(pair, cluster_num = 5,filter='butter'): def kmeans(pair, cluster_num = 5,filter='butter'):
img_list = pre(pair,'clahe',filter) img_list = pre(pair,'clahe',filter)
......
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from cvBasedMethod.util import * from cvBasedMethod.util import *
from resCalc import save_img, calcRes
def threshold(pair,filter='butter'): def threshold(pair,filter='butter'):
......
...@@ -2,12 +2,6 @@ ...@@ -2,12 +2,6 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
import numpy as np import numpy as np
import cv2 as cv import cv2 as cv
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import logging
import os
import re
from cvBasedMethod.filters import fft_mask,butterworth from cvBasedMethod.filters import fft_mask,butterworth
def remove_scratch(img): def remove_scratch(img):
...@@ -62,84 +56,4 @@ def pre(pair,even='clahe',filter='butter'): ...@@ -62,84 +56,4 @@ def pre(pair,even='clahe',filter='butter'):
return {'ori': img, 'even': even, 'filtered': filtered, 'denoise': denoise, 'blr': blr} return {'ori': img, 'even': even, 'filtered': filtered, 'denoise': denoise, 'blr': blr}
def save_img(img_list, dir, name):
num = len(img_list)
plt.figure(figsize = (100, 20))
plt.suptitle(name)
for i, title in zip(range(num), img_list):
img = img_list[title]
plt.subplot(1, num, i + 1)
plt.title(title)
plt.imshow(img, 'gray')
try:
os.makedirs('data/output/' + dir + '/graph')
except:
logging.info('Existing dir: data/output/' + dir )
plt.savefig('data/output/' + dir + '/graph/' + name[:-4] + '.png')
plt.close()
def calcRes(img, mask, dir = 'default_output', name = 'output'):
dic = get_subarea_infor(img, mask)
df = pd.DataFrame(dic)
try:
os.makedirs('data/output/' + dir + '/csv')
except:
logging.info('Existing dir: out/' + dir + '/csv')
if len(df)!=0:
df.to_csv('data/output/' + dir + '/csv/' + name + '.csv',index = False)
def draw_bar(exName,names):
df = pd.DataFrame(columns = ('class', 'perc', 'Label', 'Area', 'Mean', 'Std', 'BackMean', 'BackStd'))
for name in names:
tmp = pd.read_csv('data/output/' + exName + '/csv/' + name)
match_group = re.match('.*\s([dD]2[oO]|[lL][bB]|.*ug).*\s(.+)\.csv', name)
tmp['perc'] = str.lower(match_group.group(1))[:-2] if str.lower(match_group.group(1)).endswith('ug') else str.lower(
match_group.group(1))
tmp['perc'].replace({'d2o':'0'},inplace = True)
tmp['class'] = str.lower(match_group.group(2))
df = df.append(tmp, ignore_index = True, sort = True)
df = df[df['Area']>19]
df['Pure'] = df['Mean'] - df['BackMean']
sns.set_style("darkgrid")
#sns.catplot(x = 'perc',y = 'Mean',hue = 'class',kind='bar',data = df)
sns.pairplot(df, vars = ['Area', 'Mean', 'perc','class'])
plt.show()
def get_subarea_infor(img, mask):
area_num, labels, stats, centroids = cv.connectedComponentsWithStats(mask)
info = []
for i in filter(lambda x: x != 0, range(area_num)):
group = np.where(labels == i)
img_value = img[group]
area_tmp = len(group[0])
mean_tmp = np.mean(img_value)
std_tmp = np.std(img_value)
pos = [(group[0][i], group[1][i]) for i in range(len(group[0]))]
res = np.zeros([200, 200], np.uint8)
for x in range(200):
for y in range(200):
if (x, y) in pos:
res[x, y] = mask[x, y]
else:
res[x, y] = 0
kernel = np.ones((17, 17), np.uint8)
mask_background = cv.erode(255 - res, kernel)
minimask = cv.bitwise_xor(mask_background, 255 - res)
realminimask = cv.bitwise_and(minimask, 255 - mask)
img_background = img[np.where(realminimask != 0)]
mean_value = np.mean(img_background)
std_value = np.std(img_background)
info.append({'Label': i, 'Area': area_tmp, 'Mean': mean_tmp, 'Std': std_tmp, 'BackMean': mean_value,
'BackStd': std_value})
return info
\ No newline at end of file
...@@ -3,4 +3,5 @@ pandas ...@@ -3,4 +3,5 @@ pandas
tqdm tqdm
matplotlib matplotlib
numpy numpy
opencv-python opencv-python
\ No newline at end of file seaborn
\ No newline at end of file
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
\ No newline at end of file import pandas as pd
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
import seaborn as sns
import logging
import os
import re
def save_img(img_list, dir, name):
num = len(img_list)
plt.figure(figsize = (100, 20))
plt.suptitle(name)
for i, title in zip(range(num), img_list):
img = img_list[title]
plt.subplot(1, num, i + 1)
plt.title(title)
plt.imshow(img, 'gray')
try:
os.makedirs('data/output/' + dir + '/graph')
except:
logging.info('Existing dir: data/output/' + dir)
plt.savefig('data/output/' + dir + '/graph/' + name[:-4] + '.png')
plt.close()
def calcRes(img, mask, dir = 'default_output', name = 'output'):
dic = get_subarea_infor(img, mask)
df = pd.DataFrame(dic)
try:
os.makedirs('data/output/' + dir + '/csv')
except:
logging.info('Existing dir: out/' + dir + '/csv')
if len(df) != 0:
df.to_csv('data/output/' + dir + '/csv/' + name + '.csv', index = False)
def draw_bar(exName, names):
df = pd.DataFrame(columns = ('class', 'perc', 'Label', 'Area', 'Mean', 'Std', 'BackMean', 'BackStd'))
for name in names:
tmp = pd.read_csv('data/output/' + exName + '/csv/' + name)
match_group = re.match('.*\s([dD]2[oO]|[lL][bB]|.*ug).*\s(.+)\.csv', name)
tmp['perc'] = str.lower(match_group.group(1))[:-2] if str.lower(match_group.group(1)).endswith(
'ug') else str.lower(match_group.group(1))
tmp['perc'].replace({'d2o': '0'}, inplace = True)
tmp['class'] = str.lower(match_group.group(2))
df = df.append(tmp, ignore_index = True, sort = True)
df = df[df['Area'] > 19]
df['Pure'] = df['Mean'] - df['BackMean']
sns.set_style("darkgrid")
# sns.catplot(x = 'perc',y = 'Mean',hue = 'class',kind='bar',data = df)
sns.pairplot(df, vars = ['Area', 'Mean', 'perc', 'class'])
plt.show()
def get_subarea_infor(img, mask):
area_num, labels, stats, centroids = cv.connectedComponentsWithStats(mask)
info = []
for i in filter(lambda x: x != 0, range(area_num)):
group = np.where(labels == i)
img_value = img[group]
area_tmp = len(group[0])
mean_tmp = np.mean(img_value)
std_tmp = np.std(img_value)
pos = [(group[0][i], group[1][i]) for i in range(len(group[0]))]
res = np.zeros([200, 200], np.uint8)
for x in range(200):
for y in range(200):
if (x, y) in pos:
res[x, y] = mask[x, y]
else:
res[x, y] = 0
kernel = np.ones((17, 17), np.uint8)
mask_background = cv.erode(255 - res, kernel)
minimask = cv.bitwise_xor(mask_background, 255 - res)
realminimask = cv.bitwise_and(minimask, 255 - mask)
img_background = img[np.where(realminimask != 0)]
mean_value = np.mean(img_background)
std_value = np.std(img_background)
info.append({'Label': i, 'Area': area_tmp, 'Mean': mean_tmp, 'Std': std_tmp, 'BackMean': mean_value,
'BackStd': std_value})
return info
\ No newline at end of file
...@@ -3,13 +3,12 @@ import logging ...@@ -3,13 +3,12 @@ import logging
import os import os
import sys import sys
import numpy as np
import torch import torch
import torch.nn as nn import torch.nn as nn
from torch import optim from torch import optim
from tqdm import tqdm from tqdm import tqdm
from eval import eval_net from utils.eval import eval_net
from unet import UNet from unet import UNet
from torch.utils.tensorboard import SummaryWriter from torch.utils.tensorboard import SummaryWriter
......
...@@ -2,7 +2,7 @@ import torch ...@@ -2,7 +2,7 @@ import torch
import torch.nn.functional as F import torch.nn.functional as F
from tqdm import tqdm from tqdm import tqdm
from dice_loss import dice_coeff from utils.dice_loss import dice_coeff
def eval_net(net, loader, device, n_val): def eval_net(net, loader, device, n_val):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment