Ultralytics YOLOv5 μν€ν μ²
YOLOv5 (v6.0/6.1)μ Ultralytics μμ κ°λ°ν κ°λ ₯ν κ°μ²΄ κ°μ§ μκ³ λ¦¬μ¦μ λλ€. μ΄ λ¬Έμμμλ YOLOv5 μν€ν μ², λ°μ΄ν° μ¦κ° μ λ΅, νλ ¨ λ°©λ²λ‘ λ° μμ€ κ³μ° κΈ°λ²μ λν΄ μμΈν μ€λͺ ν©λλ€. μ΄λ¬ν ν¬κ΄μ μΈ μ΄ν΄λ κ°μ, μμ¨ μ£Όν μ°¨λ, μ΄λ―Έμ§ μΈμ λ± λ€μν λΆμΌμμ κ°μ²΄ κ°μ§μ μ€μ μ μ©μ κ°μ νλ λ° λμμ΄ λ κ²μ λλ€.
1. λͺ¨λΈ ꡬ쑰
YOLOv5μ μν€ν μ²λ ν¬κ² μΈ λΆλΆμΌλ‘ ꡬμ±λ©λλ€:
- λ°±λ³Έ: λ€νΈμν¬μ 본체μ
λλ€. YOLOv5 μ κ²½μ° λ°±λ³Έμ λ€μμ μ¬μ©νμ¬ μ€κ³λμμ΅λλ€.
New CSP-Darknet53
ꡬ쑰λ μ΄μ λ²μ μμ μ¬μ©λ λ€ν¬λ· μν€ν μ²λ₯Ό μμ ν κ²μ λλ€. - λͺ©: μ΄ λΆλΆμ λ°±λ³Έκ³Ό ν€λλ₯Ό μ°κ²°ν©λλ€. YOLOv5 μμ ,
SPPF
그리κ³New CSP-PAN
κ΅¬μ‘°κ° νμ©λ©λλ€. - Head: μ΄ λΆλΆμ μ΅μ’
μΆλ ₯μ μμ±νλ μν μ ν©λλ€. YOLOv5 μμλ
YOLOv3 Head
λ₯Ό μ¬μ©νμΈμ.
λͺ¨λΈμ ꡬ쑰λ μλ μ΄λ―Έμ§μ λμ μμ΅λλ€. λͺ¨λΈ ꡬ쑰μ λν μμΈν λ΄μ©μ λ€μμμ νμΈν μ μμ΅λλ€. yolov5l.yaml
.
YOLOv5 λ μ΄μ λ²μ κ³Ό λΉκ΅νμ¬ λͺ κ°μ§ μ¬μν λ³κ²½ μ¬νμ΄ μμ΅λλ€:
- 그리κ³
Focus
κ΅¬μ‘°κ° μ΄μ λ²μ μμ λ°κ²¬λλ6x6 Conv2d
κ΅¬μ‘°λ‘ λ³κ²½ν©λλ€. μ΄ λ³κ²½μΌλ‘ ν¨μ¨μ± ν₯μ #4825. - 그리κ³
SPP
ꡬ쑰κ°SPPF
. μ΄λ κ² λ³κ²½νλ©΄ μ²λ¦¬ μλκ° λ λ°° μ΄μ λΉ¨λΌμ§λλ€.
μλλ₯Ό ν
μ€νΈνλ €λ©΄ SPP
κ·Έλ¦¬κ³ SPPF
λ₯Ό μ¬μ©νλ©΄ λ€μ μ½λλ₯Ό μ¬μ©ν μ μμ΅λλ€:
SPP λ SPPF μλ νλ‘νμΌλ§ μμ(μ΄λ €λ©΄ ν΄λ¦)
import time
import torch
import torch.nn as nn
class SPP(nn.Module):
def __init__(self):
"""Initializes an SPP module with three different sizes of max pooling layers."""
super().__init__()
self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)
def forward(self, x):
"""Applies three max pooling layers on input `x` and concatenates results along channel dimension."""
o1 = self.maxpool1(x)
o2 = self.maxpool2(x)
o3 = self.maxpool3(x)
return torch.cat([x, o1, o2, o3], dim=1)
class SPPF(nn.Module):
def __init__(self):
"""Initializes an SPPF module with a specific configuration of MaxPool2d layer."""
super().__init__()
self.maxpool = nn.MaxPool2d(5, 1, padding=2)
def forward(self, x):
"""Applies sequential max pooling and concatenates results with input tensor."""
o1 = self.maxpool(x)
o2 = self.maxpool(o1)
o3 = self.maxpool(o2)
return torch.cat([x, o1, o2, o3], dim=1)
def main():
"""Compares outputs and performance of SPP and SPPF on a random tensor (8, 32, 16, 16)."""
input_tensor = torch.rand(8, 32, 16, 16)
spp = SPP()
sppf = SPPF()
output1 = spp(input_tensor)
output2 = sppf(input_tensor)
print(torch.equal(output1, output2))
t_start = time.time()
for _ in range(100):
spp(input_tensor)
print(f"SPP time: {time.time() - t_start}")
t_start = time.time()
for _ in range(100):
sppf(input_tensor)
print(f"SPPF time: {time.time() - t_start}")
if __name__ == "__main__":
main()
2. λ°μ΄ν° μ¦κ° κΈ°μ
YOLOv5 λ λͺ¨λΈμ μΌλ°ν λ₯λ ₯μ ν₯μμν€κ³ κ³Όμ ν©μ μ€μ΄κΈ° μν΄ λ€μν λ°μ΄ν° μ¦κ° κΈ°λ²μ μ¬μ©ν©λλ€. μ΄λ¬ν κΈ°λ²μλ λ€μμ΄ ν¬ν¨λ©λλ€:
-
λͺ¨μμ΄ν¬ μ¦κ°: κ°μ²΄ κ°μ§ λͺ¨λΈμ΄ λ€μν κ°μ²΄ λ°°μ¨κ³Ό λ³νμ λ μ μ²λ¦¬ν μ μλλ‘ 4κ°μ νλ ¨ μ΄λ―Έμ§λ₯Ό νλλ‘ κ²°ν©νλ μ΄λ―Έμ§ μ²λ¦¬ κΈ°λ²μ λλ€.
-
볡μ¬-λΆμ¬λ£κΈ° μ¦κ°: μ΄λ―Έμ§μμ 무μμλ‘ ν¨μΉλ₯Ό 볡μ¬νμ¬ λ¬΄μμλ‘ μ νν λ€λ₯Έ μ΄λ―Έμ§μ λΆμ¬λ£μ΄ μλ‘μ΄ νμ΅ μνμ ν¨κ³Όμ μΌλ‘ μμ±νλ νμ μ μΈ λ°μ΄ν° μ¦κ° λ°©λ²μ λλ€.
-
λλ€ μν λ³ν: μ¬κΈ°μλ μ΄λ―Έμ§μ 무μμ νμ , ν¬κΈ° μ‘°μ , μ΄λ λ° μ λ¨μ΄ ν¬ν¨λ©λλ€.
-
λ―Ήμ€μ μ¦κ°: λ μ΄λ―Έμ§μ κ΄λ ¨ λ μ΄λΈμ μ νμ μΌλ‘ μ‘°ν©νμ¬ ν©μ± μ΄λ―Έμ§λ₯Ό λ§λλ λ°©λ²μ λλ€.
-
λ¬Έμν: λ€μν μ¦κ° κΈ°μ μ μ§μνλ κ°λ ₯ν μ΄λ―Έμ§ μ¦κ° λΌμ΄λΈλ¬λ¦¬μ λλ€.
-
HSV μ¦κ°: μ΄λ―Έμ§μ μμ‘°, μ±λ λ° κ°μ μμλ‘ λ³κ²½ν©λλ€.
-
무μμ μν λ€μ§κΈ°: μ΄λ―Έμ§λ₯Ό 무μμλ‘ κ°λ‘λ‘ λ€μ§λ μ¦κ° λ°©μμ λλ€.
3. κ΅μ‘ μ λ΅
YOLOv5 λ λͺ¨λΈμ μ±λ₯μ ν₯μμν€κΈ° μν΄ λͺ κ°μ§ μ κ΅ν νΈλ μ΄λ μ λ΅μ μ μ©ν©λλ€. μ¬κΈ°μλ λ€μμ΄ ν¬ν¨λ©λλ€:
- λ©ν°μ€μΌμΌ νΈλ μ΄λ: νλ ¨ κ³Όμ μμ μ λ ₯ μ΄λ―Έμ§μ ν¬κΈ°κ° μλ ν¬κΈ°μ 0.5~1.5λ°° λ²μ λ΄μμ μμλ‘ μ‘°μ λ©λλ€.
- μλ μ΅μ»€: μ΄ μ λ΅μ μ¬μ©μ μ§μ λ°μ΄ν°μ κΈ°μ€ λ°μ΄ν° μμμ ν΅κ³μ νΉμ±κ³Ό μΌμΉνλλ‘ μ΄μ μ΅μ»€ μμλ₯Ό μ΅μ νν©λλ€.
- μλ°μ λ° μ½μ¬μΈ LR μ€μΌμ€λ¬: λͺ¨λΈ μ±λ₯μ ν₯μμν€κΈ° μν΄ νμ΅ μλλ₯Ό μ‘°μ νλ λ°©λ²μ λλ€.
- μ§μμ΄λνκ· (EMA): κ³Όκ±° λ¨κ³μ 맀κ°λ³μ νκ· μ μ¬μ©νμ¬ νμ΅ κ³Όμ μ μμ ννκ³ μΌλ°ν μ€λ₯λ₯Ό μ€μ΄λ μ λ΅μ λλ€.
- νΌν© μ λ°λ νλ ¨: λ°μ λ° νμμΌλ‘ μ°μ°μ μννμ¬ λ©λͺ¨λ¦¬ μ¬μ©λμ μ€μ΄κ³ κ³μ° μλλ₯Ό ν₯μμν€λ λ°©μμ λλ€.
- νμ΄νΌνλΌλ―Έν° μ§ν: μ΅μ μ μ±λ₯μ λ¬μ±νκΈ° μν΄ νμ΄νΌνλΌλ―Έν°λ₯Ό μλμΌλ‘ μ‘°μ νλ μ λ΅μ λλ€.
4. μΆκ° κΈ°λ₯
4.1 μμ€ κ³μ°
YOLOv5 μ μμ€μ μΈ κ°μ§ κ°λ³ μμ€ κ΅¬μ± μμμ μ‘°ν©μΌλ‘ κ³μ°λ©λλ€:
- ν΄λμ€ μμ€(BCE μμ€): μ΄μ§ κ΅μ°¨ μνΈλ‘νΌ μμ€λ‘, λΆλ₯ μμ μ μ€λ₯λ₯Ό μΈ‘μ ν©λλ€.
- κ°μ²΄μ± μμ€(BCE μμ€): λ λ€λ₯Έ μ΄μ§ κ΅μ°¨ μνΈλ‘νΌ μμ€λ‘, νΉμ 그리λ μ μ κ°μ²΄κ° μλμ§ μ¬λΆλ₯Ό κ°μ§ν λ λ°μνλ μ€λ₯λ₯Ό κ³μ°ν©λλ€.
- μμΉ μμ€(CIoU μμ€): μ 체 IoU μμ€: 그리λ μ λ΄μμ μ€λΈμ νΈμ μμΉλ₯Ό νμ ν λ λ°μνλ μ€λ₯λ₯Ό μΈ‘μ ν©λλ€.
μ 체 μμ€ ν¨μλ λ€μκ³Ό κ°μ΄ νμλ©λλ€:
4.2 μμ‘ μμ€
μΈ κ°μ§ μμΈ‘ λ μ΄μ΄μ μ€λΈμ νΈλμ€ μμ€(P3
, P4
, P5
)μ κ°μ€μΉλ λ€λ₯΄κ² μ μ©λ©λλ€. λ°Έλ°μ€ κ°μ€μΉλ λ€μκ³Ό κ°μ΅λλ€. [4.0, 1.0, 0.4]
λ‘ κ°κ° μ€μ ν©λλ€. μ΄ μ κ·Ό λ°©μμ μλ‘ λ€λ₯Έ κ·λͺ¨μ μμΈ‘μ΄ μ΄ μμ€μ μ μ νκ² κΈ°μ¬νλλ‘ λ³΄μ₯ν©λλ€.
4.3 그리λ κ°λ μ κ±°νκΈ°
YOLOv5 μν€ν μ²λ μ΄μ λ²μ ( YOLO)κ³Ό λΉκ΅νμ¬ λ°μ€ μμΈ‘ μ λ΅μ λͺ κ°μ§ μ€μν λ³κ²½ μ¬νμ μ μ©νμ΅λλ€. YOLOv2 λ° YOLOv3μμλ λ§μ§λ§ λ μ΄μ΄μ νμ±νλ₯Ό μ¬μ©νμ¬ λ°μ€ μ’νλ₯Ό μ§μ μμΈ‘νμ΅λλ€.
κ·Έλ¬λ YOLOv5 μμλ 그리λ κ°λλ₯Ό μ€μ΄κ³ λͺ¨λΈμ΄ 무νν μμ μΉμλ₯Ό μμΈ‘νμ§ λͺ»νλλ‘ μμ μ’νλ₯Ό μμΈ‘νλ 곡μμ΄ μ λ°μ΄νΈλμμ΅λλ€.
μμΈ‘λ λ°μ΄λ© λ°μ€λ₯Ό κ³μ°νλ μμ λ 곡μμ λ€μκ³Ό κ°μ΅λλ€:
μ€μΌμΌλ§ μ νμ μ€μ¬μ μ€νμ μ λΉκ΅ν©λλ€. μ€μ¬μ μ€νμ λ²μλ (0, 1)μμ (-0.5, 1.5)κΉμ§ μ‘°μ λ©λλ€. λ°λΌμ μ€νμ μ μ½κ² 0 λλ 1μ΄ λ μ μμ΅λλ€.
μ‘°μ μ νμ λμ΄μ λλΉ λΉμ¨(μ΅μ»€ κΈ°μ€)μ λΉκ΅ν©λλ€. μλ yolo/darknet μμ λ°©μ μμλ μ¬κ°ν κ²°ν¨μ΄ μμ΅λλ€. νκ³Ό λμ΄λ λ¨μν μμ=μμ€(μΈ)μ΄λ―λ‘ μμ ν 무νλμ΄λ©°, μ΄λ νμ£Ό κΈ°μΈκΈ°, λΆμμ μ±, NaN μμ€ λ° κΆκ·Ήμ μΌλ‘ νλ ¨μ μμ ν μμ€λ‘ μ΄μ΄μ§ μ μμΌλ―λ‘ μνν©λλ€. μ΄ λ¬Έμ λ₯Ό μ°Έμ‘°νμΈμ.
4.4 λΉλ νκ²
YOLOv5 μ λͺ©ν κ΅¬μΆ νλ‘μΈμ€λ νμ΅ ν¨μ¨μ±κ³Ό λͺ¨λΈ μ νλμ λ§€μ° μ€μν©λλ€. μ¬κΈ°μλ μΆλ ₯ 맡μ μ μ ν 그리λ μ μ κΈ°μ€μ μμλ₯Ό ν λΉνκ³ μ μ ν μ΅μ»€ μμμ μΌμΉμν€λ μμ μ΄ ν¬ν¨λ©λλ€.
μ΄ νλ‘μΈμ€λ λ€μ λ¨κ³λ₯Ό λ°λ¦ λλ€:
- κΈ°μ€μ μμ μΉμμ κ° μ΅μ»€ ν νλ¦Ώμ μΉμμ λΉμ¨μ κ³μ°ν©λλ€.
- κ³μ°λ λΉμ¨μ΄ μκ³κ° λ΄μ μμΌλ©΄ κΈ°μ€κ° μμλ₯Ό ν΄λΉ μ΅μ»€μ μΌμΉμν΅λλ€.
- μμ λ μ€μ¬μ μ€νμ μΌλ‘ μΈν΄ κΈ°μ€μ μμλ₯Ό λ κ° μ΄μμ μ΅μ»€μ ν λΉν μ μλ€λ μ μ μΌλμ λκ³ μΌμΉνλ μ΅μ»€λ₯Ό μ μ ν μ μ ν λΉν©λλ€. μ€μ¬μ μ€νμ λ²μκ° (0, 1)μμ (-0.5, 1.5)λ‘ μ‘°μ λμκΈ° λλ¬Έμ λλ€. GT λ°μ€λ₯Ό λ λ§μ μ΅μ»€μ ν λΉν μ μμ΅λλ€.
μ΄λ κ² νλ©΄ λΉλ νκΉ νλ‘μΈμ€λ νμ΅ κ³Όμ μμ κ° μ€μΈ‘ κ°μ²΄κ° μ μ νκ² ν λΉλκ³ μΌμΉνλμ§ νμΈνμ¬ YOLOv5 κ°μ²΄ κ°μ§ μμ μ λ³΄λ€ ν¨κ³Όμ μΌλ‘ νμ΅ν μ μμ΅λλ€.
κ²°λ‘
κ²°λ‘ μ μΌλ‘, YOLOv5 μ μ€μκ° κ°μ²΄ κ°μ§ λͺ¨λΈ κ°λ°μ μ€μν μ§μ μ μλ―Έν©λλ€. λ€μν μλ‘μ΄ κΈ°λ₯, κ°μ μ¬ν λ° νλ ¨ μ λ΅μ ν΅ν©νμ¬ μ±λ₯κ³Ό ν¨μ¨μ± λ©΄μμ μ΄μ λ²μ μ YOLO μ νκ΅°μ λ₯κ°ν©λλ€.
YOLOv5 μ μ£Όμ κ°μ μ¬νμΌλ‘λ λμ μν€ν μ² μ¬μ©, κ΄λ²μν λ°μ΄ν° μ¦κ° κΈ°μ , νμ μ μΈ νλ ¨ μ λ΅, μ»΄ν¨ν μμ€ λ° λͺ©ν κ΅¬μΆ νλ‘μΈμ€μ μ€μν μ‘°μ μ΄ μμ΅λλ€. μ΄λ¬ν λͺ¨λ νμ μ YOLO λͺ¨λΈμ νΈλ μ΄λλ§ν¬μΈ λΉ λ₯Έ μλλ₯Ό μ μ§νλ©΄μ 물체 κ°μ§μ μ νμ±κ³Ό ν¨μ¨μ±μ ν¬κ² ν₯μμν΅λλ€.