Ultralytics YOLOv5 ์ํคํ ์ฒ
YOLOv5 (v6.0/6.1) is a powerful object detection algorithm developed by Ultralytics. This article dives deep into the YOLOv5 architecture, data augmentation strategies, training methodologies, and loss computation techniques. This comprehensive understanding will help improve your practical application of object detection in various fields, including surveillance, autonomous vehicles, and image recognition.
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 employs various data augmentation techniques to improve the model's ability to generalize and reduce overfitting. These techniques include:
-
Mosaic Augmentation: An image processing technique that combines four training images into one in ways that encourage object detection models to better handle various object scales and translations.
-
๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐ ์ฆ๊ฐ: ์ด๋ฏธ์ง์์ ๋ฌด์์๋ก ํจ์น๋ฅผ ๋ณต์ฌํ์ฌ ๋ฌด์์๋ก ์ ํํ ๋ค๋ฅธ ์ด๋ฏธ์ง์ ๋ถ์ฌ๋ฃ์ด ์๋ก์ด ํ์ต ์ํ์ ํจ๊ณผ์ ์ผ๋ก ์์ฑํ๋ ํ์ ์ ์ธ ๋ฐ์ดํฐ ์ฆ๊ฐ ๋ฐฉ๋ฒ์ ๋๋ค.
-
๋๋ค ์ํ ๋ณํ: ์ฌ๊ธฐ์๋ ์ด๋ฏธ์ง์ ๋ฌด์์ ํ์ , ํฌ๊ธฐ ์กฐ์ , ์ด๋ ๋ฐ ์ ๋จ์ด ํฌํจ๋ฉ๋๋ค.
-
๋ฏน์ค์ ์ฆ๊ฐ: ๋ ์ด๋ฏธ์ง์ ๊ด๋ จ ๋ ์ด๋ธ์ ์ ํ์ ์ผ๋ก ์กฐํฉํ์ฌ ํฉ์ฑ ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
-
๋ฌธ์ํ: ๋ค์ํ ์ฆ๊ฐ ๊ธฐ์ ์ ์ง์ํ๋ ๊ฐ๋ ฅํ ์ด๋ฏธ์ง ์ฆ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
-
HSV ์ฆ๊ฐ: ์ด๋ฏธ์ง์ ์์กฐ, ์ฑ๋ ๋ฐ ๊ฐ์ ์์๋ก ๋ณ๊ฒฝํฉ๋๋ค.
-
๋ฌด์์ ์ํ ๋ค์ง๊ธฐ: ์ด๋ฏธ์ง๋ฅผ ๋ฌด์์๋ก ๊ฐ๋ก๋ก ๋ค์ง๋ ์ฆ๊ฐ ๋ฐฉ์์ ๋๋ค.
3. ๊ต์ก ์ ๋ต
YOLOv5 ๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ ๊ตํ ํ๋ จ ์ ๋ต์ ์ ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ๋ฉํฐ์ค์ผ์ผ ํธ๋ ์ด๋: ํ๋ จ ๊ณผ์ ์์ ์ ๋ ฅ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๊ฐ ์๋ ํฌ๊ธฐ์ 0.5~1.5๋ฐฐ ๋ฒ์ ๋ด์์ ์์๋ก ์กฐ์ ๋ฉ๋๋ค.
- ์๋ ์ต์ปค: ์ด ์ ๋ต์ ์ฌ์ฉ์ ์ง์ ๋ฐ์ดํฐ์ ๊ธฐ์ค ๋ฐ์ดํฐ ์์์ ํต๊ณ์ ํน์ฑ๊ณผ ์ผ์นํ๋๋ก ์ด์ ์ต์ปค ์์๋ฅผ ์ต์ ํํฉ๋๋ค.
- Warmup and Cosine LR Scheduler: A method to adjust the learning rate to enhance model performance.
- ์ง์์ด๋ํ๊ท (EMA): ๊ณผ๊ฑฐ ๋จ๊ณ์ ๋งค๊ฐ๋ณ์ ํ๊ท ์ ์ฌ์ฉํ์ฌ ํ์ต ๊ณผ์ ์ ์์ ํํ๊ณ ์ผ๋ฐํ ์ค๋ฅ๋ฅผ ์ค์ด๋ ์ ๋ต์ ๋๋ค.
- Mixed Precision Training: A method to perform operations in half-precision format, reducing memory usage and enhancing computational speed.
- ํ์ดํผํ๋ผ๋ฏธํฐ ์งํ: ์ต์ ์ ์ฑ๋ฅ์ ๋ฌ์ฑํ๊ธฐ ์ํด ํ์ดํผํ๋ผ๋ฏธํฐ๋ฅผ ์๋์ผ๋ก ์กฐ์ ํ๋ ์ ๋ต์ ๋๋ค.
4. ์ถ๊ฐ ๊ธฐ๋ฅ
4.1 ์์ค ๊ณ์ฐ
YOLOv5 ์ ์์ค์ ์ธ ๊ฐ์ง ๊ฐ๋ณ ์์ค ๊ตฌ์ฑ ์์์ ์กฐํฉ์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค:
- ํด๋์ค ์์ค(BCE ์์ค): ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ ์์ค๋ก, ๋ถ๋ฅ ์์ ์ ์ค๋ฅ๋ฅผ ์ธก์ ํฉ๋๋ค.
- ๊ฐ์ฒด์ฑ ์์ค(BCE ์์ค): ๋ ๋ค๋ฅธ ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ ์์ค๋ก, ํน์ ๊ทธ๋ฆฌ๋ ์ ์ ๊ฐ์ฒด๊ฐ ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฐ์งํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์์น ์์ค(CIoU ์์ค): ์ ์ฒด IoU ์์ค: ๊ทธ๋ฆฌ๋ ์ ๋ด์์ ์ค๋ธ์ ํธ์ ์์น๋ฅผ ํ์ ํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์ธก์ ํฉ๋๋ค.
The overall loss function is depicted by:
4.2 ์์ก ์์ค
์ธ ๊ฐ์ง ์์ธก ๋ ์ด์ด์ ์ค๋ธ์ ํธ๋์ค ์์ค(P3
, P4
, P5
)์ ๊ฐ์ค์น๋ ๋ค๋ฅด๊ฒ ์ ์ฉ๋ฉ๋๋ค. ๋ฐธ๋ฐ์ค ๊ฐ์ค์น๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. [4.0, 1.0, 0.4]
๋ก ๊ฐ๊ฐ ์ค์ ํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋ก ๋ค๋ฅธ ๊ท๋ชจ์ ์์ธก์ด ์ด ์์ค์ ์ ์ ํ๊ฒ ๊ธฐ์ฌํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
4.3 ๊ทธ๋ฆฌ๋ ๊ฐ๋ ์ ๊ฑฐํ๊ธฐ
YOLOv5 ์ํคํ ์ฒ๋ ์ด์ ๋ฒ์ ( YOLO)๊ณผ ๋น๊ตํ์ฌ ๋ฐ์ค ์์ธก ์ ๋ต์ ๋ช ๊ฐ์ง ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ์ต๋๋ค. YOLOv2 ๋ฐ YOLOv3์์๋ ๋ง์ง๋ง ๋ ์ด์ด์ ํ์ฑํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ค ์ขํ๋ฅผ ์ง์ ์์ธกํ์ต๋๋ค.
๊ทธ๋ฌ๋ YOLOv5 ์์๋ ๊ทธ๋ฆฌ๋ ๊ฐ๋๋ฅผ ์ค์ด๊ณ ๋ชจ๋ธ์ด ๋ฌดํํ ์์ ์น์๋ฅผ ์์ธกํ์ง ๋ชปํ๋๋ก ์์ ์ขํ๋ฅผ ์์ธกํ๋ ๊ณต์์ด ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
The revised formulas for calculating the predicted bounding box are as follows:
์ค์ผ์ผ๋ง ์ ํ์ ์ค์ฌ์ ์คํ์ ์ ๋น๊ตํฉ๋๋ค. ์ค์ฌ์ ์คํ์ ๋ฒ์๋ (0, 1)์์ (-0.5, 1.5)๊น์ง ์กฐ์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์คํ์ ์ ์ฝ๊ฒ 0 ๋๋ 1์ด ๋ ์ ์์ต๋๋ค.
์กฐ์ ์ ํ์ ๋์ด์ ๋๋น ๋น์จ(์ต์ปค ๊ธฐ์ค)์ ๋น๊ตํฉ๋๋ค. ์๋ yolo/darknet ์์ ๋ฐฉ์ ์์๋ ์ฌ๊ฐํ ๊ฒฐํจ์ด ์์ต๋๋ค. ํญ๊ณผ ๋์ด๋ ๋จ์ํ ์์=์์ค(์ธ)์ด๋ฏ๋ก ์์ ํ ๋ฌดํ๋์ด๋ฉฐ, ์ด๋ ํญ์ฃผ ๊ธฐ์ธ๊ธฐ, ๋ถ์์ ์ฑ, NaN ์์ค ๋ฐ ๊ถ๊ทน์ ์ผ๋ก ํ๋ จ์ ์์ ํ ์์ค๋ก ์ด์ด์ง ์ ์์ผ๋ฏ๋ก ์ํํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
4.4 ๋น๋ ํ๊ฒ
The build target process in YOLOv5 is critical for training efficiency and model accuracy. It involves assigning ground truth boxes to the appropriate grid cells in the output map and matching them with the appropriate anchor boxes.
์ด ํ๋ก์ธ์ค๋ ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฆ ๋๋ค:
- ๊ธฐ์ค์ ์์ ์น์์ ๊ฐ ์ต์ปค ํ ํ๋ฆฟ์ ์น์์ ๋น์จ์ ๊ณ์ฐํฉ๋๋ค.
- ๊ณ์ฐ๋ ๋น์จ์ด ์๊ณ๊ฐ ๋ด์ ์์ผ๋ฉด ๊ธฐ์ค๊ฐ ์์๋ฅผ ํด๋น ์ต์ปค์ ์ผ์น์ํต๋๋ค.
- ์์ ๋ ์ค์ฌ์ ์คํ์ ์ผ๋ก ์ธํด ๊ธฐ์ค์ ์์๋ฅผ ๋ ๊ฐ ์ด์์ ์ต์ปค์ ํ ๋นํ ์ ์๋ค๋ ์ ์ ์ผ๋์ ๋๊ณ ์ผ์นํ๋ ์ต์ปค๋ฅผ ์ ์ ํ ์ ์ ํ ๋นํฉ๋๋ค. ์ค์ฌ์ ์คํ์ ๋ฒ์๊ฐ (0, 1)์์ (-0.5, 1.5)๋ก ์กฐ์ ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค. GT ๋ฐ์ค๋ฅผ ๋ ๋ง์ ์ต์ปค์ ํ ๋นํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋น๋ ํ๊น ํ๋ก์ธ์ค๋ ํ์ต ๊ณผ์ ์์ ๊ฐ ์ค์ธก ๊ฐ์ฒด๊ฐ ์ ์ ํ๊ฒ ํ ๋น๋๊ณ ์ผ์นํ๋์ง ํ์ธํ์ฌ YOLOv5 ๊ฐ์ฒด ๊ฐ์ง ์์ ์ ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ํ์ตํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
๊ฒฐ๋ก ์ ์ผ๋ก, YOLOv5 ์ ์ค์๊ฐ ๊ฐ์ฒด ๊ฐ์ง ๋ชจ๋ธ ๊ฐ๋ฐ์ ์ค์ํ ์ง์ ์ ์๋ฏธํฉ๋๋ค. ๋ค์ํ ์๋ก์ด ๊ธฐ๋ฅ, ๊ฐ์ ์ฌํญ ๋ฐ ํ๋ จ ์ ๋ต์ ํตํฉํ์ฌ ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ ๋ฉด์์ ์ด์ ๋ฒ์ ์ YOLO ์ ํ๊ตฐ์ ๋ฅ๊ฐํฉ๋๋ค.
YOLOv5 ์ ์ฃผ์ ๊ฐ์ ์ฌํญ์ผ๋ก๋ ๋์ ์ํคํ ์ฒ ์ฌ์ฉ, ๊ด๋ฒ์ํ ๋ฐ์ดํฐ ์ฆ๊ฐ ๊ธฐ์ , ํ์ ์ ์ธ ํ๋ จ ์ ๋ต, ์ปดํจํ ์์ค ๋ฐ ๋ชฉํ ๊ตฌ์ถ ํ๋ก์ธ์ค์ ์ค์ํ ์กฐ์ ๋ฑ์ด ์์ต๋๋ค. ์ด๋ฌํ ๋ชจ๋ ํ์ ์ YOLO ๋ชจ๋ธ์ ํธ๋ ์ด๋๋งํฌ์ธ ๋น ๋ฅธ ์๋๋ฅผ ์ ์งํ๋ฉด์ ๋ฌผ์ฒด ๊ฐ์ง์ ์ ํ์ฑ๊ณผ ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.