Python/PyTorch 공부

[PyTorch] single object image 분석

AI 꿈나무 2021. 3. 6. 00:13
반응형

 안녕하세요!

 

 Grand Challenge 에서 제공하는 ADM dataset으로 데이터를 분석해보도록 하겠습니다! amd.grand-challenge.org/ 여기에서 회원가입한 후 대회에 참가하면 dataset을 다운로드 할 수 있습니다..ㅎㅎ

 

 AMD dataset은 안구의 중심와(Fovea) 이미지와 Fovea의 중앙 위치(label)로 이루어져 있습니다.

 


우선, 다운로드 받은 label 엑셀 파일을 pandas로 불러와 확인해보겠습니다.

 

import os
import pandas as pd

# loading Fovea_location.xlsx
path2data = '/content/cookbook/MyDrive/data'

path2labels = os.path.join(path2data, 'Training400', 'Fovea_location.xlsx')

# make sure to install xlrd
labels_df = pd.read_excel(path2labels, index_col='ID')

# print out its head
labels_df.head()

 

 

 imgName와 Fovea의 중앙 위치로 이루어져 있습니다.

 

 끝부분도 확인해보겠습니다.

 

# print out its tails
labels_df.tail()

 

 

 seaborn 모듈에서 제공하는 산점도 그래프로 label을 확인하겠습니다.

 

# show the scatter plot of the Fovea_X and Fovea_Y coordinates
import seaborn as sns
%matplotlib inline

AorN = [imn[0] for imn in labels_df.imgName]
sns.scatterplot(x=labels_df['Fovea_X'], y=labels_df['Fovea_Y'], hue=AorN)

 

 

 sample 이미지를 확인해보겠습니다.

 

 그전에, 임의의 index를 지정해 줍시다.

 

# show a few sample images
import numpy as np
from PIL import Image, ImageDraw
import matplotlib.pylab as plt

# fix random seed
np.random.seed(2019)

# set the plot parameters
plt.rcParams['figure.figsize'] = (15, 9)
plt.subplots_adjust(wspace=0, hspace=0.3)
nrows, ncols=2, 3

# select a random set of image ids
imgName = labels_df['imgName']
ids = labels_df.index
rndIds = np.random.choice(ids, nrows * ncols)
print(rndIds)

 

 

 이미지와 label을 불러오는 함수를 정의합니다.

 

 AMD dataset에는 AMD 폴더와 Non-AMD 폴더가 있으므로 둘을 구분해주는 기능도 포함합니다.

 

# define a helper function to load an image and its label from the local files
def load_img_label(labels_df, id_):
    imgName = labels_df['imgName']
    if imgName[id_][0] == 'A':
        prefix = 'AMD'
    else:
        prefix = 'Non-AMD'

    fullPath2img = os.path.join(path2data, 'Training400', prefix, imgName[id_])
    img = Image.open(fullPath2img)
    x = labels_df['Fovea_X'][id_]
    y = labels_df['Fovea_Y'][id_]
    label = (x, y)
    return img, label

 

 Fovea의 위치에 바운딩박스를 그려줍시다. 50x50 크기의 바운딩박스입니다.

 

# define a helper function to show the image and label as a bounding box
def show_img_label(img, label, w_h=(50, 50), thickness=2):
    w,h = w_h
    cx, cy = label
    draw = ImageDraw.Draw(img)
    draw.rectangle(((cx-w/2, cy-h/2), (cx+w/2, cy+h/2)), outline='green', width=thickness)
    plt.imshow(np.asarray(img))

 

 정의한 함수를 사용해서 이미지를 나타내겠습니다.

 

# show the selected images together with the fovea bounding boxes
for i, id_ in enumerate(rndIds):
    img, label = load_img_label(labels_df, id_)
    print(img.size, label)
    plt.subplot(nrows, ncols, i+1)
    show_img_label(img, label, w_h=(150,150), thickness=20)
    plt.title(imgName[id_])

  

 

 조금 징그럽네요...ㅋㅋ

 

 AMD 데이터와 Non-AMD 데이터의 크기는 다릅니다. 분석을 위해서 data의 넓이와 높이 데이터를 그래프로 나타내겠습니다.

 

 우선 높이입니다.

# collect the image widths and heights in two lists
h_list, w_list = [], []
for id_ in ids:
    if imgName[id_][0] == 'A':
        prefix = 'AMD'
    else:
        prefix = 'Non-AMD'
    fullPath2img = os.path.join(path2data, 'Training400', prefix, imgName[id_])
    img = Image.open(fullPath2img)
    h, w = img.size
    h_list.append(h)
    w_list.append(w)
    
# plot the distributions of heights and widths

# plot the distribution of heights
sns.distplot(a=h_list, kde=False)

 

 

 AMD data가 더 많으므로 높이가 2056인 데이터가 많습니다.

 

 넓이입니다.

 

# plot the distributions of widths
sns.distplot(a=w_list, kde=False)

 

 

 대략적인 데이터 확인은 끝났습니다!

 

 다음 포스팅에서는 image를 transform하고 custom dataset을 만들어보도록 하겠습니다.

반응형