[ 배운 내용 ]
1. Object Detection
- Bounding Box
- Multi-Class Classification
- Confidence Score
- Backbone + Head
2. Pretrained Object Detection 모델 사용해보기
- YOLO
3. Object Detection Metrics
Object Detection
Object Detection
= Classification + Localization
Object Detection을 수행하는데에 있어서 다음의 4가지 핵심적인 내용들을 알 필요가 있다.
- Bounding Box
- Multi-class Classification
- Confidence Score
- Backbone + Head
1) Bounding Box
: 하나의 오브젝트가 포함된 최소크기 Box
구성요소 : 위치정보
- 좌표 : x, y
- 크기 : w, h
정답을 예측하는 위치정보로서 Bounding Box를 사용한다.
- Ground-truth Box : 실제로 오브젝트가 포함된 박스
- Predicted Bounding Box : 모델이 오브젝트가 있다고 예측한 박스
Ground-trugh Box의 위치정보 x,y,w,h값과 Predicted Bounding Box가 예측한 위치정보 x^,y^,w^,h^값을 서로 비교해주어서 모델이 오브젝트의 위치를 잘 예측했는지를 판단한다.
x와 x^가, y와 y^가 유사한 값을 갖는다면 Bounding Box의 꼭지점을 잘 예측한 것이고,
w와 w^가, h와 h^가 유사한 값을 갖는다면 Bounding Box의 크기을 잘 예측한 것이라고 볼 수 있다.
뉴럴 네트워크 관점에서의 지도학습은
실제값과 예측값으로 만들어진 에러를 줄여나가는 방향으로 가중치값을 업데이트 하는 것을 의미한다.
위에서 설명한 Bounding Box의 경우에도 모델이 예측한 x,y,w,h 값을 실제 x,y,w,h값에 점점 가까워지도록 학습이 이루어질 것이다.
따라서 Bounding Box의 위치정보는 선형회귀 문제를 풀듯이 예측을 해주어야 하기 때문에 Bounding Box Regression 이라고도 한다.
이렇게 Bounding Box를 사용해서는 오브젝트의 위치에 대해서만 예측이 가능하지, 오브젝트의 분류까지 수행하지는 않는다.
따라서 Object Detection = Classification + Localization에서 Localization만 만족하고 있다고 볼 수 있다.
2) Multi-Class Classification
모델은 오브젝트가 어떤 클래스인지 알려주기 위해 멀티클래스 분류를 수행해주어야 한다.
아래 그림을 참고해보면 이미지에 있는 오브젝트를 고양이라고 분류하기 위해 Ground-truth Bounding Box에는 라벨링 값으로서 Cat의 값이 1로 One-hot Encoding이 되어 있는 값이 있을 것이다.
이와 비슷하게 모델이 예측한 바운딩 박스에서는 분류 결과를 내주기 위해 각 클래스별 확률값을 갖는다.
3) Confidence Score
Confidence Score
: 바운딩 박스 내부에 오브젝트가 있는지에 대한 확신의 정도를 나타내는 값
Ground Box와 모델이 예측한 박스에는 각각의 Confidence score값을 갖는다.
바운딩 박스의 정의가 오브젝트가 포함되어 있는 박스이고, Ground Box는 애초에 오브젝트(정답)가 들어있는 박스이기 때문에 Ground-truth Bounding Box의 Confidence Score는 1이다.
Predicted Bounding Box의 Confidence Score는 0~1 사이의 값을 갖는다.
- 1에 가까울수록 : 오브젝트가 있을 확률이 높음
- 0에 가까울수록 : 오브젝트가 없을 확률이 높음
4) Backbone + Head
CNN에서의 Feature Representation이란
위치 정보를 보존하여 feature를 represent하는 것을 의미했다.
기존에 CNN이 동작하는 단계를 아래 그림으로 살펴보면
Convolution 계층을 거쳐서 고양이(오브젝트)가 있는 위치 정보를 최대한 살려서 새로운 feature map을 추출하고 Convolution 계층 이후 단계에서 이 feature map들을 Flatten으로 펼쳐주고 나서 아웃풋 계층을 통해 분류를 수행해주었다. 때문에 Convolution 계층 이후의 계층들에서는 위치정보를 보존해주지 않는다.
이렇게 위치 정보는 보존한 채로 특징을 뽑아주는 CNN 모델의 특징을 사용한다면 Classification에 유용한 특징을 뽑아낼 수 있지 않을까 하는 생각에 Object Detection 모델에서는
CNN에서 위치 정보가 보존되는 Convolution 계층 부분만 가져다가 사용을 하게 되었는데 이를 Backbone 이라고 한다.
Backbone만 사용하는 것은 위치 정보를 살려서 특징을 추출하는 것까지만 수행해주기 때문에
이어서 Hidden Layer와 Output Layer등을 결합해주어 우리의 목적에 맞춰서 변형해주는 작업을 해 주어야 한다. 이를 Head라고 하며, Head 부분에서는 앞서 설명했던 x^,y^,w^,h^, Confidence Score 등의 정보를 포함하고 있을 것이다.
Pretrained Object Detection 모델 사용해보기 (YOLO)
UltraLytics 사의 YOLO 모델 사용
YOLO 모델은 UltraLytics 사에서 PyTorch를 기반으로 만든 Object Detection을 수행해주는 모델이다. 지금까지 수업에서는 텐서플로우 + 케라스 위주의 수업으로 진행했었다. 이 모델은 파이토치 기반이기 때문에 모델 자체를 공부하는 것보단 사용법만 익히는 정도로 수업을 진행했다.
- UltraLytics YOLO v3 설치 링크
https://github.com/ultralytics/yolov3#quick-start-examples
GitHub - ultralytics/yolov3: YOLOv3 in PyTorch > ONNX > CoreML > TFLite
YOLOv3 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov3 development by creating an account on GitHub.
github.com
위의 링크를 참고하여 yolov3를 clone 해오고 클론해온 yolov3로 이동해서 requirements.txt의 내용대로 설치를 해준다.
코랩환경에서 진행하였다.
- YOLOv3 패키지 설치
# 코랩에서
!git clone https://github.com/ultralytics/yolov3.git
# YOLOv3에서 요구하는 내부 패키지들 설치
!cd yolov3; pip install -r /content/yolov3/requirements.txt
git clone을 해오면 아래와 같이 yolov3 폴더가 생성된다.
- Pretrained weights 다운로드
이미 학습된 YOLO 모델(가중치)을 받아와서 사용하기 위해 다운로드를 받아준다.
https://github.com/ultralytics/yolov3/releases
Releases · ultralytics/yolov3
YOLOv3 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov3 development by creating an account on GitHub.
github.com
- YOLOv3
- YOLOv3-SPP
- YOLOv3-tiny
YOLOv3-tiny가 다른 모델에 비해 성능은 가장 떨어지지만 속도가 매우 빠르고, 다른 모델들은 속도가 좀 떨어지는 대신 성능이 좋다.
원하는 모델의 다운로드 링크 주소를 복사하고,
pretrained 모델을 저장할 폴더를 생성해주고 다운로드 받아주었다.
!mkdir [경로/디렉토리 명]
!wget -O [저장할 파일명] [파일 주소]
!mkdir /content/yolov3/pretrained
!wget -O /content/yolov3/pretrained/yolov3-fixed.pt https://github.com/ultralytics/yolov3/releases/download/v9.6.0/yolov3-tiny.pt
아래와 같이 pretrained 디렉토리 안에 yolov3-fixed 모델을 받아주었다.
[ Pretrained 모델 사용 ]
- pretrained 모델을 사용하려면 yolov3 폴더 안에 있는 detect.py 파일을 실행해준다.
- -h 옵션을 사용해서 명령어 도움말을 확인 가능하다.
!cd '/content/yolov3'; python detect.py -h
몇가지 파라미터들을 살펴보면
- --weights : pretrained 모델의 경로
- --source : 감지할 이미지의 경로 (폴더로 지정해서 여러 이미지 한꺼번에 감지 가능)
- --project : detect 결과 저장할 경로
- --name : detect 결과들을 담을 폴더
- --img : 이미지 사이즈가 맞지 않을 경우 지정한 크기로 리사이징
- --conf-thres : Confidence Score값의 threshold 지정 (넘지 못하면 감지하지 못한 것으로 간주)
- --iou-thres : IoU값의 threshold 지정
- --line-thickness : 라인의 두게
- --exist-ok : 감지결과 파일이 겹치는 것이 존재하면 그대로 덮어씌워준다. (설정 안할 시 새로 파일을 추가함)
- --device : 사용할 디바이스
※ IoU (Intersection over Union)
: Ground-truth와 Prediction 두 Bounding Box의 중복 영역 크기를 통해 평가하는 지표 (박스가 얼마나 겹치는지)
겹친 영역 / 전체 영역 ==> 겹치는 영역이 넓을수록 좋은 예측
- 테스트해보기 위한 이미지를 몇개 수집해서 data -> images 경로에 저장해두었다.
- detect.py 실행
conf-thres값을 0.3 정도로 낮게 주었기 때문에 일단 감지가 되긴 한 오브젝트들은 대부분 보여주도록 설정해주었다.
conf-thres 값을 어떻게 지정해주는지에 따라서 감지 결과가 다르게 나온다.
!cd '/content/yolov3'; python detect.py \
--weights '/content/yolov3/pretrained/yolov3-fixed.pt' \
--source '/content/yolov3/data/images' \
--project '/content/yolov3/detected'\
--name 'detected__images' \
--img 640 \
--conf-thres 0.3 \
--iou-thres 0.4 \
--line-thickness 2 \
--exist-ok \
--device CPU
[ detect 결과 확인 ]
- 참고로 YOLO 모델은 COCO Dataset으로 pretrained 되어있기 때문에 COCO 데이터셋에서 라벨링된 80개 정도의 클래스들만 분류할 수 있다.
https://tech.amikelive.com/node-718/what-object-categories-labels-are-in-coco-dataset/
What Object Categories / Labels Are In COCO Dataset?
One important element of deep learning and machine learning at large is dataset. A good dataset will contribute to a model with good precision and recall. In the realm of object detection in images…
tech.amikelive.com
# 코랩상에서 확인
from google.colab import files
from IPython.display import Image
Image(filename=[파일 경로])
신기해서 실제 사진이 아닌 게임이나 애니메이션도 인식시켜보았다.
우왕
conf-threshold값을 높게 변경해주면 인식 결과도 다르게 나온다.
0.3 -> 0.8로 변경해주었더니 더 확실하게 인식된 오브젝트들만 최종적으로 감지된 것을 볼 수 있다.
Object Detection Metrics
IoU (Intersection over Union)
: Ground-truth Bounding Box와 Prediction Bounding Box 두 박스의 겹치는 영역의 크기를 통해 평가하는 지표
겹친 영역 / 두 박스의 총 영역 으로 계산된 0~1사이의 값으로 나타내며 겹치는 영역이 넓을수록(값이 클수록) 좋은 예측이다.
[ Object Detection에서의 Confusion Matrix ]
- TP (True Positive) : 실제 오브젝트를 모델이 오브젝트라 예측 ==> Iou >= threshold
- FP (False Positive) : 오브젝트가 아닌데 모델이 오브젝트라 예측 ==> Iou < threshold
- FN (False Negative) : 실제 오브젝트를 모델이 아니라고 예측 ==> 모델이 탐지하지 못함
- TN (True Negative) : 오브젝트가 아닌데 모델도 아니라고 예측 ==> 모델이 탐지하지 않음
==> 설정한 threshold 값에 따라 Precision, Recall값이 변화한다.
Prescision
: 모델이 오브젝트라 예측한 것 중 실제 오브젝트의 비율
TP / (TP + FP)
Recall
: 실제 오브젝트 중 모델이 예측하여 맞춘 오브젝트의 비율
TP / (TP + FN)
Precision - Recall Curve
: Precision과 Recall을 모두 감안한 지표
Average Precision (AP)
: Precision - Recall Curve 그래프 아래의 면적
==> 값이 높을수록 좋다.
mean Average Precision (mAP)
: 각 클래스별 AP를 합산하여 평균을 낸 것
'KT AIVLE School' 카테고리의 다른 글
(12주차 - 22.09.30) 언어지능딥러닝1 - 자연어처리 기술, 기계학습 기반 자연어처리 (0) | 2022.10.01 |
---|---|
(10주차 - 22.09.22-23) 시각지능딥러닝3 - 커스텀 이미지 데이터 Detection하기 + Annotation (0) | 2022.09.22 |
(10주차 - 22.09.19) 시각지능딥러닝1 - BatchNormalization, Dropout, Conputer Vision (CNN) (0) | 2022.09.20 |
(9주차 - 22.09.16) 딥러닝4 - Connection (0) | 2022.09.18 |
(9주차 - 22.09.15) 딥러닝3 - 이미지(비정형)데이터 분류 (ANN 방식) (0) | 2022.09.16 |