소개


이미지를 학습시켜 원하는 부류의 이미지가 나오도록 평가한다.

아래와 같이 이미지를 넣으면 학습 결과를 토대로 사전에 학습했던 데이터를 구분하여 준다.

 

 

소스 다운로드 - 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 접근하면 카테고리별 상품 조회가 가능합니다.

PHP 네이버 이미지 수집용 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";

네이버 이미지 카테고리 분류

아래와 같은 조건에 맞추어 분류하기로 합니다.

/workspace/naver128/cifar128.label
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이기 때문에 해당 사이즈 조절을 해야 합니다.

common.py
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

개별 평가 방법

1개 평가
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 이 파일을 검색하면 됩니다.

이용하기

  1. 이미지 URL 주소를 입력하여 Load 한다.
  2. 적절히 크롭을 한다.
  3. 우측 하단 Play 버튼을 누른다.
  4. 작은 창이 팝업되면, 원본 / 줄인이미지 / 크롭 이미지에 대해서 어떤 결과가 나오는지 확인한다.
  • 레이블 없음