樹莓派攝像頭運行物體檢測 - tensorflow with SSD

環(huán)境

sudo pip uninstall tensorflow
sudo pip install --upgrade tensorflow-1.4.1-cp27-none-linux_armv7l.whl

準備模型

  • 下載tensorflow提供的models API并解壓董朝,我這里解壓后的目錄為models_master,下載路徑:
    https://github.com/tensorflow/models/tree/master/research/object_detection/models
  • 下載訓(xùn)練好的模型并放到上一步models_master下的object_detection/models目錄罐柳,下載路徑:
    https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
    這里下載幾個典型的:ssd_mobilenet_v1_coco_2017_11_17洗鸵、faster_rcnn_resnet101_cocomask_rcnn_inception_v2_coco
    注:做物體檢測的網(wǎng)絡(luò)有很多種恬惯,如faster rcnn浙宜,ssd,yolo等等蝶棋,通過不同維度的對比嵌赠,各個網(wǎng)絡(luò)都有各自的優(yōu)勢塑荒。
    畢竟樹莓派計算能力有限,我們這里先選擇專門為速度優(yōu)化過最快的網(wǎng)絡(luò)SSD姜挺,以及經(jīng)典的faster-rcnn作對比齿税,再加上能顯示mask的高端網(wǎng)絡(luò),炊豪,凌箕,
    事實上yolo v3剛出來,比SSD更快溜在,而faster rcnn相對來說運行慢的多了陌知,后面可以都嘗試對比一下,目前先把基線系統(tǒng)搭建好掖肋。

Protobuf 安裝與配置

  • 說明
    protobuf是Google開發(fā)的一種混合語言數(shù)據(jù)標(biāo)準仆葡,提供了一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,可以用于結(jié)構(gòu)化數(shù)據(jù)序列化志笼。很適合做數(shù)據(jù)存儲或 RPC 數(shù)據(jù)交換格式沿盅。可用于通訊協(xié)議纫溃、數(shù)據(jù)存儲等領(lǐng)域的語言無關(guān)腰涧、平臺無關(guān)、可擴展的序列化結(jié)構(gòu)數(shù)據(jù)格式紊浩。目前提供了 C++窖铡、Java疗锐、Python 三種語言的 API。
    下載地址:https://github.com/google/protobuf/releases
    我們這里下載最新版本 protobuf-all-3.5.1.tar.gz
  • 安裝
tar -xf  protobuf-all-3.5.1.tar.gz  
cd protobuf-3.5.1  
./configure   
make   
make check   ->這一步是檢查編譯是否正確费彼,耗時非常長滑臊,可略過
sudo make install  
sudo ldconfig  ->更新庫搜索路徑,否則可能找不到庫文件

如果運行了make check箍铲,結(jié)果如下雇卷,可以看到所有的測試用例都PASS了,說明編譯正確:

============================================================================
Testsuite summary for Protocol Buffers 3.5.1
============================================================================
# TOTAL: 7
# PASS:  7
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================
  • 配置
    配置的目的是將proto格式的數(shù)據(jù)轉(zhuǎn)換為python格式颠猴,從而可以在python腳本中調(diào)用关划,進入目錄models-master/research,運行:
protoc object_detection/protos/*.proto --python_out=.

轉(zhuǎn)換完畢后可以看到在object_detection/protos/目錄下多了許多*.py文件翘瓮。

代碼

這里的代碼很簡單贮折,因為基本實現(xiàn)都已經(jīng)有了,我們只是調(diào)用一下接口實現(xiàn)功能即可资盅。

import numpy as np
import os
import sys
import tarfile
import tensorflow as tf
import cv2
import time

from collections import defaultdict

# This is needed since the notebook is stored in the object_detection folder.
sys.path.append("../..")

from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util

# What model to download.
MODEL_NAME = 'ssd_mobilenet_v1_coco_2017_11_17'
#MODEL_NAME = 'faster_rcnn_resnet101_coco_11_06_2017'
#MODEL_NAME = 'ssd_inception_v2_coco_11_06_2017'
MODEL_FILE = MODEL_NAME + '.tar.gz'

# 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('/home/yinan/object_detect/models-master/research/object_detection/data', 'mscoco_label_map.pbtxt')

#extract the ssd_mobilenet
start = time.clock()
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())
end= time.clock()
print('load the model',(end-start))
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='')

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)

cap = cv2.VideoCapture(0)
with detection_graph.as_default():
  with tf.Session(graph=detection_graph) as sess:
      writer = tf.summary.FileWriter("logs/", sess.graph)
      sess.run(tf.global_variables_initializer())
      while(1):
        start = time.clock()
        ret, frame = cap.read()
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        image_np=frame
        # the array based representation of the image will be used later in order to prepare the
        # result image with boxes and labels on it.
        # 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=6)
        end = time.clock()
        #print('frame:',1.0/(end - start))
        print 'One frame detect take time:',end - start

        cv2.imshow("capture", image_np)
        print('after cv2 show')
        cv2.waitKey(1)
cap.release()
cv2.destroyAllWindows()

保存為 detect.py脱货,到目錄models-master/research/object_detection/models下。

運行

命令:

sudo chmod 666 /dev/video0
python detect.py

效果

SSD模型

下圖可以看到律姨,SSD模型加載模型花了8s,差不多一張圖識別時間在5s:


image.png

PS. 為什么把房間識別成了book...

faster-RCNN模型

faster-RCNN臼疫,加載模型83s择份,內(nèi)存不夠,跑不起來烫堤。荣赶。。


image.png

mask SSD模型

mask模型可以描繪出輪廓鸽斟,看起來更高端拔创,加載模型25s,遇到個問題:


image.png

接下來查一下
CPU占用率100%富蓄,內(nèi)存占用60%多

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剩燥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子立倍,更是在濱河造成了極大的恐慌灭红,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件口注,死亡現(xiàn)場離奇詭異变擒,居然都是意外死亡,警方通過查閱死者的電腦和手機寝志,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門娇斑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來策添,“玉大人,你說我怎么就攤上這事毫缆∥ㄖ瘢” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵悔醋,是天一觀的道長摩窃。 經(jīng)常有香客問我,道長芬骄,這世上最難降的妖魔是什么猾愿? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮账阻,結(jié)果婚禮上蒂秘,老公的妹妹穿的比我還像新娘。我一直安慰自己淘太,他們只是感情好姻僧,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒲牧,像睡著了一般撇贺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冰抢,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天松嘶,我揣著相機與錄音,去河邊找鬼挎扰。 笑死翠订,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遵倦。 我是一名探鬼主播尽超,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梧躺!你這毒婦竟也來了似谁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤燥狰,失蹤者是張志新(化名)和其女友劉穎棘脐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龙致,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蛀缝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了目代。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屈梁。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗤练,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出在讶,到底是詐尸還是另有隱情煞抬,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布构哺,位于F島的核電站革答,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏曙强。R本人自食惡果不足惜残拐,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碟嘴。 院中可真熱鬧溪食,春花似錦、人聲如沸娜扇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雀瓢。三九已至枢析,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刃麸,已是汗流浹背登疗。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嫌蚤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓断傲,卻偏偏與公主長得像脱吱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子认罩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容