Notice
Recent Posts
Recent Comments
Today
Total
04-25 03:18
Archives
관리 메뉴

Jeongchul Kim

Google Cloud ML TensorFlow를 활용한 Object Detection 본문

Google Cloud Platform

Google Cloud ML TensorFlow를 활용한 Object Detection

김 정출 2018. 6. 15. 00:20


Google Cloud ML TensorFlow를 활용한 Object Detection


Google Cloud ML Vision API를 이용한 이미지 텍스트 추출 그리고 번역을 위한 Translation API와 Natural Language API

첫 링크 글에서 API_KEY Set up을 따라하면서 진행해주세요!


Google Cloud Platform 이용한 텍스트 카테고리 분류 Natural Language API

Google Cloud Platform Cloud Vision API를 이용한 이미지, 얼굴 Detection

Google Cloud Platform 이용한 엔티티와 감정 분석 Natural Language API

Google Cloud ML Engine

오늘 해볼 것은 다음과 같습니다.

1. TensorFlow(https://www.tensorflow.org/)

오픈 소스 머신 러닝 library로 데이터 분석가 들이나 연구자, 엔지니어에게 많이 쓰이는 Google의 머신러닝 프레임워크입니다. 최근에는 분산 딥러닝 학습도 가능합니다.


2. Object Detection API(https://github.com/tensorflow/models/tree/master/research/object_detection)

TensorFlow로 학습된 object detection 모델을 학습하고 배포(deploy) 할 수 있습니다.


웹 application을 Compute Engine의 VM 인스턴스에 배포합니다.

클라이언트가 이미지를 application에 업로드하면, 물체 감지(object detection)를 로컬에서 실행합니다. 사전 학습된 모델은 탐지 된 객체의 레이블(label)과 해당 객체의 이미지 좌표(x, y)를 반환합니다. 이 값을 사용하여 응용 프로그램은 탐지된 객체 주위에 직사각형으로 채워진 새로운 이미지를 생성합니다. 각 오브젝트 카테고리에 대해 별도의 이미지가 생성되므로 클라이언트가 선택한 오브젝트를 구분할 수 있습니다.


https://cloud.google.com/ml-engine/

사전 학습된 모델을 Google Cloud Machine Learning Engine에 배포하여 추측을위한 API 서비스를 제공 할 수 있습니다. 그렇게 하면 웹 응용 프로그램이 object detection을 로컬에서 실행하는 대신 업로드된 이미지를 API 요청을 통해 object detection 합니다. Google Cloud Platform 및 TensorFlow를 기계 학습을위한 개방형 플랫폼으로 활용할 수 있습니다.


Object Detection API와 함께 5 개의 사전 교육 모델을 사용할 수 있습니다. 이들은 COCO 데이터셋(dataset)로 학습되었으며 80 개 범주의 일반 객체를 탐지 할 수 있습니다. COCO mAP는 모델의 정확도(accuracy)를 보여줍니다. 숫자가 높을수록 정확도가 높아집니다. 속도가 증가하면 정확도가 떨어집니다.




VM 인스턴스 시작

Compute Engine에서 VM Instances를 클릭합니다.


Create 버튼을 클릭합니다.


인스턴스의 이름과 지역과 영역을 설정합니다.

머신 유형은 커스터마이즈를 클릭하고 vCPU : 4 / 메모리 : 10GB를 선택합니다.


Allow HTTP traffic을 선택하고 만들기 버튼을 클릭합니다.


gcloud 명령 보기를 통해 ssh로 접속합니다.


CLOUD SHELL에서 실행 버튼을 클릭합니다.


$ gcloud compute --project "jeongchul-gcp" ssh --zone "us-west1-b" "jc-deeplearning"



다음의 명령어로 root 유저로 접속합니다.

$ sudo -i


Object Detection API library 설치하기

$ apt-get update


$ apt-get install -y protobuf-compiler python-pil python-lxml python-pip python-dev git


$ pip install Flask==0.12.2 WTForms==2.1 Flask_WTF==0.14.2 Werkzeug==0.12.2


TensorFlow V1.1.0 을 설치합니다.

$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.1.0-cp27-none-linux_x86_64.whl


Object Detection API library를 설치합니다.

$ cd /opt

$ git clone https://github.com/tensorflow/models

$ cd models/research

$ protoc object_detection/protos/*.proto --python_out=.


사전에 학습된 모델의 binary를 다운 받습니다.

$ mkdir -p /opt/graph_def

$ cd /tmp

$ for model in \

 ssd_mobilenet_v1_coco_11_06_2017 \

 ssd_inception_v2_coco_11_06_2017 \

 rfcn_resnet101_coco_11_06_2017 \

 faster_rcnn_resnet101_coco_11_06_2017 \

 faster_rcnn_inception_resnet_v2_atrous_coco_11_06_2017

do \

 curl -OL http://download.tensorflow.org/models/object_detection/$model.tar.gz

 tar -xzf $model.tar.gz $model/frozen_inference_graph.pb

 cp -a $model /opt/graph_def/

done


우리는 이제 web application에서 사용할 모델을 선택할 수 있습니다.

faster_rcnn_resnet101_coco_11_06_2017 을 사용해봅시다.

$ ln -sf /opt/graph_def/faster_rcnn_resnet101_coco_11_06_2017/frozen_inference_graph.pb /opt/graph_def/frozen_inference_graph.pb


Web application 설치하고 시작하기

$ cd $HOME

$ git clone https://github.com/GoogleCloudPlatform/tensorflow-object-detection-example

$ cp -a tensorflow-object-detection-example/object_detection_app /opt/


object detection 서비스를 생성합니다.

$ cp /opt/object_detection_app/object-detection.service /etc/systemd/system/

systemd manager 설정을 systemd로 다시 불러옵니다.

$ systemctl daemon-reload


application을 시작해봅시다.

$ systemctl enable object-detection

$ systemctl start object-detection

$ systemctl status object-detection


다음의 명령어를 다시 실행합니다.

$ watch -n 1 systemctl status object-detection

최종적으로 Running on http://0.0.0.0:80/ 로그(log)가 보여야 준비가 완료된 것입니다.


Web Application 테스트

application은 간단한 user 인증 메커니즘(mechanism)을 사용합니다.

USERNAME과 PASSWORD를 수정합시다.

$ vi /opt/object_detection_app/decorator.py


VM 인스턴스의 외부 IP로 접속해봅시다.


아까 입력한 Username와 Password를 입력합니다.


다음의 간단한 사이트가 보일 것입니다.


파일 선택을 통해서 이미지를 업로드합니다.

저는 일본에서 먹은 음식 사진을 올려보겠습니다.


Upload 버튼을 클릭합니다.


다음과 같은 결과가 나왔습니다.


사진의 오른쪽에 있는 객체(object)의 이름을 클릭하면 객체에 네모박스가 생깁니다.


Inference Model 변경하기

모델을 변경해봅시다. cloud shell로 돌아옵니다.

$ systemctl stop object-detection


다음의 모델들이 있습니다.

1. ssd_mobilenet_v1_coco_11_06_2017
2. ssd_inception_v2_coco_11_06_2017
3. rfcn_resnet101_coco_11_06_2017
4. faster_rcnn_resnet101_coco_11_06_2017
5. faster_rcnn_inception_resnet_v2_atrous_coco_11_06_2017


이번에는 속도가 빠른 ssd_mobilenet을 사용해보겠습니다.

$ ln -sf /opt/graph_def/[MODEL NAME]/frozen_inference_graph.pb /opt/graph_def/frozen_inference_graph.pb


$ ln -sf /opt/graph_def/ssd_mobilenet_v1_coco_11_06_2017/frozen_inference_graph.pb /opt/graph_def/frozen_inference_graph.pb


application을 재시작합니다.

$ systemctl start object-detection

$ systemctl status object-detection


이번에는 테스트를 미국에서 먹은 에그슬럿 햄버거 사진으로 해보겠습니다.



결과는 다음과 같습니다.

간단한 web application을 만들어보았습니다.

고생하셨습니다.



Comments