When will you grow up?

Anaconda(spyder)를 이용한 Tensorflow Object Detection API 본문

02. Study/Tensorflow

Anaconda(spyder)를 이용한 Tensorflow Object Detection API

미카이 2017. 7. 17. 20:24

모든글 작성은 내 이해를 돕고자 작성하였다.


6월 15일에 tensorflow가 업데이트 되면서


In addition to our base Tensorflow detection model definitions, this release includes:

  • A selection of trainable detection models, including:
    • Single Shot Multibox Detector (SSD) with MobileNet,
    • SSD with Inception V2,
    • Region-Based Fully Convolutional Networks (R-FCN) with Resnet 101,
    • Faster RCNN with Resnet 101,
    • Faster RCNN with Inception Resnet v2
  • Frozen weights (trained on the COCO dataset) for each of the above models to be used for out-of-the-box inference purposes.
  • Jupyter notebook for performing out-of-the-box inference with one of our released models
  • Convenient local training scripts as well as distributed training and evaluation pipelines via Google Cloud.
SSD, RCNN 등 object detection 및 segmentation 하는 유명한 모델들이 tensorflow 안으로 들어갔다.


[유명한 Tensorflow Object detection API 로 돌렸을때 나오는 성능을 잘 나타내고 있는 사진이다 (출처)]


설치과정을 살펴보자.


참고 reference로는 

https://github.com/tensorflow/models/tree/master/object_detection

https://github.com/tensorflow/models/issues/1591

를 참고하여 작성하였다.(문제가 있으면 바로 자삭하겠습니다.)



일단 저는 win10 tensorflow gpu버전(anaconda ->spyder)를 사용하여 글을 작성하였다.

설치가 안되어 있으신 분들은 클릭 < 여기글을 참고

tensorflow가 깔려있다는 전제하에 시작하겠다.


좀 더 자세한 설치과정을 원하시면

https://github.com/tensorflow/models/blob/master/object_detection/g3doc/installation.md 

글을 참고하시길 바라겠습니다



1. https://github.com/tensorflow/models 이동하여 models-master를 다운받는다.


2. 다운로드 받은 후 압축을 풀고 spyder 실행 후 models-master 폴더 안에 object_detection 폴더 안에 object_detection_tutorial.ipynb jupyter 환경에서 돌릴 수 있는 파일을 spyder 에서 같은 object_detection_tutorial.py 파일을 생성후 붙여넣기를 한다


object_detection_tutorial.py 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile
 
from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt
from PIL import Image
 
# This is needed since the notebook is stored in the object_detection folder.
sys.path.append("..")
 
from utils import label_map_util
 
from utils import visualization_utils as vis_util
 
# What model to download.
MODEL_NAME = 'ssd_mobilenet_v1_coco_11_06_2017'
MODEL_FILE = MODEL_NAME + '.tar.gz'
DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'
 
# Path to frozen detection graph. This is the actual model that is used for the object detection.
PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb'
 
# List of the strings that is used to add correct label for each box.
PATH_TO_LABELS = os.path.join('data''mscoco_label_map.pbtxt')
 
NUM_CLASSES = 90
 
opener = urllib.request.URLopener()
opener.retrieve(DOWNLOAD_BASE + MODEL_FILE, MODEL_FILE)
tar_file = tarfile.open(MODEL_FILE)
for file in tar_file.getmembers():
    file_name = os.path.basename(file.name)
    if 'frozen_inference_graph.pb' in file_name:
        tar_file.extract(file, os.getcwd())
        
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='')
        
label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)
category_index = label_map_util.create_category_index(categories)
 
def load_image_into_numpy_array(image):
  (im_width, im_height) = image.size
  return np.array(image.getdata()).reshape(
      (im_height, im_width, 3)).astype(np.uint8)
  
# For the sake of simplicity we will use only 2 images:
# image1.jpg
# image2.jpg
# If you want to test the code with your images, just add path to the images to the TEST_IMAGE_PATHS.
PATH_TO_TEST_IMAGES_DIR = 'test_images'
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(13) ]
 
# Size, in inches, of the output images.
IMAGE_SIZE = (128)
 
with detection_graph.as_default():
  with tf.Session(graph=detection_graph) as sess:
    for image_path in TEST_IMAGE_PATHS:
      image = Image.open(image_path)
      # the array based representation of the image will be used later in order to prepare the
      # result image with boxes and labels on it.
      image_np = load_image_into_numpy_array(image)
      # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
      image_np_expanded = np.expand_dims(image_np, axis=0)
      image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
      # Each box represents a part of the image where a particular object was detected.
      boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
      # Each score represent how level of confidence for each of the objects.
      # Score is shown on the result image, together with the class label.
      scores = detection_graph.get_tensor_by_name('detection_scores:0')
      classes = detection_graph.get_tensor_by_name('detection_classes:0')
      num_detections = detection_graph.get_tensor_by_name('num_detections:0')
      # Actual detection.
      (boxes, scores, classes, num_detections) = sess.run(
          [boxes, scores, classes, num_detections],
          feed_dict={image_tensor: image_np_expanded})
      # Visualization of the results of a detection.
      vis_util.visualize_boxes_and_labels_on_image_array(
          image_np,
          np.squeeze(boxes),
          np.squeeze(classes).astype(np.int32),
          np.squeeze(scores),
          category_index,
          use_normalized_coordinates=True,
          line_thickness=8)
      plt.figure(figsize=IMAGE_SIZE)
      plt.imshow(image_np)
cs


이후 실행을 시켜보면 

 ImportError: No module named 'string_int_label_map_pb2'


오류가 나오는것을 확인할 수 있다.

구글링 해본 결과, string_int_label_map_pb2파일이 없어서 라고 나와 protoc 설치 후에 

object_detection 상위폴더인 models-master 경로에서 cmd 명령어로 C:\Users\Developer\Anaconda3\pkgs\protobuf-3.3.0-py35_vc14_3\Library\bin\protoc object_detection/protos/*.proto --python_out=." 를 해봐도 계속적으로 No such file or directory 오류나와 

구글링을 해본결과

https://github.com/tensorflow/models/issues/1591 여기서 답을 찾을 수 있었다.

protoc-3.3.0-win32를 직접 받아 빌드하는 것이였다.

다운로드 주소는 : https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-win32.zip 여기서 받을 수 있다.

받고 저같은 경우는 경로는 

C:\Users\developer(개인 컴퓨터 이름)  경로에 풀어주었다.

그리고 나서     

위 사진과 같이 경로로 이동하여 protobuf 컴파일을 성공적으로 수행하였다.


그러면 python코드들이 생성이 된다.


그리고 나서 object_detection_tutorial.py 실행해보면 잘 동작하는것을 확인할 수 있다.

 위 코드에서 자신만의 사진을 넣어서 확인해보고 싶으면

object_detection 안에 test_images 폴더 안에 이름을 image1 , image2 ~~~이런식으로 계속 작성후 

코드안에서 for 문을 수정해주면 된다 1~3이면 image1 image2   1~4이면 image1,image2,image3



결과


Comments