본문 바로가기
archive.tar

[TensorFlow] TFrecord 원하는 이미지 학습을 위한 데이터셋 만들기

by 냉동만두 2016. 11. 17.
 

개요


준비된 이미지들을 tfrecord로 변환 한다

자신의 이미지(jpg)를 텐서플로우가 학습할 수 있는 데이터로 변환하여(전처리 preprocess)

변환된 파일(TFRecord)로 기존 학습 모델에 가중치 조정을 시키거나(Fine-Tune a Pre-Trained Model)

자신만의 새로운 학습 모델을 만들 수 있도록 전처리된 데이터셋을 만든다.

원하는 이미지를 판독 할 때는 가능하지만 학습 할 때에는 이미지를 바로 인식하여 학습 하지 못한다.

그래서 텐서플로우가 인식 할 수 있도록 변환 하는데, 이미지와 이미지의 레이블을 구조화 하여 저장 해야 한다.


예를 들어,

고양이 사진을 학습 시키려고 서로 다른 고양이 사진(jpg)을 1000장, 평가확인 할 사진 400장을 준비했다고 하자.

(학습 시킬 이미지(train), 평가확인 할 이미지(validation) 두개의 이미지 세트를 준비해야 한다)

그 고양이 사진은 'cat' 이라는 폴더에 저장했고, 파일 이름은 001.jpg, 002.jpg, 003.jpg..... 이렇게 되어 있다고 하자.

그러면 학습할 때 001.jpg, 002, 003.jpg.... 이미지는 'cat' 이라고 학습하는데, 폴더 이름이 학습할 이미지의 레이블이 된다

평가확인 할 이미지 도 같은 방식으로 해주면 된다

예)

train/cat/~~~.jpg

train/dog/~~~.jpg

train/pig/~~~.jpg

validation/cat/~~~.jpg

validation/dog/~~~.jpg

validation/pig/~~~.jpg

여기서 ~~~.jpg 이미지 파일의 이름은 중요하지 않다. 위의 예시처럼 순차적이어도, 서로 전혀 관련 없는 이름이어도 된다.

중요한건 그 이미지들이 속해있는 폴더의 이름이다. 폴더 이름이 'cat' 이고 파일 이름이 'dog.jpg' 라도 cat 으로 학습된다

이번 테스트는 ImageNet 에서 동물 사진을 내려 받아 했다. train 이미지 900~1000개, validation 이미지 400~500 정도.


이미지(JPG) 준비하기


TRAIN_DIR 폴더 안에 학습 시킬 구조화된 폴더와 이미지


VALIDATION_DIR 폴더 안에 평가확인 할 구조화된 폴더와 이미지

원하는 폴더 이름(레이블) 그 안에 이름(레이블)에 맞는 이미지 파일을 저장한다.


변환된 파일들이 저장될 폴더 생성 TFR_DIR



 학습할 이미지의 레이블 설정


구조화된 폴더 안에 이미지들을 저장 하였다면, 이제 레이블을 정리한 파일을 만들어야 한다.

원하는 곳에 LABLES.txt를 만들어서 이미지들의 레이블 적어준다. (파일 이름 자유)

위에서 만든 폴더 이름(레이블)과 똑같이 순서대로 적어주고 저장한다.

* 레이블은 abcd 순으로 정렬하여 적어준다.



inception 최상위 폴더로 이동 후 터미널 열기


$ cd $HOME/inception


환경 변수(경로) 설정


아까 만든 폴더들과 레이블 파일의 경로를 지정한다. 지정할 변수와 경로에 오타가 없고 정확히 기억 해야 한다

학습 이미지, 평가확인 이미지, 학습된 모델 데이터, 레이블 파일 의 경로 설정해준다

(레이블 설정은 맨 뒤에 슬래시 / 가 없어야함 ! LABELS 라는 파일을 지정해주기 때문)

hwang@linux:~$ TRAIN_DIR=$HOME/work/test/TRAIN_DIR/

hwang@linux:~$ VALIDATION_DIR=$HOME/work/test/VALIDATION_DIR/

hwang@linux:~$ OUTPUT_DIRECTORY=$HOME/work/test/TFR_DIR/

hwang@linux:~$ LABELS_FILE=$HOME/work/test/LABELS


bazel을 통해 이미지 데이터 스크립트 빌드


$ bazel build inception/build_image_data

hwang@linux:~/inception$ bazel build inception/build_image_data
.............................
INFO: Found 1 target...
Target //inception:build_image_data up-to-date:
  bazel-bin/inception/build_image_data
INFO: Elapsed time: 3.375s, Critical Path: 0.11s

아래의 터미널 내용 중 반복 출력은 편집 했다

중간에 굵은 글씨를 보면 몇개의 이미지와 레이블로 학습하는지 확인이 가능하다

(변환된 train 이미지를 128개로, validation 데이터를 24개로 출력, 스레드 8개 사용)


$ bazel-bin/inception/build_image_data   --train_directory="${TRAIN_DIR}"   --validation_directory="${VALIDATION_DIR}"   --output_directory="${OUTPUT_DIRECTORY}"   --labels_file="${LABELS_FILE}"   --train_shards=128   --validation_shards=24   --num_threads=8


hwang@linux:~/inception$ bazel-bin/inception/build_image_data   --train_directory="${TRAIN_DIR}"   --validation_directory="${VALIDATION_DIR}"   --output_directory="${OUTPUT_DIRECTORY}"   --labels_file="${LABELS_FILE}"   --train_shards=128   --validation_shards=24   --num_threads=8
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
Saving results to /home/hwang/work/test/TFR_DIR/
Determining list of input files and labels from /home/hwang/work/test/VALIDATION_DIR
/.
Found 6769 JPEG files across 13 labels inside /home/hwang/work/test/VALIDATION_DIR/.
Launching 8 threads for spacings: [[0, 846], [846, 1692], [1692, 2538], [2538, 3384], [3384, 4230], [4230, 5076], [5076, 5922], [5922, 6769]]
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] 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_device.cc:944] Found device 0 with properties:
name: GeForce GTX 960
major: 5 minor: 2 memoryClockRate (GHz) 1.266
pciBusID 0000:01:00.0
Total memory: 1.95GiB
Free memory: 1.74GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:965] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] 0:   Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1034] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 960, pci bus id: 0000:01:00.0)
2016-11-17 01:47:01.182276 [thread 6]: Wrote 282 images to /home/hwang/work/test/TFR_DIR/validation-00018-of-00024
2016-11-17 01:47:01.746832 [thread 5]: Wrote 282 images to /home/hwang/work/test/TFR_DIR/validation-00015-of-00024
2016-11-17 01:47:02.420616 [thread 7]: Wrote 282 images to /home/hwang/work/test/TFR_DIR/validation-00021-of-00024
2016-11-17 01:47:02.742680 [thread 0]: Wrote 282 images to /home/hwang/work/test/TFR_DIR/validation-00000-of-00024
2016-11-17 01:47:02.955107 [thread 1]: Wrote 282 images to /home/hwang/work/test/TFR_DIR/validation-00003-of-00024
2016-11-17 01:47:03.049449 [thread 2]: Wrote 282 images to /home/hwang/work/test/TFR_DIR/validation-00006-of-00024
2016-11-17 01:47:03.459112 [thread 3]: Wrote 282 images to /home/hwang/work/test/TFR_DIR/validation-00009-of-00024
2016-11-17 01:47:05.253235 [thread 4]: Wrote 282 images to /home/hwang/work/test/TFR_DIR/validation-00012-of-00024
2016-11-17 01:47:16.810923 [thread 5]: Wrote 282 images to /home/hwang/work/test/TFR_DIR/validation-00016-of-00024

~~~~~~~편집

Found 13556 JPEG files across 13 labels inside /home/hwang/work/test/TRAIN_DIR/.
Launching 8 threads for spacings: [[0, 1694], [1694, 3389], [3389, 5083], [5083, 6778], [6778, 8472], [8472, 10167], [10167, 11861], [11861, 13556]]
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1034] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 960, pci bus id: 0000:01:00.0)
2016-11-17 01:47:47.655453 [thread 5]: Wrote 105 images to /home/hwang/work/test/TFR_DIR/train-00080-of-00128
2016-11-17 01:47:48.081704 [thread 2]: Wrote 105 images to /home/hwang/work/test/TFR_DIR/train-00032-of-00128
2016-11-17 01:47:48.253457 [thread 4]: Wrote 105 images to /home/hwang/work/test/TFR_DIR/train-00064-of-00128
2016-11-17 01:47:48.503088 [thread 6]: Wrote 105 images to /home/hwang/work/test/TFR_DIR/train-00096-of-00128
2016-11-17 01:47:48.599121 [thread 3]: Wrote 105 images to /home/hwang/work/test/TFR_DIR/train-00048-of-00128
2016-11-17 01:47:49.098166 [thread 0]: Wrote 105 images to /home/hwang/work/test/TFR_DIR/train-00000-of-00128
2016-11-17 01:47:51.814771 [thread 7]: Wrote 105 images to /home/hwang/work/test/TFR_DIR/train-00112-of-00128
2016-11-17 01:47:51.847744 [thread 1]: Wrote 105 images to /home/hwang/work/test/TFR_DIR/train-00016-of-00128

~~~~~~~~~~~~~~~~편집

2016-11-17 01:49:36.744997: Finished writing all 13556 images in data set.


변환된 데이터 확인하기


cd $HOME/work/test/TFR_DIR

아까 변환된 파일 출력 경로에 가보면 변환된 파일들이 있다.

학습된 모델 체크포인트를 튜닝 하거나, 새롭게 학습 모델을 만들 수 있다. 끝~