分割数据预处理

日常报错(累~):

  小编最近用yolact对BraTS数据集做预测,验证结果如下:

分割数据预处理

   发现ET对于Dice和PPV太小了,根据公式,我一开始以为是模型预测的区域过多导致的。

后面生成图片观察:

分割数据预处理

   忽然之间,意识到,是自己的target生成错了。笔者对这个三个区域,首先是采用边缘提取,获取边缘的坐标,之后进行一次判断,只保留点数大于20的区域,所以就可能出现上述图片的情况。我们真是target是由ET区域(黄色区域),但我最后生成的target是没有ET区域的。

  所以再模型预测的阶段,也不会预测出ET,造成的PPV值偏小,进而Dice偏小。

如下是我生成边缘坐标(改进后,每个if价格else:continue)的部分代码:

f=open('F:/DATA/train_mask4.txt','w')

for r in tqdm(range(len(image_traintest_paths))):
# for r in tqdm(range(4)):
    # 获取路径
    a=0
    b=0
    c=0
#     fold_path=mask_train_paths[r]
    fold_path=mask_traintest_paths[r]
    npmask=np.load(fold_path)
    #print(npmask.shape)
    txt_line = ''
    vertices_list_WT=[]
    vertices_list_ET=[]
    vertices_list_TC=[]
    # 获取边缘
    WT_Label = npmask.copy()
    WT_Label[npmask == 1] = 1.
    WT_Label[npmask == 2] = 1.
    WT_Label[npmask == 4] = 1.
    WT_Label=WT_Label.astype(np.uint8)
    WT_Label=WT_Label*255
    TC_Label = npmask.copy()
    TC_Label[npmask == 1] = 1.
    TC_Label[npmask == 2] = 0.
    TC_Label[npmask == 4] = 1.
    TC_Label=TC_Label.astype(np.uint8)
    TC_Label=TC_Label*255
    ET_Label = npmask.copy()
    ET_Label[npmask == 1] = 0.
    ET_Label[npmask == 2] = 0.
    ET_Label[npmask == 4] = 1
    ET_Label=ET_Label.astype(np.uint8)
    ET_Label=ET_Label*255
    # 写入到text line
    path_forward=fold_path.split('\\')[-1]
    txt_line=txt_line+path_forward+" "
    # 获取WT边缘坐标
    detected_edges = cv2.Canny(WT_Label, lowThreshold, lowThreshold+10 * ratio, apertureSize=kernel_size)
#     print(detected_edges.shape)
    if SumNum(detected_edges)>20:
        a=1
        for i in range(detected_edges.shape[0]):
            for j in range(detected_edges.shape[1]):
                if detected_edges[i,j] !=0:
                    vertices_list_WT.append([j,i])
        vertices_list_WT=np.array(vertices_list_WT)
        # 获取WTbounding box
        max_x_WT=np.max(vertices_list_WT[:,0])
        max_y_WT=np.max(vertices_list_WT[:,1])
        min_x_WT=np.min(vertices_list_WT[:,0])
        min_y_WT=np.min(vertices_list_WT[:,1])
        # 添加WT bounding box , vertices
        txt_line=txt_line+ str(min_x_WT)+','+str(min_y_WT)+','+str(max_x_WT)+','+str(max_y_WT)+','+'1'+','
        for i in range(len(vertices_list_WT)):
            txt_line=txt_line+str(vertices_list_WT[i][0])+','
            txt_line=txt_line+str(vertices_list_WT[i][1])+','
        txt_line=txt_line[:-1]+" "
    else:continue
    # 获取TC边缘坐标
    detected_edges = cv2.Canny(TC_Label, lowThreshold, lowThreshold+10 * ratio, apertureSize=kernel_size)
    if SumNum(detected_edges)>20:
        b=1
        for i in range(detected_edges.shape[0]):
            for j in range(detected_edges.shape[1]):
                if detected_edges[i,j] !=0:
                    vertices_list_TC.append([j,i])
        vertices_list_TC=np.array(vertices_list_TC)
        max_x_TC=np.max(vertices_list_TC[:,0])
        max_y_TC=np.max(vertices_list_TC[:,1])
        min_x_TC=np.min(vertices_list_TC[:,0])
        min_y_TC=np.min(vertices_list_TC[:,1])
        # 添加TC bounding box, vertices
        txt_line=txt_line+ str(min_x_TC)+','+str(min_y_TC)+','+str(max_x_TC)+','+str(max_y_TC)+','+'2'+','
        for i in range(len(vertices_list_TC)):
            txt_line=txt_line+str(vertices_list_TC[i][0])+','
            txt_line=txt_line+str(vertices_list_TC[i][1])+','
        txt_line=txt_line[:-1]+" "
    else:continue
    # 获取ET边缘坐标
    detected_edges = cv2.Canny(ET_Label, lowThreshold, lowThreshold+10 * ratio, apertureSize=kernel_size)
    if SumNum(detected_edges)>20:
        c=1
        for i in range(detected_edges.shape[0]):
            for j in range(detected_edges.shape[1]):
                if detected_edges[i,j] !=0:
                    vertices_list_ET.append([j,i])
        vertices_list_ET=np.array(vertices_list_ET)
        max_x_ET=np.max(vertices_list_ET[:,0])
        max_y_ET=np.max(vertices_list_ET[:,1])
        min_x_ET=np.min(vertices_list_ET[:,0])
        min_y_ET=np.min(vertices_list_ET[:,1])
        # 添加ET bounding box, vertices
        txt_line=txt_line+ str(min_x_ET)+','+str(min_y_ET)+','+str(max_x_ET)+','+str(max_y_ET)+','+'3'+','
        for i in range(len(vertices_list_ET)):
            txt_line=txt_line+str(vertices_list_ET[i][0])+','
            txt_line=txt_line+str(vertices_list_ET[i][1])+','
    else:continue
    
    txt_line=txt_line[:-1]+'\n'
    if (a==b==c==0):
        continue

    f.write(txt_line)

f.close()

  不知再次训练结果会怎样。。。

上一篇:AutoCAD中的扩展字典及扩展记录(C#)


下一篇:算法随笔(快排,随机快排,归并排序,找中位数, 第k小元素问题 ,棋盘覆盖)