이미지데이터를 분류할때도 전처리가 중요하다. 좋은 데이터를 넣어주어야 학습결과가 좋게 나온다.
이미지 사이즈가 다 다르면 계산을 할 수 없기 때문에 사이즈도 맞춰줄 필요가 있다. 어떤 사이즈로 맞춰주는 것이 좋을까?
PIL, OpenCV등을 내부에서 사용하고 있는데, 포토샵에서 이미지 사이즈를 줄이는 것 처럼 이미지 사이즈를 조정해준다.
이미지 사이즈를 작게 만들면 어떤 결과가 나올까?
원래 이미지가 왜곡이 될 수 있다. 하지만 이것은 이미지를 크게 만들어도 똑같이 발생하는 문제이다.
단 사이즈를 작게 만들면 계산이 빠르다
이미지 사이즈를 크게 만든다면?
작은 이미지와 달리 계산시간은 오래 걸리지만 학습량이 많아지기때문에 분류에서는 정확도가 높게 나온다.
따라서 이미지사이즈는 계산편의를 위해 보통 정사각형 형태로 만들어준다.
이미지 사이즈도 하이퍼파라미터처럼 조정을 하면 성능이 달라지고 Conv, Pooling 도 성능에 영향을 준다. 어떤식으로 레이어를 구성하냐에 따라 보완이 가능하기도 하다.
training 결과 과대적합이 되었음을 알 수 있다. : 한 가지 이유로 단정하기 어렵지만 가장 성능이 안좋게 나온 중점적인 이유를 찾는다면 전처리가 되지 않은 점을 뽑을 수 있다.
: 따라서 어떤 데이터를 넣어주느냐가 가장 중요하다.
훈련 과정에서 과대적합을 막는 여러 가지 방법들에는 데이터 증강, 모델에 드롭아웃을 추가하는 방법이 있다.
데이터 증강
Keras 전처리 레이어 tf.keras.layers.RandomFlip(접고), tf.keras.layers.RandomRotation(돌리고), tf.keras.layers.RandomZoom(땡기고)
1001 malaria 실습: 이미지를 로드하는 방법
matplotlib.pyplot imread()를 사용하는 방법
PIL(Pillow)로 불러오는 방법 -> PIL을 '접고돌리고땡기고'가 다 가능하다.
PIL(Python Imaging Library) Pillow
TF 내부에서도 PIL이나 OpenCV를 사용해서 '접고돌리고땡기고'를 한다
이미지 작업을 위한 표준 절차를 제공하고 있다: 사이즈변경, 저장, 필터적용한 블러 및 효과처리, 등고선추출 등\
3. Open CV로 불러오는 방법(Computer Vision)에 주로 사용하는 도구로 동영상처리 등에 주로 사용한다.
1002 실습
(주제) 말라리아 혈액도말 이미지 분류 실습
(목적) TF공식 문서의 이미지 분류를 다른 이미지를 사용해서 응용해 보는 것입니다.
이미지 데이터 불러오기 wget 을 사용하면 온라인 URL 에 있는 파일을 불러올 수 있습니다. 논문(혈액도말 이미지로 말라리아 감염여부를 판단하는 논문)에 사용한 데이터셋을 불러왔습니다.
plt.imread 와 cv2(OpenCV) 의 imread 를 통해 array 형태로 데이터를 불러와서 시각화를 해서 감염된 이미지와 아닌 이미지를 비교해 봤습니다.
TF.keras의 전처리 도구를 사용해서 train, valid set을 나눠주었습니다. => 레이블값을 폴더명으로 생성해 주게 됩니다.
앞으로 할 내용은 CNN 레이어를 구성, 컴파일 하고 학습하고 정확도(Accuray) 성능을 비교해볼 예정입니다.
모델 층쌓기
비선형 활성화 함수가 없이 여러 개의 층을 쌓을 경우 기본 선형 활성화 함수를 사용하게 되므로 하나의 층을 가진 선형 모델과 성능이 비슷하다. 은닉층에 비선형 활성화 함수를 추가하지 않으면 계산 자원과 시간을 낭비하는 결과를 초래하고 수치적으로 불안정성이 높아지게 된다. 이런 현상은 밀집 층 뿐만 아니라 아까 말한 합성곱 층과 같이 다른 종류의 층에도 적용되게 됩니다.
층을 쌓을 때 "비선형 활성화 함수 없이" 두 개의 합성곱 층을 쌓는 경우 그냥 많은 커널을 가진 하나의 conv2d 층을 사용하는 것과 수학적으로 동일하기 때문에 비효율 적으로 합성곱 신경망을 만드는 것과 같으므로 주의해야한다.
padding
conv2d 층의 padding 매개변수의 기본값은 "vaild"로 커널이 인풋 이미지 밖으로 슬라이딩 하지 않습니다. 이런 경우 출력은 입력보다 작아진다. padding 매개변수를 "same"으로 해줄 경우 출력 크기가 입력값과 동일해지도록 입력 이미지 주위에 0 픽셀이 패딩된다.
‘valid’ : 유효한 영역만 출력이 됩니다. 따라서 출력 이미지 사이즈는 입력 사이즈보다 작습니다.
‘same’ : 출력 이미지 사이즈가 입력 이미지 사이즈와 동일합니다.
입력데이터 종류와 이에 맞는 네트워크 구조
벡터 데이터(시간이나 순서가 상관 없음): MLP (밀집층)
이미지 데이터(흑백 또는 컬러): 2D 합성곱 신경망
스펙트로그램 오디오 데이터: 2D 합성곱 신경망이나 순환 신경망 <- 이걸 하고 있음!
텍스트 데이터: 1D 합성곱 신경망이나 순환 신경망
시계열 데이터(시간이나 순서가 중요함): 1D 합성곱 신경망이나 순환 신경망
볼륨 데이터(예: 3D 의료 이미지): 3D 합성곱 신경망
비디오 데이터(이미지의 시퀀스): 3D 합성곱 신경망(모션 효과를 감지해야 하는 경우) 또는 특성 추출을 위해 프레임 별로 적용한 2D 합성곱 신경망과 만들어진 특성 시퀀스를 처리하기 위한 RNN이나 1D 합성곱 신경망의 조합
합성곱신경망에 대해
합성곱 층은 입력받은 텐서에서 공간적으로 다른 위치에 기하학적 변환을 적용하여 국부적인 공간 패턴을 찾습니다. 이런 방식은 이동 불변성을 가진 표현을 만들기 때문에 합성곱 층을 매우 데이터 효율적으로 만들고 모듈화 시킵니다. 위와 같은 아이디어는 어떤 차원 공간에도 적용할 수 있기 때문에 1D(시퀀스), 2D(이미지나 이미지가 아니자만 사운드 스펙트로그램처럼 비슷한 표현), 3D(볼륨 데이터) 등입니다. 텐서플로우에서는 conv1d 층으로 시퀀스를 처리하고, conv2d층으로 이미지를 처리하고, conv3d 층으로 볼륨 데이터를 처리할 수 있습니다. 합성곱 신경망은 합성곱 층과 풀링 층을 쌓아서 구성하게 됩니다. 풀링 층은 공간적으로 데이터를 다운샘플링하고 이는 특성 개수가 늘어나게되면 후속 층이 합성곱 신경망의 입력 이미지에서 더 많은 공간을 바라보도록 특성 맵의 크기를 적절하게 유지시킵니다. 합성곱 신경망은 공간적인 특성 맵을 벡터로 바꾸기 위해 종종 flatten 층과 전역 풀링 층으로 끝납니다. 그리고 일련의 밀집층(MLP)로 처리하여 분류나 회귀 출력을 만들게 됩니다.