def create_submission(contours, data_path, output_path, contour_type='i'): if contour_type == 'i': weights = 'model_logs/sunnybrook_i_unet_inv.h5' else: sys.exit('\ncontour type "%s" not recognized\n' % contour_type) crop_size = 128 input_shape = (crop_size, crop_size, 1) num_classes = 2 images, masks = export_all_contours(contours, data_path, output_path, crop_size, num_classes=num_classes) model = unet_model_inv(input_shape, num_classes, num_filters=8, transfer=True, contour_type=contour_type, weights=weights) pred_masks = model.predict(images, batch_size=32, verbose=1) print('\nEvaluating dev set ...') result = model.evaluate(images, masks, batch_size=32) result = np.round(result, decimals=10) print('\nDev set result {:s}:\n{:s}'.format(str(model.metrics_names), str(result))) num = 0 for idx, ctr in enumerate(contours): img, mask = read_contour(ctr, data_path, num_classes) h, w, d = img.shape tmp = pred_masks[idx, :] tmp = reshape(tmp, to_shape=(h, w, d)) tmp = np.where(tmp > 0.5, 255, 0).astype('uint8') tmp2, coords, hierarchy = cv2.findContours(tmp.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) if not coords: print('\nNo detection in case: {:s}; image: {:d}'.format( ctr.case, ctr.img_no)) coords = np.ones((1, 1, 1, 2), dtype='int') if contour_type == 'i': man_filename = ctr.ctr_endo_path[ctr.ctr_endo_path.rfind('\\') + 1:] elif contour_type == 'm': man_filename = ctr.ctr_epi_path[ctr.ctr_epi_path.rfind('\\') + 1:] auto_filename = man_filename.replace('manual', 'auto') img_filename = re.sub(r'-[io]contour-manual.txt', '.dcm', man_filename) man_full_path = os.path.join(save_dir, ctr.case, 'contours-manual', 'IRCCI-expert') auto_full_path = os.path.join(save_dir, ctr.case, 'contours-auto', 'FCN') img_full_path = os.path.join(save_dir, ctr.case, 'DICOM') dcm = 'IM-0001-%04d.dcm' % (ctr.img_no) dcm_path = os.path.join(data_path, ctr.case, 'DICOM', dcm) overlay_full_path = os.path.join(save_dir, ctr.case, 'Overlay') for dirpath in [ man_full_path, auto_full_path, img_full_path, overlay_full_path ]: if not os.path.exists(dirpath): os.makedirs(dirpath) if 'DICOM' in dirpath: src = dcm_path dst = os.path.join(dirpath, img_filename) shutil.copyfile(src, dst) elif 'Overlay' in dirpath: draw_result(ctr, data_path, overlay_full_path, contour_type, coords) else: dst = os.path.join(auto_full_path, auto_filename) if not os.path.exists(auto_full_path): os.makedirs(auto_full_path) with open(dst, 'wb') as f: for cd in coords: cd = np.squeeze(cd) if cd.ndim == 1: np.savetxt(f, cd, fmt='%d', delimiter=' ') else: for coord in cd: np.savetxt(f, coord, fmt='%d', delimiter=' ') print('\nNumber of multiple detections: {:d}'.format(num)) dst_eval = os.path.join(save_dir, 'evaluation_{:s}.txt'.format(contour_type)) with open(dst_eval, 'wb') as f: f.write( ('Dev set result {:s}:\n{:s}'.format(str(model.metrics_names), str(result))).encode('utf-8')) f.close() # Detailed evaluation: masks = np.squeeze(masks) pred_masks = np.squeeze(pred_masks) detail_eval = os.path.join( save_dir, 'evaluation_detail_{:s}.csv'.format(contour_type)) evalArr = dice_coef_each(masks, pred_masks) caseArr = [ctr.case for ctr in contours] imgArr = [ctr.img_no for ctr in contours] resArr = [caseArr, imgArr] resArr.append(list(evalArr)) resArr = np.transpose(resArr) np.savetxt(detail_eval, resArr, fmt='%s', delimiter=',')
def create_submission(contours, data_path, output_path, contour_type='i'): weight_t = 'model_logs/sunnybrook_a_unetres_inv_time.h5' weight_s = 'model_logs/sunnybrook_i_unetres_inv_drop_acdc.h5' crop_size = 128 num_phases = 5 num_classes = 2 phase_dilation = 4 input_shape = (num_phases, crop_size, crop_size, 1) input_shape_s = (crop_size, crop_size, 1) model_s = unet_res_model_Inv(input_shape_s, num_classes, nb_filters=8, transfer=True, contour_type=contour_type, weights=weight_s) model_t = unet_res_model_time(input_shape, num_classes, nb_filters=32, n_phases=num_phases, dilation=1, transfer=True, contour_type=contour_type, weights=weight_t) images, masks = export_all_contours(contours, data_path, output_path, crop_size=crop_size, num_classes=num_classes, num_phases=num_phases, phase_dilation=phase_dilation) s, p, h, w, d = images.shape print('\nFirst step predict set ...') temp_image_t = np.reshape(images, (s * p, h, w, d)) temp_mask_t = model_s.predict(temp_image_t, batch_size=4, verbose=1) temp_mask_t = np.reshape(temp_mask_t, (s, p, h, w, d)) # for idx_s in range(s): # img_t = images[idx_s,...] # temp_mask_t[idx_s] = model_s.predict(img_t) # for idx_p in range(p): # mask = temp_mask_t[idx_s, idx_p, ...] # img = images[idx_s, idx_p, ...] # img = np.squeeze(img*mask) # img_name = '{:d}-{:d}'.format(idx_s, idx_p) # imsave(os.path.join(TEMP_CONTOUR_PATH, img_name + ".png"), img) print('\nTotal sample is {:d} for 2nd evaluation.'.format(s)) print('\nSecond step predict set ...') pred_masks = model_t.predict(temp_mask_t, batch_size=4, verbose=1) print('\nEvaluating dev set ...') result = model_t.evaluate(temp_mask_t, masks, batch_size=4) result = np.round(result, decimals=10) print('\nDev set result {:s}:\n{:s}'.format(str(model_t.metrics_names), str(result))) for idx, ctr in enumerate(contours): print('\nPredict image sequence {:d}'.format(idx)) img, mask = read_contour(ctr, data_path, num_classes, num_phases, num_phases_in_cycle=20, phase_dilation=phase_dilation) p, h, w, d = img.shape tmp = np.squeeze(pred_masks[idx, :]) if tmp.ndim == 2: tmp = tmp[:, :, np.newaxis] tmp = np.where(tmp > 0.5, 255, 0).astype('uint8') tmp2, coords, hierarchy = cv2.findContours(tmp.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) if not coords: print('\nNo detection in case: {:s}; image: {:d}'.format( ctr.case, ctr.img_no)) coords = np.ones((1, 1, 1, 2), dtype='int') overlay_full_path = os.path.join(save_dir, ctr.case, 'Overlay') draw_result(ctr, data_path, overlay_full_path, contour_type, coords) dst_eval = os.path.join(save_dir, 'evaluation_{:s}.txt'.format(contour_type)) with open(dst_eval, 'wb') as f: f.write( ('Dev set result {:s}:\n{:s}'.format(str(model_t.metrics_names), str(result))).encode('utf-8')) f.close() # Detailed evaluation: masks = np.squeeze(masks) pred_masks = np.squeeze(pred_masks) detail_eval = os.path.join( save_dir, 'evaluation_detail_{:s}.csv'.format(contour_type)) evalArr = dice_coef_each(masks, pred_masks) caseArr = [ctr.case for ctr in contours] imgArr = [ctr.img_no for ctr in contours] resArr = [caseArr, imgArr] resArr.append(list(evalArr)) resArr = np.transpose(resArr) np.savetxt(detail_eval, resArr, fmt='%s', delimiter=',')
def create_submission(contours, data_path, output_path): if contour_type == 'i': weights = 'model_logs/sunnybrook_i_unetresnet_epoch100_aug4.h5' elif contour_type == 'm': weights = 'model_logs/sunnybrook_m.h5' else: sys.exit('\ncontour type "%s" not recognized\n' % contour_type) crop_size = 128 input_shape = (crop_size, crop_size, 1) num_classes = 4 images, masks = export_all_contours(contours, data_path, output_path, crop_size, num_classes=num_classes) model = unet_res_model(input_shape, num_classes, weights=weights, transfer=True) pred_masks = model.predict(images, batch_size=32, verbose=1) print('\nEvaluating dev set ...') result = model.evaluate(images, masks, batch_size=32) result = np.round(result, decimals=10) print('\nDev set result {:s}:\n{:s}'.format(str(model.metrics_names), str(result))) num = 0 for idx, ctr in enumerate(contours): img, mask = read_contour(ctr, data_path, num_classes) h, w, d = img.shape if contour_type == 'i': tmp = pred_masks[idx, ..., 3] elif contour_type == 'm': tmp = pred_masks[idx, ..., 2] elif contour_type == 'r': tmp = pred_masks[idx, ..., 1] #cv2.imwrite(data_path + '\\tmp\\' + 'i' + '{:04d}.png'.format(idx), pred_masks[idx,...,3]) #cv2.imwrite(data_path + '\\tmp\\' + 'o' + '{:04d}.png'.format(idx), pred_masks[idx,...,2]) #cv2.imwrite(data_path + '\\tmp\\' + 'r' + '{:04d}.png'.format(idx), pred_masks[idx, ..., 1]) tmp = tmp[..., np.newaxis] tmp = reshape(tmp, to_shape=(h, w, d)) tmp = np.where(tmp > 0.5, 255, 0).astype('uint8') tmp2, coords, hierarchy = cv2.findContours(tmp.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) if not coords: print('\nNo detection in case: {:s}; image: {:d}'.format( ctr.case, ctr.img_no)) coords = np.ones((1, 1, 1, 2), dtype='int') if len(coords) > 1: print('\nMultiple detections in case: {:s}; image: {:d}'.format( ctr.case, ctr.img_no)) lengths = [] for coord in coords: lengths.append(len(coord)) coords = [coords[np.argmax(lengths)]] num += 1 coords = np.squeeze(coords) if contour_type == 'i': man_filename = ctr.ctr_endo_path[ctr.ctr_endo_path.rfind('\\') + 1:] elif contour_type == 'o': man_filename = ctr.ctr_epi_path[ctr.ctr_epi_path.rfind('\\') + 1:] auto_filename = man_filename.replace('manual', 'auto') img_filename = re.sub(r'-[io]contour-manual.txt', '.dcm', man_filename) man_full_path = os.path.join(save_dir, ctr.case, 'contours-manual', 'IRCCI-expert') auto_full_path = os.path.join(save_dir, ctr.case, 'contours-auto', 'FCN') img_full_path = os.path.join(save_dir, ctr.case, 'DICOM') dcm = 'IM-0001-%04d.dcm' % (ctr.img_no) #dcm = 'IM-%s-%04d.dcm' % (SAX_SERIES[ctr.case], ctr.img_no) dcm_path = os.path.join(data_path, ctr.case, 'DICOM', dcm) overlay_full_path = os.path.join(save_dir, ctr.case, 'Overlay') for dirpath in [ man_full_path, auto_full_path, img_full_path, overlay_full_path ]: if not os.path.exists(dirpath): os.makedirs(dirpath) if 'manual' in dirpath: if contour_type == 'i': src = ctr.ctr_endo_path elif contour_type == 'o': src = ctr.ctr_epi_path dst = os.path.join(dirpath, man_filename) shutil.copyfile(src, dst) elif 'DICOM' in dirpath: src = dcm_path dst = os.path.join(dirpath, img_filename) shutil.copyfile(src, dst) elif 'Overlay' in dirpath: draw_result(ctr, data_path, overlay_full_path, contour_type, coords) else: dst = os.path.join(auto_full_path, auto_filename) with open(dst, 'wb') as f: if coords.ndim == 1: np.savetxt(f, coords, fmt='%d', delimiter=' ') else: for coord in coords: #coord = np.squeeze(coord, axis=(1,)) #coord = np.append(coord, coord[:1], axis=0) np.savetxt(f, coord, fmt='%d', delimiter=' ') print('\nNumber of multiple detections: {:d}'.format(num)) dst_eval = os.path.join(save_dir, 'evaluation_{:s}.txt'.format(contour_type)) with open(dst_eval, 'wb') as f: f.write( ('Dev set result {:s}:\n{:s}'.format(str(model.metrics_names), str(result))).encode('utf-8')) f.close() # Detailed evaluation: detail_eval = os.path.join( save_dir, 'evaluation_detail_{:s}.csv'.format(contour_type)) evalArr = dice_coef_endo_each(masks, pred_masks) caseArr = [ctr.case for ctr in contours] imgArr = [ctr.img_no for ctr in contours] resArr = np.transpose([caseArr, imgArr, evalArr]) np.savetxt(detail_eval, resArr, fmt='%s', delimiter=',')
def create_submission(contours, data_path, output_path, contour_type='a'): if contour_type == 'a': weights = 'model_logs/temp_weights.hdf5' else: sys.exit('\ncontour type "%s" not recognized\n' % contour_type) num_phases = 9 crop_size = 128 input_shape = (num_phases, crop_size, crop_size, 1) num_classes = 3 images, masks = export_all_contours(contours, data_path, output_path, crop_size, num_classes=num_classes, num_phases=num_phases) model = unet_model_time(input_shape, downsize_filters_factor=2, pool_size=(1, 2, 2), n_labels=3, initial_learning_rate=0.00001, deconvolution=False, weights=weights) pred_masks = model.predict(images, batch_size=8, verbose=1) print('\nEvaluating dev set ...') result = model.evaluate(images, masks, batch_size=8) result = np.round(result, decimals=10) print('\nDev set result {:s}:\n{:s}'.format(str(model.metrics_names), str(result))) num = 0 for c_type in ['i', 'm']: for idx, ctr in enumerate(contours): img, mask = read_contour(ctr, data_path, num_classes, num_phases=1, num_phases_in_cycle=20, phase_dilation=1) p, h, w, d = img.shape if c_type == 'i': tmp = pred_masks[idx, 0, ..., 2] elif c_type == 'm': tmp = pred_masks[idx, 0, ..., 1] tmp = tmp[..., np.newaxis] tmp = reshape(tmp, to_shape=(h, w, d)) tmp = np.where(tmp > 0.5, 255, 0).astype('uint8') tmp2, coords, hierarchy = cv2.findContours(tmp.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) if not coords: print('\nNo detection in case: {:s}; image: {:d}'.format( ctr.case, ctr.img_no)) coords = np.ones((1, 1, 1, 2), dtype='int') if c_type == 'i': man_filename = ctr.ctr_endo_path[ctr.ctr_endo_path. rfind('\\') + 1:] elif c_type == 'm': man_filename = ctr.ctr_epi_path[ctr.ctr_epi_path.rfind('\\') + 1:] auto_filename = man_filename.replace('manual', 'auto') img_filename = re.sub(r'-[io]contour-manual.txt', '.dcm', man_filename) man_full_path = os.path.join(save_dir, ctr.case, 'contours-manual', 'IRCCI-expert') auto_full_path = os.path.join(save_dir, ctr.case, 'contours-auto', 'FCN') img_full_path = os.path.join(save_dir, ctr.case, 'DICOM') dcm = 'IM-0001-%04d.dcm' % (ctr.img_no) # dcm = 'IM-%s-%04d.dcm' % (SAX_SERIES[ctr.case], ctr.img_no) dcm_path = os.path.join(data_path, ctr.case, 'DICOM', dcm) overlay_full_path = os.path.join(save_dir, ctr.case, 'Overlay') for dirpath in [ man_full_path, auto_full_path, img_full_path, overlay_full_path ]: if not os.path.exists(dirpath): os.makedirs(dirpath) if 'DICOM' in dirpath: src = dcm_path dst = os.path.join(dirpath, img_filename) shutil.copyfile(src, dst) elif 'Overlay' in dirpath: draw_result(ctr, data_path, overlay_full_path, c_type, coords) else: dst = os.path.join(auto_full_path, auto_filename) if not os.path.exists(auto_full_path): os.makedirs(auto_full_path) with open(dst, 'wb') as f: for cd in coords: cd = np.squeeze(cd) if cd.ndim == 1: np.savetxt(f, cd, fmt='%d', delimiter=' ') else: for coord in cd: np.savetxt(f, coord, fmt='%d', delimiter=' ') print('\nNumber of multiple detections: {:d}'.format(num)) dst_eval = os.path.join(save_dir, 'evaluation_{:s}.txt'.format(c_type)) with open(dst_eval, 'wb') as f: f.write(('Dev set result {:s}:\n{:s}'.format( str(model.metrics_names), str(result))).encode('utf-8')) f.close() # Detailed evaluation: detail_eval = os.path.join(save_dir, 'evaluation_detail_{:s}.csv'.format(c_type)) evalEndoArr = dice_coef_endo_each(masks, pred_masks) evalMyoArr = dice_coef_myo_each(masks, pred_masks) caseArr = [ctr.case for ctr in contours] imgArr = [ctr.img_no for ctr in contours] resArr = np.transpose([caseArr, imgArr, evalEndoArr, evalMyoArr]) np.savetxt(detail_eval, resArr, fmt='%s', delimiter=',')