(78일차) CNN과 이미지 데이터를 이용한 말라리아 감염의 이진분류 예측

말라리아 감염 예측을 위한 CNN 모델 및 혈액 도말 이미지.

CNN 관련 용어를 이해한 후 네트워크 구조를 코드로 작성합니다.

로드 라이브러리

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

수학, 데이터 조작 및 시각화 라이브러리 로드

import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense
from tensorflow.keras.callbacks import EarlyStopping

학습에 필요한 모델 구성, 라이브러리 및 기능 로딩

사진을 확인

사진은 https://data.lhncbc.nlm.nih.gov/public/Malaria/cell_images.zip 파일을 다운받아 압축을 풀고 사용하세요.
말라리아에 감염된 이미지는 Parasitized 폴더에, 감염되지 않은 이미지는 Uninfected 폴더에 저장됩니다.

import glob
upics = glob.glob('./cell_images/Uninfected/*.png')
apics = glob.glob('./cell_images/Parasitized/*.png')

아래에서 각각의 감염/미감염 사진을 확인하십시오.

upics_0 = upics(0)
upics_0_img = plt.imread(upics_0)
plt.imshow(upics_0_img)

감염되지 않은 첫 번째 이미지


감염되지 않은

apics_0 = apics(0)
apics_0_img = plt.imread(apics_0)
plt.imshow(apics_0_img)

첫 번째 감염된 이미지


기생하다

OpenCV를 사용하여 크기가 있는 여러 이미지를 봅시다.

import cv2

plt.figure(figsize=(8, 8))
labels = "Uninfected"
for i, images in enumerate(upics(:9)):
    ax = plt.subplot(3, 3, i + 1)
    img = cv2.imread(images)
    plt.imshow(img)
    plt.title(f'{labels} {img.shape}')
    plt.axis("off")

감염되지 않은 사진 9장 확인


un1

plt.figure(figsize=(8, 8))
labels = "Infected"
for i, images in enumerate(apics(:9)):
    ax = plt.subplot(3, 3, i + 1)
    img = cv2.imread(images)
    plt.imshow(img)
    plt.title(f'{labels} {img.shape}')
    plt.axis("off")

9개의 감염된 사진 조사


입력 1

이미지 크기는 감염 여부에 따라 다릅니다.

확대해야합니다가지다

데이터 세트 나누기

from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(rescale=1/255.0, validation_split=0.2)

training 데이터와 validation 데이터를 validation_split 값으로 8:2 비율로 나눕니다.

에뮤

trainDatagen = datagen.flow_from_directory(directory = 'cell_images/',
                                           target_size = (64, 64),
                                           class_mode="binary",
                                           batch_size = 64,
                                           subset="training")
                                           
# 실행 결과
Found 22048 images belonging to 2 classes.

가로 세로 100~200개의 원본 이미지로 열차 세트를 생성하지만 64, 64로 조정. class_mode는 이진 분류이므로 이진으로 지정됩니다.

테스트 세트

valDatagen = datagen.flow_from_directory(directory = 'cell_images/',
                                         target_size =(64, 64),
                                         class_mode="binary",
                                         batch_size = 64,
                                         subset="validation")
                                         
# 실행 결과
Found 5510 images belonging to 2 classes.

훈련 세트와 마찬가지로 테스트 세트도 생성되었습니다.

모델 만들기


CNN
출처: https://d2l.ai/chapter_convolutional-neural-networks/lenet.html

CNN 모델위 그림과 같이 Conv2D와 MaxPooling2D로 구성되어 있습니다.

컨볼루션 레이어~ 후에 조밀한 층으로 구성되다
예를 들어, 위 그림은 Conv(filters=6)-Pool(pool_size=2)-Conv(filters=16)-Pool(pool_size=2)-Dense(120)-Dense(84)-Dense ( 10) .
크기(이미지 높이, 이미지 너비, 색상 채널)의 텐서를 입력으로 받습니다.

컬러 이미지는 R, G, B의 3개 채널이 있고 흑백 이미지는 1개 채널이 있습니다.

model = Sequential()
# 입력층
model.add(Conv2D(filters=16, kernel_size=(3,3), activation='relu', input_shape=(64, 64, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(filters=16, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))

# Dense Layer(Fully-connected layer)
model.add(Flatten())
model.add(Dense(32, activation='relu'))
# 출력층 => 말라리아 감염 여부 분류
model.add(Dense(1, activation='sigmoid'))  # 이진 분류의 출력층(0~1 값)

위와 같이 모델이 생성됩니다.

출력 레이어의 활성화 함수는 이진 함수이므로 0과 1 사이의 확률 값을 출력합니다.

S결장지정되었습니다.

모델 요약

model.summary()


요약하다

레이어 시각화


층

plot_model 함수를 사용했습니다.

model.add에서 레이어를 볼 수 있습니다.

모델 편집

optim = tf.keras.optimizers.Adam(learning_rate=1e-3)
model.compile(optimizer=optim,
              loss=tf.keras.losses.BinaryCrossentropy(),
              metrics=('accuracy')
             )

모델을 교육하기 전에 컴파일 단계에서 일부 설정이 완료됩니다.


옵티마이저는 ‘아담‘ 및 이진 분류이므로 이진 교차 엔트로피손실 함수로 지정됩니다.

모델 피팅

early_stop= EarlyStopping(monitor="val_loss", patience=5)
history = model.fit(trainDatagen, epochs=1000, callbacks=early_stop, validation_data=valDatagen)

5회 이상 성능 개선이 없으면(val_loss가 감소하지 않음) 실행이 조기 종료됩니다.

일찍 멈추다지정되었습니다.


맞다

18세기 초에 끝납니다.

아래와 같이 데이터 프레임을 생성하여 성능 향상을 확인할 수 있습니다.


소재

생성된 CNN 모델은 혈액 도말 이미지로부터 학습하여 말라리아 감염을 분류하는 데 90% 이상의 정확도를 보였습니다.

모델의 구성 또는 학습 코드가 개선되면 더 높은 정확도를 얻을 수 있습니다.