天天看點

SSD-Tensorflow學習

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

SSD-Tensorflow學習

上圖是直接用簡單編輯器(gedit)打開,崩潰了,很亂,怎麼辦,安裝一個jupyer編輯器(或者在官網上打開該檔案),打開就好看了,既然已經可以在jupyer上打開為什麼還要轉成.py檔案呢?

當然因為python檔案友善我們改寫,jupyer需要一塊一塊執行。

官網直接檢視ssd_notebook.ipynb:

SSD-Tensorflow學習

代碼塊:

# 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中讀取一張進行識别。結果如下:

SSD-Tensorflow學習

識别結果對應的類名為:

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',
]           

這張圖檔原圖是

SSD-Tensorflow學習

如果想測試其他圖檔,可以改一下圖檔路徑。

如果想實時檢測視訊(做了跳幀)中的物體。可以做如下修改:

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

這是識别已經錄制好的視訊,如果是實時拍攝的畫面,則需要再改改。

繼續閱讀