티스토리 뷰
3. Convolutional Networks / L2. Convolutional Neural Networks - Image Augmentation in Keras
chrisysl 2018. 9. 13. 14:31Image Augmentation in Keras
- 이미지 분류를 위해 알고리즘을 설계할 때, 많은 수의 서로 상관없는 정보들을 다뤄야 함.
- 우리가 설계한 알고리즘이 실제로 이미지 안에 찾고자하는 object가 있는지 없는지를 판단하도록 만들어야 한다.
- 그 object의 크기나 기울어짐 정도 또는 전체 이미지 중 object가 오른편 끝인지와 같은 위치는 상관없이
- 해당 object를 정확하게 있는지 없는지를 판단해줘야 함.
- 이것은 다시말해 알고리즘이 이미지의 불변하는 표현(invariant representation)을 학습하는 것이다.
- object의 크기가 커지거나 작아짐에 따라 리턴하는 prediction값이 달라지면 안된다.
- 이를 scale invariance라 부른다.
- 마찬가지로 object의 각도에 따라 리턴하는 prediction값이 달라지면 안된다.
- 이를 rotation invariance라 부른다.
- 마찬가지로 object의 위치에 따라 리턴하는 prediction값이 달라지면 안된다.
- 이를 translation invariance라 부른다.
- max pooling 레이어가 어떻게 연산을 수행하는지를 떠올려보면 어째서 translation invariance를 내장하고 있는지 알 수 있다.
- 컴퓨터는 이미지를 픽셀단위로 이루어진 행렬로 받아들인다는 것을 앞서 다뤘었는데,
- 따라서 이미지에서의 object의 크기나 회전값, 위치 등에 변화를 주면 픽셀 값에 큰 영향을 미친다.
- 이런점에 대한 대안으로 설계한 알고리즘을 통계적으로 불변하게(statistically invariant) 만드는 기술이 있다.
- CNN을 object의 회전값에 대해 불변하게 하려면(rotation invariance)
- training set의 이미지중 랜덤한 값으로 회전된 이미지를 생성하여 training set에 몇개 추가해주면 된다.
- 마찬가지로 object의 이동에 대해 불변하게 하려면(translation invariance)
- training set의 이미지중 랜덤한 값으로 이동한 이미지를 생성하여 set에 추가해주면 된다.
- 이렇게 training set을 증강시키는 것을 데이터 증강(Data Augmentation)이라 부른다.
- 데이터 증강은 object에 대한 더 많은 이미지를 학습하게 되어 overfitting의 문제 또한 방지해준다.
- 따라서 testing set을 통한 테스트 진행시 학습단계에서 일반화(generalization)가 더 잘 적용되어
- 더 나은 퍼포먼스를 보여준다.
- 실제로 퍼포먼스가 향상되는지 확인해보자.
- 데이터를 임포트 한 후, ImageDataGenerator라는 파이썬 클래스를 추가로 임포트한다.
- 이 클래스는 증강과 관련된 것들에 도움을 주기위해 임포트하였고,
- 우리가 원하는 증강(augmentation)의 종류를 클래스에 전달해주기만 하면 된다.
- 위 경우 이미지를 랜덤하게 수직, 수평으로 이동하는 augmented image generator를 생성하였다.
- 또한 랜덤하게 수평으로 뒤집게도 설정하였다.
- 설정값들을 지정해줬으면, 맨 아래줄처럼 데이터에 fit 시켜주면 된다.
- 증강된 이미지가 어떻게 보이는지 확인해 볼 차례다.
- extreme subset 배열에 저장해 둔 이미지중 최초 12개의 이미지들을 따로 담아뒀다.
- 그리곤 flow함수만 호출해 주면 된다.
- 증강된 이미지(Augmented images)중 어떤것이 뒤집혔고 이동했는지 직접 보면서 확인이 가능하다.
- 위의 증강시킨 이미지를 사용하기 전에 모델 아키텍처를 정의해줘야 한다.
- 이전에 다뤘던 아키텍쳐를 그대로 사용해보도록 하자.
- 그 다음 마찬가지로 컴파일 해준다.
- 그 다음 설계한 CNN 네트워크를 augmented training data를 통해 fit 하는 과정을 거친다.
- 이 때의 명령어들이 살짝 다른데, 3가지 차이가 있다.
- 먼저 fit 명령어가 fit_generator로 바뀌게된다.
- ImageDataGenerator 클래스를 사용해서 증강시킨 이미지를 생성해 내 학습을 진행할 경우
- 반드시 fit 명령어를 fit_generator로 바꿔줘야한다.
- 그 다음 flow 명령어가 있는데, 이 flow 명령어는 data generator에게
- 증강시킨 이미지들의 batch 들을 생성하게 한다.
- 위 단계에서 증강시킨 이미지들을 시각적으로 보여줬던것은 이 batch 중 하나에서 뽑아낸 이미지들이다.
- training set에 label을 넘겨줄 때, batch 상에서 원하는 수 만큼의 이미지를 함께 넘겨주게 된다.
- 마지막으로, steps_per_epoch는 하나의 epoch 마다 인코딩할 step의 수를 변수로 지정하여 넘겨주게 된다.
- 이 값은 일반적으로 set에서의 고유 샘플(unique sample)들의 수를 batch의 크기로 나눈 값으로 설정된다.
- 여기서는 x_train.shape[0]을 x_train 데이터셋에서의 고유 샘플로 처리하고 있는데,
- 이렇게 값을 넘겨주게되면 모델이 각 epoch마다 x_train.shape[0] 의 증강된 이미지를 확인하게 된다.
- 최종적으로 코드를 돌려서 모델을 학습시키면 된다.
- 다음 최상의 유효성 정확도를 뽑아내는 가중치를 로드해주고,
- 테스트셋에 모델을 돌려 정확도를 뽑아내본다. 68퍼센트 정도의 정확도가 나옴.
- 이 결과는 이전에 증강시킨 이미지를 적용하지 않았을 때 보다 더 높은 정확도를 보이고 있다.
- 실제로 현실 데이터를 사용하여 모델을 학습시킬때 이 이미지 증강(Image Augmentation)은
- 매우 광범위하게 사용되므로 반드시 사용할 줄 알아야함.
- kaggle 데이터셋을 이용하여 이미지 증강 사용에 따른 퍼포먼스 관련 글
- keras의 ImageDataGenerator 클래스