30秒轻松实现TensorFlow物体检测

Google发布了新的TensorFlow物体检测API,包含了预训练模型,一个发布模型的jupyter notebook,一些可用于使用自己数据集对模型进行重新训练的有用脚本。

使用该API可以快速的构建一些图片中物体检测的应用。这里我们一步一步来看如何使用预训练模型来检测图像中的物体。

首先我们载入一些会使用的库

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

接下来进行环境设置

%matplotlib inline
sys.path.append("..")

物体检测载入

from utils import label_map_util 

from utils import visualization_utils as vis_util

准备模型

变量  任何使用export_inference_graph.py工具输出的模型可以在这里载入,只需简单改变PATH_TO_CKPT指向一个新的.pb文件。这里我们使用“移动网SSD”模型。

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_CKPT = MODEL_NAME + '/frozen_inference_graph.pb' 

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()) 

将(frozen)TensorFlow模型载入内存

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='')

载入标签图

标签图将索引映射到类名称,当我们的卷积预测5时,我们知道它对应飞机。这里我们使用内置函数,但是任何返回将整数映射到恰当字符标签的字典都适用。

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)

检测

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) ]
IMAGE_SIZE = (12, 8)
[python] view plain copy
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)
   # 这个array在之后会被用来准备为图片加上框和标签
   image_np = load_image_into_numpy_array(image)
   # 扩展维度,应为模型期待: [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')
   # 每个框代表一个物体被侦测到.
   boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
   # 每个分值代表侦测到物体的可信度.
   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')
   # 执行侦测任务.
   (boxes, scores, classes, num_detections) = sess.run(
     [boxes, scores, classes, num_detections],
     feed_dict={image_tensor: image_np_expanded})
   # 图形化.
   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)

在载入模型部分可以尝试不同的侦测模型以比较速度和准确度,将你想侦测的图片放入TEST_IMAGE_PATHS中运行即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 50行Python代码实现人脸检测功能

    现在的人脸识别技术已经得到了非常广泛的应用,支付领域.身份验证.美颜相机里都有它的应用.用iPhone的同学们应该对下面的功能比较熟悉 iPhone的照片中有一个"人物"的功能,能够将照片里的人脸识别出来并分类,背后的原理也是人脸识别技术. 这篇文章主要介绍怎样用Python实现人脸检测.人脸检测是人脸识别的基础.人脸检测的目的是识别出照片里的人脸并定位面部特征点,人脸识别是在人脸检测的基础上进一步告诉你这个人是谁. 好了,介绍就到这里.接下来,开始准备我们的环境. 准备工作 本文的人

  • python利用OpenCV2实现人脸检测

    最近,带领我的学生进行一个URTP项目设计,需要进行人脸识别.由于现在的OpenCV已经到了2.X版本,因此就不想用原来的1.X版本的代码,而网上存在的代码都是1.X版本的代码,尝试自己写一段2.X版本的代码,反复查阅资料,今天终于测试成功(很明显2.X版本的代码要比1.X的代码更简单),供大家好参考,代码如下:(2017年5月12日在python3.6.1下做一简单的修改) import cv2 import numpy as np cv2.namedWindow("test")#命

  • Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys import logging as log import datetime as dt from time import sleep cascPath = "haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeCla

  • python结合opencv实现人脸检测与跟踪

    模式识别课上老师留了个实验,在VC++环境下利用OpenCV库编程实现人脸检测与跟踪. 然后就开始下载opencv和vs2012,再然后,配置了好几次还是配置不成功,这里不得不吐槽下微软,软件做这么大,这么难用真的好吗? 于是就尝试了一下使用python完成实验任务,大概过程就是这样子的: 首先,配置运行环境: 下载opencv和python的比较新的版本,推荐opencv2.4.X和python2.7.X. 直接去官网下载就ok了,python安装时一路next就行,下载的opencv.exe

  • 30秒轻松实现TensorFlow物体检测

    Google发布了新的TensorFlow物体检测API,包含了预训练模型,一个发布模型的jupyter notebook,一些可用于使用自己数据集对模型进行重新训练的有用脚本. 使用该API可以快速的构建一些图片中物体检测的应用.这里我们一步一步来看如何使用预训练模型来检测图像中的物体. 首先我们载入一些会使用的库 import numpy as np import os import six.moves.urllib as urllib import sys import tarfile i

  • 憋气不到30秒 你亚健康了

    有资料统计,全世界人口中70%的人处于亚健康状态.女人在亚健康人群中占到相当多的比例.疲劳.困乏,时常这儿痛.那儿痒,到医院检查,各项指标还都正常,其实你已经被列入到了"亚健康"的范畴.所以,你需要一些简单的方法,随时全方位掌控自己的健康状况.  鞠躬VS心脏  测试前先静坐5分钟,测得每分钟脉搏数A:然后身体直立,上体微向前屈,再还原,其实就是鞠躬的姿势,连续做20个(频率适中),继续测出脉搏数B:休息1分钟,再测脉搏数C.将三次脉搏数相加,减200,再除以10. 得出的结果在0~3

  • 基于OpenCv的运动物体检测算法

    基于一个实现的基于OpenCv的运动物体检测算法,可以用于检测行人或者其他运动物体. #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> int main( int argc, char** argv ) //声明IplImage指针 IplImage* pFrame = NULL; IplImage* pFrImg = NULL; IplImage* pBk

  • Python使用背景差分器实现运动物体检测

    目录 前言 一.基本背景差分器 二.MOG背景差分器 流程 代码编写 三.KNN背景差分器 前言 目前,许多运动检测技术都是基于简单的背景差分概念的,即假设摄像头(视频)的曝光和场景中的光照条件是稳定的,当摄像头捕捉到新的帧时,我们可以从参考图像中减去该帧,并取这个差的绝对值,以获得帧中每个像素位置的运动测量值.如果帧的任何区域与参考图像有很大的不同,我们就认为给定区域中是一个运动物体. 本文主要简单介绍基本背景差分器,详细介绍MOG背景差分器,KNN背景差分器. 一.基本背景差分器 首先,基本

  • VBS监控CPU的使用率(如占用率一直维持在80%超过30秒则运行某程序)

    按照楼主的要求重新修改了下,代码如下: 复制代码 代码如下: '----------------------------------------On Error Resume Next dim iCpuUsePercentage'记录CPU使用率dim iSecond'记录使用率等于100所持续的时间dim objFileStream'txt文本读写流,用于记录日志dim objTextFileWriter'txt写对象dim objShell'Shell'对象,用于执行指定程序dim objF

  • 阿里云上从ASP.NET线程角度对“黑色30秒”问题的全新分析

    在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. "黑色30秒"问题现象的主要特征是:排队的请求(Requests Queued)突增,到达HTTP.SYS的请求数(Arrival Rate)下降,QPS(Requests/Sec)下降,CPU消耗下降,Current Connections上升. 昨天晚上18:08左右发生了1次"黑色30秒",正好借此案例分析一下. 1.为什么Requests Qu

  • JS自动倒计时30秒后按钮才可用(两种场景)

    展示效果图: WEB开发中经常会用到倒计时来限制用户对表单的操作,比如希望用户在一定时间内看完相关协议信息才允许用户继续下一步操作,又比如在收取手机验证码时允许用户在一定时间过后(未收到验证码的情况下)再次获取验证码.那么今天我来给大家介绍下如何使用Javascript来实现这一简单应用. 查看演示 下载源码 应用场景1:用户注册时阅读完相关协议信息后才能激活按钮 某些网站注册时要求用户同意所谓的用户协议之类的信息,如果协议内容非常重要,有些网站会要求新注册的用户一定要阅读完相关协议信息才能激活

  • delphi简单判断程序30秒没有键盘和鼠标动作示例

    以下为原代码: (这里给timer设置了1000ms)的参数,表示30秒的间隔!! 复制代码 代码如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Timer1:

  • vue项目每30秒刷新1次接口的实现方法

    在vue.js项目中,经常需要对数据实时更新--每隔xx秒需要刷新一次接口--即需要用到定时器相关原理 我们先看一看2种常用定时器: setInterval(function(){}, milliseconds)--会不停的调用函数 setTimeout(function(){}, milliseconds)--只执行函数一次 乍看之下,setInterval会符合我们的业务需求,然而也需要注意一些坑,单纯的使用setInterval会导致页面卡死!其原因与JS引擎线程有关(有兴趣的童鞋可自行研

  • 30秒学会30个超实用Python代码片段【收藏版】

    许多人在数据科学.机器学习.web开发.脚本编写和自动化等领域中都会使用Python,它是一种十分流行的语言. Python流行的部分原因在于简单易学. 本文将简要介绍30个简短的.且能在30秒内掌握的代码片段. 1. 唯一性 以下方法可以检查给定列表是否有重复的地方,可用set()的属性将其从列表中删除. def all_unique(lst): return len(lst) == len(set(lst)) x = [1,1,2,2,3,2,3,4,5,6] y = [1,2,3,4,5]

随机推荐