欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tensorflow Object Detection API

程序员文章站 2024-03-14 10:05:34
...

今天跑通了Tensorflow官方例子Object Detection,遇到几个问题,这里把最简单的跑通方法写下来,供大家参考!

一、前期准备:

1、默认已经安装好了python+tensorflow+基本的第三方库

2、pycharm环境

3、下载Object Detection API:链接:链接:https://pan.baidu.com/s/1ghnLbLD 密码:85pw,把object_detection这个文件夹放到新建的项目文件夹下如:D:\PycharmProject\object_detect_toturial,这里我创建的项目名称是:object_detect_toturial

4、下载Protobuf编译:https://github.com/google/protobuf/releases/download/v3.4.0/protoc-3.4.0-win32.zip(这里注意下载的是3.4版,如果下载3.5版应该是编译报错)

解压后将bin文件夹中的【protoc.exe】放到c:\windows\system32目录下,在models目录下shift+右键打开Powershell窗口,输入:

# From tensorflow/models/
protoc object_detection/protos/*.proto --python_out=.
  • 1
  • 2

不报错即可

这里为了大家出问题也将编译好的放上来,链接:https://pan.baidu.com/s/1raoOAza 密码:i8f9,下载后直接解压替换object_detection文件夹中的protos文件夹即可


二、开始测试:

这里我改用啦官方给出的用jupyter notebook运行,把object_detection_tutorial.ipynb文件进行改写

1、在object_detection文件夹下新建

object_detection_tutorial.py

然后复制代码:

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

# What model to download.
MODEL_NAME = 'ssd_mobilenet_v1_coco_11_06_2017'
#MODEL_NAME = 'faster_rcnn_resnet101_coco_11_06_2017'
#MODEL_NAME = 'ssd_inception_v2_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, 5) ]

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

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)
      plt.imshow(image)  # 显示图片
      plt.imshow(image_np)
      # plt.axis('off')  # 不显示坐标轴
      plt.show()
运行结果:

Tensorflow Object Detection API

Tensorflow Object Detection API

测试自己的图片(实验室随手一拍,比较乱哈= =):

Tensorflow Object Detection API

如果想测试自己的图片只需要在object_detection文件夹下的test_images文件夹中添加图片即可,然后for i in range(1, 3)也要进行改变。

这里我用的模型是:(速度稍微慢一点,但是很明显的是效果比较好)

faster_rcnn_resnet101_coco_11_06_2017

三、模型的选择

Speed表示速度,COCO mAP表示在COCO数据集上的平均准确率,第一个ssd_mobilenet就是我们默认使用的pre-train模型 

Tensorflow Object Detection API

最后这里需要提醒下,程序下载模型是需要打开*的!而且模型很大= =


参考资料:http://blog.csdn.net/xinyu3307/article/details/77104388