본문 바로가기
archive.tar

[Keras] Image Data Generator 사용 후 추론 성능 차이

by 냉동만두 2017. 4. 14.

개요 - Keras Image Data Generator 사용 하기


Inception-v3, Resnet, VGG ,..... 을 이용하여 이미지 학습을 할 때, 많은 수의 이미지가 필요하다. 인터넷에 있는 데이터셋 (ImageNet, Flowers 데이터)을 활용 하면 되지만 자신의 이미지를 학습할 때는 이미지 데이터셋이 많이 부족하다. Tensorflow 또는 Keras 문서를 읽어보면 부족한 데이터는 이미지의 변형을 주어서 이미지의 수를 늘리라고 한다.

처음에는 XnConvert 등 이미지 일괄처리 프로그램을 사용 했지만, 이미지에 한번 변형을 줄 때마다 직접 설정을 하고 실행하기 때문에 귀찮다. 그리고 만들 수 있는 변형 이미지도 제한적일 수 밖에 없다. 그래서 Keras 에서 제공하는 이미지 전처리 기능중에 ' ImageDataGenerator '를 사용해서 스크립트를 만들었다. (멀티 프로세스를 사용한다) (멀티 코어 지원 !!)

간단한 환경 변수 세팅을 하고 실행하면 정해진 원본 데이터를 읽어 새로운 증가된 데이터세트를 만들어 준다.

이미지 변형 내용은 Keras Doc 참고 !  https://keras.io/preprocessing/image/

자동차를 구분하는 모델을 만들어 비교 했는데,

처음은 단순한 원본 데이터셋 학습(레이블당 90~100개), 두번째는 스크립트를 활용하여 증가된 데이터셋(레이블 1000장)

미리 훈련된 Inception - v3 모델을 이용하여 Transfer Learning 스크립트로 학습 시켰다

학습 스크립트 주소 : https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/image_retraining/retrain.py



데이터셋 늘리기


원본 데이터 세트는 3가지 종류의 이미지(3 labels)를 가지고 있다.

새로운 이미지를 생성하는 프로세스가 코어 갯수 만큼 생성되어 작동한다.

처음 만들때는 단순히 1코어만 사용했는데 ,,,, 뿌듯하다 ㅎㅎ

이 작업을 GPU가 하면 정말 좋겠지만,,, 지금은 능력 밖이다,,, ㅜㅜ

GPU를 사용하려면 tensorflw로 스크립트를 만들어야 할 것 같다


$ python keras_image_gen_4.py
Using TensorFlow backend.

Looking for folder name ...
ioniq
avante
spark
... Completed ...
- ioniq start ...
- avante start ...
Found 91 images belonging to 1 classes.
Found 94 images belonging to 1 classes.
- spark start ...
Found 90 images belonging to 1 classes.
-- ioniq end ...
-- avante end ...
-- spark end ...

<스크립트 실행 터미널 (3개의 이미지 폴더를 찾고 각 코어별 프로세스가 실행되어 작동한다 )>


<멀티코어 활용 모습 (3개의 레이블 동시 작업)>


비교 결과


모델 1과 모델 2 공정한 비교는 아니지만 학습 데이터의 영향이 아주 크다.

예상대로 모델 2(증가된 학습 데이터)이 좋은 성능을 낸다.

학습에 사용한 대표 사진 : avante , ioniq , spark



비교 : 모델 1


label(class) : 3 (avante, ioniq, spark)

images : 278

step : 5560

batch : 50

epoch : 1000

2017-04-14 00:22:22.933371: Step 5559: Train accuracy = 100.0%
2017-04-14 00:22:22.933437: Step 5559: Cross entropy = 0.034212
2017-04-14 00:22:22.986889: Step 5559: Validation accuracy = 66.0% (N=100)
Final test accuracy = 78.3% (N=23)

<학습 결과>

$ python label_image.py ioinq.jpg

-- 중간 생략 --

avante (score = 0.69933)

ioniq (score = 0.24980)

spark (score = 0.05087)


$ python label_image.py avante.jpg

-- 중간 생략 --

spark (score = 0.61713)

avante (score = 0.25472)

ioniq (score = 0.12815)


<추론 결과 실패 >

Avante AD , Ioniq 구분하지 못한다. 현대의 패밀리룩 덕분에 비슷하게 생겼다. spark는 잘 구분한다




비교 : 모델 2 (데이터셋 증가)


label(class) : 3 (avante, ioniq, spark)

images : 3000

step : 30000

batch : 100

epoch : 100

2017-04-14 01:01:13.647142: Step 2999: Train accuracy = 97.0%
2017-04-14 01:01:13.647210: Step 2999: Cross entropy = 0.168814
2017-04-14 01:01:13.702478: Step 2999: Validation accuracy = 98.0% (N=100)
Final test accuracy = 91.7% (N=289)

<학습 결과>

  $ python label_image.py avante.jpg 

avante (score = 0.77520)

spark (score = 0.13505)

ioniq (score = 0.08975)


$ python label_image.py ioinq.jpg

ioniq (score = 0.60281)

avante (score = 0.36411)

spark (score = 0.03308)

<추론 결과 성공 >

모델 1보다 epoch는 줄었지만 학습 데이터가 10배 넘게 많아 결과가 비교적 좋음.

ioniq과 avante 대부분 구분한다. sqark 역시 잘 구분하지.


* 다음엔 스크립트에 대하여....