yolov5的yaml文件解析


本文參考: https://blog.csdn.net/mary_0830/article/details/107124459?%3E

yolov5  是使用xxxx.yaml配置文件,通過./models/yolo.py解析文件加了一個輸入構成的網絡模塊。與config設置的網絡不同,不需要進行疊加,只需要在配置文件中對number進行修改即可。

完整的yolov5x.yaml

# parameters
nc: 80  # number of classes
depth_multiple: 1.33  # model depth multiple,模型深度
width_multiple: 1.25  # layer channel multiple, 卷積核的個數

# anchors
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# yolov5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 1-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 2-P2/4
   [-1, 3, Bottleneck, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 4-P3/8
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 6-P4/16
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]], # 8-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 6, BottleneckCSP, [1024]],  # 10
  ]

# yolov5 head
head:
  [[-1, 3, BottleneckCSP, [1024, False]],  # 11
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]],  # 12 (P5/32-large)

   [-2, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 1, Conv, [512, 1, 1]],
   [-1, 3, BottleneckCSP, [512, False]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]],  # 17 (P4/16-medium)

   [-2, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 1, Conv, [256, 1, 1]],
   [-1, 3, BottleneckCSP, [256, False]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]],  # 22 (P3/8-small)

   [[], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

parameters

nc: 80  # number of classes
depth_multiple: 1.33  # model depth multiple,模型深度
width_multiple: 1.25  # layer channel multiple, 卷積核的個數

 

1. nc:類別數,你的類別有多少就填寫多少。從1開始算起,不是0-14這樣算。

2. depth_multiple:控制模型的深度。

3. width_multiple:控制卷積核的個數。

depth_multiple 是用在backbone中的number≠1的情況下, 即在Bottleneck層使用,控制模型的深度,yolov5s中設置為0.33,假設yolov5l中有三個Bottleneck,那yolov5s中就只有一個Bottleneck。
因為一般number=1表示的是功能背景的層,比如說下采樣Conv、Focus、SPP(空間金字塔池化)。
——————————————————————————————————————
width_multiple 主要是用於設置arguments,例如yolov5s設置為0.5,Focus就變成[32, 3],Conv就變成[64, 3, 2]。
以此類推,卷積核的個數都變成了設置的一半。

yolov5提供了s、m、l、x四種,所有的yaml文件都設置差不多,只有上面2和3的設置不同,作者團隊很厲害,只需要修改這兩個參數就可以調整模型的網絡結構。

anchors

# anchors
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

可以針對自己的數據集增加anchor 的尺度類型。 

backbone

# yolov5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 1-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 2-P2/4
   [-1, 3, Bottleneck, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 4-P3/8
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 6-P4/16
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]], # 8-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 6, BottleneckCSP, [1024]],  # 10
  ] 

a. Bottleneck 可以譯為“瓶頸層”。
b. from列參數:-1 代表是從上一層獲得的輸入,-2表示從上兩層獲得的輸入(head同理)。
c. number列參數:1表示只有一個,3表示有三個相同的模塊。
d. SPP、Conv、Bottleneck、BottleneckCSP的代碼可以在./models/common.py中獲取到。
e. [64, 3] 解析得到[3, 32, 3] ,輸入為3(RGB),輸出為32,卷積核k為3;
f. [128, 3, 2] 這是固定的,128表示輸出128個卷積核個數。根據 [128, 3, 2] 解析得到[32, 64, 3, 2] ,32是輸入,64是輸出(128*0.5=64),3表示3×3的卷積核,2表示步長為2。
g. 主干網是圖片從大到小,深度不斷加深。
h. args這里的輸入都省去了,因為輸入都是上層的輸出。為了修改過於麻煩,這里輸入的獲取是從./models/yolo.py的def parse_model(md, ch)函數中解析得到的。

head

# yolov5 head
head:
  [[-1, 3, BottleneckCSP, [1024, False]],  # 11
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]],  # 12 (P5/32-large)

   [-2, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 1, Conv, [512, 1, 1]],
   [-1, 3, BottleneckCSP, [512, False]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]],  # 17 (P4/16-medium)

   [-2, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 1, Conv, [256, 1, 1]],
   [-1, 3, BottleneckCSP, [256, False]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]],  # 22 (P3/8-small)

   [[], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

head檢測頭:一般表示的是經過主干網后輸出的特征圖,特征圖輸入head中進行檢測,包括類別和位置的檢測。

運行 models/ yolo.py 后可以顯示對.yaml 文件(yolov5x.yaml)的網絡解析: 

torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']

torch.nn.Upsample(size=None, scale_factor=None, mode=‘nearest’, align_corners=None)

size (int or Tuple[int] or Tuple[int, int] or Tuple[int, int, int], optional) – 根據不同的輸入類型制定的輸出大小
scale_factor (float or Tuple[float] or Tuple[float, float] or Tuple[float, float, float], optional) – 指定輸出為輸入的多少倍數。如果輸入為tuple,其也要制定為tuple類型
mode (str, optional) – 可使用的上采樣算法,有’nearest’, ‘linear’, ‘bilinear’, ‘bicubic’ and ‘trilinear’. 默認使用’nearest’
[5, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]]]
對應於./models/yolov5x.yaml的Detect,nc=5, anchors =[[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]]
代表large anchors(P5), [30, 61, 62, 45, 59, 119]代表medium anchors,[10, 13, 16, 30, 33, 23]代表small anchors。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM