CNN 이미지 전처리 - CNN imiji jeoncheoli

안녕하세요? 요즘 딥러닝을 이용하여 이것저것 시도해 보고 있습니다.

다들 해보셨을 MNIST 는 해 보셨을 겁니다.

그런데 하고나면, '그래 잘 되는구나' 라는 생각은 드는데,

정말 내가 원하는 문제를 풀 수 있는지 의구심이 듭니다.

데이터 세트도 제공해 주고, NN도 정해져 있으니까요.

사진을 보고 남자와 여자를 구분해 보자


그래서 저는 직접 데이터 수집부터 트레이닝까지 다 해 보고 싶어졌습니다.

그렇게 밑바닥부터 다른 도움없이 스스로 해냈을때, 비로서 뭔가 할 수 있을 것 같았습니다.

목표는 "남자와 여자를 판별하는 봇 만들기' 로 정했습니다.

그런데 시작과 동시에 커다란 장벽에 부딪혔습니다.

제가 어디서 듣기론 Classifier 문제에서 데이터는 클래스당 최소 1,000 개 내외는 나와야 한다고 했습니다.

그럼, 안경 쓴 사람 + 안 쓴 사람 = 2,000 장의 이미지를 구해야 합니다.

1000 장은 어디까지나 최소이고, 정적 수량은 1만여 장 입니다.

그 이상인 경우, 오히려 학습이 더 안좋아 진다고 하네요

아무튼 그래서 생각해낸 방법이 구글링 하기 입니다.

삽질의 시작


일단, 저는 매우 게으릅니다. 그래서 dataset, face 등으로 검색을 시도했습니다.

누군가 잘 만들어 정리해 놓은 데이터 세트가 필요했거든요. :)

생각해보면 모순된 이야기네요. 직접 해 보고 싶다면서 데이터세트를 구하는 노가다는 직접 하기 싫었거든요 ㅎ.

그렇게 열심히 검색해서 아래와 같은 이미지들을 주워 모았습니다.

CNN 이미지 전처리 - CNN imiji jeoncheoli
crystalcube.zip

소스파일 (via High Level API with slim)


기존에 올린 소스코드는 tensorflow 의 low level api 를 이용하여 구현한 것 입니다.

이번에 slim 이라는 녀석을 이용하여 간략하고 가독성 좋게 수정하였습니다.

+ 모델,기능,전처리 모두 수정되었습니다

CNN 이미지 전처리 - CNN imiji jeoncheoli
Crystalcube_slim.zip

https://github.com/inhovation97/personal_project/blob/main/pytorch/pytorch_project_Image_preprocessing.ipynb

 

inhovation97/personal_project

개인 프로젝트. Contribute to inhovation97/personal_project development by creating an account on GitHub.

github.com

 

 

이번 포스팅은 모델에 집어넣기 직전까지 데이터를 전처리해주는데, 포인트는 학습이 잘 되도록 데이터를 다듬어주는 데에 있습니다.

 

<trorchvision 라이브러리를 이용해 쉽게 이미지들을 전처리하기>

 

1. 이미지 resize

torchvision라이브러리를 이용하면 dataloader를 정의해주기가 굉장히 쉽습니다.

우선 파일들의 상황을 다시 확인해줍니다.

 

CNN 이미지 전처리 - CNN imiji jeoncheoli

train/test 폴더를 만들어준 뒤 각 범주들의 폴더도 만들어 주었습니다.

train/test 데이터를 각 범주마다 8:2 split했습니다.

train : 1049

test : 263

 

제가 가져온 이미지들은 문제가 있습니다. size가 전부 다 다릅니다.

cnn 모델은 featuremap을 뽑기위해 input data의 형태에 맞게 아키텍쳐를 설계하기 때문에 이미지들의 size를 전부 맞춰주어야합니다. 

 

 

 

CNN 이미지 전처리 - CNN imiji jeoncheoli

폴더들을 위 처럼 정리해 두었다면, torchvision의 ImageFolder라는 함수를 이용해 root에 경로만 지정해주면, 알아서 각 범주의 이미지들을 읽어주기 때문에 매우 편리하게 dataset을 정의할 수 있습니다.

 

torchvision의 transforms을 이용해서 모든 이미지들을 128*128로 resize해준 뒤에 tensor형태로 바꿔줍시다. totensor는 numpy형태의 이미지를 torch의 (C,H,W) tensor형태로 바꿔줍니다. 

 

 

 

 

CNN 이미지 전처리 - CNN imiji jeoncheoli

 

 

 

위 transforms를 진행하면, 요로코롬 이미지 데이터가 텐서형태로 변환하면서 픽셀도 전부 255로 나뉘어 range가 (0~1)값으로 스케일링이 됩니다.

 

 

 

 

 

 

 

2. reize한 이미지 normalize하기

 

먼저 이렇게 transform을 해준 이유가 있습니다.

바로 이미지들을 normalize해주기 위함입니다. 

 

범위를 조정함으로써 step해 나가는 landscape를 안정화 시켜서 local optima 문제를 예방하고, 속도 측면에서도 좋아진다고합니다. 

 

저는 앞서 이 글 첫 번째 포스팅에서 resnet50 모델을 transfer leaning을 할 것이라고 말했었는데, 찾아보니  ImageNet에서 쓰인 데이터들의 평균을 이용해서 normalize해주는 경우도 있다고 하더라구요. 일단 저는 제가 크롤링한 데이터들의 mean, std로 normalize를 진행하겠습니다.

 

 

 

하지만 normalize를 진행할 시에 꼭 중요한 점이있습니다.

1. 꼭 resize한 이미지들의 mean과 std로 normalize를 진행할 것

   -> resize한 이미지를 학습할 것이기 때문에 resize한 데이터의 mean과 std를 이용해야 합니다.

 

2. train/test셋을 독립적으로 해야할까? (수정)

   -> 보통의 경우 train셋에는 절대로 test셋의 정보가 들어가면 안됩니다. 두 data를 독립적으로 normalization을 해주지 않으면 의도치 않게 과적합의 위험에 빠져있겠죠...?

 

이미지 데이터에서는 normalization이 크게 작용하지는 않나봅니다. 아래 아래 cs231n에서는 image normalization을 저런 식으로 설명했고, 보통은 imagenet의 mean과 std를 이용하기도 하고, 그냥 mean 0.5, std 0.5로 noramlization을 진행하는 경향도 있다고합니다.

1. 딥러닝 모델 전 시간 다층 퍼셉트론까지 이야기했습니다. 모델 안에 은닉층이 많아진다면, 깊은 신경망이라는 의미의 Deep Learning이란 단어를 사용하였습니다. 2. 딥러닝 모델의 학습방법 Loss fu

kcy51156.tistory.com

이미지 처리와 자연어 처리를 위한 데이터 전 처리와 딥러닝 모델을 알아보도록 하겠습니다.

1. 이미지 처리를 이용한 예시

CNN 이미지 전처리 - CNN imiji jeoncheoli
2021 NIPA AI 온라인 교육 AI(인공지능) 실무 심화 (elice.io)

- 이미지에 있는 어떤 동물인지 분류하고자 할 때,

CNN 이미지 전처리 - CNN imiji jeoncheoli

- 컴퓨터에게 이미지는 각 픽셀 값을 가진 숫자 배열로 인식하게 합니다.

CNN 이미지 전처리 - CNN imiji jeoncheoli

2. 이미지 전 처리

- 모두 같은 크기를 갖는 이미지로 통일

1) 가로 세로 픽셀 사이즈를 표현하는 해상도 통일

2) 색을 표현하는 방식 통일(RGB, HSV, Gray-scale, Binary, ...)

CNN 이미지 전처리 - CNN imiji jeoncheoli
MNIST 데이터 이미지 전 처리

3. 이미지 처리 딥러닝 모델

1) 기존 다층 퍼셉트론 기반 신경망의 이미지 처리 방식

- 극도로 많은 수의 파라미터가 필요하다.

2) 합성곱 신경망(Convolution Neural Network)

- 작은 필터를 순환시키는 방식

- 이미지의 패턴이 아닌 특징을 중점으로 인식

CNN 이미지 전처리 - CNN imiji jeoncheoli

3) 합성곱 신경망 구조 

CNN 이미지 전처리 - CNN imiji jeoncheoli
합성곱층 → 풀링층 → 완전연결층

- 입력 이미지의 특징을 추출, 분류하는 과정으로 동작이다.

CNN 이미지 전처리 - CNN imiji jeoncheoli

- 이미지에서 어떠한 특징이 있는지를 구하는 과정.

- 필터가 이미지를 이동하며 새로운 이미지(피쳐맵)를 생성.

4) 피쳐맵의 크기 변형

CNN 이미지 전처리 - CNN imiji jeoncheoli

- Padding : 원본 이미지의 상하좌우에 한 줄씩 추가

- String : 필터를 이동시키는 거리 설정(ex) 1칸씩 이동)

5) Pooling Layer(풀링층) : 이미지의 왜곡의 영향(노이즈)를 축소하는 과정.

CNN 이미지 전처리 - CNN imiji jeoncheoli

- 최대풀링 : 가장 큰 값만 나오는 과정

- 평균풀링 : 4개의 숫자의 평균 값으로 축소하는 과정

6) Fully Connected Layer(완전연결층) : 추출된 특징을 사용하여 이미지를 분류.

CNN 이미지 전처리 - CNN imiji jeoncheoli

7) 분류를 위한 Softmax활성화함수

CNN 이미지 전처리 - CNN imiji jeoncheoli

- 마지막 계층에 Softmax활성화함수 사용

a+b+c+d+e+f= 1, a,b,c,d,e,f>=0

8) 정리

CNN 이미지 전처리 - CNN imiji jeoncheoli

- Convolution Layer는 특징을 찾아내고, PoolingLayer는 처리할 맵(이미지) 크기를 줄여준다. 이를 N번 반복한다.

- 반복할 때마다 줄어든 영역에서의 특징을 찾게 되고, 영역의 크기는 작아졌기 때문에 빠른 학습이 가능해진다

CNN 이미지 전처리 - CNN imiji jeoncheoli
사물 인식과 화질 개선

4. 실습

1. MNIST 분류 CNN 모델 - 데이터 전 처리, 모델 구현, 평가 및 예측

- 손글씨로 된 사진을 모아 둔 데이터이다.

- MNIST 데이터는 이미지 데이터이지만 가로 길이와 세로 길이만 존재하는 2차원 데이터입니다. CNN 모델은 채널(RGB 혹은 흑백)까지 고려한 3차원 데이터를 입력으로 받기에 채널 차원을 추가해 데이터의 모양(shape)을 바꿔줍니다. 결과는 아래와 같습니다.

[데이터 수, 가로 길이, 세로 길이] -> [데이터 수, 가로 길이, 세로 길이, 채널 수]

CNN 이미지 전처리 - CNN imiji jeoncheoli

1. 학습용 및 평가용 데이터를 CNN 모델의 입력으로 사용할 수 있도록 (샘플개수, 가로픽셀, 세로픽셀, 1) 형태로 변환합니다.

- tf.expand_dims 함수를 활용하여 train_images, test_images 데이터의 형태를 변환하고 각각 train_images, test_images에 저장합니다.

tf.expand_dims(data, axis)

- Tensor 배열 데이터에서 마지막 축(axis)에 해당하는 곳에 차원 하나를 추가할 수 있는 코드입니다. ( axis에 -1을 넣으면 어떤 data가 들어오던 마지막 축의 index를 의미합니다.)