AI-For-Beginners/translations/mo/lessons/4-ComputerVision/11-ObjectDetection/README.md

187 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "d85c8b08f6d1b48fd7f35b99f93c1138",
"translation_date": "2025-08-26T09:19:51+00:00",
"source_file": "lessons/4-ComputerVision/11-ObjectDetection/README.md",
"language_code": "mo"
}
-->
# 物件偵測
我們之前討論的影像分類模型,會接收一張圖片並產生一個分類結果,例如在 MNIST 問題中辨識出「數字」這個類別。然而,在許多情況下,我們不僅僅想知道圖片中有什麼物件,還希望能夠確定它們的精確位置。這正是**物件偵測**的核心目標。
## [課前測驗](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/111)
![物件偵測](../../../../../translated_images/Screen_Shot_2016-11-17_at_11.14.54_AM.b4bb3769353287be1b905373ed9c858102c054b16e4595c76ec3f7bba0feb549.mo.png)
> 圖片來源:[YOLO v2 官方網站](https://pjreddie.com/darknet/yolov2/)
## 一個簡單的物件偵測方法
假設我們想在一張圖片中找到一隻貓,一個非常簡單的物件偵測方法可能如下:
1. 將圖片分割成多個小區塊。
2. 對每個區塊進行影像分類。
3. 對於分類結果中激活值足夠高的區塊,認為該區塊包含目標物件。
![簡單的物件偵測](../../../../../translated_images/naive-detection.e7f1ba220ccd08c68a2ea8e06a7ed75c3fcc738c2372f9e00b7f4299a8659c01.mo.png)
> *圖片來源:[練習筆記本](../../../../../lessons/4-ComputerVision/11-ObjectDetection/ObjectDetection-TF.ipynb)*
然而,這種方法遠非理想,因為它只能非常粗略地定位物件的邊界框。若要更精確地定位,我們需要進行某種**回歸分析**來預測邊界框的座標,而這需要特定的數據集。
## 用回歸進行物件偵測
[這篇部落格文章](https://towardsdatascience.com/object-detection-with-neural-networks-a4e2c46b4491)對於偵測形狀提供了一個很好的入門介紹。
## 物件偵測的數據集
在進行物件偵測時,你可能會遇到以下數據集:
* [PASCAL VOC](http://host.robots.ox.ac.uk/pascal/VOC/) - 包含 20 個類別
* [COCO](http://cocodataset.org/#home) - 常見物件上下文數據集,包含 80 個類別、邊界框和分割遮罩
![COCO](../../../../../translated_images/coco-examples.71bc60380fa6cceb7caad48bd09e35b6028caabd363aa04fee89c414e0870e86.mo.jpg)
## 物件偵測的評估指標
### 交集比聯集 (Intersection over Union, IoU)
在影像分類中,衡量演算法表現相對簡單;但在物件偵測中,我們需要同時衡量類別的正確性以及推測邊界框位置的精確性。後者使用所謂的**交集比聯集 (IoU)** 來衡量,這是一種用來評估兩個框(或任意兩個區域)重疊程度的指標。
![IoU](../../../../../translated_images/iou_equation.9a4751d40fff4e119ecd0a7bcca4e71ab1dc83e0d4f2a0d66ff0859736f593cf.mo.png)
> *圖片來源:[這篇優秀的 IoU 部落格文章](https://pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/)*
概念很簡單將兩個區域的交集面積除以它們的聯集面積。對於完全相同的區域IoU 值為 1對於完全不相交的區域IoU 值為 0其他情況下IoU 值介於 0 到 1 之間。我們通常只考慮 IoU 超過某個閾值的邊界框。
### 平均準確率 (Average Precision, AP)
假設我們想衡量某個類別 $C$ 的物件被識別的效果。為此,我們使用**平均準確率 (AP)** 指標,其計算方式如下:
1. 繪製準確率-召回率曲線,顯示準確率隨檢測閾值(從 0 到 1的變化。
2. 根據閾值,我們會在圖片中檢測到更多或更少的物件,並得到不同的準確率和召回率值。
3. 曲線看起來如下:
<img src="https://github.com/shwars/NeuroWorkshop/raw/master/images/ObjDetectionPrecisionRecall.png"/>
> *圖片來源:[NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)*
對於給定類別 $C$ 的平均準確率是該曲線下的面積。更精確地說,召回率軸通常被分成 10 個部分,並對這些點的準確率取平均值:
$$
AP = {1\over11}\sum_{i=0}^{10}\mbox{Precision}(\mbox{Recall}={i\over10})
$$
### AP 與 IoU
我們只考慮那些 IoU 超過某個閾值的檢測結果。例如,在 PASCAL VOC 數據集中,通常假設 $\mbox{IoU Threshold} = 0.5$;而在 COCO 數據集中AP 是針對不同的 $\mbox{IoU Threshold}$ 值進行測量的。
<img src="https://github.com/shwars/NeuroWorkshop/raw/master/images/ObjDetectionPrecisionRecallIoU.png"/>
> *圖片來源:[NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)*
### 平均平均準確率 (Mean Average Precision, mAP)
物件偵測的主要評估指標是**平均平均準確率 (Mean Average Precision, mAP)**。它是所有物件類別的平均準確率,有時也包括不同 $\mbox{IoU Threshold}$ 的平均值。更詳細的 mAP 計算過程可以參考[這篇部落格文章](https://medium.com/@timothycarlen/understanding-the-map-evaluation-metric-for-object-detection-a07fe6962cf3)),以及[這裡的程式碼範例](https://gist.github.com/tarlen5/008809c3decf19313de216b9208f3734)。
## 不同的物件偵測方法
物件偵測演算法大致可分為兩大類:
* **區域提議網路 (Region Proposal Networks)**(如 R-CNN、Fast R-CNN、Faster R-CNN。主要思想是生成**感興趣區域 (ROI)**,並對其執行 CNN尋找最大激活值。這與簡單方法有些類似但 ROI 是以更聰明的方式生成的。這類方法的主要缺點是速度較慢,因為需要對圖片進行多次 CNN 分類。
* **單次通過 (One-pass)** 方法(如 YOLO、SSD、RetinaNet。這些架構設計成在一次通過中同時預測類別和 ROI。
### R-CNN: 基於區域的 CNN
[R-CNN](http://islab.ulsan.ac.kr/files/announcement/513/rcnn_pami.pdf) 使用[選擇性搜索 (Selective Search)](http://www.huppelen.nl/publications/selectiveSearchDraft.pdf)生成 ROI 區域的層次結構,然後通過 CNN 特徵提取器和 SVM 分類器來確定物件類別,並使用線性回歸確定*邊界框*座標。[官方論文](https://arxiv.org/pdf/1506.01497v1.pdf)
![RCNN](../../../../../translated_images/rcnn1.cae407020dfb1d1fb572656e44f75cd6c512cc220591c116c506652c10e47f26.mo.png)
> *圖片來源van de Sande et al. ICCV11*
![RCNN-1](../../../../../translated_images/rcnn2.2d9530bb83516484ec65b250c22dbf37d3d23244f32864ebcb91d98fe7c3112c.mo.png)
> *圖片來源:[這篇部落格](https://towardsdatascience.com/r-cnn-fast-r-cnn-faster-r-cnn-yolo-object-detection-algorithms-36d53571365e)*
### F-RCNN - 快速 R-CNN
這種方法與 R-CNN 類似,但區域是在卷積層應用後定義的。
![FRCNN](../../../../../translated_images/f-rcnn.3cda6d9bb41888754037d2d9763e2298a96de5d9bc2a21db3147357aa5da9b1a.mo.png)
> 圖片來源:[官方論文](https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Girshick_Fast_R-CNN_ICCV_2015_paper.pdf)[arXiv](https://arxiv.org/pdf/1504.08083.pdf)2015
### Faster R-CNN
這種方法的主要思想是使用神經網路來預測 ROI即所謂的*區域提議網路 (Region Proposal Network)*。[論文](https://arxiv.org/pdf/1506.01497.pdf)2016
![FasterRCNN](../../../../../translated_images/faster-rcnn.8d46c099b87ef30ab2ea26dbc4bdd85b974a57ba8eb526f65dc4cd0a4711de30.mo.png)
> 圖片來源:[官方論文](https://arxiv.org/pdf/1506.01497.pdf)
### R-FCN: 基於區域的全卷積網路
這種演算法比 Faster R-CNN 更快。主要思想如下:
1. 使用 ResNet-101 提取特徵。
2. 特徵經過**位置敏感分數圖 (Position-Sensitive Score Map)** 處理。每個來自 $C$ 類別的物件被劃分為 $k\times k$ 區域,並訓練網路預測物件的各部分。
3. 對於 $k\times k$ 區域中的每個部分,所有網路對物件類別進行投票,選擇得票最多的類別。
![r-fcn image](../../../../../translated_images/r-fcn.13eb88158b99a3da50fa2787a6be5cb310d47f0e9655cc93a1090dc7aab338d1.mo.png)
> 圖片來源:[官方論文](https://arxiv.org/abs/1605.06409)
### YOLO - You Only Look Once
YOLO 是一種實時單次通過演算法。主要思想如下:
* 將圖片劃分為 $S\times S$ 區域。
* 對於每個區域,**CNN** 預測 $n$ 個可能的物件、*邊界框*座標以及*置信度*=*概率* * IoU。
![YOLO](../../../../../translated_images/yolo.a2648ec82ee8bb4ea27537677adb482fd4b733ca1705c561b6a24a85102dced5.mo.png)
> 圖片來源:[官方論文](https://arxiv.org/abs/1506.02640)
### 其他演算法
* RetinaNet: [官方論文](https://arxiv.org/abs/1708.02002)
- [PyTorch 實現](https://pytorch.org/vision/stable/_modules/torchvision/models/detection/retinanet.html)
- [Keras 實現](https://github.com/fizyr/keras-retinanet)
- [Keras 範例中的 RetinaNet](https://keras.io/examples/vision/retinanet/)
* SSD (單次檢測器): [官方論文](https://arxiv.org/abs/1512.02325)
## ✍️ 練習:物件偵測
繼續學習以下筆記本:
[ObjectDetection.ipynb](../../../../../lessons/4-ComputerVision/11-ObjectDetection/ObjectDetection.ipynb)
## 結論
在這節課中,你快速瀏覽了各種實現物件偵測的方法!
## 🚀 挑戰
閱讀以下文章和筆記本,並嘗試實作 YOLO
* [優秀的部落格文章](https://www.analyticsvidhya.com/blog/2018/12/practical-guide-object-detection-yolo-framewor-python/) 描述 YOLO
* [官方網站](https://pjreddie.com/darknet/yolo/)
* YOLO: [Keras 實現](https://github.com/experiencor/keras-yolo2)[逐步筆記本](https://github.com/experiencor/basic-yolo-keras/blob/master/Yolo%20Step-by-Step.ipynb)
* YOLO v2: [Keras 實現](https://github.com/experiencor/keras-yolo2)[逐步筆記本](https://github.com/experiencor/keras-yolo2/blob/master/Yolo%20Step-by-Step.ipynb)
## [課後測驗](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/211)
## 複習與自學
* [物件偵測](https://tjmachinelearning.com/lectures/1718/obj/) by Nikhil Sardana
* [物件偵測演算法的良好比較](https://lilianweng.github.io/lil-log/2018/12/27/object-detection-part-4.html)
* [深度學習物件偵測演算法回顧](https://medium.com/comet-app/review-of-deep-learning-algorithms-for-object-detection-c1f3d437b852)
* [基本物件偵測演算法的逐步介紹](https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introduction-to-the-basic-object-detection-algorithms-part-1/)
* [用 Python 實現 Faster R-CNN 進行物件偵測](https://www.analyticsvidhya.com/blog/2018/11/implementation-faster-r-cnn-python-object-detection/)
## [作業:物件偵測](lab/README.md)
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對於因使用此翻譯而引起的任何誤解或錯誤解讀概不負責。