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
- 학습이 진행되는 상태를 ML Engine Dashboard 에서 확인할 수 있다.
- 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
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만 만들면 정말 간단하게 구성할 수 있다.
댓글
댓글 쓰기