[10일 차] CIFAR10, GTSRB

Kimsoohyun·2022년 3월 13일
0
post-thumbnail

※ Notification
본 포스팅은 작성자가 이해한 내용을 바탕으로 작성된 글이기 때문에 틀린 부분이 있을 수 있습니다.
잘못된 부분이 있다면 댓글로 알려주시면 수정하도록 하겠습니다 :)

Intro

어제와 이어서 오늘도 CIFAR10을 통한 수업을 진행했다.
이후에 CIFAR10 class의 다른 이미지와, GTSRB data를 이용해 dataset을 load하는 방식이 아닌 실제로 이미지 파일을 가져와서 처리하는 과정을 배웠다.

Dataset

MNIST나 CIFAR10 dataset의 경우 load_data() 하나면 numpy형태로 data가 아주 예쁘게 제공된다.
하지만 우리가 맞닥뜨릴 data들은 이렇게 예쁜 형식으로 제공되지 않는데, 이를 위해서 file 형식의 data를 가져와 처리하는 방법을 배웠다.

CIFAR10

어제 만들었던 CIFAR10 Model에 새로운 image를 넣어보자.
Image data를 불러오기 위해서 OpenCV를 이용한다.

import cv2
src_img = cv2.imread('dog.jpg')

dst_img = cv2.cvtColor(src_img1, cv2.COLOR_BGR2RGB)
dst_img = cv2.resize(dst_img, dsize=(32,32)) # resize
dst_img = dst_img / 255.0 # normalization

OpenCV의 경우 BGR 포맷을 기본으로 사용하기 때문에 RGB 포맷으로 변경해주고, CIFAR10 Image가 (32, 32)이기 때문에 Size를 맞춰주었다. 그 후 정규화를 진행했다.
위와 같은 이미지들을 모델에 넣어 결과를 확인해봤다.

prediction =>  cat 0.9993635
prediction =>  dog 0.9174402
prediction =>  dog 0.9508884
prediction =>  airplane 1.0

cat2의 경우 고양이로 잘 예측한 반면 cat은 강아지로 예측했다.

Size가 변경된 이미지는 어떤식일까 궁금해서 이또한 출력해봤는데 다음과 같았다.

=====================================
prediction =>  cat 0.9993635
prediction =>  dog 0.00063507323
prediction =>  frog 1.0616955e-06
=====================================
prediction =>  dog 0.9174402
prediction =>  deer 0.039465647
prediction =>  cat 0.020931313
=====================================
prediction =>  dog 0.9508884
prediction =>  cat 0.035632446
prediction =>  frog 0.009060885
=====================================
prediction =>  airplane 1.0
prediction =>  bird 2.4126313e-08
prediction =>  ship 3.5874075e-11

각각의 사진들을 얼마의 확률로 예측했을까 궁금해서 출력해봤는데 고양이를 강아지로 오분류한 사진에 대해서 3%만 고양이라고 예측했다.

전체 형태가 다 나타나지 않아서 그런 것일지, 강아지 색깔과 비슷한 색깔의 고양이라서 그런 것인지 다른 이미지를 가지고 좀 더 돌려봐야할 것 같다.

Data load from directory

위 코드에서는 데이터를 직접 load해서 사용했는데, 실제 데이터는 Directory 형태로 구분된다. 때문에 Directory를 이용한 data load를 학습했다.

File in one directory

my_test_image 폴더에 다음과 같이 image data가 있고, 폴더 있는 Data를 불러오기 위해 glob 모듈에 glob 함수를 사용한다.

from glob import glob

test_image_data_list = glob('my_test_image/*')

my_test_image/*.jpg와 같이 코딩할 수도 있는데 deer.1.webp 파일이 jpg가 아니라서 그냥 모든 파일을 가져오게 코딩했다.

glob 함수는 사용자가 제시한 조건에 맞는 파일명을 리스트 형식으로 반환한다.
test_image_data_list을 출력해주면 다음과 같다.

['my_test_image/flog.123.jpg',
 'my_test_image/truck.23.jpg',
 'my_test_image/deer.1.webp',
 'my_test_image/fighter.1.jpg',
 'my_test_image/cat.2.jpg',
 'my_test_image/dog.6331.jpg',
 'my_test_image/dog.4.jpg',
 'my_test_image/dog.3.jpg',
 'my_test_image/cat.9.jpg',
 'my_test_image/horse.1.jpg',
 'my_test_image/house.23.jpg',
 'my_test_image/flog.1.jpg']

이러한 방식을 통해 Directory에 있는 파일을 불러올 수 있다.
파일 이름 형식이 온점(.)으로 구분되어 있으므로 split을 통해 label name을 잘라 사용하면 된다.

File in each directory

그렇다면 다음과 같이 폴더에 각각의 파일들이 들어있을 경우에는 어떻게 해줘야 할까?

이 또한 크게 어렵지 않은데 split을 사용하여 원하는 곳을 잘라 사용하면 된다.
하지만 이는 반드시 형식이 통일되어 있어야 한다.

from glob import glob

test_image_data_list = glob('my_test_image/*/*')

label_list = []
image_list = []

for index in range(len(test_image_data_list)):
    labels.append(test_image_data_list[index].split('/')[1].strip())
    image = cv2.imread(test_image_data_list[index], cv2.IMREAD_COLOR)
    image_list.append(image)

마찬가지로 glob를 통해 파일의 경로를 리스트 형식으로 받은 뒤 for문을 통해 원하는 처리를 진행한다.

Zipfile

import zipfile

with zipfile.ZipFile(zipfile_name,'r') as target_file:

    target_file.extractall(path)

Colab의 경우 폴더 단위로 데이터를 업로드 하기 힘들어서 zipfile을 이용하여 업로드한다.
이 과정에서 zipfile 모듈을 사용하는데 사용 방법은 다음과 같다.

Google photo service prototype

사진을 찍으면 자동으로 해당 카테고리 폴더에 넣어주는 Google photo service를 아주 간단하게 구현하는 시간을 가졌다.

image를 받아 label을 예측하고, 각 폴더에 옮기는 실습이었다.

I/O 작업의 경우 시간 소요가 많으므로, 실시간 서비스에 적합하지 않아 미리 Directory를 만들어줘야 한다.

import os
result_dir = 'pred_result'
if not os.path.exists(result_dir):
    os.mkdir(result_dir)
    print(result_dir+'is created !')

os 모듈의 mkdir을 이용하여 폴더를 생성하고, 예측값이 0.5 이상일 경우 shutil 모듈을 이용하여 copy하는 방식으로 이루어졌다.

import shutil
for index in range(len(pred)):
    class_index = np.argmax(pred[index])
    print('prediction => ',class_names[class_index], pred[index].max())
    if pred[index].max() > 0.5:
        target_path = result_dir+'/'+class_names[class_index]+'/'.strip()
        shutil.copy(test_image_data_list[index], target_path+img_file_list[index])
        print('%s is copied into %s'%(img_file_list[index], target_path))
    else:
        shutil.copy(test_image_data_list[index], unknown_dir+'/'+img_file_list[index])
        print('%s is copied into %s'%(img_file_list[index], unknown_dir+'/'+img_file_list[index]))

CIFAR10의 경우 10개의 Class가 있는데, 10개 안에 포함되지 않은 항목들은 모두 unknown 폴더로 넣어주었다.
위와 같은 이미지를 이용해 결과를 확인해봤다.
고양이 사진 하나가 강아지로 예측된 것 빼고는 나름 잘 된 것 같다.

GTSRB

Google photo service 다음으로 GTSRB 실습을 진행했다.
GTSRB는 German Traffic Sign Recognition Benchmark의 약어로 이름 그대로 교통 표지판 이미지 dataset이다.

Wget

Google colab의 경우 데이터 업로드 속도가 엄청 느린데 wget을 이용하면 인터넷에 있는 파일을 손쉽게 다운로드 할 수 있다.
PC에 저장했다가 다시 올리는 것보다 훨씬 빠르고 간편하다.

!wget https://sid.erda.dk/public/archives/daaeac0d7ce1152aea9b61d9f1e19370/GTSRB_Final_Training_Images.zip

Directory structure

GTSRB의 압축파일을 풀어보면 다음과 같은 구조로 되어있다.

GTSRB_Final_Training_Images
 |- GTSRB
     |- Final_Training
         |- Images
             |- 00000
             |- 00001
             |- 00002
             |- .....
             |- 00042

00000과 같은 숫자는 각각의 label이고 각 Directory 안에 ppm 파일이 있다.

Kaggle - Brain MRI Images for Brain Tumor Detection Dataset

Kaggle dataset 등 많은 데이터셋이 위와 비슷한 형태로 구성되어 있고 우리는 딥러닝 학습을 위해 사용하는 일반적인 Directory 형태인 아래와 같은 형태로 변경해주어야 한다.

GTSRB
 |- train
     |- 00000
     |- 00001
     |- .....
     |- 00042
 |- test
     |- 00000
     |- 00001
     |- .....
     |- 00042

우선 이번 주에는 Train, Test Directory를 나누지 않고 진행을 했다.

앞에서 서술했던 것처럼 zipfile, os, glob 등을 이용하여 이미지 데이터를 numpy 형태로 변환하고, 인덱스 shuffle을 통해 train data와 test data를 8:2로 나누어 학습을 진행했다.

Conv2D - MaxPool, Dropout ×2\times 2 + Conv2D - Flatten - Dense(softmax)의 Architecture로 overfit이 거의 없는 99.2%라는 결과를 얻을 수 있었다.

Outro

다음 주에는 Train, Test Directory에 각각의 파일을 저장한 후 그 Directory를 통해 모델 학습을 진행하는 과정을 진행한다고 하셨다.
시간될 때 한번 해보라고 하셨으니 짬짬이 시간내서 해봐야겠다.
지금 생각하기로는 index shuffle 한 다음 file_path_list와 index를 이용하여 file들을 copy하면 될 것 같은데 해봐야 알 것 같다.

profile
어제보다 나은

0개의 댓글