if True: #len(sys.argv)>2: slidelist_test_1 = ['14', '18', '3', '22', '10', '15', '21'] slidelist_test_2 = ['1', '20', '17', '5', '2', '11', '16'] slidelist_test_3 = ['13', '7', '19', '8', '6', '9', '12'] # slidelist_test_1 = ['18','3','22','10','15','21','12'] # slidelist_test_2 = ['1','20','17','5','2','11','16'] # slidelist_test_3 = ['14','13','7','19','8','6','9'] if (sys.argv[2] == '1'): slidelist_test = slidelist_test_1 elif (sys.argv[2] == '2'): slidelist_test = slidelist_test_2 elif (sys.argv[2] == '3'): slidelist_test = slidelist_test_3 DB = Database() DB.open('databases/MITOS_WSI_CMC_ODAEL_TR.sqlite') DB.execute('SELECT uid, filename FROM Slides') slides = DB.fetchall() slidelist_train = [y[1] for y in slides if str(y[0]) not in slidelist_test] slidelist_test = [y[1] for y in slides if str(y[0]) in slidelist_test] print('Training:', slidelist_train) print('Test:', slidelist_test) test = {x: f[x] for x in slidelist_test} train = {x: f[x] for x in slidelist_train} pickle.dump(train, open('trainval_' + sys.argv[1], 'wb')) pickle.dump(test, open('test_' + sys.argv[1], 'wb'))
from SlideRunner.dataAccess.database import Database delete_slides = [ "13,8,4,7,17,22,28,26,23,24,36,29,15,14,19,32,25,12", # 3 WSI "13,8,4,7,17,22,28,26,23,24,36,29,15,14,19", #6 WSI "13,8,4,7,17,22,28,26,23" ] #12 WSI import os DB = Database() WSI_lists = ['3', '6', '12'] for i, k in enumerate(WSI_lists): os.system( 'cp databases/MITOS_WSI_CMCT_ODAEL.sqlite databases/MITOS_WSI_CMCT_ODAEL_%sWSI.sqlite' % k) DB.open('databases/MITOS_WSI_CMCT_ODAEL_%sWSI.sqlite' % k) cnt = DB.execute( 'DELETE FROM Annotations_label where annoid in (SELECT uid from Annotations where slide in (%s))' % delete_slides[i]) cnt = DB.execute( 'DELETE FROM Annotations_coordinates where slide in (%s)' % delete_slides[i]) cnt = DB.execute('DELETE FROM Annotations where slide in (%s)' % delete_slides[i]) cnt = DB.execute('DELETE FROM Slides where uid in (%s)' % delete_slides[i]) DB.commit()
print('%20s: %20s' % ('Model', fname)) print('%20s: %20s' % ('Database', sys.argv[2])) print('%20s: %20s' % ('Datasetname', datasetname)) print('%20s: %20s' % ('Validation/test', 'validation' if val=='-val' else 'test')) # In[4]: files=list() train_slides=list() val_slides=list() test_slides=list() slidenames = list() getslides = """SELECT uid, filename FROM Slides""" for idx, (currslide, filename) in enumerate(tqdm(database.execute(getslides).fetchall(), desc='Loading slides .. ')): if (((sys.argv[4] == 'val') and (filename not in test_slide_filenames)) or (not (sys.argv[4] == 'val') and (filename in test_slide_filenames))): slidenames += [currslide] database.loadIntoMemory(currslide) slide_path = path / slidedir / filename slide = openslide.open_slide(str(slide_path)) level = 0#slide.level_count - 1 files.append(SlideContainer(file=slide_path, level=level, width=size, height=size, y=[[], []], annotations=dict())) test_slides.append(idx)
patches_path = Path('D:/ProgProjekte/Python/Results-Exact-Study/Patches') path = Path('./') database = Database() database.open(str('C:/Users/c.marzahl/Downloads/MITOS_WSI_CCMCT_MEL.sqlite')) slide_names = [ 'f26e9fcef24609b988be.svs', 'f3741e764d39ccc4d114.svs', 'fff27b79894fe0157b08.svs' ] slidelist_test = ['27', '30', '31', '6', '18', '20', '1', '2', '3', '9', '11'] nr_target_cells = 350 getslides = """SELECT uid, filename FROM Slides""" for idx, (currslide, filename) in enumerate( tqdm(database.execute(getslides).fetchall(), desc='Loading slides .. ')): if (str(filename) not in slide_names): continue database.loadIntoMemory(currslide) slide_path = Path('D:/Datasets/WSI-CCMCT') / filename slide = openslide.open_slide(str(slide_path)) level = 0 down_factor = 1 classes = {4: "non-mitotic cell"} nr_mitotic_figures = 0
slidelist_test = ['27', '30', '31', '6', '18', '20', '1', '2', '3', '9', '11'] clause = ','.join(slidelist_test) files = [ 'MITOS_WSI_CCMCT_ODAEL_50HPF.sqlite', 'MITOS_WSI_CCMCT_ODAEL_10HPF.sqlite', 'MITOS_WSI_CCMCT_ODAEL_5HPF.sqlite', 'MITOS_WSI_CCMCT_ODAEL_12WSI.sqlite', 'MITOS_WSI_CCMCT_ODAEL_6WSI.sqlite', 'MITOS_WSI_CCMCT_ODAEL_3WSI.sqlite', 'MITOS_WSI_CCMCT_ODAEL.sqlite' ] for f in files: DB.open('databases/' + f) cnt = DB.execute( 'SELECT COUNT(*) FROM Annotations where agreedClass==2 and slide not in (%s)' % clause).fetchone()[0] print('%40s: %d mitotic figures in training set' % (f, cnt)) DB.open(files[-1]) slidelist_train = [ s[0] for s in DB.execute( 'SELECT Slides.filename, count(*) as cnt FROM Slides left join Annotations on Annotations.slide == Slides.uid where Slides.uid not in (%s) and Annotations.agreedClass==2 group by slide order by cnt asc' % clause).fetchall() ] slidelist_cnt = { s[0]: s[1] for s in DB.execute( 'SELECT Slides.filename, count(*) as cnt FROM Slides left join Annotations on Annotations.slide == Slides.uid where Slides.uid not in (%s) and Annotations.agreedClass==2 group by slide order by cnt asc'
def calculate_F1_fromCSV(databasefile, csv_directory, hotclass=1, verbose=False): DB = Database() DB = DB.open(databasefile) import os import csv result_boxes = {} for root, dirs, files in os.walk(csv_directory): if len(dirs) > 0: continue slidenr = int(root.split('/')[-1]) result_boxes['%02d_test.tif' % slidenr] = [] f = open(root + '/' + files[0], 'r') for y, x in csv.reader(f, delimiter=','): result_boxes['%02d_test.tif' % slidenr].append([int(x), int(y), 1]) sTP, sFN, sFP = 0, 0, 0 F1dict = dict() sP = 0 print('Calculating F1 for test set of %d files' % len(result_boxes), ':', result_boxes.keys()) mitcount = DB.execute( f'SELECT COUNT(*) FROM Annotations where agreedClass={hotclass}' ).fetchall() print('Official count of mitotic figures in DB: ', mitcount) slideids = [] for resfile in result_boxes: boxes = np.array(result_boxes[resfile]) TP, FP, FN, F1 = 0, 0, 0, 0 slide_id = DB.findSlideWithFilename(resfile, '') slideids.append(str(slide_id)) DB.loadIntoMemory(slide_id) annoList = [] for annoI in DB.annotations: anno = DB.annotations[annoI] if anno.agreedClass == hotclass: annoList.append([anno.x1, anno.y1]) centers_DB = np.array(annoList) if boxes.shape[0] > 0: score = boxes[:, -1] F1, TP, FP, FN = _F1_core(centers_DB, boxes, score, 0) if (centers_DB.shape[0] != TP + FN): print(resfile, centers_DB.shape[0], TP + FN) else: # no detections --> missed all FN = centers_DB.shape[0] if (verbose): print(f'{resfile}: F1:{F1}, TP:{TP}, FP:{FP}, FN:{FN}') sTP += TP sFP += FP sP += centers_DB.shape[0] sFN += FN F1dict[resfile] = F1 print('Overall: ') sF1 = 2 * sTP / (2 * sTP + sFP + sFN) print('F1: ', sF1) print('Precision: %.3f ' % (sTP / (sTP + sFP))) print('Recall: %.3f' % (sTP / (sTP + sFN))) return sF1, F1dict
def calculate_F1(databasefile, result_boxes=None, resfile=None, det_thres=0.5, hotclass=2, verbose=False): DB = Database() DB = DB.open(databasefile) if (result_boxes is None): if resfile is None: raise ValueError( 'At least one of resfile/result_boxes must be given') if (resfile[-3:] == 'bz2'): f = bz2.BZ2File(resfile, 'rb') else: f = open(resfile, 'rb') result_boxes = pickle.load(f) sTP, sFN, sFP = 0, 0, 0 F1dict = dict() sP = 0 result_boxes = nms(result_boxes, det_thres) print('Calculating F1 for test set of %d files' % len(result_boxes), ':', result_boxes.keys()) mitcount = DB.execute( f'SELECT COUNT(*) FROM Annotations where agreedClass={hotclass}' ).fetchall() print('Official count of mitotic figures in DB: ', mitcount) slideids = [] for resfile in result_boxes: boxes = np.array(result_boxes[resfile]) TP, FP, FN, F1 = 0, 0, 0, 0 slide_id = DB.findSlideWithFilename(resfile, '') slideids.append(str(slide_id)) DB.loadIntoMemory(slide_id) annoList = [] for annoI in DB.annotations: anno = DB.annotations[annoI] if anno.agreedClass == hotclass: annoList.append([anno.x1, anno.y1]) centers_DB = np.array(annoList) if boxes.shape[0] > 0: score = boxes[:, -1] F1, TP, FP, FN = _F1_core(centers_DB, boxes, score, det_thres) if (centers_DB.shape[0] != TP + FN): print(resfile, centers_DB.shape[0], TP + FN) else: # no detections --> missed all FN = centers_DB.shape[0] if (verbose): print(f'{resfile}: F1:{F1}, TP:{TP}, FP:{FP}, FN:{FN}') sTP += TP sFP += FP sP += centers_DB.shape[0] sFN += FN F1dict[resfile] = F1 print('Overall: ') sF1 = 2 * sTP / (2 * sTP + sFP + sFN) print('F1: ', sF1) print('Precision: %.3f ' % (sTP / (sTP + sFP))) print('Recall: %.3f' % (sTP / (sTP + sFN))) return sF1, F1dict
hpf = int(sys.argv[1]) os.system('mkdir -p %dHPF' % hpf) DB = Database() DB.open('../databases/MITOS_WSI_CCMCT_ODAEL.sqlite') DBRK = Database() DBRK.open('databases/HighMCAreas.sqlite') os.system( 'cp ../databases/MITOS_WSI_CCMCT_ODAEL.sqlite MITOS_WSI_CCMCT_ODAEL_%dHPF.sqlite' % hpf) DBnew = Database() DBnew.open('MITOS_WSI_CCMCT_ODAEL_%dHPF.sqlite' % hpf) DBnew.execute('ATTACH `../databases/MITOS_WSI_CCMCT_ODAEL.sqlite` as orig') for uid, filename in DB.listOfSlides(): print(uid, filename) DB.loadIntoMemory(uid) uidRK = DBRK.findSlideWithFilename(filename, '') DBRK.loadIntoMemory(uidRK) slide = openslide.open_slide('../WSI/' + filename) A = 0.237 * hpf # mm^2 W_hpf_microns = np.sqrt(A * 4 / 3) * 1000 # in microns H_hpf_microns = np.sqrt(A * 3 / 4) * 1000 # in microns