def prepare_patient_images(patient_id, intermediate_crop=0): file_lst = [] prefix = str(patient_id).rjust(4, '0') src_files = helpers.get_files(settings.BASE_PREPROCESSEDIMAGES_DIR, prefix + "*.png") patient_dir = helpers.get_pred_patient_dir(patient_id) helpers.create_dir_if_not_exists(patient_dir) patient_img_dir = helpers.get_pred_patient_img_dir(patient_id) helpers.create_dir_if_not_exists(patient_img_dir) helpers.delete_files(patient_img_dir, "*.png") dummy = numpy.zeros((settings.TARGET_SIZE, settings.TARGET_SIZE)) cv2.imwrite(patient_img_dir + "dummy_overlay.png", dummy) for src_path in src_files: file_name = ntpath.basename(src_path) org_img = cv2.imread(src_path, cv2.IMREAD_GRAYSCALE) cropped_img = helpers.prepare_cropped_sax_image(org_img, clahe=True, intermediate_crop=intermediate_crop, rotate=0) if SCALE_SIZE is not None: cropped_img = cv2.resize(cropped_img, (SCALE_SIZE, SCALE_SIZE), interpolation=cv2.INTER_AREA) cv2.imwrite(patient_img_dir + file_name, cropped_img) file_lst.append([file_name, "dummy_overlay.png"]) with open(patient_img_dir + "pred.lst", "wb") as f: writer = csv.writer(f, delimiter='\t') writer.writerows(file_lst)
def compute_volumes(patient_id, model_name, debug_info=False): patient_dir = helpers.get_pred_patient_dir(patient_id) min_areas = pandas.read_csv(patient_dir + "\\areas_" + model_name + ".csv", sep=";") columns = list(min_areas) # diastole_col = "" diastole_pixels = 0 systole_pixels = 999999 diastole_max = 0 systole_max = 999999 for column in columns: if not column.startswith("fr"): continue # if False: # pixel_max = min_areas[column].max() # if pixel_max > diastole_max: # diastole_max = min_areas[column].max() # diastole_col = column # # pixel_max = min_areas[column].max() # if pixel_max < systole_max: # systole_max = pixel_max # systole_col = column # else: value_list = min_areas[column].values.tolist() value_list.sort(reverse=True) pixel_sum = sum(value_list[:200]) #pixel_sum = min_areas[column].sum() if pixel_sum > diastole_pixels: diastole_pixels = pixel_sum diastole_col = column if pixel_sum < systole_pixels: systole_pixels = pixel_sum systole_col = column if debug_info: current_debug_line.append(str(diastole_col)) current_debug_line.append(str(systole_col)) # min_areas["diastole_vol"] = min_areas[diastole_col] * min_areas["slice_dist"] # min_areas["systole_vol"] = min_areas[systole_col] * min_areas["slice_dist"] dist_col = "slice_dist" min_areas_selection = min_areas[["slice", "slice_thickness", "slice_location", "time", dist_col]].copy() # , "diastole_vol", "systole_vol" min_areas_selection["diastole"] = min_areas[diastole_col].values min_areas_selection["diastole_vol"] = (min_areas_selection["diastole"] * min_areas_selection[dist_col]).values min_areas_selection["diastole_conf"] = min_areas[diastole_col.replace("fr", "co")].values min_areas_selection["systole"] = min_areas[systole_col].values min_areas_selection["systole_vol"] = (min_areas_selection["systole"] * min_areas_selection[dist_col]).values min_areas_selection["systole_conf"] = min_areas[systole_col.replace("fr", "co")].values min_areas_selection.to_csv(patient_dir + "\\areas_dia_sys_" + model_name + ".csv", sep=";") dia_frame = diastole_col.replace("fr_", "") sys_frame = systole_col.replace("fr_", "") diastole_vol, dia_max_slice_val = compute_volumne_frustum(min_areas_selection["diastole"], min_areas_selection[dist_col]) systole_vol, sys_max_slice_val = compute_volumne_frustum(min_areas_selection["systole"], min_areas_selection[dist_col]) low_conf_diastole_vol = round(compute_volumne_frustum(min_areas_selection["diastole_conf"], min_areas_selection[dist_col])[0], 2) low_conf_systole_vol = round(compute_volumne_frustum(min_areas_selection["systole_conf"], min_areas_selection[dist_col])[0], 2) return diastole_vol, systole_vol, low_conf_diastole_vol, low_conf_systole_vol, dia_frame, sys_frame, dia_max_slice_val, sys_max_slice_val
def count_pixels(patient_id, threshold, all_slice_data, model_name, threshold_value=-1): patient_slice_data = all_slice_data[all_slice_data["patient_id"] == patient_id].copy() patient_slice_data["slice_noloc"] = patient_slice_data["slice_no"].map(str) + "_" + patient_slice_data["slice_location"].map(str) slices = patient_slice_data["slice_noloc"].unique().tolist() frames = patient_slice_data["frame_no"].unique().tolist() frame_count = len(frames) # find lowest common set of frames that are present in every slice for name, records in patient_slice_data.groupby("slice_noloc"): slice_frames = records["frame_no"].unique() if (len(frames) / 2) >= len(slice_frames): # throw away small slices (416) print "Patient " + str(patient_id) + ": throw away slice : " + str(name) slices.remove(name) continue frames = list(set(frames) & set(slice_frames)) new_frame_count = len(frames) if new_frame_count != frame_count: print "Patient " + str(patient_id) + ": frames not the same for every slice : " + str(frame_count) + " <> " + str(new_frame_count) file_name_slices = patient_slice_data.set_index('file_name')['slice_noloc'].to_dict() file_name_frames = patient_slice_data.set_index('file_name')['frame_no'].to_dict() # file_name_slice_locations = patient_slice_data.set_index('file_name')['frame_no'].to_dict() # set up matrix indexed by slice_no and frame_no slice_index = {} for slice_no in slices: slice_index[str(slice_no).rjust(2, '0')] = len(slice_index) frame_pixel_series = {} frame_confidence_series = {} for frame_no in frames: frame_pixel_series[str(frame_no).rjust(2, '0')] = [-1] * len(slices) frame_confidence_series[str(frame_no).rjust(2, '0')] = [-1] * len(slices) overlay_paths = helpers.get_patient_overlays(patient_id) for overlay_path in overlay_paths: overlay_img = cv2.imread(overlay_path, cv2.IMREAD_GRAYSCALE) low_confidence_pixel_count = ((overlay_img < LOW_CONFIDENCE_PIXEL_THRESHOLD) & (overlay_img > 20)).sum() # low_confidence_pixel_count = overlay_img[overlay_img > 10].mean() if threshold_value >= 0: overlay_img[overlay_img <= threshold_value] = 0 overlay_img[overlay_img > threshold_value] = 255 pixel_count = overlay_img.sum() / 255 #if pixel_count < 1: # low_confidence_pixel_percentage = -1 #pixel_count = len(overlay_img[overlay_img > 0]) file_name = get_filename(overlay_path) if file_name not in file_name_slices: continue slice_no = file_name_slices[file_name] frame_no = file_name_frames[file_name] slice_str = str(slice_no).rjust(2, '0') frame_str = str(frame_no).rjust(2, '0') if slice_str not in slice_index: print "Patient " + str(patient_id) + " : slice " + slice_str + " skipped" patient_slice_data = patient_slice_data[patient_slice_data["slice_noloc"] != slice_no] continue if frame_str not in frame_pixel_series: print "Patient " + str(patient_id) + " : frame " + frame_str + " skipped" patient_slice_data = patient_slice_data[patient_slice_data["frame_no"] != frame_no] continue frames_pixel_serie = frame_pixel_series[frame_str] frame_confidence_serie = frame_confidence_series[frame_str] serie_index = slice_index[slice_str] frames_pixel_serie[serie_index] = pixel_count frame_confidence_serie[serie_index] = low_confidence_pixel_count data_frame = pandas.DataFrame() patient_slice_data_frame1 = patient_slice_data[patient_slice_data["frame_no"] == 1] data_frame["slice"] = slices data_frame["slice_thickness"] = patient_slice_data_frame1["slice_thickness"].values data_frame["slice_location"] = patient_slice_data_frame1["slice_location"].values data_frame["slice_dist"] = (patient_slice_data_frame1["slice_location"].shift(-1) - patient_slice_data_frame1["slice_location"]).values data_frame["slice_dist"].fillna(data_frame["slice_dist"].mean(), inplace=True) data_frame["slice_location2a"] = patient_slice_data_frame1["slice_location2"].values data_frame["slice_location2b"] = patient_slice_data_frame1["slice_location2"].shift(-1).values data_frame["slice_dist2"] = data_frame.apply(lambda row: compute_distance(row["slice_location2a"], row["slice_location2b"]), axis=1) data_frame["slice_dist2"].fillna(data_frame["slice_dist2"].mean(), inplace=True) deltas = abs(abs(data_frame["slice_dist"]) - abs(data_frame["slice_dist2"])).sum() if deltas > 1: print "slice_dist != slice_dist2 (" + str(deltas) + ")" data_frame["time"] = patient_slice_data_frame1["time"].values for frame_no in frames: frame_str = str(frame_no).rjust(2, '0') interpolated_series = interpolate_series(frame_pixel_series[frame_str], frame_str) data_frame["fr_" + frame_str] = interpolated_series if SMOOTHEN_FRAMES: for frame_no in frames: prev_frame = frame_no - 1 if prev_frame < 1: prev_frame = 30 next_frame = frame_no + 1 if next_frame > 30: next_frame = 1 this_frame_col = "fr_" + str(frame_no).rjust(2, '0') next_frame_col = "fr_" + str(next_frame).rjust(2, '0') prev_frame_col = "fr_" + str(prev_frame).rjust(2, '0') if this_frame_col in data_frame.columns and next_frame_col in data_frame.columns and prev_frame_col in data_frame.columns: data_frame[this_frame_col] = (data_frame[this_frame_col] + data_frame[prev_frame_col] + data_frame[next_frame_col]) / 3 for frame_no in frames: frame_str = str(frame_no).rjust(2, '0') data_frame["co_" + frame_str] = frame_confidence_series[frame_str] patient_dir = helpers.get_pred_patient_dir(patient_id) data_frame.to_csv(patient_dir + "\\areas_" + model_name + ".csv", sep=";") return data_frame