def run_one_scn(demo_scn, demo_dir, opt):
    Detector = detector_factory[opt.task]
    detector = Detector(opt)

    basename = os.path.basename(demo_scn)
    basename = basename.replace('.scn', '')
    basename = basename.replace('.svs', '')
    # basename = basename.replace(' ', '-')
    working_dir = os.path.join(demo_dir, basename)

    xml_file = os.path.join(working_dir, '%s.xml' % (basename))
    if os.path.exists(xml_file):
        return

    patch_2d_dir, simg_big, simg = scn_to_patchs(demo_scn, working_dir, opt)

    if os.path.isdir(patch_2d_dir):
        image_names = []
        ls = os.listdir(patch_2d_dir)
        for file_name in sorted(ls):
            ext = file_name[file_name.rfind('.') + 1:].lower()
            if ext in image_ext:
                image_names.append(os.path.join(patch_2d_dir, file_name))
    else:
        image_names = [patch_2d_dir]

    detect_all = None
    count = 1
    for (image_name) in image_names:
        ret = detector.run(image_name)
        results = ret['results']
        res_strs = os.path.basename(image_name).replace('.png',
                                                        '').split('-x-')
        lv_str = res_strs[0]
        patch_start_x = np.int(res_strs[3])
        patch_start_y = np.int(res_strs[4])

        if opt.filter_boarder:
            output_h = opt.input_h  # hard coded
            output_w = opt.input_w  # hard coded
            for j in range(1, opt.num_classes + 1):
                for i in range(len(results[j])):
                    cp = [0, 0]
                    cp[0] = results[j][i][0]
                    cp[1] = results[j][i][1]
                    cr = results[j][i][2]
                    if cp[0] - cr < 0 or cp[0] + cr > output_w:
                        results[j][i][3] = 0
                        continue
                    if cp[1] - cr < 0 or cp[1] + cr > output_h:
                        results[j][i][3] = 0
                        continue

        for j in range(1, opt.num_classes + 1):
            for circle in results[j]:
                if circle[3] > opt.vis_thresh:
                    circle_out = circle[:]
                    circle_out[0] = circle[0] + patch_start_x
                    circle_out[1] = circle[1] + patch_start_y
                    if detect_all is None:
                        detect_all = [circle]
                    else:
                        detect_all = np.append(detect_all, [circle], axis=0)

        time_str = ''
        for stat in time_stats:
            time_str = time_str + '{} {:.3f}s |'.format(stat, ret[stat])
        print(' %d/%d %s' % (count, len(image_names), time_str))
        count = count + 1

    num_classes = 1
    scales = 1
    max_per_image = 2000
    run_nms = True
    results2 = merge_outputs(num_classes, max_per_image, run_nms, detect_all)
    detect_all = results2[1]

    # detections = []
    # det_clss = {}
    # det_clss[1] = detect_all
    # detections.append(det_clss)
    # detect_all = merge_outputs(opt, detections)

    if not simg_big is None:
        debugger = Debugger(dataset=opt.dataset,
                            ipynb=(opt.debug == 3),
                            theme=opt.debugger_theme)
        debugger.add_img(simg_big, img_id='')
        debugger.save_all_imgs(working_dir,
                               prefix='%s' % (basename))  # save original image
        json_file = os.path.join(working_dir, '%s.json' % (basename))
        debugger.save_detect_all_to_json(simg_big, detect_all, json_file, opt,
                                         simg)

        for circle in detect_all:
            debugger.add_coco_circle(circle[:3],
                                     circle[-1],
                                     circle[3],
                                     img_id='')
        debugger.save_all_imgs(working_dir, prefix='%s_overlay' %
                               (basename))  # save original overlay

    # # make open slide file
    # with open("/media/huoy1/48EAE4F7EAE4E264/Projects/detection/test_demo/Case 01-3_manual_good.xml") as fd:
    #     doc = xmltodict.parse(fd.read())

    try:
        start_x = np.int(simg.properties['openslide.bounds-x'])
        start_y = np.int(simg.properties['openslide.bounds-y'])
        width_x = np.int(simg.properties['openslide.bounds-width'])
        height_y = np.int(simg.properties['openslide.bounds-height'])
    except:
        start_x = 0
        start_y = 0
        width_x = np.int(simg.properties['aperio.OriginalWidth'])
        height_y = np.int(simg.properties['aperio.OriginalHeight'])
    down_rate = simg.level_downsamples[opt.lv]

    detect_json = []
    doc_out = {}
    doc_out['Annotations'] = {}
    doc_out['Annotations']['@MicronsPerPixel'] = simg.properties[
        'openslide.mpp-x']
    doc_out['Annotations']['@Level'] = opt.lv
    doc_out['Annotations']['@DownRate'] = down_rate
    doc_out['Annotations']['@start_x'] = start_x
    doc_out['Annotations']['@start_y'] = start_y
    doc_out['Annotations']['@width_x'] = width_x
    doc_out['Annotations']['@height_y'] = height_y
    if 'leica.device-model' in simg.properties:
        doc_out['Annotations']['@Device'] = 'leica.device-model'
    else:
        doc_out['Annotations']['@Device'] = 'aperio.Filename'
    doc_out['Annotations']['Annotation'] = {}
    doc_out['Annotations']['Annotation']['@Id'] = '1'
    doc_out['Annotations']['Annotation']['@Name'] = ''
    doc_out['Annotations']['Annotation']['@ReadOnly'] = '0'
    doc_out['Annotations']['Annotation']['@LineColorReadOnly'] = '0'
    doc_out['Annotations']['Annotation']['@Incremental'] = '0'
    doc_out['Annotations']['Annotation']['@Type'] = '4'
    doc_out['Annotations']['Annotation']['@LineColor'] = '65280'
    doc_out['Annotations']['Annotation']['@Visible'] = '1'
    doc_out['Annotations']['Annotation']['@Selected'] = '1'
    doc_out['Annotations']['Annotation']['@MarkupImagePath'] = ''
    doc_out['Annotations']['Annotation']['@MacroName'] = ''
    doc_out['Annotations']['Annotation']['Attributes'] = {}
    doc_out['Annotations']['Annotation']['Attributes']['Attribute'] = {}
    doc_out['Annotations']['Annotation']['Attributes']['Attribute'][
        '@Name'] = 'glomerulus'
    doc_out['Annotations']['Annotation']['Attributes']['Attribute'][
        '@Id'] = '0'
    doc_out['Annotations']['Annotation']['Attributes']['Attribute'][
        '@Value'] = ''
    doc_out['Annotations']['Annotation']['Plots'] = None
    doc_out['Annotations']['Annotation']['Regions'] = {}
    doc_out['Annotations']['Annotation']['Regions'][
        'RegionAttributeHeaders'] = {}
    doc_out['Annotations']['Annotation']['Regions']['AttributeHeader'] = []
    doc_out['Annotations']['Annotation']['Regions']['Region'] = []

    for di in range(len(detect_all)):
        detect_one = detect_all[di]
        detect_dict = {}
        detect_dict['@Id'] = str(di + 1)
        detect_dict['@Type'] = '2'
        detect_dict['@Zoom'] = '0.5'
        detect_dict['@ImageLocation'] = ''
        detect_dict['@ImageFocus'] = '-1'
        detect_dict['@Length'] = '2909.1'
        detect_dict['@Area'] = '673460.1'
        detect_dict['@LengthMicrons'] = '727.3'
        detect_dict['@AreaMicrons'] = '42091.3'
        detect_dict['@Text'] = ('%.3f' % detect_one[3])
        detect_dict['@NegativeROA'] = '0'
        detect_dict['@InputRegionId'] = '0'
        detect_dict['@Analyze'] = '0'
        detect_dict['@DisplayId'] = str(di + 1)
        detect_dict['Attributes'] = None
        detect_dict['Vertices'] = '0'
        detect_dict['Vertices'] = {}
        detect_dict['Vertices']['Vertex'] = []

        if 'leica.device-model' in simg.properties:  #leica
            coord1 = {}
            coord1['@X'] = str(height_y -
                               (detect_one[1] - detect_one[2]) * down_rate)
            coord1['@Y'] = str((detect_one[0] - detect_one[2]) * down_rate)
            coord1['@Z'] = '0'
            coord2 = {}
            coord2['@X'] = str(
                height_y - (detect_one[1] + detect_one[2]) * down_rate)  # 左右
            coord2['@Y'] = str(
                (detect_one[0] + detect_one[2]) * down_rate)  # 上下
            coord2['@Z'] = '0'
            detect_dict['Vertices']['Vertex'].append(coord1)
            detect_dict['Vertices']['Vertex'].append(coord2)
        elif 'aperio.Filename' in simg.properties:
            coord1 = {}
            coord1['@X'] = str((detect_one[0] - detect_one[2]) * down_rate)
            coord1['@Y'] = str((detect_one[1] - detect_one[2]) * down_rate)
            coord1['@Z'] = '0'
            coord2 = {}
            coord2['@X'] = str(
                (detect_one[0] + detect_one[2]) * down_rate)  # 左右
            coord2['@Y'] = str(
                (detect_one[1] + detect_one[2]) * down_rate)  # 上下
            coord2['@Z'] = '0'
            detect_dict['Vertices']['Vertex'].append(coord1)
            detect_dict['Vertices']['Vertex'].append(coord2)
        doc_out['Annotations']['Annotation']['Regions']['Region'].append(
            detect_dict)

    out = xmltodict.unparse(doc_out, pretty=True)
    with open(xml_file, 'wb') as file:
        file.write(out.encode('utf-8'))

    os.system('rm -r "%s"' % (os.path.join(working_dir, '2d_patch')))

    return
Beispiel #2
0
    def debug(self, batch, output, iter_id):
        opt = self.opt
        reg = output['reg'] if opt.reg_offset else None
        # print(output)
        dets = circledet_decode(output['hm'],
                                output['cl'],
                                reg=reg,
                                cat_spec_wh=opt.cat_spec_wh,
                                K=opt.K)

        # print(dets)
        if opt.filter_boarder:
            output_h = self.opt.default_resolution[
                0] // self.opt.down_ratio  #hard coded
            output_w = self.opt.default_resolution[
                1] // self.opt.down_ratio  #hard coded
            for i in range(dets.shape[1]):
                cp = [0, 0]
                cp[0] = dets[0, i, 0]
                cp[1] = dets[0, i, 1]
                cr = dets[0, i, 2]
                if cp[0] - cr < 0 or cp[0] + cr > output_w:
                    dets[0, i, 3] = 0
                    continue
                if cp[1] - cr < 0 or cp[1] + cr > output_h:
                    dets[0, i, 3] = 0
                    continue

        dets = dets.detach().cpu().numpy().reshape(1, -1, dets.shape[2])
        dets[:, :, :3] *= opt.down_ratio
        dets_gt = batch['meta']['gt_det'].numpy().reshape(1, -1, dets.shape[2])
        dets_gt[:, :, :3] *= opt.down_ratio
        for i in range(1):
            debugger = Debugger(dataset=opt.dataset,
                                ipynb=(opt.debug == 3),
                                theme=opt.debugger_theme)
            img = batch['input'][i].detach().cpu().numpy().transpose(1, 2, 0)
            img = np.clip(((img * opt.std + opt.mean) * 255.), 0,
                          255).astype(np.uint8)
            pred = debugger.gen_colormap(
                output['hm'][i].detach().cpu().numpy())
            gt = debugger.gen_colormap(batch['hm'][i].detach().cpu().numpy())
            debugger.add_blend_img(img, pred, 'pred_hm')
            debugger.add_blend_img(img, gt, 'gt_hm')
            debugger.add_img(img, img_id='out_pred')

            for k in range(len(dets[i])):
                # print('risk = %f' % dets[i, k, 3])
                if dets[i, k, 3] > opt.center_thresh:
                    debugger.add_coco_circle(dets[i, k, :3],
                                             dets[i, k, -1],
                                             dets[i, k, 3],
                                             img_id='out_pred')

            debugger.add_img(img, img_id='out_gt')
            for k in range(len(dets_gt[i])):
                if dets_gt[i, k, 3] > opt.center_thresh:
                    debugger.add_coco_circle(dets_gt[i, k, :3],
                                             dets_gt[i, k, -1],
                                             dets_gt[i, k, 3],
                                             img_id='out_gt')

            if opt.debug == 4:
                debugger.save_all_imgs(opt.debug_dir,
                                       prefix='{}'.format(iter_id))
            else:
                debugger.show_all_imgs(pause=True)