Exemplo n.º 1
0
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'))
Exemplo n.º 2
0
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()
Exemplo n.º 3
0
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)
                         
Exemplo n.º 4
0
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
Exemplo n.º 5
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
Exemplo n.º 8
0
    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