말라리아 감염 예측을 위한 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장 확인
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개의 감염된 사진 조사
이미지 크기는 감염 여부에 따라 다릅니다.
확대해야합니다가지다
데이터 세트 나누기
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 모델위 그림과 같이 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% 이상의 정확도를 보였습니다.
모델의 구성 또는 학습 코드가 개선되면 더 높은 정확도를 얻을 수 있습니다.