Origin Dataset

개요


구성 및 스펙

항목 내용
총 WSIs 수 107 장. DOAJ
배율 / 해상도 40× (즉 고배율 스캔) DOAJ+1
ROI (Region of Interest) 전문가 병리학자들이 슬라이드 상에서 관심(region) 지정됨. 병소 부위 및 유의미한 조직 영역 중심. DOAJ
Patch 크기 1024 × 1024 픽셀 패치들이 ROI에서 추출됨. DOAJ
클래스 (HER2 점수) 4개 클래스: 0, 1+, 2+, 3+ DOAJ
데이터 정제 (filtering) 색상 히스토그램(color histogram) 기반 필터링 → tumor/non-tumour 영역 및 artifacts 제거됨. DOAJ

Preprocessing Dataset

개요

image.png

Code

class_list=['class_0','class_1+','class_2+','class_3+']
img_size=256
save_path='../../data/her2_cell_level_dataset/'
create_directory(save_path+'images/')
create_directory(save_path+'labels/')
create_directory(save_path+'xml/')
color_list=['#00FF00','#FFFF00','#0000FF','#FF0000']  # 각 클래스별 색상 리스트
model.eval()
for i in range(len(class_list)):
    image_list=glob(f'../../data/Patch-based-dataset/**/{class_list[i]}/*.png')
    for j in tqdm(range(len(image_list))):
        with torch.no_grad():
            img=Image.open(image_list[j])
            torch_img=torch.from_numpy(np.array(img.resize((img_size,img_size)))[:,:,:3]).permute(2,0,1).unsqueeze(0).float()/255.
            torch_img=torch_img.to(device)
            outputs=pred_patch(torch_img, model, 0, 0, 2)
            negative_tumor, positive_tumor, non_tumor = outputs
            temp_label=[]
            # XML 파일로 저장
            if len(negative_tumor)+len(positive_tumor)==0:
                continue
            if i==0:
                create_asap_xml(negative_tumor, positive_tumor, "class_0", "class_0", color_list[0], color_list[0], f'{save_path}xml/{class_list[i]}_{j}.xml')
                for k in range(len(outputs)):
                    for cell in outputs[k]:
                        cell['cls_id']=0
                        temp_label.append(cell)
            elif i==1:
                create_asap_xml(negative_tumor, positive_tumor, "class_1+", "class_1+", color_list[1], color_list[1], f'{save_path}xml/{class_list[i]}_{j}.xml')
                for k in range(len(outputs)):
                    for cell in outputs[k]:
                        cell['cls_id']=1
                        temp_label.append(cell)
            elif i==2:
                create_asap_xml(negative_tumor, positive_tumor, "class_0", "class_2+", color_list[0], color_list[2], f'{save_path}xml/{class_list[i]}_{j}.xml')
                for k in range(len(outputs)):
                    for cell in outputs[k]:
                        if cell['cls_id']==0:
                            cell['cls_id']=0
                        else:
                            cell['cls_id']=2
                        temp_label.append(cell)
            elif i==3:
                create_asap_xml(negative_tumor, positive_tumor, "class_0", "class_3+", color_list[0], color_list[3], f'{save_path}xml/{class_list[i]}_{j}.xml')
                for k in range(len(outputs)):
                    for cell in outputs[k]:
                        if cell['cls_id']==0:
                            cell['cls_id']=0
                        else:
                            cell['cls_id']=3
                        temp_label.append(cell)
            with open(f'{save_path}labels/{class_list[i]}_{j}.json', 'w', encoding='utf-8') as f:
                json.dump(temp_label, f, indent=4)  
            img.save(f'{save_path}images/{class_list[i]}_{j}.png')

추후 예정사항