Tensorflow Object Detection API
今天跑通了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()
运行结果:
测试自己的图片(实验室随手一拍,比较乱哈= =):
如果想测试自己的图片只需要在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模型
最后这里需要提醒下,程序下载模型是需要打开*的!而且模型很大= =
参考资料:http://blog.csdn.net/xinyu3307/article/details/77104388
推荐阅读
-
Tensorflow Object Detection API
-
Tensorflow Object Detection API
-
TensorFlow Object Detection API
-
ubuntu下谷歌开源的TensorFlow Object Detection API的安装教程
-
tensorflow入门教程(二十五)Object Detection API目标检测(下)
-
[论文复现] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
-
ImageAI (二) 使用Python快速简单实现物体检测 Object Detection
-
tensorflow入门教程(二十四)Object Detection API目标检测(中)
-
windows10 tensorflow_(object_detection) 实现三(快速上手)
-
使用tensorflow object_detection API完成目标检测