1. 程式人生 > >Tensorflow object detection API 詳細配置教程

Tensorflow object detection API 詳細配置教程

Tensorflow object detection API

簡單介紹Tensorflow object detection API:

這個API是基於tensorflow構造的開源框架,易於構建、訓練和部署目標檢測模型。

關於tensorflow安裝:自行百度, 教程很多,分CPU,GPU版本的;

環境:

       win10

       pycharm

       anaconda

       python 3.6

       tensorflow gpu

需要的python庫有: pillow,  lxml, matplotlib, jupyter, 請自行安裝。

第一步:

第二步:

protoc的作用是將Tensorflow object detection API模型檔案中的.pro


檔案編譯成python檔案。window下下載的版本可以是:


下載後解壓,可以看到目錄如下:


將bin資料夾的路徑新增到環境變數:


開啟cmd,輸入 protoc:輸出如下資訊則表示新增環境變數成功:


第三步:

將下載的tensorflow object detection檔案解壓, 檔名可改為model:開啟models\research\object_detection\protos,會看到裡面有很多的.proto檔案,利用Protoc將這些.proto檔案編譯成py檔案,下面介紹具體的做法:

在cmd下, 一路cd到\models\research資料夾下。根據這篇部落格的介紹, protos資料夾下的.proto

要逐一編譯,在這裡可以直接用跟快速的方法,直接輸入:protoc ./object_detection/protos/*.proto --python_out=. 就可以快速編譯所有檔案, *.proto相當於匹配所有的.proto檔案。

編譯完後是這樣的:


每一個.proto對應一個python檔案。

第四步:

需要新增兩個環境變數:

-> \models\research

-> \models\research\slim

如圖所示:


至此object detection API已經配置完畢:

接下來需要測試一下:

我這裡直接用pycharm開啟models專案:整個目錄如下圖所示


在research/object_detection資料夾下新建一個python檔案,命名為object_detection_tutorial


檔案內容如下:

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 to display the images.
# %matplotlib inline

# 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
from research.object_detection.utils import label_map_util
from research.object_detection.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

# download model
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())

# Load a (frozen) Tensorflow model into memory.
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='')
# Loading label map
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)


# Helper code
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(1, 3)]

# Size, in inches, of the output images.
IMAGE_SIZE = (12, 8)

with detection_graph.as_default():
    with tf.Session(graph=detection_graph) as sess:
        # Definite input and output Tensors for detection_graph
        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.
        detection_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.
        detection_scores = detection_graph.get_tensor_by_name('detection_scores:0')
        detection_classes = detection_graph.get_tensor_by_name('detection_classes:0')
        num_detections = detection_graph.get_tensor_by_name('num_detections:0')
        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)
            plt.show()
這裡需要注意:
# from utils import label_map_util
# from utils import visualization_utils as vis_util
from research.object_detection.utils import label_map_util
from research.object_detection.utils import visualization_utils as vis_util

utils檔案需要根據自己的目錄作出具體的修改, 比如檔案中原始的

 from utils import label_map_util
 from utils import visualization_utils as vis_util

會報錯, 得根據自己的目錄做具體的修,我根據自己的目錄修改為:

from research.object_detection.utils import label_map_util
from research.object_detection.utils import visualization_utils as vis_util

這樣pycharm就不會提示找不到utils包了:

修改完執行時還是會報錯, 是因為還有兩個地方需要修改:

第一個就是上面匯入的label_mao_util.py檔案裡面:

# from object_detection.protos import string_int_label_map_pb2
from research.object_detection.protos import string_int_label_map_pb2

   第一行註釋掉的時原來檔案中的寫法, 我根據自己的目錄修改為第二行的形式

第二個就是上面匯入的visualization_util.py檔案裡面:

也做相應的修改:

# from object_detection.core import standard_fields as fields
from research.object_detection.core import standard_fields as fields

現在已經全部修改完畢:

接下來可以直接執行剛才建立的object_detection_tutorial.py檔案了, 執行可能需要比較久的時間,請耐性等待

最後的結果: 下圖為模型中的測試圖片



完畢!

在後面會詳細介紹一下如和用自己的資料訓練一個目標檢測的模型。