來源:Pexels 從自動駕駛汽車檢測路上的物體,到通過復(fù)雜的面部及身體語言識別發(fā)現(xiàn)可能的犯罪活動。多年來,研究人員一直在探索讓機(jī)器通過視覺識別物體的可能性,。 這一特殊領(lǐng)域被稱為計(jì)算機(jī)視覺 (Computer Vision, CV),在現(xiàn)代生活中有著廣泛的應(yīng)用。 目標(biāo)檢測 (ObjectDetection) 也是計(jì)算機(jī)視覺最酷的應(yīng)用之一,,這是不容置疑的事實(shí)。 現(xiàn)在的CV工具能夠輕松地將目標(biāo)檢測應(yīng)用于圖片甚至是直播視頻,。本文將簡單地展示如何用TensorFlow創(chuàng)建實(shí)時目標(biāo)檢測器,。 建立一個簡單的目標(biāo)檢測器設(shè)置要求: TensorFlow版本在1.15.0或以上 執(zhí)行pip install TensorFlow安裝最新版本 一切就緒,現(xiàn)在開始吧,! 設(shè)置環(huán)境 第一步:從Github上下載或復(fù)制TensorFlow目標(biāo)檢測的代碼到本地計(jì)算機(jī) 在終端運(yùn)行如下命令: git clonehttps://github.com/tensorflow/models.git 第二步:安裝依賴項(xiàng) 下一步是確定計(jì)算機(jī)上配備了運(yùn)行目標(biāo)檢測器所需的庫和組件,。 下面列舉了本項(xiàng)目所依賴的庫。(大部分依賴都是TensorFlow自帶的) · Cython · contextlib2 · pillow · lxml · matplotlib 若有遺漏的組件,,在運(yùn)行環(huán)境中執(zhí)行pip install即可,。 第三步:安裝Protobuf編譯器 谷歌的Protobuf,又稱Protocol buffers,,是一種語言無關(guān),、平臺無關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)的機(jī)制,。Protobuf幫助程序員定義數(shù)據(jù)結(jié)構(gòu),,輕松地在各種數(shù)據(jù)流中使用各種語言進(jìn)行編寫和讀取結(jié)構(gòu)數(shù)據(jù)。 Protobuf也是本項(xiàng)目的依賴之一,。點(diǎn)擊這里了解更多關(guān)于Protobufs的知識,。接下來把Protobuf安裝到計(jì)算機(jī)上。 打開終端或者打開命令提示符,,將地址改為復(fù)制的代碼倉庫,,在終端執(zhí)行如下命令:
wget -Oprotobuf.zip https://github.com/protocolbuffers/protobuf/releases/download/v3.9.1/protoc-3.9.1-osx-x86_64.zip\
注意:請務(wù)必在models/research目錄解壓protobuf.zip文件,。 來源:Pexels 第四步:編輯Protobuf編譯器 從research/ directory目錄中執(zhí)行如下命令編輯Protobuf編譯器: ./bin/protoc object_detection/protos/*.proto--python_out=. 用Python實(shí)現(xiàn)目標(biāo)檢測現(xiàn)在所有的依賴項(xiàng)都已經(jīng)安裝完畢,可以用Python實(shí)現(xiàn)目標(biāo)檢測了,。 在下載的代碼倉庫中,,將目錄更改為:
這個目錄下有一個叫 ssd_mobilenet_v1_coco_2017_11_17 這一測試會識別代碼庫中提供的兩張測試圖片,。下面是測試結(jié)果之一: 要檢測直播視頻中的目標(biāo)還需要一些微調(diào)。在同一文件夾中新建一個Jupyter notebook,,按照下面的代碼操作: [1]:
import os
import sys
import tensorflow as tf
from distutils.version import StrictVersion
from io import StringIO
from PIL import Image
sys.path.append('..')
if StrictVersion(tf.__version__) < StrictVersion('1.12.0'):
[2]: # This isneeded to display the images.
[3]: # Objectdetection imports
from utils import label_map_util
[4]: # Modelpreparation
# Bydefault we use an 'SSD with Mobilenet' model here.
#for alist of other models that can be run out-of-the-box with varying speeds andaccuracies.
MODEL_NAME= 'ssd_mobilenet_v1_coco_2017_11_17'
DOWNLOAD_BASE= 'http://download./models/object_detection/'
PATH_TO_FROZEN_GRAPH= MODEL_NAME + '/frozen_inference_graph.pb'
PATH_TO_LABELS= os.path.join('data', 'mscoco_label_map.pbtxt') [5]:
opener =urllib.request.URLopener()
tar_file =tarfile.open(MODEL_FILE)
file_name= os.path.basename(file.name)
tar_file.extract(file,os.getcwd()) [6]:
detection_graph= tf.Graph()
od_graph_def= tf.GraphDef()
serialized_graph= fid.read()
tf.import_graph_def(od_graph_def,name='') [7]:
# Labelmaps map indices to category names, so that when our convolution networkpredicts `5`,
#butanything that returns a dictionary mapping integers to appropriate stringlabels would be fine
[8]: defrun_inference_for_single_image(image, graph):
with tf.Session() as sess:
ops= tf.get_default_graph().get_operations()
tensor_dict= {}
'num_detections', 'detection_boxes', 'detection_scores',
tensor_name= key + ':0'
tensor_dict[key]= tf.get_default_graph().get_tensor_by_name(tensor_name)
# The following processing is only for single image
detection_masks= tf.squeeze(tensor_dict['detection_masks'], [0])
real_num_detection= tf.cast(tensor_dict['num_detections'][0], tf.int32)
detection_masks= tf.slice(detection_masks, [0, 0, 0], [real_num_detection, -1, -1])
detection_masks,detection_boxes, image.shape[1],image.shape[2])
tf.greater(detection_masks_reframed,0.5),tf.uint8)
tensor_dict['detection_masks'] =tf.expand_dims(
image_tensor= tf.get_default_graph().get_tensor_by_name('image_tensor:0')
output_dict= sess.run(tensor_dict, feed_dict={image_tensor: image})
output_dict['num_detections'] =int(output_dict['num_detections'][0])
'detection_classes'][0].astype(np.int64)
output_dict['detection_scores'] =output_dict['detection_scores'][0]
output_dict['detection_masks'] =output_dict['detection_masks'][0]
[9]: import cv2
rolling = True
ret,image_np = cam.read()
# Actual detection.
# Visualization of the results of a detection.
image_np,
output_dict['detection_classes'],
category_index,
use_normalized_coordinates=True,
cv2.imshow('image', cv2.resize(image_np,(1000,800)))
break
cam.release() 在運(yùn)行Jupyter notebook時,,網(wǎng)絡(luò)攝影系統(tǒng)會開啟并檢測所有原始模型訓(xùn)練過的物品類別。 感謝閱讀本文,,如果有什么建議,,歡迎在留言區(qū)積極發(fā)言喲~ |
|