實做Object Detection物件辨識系統 Yolo

郭耀文
Jul 24, 2021

--

用一個淺顯易易懂的方式來教會大家怎麼實際做出一屬於自己的物件辨識系統,可以辨識如:人類、汽車、機車、雨傘 .. 等,80種不同類型的物件。

● 簡述 (Introduction)

隨著AI時代的到來,越來越多事情都能被來取代,如以前如需製作一個入侵偵測系統,傳統的作法可能都是採用圖像式差異比對來進行分析,之前也針對過這類的議題撰寫過文章,有興趣的人可以參考:入侵偵測。之前介紹的SIFT方法(圖像相似度分析)就是屬於傳統的圖像式差異比對方法,雖然該方法簡單快速,但仍存在缺點,如:雖然知道有東西入侵家中,但無法知道入侵的物體是否為貓狗等動物經過,還是真的有人入侵到家中等。因此接下來為大家皆紹的方法為Object Detection(物件辨識)能夠更準確的告訴我們入侵的是什麼物體。

● 前言

接下來會為各位介紹如何實作Object Detection(物件辨識)的方法,此方法是基於AI 物件辨識的一種方法為:Yolo V3。由於Yolo背後是一個複雜的深度深度學習技術,本篇文章不會深入介紹其背後邏輯,而是專注於教大家如何使用Yolo這個方法來應用於實際技術之中。如對Yolo背後技術有興趣的人可以參考:李謦伊撰寫的YOLO演進這篇文章。以下先為各位介紹什麼是Yolo。

● Yolo (You only look once)

Yolo 是屬於物件偵測 (object detection)類神經網路演算法。物件偵測是屬於電腦視覺中比較簡單的任務,可以在一張圖片中找到某些特定的物體,同時物件偵測不僅要求我們識別這些物體的種類,同時要求我們標出這些物體的位置。

物件辨識

Yolo框架運作簡單來說是透過將圖像劃分為網格形式,對每個網格應用圖像分類和定位處理,獲得預測對象的邊界框及其對應的類概率。我在網路上有找到一篇較為淺顯易懂的Yolo算法介紹,各位可以參考一下,文章:一文弄懂YOLO算法

Yolo框架運作

● 實作前準備

簡單介紹完Yolo的基本概念後,接著即進入實作流程。本文章的實作是採用Yolo V3,V3顧名思義是指Yolo第三代意思。而Yolo V3的程式碼來源為Git:YunYang1994/tensorflow-yolov3

以下是我實作時用軟體與硬體規格:

電腦規格
軟體配置

● Yolo V3 安裝與準備

其實進入到YunYang1994/tensorflow-yolov3 網頁上時,就已經有教學文件存在,我這邊就在整理一下流程。

  1. (Clone this file) 首先我們先從YunYang1994/tensorflow-yolov3上下載該Code到我們的電腦內。
  2. 緊接著安裝程式所需的套件,可以透過作者提供的requirements.txt 進行安裝
pip install -r ./docs/requirements.txt

3. 接著我們就要透過coco權重去取得Yolo Model

$ cd checkpoint
$ wget https://github.com/YunYang1994/tensorflow-yolov3/releases/download/v1.0/yolov3_coco.tar.gz
$ tar -xvf yolov3_coco.tar.gz
$ cd ..
$ python convert_weight.py
$ python freeze_graph.py

4. 依據上面步驟執行後,即會獲得yolov3_coco.pb的檔案,此檔案即為Yolo Model

5. 測試程式有否能正常執行,此程式是透過剛剛生成的yolov3_coco.pb Model去辨識./docs/images/road.jpeg的圖片

python image_demo.py

6. 如能正常執行應會出現下圖右邊的圖片。左圖為./docs/images/road.jpeg原圖,經過YOLO Model 辨識後即會標記圖照片中出現的物體(汽車、行人)

至於此Model能辨識出那些物件呢?可以去tensorflow-yolov3/data/classes 內的coco.names 檔案來查看,打開後可以發現總共有80種物體,而這80種物體即為此Model能識別出的物體。

僅列出coco.names內其中23種

那你一定會想問如果我想讓它識別的物體為這80類以外的怎麼辦呢?這肯定是沒問題的,但就是必須自己針對愈辨識得圖片進行標記 與 Training,進而得出屬於自己專屬的Model,但本篇文章不會介紹到標記 與 Training的方法,留到下一篇文章在為各位介紹。

● Yolo V3 應用

接下來要如何將此Model應用於我們場景內呢?。假設我們希望將家中的攝影機接入此Model,並在深夜的時候辨識是否有小偷想闖入家中。這時我們可以透過修改tensorflow-yolov3/video_demo.py 內的程式碼來達成此目標。我這邊先示範由影片來模擬此場景,影片由Youtube上取材(如有侵權請告知會立刻移除),該影片是在說明小偷被攝像機拍到闖入家中並偷走保險箱的影像。我們將影片下載後,命名為Home3.mp4,並放在tensorflow-yolov3-master\docs\images\資料夾下。

並修改video_demo.py程式中的video_path路徑換成剛剛下載的影片Home3.mp4。

PS. 如要將影片改為RTSP攝影機來源可以參考:OpenCV串流攝影機影像改善 VideoCapture 的影像延遲

video_path      = "./docs/images/Home3.mp4"

完成後執行程式碼,變會得到以下結果,發現原本空無一人的物內,突然有小偷跑進來時,隨然是背對鏡頭,但仍能被Yolo正確識別是有人出現在畫面之中。由於Yolo除了物件標記之外,也可以同時取得標記物件的位置與辨識到的物件種類,過此方式能讓我們的系統更靈活應用在各種場景之中。

小偷進入家中

● 結論

透過上述簡單的範例後,我們就能透過AI 物件識別的方式應用在多種場景之中。上述在DEMO影片時可以發現其實可以發現YOLO有時候也會有識別錯誤的情形發生,這種其實也可以透過多種方式去改善,如:1. 重新訓練Model、 2. 調整程式碼的score threshold 、3. 採用更新的YOLO版本(V4),等方式去改善。未來也會再跟大家分享如何自己訓練屬於自己的Yolo Model 與 如何使用Yolo V4等技術。

●參考文獻 & 銘謝:

一文弄懂YOLO算法: https://kknews.cc/zh-tw/code/ror3xrv.html

yolov3程式碼:https://github.com/yunyang1994/tensorflow-yolov3

YOLO演進:https://medium.com/ching-i/yolo%E6%BC%94%E9%80%B2-2-85ee99d114a1

DEMO影片:https://www.youtube.com/watch?v=syCZDe_LSis

--

--

郭耀文

AI project developer、Machine learning、Deep learning