국비지원 프로젝트의 결과물은 기업에서 요청한 주제로 선정되는 경우가 많은데, Computer Vision 관련 프로젝트의 결과물에 의료영상자료를 판독하는 주제가 많아 개인적으로 제작을 시도하였다.
주제 정하기
의료영상자료에서 우리에게 가장 익숙한 것은 흉부 Xray사진 일 것이다. 따라서 흉부 Xray사진을 입력하면, 이 사진의 환자가 어떤 질병을 가지고 있는지(폐렴, 심장비대, 암 등등)를 예측해 의사의 진단에 도움이 되는 모델을 만드는 것을 목표로 하였다.
데이터 수집
의학관련 자료는 개인신상정보가 섞여있는 경우가 많아 공신력있는 자료를 얻는 것이 까다로웠는데, CVPR 2017이라는 흉부 Xray 진단결과를 기반으로 각 흉부질환의 연관성을 조사하는 프로젝트의 데이터를 얻어 이를 활용하였다.
데이터 분류
위 데이터는 대략 10만 장의 Xray사진과 각 사진이 어떤 증상을 가지고 있는지 기제한 엑셀파일로 구성되었는데, 학습시킬 사진 자체는 아무 태그도 없이 00000001_000.png같은 이름으로 되어있었다. 이대로 사진하나하나 엑셀 파일을 보며 라벨링 작업을 하는 것은 말도 안되는 일이기 때문에, 데이터를 분류하고 태그를 달아주는 작업을 해야했다.
import os
import pandas as pd
import numpy as np
# 이미지 파일의 경로를 가져옵니다.
image_path = 'C:\\Users\\endnj\\OneDrive\\Desktop\\xray\\XrayData\\images_001\\images'
# 이미지 파일 목록을 가져옵니다.
image_list = os.listdir(image_path)
# 이미지 파일의 태그를 가져옵니다.
excel_file = 'C:\\Users\\endnj\\OneDrive\\Desktop\\xray\\XrayData\\image_001.xlsx'
df = pd.read_excel(excel_file)
# 이미지 파일의 이름을 수정합니다.
new_image_path = os.path.join('C:\\Users\\endnj\\OneDrive\\Desktop\\xray\\XrayData\\images_001\\images\\NewImages')
# new_image_path가 존재하지 않는 경우 경로를 생성합니다.
if not os.path.exists(new_image_path):
os.makedirs(new_image_path)
def get_tags(df, image_name):
"""
이 함수는 이미지 파일의 태그를 가져옵니다.
Args:
df: 이미지 파일의 태그가 포함된 데이터프레임
image_name: 이미지 파일의 이름
Returns:
이미지 파일의 태그 목록
"""
# 이미지 파일의 이름이 Image_Name 열에 존재하는지 확인합니다.
if image_name in df['Image_Name'].values:
# 이미지 파일의 태그 정보를 가져옵니다.
tags = df.loc[df['Image_Name'] == image_name, 'Atelectasis': 'No Finding'].values[0]
# Construct a list of tag names where the value is 1
tag_names = [df.columns[i + 2] for i, value in enumerate(tags[1:]) if value == 1]
# 이미지 파일의 이름에서 확장자를 제거합니다.
image_name_without_extension = os.path.splitext(image_name)[0]
# 이미지 파일의 이름에 태그를 추가합니다.
new_image_name = f'{image_name_without_extension}_{"-".join(tag_names)}.png'
# 이미지 파일의 이름을 변경합니다.
os.rename(os.path.join(image_path, image_name), os.path.join(new_image_path, new_image_name))
else:
# 이미지 파일의 이름이 Image_Name 열에 존재하지 않습니다.
print(f'{image_name}은 Image_Name 열에 존재하지 않습니다.')
# 이미지 파일의 태그를 가져오고 파일 이름을 변경합니다.
for image_name in image_list:
get_tags(df, image_name)
엑셀 파일의 데이터를 읽어와 해당 이미지가 가진 태그를 이름 마지막에 붙여 00000005_006_Infiltration.png과 같이 만드는 코드이다. 이 코드를 사용해 이미지들을 증상별로 분류하고, 학습시킬 준비를 하였다.