tensorflow의 slim 예제에 대한 학습 및 평가 를 진행해 보겠습니다. 예제로는 MNIST, flowers, Cifar10, Imagenet 4가지를 제공하고 있습니다. 저는 채널이미지 학습을 위해서 폴더별로 이미지를 나누어서 저장하고 있다가 학습을 시킬 예정입니다. 그렇기 때문에 가장 유사한 방법으로 접근이 가능한 flowers 예제를 이용해 보겠습니다.
tensorflow의 slim 예제에 대한 학습 및 평가
flowers 예제를 실습해 보겠습니다. 우선 학습 및 평가를 하기 전에 어떠한 순서로 이루어지는 맥락을 한 번 짚고 넘어가보도록 하겠습니다.
- tensorflow 버전 업그레이드 및 slim 설치
- 원할한 작업을 위하여 tensorflow 0.12 버전을 추천합니다.
- 이미지 파일을 폴더(카테고리)별 분류
- flowers는 5가지 종류의 꽃을 분류할 예정입니다.
- 이미지 파일을 TFRecord 타입으로 변형
- tensorflow에서 학습에 사용하기 위한 데이터 형태로 치환하는 것입니다.
- 데이터 학습
- 데이터 평가
tensorflow 버전 업그레이드 및 slim 설치
2017년 새해를 맞이하여 전체 업그레이드 한 번 진행하겠습니다. 제가 사용하는 환경은 Ubuntu 16.04 버전이고, CPU 버전, GPU 버전(nvidia 1060 또는 1080×2)이 있습니다. 여기서는 CPU 기준으로 진행하겠습니다. 물론 GPU로 운용하시는게 정신 건강에 매우 좋습니다.
아래에 나오는 방법은 python 2.7 기준으로 기존에 설치한 tensorflow를 삭제하고 새로 0.12.1 버전으로 설치하는 방법입니다. python 3.5 버전은 pip3를 기준으로 진행하시면 됩니다. 텐서플로우를 설치하고 난 후, tensorflow model을 github에서 다운로드 합니다. 여러 모델이 있는데, 그 중에서 slim을 사용할 겁니다. 추후에 시간이 되면 im2txt를 다루는 방법도 알아보도록 하겠습니다. 참고로 slim에서 사용하는 inception_v3 모델의 경우, tensorflow 0.10에는 없고, 0.11부터 제공하기 때문에 하위 버전으로 돌릴 생각은 아예 접는게 좋습니다.
sudu apt-get update sudu apt-get upgrade reboot sudo pip install --upgrade pip sudo pip uninstall tensorflow export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.1-cp27-none-linux_x86_64.whl sudo pip install --upgrade $TF_BINARY_URL git clone https://github.com/tensorflow/models.git
따라서, tensorflow의 slim 예제에 대한 학습 및 평가 를 위해서는 tensorflow 0.12.1을 설치하는게 좋고 설치 결과는 다음과 같습니다.
Collecting tensorflow==0.12.1 from https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.1-cp27-none-linux_x86_64.whl Downloading https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.1-cp27-none-linux_x86_64.whl (43.1MB) 100% |████████████████████████████████| 43.1MB 18kB/s Requirement already up-to-date: mock>=2.0.0 in /usr/local/lib/python2.7/dist-packages (from tensorflow==0.12.1) Collecting numpy>=1.11.0 (from tensorflow==0.12.1) Downloading numpy-1.11.3-cp27-cp27mu-manylinux1_x86_64.whl (15.4MB) 100% |████████████████████████████████| 15.4MB 29kB/s Collecting protobuf>=3.1.0 (from tensorflow==0.12.1) Downloading protobuf-3.1.0.post1-py2.py3-none-any.whl (347kB) 100% |████████████████████████████████| 348kB 104kB/s Requirement already up-to-date: wheel in /usr/lib/python2.7/dist-packages (from tensorflow==0.12.1) Requirement already up-to-date: six>=1.10.0 in /usr/local/lib/python2.7/dist-packages (from tensorflow==0.12.1) Requirement already up-to-date: funcsigs>=1; python_version < "3.3" in /usr/local/lib/python2.7/dist-packages (from mock>=2.0.0->tensorflow==0.12.1) Requirement already up-to-date: pbr>=0.11 in /usr/local/lib/python2.7/dist-packages (from mock>=2.0.0->tensorflow==0.12.1) Collecting setuptools (from protobuf>=3.1.0->tensorflow==0.12.1) Downloading setuptools-32.3.1-py2.py3-none-any.whl (479kB) 100% |████████████████████████████████| 481kB 71kB/s Installing collected packages: numpy, setuptools, protobuf, tensorflow Found existing installation: numpy 1.11.0 Uninstalling numpy-1.11.0: Successfully uninstalled numpy-1.11.0 Found existing installation: setuptools 20.7.0 Uninstalling setuptools-20.7.0: Successfully uninstalled setuptools-20.7.0 Found existing installation: protobuf 3.1.0 Uninstalling protobuf-3.1.0: Successfully uninstalled protobuf-3.1.0 Successfully installed numpy-1.11.3 protobuf-3.1.0.post1 setuptools-32.3.1 tensorflow-0.12.1
이미지 파일을 폴더(카테고리)별 분류
slim 모델에서는 flowers 예제를 이용하여 폴더별로 구분되어져 있는 이미지를 학습하고 평가할 수 있습니다. tensorflow model의 slim은 구글신님이 직접 하사하신 선물로 학습 모델을 이름만으로 쉽게 바꿀 수 있고, 학습에 필요한 이미지를 전처리하는 방법, 학습하는 방법, 평가하는 방법이 간단합니다. 그 중에서 이미지를 폴더별로 모아놓고 이를 학습에 사용할 학습 데이터 형태인 TFRecord로 만드는 방법이 특히나 간단합니다. 먼저 이미지를 다운로드 받고, 해당 이미지를 변환합니다. 그래서 실행 파일명도 download_and_convert_data.py 입니다.
먼저 2가지 폴더가 필요합니다. 해당 프로젝트에 대한 TFRecord를 저장하기 위한 폴더(dataset)가 필요합니다. 그리고 학습 결과를 저장할 폴더(train)이 필요합니다. 저는 아래와 같이 제 임의로 두 개의 폴더를 만들었습니다. 그리고 학습 데이터를 받아서 이미지를 학습데이터로 변환하도록 했습니다.
mkdir ~/project/slim mkdir ~/project/slim/flowers mkdir ~/project/slim/flowers/dataset mkdir ~/project/slim/flowers/train DATA_DIR=~/project/slim/flowers/dataset TRAIN_DIR=~/project/slim/flowers/train python download_and_convert_data.py --dataset_name=flowers --dataset_dir=${DATA_DIR}
이미지 파일을 TFRecord 타입으로 변환
다운로드하면 다음과 같이 자동으로 변환이 되는 것을 확인할 수 있습니다. 그리고 학습 데이터가 잘 변환이 되었는지 확인해 봅시다. tensorflow의 slim 예제에 대한 학습 및 평가 에 있어서 첫 발을 내딛은 겁니다.
>> Downloading flower_photos.tgz 100.0% Successfully downloaded flower_photos.tgz 228813984 bytes. >> Converting image 3320/3320 shard 4 >> Converting image 350/350 shard 4 Finished converting the Flowers dataset! $ ls -al ${DATA_DIR} 합계 227572 drwxrwxr-x 2 studydev studydev 4096 1월 5 01:05 . drwxrwxr-x 4 studydev studydev 4096 1월 5 01:02 .. -rw-rw-r-- 1 studydev studydev 40492288 1월 5 01:05 flowers_train_00000-of-00005.tfrecord -rw-rw-r-- 1 studydev studydev 40949234 1월 5 01:05 flowers_train_00001-of-00005.tfrecord -rw-rw-r-- 1 studydev studydev 43157253 1월 5 01:05 flowers_train_00002-of-00005.tfrecord -rw-rw-r-- 1 studydev studydev 45555808 1월 5 01:05 flowers_train_00003-of-00005.tfrecord -rw-rw-r-- 1 studydev studydev 41843039 1월 5 01:05 flowers_train_00004-of-00005.tfrecord -rw-rw-r-- 1 studydev studydev 4028925 1월 5 01:05 flowers_validation_00000-of-00005.tfrecord -rw-rw-r-- 1 studydev studydev 4140411 1월 5 01:05 flowers_validation_00001-of-00005.tfrecord -rw-rw-r-- 1 studydev studydev 4591127 1월 5 01:05 flowers_validation_00002-of-00005.tfrecord -rw-rw-r-- 1 studydev studydev 4443587 1월 5 01:05 flowers_validation_00003-of-00005.tfrecord -rw-rw-r-- 1 studydev studydev 3803950 1월 5 01:05 flowers_validation_00004-of-00005.tfrecord -rw-rw-r-- 1 studydev studydev 50 1월 5 01:05 labels.txt
데이터 학습
이제 데이터를 학습시켜 봅시다. 다음과 같이 학습을 진행합니다. 환경에 따라 다르지만 어쨌든 시간이 많이 필요합니다. step에 따라서 학습 결과가 달라집니다. 이 부분은 CPU 버전에서는 매우 느린 관계로 GPU 환경에서 돌려보시기를 권합니다. 참고로 GPU 메모리가 부족한 경우, batch_size를 조절해서 진행하시는 것도 방법입니다. 1060 1개 기준으로 스텝당 약 0.9초, 1080 x 2 기준으로 약 0.57초 정도 걸리는것 같습니다.(inception_v3 기준) 이 부부은 세팅에 따라서 차이가 발생할 수 있습니다.
python train_image_classifier.py --train_dir=${TRAIN_DIR} --dataset_dir=${DATA_DIR} --dataset_name=flowers --dataset_split_name=train --model_name=lenet
학습 시간에 스트레스가 많은 분들은 일단 model_name을 inception_v3가 아닌 lenet 으로 돌리는 것을 권장합니다.(위 이미지) 결과는 상대적으로 나쁘지만 좀 더 빠르게 학습되고 결과도 빠르게 뽑아 볼 수 있습니다. 기타로 직접 모델을 다운로드 받아서 해당 모델을 연결할 수 있는 방법도 문서에 제공되고 있습니다.
데이터 평가
데이터 평가는 아래와 같이 진행합니다.
python eval_image_classifier.py --alsologtostderr --checkpoint_path=${TRAIN_DIR} --dataset_dir=${DATA_DIR} --dataset_name=flowers --dataset_split_name=validation --model_name=lenet
평가된 데이터는 정확도가 나오고, Recall@5가 나오는데 이 부분은 추론 결과가 랭킹 5안에 들어있을 확률을 의미합니다. 1이라는 값이 나오는 이유는 100%라는 의미입니다.
Flowers는 총 5개 카테고리이기 때문에 결과 역시 5가지로 밖에 나오기 않습니다. 그렇기 때문에 여기서는 100%를 의미하는 1이라는 값이 나옵니다.
이 값이 변화 되려면 좀 더 많은 카테고리가 들어와야 하고, 관련 예제는 채널 이미지 slim 분류 방법을 통해서 확인하실 수 있습니다.
학습 횟수에 따라서 그 결과가 달라지므로 여러번 학습해서 비교해 보는 것을 추천합니다. 다음의 경우는 CPU를 이용하여 lenet으로 2750 step 돌린 결과입니다.
INFO:tensorflow:Scale of 0 disables regularizer. INFO:tensorflow:Starting evaluation at 2017-01-04-16:58:22 INFO:tensorflow:Executing eval ops INFO:tensorflow:Executing eval_op 1/4 INFO:tensorflow:Executing eval_op 2/4 INFO:tensorflow:Executing eval_op 3/4 INFO:tensorflow:Executing eval_op 4/4 INFO:tensorflow:Executing summary op I tensorflow/core/kernels/logging_ops.cc:79] eval/Recall@5[1] I tensorflow/core/kernels/logging_ops.cc:79] eval/Accuracy[0.4475] INFO:tensorflow:Finished evaluation at 2017-01-04-16:58:25
학습 및 평가 요약
tensorflow의 slim 예제에 대한 학습 및 평가 를 진행해 봤습니다. slim을 이용하면 손쉽게 CNN 학습 및 평가를 할 수 있습니다. 다음 시간에는 분류된 채널 이미지를 학습시켜 보고 결과를 분석해 보겠습니다. 그리고, 패턴이 명확한 부분만 크롭하여 학습해보고(추가 이미지 전처리) 비교해 보도록 하겠습니다. 이것을 하는 목적은 학습 데이터의 중요성과 전처리가 어디까지 진행되면 어떤 결과 변화가 있을지 비교 확인하기 위함입니다. (추가적인 이미지 전처리가 필요한지 아니면, 안 하고 학습 횟수를 통해서 극복하면 되는지 그런게 궁금해서 시작되는 겁니다.)