電腦視覺-物件偵測-影像標註

AI.FREE
12 min readApr 18, 2021

關鍵字: Object Detection, Custom Dataset, YOLO, LabelImg, Bounding Box

0. Promise: 在看完這篇文章後,將會了解:

  1. 取得標註工具 : LabelImg
  2. 操作 LabelImg
  3. 解讀 LabelImg 產生的 — Bounding Box — 資料
  4. 其實在標註自己的 Dataset 前,你也可以考慮 …

1. Preface: 前言

目前的 YOLO 已經來到第5代了(i.e., YOLOv5),表示它的應用需求相當廣泛。從它的命名就可以知道這是一個相當注重 Efficiency 的模型,YOLO 意思是 You Only Look Once (你只需要看一次),其中 Once 這個想法就是模型設計時的核心概念,所以有其對應的設計巧思。最後結果確實也在不失準確度的情況下,達到高效率的表現,這點我們會於未來和大家一起細細品味 YOLO 的論文!

而在訓練一個模型前,我們會需要準備好相對應的資料,有些任務所需要的資料集能夠在網路上找到(可以參考此篇文章最後的一節),而也會有任務是需要我們自己準備照片/影片,自己框選出相對應的 Bounding Box,才能進到模型訓練的階段。上述的第二種 Case,即是本篇文章所會討論到的。

2. Setup Tool — LabelImg: 準備標註工具

根據電腦系統的不同(Linux, MacOS, Windows),以及個人的喜好,一共有至少五種的方式能夠取得此工具並開始使用。在此介紹兩種方式:

  • 下載對應 Windows 的壓縮檔
  • Windows + Anaconda + Follow Cmd

下載對應 Windows 的壓縮檔

Step 1: 前往 LabelImg Download List [Link]

Step 2: 找到 Windows 最新版本,點擊下載壓縮檔

  • 以這邊的例子而言是 Windows_v1.8.0
  • 下載後,可以看到一個壓縮檔。

Step 3: 解壓縮檔案

  • 解壓縮 Step 2 中的壓縮檔即可看到以下資料夾。

Step 4: 進入資料夾中,開啟 labelImg,即可以看到操作介面了。

Windows + Anaconda + Follow Cmd

Step 1: 前往 LabelImg 的 Github Repo 準備複製對應 Cmd [Link]

  • 點選此 Step 對應連結,可以看到 LabelImg 的 Github Repo,大家可以順手按個星星支持一下這個方便好用的工具喔!
可以發現作者方面一直有在維護此 Project,很多 Commit 都是近一個月內的。
  • 往下滑動,找到於 Windows + Anaconda 安裝的部份。

Step 2: 準備好 Anaconda

  • 想要執行上面的 Cmd,會需要先準備 Anaconda 工具包,如果電腦環境還沒有 Anaconda 請至 Anaconda 官方網站下載。[Link]

Step 3: Clone 此專案

  • 開啟任何 Cmd Tool,像是已經下載好的 Anaconda Prompt。
  • Clone 此專案須執行以下指令
git clone https://github.com/tzutalin/labelImg.git
實際執行情況
  • 即可以在目標路徑(ex: Desktop)得到以下資料夾 — labelImg/

Step 4: 執行 Github Repo 上提到的 Cmd

  • 開始安裝必要套件前,先 cd 進去 labelImg 資料夾內。
cd labelImg
  • 我們等等會需要在此 Step 中操作到 Step 2 圖片中看見的 Cmd,為方便大家複製貼上,在下方我們準備一模一樣的 Cmd。
conda install pyqt=5 
conda install -c anaconda lxml
pyrcc5 -o libs/resources.py resources.qrc
python labelImg.py
  • 執行第一步
conda install pyqt=5
  • 執行第二步
conda install -c anaconda lxml
  • 執行第三步
pyrcc5 -o libs/resources.py resources.qrc
  • 執行第四步,即可以看到 labelImg 操作介面
python labelImg.py

3. Tool Usage: 使用標註工具

Step 1 : 將需要標註的資料準備好。

  • 貓和狗的圖片各3張,我選擇放在同一個資料夾內(ex: animals/)。

Step 2: 調整預測類別。

  • 不管在第二步驟是使用哪種方法 Setup 好 LabelImg,都可以在其中找到 Data 這個資料夾。
  • 進入 Data 資料夾後,有一個原有的預設 predefined_classes.txt,我們使用此規範 Object 的種類有哪些。
  • 所以開啟 predefined_classes.txt,我們可以進行編輯。
編輯前
編輯後

Step 3: 操作 LabelImg

  • 開啟 labelImg
  • 選擇 Open Dir,開啟於第一步準備好的資料夾(ex: animals/)。
  • 假設目的為使用 YOLO 作為訓練模型,那就需要切換標註模式至「YOLO」。
點擊 PascalVOC 之前的畫面
點選之後看到的畫面
  • 框選完畢後,labelImg 會立即跳出 Label 選項,在此可以發現,上面的選項會對應到編輯過後的 predefined_classes.txt 內容。接著選擇目標 Label (ex: cat),點選 OK。
  • 接著就可以點選左側的 Save,將我們標註的結果(Bounding Box 的 information)儲存起來。
在此示範中,我將存放影像的資料夾(ex: animals/)做為存放 annotation 的路徑。
  • 開啟存放影像的資料夾(ex: animals/),可以發現有與檔名對應的 txt 檔案自動生成。
  • 完成了第一張影像的標記,我們回到 LabelImg 的操作介面,點選左側的 Next Image,即可以切換到下一張繼續標記。
  • 最終,所有檔案都標記完成後,就可以有類似於以下的結果了。
  • 除了提供 classes.txt 紀錄我們使用了哪些 Class (ex: dog, cat)之外,可以發現每張照片都有對應的 txt 檔案描述 Bounding Box 的資訊,我們於下一個 Section 討論如何解讀 Bounding Box 的資料格式。

4. Output Recognization: 解讀 B. Box 資料格式

在這裡我們同時觀察下圖三件事情:

  1. LabelImg 開啟 Dog3.jpg 的畫面
  2. Dog3.txt 的內容
  3. classes.txt 的內容

Dog3.txt 當中的 Bounding Box Information 如下

  • 1,0.480612,0.601361,0.773469,0.651701
  • 每個 Bounding Box 都會有 5 個資訊,分別對應到上面這五個數值。

第一個資訊: 「1」

  • 類別(Label),其資訊可以於 classes.txt 查看。
  • 是 cat 或是 dog,如果是 cat 那就是 0,如果是 dog 那就是 1,若還有其他那就是 3, 4, …
  • 理解: 「1」 表示這個 B. Box 所框選的是 Dog。

第二個資訊: 「0.480612」

  • X-center: 表示 Bounding Box 中心坐標 X 在整張照片的位置。
  • 數值介於 0 ~ 1,因為 X-Center Pixel Value 有除以整張影像的「寬度」。
  • 理解: 「0.480612」表示這個 B. Box 的 X-Center 落在整張照片的中間偏左邊一點點。

第三個資訊:「0.601361」

  • Y-center: 表示 Bounding Box 中心坐標 Y 在整張照片的位置。
  • 數值介於 0 ~ 1,因為 Y-Center Pixel Value有再除以整張影像的「高度」。
  • 理解:「0.601361」表示這個 B. Box 的 Y-Center 落在中間偏上的位置。

第四個資訊:「0.773469」

  • B. Box Width: 表示 Bounding Box 有多寬。
  • 數值介於 0 ~ 1,因為 B. Box Width 有除以整張影像的「寬度」。
  • 理解: 「0.773469」表示這個 B. Box 的寬度涵蓋影像 7~8 成的區域。

第五個資訊: 「0.651701」

  • B. Box Height: 表示 Bounding Box 有多長。
  • 數值介於 0 ~ 1,因為 B. Box Width 有除以整張影像的「高度」。
  • 理解: 「0.651701」表示這個 B. Box 的長度涵蓋影像 6~7 成的區域。

用這5個資訊就能夠描述一個 Bounding Box 了,最後用一張簡單的示意圖歸納上方所述。

注意:

  • x, y, w, h 因為都有除以影像高度及寬度,所以都是落在 0~1 之間。
  • 綠色框框表示對應的 Label。

5. Existing Datasets: 既存的數據集

其實在標註自己的 Dataset 前,也可以考慮再多花一些時間找找看網路上有沒有一些現成的資料庫可以使用,蒐集資料並標註資料都是相當花費時間和心力的工作,以下的一些 Datasets 都是可以免費 Access 的,推薦大家在標記資料前花些時間看看喔,說不定就會挖到寶!

COCO: Common Objects in Context [Link]

  • 上圖為 COCO Dataset 在 Object Detection 所擁有的 80 種類別。
  • 可以利用網頁的 Search 找看看有興趣的類別,圖中以 p 為例做搜尋。
  • 其實 YOLO 目前使用的 Darknet 即是使用 COCO Dataset 作為訓練資料集,所以若是你發現COCO裡面有你有興趣的Object,那麼恭喜你! 你可以直接 Clone 當前的 YOLO 然後很快的在你的目標任務中取得一定表現了。

Open Images [Link]

於首頁展示其數據的龐大以及多元:

  • 龐大: 數據量是 million 等級的。
  • 多元: 涵蓋 Object Detection, Image Segmentation, Visual Relationship 深度學習影像處理任務
  • 點選首頁左下方的 Explore,即可進入下方圖片介面。
  • 於左上角調整 Type 選項至 Detection
  • 於正上方 Category 輸入有興趣的類別: 如 Person
  • 即可以看到網頁上既存的標記結果了。

在此先介紹兩個好用的數據集,希望大家都能找到對自己有幫助的數據集,未來我們也會再陸續介紹其他能在線上 Access 到的既存數據集。

6. Warp-up: 回頭看看 Promise,做個結尾。

  1. 取得標註工具 : LabelImg
  2. 操作 LabelImg
  3. 解讀 LabelImg 產生的 — Bounding Box — 資料
  4. 其實在標註自己的 Dataset 前,你也可以考慮線上的既存資料夾

希望本篇內容對大家有幫助,如果大家有任何想法,歡迎在留言區留下意見,我們會第一時間回覆大家,先和大家說謝謝指教了! 我們是 AI.FREE,我們下篇文章見!

Online Resources: 本篇文章使用到的網路資源

  • [Link] YOLO Meme
  • [Link] LabelImg Download List
  • [Link] tzutalin/labelImg Github Repo
  • [Link] Anaconda | Individual Ediion
  • [Link] COCO Explorer
  • Animal Image:
    [Link] Cat1,[Link] Cat2,[Link] Cat3,
    [Link] Dog1,[Link] Dog2,[Link] Dog3

--

--