Google Cloud Engine 사용기-faster_rcnn_resnet101


▣ 가장 잘 설명된 아래 구글 공식 사이트를 참조해서 사용해보자.
https://cloud.google.com/blog/big-data/2017/06/training-an-object-detector-using-cloud-machine-learning-engine


자 내가 하고 싶은 것은 아래와 같이 detection&classification이다.


▣ 전처리 작업.
training을 하기 위한 전처리 작업들은 위 사이트에 자세히 소개되어 있기 때문에 따라하면 된다.




▣ 학습

아래와 같은 명령어를 치면 학습이 시작된다.
gcloud ml-engine jobs submit training `whoami`_object_detection_`date +%s` \
    --job-dir=${YOUR_GCS_BUCKET}/train \
    --packages dist/object_detection-0.1.tar.gz,slim/dist/slim-0.1.tar.gz \
    --module-name object_detection.train \
    --region us-central1 \
    --config object_detection/samples/cloud/cloud.yml \
    -- \
    --train_dir=${YOUR_GCS_BUCKET}/train \
    --pipeline_config_path=${YOUR_GCS_BUCKET}/data/faster_rcnn_resnet101_pets.config
  • 여기서 `whoami`_object_detection_`date +%s` 는 내 ID가 포함된 JOB 이름이다.
  • config는 GPU작업을 할 때 사용되는 YAML 파일이다. 아래와 같이 몇 개의 GPU를 쓸지 어떤 GPU를  쓸지를 결정 할 수 있다.
  • train_dir은 training checkpoints 와 events 등이 저장될 장소이다.
trainingInput:
runtimeVersion: "1.0"
scaleTier: CUSTOM
masterType: standard_gpu
workerCount: 5
workerType: standard_gpu
parameterServerCount: 3
parameterServerType: standard





  • Tensorboard에서도 확인 가능하다.
  • pipeline_config_path 에는 내가 학습에 사용할 설정값들이 저장된다.
    • num_classes: 37
    • min_dimension: 600
    • max_dimension: 1024
    • fine_tune_checkpoint: "gs://tensorflow-face-pose-ml/data/model.ckpt"
    • input_path: "gs://tensorflow-face-pose-ml/data/pet_train.record"
    • label_map_path: "gs://tensorflow-face-pose-ml/data/pet_label_map.pbtxt"

▣ 학습 결과
11시간 정도 학습을 시키고 중지시켰다.
연습용으로 학습시키기에는 faster-rcnn은 너무 리소스가 많이 소비된다.
GPU 4 개를 11시간 사용하면 돈이 너무 많이든다.
앞으로는 돈이 적게 드는 예제를 따라해봐야겠다.



아래는 내 bucket에 저장된 학습 결과이다.



▣ Exporting the Tensorflow graph

내가 학습한 결과물들을 실제로 사용할 수 있도록 변환하는 작업이 필요한데 이를
TensorFlow의 file formats은 구글이 만든 Protocol Buffers인데 이는 IOT등 다양한 사물간의 통신을 위해 만들어졌다. caffe에도 적용되어 있으며 text 기반으로 layer를 정의하고 생성할 수 있다.
내가 학습한 bucket에 저장된 결과물들 checkpoint이라고 하는데 이는 아래 3가지로 구성되어 있다.
  • model.ckpt-${CHECKPOINT_NUMBER}.data-00000-of-00001,
  • model.ckpt-${CHECKPOINT_NUMBER}.index
  • model.ckpt-${CHECKPOINT_NUMBER}.meta
내 bucket에 위 파일들을 확인했으니 아래 명령어를 통해 export graph 해보자.
CHECKPOINT_NUMBER가 잘 안되면 직접 숫자를 써서 copy 할 수 있다.
export YOUR_GCS_BUCKET="gs://tensorflow-face-pose-ml"
export CHECKPOINT_NUMBER=${130434}
# From tensorflow/models
gsutil cp ${YOUR_GCS_BUCKET}/train/model.ckpt-${CHECKPOINT_NUMBER}.* .

python object_detection/export_inference_graph.py \
    --input_type image_tensor \
    --pipeline_config_path object_detection/samples/configs/faster_rcnn_resnet101_pets.config \
    --checkpoint_path model.ckpt-130434 \
    --inference_graph_path output_inference_graph.pb
생성된 파일의 크기가 193MB로 절반 이상 줄어들었다.

내가 생성한 파일일 잘 동작하는지 아래 notebook을 통해 확인해보자.
https://github.com/tensorflow/models/blob/master/object_detection/object_detection_tutorial.ipynb

PATH_TO_CKPT 에 생성된 바이너리 포맷의 graph 위치를 의미한다.


detection_graph = tf.Graph()
with detection_graph.as_default():
od_graph_def = tf.GraphDef()
with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
serialized_graph = fid.read()
od_graph_def.ParseFromString(serialized_graph)
tf.import_graph_def(od_graph_def, name='')



비교를 위해 mobilenet을 추가로 학습했다.(model.ckpt-47136: resnet101 대비 1/3 정도만 학습 함...)

▶ 아래는 내가 mobilenet을 학습한 결과이다.




▶ 아래는 resnet101 이다.
    mobilenet에서 검출하지 못 했던 이미지를 잡긴 하는데
    아직 학습 중간에 중지시킨 결과라 아래와 같이 두 개가 같이 잡힌다.
    코드에 NMS 처리가 안 된 건지 확인해봐야겠다.
    두 개 confidence가 유사해서 filtering 되지 않은 것 같다.



1시간도 안되어 내가 원하는 object detection에 대한 설정을 맞추고 
cloud에서 학습이 된다.

data만 만들면 정말 간단하게 구성할 수 있다.



댓글

이 블로그의 인기 게시물

google vision API 사용하기

Convolutional Sequence to Sequence Learning

FPN