python实现目标检测_入门指南:用Python实现实时目标检测(内附代码)

本文介绍了如何使用Python和TensorFlow实现SSD Mobilenet V1模型进行实时目标检测。首先,下载并加载预训练模型,然后通过摄像头捕获图像,运行检测并可视化结果。在Jupyter Notebook环境中,该代码可以开启网络摄影系统进行物体检测。
摘要由CSDN通过智能技术生成

import numpy as np

import os

import six.moves.urllib as urllib

import sys

import tarfile

import tensorflow as tf

import zipfile

from distutils.version import StrictVersion

from collections import defaultdict

from io import StringIO

from matplotlib import pyplot as plt

from PIL import Image

# This isneeded since the notebook is stored in the object_detection folder.

sys.path.append("..")

from utils import ops as utils_ops

if StrictVersion(tf.__version__)

[2]:

# This isneeded to display the images.

get_ipython().run_line_magic( matplotlib , inline )

[3]:

# Objectdetection imports

# Here arethe imports from the object detection module.

from utils import label_map_util

from utils import visualization_utils as vis_util

[4]:

# Modelpreparation

# Anymodel exported using the `export_inference_graph.py` tool can be loaded heresimply by changing `PATH_TO_FROZEN_GRAPH` to point to a new .pb file.

# Bydefault we use an "SSD with Mobilenet" model here.

#See https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

#for alist of other models that can be run out-of-the-box with varying speeds andaccuracies.

# Whatmodel to download.

MODEL_NAME= ssd_mobilenet_v1_coco_2017_11_17

MODEL_FILE= MODEL_NAME + .tar.gz

DOWNLOAD_BASE= http://download.tensorflow.org/models/object_detection/

# Path tofrozen detection graph. This is the actual model that is used for the objectdetection.

PATH_TO_FROZEN_GRAPH= MODEL_NAME + /frozen_inference_graph.pb

# List ofthe strings that is used to add correct label for each box.

PATH_TO_LABELS= os.path.join( data , mscoco_label_map.pbtxt )

[5]:

#DownloadModel

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

[6]:

# Load a(frozen) Tensorflow model into memory.

detection_graph= tf.Graph()

with detection_graph.as_default():

od_graph_def= tf.GraphDef()

withtf.gfile.GFile(PATH_TO_FROZEN_GRAPH, rb ) as fid:

serialized_graph= fid.read()

od_graph_def.ParseFromString(serialized_graph)

tf.import_graph_def(od_graph_def,name= )

[7]:

# Loadinglabel map

# Labelmaps map indices to category names, so that when our convolution networkpredicts `5`,

#we knowthat this corresponds to `airplane`. Here we use internal utilityfunctions,

#butanything that returns a dictionary mapping integers to appropriate stringlabels would be fine

category_index= label_map_util.create_category_index_from_labelmap(PATH_TO_LABELS,use_display_name=True)

[8]:

defrun_inference_for_single_image(image, graph):

with graph.as_default():

with tf.Session() as sess:

# Get handles to input and output tensors

ops= tf.get_default_graph().get_operations()

all_tensor_names= {output.name for op in ops for output in op.outputs}

tensor_dict= {}

for key in [

num_detections , detection_boxes , detection_scores ,

detection_classes , detection_masks ]:

tensor_name= key + :0

if tensor_name in all_tensor_names:

tensor_dict[key]= tf.get_default_graph().get_tensor_by_name(tensor_name)

if detection_masks in tensor_dict:

# The following processing is only for single image

detection_boxes= tf.squeeze(tensor_dict[ detection_boxes ], [0])

detection_masks= tf.squeeze(tensor_dict[ detection_masks ], [0])

# Reframe is required to translate mask from boxcoordinates to image coordinates and fit the image size.

real_num_detection= tf.cast(tensor_dict[ num_detections ][0], tf.int32)

detection_boxes= tf.slice(detection_boxes, [0, 0], [real_num_detection, -1])

detection_masks= tf.slice(detection_masks, [0, 0, 0], [real_num_detection, -1, -1])

detection_masks_reframed= utils_ops.reframe_box_masks_to_image_masks(

detection_masks,detection_boxes, image.shape[1],image.shape[2])

detection_masks_reframed= tf.cast(

tf.greater(detection_masks_reframed,0.5),tf.uint8)

# Follow the convention by adding back the batchdimension

tensor_dict[ detection_masks ] =tf.expand_dims(

detection_masks_reframed,0)

image_tensor= tf.get_default_graph().get_tensor_by_name( image_tensor:0 )

# Run inference

output_dict= sess.run(tensor_dict, feed_dict={image_tensor: image})

# all outputs are float32 numpy arrays, so convert typesas appropriate

output_dict[ num_detections ] =int(output_dict[ num_detections ][0])

output_dict[ detection_classes ] =output_dict[

detection_classes ][0].astype(np.int64)

output_dict[ detection_boxes ] =output_dict[ detection_boxes ][0]

output_dict[ detection_scores ] =output_dict[ detection_scores ][0]

if detection_masks in output_dict:

output_dict[ detection_masks ] =output_dict[ detection_masks ][0]

return output_dict

[9]:

import cv2

cam =cv2.cv2.VideoCapture(0)

rolling = True

while (rolling):

ret,image_np = cam.read()

image_np_expanded= np.expand_dims(image_np, axis=0)

# Actual detection.

output_dict= run_inference_for_single_image(image_np_expanded, detection_graph)

# Visualization of the results of a detection.

vis_util.visualize_boxes_and_labels_on_image_array(

image_np,

output_dict[ detection_boxes ],

output_dict[ detection_classes ],

output_dict[ detection_scores ],

category_index,

instance_masks=output_dict.get( detection_masks ),

use_normalized_coordinates=True,

line_thickness=8)

cv2.imshow( image , cv2.resize(image_np,(1000,800)))

if cv2.waitKey(25) & 0xFF == ord( q ):

break

cv2.destroyAllWindows()

cam.release()

在运行Jupyter notebook时,网络摄影系统会开启并检测所有原始模型训练过的物品类别。

b69bab25e4c05b5813c4d2a742bb7ecb.png

来源:Pexels

感谢阅读本文,如果有什么建议,欢迎在留言区积极发言哟~

2fed8c5589c080419f042eab637f1041.png

推荐阅读专题

789f0a333df3fc23eefc1c58bb5bb225.png

c2aab9262490b2407c77ec5d2e8d689f.png

6b2e85ed390f8cde2ff26b062d644952.png

77b61f6911737c86bed84299ed150ed5.png

0ef0e872127d32384e3e92a64ead571c.png

留言 点赞 发个朋友圈

我们一起分享AI学习与发展的干货

编译组:

蔡思齐、孙梦琪

相关链接:

https://hackernoon.com/introductory-guide-to-real-time-object-detection-with-python-6jyb36t5

如需转载,请后台留言,遵守转载规范

推荐文章阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值