1. 程式人生 > >YOLO演算法學習總結

YOLO演算法學習總結

    之前在吳恩達的課程上接觸到了YOLO的原理及簡單實現,上一週對YOLO演算法進行了學習,現將個人的學習心得及學習結果記錄如下。

1.YOLO簡介:

人類視覺系統快速且精準,只需瞄一眼(You Only Look Once)即可識別影象中物品及其位置。作者用了You Only Look Once的首字母YOLO來表示其演算法,相當有趣。YOLO為一種新的目標檢測方法,該方法的特點是實現快速檢測的同時還達到較高的準確率。作者將目標檢測任務看作目標區域預測和類別預測的迴歸問題。該方法採用單個神經網路直接預測物品邊界和類別概率,實現端到端(end to end)的物品檢測。同時,該方法檢測速非常快,基礎版可以達到45幀/s的實時檢測;FastYOLO可以達到155幀/s。與當前最好系統相比,YOLO目標區域定位誤差更大,但是背景預測的準確性優於當前最好的方法。

YOLO的網路結構:模型採用卷積神經網路結構。開始的卷積層提取影象特徵,全連線層預測輸出概率。模型結構類似於GoogleNet,如圖3所示。作者還訓練了YOLO的快速版本(fast YOLO)。Fast YOLO模型卷積層和filter更少。最終輸出為7×7×30的tensor。


2.參考原始碼及執行環境:

這裡用到的YOLO演算法的實現程式碼源於https://github.com/hizhangp/yolo_tensorflow

執行環境:Windows+顯示卡MX150+python3.6.5+tensorflow1.8

3.專案詳解:

最近被安利了一個好用的IDE——Pycharm,先用他看看我們的專案檔案結構:


  在作者貼出的連結處下載權重檔案,兩次解壓後得到YOLO_small.ckpt的權重檔案,放到weights資料夾中,完成準備工作。由於本人筆記本的渣渣配置,用CPU或者MX150進行訓練的過程會非常地長,故直接跳過train的過程,直接執行test.py。準備工作和執行過程出現了若干錯誤,在baidu的幫助下一一解決了。

下面看看執行結果:

首先是作者給出的兩張照片:


and

可以看到,演算法能夠較準確地檢測出真實圖片的人物或者動物;突發奇想測試一下動漫人物:


可以看到,雖然也能識別,但是效果不如剛才。對作者的程式碼稍加改動,看看演算法對攝像頭實時檢測的效果:


由於顯示卡效能問題,無法做到實時檢測,每秒只有2.5幀。


4.程式碼分析:

  1. config.py 這部分程式主要是用來定義網路中的一些整體結構引數
  2. yolo_net.py 這部分的主要作用是利用 cfg 檔案對網路引數進行初始化,計算 Loss,計算兩個 bounding box 之間的 IoU,實現了 yolo 網路模型的構成,可以清楚的看到網路的組成,而且為了使程式更加簡潔,構建網路使用的是 TensorFlow 中的 slim 模組。
  3. train.py 這部分程式碼主要實現的是對已經構建好的網路和損失函式利用資料進行訓練,在訓練過程中,對變數採用了指數平均數(exponential moving average (EMA))來提高整體的訓練效能。同時,為了獲得比較好的學習效能,對學習速率同向進行了指數衰減,使用了 exponential_decay 函式來實現這個功能。
  4. test.py 這部分的主要內容就是利用訓練好的權重進行預測,得到預測輸出後利用 OpenCV 的相關函式進行畫框等操作。同時,還可以利用 OpenCV 進行視訊處理,使程式能夠實時地對視訊流進行檢測。

5.At Last

yolo_v1 雖然已經能夠對物體進行實時檢測,但是整體上來說,檢測的效果並不是特別好,檢測的類別也比較少,針對這些問題,作者之後還提出了 yolo_v2,以此來對這些問題進行改進。這周的總結就到這裡,下週計劃是FCN網路。