SSD簡單相關介紹
對于SSD,SSD(SSD: Single Shot MultiBox Detector)是采用單個深度神經網絡模型實作目标檢測和識别的方法。該方法是綜合了Faster R-CNN的anchor box和YOLO單個神經網絡檢測思路,進而既有Faster R-CNN的準确率又有YOLO的檢測速度,可以實作高準确率實時檢測。本文解析的是SSD的tensorflow實作源碼,來源balancap/SSD-Tensorflow
其性能表現如下:
Model Training data Testing data mAP FPS
SSD-300 VGG-based VOC07+12 trainval VOC07 test 0.778 -
SSD-300 VGG-based VOC07+12+COCO trainval VOC07 test 0.817 -
SSD-512 VGG-based VOC07+12+COCO trainval VOC07 test 0.837 -
更多關于SSD網絡關鍵源碼解析
本文目标
1、可以将github上SSD-Tensorflow作者源碼例子跑起來。
2、對SSD-Tensorflow加深認識
1、開始配置環境
部落客大人所用環境:
- ubuntu 16.04
- python3.5
- opencv3.3
- tensorflow1.3
- cuda8.0
- cudnn6
- 等等
Tensorflow的安裝有點麻煩,安裝方法官網有詳細介紹。
這裡想簡單說一下:
1、先按官網要求安裝好依賴環境,如
$ sudo apt-get install python-pip python-dev python-virtualenv # for Python 2.7
$ sudo apt-get install python3-pip python3-dev python-virtualenv # for Python 3.n
基本上就是需要啥安裝啥。
2、通過pip安裝
$ pip install tensorflow # Python 2.7; CPU support (no GPU support)
$ pip3 install tensorflow # Python 3.n; CPU support (no GPU support)
$ pip install tensorflow-gpu # Python 2.7; GPU support
$ pip3 install tensorflow-gpu # Python 3.n; GPU support
這個安裝方法一般都是漫長的,而且本人在安裝過程中中斷幾次(網絡原因),是以我采用了其他方法。
3、通過源碼安裝
$ git clone https://github.com/tensorflow/tensorflow
接下來按照官網給出的步驟進行安裝。
4、是的,還有一種方法,先将tensorflow的pip安裝包下載下傳下來,安裝包位址
下載下傳下來再進行安裝就快多了。
其他環境的配置就不提了。
2、跑起來
如果一切都準備好了,那麼就可以開始下載下傳SSD-Tensorflow源碼了。
官網Readme上提的SSD minimal example是用jupyter 寫的,我們可以将其轉為python,最簡單的方法就是複制過來就可以了。
路徑:
/notebooks/ssd_notebook.ipynb
上圖是直接用簡單編輯器(gedit)打開,崩潰了,很亂,怎麼辦,安裝一個jupyer編輯器(或者在官網上打開該檔案),打開就好看了,既然已經可以在jupyer上打開為什麼還要轉成.py檔案呢?
當然因為python檔案友善我們改寫,jupyer需要一塊一塊執行。
官網直接檢視ssd_notebook.ipynb:
代碼塊:
# Test on some demo image and visualize output.
path = '../demo/'
image_names = sorted(os.listdir(path))
img = mpimg.imread(path + image_names[-5])
rclasses, rscores, rbboxes = process_image(img)
# visualization.bboxes_draw_on_img(img, rclasses, rscores, rbboxes, visualization.colors_plasma)
visualization.plt_bboxes(img, rclasses, rscores, rbboxes)
從路徑path中讀取一張進行識别。結果如下:
識别結果對應的類名為:
class_lable = [
'none',
'aeroplane',
'bicycle',#2
'bird',
'boat',
'bottle',
'bus',
'car',#7
'cat',
'chair',
'cow',
'diningtable',
'dog',#12
'horse',
'motorbike',
'person',#15
'pottedplant',
'sheep',
'sofa',
'train',
'tvmonitor',
'total',
]
這張圖檔原圖是
如果想測試其他圖檔,可以改一下圖檔路徑。
如果想實時檢測視訊(做了跳幀)中的物體。可以做如下修改:
t = 0
cap = cv2.VideoCapture("../demo/nomal.avi")
while(1):
t = t+1
# get a frame
ret, frame = cap.read()
# show a frame
#cv2.imshow("capture", frame)
#img = mpimg.imread(path + image_names[-2])
if t <= 5:
continue
t = 0
b, g, r = cv2.split(frame)
img = cv2.merge([r,g,b])
#img = frame
rclasses, rscores, rbboxes = process_image(img)
visualization.bboxes_draw_on_img(img, rclasses, rscores, rbboxes, visualization.colors_plasma)
r, g, b = cv2.split(img)
img2 = cv2.merge([b,g,r])
cv2.imshow("capture", img2)
#visualization.plt_bboxes(img, rclasses, rscores, rbboxes)
if cv2.waitKey(100) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
這是識别已經錄制好的視訊,如果是實時拍攝的畫面,則需要再改改。