Object Detection 以及淺談 YOLO

ExcitedMail
SWF Lab
Published in
7 min readJul 28, 2022

學長去當兵,接手做事時研究到的東西

Table of Contents

  • Intro.
  • Object Detection Method
  • Sliding Window
  • Region Proposal
  • YOLO Intro.
  • YOLO Tutorial

Intro.

在 Computer Vision 的領域中,有一項熱門的領域稱為 Object Detection ,簡單來說,是將圖片或影片的物體辨識出來,以下面兩張圖為例,上面為原圖,下面為經過 YOLO algorithm 處理後的樣子。

Origin
Taiwan Street Image
Result
Running detection by YOLO algorithm

Object Detection Method

過去曾陸續發展多種不同類型的 Objection Detection 方法,不過都受限於當時的技術,當時對於單一物體辨識的技術已經成熟,也就是電腦可以對一張圖提出一個結果,例如下圖,電腦可以準確的辨識該圖為何,但一張圖中不一定只有一個物體,如何抓出所有物體便成為當時的挑戰。以下簡單舉例兩種,分別為 Sliding Window 以及 Region Proposal 。

Image Classification
Image Classification

Sliding Window

這種方法最直觀簡單,透過視窗不斷往旁邊移動,只要辨識到物體便做紀錄,不過這種方法過於緩慢,比如說視窗的大小不一定能正好框住物體,所以我們可能需要多種大小的視窗移動,並且移動的幅度不能太大,以免在視窗大小合適的情況下沒有適當的框住物體,總的下來導致電腦需要對許多影像進行辨識,必須花費許多時間。

Sliding Window

Region Proposal

這種方法就聰明許多,他的核心概念為抓出哪些地方有物體,再來對這些物體做辨識,下圖為範例,接著會解釋如何辦到。

Region Proposal

Region Proposal 會先將圖片照顏色分成許多區塊,鄰近且顏色相近的色彩會分為同一區塊,並且不斷偵測相鄰的區塊是否可能為同一物體,這個步驟的變化性就比較大了,可能透過紋理或是色彩決定是否合併。經過多次的合併之後,電腦就只要對這些不同區塊的圖片進行辨識即可,比起 Sliding Window 大幅減少了需要辨識的圖片。

以上兩種方法都受限於只能辨識單一物體的能力,導致需要分成兩個階段來進行 Object Detection ,雖然這種方法也有持續在發展,但接著竄出的 YOLO 搶走了不少風采,以下會簡單解釋 YOLO 如何進行 Object Detection 以及使用教學。

YOLO intro.

撇開單一物體辨識, YOLO 在訓練時就已經把整張圖丟進去訓練,這邊單純講 Object Detection 的部份,訓練的部份不會在這篇文章說明,不過單純辨識的部份也沒辦法單純用語言解釋,配合以下圖片說明。

YOLO
  1. 圖片會先被分成 n*n 的 grids (如左圖)。
  2. 每個 grid 會先回傳 B 個 bounding boxes (如中圖), bounding box 會包含數種資訊如中心座標、長、寬、物體種類、信心分數,不會只傳一個是因為一個 grid 可能有多個物體。
  3. 接著 YOLO 會將同種類且重疊的 bounding boxes 計算 IOU (Intersection over Union),刪除重疊區域超過某個 threshold 的,避免同一個物體有許多 Bounding box 重複計算,同時避免兩個不同物體被偵測為同一物體(例如兩個站位接近的人),最後將結果輸出(如右圖)。

以上即為 YOLO 辨識的方式,不同於過去的方法只回傳物體的類型以及信心分數, YOLO 訓練時就要求回傳 bounding box的大小及位置。

YOLO Tutorial

對於想要嘗試看看的人,這邊簡單教學,實際執行情況會根據設備而有不同。

1. 首先你可能需要準備一台有 linux 系統的裝置,虛擬機或是 WSL 都可以。

2. 先創好一個你想要拿來玩 YOLO 的資料夾。

3. 透過 terminal 進到剛剛創的資料夾內,執行以下 bash 來把 YOLO 的程式碼下載下來,進到資料夾內並編譯。

git clone https://github.com/AlexeyAB/darknet
cd darknet
make

4. 接著我們需要把 pre-trained weight 下載下來,也就是別人訓練好的檔案,同樣執行 bash。

wget https://pjreddie.com/media/files/yolov3.weights 

5. 接著我們把 darknet 底下的 Makefile 打開,把最上面幾行的 GPU 及 OPENCV 設為 1 來啟用他們。

6. 接著對 data/ 中的圖片做預測,經過一段時間後就可以在 darknet/ 中看到一個名為 predictions.jpg 的檔案。

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

恭喜你完成了第一次 YOLO 使用,不過人們沒有這麼容易滿足,接下來我們對影片做測試,先隨便抓個影片丟入 data/ 中再往下做吧!

7. 執行以下的 bash 來對你下載的影片做辨識吧,記得把檔案名改成你自己下載的名字(副檔名如 .mp4 .avi 也要輸入),至於輸出就隨你開心,也可以另外創資料夾把結果丟進去。

./darknet detector demo cfg/coco.data yolov3.cfg yolov3.weights data/<input_filename> -out_filename <output_filename>

完成了嗎?反正我是完成了,成果大致像以下那樣,希望你也成功了。

知名實況主面臨財務危機,辛酸打工畫面流出

另外其實也可以直接連接視訊鏡頭執行,不過我手邊正好沒有,將 bash 放在這邊,有興趣的人可以試試看。

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

以上的教學基本上都來自於這個網站,不過 clone 的網址改成這個討論串,如此才能將影片存下來。

祝各位順利ㄌ~我也要繼續弄實驗室的事情ㄌ~

--

--