티스토리 뷰

Image Augmentation in Keras


- 이미지 분류를 위해 알고리즘을 설계할 때, 많은 수의 서로 상관없는 정보들을 다뤄야 함.

- 우리가 설계한 알고리즘이 실제로 이미지 안에 찾고자하는 object가 있는지 없는지를 판단하도록 만들어야 한다.

- 그 object의 크기나 기울어짐 정도 또는 전체 이미지 중 object가 오른편 끝인지와 같은 위치는 상관없이

- 해당 object를 정확하게 있는지 없는지를 판단해줘야 함.

- 이것은 다시말해 알고리즘이 이미지의 불변하는 표현(invariant representation)을 학습하는 것이다.

- object의 크기가 커지거나 작아짐에 따라 리턴하는 prediction값이 달라지면 안된다.

- 이를 scale invariance라 부른다.

- 마찬가지로 object의 각도에 따라 리턴하는 prediction값이 달라지면 안된다.

- 이를 rotation invariance라 부른다.

- 마찬가지로 object의 위치에 따라 리턴하는 prediction값이 달라지면 안된다.

- 이를 translation invariance라 부른다.

- CNN은 어느정도 translation invariance를 내장하고있다.



- max pooling 레이어가 어떻게 연산을 수행하는지를 떠올려보면 어째서 translation invariance를 내장하고 있는지 알 수 있다.

- 매 window내의 값 중에서 가장 큰 값을 취하기 때문에, 9를 예를들어 보면 상하좌우로 window의 범위가 움직이더라도
- 항상 그 window 범위 내의 가장 큰 값은 9임을 확인할 수 있다.
- 많은 수의 max pooling 레이어를 연속적으로 적용시키게 될 경우, 
- 콘볼루션 레이어를 따르는 각각의 object들은 이미지의 최상단, 최하단., 맨 좌측, 맨 우측 등 
- 어디에 위치하던 여전히 네트워크는 학습을 진행할 수 있다.






- 컴퓨터는 이미지를 픽셀단위로 이루어진 행렬로 받아들인다는 것을 앞서 다뤘었는데,

- 따라서 이미지에서의 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 클래스





댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함