2022 Samsung AI Challenge (3D Metrology)

Simulation Dataset image의 시각화

2022.08.18 09:52 3,416 Views
heatmaps.zip

그림과 같은 방식으로 모든 시뮬레이션 depth map 이미지의 각 행에서부터 pixel의 값을 추출하여 heat map을 만들어 보았습니다.

우측의 그래프에서 y축은 픽셀값(0~255), x축은 이미지에서 가로축 좌표 위치에 해당합니다.

※ 그림에서는 한개의 이미지에서 추출했으나, 이하의 도표에서는 모든 이미지에서부터 값을 추출하였습니다.


그림의 높이가 72px 이므로 72개의 도표가 나옵니다. 좌상단부터 우측으로 가면서 1px 씩 아래로 진행한다고 생각하면서 보시면 될 것 같습니다.

도표에서 색상이 color bar의 우측으로 갈수록 더 많은 빈도로 나타난 것으로 해석할 수 있습니다.

  • 도표에서부터 case_1,2,3,4에 따라 최고점 높이에서 차이가 나는 것을 확인할 수 있었습니다.
  • 상대적으로 최저점은 큰차이가 나지 않았습니다.


figure 작성을 위해 사용된 코드는 아래와 같습니다.

def draw_line_by_row(paths,save_dir_name):
    if(type(paths) is str):
        paths = sorted(glob.glob(paths))
    
    pixel_tables=np.zeros((72,48,len(paths)),dtype=np.uint8)
    
    for i in range(0,len(paths)):
        img = cv2.imread(paths[i], cv2.IMREAD_GRAYSCALE)
        pixel_tables[:,:,i] = img.copy()
    
    
    heat_map = np.zeros((256,48,72))
    for i in range(0,pixel_tables.shape[0]):
        for j in range(0,pixel_tables.shape[1]):
            t_unique, t_counts = np.unique(pixel_tables[i,j,:],return_counts=True)
            for t_height,t_value in zip(t_unique,t_counts):
                heat_map[t_height,j,i]=t_value
    
    bounds = np.append(1,np.arange(1000,30001,2000))
    jet = cm.get_cmap('jet', 256)
    newcolors = jet(np.linspace(0, 1, 256))
    black = np.array([0/256, 0/256, 0/256, 1])
    #newcolors[:1, :] = black #colorbar customize
    newcmp = ListedColormap(newcolors)
    newcmp.set_over(newcolors[-1])
    newcmp.set_under(black)
    norm = BoundaryNorm(bounds, newcmp.N)
    
    fig=plt.figure(figsize=(34,20),constrained_layout=True,)
    
    subplot = fig.subplots(nrows=3, ncols=24)
    
    #plt.subplots_adjust(left=0.05,right=1,top=1,bottom=0.2,wspace=0.3,hspace=0.1)
    
    i=0
    for ax in subplot.flat:
        im_heatmap = ax.pcolor(heat_map[:,:,i],cmap=newcmp,#edgecolors='black',
                               vmin=0,vmax=heat_map.max(),norm=norm);
        i=i+1;
    
    plt.tight_layout()
    plt.subplots_adjust(bottom=0.1)
    cb_ax=fig.add_axes([0.25,0.025,0.5,0.05])  ##<= (left,bottom,width,height)
    plt.colorbar(im_heatmap,cax=cb_ax,orientation='horizontal',pad=0.02,ticks=bounds,extend='both',norm=norm)
    
    os.makedirs(save_dir_name, exist_ok=True)
    heat_img_file_path = os.path.join(save_dir_name,'heatmap.png')
    plt.savefig(heat_img_file_path,dpi=fig.dpi)
    
    plt.cla()
    plt.clf()
    plt.close()



depth_path_all = '../open/simulation_data/Depth/*/*/*.png'
simulation_depth_paths_all = sorted(glob.glob(depth_path_all))

draw_line_by_row(np.unique(simulation_depth_paths_all),'./depth_hist_all')


sem 이미지도 위 도표와 같이 표시할 수 있습니다.

edge effect 및 노이즈 등의 영향으로 값의 분포가 depth map 이미지의 도표와 다른 것을 확인할 수 있습니다.



학습이 완료된 모델을 활용해 simulation dataset의 sem 이미지에서 depth map을 추출하고, 이를 시각화 해보았습니다.

이 모델에서는 최고높이의 구분이 모호하고, hole 영역의 깊이 추정이 특정값으로 수렴하는 것처럼 보이네요.


마지막으로.. 첨부파일은 위의 코드로 만들어진 Case별 sem 및 depth map 도표입니다.

(수정) 압축된 파일은 관리자만 볼 수 있는 줄 몰랐네요. :p


이상으로 시각화를 통한 데이터의 정량적 분석방법이었습니다.

편리한 분석방법이 있다면 함께 이야기를 나누면 좋겠습니다 :)

Login Required
0 / 1000
배가_고파졌다
2022.09.03 23:29

감사합니다~ 
올려주신 자료를 참고하여 정성적인 방법으로 map을 보는 방법을 작성했습니다.
참고하시면 분석에 도움이 되실지도 모르겠네요 
https://dacon.io/competitions/official/235954/talkboard/406871