Yolo 모델에 대해서 톺아볼 일이 있었는데 간단 요약 글을 포스팅 하면서 다시 한번 정리를 한번 해 보려고 한다.
객체 감지는 이미지나 비디오 내의 객체를 식별하고 위치를 찾는 computer vision task이다.
객체 감지 알고리즘은 single shot detection과 two shot detection으로 나눌 수 있다.
two shot detection 알고리즘은 객체를 감지하는데 두 단계 프로세스를 사용한다. 첫번째 단계에서는 잠재적으로 객체를 포함할 수 있는 bounding box를 제안을 한다. 두번째 단계에서는 box 내 객체 클래스를 분류하기 위해 제안된 영역을 합성 신경망을 통해 실행을 한다.
two shot detection 알고리즘의 대표적인 예료는 R-CNN, Fast R-CNN, Faster R-CNN이 있다.
해당 내용의 간단 정리는 아래 링크에서도 확인 가능하다.
https://iambeginnerdeveloper.tistory.com/204
Single shot detection은 bounding box와 객체의 class를 한번의 shot으로 예측하느 객체 가지 알고리즘의 한 유형이다. 네트워크의 단일 forward로 객체의 존재와 bounding box가 동시에 예측이 된다.
one shot detection 알고리즘의 대표적인 예로는 YOLO(You Only Look Once)와 SSD(Singe Shot MultiBox Detector)가 있다.
해당 포스팅에서 살펴 볼 YOLO는 입력 이미지를 그리드로 나누고 각 그리드 셀에 대해 특정 수의 bounding box와 클래스 확률을 예측한다.
YoloV1 (2016)
- paper : https://arxiv.org/abs/1506.02640
- site : https://pjreddie.com/darknet/yolo/
- 실시간 객체 검출을 위한 딥러닝 기반 네트워크
- backbone : Darknet
- SxS grid cell로 input image를 분리 후 cell 마다 n개의 bbox, confidence score, class probabilities 예측
- NMS : 각 grid cell 마다 n개의 bbox가 생성되어 인접한 cell에서 같은 객체를 예측한 bbox가 생성되기에 confidence score와 IoU를 계산해서 가장 높은 score의 bbox를 선택하고 선택한 bbox와 IoU가 큰 나머지 bbox를 삭제
- 각 grid cell은 하나의 class만 예측
- 224x224로 pre-train하고 448x448을 input으로 사용하여 학습 진행
- 당시 SOTA들에 비해 real time 부분에서 가장 좋은 성능을 보임
YoloV2 (2017)
- paper : https://arxiv.org/abs/1612.08242
- site : https://pjreddie.com/darknet/yolo/
- backbone : Darknet-19
- 기존 darknet의 마지막 fully connected layer를 삭제하고 1x1 convolution layer로 대체
- global average pooling을 사용해 파라미터를 줄여 속도 향상
- 모든 conv layer에 batch norm 적용 -> yolov1에서 dropout layer를 제거하고 batch norm을 사용 해 mAP를 2% 향상
- anchor box 도입
-> yolov1에서의 이미지를 일정 크기의 cell로 나누는 방식을 이용해 cell에 미리 정의 된 형태를 가진 bbox인 anchor box를 생성
-> k-means clustering을 통해 GT와 가장 유사한 optimal anchor box를 탐색하여 데이터셋 특성에 적합한 anchor box를 생성
- fine grid feature -> 중간 feature map과 최종 feature map을 합쳐서 이용, 앞 conv layer의 high resolution feature map을 뒷 단의 conv layer의 low resolution feature map에 추가
- hight resolution classifier -> 448x448로 pre-train하여 더 큰 해상도에서의 예측 성능 개선, mAP 4% 향상
YoloV3 (2018)
- paper : https://arxiv.org/abs/1804.02767
- site : https://pjreddie.com/darknet/yolo/
- backbone : Darknet-53
- neck : FPN
- skip connection 개념 적용, pooling layer 삭제
- SSD Multi Scale feature layer와 Retina-net의 FPN과 유사한 기법 적용
- 마지막에 loss function을 softmax가 아닌 모든 class에 대해 sigmoid를 취해 각 class 별로 binary classification을 하도록 변경
- 작은 객체에 대한 성능 개선
- 속도 개선보다는 V2를 기반으로 성능 개선에 초점을 맞춤
YoloV4 (2020.04)
- paper :
- github :
- backbone : CSPDarknet53
- neck : SPP(multi scale feature representation) + PANet(하향식 및 상향식 경로를 통해 정보 흐름과 feature pyramid 생성을 향상) + FNP(multi scale feature map 생성)
- 작은 객체 검출 문제를 해결하고자 input image size를 512로 사용
- receptive field를 물리적으로 키우기 위해 layer 수를 늘리고 한 장의 이미지에서 다양한 종류, 다양한 크기의 객체들을 동시 검출하기 위해 파라미터 수 증가
- 다양한 데이터셋을 이용한 data augmentation과 quantization 도입으로 더 높은 성능과 더 작은 모델 사이즈를 가지게 됨
YoloV5 (2020.06)
- paper : X
- github : https://github.com/ultralytics/yolov5
- backbone : CSPDarknet53 -> 각 계층의 연산량을 균등하게 분배하여 연산 bottleneck을 없애고 CNN layer의 연산 활용을 업그레이드
- 모델 구조는 V4와 유사하며 V3의 darknet 프레임워크를 pytorch로 변환
- 다양한 augmentation 적용 -> mosaic augmentation으로 인해 작은 객체에 대한 성능 개선
- backbone을 depth multiple과 width multiple을 기준으로 하여 크기 별로 모델을 나눔
YoloX (2021.08)
- paper : https://arxiv.org/abs/2107.08430
- github : https://github.com/Megvii-BaseDetection/YOLOX
- backbone : Darknet-53
- neck : SPP
- anchor free model
-> 센터 좌표 값 하나만 positive sample로 지정해 그 부젼에 괜찮게 예측한 다른 데이터들을 모두 무시
-> positive sample을 센터 값 주변 3x3 사이즈로 모두 지정해 고품질의 예측 값에 대해 이득을 취할 수 있도록 함
-> 하나의 지점이 다수의 박스 내부에 존재할 때 global labeling이 필요
- decoupled head 구조로 변환
- SimOTA
-> optimal transport(OT) problem
-> 하나의 지점이 다수의 박스 내부에 존재할 때의 문제를 해결하기 위해 OTA 적용
YoloV6 (2022.09)
- paper : https://arxiv.org/abs/2209.02976
- github : https://github.com/meituan/YOLOv6
- backbone : EfficientRep
- neck : Rep-PAN
- knowledge distillation 시 모든 학습 단계에서 student model이 지식을 효율적으로 학습할 수 있도록 teacher와 label의 지식을 동적으로 조정
- PTQ, QAT 모두 활용하여 양자화 체계 개선
- batch 32에서 869fps 달성
YoloV7 (2022.07)
- paper : https://arxiv.org/abs/2207.02696
- github : https://github.com/WongKinYiu/yolov7
- backbone : E-ELAN
- computation block을 어느 정도 많이 쌓아도 잘 학습되지만 무한대로 쌓으면 parameter utilization이 낮아지는 문제가 있음
- 마음껏 쌓아도 학습 잘 되도록 E-ELAN 제안
- real time으로 inference cost를 증가 시키지 않으면서 augmentation을 통해 정확도를 향상 시키고자 함
- 학습 시 여러 개의 레이어들을 학습하고 inference 시 해당 레이어들을 하나의 레이어로 fusing
- GT를 그냥 사용하는 것이 아닌 prediction, gt의 distribution을 고려 해 새로운 soft label을 생성
- SOTA보다 parameter 수 40%, 계산량 50% 감소, 더 빠른 추론 속도와 높은 정확도 달성
YoloV8 (2023.01)
- paper : X
- github : https://github.com/ultralytics/ultralytics
- backbone : CSPDarknet53
- neck : SPP + PANet + SAM(Spatial attention module)
-> feature map 내 중요한 spatial 영역에 집중하는 네트워크의 기능을 향상 하도록 설계
-> spatial attention을 적용 해 관련 특징을 강조하는데 도움을 주어 객체 감지와 같은 작업 성능 향상
- anchor free model
- YoloV5와 차이점
-> C3 모듈을 C2f 모듈로 교체
-> backbone에서 첫번째 6x6 conv를 3x3 conv로 교체
-> 두개의 conv layer 삭제
-> ConvBottleneck에서 첫번째 1x1 Conv를 3x3 Conv로 교체
-> 분리된 head 사용
YoloV9 (2024.02)
- paper : https://arxiv.org/abs/2402.13616
- github : https://github.com/WongKinYiu/yolov9
- backbone : GELAN
-> information bottleneck 문제 해결 위해 PGI 제안
-> gradient path planning에 기초한 새로운 lightweight network 아키텍처
- neck : PGI
-> information bottleneck과 reversible function 문제를 해결하고 multiple objective를 달성하기 위해 PGI 개념 제안
YoloV10 (2024.05)
- paper : https://arxiv.org/pdf/2405.14458
- github : https://github.com/THU-MIG/yolov10
- backbone : CSPNet
- NMS 제거 -> daul label assignments 사용
- rank-guided block design 적용
-> 중복 연산 제거
-> CIB (compact inerted block)