目錄
一、YOLOv5核心原理
1. 單階段檢測范式
2. 關鍵技術特性
二、YOLOv5網絡架構組成
1.?Backbone:CSPDarknet53
2.?Neck:PANet(Path Aggregation Network)
3.?Head:檢測頭
三、YOLOv5網絡架構細節
1. 整體架構圖
2. 關鍵模塊參數
四、YOLOv5的創新優化
1. 自適應訓練機制
2. 損失函數設計
3. 輕量化改進(YOLOv5s與YOLOv5x對比)
五、YOLOv5應用場景
總結
手勢識別實戰
一、YOLOv5核心原理
1. 單階段檢測范式
-
回歸式檢測:將目標檢測轉化為單次前向傳播的回歸問題,直接預測邊界框坐標和類別概率。
-
網格劃分策略:輸入圖像被劃分為S×S網格,每個網格單元負責預測中心點落在該區域的目標。
-
多尺度預測:通過不同層級的特征圖預測不同尺寸的目標(大目標用深層特征,小目標用淺層特征)。
2. 關鍵技術特性
技術要點 | 作用描述 |
---|---|
自適應錨框 | 根據訓練數據自動計算最佳錨框尺寸(K-means++改進算法) |
動態損失平衡 | 通過調整分類、置信度、坐標回歸的損失權重(如CIoU Loss優化) |
數據增強策略 | Mosaic增強、MixUp、HSV隨機調整等提升模型泛化能力 |
自適應分辨率 | 支持動態調整輸入圖像尺寸(如640×640或自定義尺寸) |
二、YOLOv5網絡架構組成
YOLOv5網絡由Backbone(主干網絡)、Neck(特征融合層)和Head(檢測頭)三部分組成:
1.?Backbone:CSPDarknet53
-
CSP結構(Cross Stage Partial Network)
-
優勢:通過分割-處理-合并策略,減少計算量約20%并增強梯度多樣性。
# CSP結構示例(YOLOv5中的BottleneckCSP模塊)
class BottleneckCSP(nn.Module):def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):super().__init__()c_ = int(c2 * e) # 中間通道數self.cv1 = Conv(c1, c_, 1, 1) # 1x1卷積降維self.cv2 = nn.Conv2d(c1, c_, 1, 1, bias=False)self.cv3 = nn.Conv2d(c_, c_, 1, 1, bias=False)self.cv4 = Conv(2 * c_, c2, 1, 1)self.bn = nn.BatchNorm2d(2 * c_)self.act = nn.SiLU()self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])def forward(self, x):y1 = self.cv3(self.m(self.cv1(x))) # 分支1:卷積→Bottleneck堆疊y2 = self.cv2(x) # 分支2:直連return self.cv4(self.act(self.bn(torch.cat((y1, y2), dim=1))))
- Focus模塊(輸入切片處理)
- 作用:將輸入圖像相鄰像素切片重組,替代傳統卷積下采樣,保留更多細節信息。
class Focus(nn.Module):def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):super().__init__()self.conv = Conv(c1 * 4, c2, k, s, p, g, act) # 通道數擴展4倍def forward(self, x):# 切片操作:將空間維度信息轉為通道維度return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))
2.?Neck:PANet(Path Aggregation Network)
-
特征金字塔結構:
-
FPN(自頂向下):深層特征上采樣并與淺層特征融合,增強語義信息。
-
PAN(自底向上):淺層特征下采樣并與深層特征融合,補充定位細節。
-
# YOLOv5中的PANet實現(包含Concat和C3模塊)
class PANet(nn.Module):def __init__(self, c1, c2):super().__init__()self.up = nn.Upsample(scale_factor=2, mode='nearest')self.c3_1 = C3(c1*2, c2, n=3, shortcut=False)self.c3_2 = C3(c2*2, c2, n=3, shortcut=False)def forward(self, x1, x2, x3):# 自頂向下(FPN)p3 = x3p3_up = self.up(p3)p2 = torch.cat([p3_up, x2], 1)p2 = self.c3_1(p2)# 自底向上(PAN)p2_up = self.up(p2)p1 = torch.cat([p2_up, x1], 1)p1 = self.c3_2(p1)return p1, p2, p3
3.?Head:檢測頭
-
多尺度預測:輸出三個尺度的特征圖(如80×80、40×40、20×20),分別對應小、中、大目標。
-
預測張量結構:
# 輸出shape:[batch_size, anchors_per_scale, grid_h, grid_w, 5 + num_classes]
# 5 = tx, ty, tw, th, confidence
- 解碼過程:
def decode_box(pred, anchors, strides):# pred: [..., 4] 對應tx, ty, tw, thgrid_x = torch.arange(pred.shape[2]).repeat(pred.shape[3], 1).view(1, 1, pred.shape[2], pred.shape[3])grid_y = grid_x.permute(0, 1, 3, 2)pred[..., 0] = (torch.sigmoid(pred[..., 0]) * 2 - 0.5 + grid_x) * strides # cxpred[..., 1] = (torch.sigmoid(pred[..., 1]) * 2 - 0.5 + grid_y) * strides # cypred[..., 2:4] = (torch.sigmoid(pred[..., 2:4]) * 2) ** 2 * anchors # w, hreturn pred
三、YOLOv5網絡架構細節
1. 整體架構圖
Input (640x640x3)
│
├── Focus [3→32] # 切片下采樣
├── Conv [32→64]
├── C3 [64→64]
├── Conv [64→128]
├── C3 [128→128] ×3
├── Conv [128→256]
├── C3 [256→256] ×3
├── Conv [256→512]
├── SPP [512→512] # 空間金字塔池化
├── C3 [512→512] ×3
│
├── PANet開始
│ ├── UpSample → Concat → C3 [512→256]
│ ├── UpSample → Concat → C3 [256→128]
│ ├── DownSample → Concat → C3 [128→256]
│ └── DownSample → Concat → C3 [256→512]
│
└── Detect Head [3個尺度輸出]
2. 關鍵模塊參數
模塊類型 | 參數配置示例 | 作用說明 |
---|---|---|
Conv | kernel=6x6, stride=2, pad=2 | 下采樣(替代池化) |
C3 | 包含3個Bottleneck | 跨階段特征融合 |
SPP | 池化核[5,9,13] | 多尺度感受野融合 |
Upsample | scale_factor=2 | 特征圖放大(最近鄰插值) |
四、YOLOv5的創新優化
1. 自適應訓練機制
-
自適應錨框計算:訓練初期自動計算最優錨框尺寸(
--autoanchor
參數)。 -
自適應圖像縮放:保持原始圖像寬高比進行填充,減少無效計算(
letterbox
)。
2. 損失函數設計
-
CIoU Loss:綜合中心點距離、寬高比、重疊率的損失計算:
-
3. 輕量化改進(YOLOv5s與YOLOv5x對比)
模型版本 | 參數量(M) | GFLOPs | 適用場景 |
---|---|---|---|
YOLOv5s | 7.2 | 16.5 | 移動端/嵌入式設備 |
YOLOv5m | 21.2 | 49.0 | 平衡速度與精度 |
YOLOv5l | 46.5 | 109.1 | 服務器端高性能檢測 |
YOLOv5x | 86.7 | 205.7 | 極致精度需求場景 |
五、YOLOv5應用場景
-
工業質檢:快速檢測產品缺陷(PCB板、零部件)。
-
自動駕駛:實時車輛、行人、交通標志識別。
-
安防監控:人體姿態、異常行為檢測。
-
遙感圖像:大尺度場景下的目標識別(建筑物、農田)。
總結
YOLOv5通過CSPDarknet主干網絡、PANet特征融合和多尺度檢測頭,在保持實時性的同時提升了檢測精度。其核心創新在于:
-
工程優化:自適應錨框、動態損失平衡、高效數據增強。
-
架構改進:Focus模塊減少計算量,C3結構增強特征復用。
-
靈活性:提供多種模型尺寸(s/m/l/x)適應不同硬件需求。
手勢識別實戰
- 用git把yolov5從GitHub上下載到本地
- 把數據集劃分為train1598:test457:val228=7:2:1,并放在dataset文件夾里
- 劃分參考
- val沒有參與狹義的模型訓練過程(權重更新),但是它參與了模型評測,以此來選擇(不同超參數、不同epoch)最好的模型,就相當于參與了廣義的模型訓練了。
- 數據集結構為
-
datasettrainimageslabelstestval
- 把data/coco.yaml復制并改為gesture.yaml
- 把內容改為
-
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]# dataset root dir train: ../dataset_split/train/images # train images (relative to 'path') 128 images val: ../dataset_split/val/images # val images (relative to 'path') 128 images test: ../dataset_split/test/images # test images (optional)# Classes names:0: 000-one1: 001-five2: 002-fist3: 003-ok4: 004-heartSingle5: 005-yearh6: 006-three7: 007-four8: 008-six9: 009-Iloveyou10: 010-gun11: 011-thumbUp12: 012-nine13: 013-pink
- 把models/yolov5s.yaml里面的80換成14:nc: 14 # number of classes
- 把train.py里面找到下圖代碼并改為下圖,其他的先不用動
- 把整個文件壓縮
- 登錄autodl賬號,開個小小的GPU,點進去后再建立一個文件夾yolov5
- 上傳你的zip
- 解壓縮,打開終端,
- cd autodl-temp
- cd yolov5
- unzip yasuobao(不用加后綴.zip)
- 配環境pip install -r requirments.txt
- 終端輸入python train.py就可以了
訓練完后報錯AttributeError: module 'PIL.Image' has no attribute 'ANTIALIAS'
解決方法
訓練了100輪
在目標檢測任務中,損失函數是評估模型預測準確性的關鍵指標。Box Loss、Cls Loss?和?DFL Loss?是三種常用的損失函數,它們分別針對不同的預測誤差進行優化。
Box Loss(邊界框損失)主要用于計算預測邊界框與真實邊界框之間的差異。常見的計算方法包括?Mean Squared Error(均方誤差)和?Smooth L1 Loss(平滑L1損失)。這種損失函數通過最小化預測框與真實框之間的差異,幫助模型更準確地定位目標。
Cls Loss(分類損失)?用于計算預測類別與真實類別之間的差異。這通常通過?交叉熵損失(Cross-Entropy Loss)來實現。分類損失的優化有助于提高模型對目標類別的識別準確性。
DFL Loss(自由形變損失)或稱為?Distribution Focal Loss,是一種用于處理類別不平衡問題的損失函數。它類似于?Focal Loss,但引入了類別分布信息,從而更有效地處理不同類別樣本數量差異較大的情況。
當這三個損失函數的值上升而不下降時,可能表明模型出現了過擬合。
obj_loss(目標置信度損失)是衡量模型預測邊界框覆蓋對象程度的一個重要指標。衡量目標檢測對圖像中是否存在目標進行判斷的準確程度。當obj_loss較低時,表示模型能夠正確識別出圖像中的目標。
val.py就是用來測試的,原來在train.py里面默認是輸入val,所以得出來的也是val_loss
但是現在要測試,所以要把里面參數部分默認的val改為test,然后再運行