본문 바로가기
DL|ML

TensorFlow Object Detection API 써보기

by 이든Eden 2019. 9. 9.

TensorFlow Object Detection API 써보기

💡
올해도 공개 SW 컨트리뷰톤에 참가하게 되었는데 우리 팀 주제가 Keras 기반의 Object Dtection API를 만드는 것이다. 첫 번째 주 목표인 TensorFlow Object Detection API 써보고 장단점을 파악해서 새로 만들게 될 Keras Object Detection API를 통해 Keras가 조금 더 사랑받을 수 있도록 해보자.

 

"TensorFlow Object Detection API"가 뭐야?

TensorFlow Object Detection API(이하 TF ObDe API)의 코드가 있는 이곳에 따르면 TF ObDe API는 TensorFlow를 이용해서 Object Detection 모델을 train하고 deploy하는 것을 쉽게 도와주는 오픈소스 프레임워크이다. 사실 나는 이미 TF ObDE API를 써본 적이 있는데, 그 때 불편했었던 점이 있어서 오늘은 아직도 그런 불편함이 남아있는지 파헤치러 왔다.

남이 만든 코드에 불평하는게 제일 쉽다..

 


TF ObDE API 설치하기

이곳을 보며 따라하면 된다.

 

1. TensorFlow 모델 받기

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

 

2. TensorFlow를 설치한다.

CPU, GPU 버전이 따로 있으니 유의할 것.

# For CPU
pip install tensorflow
# For GPU
pip install tensorflow-gpu

TensorFlow 이외에도 아래 보이는 것 처럼 필요한 것들이 있다.

  • Protobuf 3.0.0
  • Python-tk
  • Pillow 1.0
  • lxml
  • tf Slim (which is included in the "tensorflow/models/research/" checkout)
  • Jupyter notebook
  • Matplotlib
  • Tensorflow (>=1.12.0)
  • Cython
  • contextlib2
  • cocoapi

아래처럼 pip 명령어를 이용해서 다 설치하자.

pip install --user Cython
pip install --user contextlib2
pip install --user pillow
pip install --user lxml
pip install --user jupyter
pip install --user matplotlib

 

3. COCOAPI 설치

만약 COCO evaluation metric에 관심이 있다면 설치하고, 아니면 할 필요 없다.

git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
make
cp -r pycocotools <path_to_tensorflow>/models/research/

 

4. Protobuf Compilation

TF ObDe API는 모델과 파라미터를 configure하기 위해 protobuf라는 것을 사용하는데 이 protobuf를 설치해야한다.

Protobuf(Protocol Buffer)는 무엇? 구글에서 만든 직렬화 데이터 구조. 쉽게 말하면 데이터를 파일로 저장하거나 네트워크로 전송하기 위해 바이너리 스트림으로 저장하기 위해 만든 것이다. 자세한건 이곳을 참조 📎

먼저 protobuf을 설치하고

# Mac이면서 Homebrew 있는 사람 기준
brew install protobuf

아래의 명령어를 이용해서 protobuf로 compile 해준다.

# From models/research/
protoc object_detection/protos/*.proto --python_out=.

이렇게 하고 나면 git으로 설치했던 models의 하위 디렉토리에 있는models/research/object_detection/protos 에 각종 .proto 파일들이 생성된다.

지난번에 Ubuntu 16.04에서 설치할 때는 🐶고생했는데 mac은 금방 되네요. 제가 우분투에서 겪었던 오류는 아래와 같은데, protobuf를 3.3 이상으로 설치하면 해결된다고 한다. 하지만 나는 그것도 소용이 없어ㅆ..🤭🤭

$ protoc object_detection/protos/*.proto --python_out=.
object_detection/protos/anchor_generator.proto:12:3: Expected "required", "optional", or "repeated".
object_detection/protos/anchor_generator.proto:12:32: Missing field number.

 

5. 라이브러리를 PYTHONPATH에 추가

어떤 디렉토리를 PYTHONPATH에 추가시키면 python으로 실행할 때 그 곳이 working directory인 것 처럼 설정된다.

Mini Tip) 코딩할 때 import error가 나면 보통은 해당 패키지가 설치되지 않았거나, PYTHONPATH가 안맞아서 import 할 패키지를 못찾는 경우가 많으므로 패스가 설정되어 있는지 의심해보아야 한다.

# From models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

여기까지가 설치과정이었다. 이제는 설치가 잘되었는지 테스트해보자. 다행히 설치 테스트 코드가 이미 주어져있다.

 

6. 모델 설치 테스트

아래와 같은 결과가 나왔다. 설치 성공 🎉🎉

# model/research 에서 실행
$ python object_detection/builders/model_builder_test.py
Running tests under Python 3.6.2: /Users/Mac/anaconda3/envs/TFObDe/bin/python
[ RUN      ] ModelBuilderTest.test_create_faster_rcnn_model_from_config_with_example_miner
[       OK ] ModelBuilderTest.test_create_faster_rcnn_model_from_config_with_example_miner
[ RUN      ] ModelBuilderTest.test_create_faster_rcnn_models_from_config_faster_rcnn_with_matmul
[       OK ] ModelBuilderTest.test_create_faster_rcnn_models_from_config_faster_rcnn_with_matmul
[ RUN      ] ModelBuilderTest.test_create_faster_rcnn_models_from_config_faster_rcnn_without_matmul
[       OK ] ModelBuilderTest.test_create_faster_rcnn_models_from_config_faster_rcnn_without_matmul
[ RUN      ] ModelBuilderTest.test_create_faster_rcnn_models_from_config_mask_rcnn_with_matmul
[       OK ] ModelBuilderTest.test_create_faster_rcnn_models_from_config_mask_rcnn_with_matmul
[ RUN      ] ModelBuilderTest.test_create_faster_rcnn_models_from_config_mask_rcnn_without_matmul
[       OK ] ModelBuilderTest.test_create_faster_rcnn_models_from_config_mask_rcnn_without_matmul
[ RUN      ] ModelBuilderTest.test_create_rfcn_model_from_config
[       OK ] ModelBuilderTest.test_create_rfcn_model_from_config
[ RUN      ] ModelBuilderTest.test_create_ssd_fpn_model_from_config
[       OK ] ModelBuilderTest.test_create_ssd_fpn_model_from_config
[ RUN      ] ModelBuilderTest.test_create_ssd_models_from_config
[       OK ] ModelBuilderTest.test_create_ssd_models_from_config
[ RUN      ] ModelBuilderTest.test_invalid_faster_rcnn_batchnorm_update
[       OK ] ModelBuilderTest.test_invalid_faster_rcnn_batchnorm_update
[ RUN      ] ModelBuilderTest.test_invalid_first_stage_nms_iou_threshold
[       OK ] ModelBuilderTest.test_invalid_first_stage_nms_iou_threshold
[ RUN      ] ModelBuilderTest.test_invalid_model_config_proto
[       OK ] ModelBuilderTest.test_invalid_model_config_proto
[ RUN      ] ModelBuilderTest.test_invalid_second_stage_batch_size
[       OK ] ModelBuilderTest.test_invalid_second_stage_batch_size
[ RUN      ] ModelBuilderTest.test_session
[  SKIPPED ] ModelBuilderTest.test_session
[ RUN      ] ModelBuilderTest.test_unknown_faster_rcnn_feature_extractor
[       OK ] ModelBuilderTest.test_unknown_faster_rcnn_feature_extractor
[ RUN      ] ModelBuilderTest.test_unknown_meta_architecture
[       OK ] ModelBuilderTest.test_unknown_meta_architecture
[ RUN      ] ModelBuilderTest.test_unknown_ssd_feature_extractor
[       OK ] ModelBuilderTest.test_unknown_ssd_feature_extractor
----------------------------------------------------------------------
Ran 16 tests in 0.361s

OK (skipped=1)

 


TFObDE API를 이용한 Object Detection 해보기

models/research/object_detection에 가보면 object_detection_tutorial.ipynb라는 주피터노트북 파일이 있다. 주피터 노트북을 이 위치에서 실행해서 모델을 테스트 해보자.

아래의 명령어로 jupyter notebook을 켠다음 object_detection_tutorial.ipynb를 열어서 오류날까봐 조마조마한 마음을 가지고 한 셀 씩 실행시켜보자.

# model/research/object_detection 에서 실행
$ jupyter notebook

마지말 셀에서 image_path의 이미지를 로드해서 plot을 그려주는 것을 보니 눈치로 이 부분이 이미지를 로드한뒤 Object Detection 한 후 plot으로 그려주는 부분이라는 것을 알 수 있다. 실행해보면 역시 그 부분이 맞다.

 

실행해 보니 아래의 두 이미지가 보인다.

 

개는 Dog로, 사람은 person으로 디텍팅을 잘했다.

 

여기서 끝나면 아쉬우니 원하는 사진에서 제대로 디텍팅을 하는지 한 번 해보자.

 

원하는 사진을 넣기 위해 코드를 조금 수정해보자!

먼저 새로운 셀을 만들어 image_path를 원하는 이미지로 설정한다. 아래처럼.

그리고 그 다음에 새로운 셀을 만들어서 맨 마지막 셀의 코드에서 for 문 안의 코드만 훔쳐온다 🤩

 

이렇게 해놓으면 사진을 바꿀 때만 image_path를 바꾸고 다시 위 코드를 실행하면 된다.

 

원하는 사진을 넣어본 첫 번째 결과다. 아쉽게도 총 9명의 모든 멤버들을 잡아내진 못했다. 이 바보같은..ㅂㄷㅂㄷ 사람이라고 생각할 수는 없는 미모라서 그럴것이라고 긍정적으로 생각하자

 

사나가 만두를 먹고있는 사진을 넣어보자. 만두가 저렇게 큰데 만두는 클래스에 없었나보다. 사나만 디텍션이 된다.

마지막 사진을 하나 더 넣어보자. 바로 (kid-O 비닐봉지가 넘치는)내 식탁이다. 물병과 랩톱 그리고 그릇이 디텍션되었다.

이제 그만 끝내려고 하는데 마지막으로 한 가지가 궁금해졌다. 이건 지난번 Twicelights 콘서트 굿즈이자 정연이의 얼굴이 있는 옷걸이이다. 이것도 사람으로 인식할지 궁금했다 🤔

결과는 신기하게도 person이 뜬다. person 데이터셋에는 상반신만 있는 이미지도 많을 것이라고 예상된다.

 

이상으로 TensorFlow Object Detection API를 사용해보았고, 단점을 찾았어야됬는데 ubuntu에 설치했을 때와 비교되게 너무 잘 설치가 되서 아쉽(?)다ㅋㅋㅋㅋㅋ

'DL|ML' 카테고리의 다른 글

KoNLPy, mecab 설치하기 (ubuntu 16.04)  (8) 2019.12.11
mAP(mean Average Precision)  (2) 2019.09.22
ckpt, pb, h5 차이점?  (2) 2019.09.18
CNN(Convolutional Neural Networks)에 가변적인 input을 줄 수 있을까  (0) 2019.09.13
Keras backends?  (0) 2019.09.09