새싹 인공지능 응용sw 개발자 양성 교육 프로그램 심선조 강사님 수업 정리 글입니다.
객체 탐지 (Object Detection)
- 한 이미지에서 객체와 그 경계 상자(bounding box)를 탐지
- 객체 탐지 알고리즘은 일반적으로 이미지를 입력으로 받고, 경계 상자와 객체 클래스 리스트를 출력
- 경계 상자에 대해 그에 대응하는 예측 클래스와 클래스의 신뢰도(confidence)를 출력
Applications
- 자율 주행 자동차에서 다른 자동차와 보행자를 찾을 때
- 의료 분야에서 방사선 사진을 사용해 종양이나 위험한 조직을 찾을 때
- 제조업에서 조립 로봇이 제품을 조립하거나 수리할 때
- 보안 산업에서 위협을 탐지하거나 사람 수를 셀 때
Bounding Box
IOU(Intersection Over Union)
지도학습인 경우 데이터랑 답을 줘야 됨
객체탐지라이브러리에서 객체를 표시하는 정보(좌표값), 5개를 분류하라고 하면 CLASS는 5개[0,1,2,3,4],답을 만들어서 같이 줘야 함. 해당하는 오브젝트를 감싸는 작은 직사각형이 정답이다. IoU는 정답과 예측이 100%일치하면 오차가 없다.
두 공간이 오버랩되는 부분이 분자
정답영역과 예측영역을 합산이 분모
-
IOU가 높을수록 잘 예측한 모델
-
예시
NMS(Non-Maximum Suppression, 비최댓값 억제)
모델 성능 평가
정밀도(Precision)와 재현율(Recall)
정밀도-재현율 곡선(Precision-Recall Curve)
- 신뢰도 임계값마다 모델의 정밀도와 재현율을 시각화
- 모든 bounding box와 함께 모델이 예측의 정확성을 얼마나 확실하는지 0 ~ 1사이의 숫자로 나타내는 신뢰도를 출력
- 임계값 T에 따라 정밀도와 재현율이 달라짐
- 임계값 T 이하의 예측은 제거함
임계값을 넘어야 객체인식이 된다, 임계값기본은 0.5, 임계값이 1에 가까우면 정밀도가 높아짐
- T가 1에 가까우면 정밀도는 높지만 재현율은 낮음
- 놓치는 객체가 많아져서 재현율이 낮아짐. 즉, 신뢰도가 높은 예측만 유지하기때문에 정밀도는 높아짐
- T가 0에 가까우면 정밀도는 낮지만 재현율은 높음
- 대부분의 예측을 유지하기때문에 재현율은 높아지고, 거짓긍정(FP)이 많아져서 정밀도가 낮아짐
- 예를 들어, 모델이 보행자를 탐지하고 있으면 특별한 이유없이 차를 세우더라도 어떤 보행자도 놓치지 않도록 재현율을 높여야 함
- 모델이 투자 기회를 탐지하고 있다면 일부 기회를 놓치게 되더라도 잘못된 기회에 돈을 거는 일을 피하기 위해 정밀도를 높여야 함
recall이 1이면 fallout도 1
precision-recall ↓ recall ↑
precision-recall ↑ recall ↓
AP (Average Precision, 평균 정밀도) 와 mAP(mean Average Precision)
mAP ap의 평균
-
곡선의 아래 영역에 해당
-
항상 1x1 정사각형으로 구성되어 있음
즉, 항상 0 ~ 1 사이의 값을 가짐
-
단일 클래스에 대한 모델 성능 정보를 제공
-
전역 점수를 얻기위해서 mAP를 사용
-
예를 들어, 데이터셋이 10개의 클래스(10개를 구분한다)로 구성된다면 각 클래스에 대한 AP를 계산하고, 그 숫자들의 평균을 다시 구함(=mAP)
-
mAP 사용
데이터셋(Dataset)
VOC Dataset
-
2005년부터 2012년까지 진행
-
Object Detection 기술의 benchmark로 간주
-
데이터셋에는 20개의 클래스가 존재
background
aeroplane
bicycle
bird
boat
bottle
bus
car
cat
chair
cow
diningtable
dog
horse
motorbike
person
pottedplant
sheep
sofa
train
tvmonitor
-
훈련 및 검증 데이터 : 11,530개
-
ROI에 대한 27,450개의 Annotation이 존재(label)
-
이미지당 2.4개의 객체 존재
라이브러리마다 포멧이 다르기 때문에 맞춰서 label작업을 해야 한다.
### COCO Dataset
- Common Objects in Context
- 200,000개의 이미지
- 80개의 카테고리에 500,000개 이상의 객체 Annotation이 존재
person
bicycle
car
motorbike
aeroplane
bus
train
truck
boat
traffic light
fire hydrant
stop sign
parking meter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
backpack
umbrella
handbag
tie
suitcase
frisbee
skis
snowboard
sports ball
kite
baseball bat
baseball glove
skateboard
surfboard
tennis racket
bottle
wine glass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hot dog
pizza
donut
cake
chair
sofa
pottedplant
bed
diningtable
toilet
tvmonitor
laptop
mouse
remote
keyboard
cell phone
microwave
oven
toaster
sink
refrigerator
book
clock
vase
scissors
teddy bear
hair drier
toothbrush
- https://cocodataset.org/
객체 탐지 (Object Detection)의 역사
2012이후로 딥러닝나옴
two-stage detector 1단계 걸쳐서 처리, 속도는 빠르지만 오차가 two-stage detector보다 큼
two-stage detector 2단계 걸쳐서 처리
오브젝트 디텍션은 속도가 빨라야 한다.
YOLO는 속도, 정확도 괜찮음
-
RCNN (2013)
- Rich feature hierarchies for accurate object detection and semantic segmentation (https://arxiv.org/abs/1311.2524)
- 물체 검출에 사용된 기존 방식인 sliding window는 background를 검출하는 소요되는 시간이 많았는데, 이를 개선시킨 기법으로 Region Proposal 방식 제안
- 매우 높은 Detection이 가능하지만, 복잡한 아키텍처 및 학습 프로세스로 인해 Detection 시간이 매우 오래 걸림
-
SPP Net (2014)
- Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition (https://arxiv.org/abs/1406.4729)
- RCNN의 문제를 Selective search로 해결하려 했지만, bounding box의 크기가 제각각인 문제가 있어서 FC Input에 고정된 사이즈로 제공하기 위한 방법 제안
- SPP은 RCNN에서 conv layer와 fc layer사이에 위치하여 서로 다른 feature map에 투영된 이미지를 고정된 값으로 풀링
- SPP를 이용해 RCNN에 비해 실행시간을 매우 단축시킴
-
Fast RCNN (2015)
- Fast R-CNN (https://arxiv.org/abs/1504.08083)
- SPP layer를 ROI pooling으로 바꿔서 7x7 layer 1개로 해결
- SVM을 softmax로 대체하여 Classification 과 Regression Loss를 함께 반영한 Multi task Loss 사용
- ROI Pooling을 이용해 SPP보다 간단하고, RCNN에 비해 수행시간을 많이 줄임
-
Fater RCNN(2015)
- Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks (https://arxiv.org/abs/1506.01497)
- RPN(Region proposal network) + Fast RCNN 방식
- Selective Search를 대체하기 위한 Region Proposal Network구현
- RPN도 학습시켜서 전체를 end-to-end로 학습 가능 (GPU사용 가능)
- Region Proposal를 위해 Object가 있는지 없는지의 후보 Box인 Anchor Box 개념 사용
- Anchor Box를 도입해 FastRCNN에 비해 정확도를 높이고 속도를 향상시킴
-
SSD (2015)
- SSD: Single Shot MultiBox Detector (https://arxiv.org/abs/1512.02325)
- Faster-RCNN은 region proposal과 anchor box를 이용한 검출의 2단계를 걸치는 과정에서 시간이 필요해 real-time(20~30 fps)으로는 어려움
- SSD는 Feature map의 size를 조정하고, 동시에 앵커박스를 같이 적용함으로써 1 shot으로 물체 검출이 가능
- real-time으로 사용할 정도의 성능을 갖춤 (30~40 fps)
- 작은 이미지의 경우에 잘 인식하지 못하는 경우가 생겨서 data augmentation을 통해 mAP를 63에서 74로 비약적으로 높임
-
RetinaNet (2017)
- Focal Loss for Dense Object Detection (https://arxiv.org/abs/1708.02002)
- RetinaNet이전에는 1-shot detection과 2-shot detection의 차이가 극명하게 나뉘어 속도를 선택하면 정확도를 trade-off 할 수 밖에 없는 상황
- RetinaNet은 Focal Loss라는 개념의 도입과 FPN 덕분에 기존 모델들보다 정확도도 높고 속도도 여타 1-shot detector와 비견되는 모델
- Detection에선 검출하고 싶은 물체와 (foreground object) 검출할 필요가 없는 배경 물체들이 있는데 (background object) 배경 물체의 숫자가 매우 많을 경우 배경 Loss를 적게 하더라도 숫자에 압도되어 배경의 Loss의 총합을 학습해버림 (예를 들어, 숲을 배경으로 하는 사람을 검출해야하는데 배경의 나무가 100개나 되다보니 사람의 특징이 아닌 나무가 있는 배경을 학습해버림)
- Focal Loss는 이런 문제를 기존의 crossentropy 함수에서 (1-sig)을 제곱하여 background object의 loss를 현저히 줄여버리는 방법으로 loss를 변동시켜 해결
- Focal Loss를 통해 검출하고자 하는 물체와 관련이 없는 background object들은 학습에 영향을 주지 않게 되고, 학습의 다양성이 더 넓어짐 (작은 물체, 큰 물체에 구애받지 않고 검출할 수 있게됨)
- 실제로 RetinaNet은 object proposal을 2000개나 실시하여 이를 확인
-
Mask R-CNN (2018)
-
YOLO (2018)
- YOLOv3: An Incremental Improvement (https://arxiv.org/abs/1804.02767)
- YOLO는 v1, v2, v3의 순서로 발전하였는데, v1은 정확도가 너무 낮은 문제가 있었고 이 문제는 v2까지 이어짐
- 엔지니어링적으로 보완한 v3는 v2보다 살짝 속도는 떨어지더라도 정확도를 대폭 높인 모델
- RetinaNet과 마찬가지로 FPN을 도입해 정확도를 높임
- RetinaNet에 비하면 정확도는 4mAP정도 떨어지지만, 속도는 더 빠르다는 장점
-
RefineDet (2018)
-
M2Det (2019)
-
EfficientDet (2019)
-
YOLOv4 (2020)
- YOLOv4: Optimal Speed and Accuracy of Object Detection (https://arxiv.org/pdf/2004.10934v1.pdf)
- YOLOv3에 비해 AP, FPS가 각각 10%, 12% 증가
- YOLOv3와 다른 개발자인 AlexeyBochkousky가 발표
- v3에서 다양한 딥러닝 기법(WRC, CSP ...) 등을 사용해 성능을 향상시킴
- CSPNet 기반의 backbone(CSPDarkNet53)을 설계하여 사용
-
YOLOv5 (2020)
- YOLOv4에 비해 낮은 용량과 빠른 속도 (성능은 비슷)
- YOLOv4와 같은 CSPNet 기반의 backbone을 설계하여 사용
- YOLOv3를 PyTorch로 implementation한 GlennJocher가 발표
- Darknet이 아닌 PyTorch 구현이기 때문에, 이전 버전들과 다르다고 할 수 있음
-
이후
- 수 많은 YOLO 버전들이 탄생
- Object Detection 분야의 논문들이 계속해서 나오고 있음
YOLO (You Only Look Once)
- 가장 빠른 객체 검출 알고리즘 중 하나
- 256x256 사이즈의 이미지
- 파이썬, 텐서플로 기반 프레임워크가 아닌 C++로 구현된 코드 기준 GPU 사용 시, 초당 170 프레임(170 FPS, frames per second)
- 작은 크기의 물체를 탐지하는데는 어려움
YOLO 아키텍처
-
백본 모델(backbone model) 기반
-
특징 추출기(Feature Extractor)라고도 불림
-
YOLO는 자체 맞춤 아키텍쳐 사용
-
어떤 특징 추출기 아키텍쳐를 사용했는지에 따라 성능 달라짐
-
마지막 계층은 크기가 w×h×D인 특징 볼륨 출력
-
w \times h $는 그리드의 크기이고, $D는 특징 볼륨 깊이
YOLO 계층 출력
앵커 박스(Anchor Box)
-
YOLOv2에서 도입
-
사전 정의된 상자(prior box)
-
객체에 가장 근접한 앵커 박스를 맞추고 신경망을 사용해 앵커 박스의 크기를 조정하는 과정때문에 tx,ty,tw,th이 필요