시작은 미약하였으나 , 그 끝은 창대하리라

[CNN] 커스텀 데이터 활용 이미지 분류 예제 코드 설명 본문

인공지능/딥러닝 사이드 Project

[CNN] 커스텀 데이터 활용 이미지 분류 예제 코드 설명

애플파ol 2023. 2. 26. 21:40

이미지 데이터 출처: https://www.kaggle.com/datasets/pranavraikokte/covid19-image-dataset

 

Covid-19 Image Dataset

3 Way Classification - COVID-19, Viral Pneumonia, Normal

www.kaggle.com

 

 

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  #데이터 확장 모듈

 

 

참고)  폴더내부 모습

Covid19-dataset의 폴더 내부

-> test, train,validation 이 나누어져서 각각 들어가 있다.

 

test set의 모습
train set 모습

> class가 3개임을 확인할수 있다.

 

test/Covid 폴더 내부

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()

 

Comments