데이터 : https://www.kaggle.com/datasets/paultimothymooney/chest-xray-pneumonia
Chest X-Ray Images (Pneumonia)
5,863 images, 2 categories
www.kaggle.com
참고 서적 : Must Have 머신러닝 딥러닝 문제해결 전략(신백균)
캐글데이터와 책을 참고하여 데이터 분석을 진행해봄
google colab에서 진행함
# 데이터 불러오기
import os
import glob
ROOT_DIR = '/content'
DATA_ROOT_DIR = os.path.join(ROOT_DIR, 'chest_xray')
TRAIN_DATA_ROOT_DIR = os.path.join(DATA_ROOT_DIR, 'train')
VALIDATION_DATA_ROOT_DIR = os.path.join(DATA_ROOT_DIR, 'val')
TEST_DATA_ROOT_DIR = os.path.join(DATA_ROOT_DIR, 'test')
캐글에서 바로 데이터를 가져와서 사용하는 방법이 있는걸로 아는데,
아직은 그 방법을 몰라 일단 데이터셋을 zip파일로 다운받은 후 구글 드라이브에 넣어줌
그리고 경로를 지정해줌
from google.colab import drive
drive.mount('/content/gdrive/')
그리고 드라이브랑 연결해주기
import shutil
try:
dataset_path = '/content/gdrive/MyDrive/study/x-ray'
shutil.copy(os.path.join(dataset_path, 'chest-xray-pneumonia.zip'), '/content')
except Exception as err:
print(str(err))
if os.path.exists(DATA_ROOT_DIR):
shutil.rmtree(DATA_ROOT_DIR)
print(DATA_ROOT_DIR + ' is removed.')
# 압축파일 풀기
import zipfile
with zipfile.ZipFile(os.path.join(ROOT_DIR, 'chest-xray-pneumonia.zip'), 'r') as target_file:
target_file.extractall(ROOT_DIR)
드라이브에 저장되어 있는 데이터들을 content경로로 복사하고, zip을 풀어주면 데이터 준비 완료
그리고 이제 데이터를 사용하기 전에 train, validation, test 데이터 개수를 확인해보면
현재 train과 test에는 적당한 수의 데이터가 들어가있는 것을 볼 수 있지만 validation의 경우 데이터 수가 적은 것을 볼 수 있다
이는 이후 모델을 학습할 때 검증 결과가 믿을만하지 못하다는 것을 의미한다.
정상과 폐렴 이미지의 개수를 살펴보자
normal_imgs = []
pneumonia_imgs = []
for img_path in ['/train/', '/val/', '/test/']:
data_path = DATA_ROOT_DIR + img_path
normal_imgs += glob(data_path + 'NORMAL/*')
pneumonia_imgs += glob(data_path + 'PNEUMONIA/*')
print(f'normal : {len(normal_imgs)}')
print(f'pneumonia : {len(pneumonia_imgs)}')
폐렴 데이터가 약 3배정도 더 많은 것을 볼 수 있다
이는 나중에 모델링을 할 때 데이터를 증강하는 등으로 데이터 균형을 맞출 수 있다.
폐렴폐와 정상폐의 x-ray사진이 어떻게 다른지 눈으로 확인해보기 위해
한번 출력을 해보기 위해 함수를 만들어준다
import matplotlib as mlp
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import cv2
def show_image(img_paths,rows=2, cols=3):
assert len(img_paths) <= rows * cols, 'too many images' # 이미지가 행/열 개수보다 많으면 오류 발생
mlp.rc('font', size=8)
plt.figure(figsize=(15,8))
grid = gridspec.GridSpec(ncols=cols, nrows=rows)
# 이미지 출력
for i, img_path in enumerate(img_paths):
img = cv2.imread(img_path)
ax = plt.subplot(grid[i])
ax.imshow(img)
# 정상 이미지
num =6
normal_img_paths = normal_imgs[:num]
show_image(normal_img_paths)
# 폐렴 이미지
num =6
pneumonia_img_paths = pneumonia_imgs[:num]
show_image(pneumonia_img_paths)
각 6장씩 뽑아봤는데,
사실 나는 의료 지식없어서 폐부분이 조금 더 뿌옇다는 것 말고는
차이를 찾지 못했다
그래서 블로그를 참고했다.
https://biology-statistics-programming.tistory.com/60
Chest X-Ray Images (Pneumonia) 데이터 정보
폐렴에 관한 의료사진을 보고 딥러닝 기술을 이용하여 정상인지 폐렴인지 판별해보자. 이번 데이터로는 Chest X-Ray Images (Pneumonia)를 사용하였다. 데이터에 대한 정보는 다음과 같다. 데이터 논문
biology-statistics-programming.tistory.com
왼쪽의 이미지는 정상 흉부 X-ray로 이미지에서 희미한 영역없이 깨끗한 폐임이 드러난다.
가운데 이미지는 세균성 폐렴 X-ray로 오른쪽 상부 옆 (흰색 화살표)에서 초점 엽 강화를 나타낸다. 오른쪽 이미지는 바이러스성 폐렴으로 양쪽 폐에서 보다 확산된 간질성 패턴으로 나타난다.
그렇다고 한다.
다음엔 이 데이터를 기반으로 모델링한 내용을 정리해보겟슴 !