소개
이미지를 학습시켜 원하는 부류의 이미지가 나오도록 평가한다.
아래와 같이 이미지를 넣으면 학습 결과를 토대로 사전에 학습했던 데이터를 구분하여 준다.
소스 다운로드 - GitHub
원본 URL : https://github.com/daiz713/tfPhotoClassifier
한글 URL : https://github.com/studydev/tfPhotoClassifier
- 브랜치 유의해서 다운 받으시면 됩니다.
git clone -b tf0.10.0rc https://github.com/studydev/tfPhotoClassifier.git
- 9월 9일 현재 Fork만 되어 있는 상태이며 소스만 업데이트는 되어 있습니다.
- 9월 21일 코멘트 및 번역 완료 예정입니다.
- 해당 페이지의 설명이 일본어로 되어 있고, 다소 설명이 빠진듯한 부분이 있어서 추가하여 정리할 예정입니다.
- 원본 소스코드가 Python 2.7에 맞추어 있기 때문에, 해당 소스를 Python 3.5 환경에서도 수행가능하도록 수정된 소스로 제공됩니다.
샘플 구성 - API 제공
네이버 쇼핑 이미지 수집 방법
네이버 쇼핑에 보면 다음과 같은 형태로 URL 접근하면 카테고리별 상품 조회가 가능합니다.
# $i : 페이지 넘버 # $paging_size : 한 번에 보여질 개수 (20 40 60 80) # $cat_no : 검색할 카테고리 (네이버에서 클릭하면 주소 URL에서 확인 가능) $url = "http://shopping.naver.com/search/category.nhn?pagingIndex=".$i."&pagingSize=".$paging_size."&productSet=department&viewType=list&sort=rel&searchBy=none&cat_id=".$cat_no."&frm=NVSHDPT&sps=N";
네이버 이미지 카테고리 분류
아래와 같은 조건에 맞추어 분류하기로 합니다.
10 0,50000808,스커트 1,50000804,블라우스/셔츠 2,50000806,가디건 3,50000813,코트 4,50000815,재킷 5,50000809,청바지 6,50000805,니트/스웨터 7,50000807,원피스 8,50000810,바지 9,50000803,티셔츠
네이버 이미지 JSON
10개 카테고리, 각 1만장의 128x128로 리사이즈된 이미지 정보가 포함된 JSON 파일을 다운로드 받습니다. 해당 API는 별도 제공하지 않습니다.
참고 할 수 있도록 첨부 파일을 올려 둡니다. test.json (10개 class에 각 20개씩 32x32 이미지)
※ 주의 : 위 이미지는 CIFAR-10처럼 전처리된 이미지를 사용하는 것이 아니므로 높은 정확도로 학습을 하거나 기대할 수 없으므로 참고하세요.
학습전 JSON 처리
이미지 Size 확인
네이버에 resize한 이미지는 128이기 때문에 해당 사이즈 조절을 해야 합니다.
size = { # feed-cropped-image size # 32 x 32 'width': 128, 'height': 128, # inside 24 x 24 in 32 x 32 'input_width': 24, 'input_height': 24, # RGB 'depth': 3, # ラベルの桁数 'label': 1 }
이미지 JSON 라벨 분류
총 6만개로 만들어진 json 파일(약 288MB)을 class 별로 json 파일을 학습용과 평가용으로 구분해 줍니다.
각 클래스별로 6,000여개의 이미지가 있다고 나올텐데, 1,000개씩을 평가용으로 지정해 줍니다.
python3 gen_labeled_jsons.py --theme=naver128 I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcublas.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcudnn.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcufft.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcuda.so.1 locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcurand.so locally Label: 0 (['0', '50000808']), total_examples_nums=6000, eval_nums?... 1000 Saved! workspace/naver128/photocropper-0.json Saved! workspace/naver128/eval-photocropper-0.json Label: 1 (['1', '50000804']), total_examples_nums=6000, eval_nums?... 1000 Saved! workspace/naver128/photocropper-1.json Saved! workspace/naver128/eval-photocropper-1.json Label: 2 (['2', '50000806']), total_examples_nums=6000, eval_nums?... 1000 Saved! workspace/naver128/photocropper-2.json Saved! workspace/naver128/eval-photocropper-2.json Label: 3 (['3', '50000813']), total_examples_nums=6000, eval_nums?... 1000 Saved! workspace/naver128/photocropper-3.json Saved! workspace/naver128/eval-photocropper-3.json Label: 4 (['4', '50000815']), total_examples_nums=6000, eval_nums?... 1000 Saved! workspace/naver128/photocropper-4.json Saved! workspace/naver128/eval-photocropper-4.json Label: 5 (['5', '50000809']), total_examples_nums=6000, eval_nums?... 1000 Saved! workspace/naver128/photocropper-5.json Saved! workspace/naver128/eval-photocropper-5.json Label: 6 (['6', '50000805']), total_examples_nums=6000, eval_nums?... 1000 Saved! workspace/naver128/photocropper-6.json Saved! workspace/naver128/eval-photocropper-6.json Label: 7 (['7', '50000807']), total_examples_nums=6000, eval_nums?... 1000 Saved! workspace/naver128/photocropper-7.json Saved! workspace/naver128/eval-photocropper-7.json Label: 8 (['8', '50000810']), total_examples_nums=6000, eval_nums?... 1000 Saved! workspace/naver128/photocropper-8.json Saved! workspace/naver128/eval-photocropper-8.json Label: 9 (['9', '50000803']), total_examples_nums=6000, eval_nums?... 1000 Saved! workspace/naver128/photocropper-9.json Saved! workspace/naver128/eval-photocropper-9.json
분류된 json 파일의 정보를 기반으로 CIFAR10에서 인식되는 형태의 데이터로 변환합니다.
python3 gen_tfrecords.py --theme=naver128 I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcublas.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcudnn.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcufft.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcuda.so.1 locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcurand.so locally label: data0.tfrecords, len=5000 label: data1.tfrecords, len=5000 label: data2.tfrecords, len=5000 label: data3.tfrecords, len=5000 label: data4.tfrecords, len=5000 label: data5.tfrecords, len=5000 label: data6.tfrecords, len=5000 label: data7.tfrecords, len=5000 label: data8.tfrecords, len=5000 label: data9.tfrecords, len=5000 label: eval-data0.tfrecords, len=1000 label: eval-data1.tfrecords, len=1000 label: eval-data2.tfrecords, len=1000 label: eval-data3.tfrecords, len=1000 label: eval-data4.tfrecords, len=1000 label: eval-data5.tfrecords, len=1000 label: eval-data6.tfrecords, len=1000 label: eval-data7.tfrecords, len=1000 label: eval-data8.tfrecords, len=1000 label: eval-data9.tfrecords, len=1000
학습
학습은 아래와 같이 진행합니다.
python3 train.py --theme=naver128
NVIDIA GTX 1060 6GB 기준으로 약 8시간 45분 걸린 것으로 보입니다. (CPU로 하면 매우 느릴 수 있으므로, 샘플 이미지 크기를 줄여야 할 것 같습니다.)
평가
총괄 평가
71%의 정확도를 보여줍니다. 테스트 1만개 샘플 중 7100개가 맞다는 의미입니다.
simplexi@ai-tensorflow:/data/project/tfPhotoClassifier$ python3 eval.py --theme=naver128 I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcublas.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcudnn.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcufft.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcuda.so.1 locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcurand.so locally I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero I tensorflow/core/common_runtime/gpu/gpu_init.cc:102] Found device 0 with properties: name: GeForce GTX 1060 6GB major: 6 minor: 1 memoryClockRate (GHz) 1.7085 pciBusID 0000:01:00.0 Total memory: 5.93GiB Free memory: 5.51GiB I tensorflow/core/common_runtime/gpu/gpu_init.cc:126] DMA: 0 I tensorflow/core/common_runtime/gpu/gpu_init.cc:136] 0: Y I tensorflow/core/common_runtime/gpu/gpu_device.cc:838] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:01:00.0) 2016-09-09 17:11:28.707077: precision @ 1 = 0.710
개별 평가 방법
simplexi@ai-tensorflow:/data/project/tfPhotoClassifier$ python3 play.py --theme=naver128 --jpg=/var/www/html/static/sample_image/naver/4/10090758978.jpg I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcublas.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcudnn.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcufft.so locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcuda.so.1 locally I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcurand.so locally I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero I tensorflow/core/common_runtime/gpu/gpu_init.cc:102] Found device 0 with properties: name: GeForce GTX 1060 6GB major: 6 minor: 1 memoryClockRate (GHz) 1.7085 pciBusID 0000:01:00.0 Total memory: 5.93GiB Free memory: 5.51GiB I tensorflow/core/common_runtime/gpu/gpu_init.cc:126] DMA: 0 I tensorflow/core/common_runtime/gpu/gpu_init.cc:136] 0: Y I tensorflow/core/common_runtime/gpu/gpu_device.cc:838] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:01:00.0) I tensorflow/core/common_runtime/gpu/gpu_device.cc:838] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:01:00.0) I tensorflow/core/common_runtime/gpu/gpu_device.cc:838] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:01:00.0) { "원피스": "0.0000000220", "바지": "0.0000000176", "니트/스웨터": "0.0000000157", "티셔츠": "0.0000000026", "가디건": "0.0000084750", "블라우스/셔츠": "0.0000002901", "청바지": "0.0000000919", "코트": "0.9961292744", "스커트": "0.0000000003", "재킷": "0.0038618098" } 코트
외부에서 이용하기
서버를 구동
서버를 구동시키면 Flask를 이용하여 App 서버를 구동시킵니다.
아래 해당 소스 코드에서 외부 접속을 허용하기 위하여 마지막 라인에서 app.run(host='0.0.0.0', port=FLAGS.port) 문구로 변경하여 실행합니다.
python3 palette_server.py --theme=naver128
이미지가 어떤지 판단 요청
환경 설치
크롬에 tfPhotoPalette를 설치해야합니다.
https://chrome.google.com/webstore/detail/tfphotopalette/gcpfanfkkjpolcdicokfjphmdnelhbbb?hl=ko
기본적으로 tfPhotoPalette는 localhost로 Test API(Play) 기능을 수행하도록 되어 있습니다.
따라서, 그 부분을 수정하여야 합니다. (Chrome - Extension이 설치된 폴더에서 tfPhotoPalette를 검색하여 해당 소스 수정 조치)
찾기 어렵다면, play.index.es5.js 이 파일을 검색하면 됩니다.
이용하기
- 이미지 URL 주소를 입력하여 Load 한다.
- 적절히 크롭을 한다.
- 우측 하단 Play 버튼을 누른다.
- 작은 창이 팝업되면, 원본 / 줄인이미지 / 크롭 이미지에 대해서 어떤 결과가 나오는지 확인한다.