이미지 데이터 출처: https://www.kaggle.com/datasets/pranavraikokte/covid19-image-dataset
1.모듈 불러옴
# impot module
import tensorflow as tf
import matplotlib.pyplot as plt #이미지 확인용 모듈
import matplotlib.image as mpimg #이미지 확인용 모듈
import os
import numpy as np
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten # layer
from tensorflow.keras.preprocessing.image import ImageDataGenerator #데이터 확장 모듈
참고) 폴더내부 모습
-> test, train,validation 이 나누어져서 각각 들어가 있다.
> class가 3개임을 확인할수 있다.
Covid, Normal, Viral Pneumonia 각각의 폴더안에 사진이 들어있음을 확인 할 수 있다.
참고: Validation 폴더 존재 유무에 따라 A,B로 설명을 나누어 놓았습니다. (다른 부분만 주황색 장을 표시하였습니다.)
A ) train set / test set / validation set 이 각각 존재하는 경우
2. 디렉토리 설정
train_dir = 'C:/Users/yong/Desktop/Covid19-dataset/train'
val_dir = 'C:/Users/yong/Desktop/Covid19-dataset/validation'
test_dir='C:/Users/yong/Desktop/Covid19-dataset/test'
3. Set up Data augumentaion (데이터 확장 설정)
# train set 의 데이터 확장 설정.
train_datagen = ImageDataGenerator(rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
# validation set 의 데이터 확장 설정.(검증용이라서 rescale 파라미터 만 사용한다)
val_datagen = ImageDataGenerator(rescale=1./255)
4. 모델의 파라미터 설정
# 모델의 파라미터
input_shape = (224, 224, 3)
num_classes = 3 # 분류하려는 클래스 개수
batch_size = 32 # batch _size
5. 데이터 불러오기
# train_set 에 대한 데이터 불러옴.
train_generator = train_datagen.flow_from_directory(train_dir,
target_size=input_shape[:2],
batch_size=batch_size,
class_mode='categorical')
# validation_set 에 대한 데이터 불러옴.
val_generator = val_datagen.flow_from_directory(val_dir,
target_size=input_shape[:2],
batch_size=batch_size,
class_mode='categorical')
B) train set / test set 만 존재하는 경우( validation set이 없는 경우)
2. 디렉토리 설정
train_dir = 'C:/Users/yong/Desktop/Covid19-dataset/train'
test_dir='C:/Users/yong/Desktop/Covid19-dataset/test'
3. Set up Data augumentaion (데이터 확장 설정)
설명: Train set의 데이터에서 validation set을 따로 나누어야함.
(validation_split 추가)
# train set의 데이터 확장 설정
# validation 20%로 나눔
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest', # data 확장시 어떤 방식을 취할지에 대한 파라미터.
validation_split=0.2 # split 20% of the data into a validation set
)
4. 모델의 파라미터 설정
# 모델의 파라미터
input_shape = (224, 224, 3)
num_classes = 3 # 분류하려는 클래스 개수
batch_size = 32 # batch _size
5. 데이터 불러오기
설명:
flow_from _directory 의 역할 : batch size와 자동 라벨링 할당 역할이다
subset 파라미터 : 'training' 과 'validation' 만 존재하는 파라미터로 3장에서 validation_split을 설정했을 경우에만 설정해준다. 데이터가 training데이터인지 validaion 데이터인지 구분해주는 역할. (뭔가 신기하다..)
## train set에 대한 데이터 불러오기
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=input_shape[:2],
batch_size=batch_size,
class_mode='categorical',
subset='training' # use the training subset of the data
)
## validation set에 대한 데이터 불러오기
validation_generator = train_datagen.flow_from_directory(
train_dir,
target_size=input_shape[:2],
batch_size=batch_size,
class_mode='categorical',
subset='validation' # use the validation subset of the data
)
# test set 데이터 확장(generator) 설정. (test_set 이니깐 rescale 파라미터만 사용함)
test_datagen = ImageDataGenerator(rescale=1./255)
# test_set 에 대한 데이터 불러옴.
test_generator = test_datagen.flow_from_directory(
test_dir,
target_size=input_shape[:2],
batch_size=batch_size,
class_mode='categorical')
여기부터 A,B 합쳐서 감 (5번 이후의 번호)
6. 모델 설계
# make model
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=input_shape))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten()) # Dimension reduction for put in dense layer
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
# model compile
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
7. 모델 학습
(model.fit에 callbakcs=[Earlystopping] 추가하면 더 좋은 정확도가 나올것이다.)
# Train the model on the training data and validate on the validation data
model.fit(
train_generator,
steps_per_epoch=len(train_generator), #train의 step수
epochs=50,
validation_data=validation_generator,
validation_steps=len(validation_generator)
)
8. Test set 으로 모델 평가
# Evaluate the model on the test data generator
test_loss, test_acc = model.evaluate(test_generator, steps=test_generator.n // batch_size, verbose=1)
print('Test loss:', test_loss)
print('Test accuracy:', test_acc)
(좋은 모델 냅두고 이상한거 만들었으니 성능이 좋을리가..
'무튼 이런 flow chart를 보이는구나를 공부' 하고 싶어서 만들어 보았다.)
9. 기타
-폴더 내부 사진 확인.
(Covid 라는 폴더명(카테고리명), file_list [숫자] 이렇게 두가지를 바꾸면 다양한 사진을 확인할 수 있다.)
## 사진 확인하는 간단 코드
## line5 의 [숫자] 에 따라 나오는 사진 file_list 의 순서임.
file_list=os.listdir(train_dir+'/Covid')
selecet_file=mpimg.imread(train_dir+'/Covid/'+file_list[1]) # 이미지의 픽셀값을 numpy로 반환
plt.imshow(selecet_file)
plt.show()
'인공지능 (기본 딥러닝) > 딥러닝 사이드 Project' 카테고리의 다른 글
AutoFormer 코드 설명 및 적용. (0) | 2023.07.16 |
---|---|
[트랜스포머] 트랜스포머 인코더를 이용한 시계열 예측. (2) | 2023.07.13 |
YOLOv5 커스텀 데이터셋으로 학습하기 (27) | 2022.11.04 |
[CNN] Conv1D 커널(필터) 작동 방식 설명 (시계열 데이터 비교) (0) | 2022.09.02 |
[CNN] 예제 코드 설명 (회귀 예측 ,첫 번째 layer Conv1D사용) (0) | 2022.08.26 |