引言
你有沒有想過,當你用手機拍一張照片,里面的人、車、狗是怎么被自動識別出來的?這背后靠的就是目標檢測技術。目標檢測是計算機視覺中的一個重要領域,它不僅要回答“圖片里有什么”,還要告訴你“這些東西在哪里”。今天,我們要聊的是目標檢測領域的兩個經典模型:YOLOv1 和 YOLOv2。它們的名字聽起來很酷——“You Only Look Once”(你只看一次),不僅名字帥,性能也很強。這篇博客將帶你走進 YOLO 的世界,聊聊它們的原理、區別,以及那些聽起來高大上的概念,比如 mAP、FPS、IoU 等。我們會盡量用大白話解釋,并在后面深入講解數學公式和代碼實現,讓你輕松看懂!
第一部分:YOLOv1——目標檢測的“快男”
YOLOv1 的誕生
YOLOv1 是 2015 年由 Joseph Redmon 等人提出的,它最大的特點就是“快”。在它之前,很多目標檢測模型(比如 R-CNN 系列)需要先找“可能有東西”的區域(region proposal),再去分類,這樣速度很慢。而 YOLOv1 說:“我不要兩步走,我要一步到位!”它把目標檢測看成一個回歸問題,直接從整張圖片預測出物體的位置和類別。
YOLOv1 的原理
想象你在玩一個游戲,面前有一張網格地圖,地圖被分成 7×7 的小格子。你的任務是:每個格子告訴我,里面有沒有東西(比如人、車、貓),如果有,它是什么,在格子里的具體位置是哪兒。YOLOv1 就是這么干的。它把圖片分成 S×S 的網格(默認是 7×7),每個格子負責預測:
- 有沒有物體(用一個概率值表示,叫做“置信度”)。
- 物體的邊界框(bounding box,用 4 個數字表示:中心點 x、y 坐標,寬度 w,高度 h)。
- 物體是什么類別(比如 20 個類別,就預測 20 個概率值)。
每個格子可以預測 B 個邊界框(YOLOv1 里 B=2),所以一張圖片總共預測 S×S×B 個邊界框。最終,模型會輸出一個巨大的張量(tensor),比如 7×7×30(后面會解釋為什么是 30)。
網絡架構
YOLOv1 的網絡靈感來自 GoogleNet,用了 24 個卷積層(卷積層就像是圖片的“特征提取器”)和 2 個全連接層(全連接層負責把特征整合起來做預測)。輸入一張 448×448 的圖片,經過層層卷積,最后輸出 7×7×30 的張量。為什么是 30 呢?因為每個格子預測 2 個邊界框(每個框有 5 個數:x, y, w, h + 置信度),加上 20 個類別的概率,所以是 2×5 + 20 = 30。
損失函數詳解
損失函數是模型的“老師”,告訴它預測得好不好。YOLOv1 的損失函數有三部分,我們來詳細拆解一下:
別被公式嚇到,我們拆解開來看。
通俗解釋
簡單說,YOLOv1 的損失函數就像一個評分表:框的位置準不準(定位),有沒有物體猜得對不對(置信度),類別分得清不清楚(分類)。通過調整權重(𝜆coordλcoord? 和 𝜆noobjλnoobj?),讓模型更關注框的位置,而不是過多懲罰沒物體的格子。
優點與缺點
- 優點:快!因為只看一次圖片,FPS(每秒幀數)能達到 45,比 R-CNN 快得多。
- 缺點:準度不夠高。因為每個格子只能預測 2 個框,小物體或密集物體容易漏掉,mAP(平均精度均值)只有 63.4% 左右。
第二部分:YOLOv2——更快更準的升級版
YOLOv2 的誕生
YOLOv1 雖然快,但精度不高,漏檢多。于是 2016 年,團隊推出了 YOLOv2(也叫 YOLO9000),目標是“更快、更準、能識別更多東西”。YOLOv2 不僅改進了架構,還能識別 9000 種物體,簡直是“全能選手”。
YOLOv2 的原理
YOLOv2 保留了“只看一次”的核心思想,但做了很多改進。比如,它不再固定用 7×7 網格,而是引入了錨框(anchor boxes)。錨框是什么?想象你在超市買東西,每個貨架上有不同形狀的盒子,YOLOv2 會先猜一些“標準盒子”(錨框),然后根據這些盒子微調出真實的邊界框。這樣,每個格子可以預測更多框(默認 5 個),小物體和密集物體檢測效果更好。
網絡架構
YOLOv2 拋棄了 GoogleNet,設計了一個新網絡叫 Darknet-19。它有 19 個卷積層和 5 個池化層,輸入圖片大小變成了 416×416(不是 448×448 了),輸出是 13×13 的網格。為什么是 13×13?因為 416 除以 32(卷積過程中的步幅)剛好是 13。每個格子預測 5 個錨框,輸出張量變成了 13×13×(5×(5+類別數))。
損失函數詳解
YOLOv2 的損失函數和 YOLOv1 類似,但優化了細節:
解釋一下:
通俗解釋
YOLOv2 的損失函數更聰明了。它不再直接預測框的位置,而是預測相對于錨框的偏移量,這樣模型更容易學到規律。置信度也更依賴 IoU,讓“框得好不好”更科學。
新特性
- Batch Normalization:加在卷積層后,加速訓練,提升精度。
- 高分辨率訓練:先用低分辨率訓練,再切換到高分辨率。
- 多尺度訓練:隨機調整輸入大小(比如 320×320 到 608×608)。
優點與缺點
- 優點:精度提升到 mAP 78.6%,FPS 還能保持 67,實時性超強。
- 缺點:對極小物體仍不夠敏感,復雜場景下仍有改進空間。
第三部分:YOLOv1 vs YOLOv2——全方位對比
網絡架構
- YOLOv1:24 個卷積層 + 2 個全連接層,輸入 448×448,輸出 7×7 網格。
- YOLOv2:Darknet-19(19 個卷積層),輸入 416×416,輸出 13×13 網格,去掉全連接層。
損失函數
- YOLOv1:直接預測坐標,權重不平衡。
- YOLOv2:預測錨框偏移量,用 IoU 優化置信度。
檢測能力
- YOLOv1:2 個框/格子,適合大物體。
- YOLOv2:5 個錨框/格子,小物體檢測更好。
性能指標
- FPS:YOLOv1 約 45,YOLOv2 高達 67。
- mAP:YOLOv1 為 63.4%,YOLOv2 提升到 78.6%。
第四部分:概念掃盲——mAP、FPS、IoU 等
mAP(平均精度均值)
mAP 是“總成績”,先算每個類別的 AP(精度-召回率曲線下面積),再平均。越高越好。
FPS(每秒幀數)
FPS 是速度指標,越高越適合實時應用。
精準率(Precision)和召回率(Recall)
- 精準率:預測對的占預測總數的比例。
- 召回率:找到的占真實總數的比例。
IoU(交并比)
IoU = 重疊面積 / 總面積,衡量框的準度。
YOLOv1 和 YOLOv2 是目標檢測的里程碑。YOLOv1 用“快”打開新思路,YOLOv2 在速度和精度上找到平衡。
第五部分:代碼示例
from ultralytics import YOLO# 加載預訓練的YOLO模型
model = YOLO('yolov8n.pt') # 使用YOLOv8 nano模型,適合輕量級應用# 進行目標檢測
results = model('image.jpg') # 輸入圖像文件路徑# 處理檢測結果
for result in results:boxes = result.boxes # 獲取檢測框for box in boxes:x, y, w, h = box.xywh[0] # 獲取坐標和寬高conf = box.conf.item() # 獲取置信度cls = box.cls.item() # 獲取類別print(f"檢測到目標:類別={cls}, 置信度={conf:.2f}, 坐標=({x:.1f}, {y:.1f}), 寬高=({w:.1f}, {h:.1f})")# 可視化結果(保存或顯示)
results[0].save() # 保存帶檢測框的圖像
以上是一個簡單的Python代碼示例,直接調用YOLO庫進行目標檢測,強調應用場景(如監控或自動駕駛)。