벌써 시각지능_딥러닝의 4일차를 보냈습니다. 오늘은 비디오를 Detection 연습을 진행했습니다.
Pascal과 MS COCO 데이터 셋이 있는데 요즘은 학습용이나 검증용으로 MS COCO 데이터 셋을 많이 이용합니다.
Object Detection를 사용하게 되면 Object가 어디 있는지 박스형태로 표현하게 됩니다. 이 박스를 Bounding Box라고 말하며 하나의 Object가 들어있는 최소의 크기 박스입니다.
어제와 다르게 사진 여러개를 기준으로 실습하겠습니다.
먼저 기존 YOLOv3로 실습했었는데 똑같이 불러오고사용법은 같으니 어제와 코드가 다른부분만 남기겠습니다.
▶YOLO v3를 설치해줍니다.
▶원하는 이미지를 다운 받거나 옮겨줍니다.(여러장의 이미지를 다운받아 넣습니다.)
▶YOLO v3의 *Pretrained**를 다운받아줍니다.
▶detect.py를 실행합니다.
!cd yolov3; python detect.py \
--weights '/content/yolov3/pretrained/yolov3-tiny.pt' \
--source '/content/yolov3/data/images/' \
--project '/content/yolov3/detected' \
--name 'images' \
--img 640 \
--conf-thres 0.35 \
--iou-thres 0.55 \
--line-thickness 1 \
--exist-ok
여기서 이제 폴더 자체를 경로로 넣어주게 되면 해당 폴더에 있는 이미지들에 대해서 모두 Detection이 진행되기 때문에 어제는 폴더 경로 + 사진명의 확장자까지 써줬다면 오늘은 폴더 자체를 경로로 잡아주었습니다.
▶결과 확인
from google.colab import files
from IPython.display import Image
import os
사용할 패키지들을 호출해주고
image_dir = '/content/yolov3/detected/images/'
# 디렉토리 내 이미지 파일들을 가져와서 출력
for filename in os.listdir(image_dir):
if filename.endswith('.jpg'):
display(Image(filename=image_dir+filename))
반복문을 통해 이제 Detection된 이미지파일들을 확인할 수 있습니다.
두 박스의 중복 영역 크기를 통해 평가를 합니다. 겹치는 영역이 넓을수록 좋은 예측이 가능합니다. 2개의 박스라하면 Ground-Truth Bounding Box와 Prediction Bounding Box를 의미합니다.
Confidence Score는 해당 Bounding Box 내부에 Object가 존재할 확률을 나타내주지만 Object가 어떤 클레스인지는 모릅니다. Object의 위치에 생긴 Bounding Box와 Predicted Box의 IoU가 높다면 같은 Object를 가리키는 것을 의미합니다. 따라서 해당 Predicted Box는 삭제를 하며 이런 과정이 모든 클레스에 대해서 수행합니다. 해당 과정을 더 풀어 써보자면 Object Detection 모델은 예측된 모든 Bounding Box에 대해 해당 Box 내부에 Object가 존재할 확률이 일정 Threshold 이상인 Box를 선택합니다. 선택된 Box들 중에서 IoU 값이 일정 Threshold 이상인 Box들을 하나의 Object로 간주하고, 이 중 가장 Confidence Score가 높은 Box를 해당 Object의 클래스로 예측합니다. 이후에는 해당 클래스에 맞는 라벨을 Bounding Box에 표시하여 최종 Object Detection 결과를 출력합니다.
NMS(Non-Maximum Suppression) 추론 과정이 수많은 박스중에서 가장 확률이 높은 박스를 제외하고 없애줍니다. annotaion이 정답을 알려주는 값입니다.
※IoU는 예측된 바운딩 박스와 실제 바운딩 박스가 얼마나 겹치는지를 나타내주는 값입니다.
IoU 설정에 따라 물체 검출량이 달라집니다. 만약 IoU-thress의 값을 높이게 되면 겹치는 영역이 많은 경우에만 물체를 검출하기 때문에 오분류는 줄어들지만 물체 검출량이 줄어듭니다. 만약 줄이게 되면 물체 검출량은 많아지지만 오분류가 많아집니다.
큰 틀은 이미지를 YOLO를 활용해서 Detection하는 거와 같습니다. 하지만 Pretrain 모델을 불러오는 부분이 달라집니다 전체적으로 복습겸 처음부터 작성해보겠습니다.
▶YOLOv3를 설치합니다.
!git clone https://github.com/ultralytics/yolov3.git
코랩의 환경에서 진행하기 때문에 오류 방지를 위에 아래코드를 작성해줍니다.
temp_str = 'setuptools<=64.0.2\n'
f = open('/content/yolov3/requirements.txt', 'r')
f_str = f.readlines()
f.close()
f2 = open('/content/yolov3/requirements.txt', 'w')
for idx, val in enumerate(f_str) :
if 'setuptools' in val :
idx_v = idx
f_str.remove(val)
f_str.insert(idx_v, temp_str)
for val in f_str :
f2.write(val)
f2.close()
다음으로 YOLO폴더로 이동해서 필요작업을 더 해줍니다.
!cd '/content/yolov3/'
이동 했다면 아래 명령어를 통해 설치해줍니다.
!pip install -r /content/yolo3/requirements.txt
▶Detection하고자 하는 파일 준비
저는 폴더를 생성후 유튜브 파일을 받아서 해당 코랩상에 만든 폴더로 이동해주었습니다.
!mkdir /content/yolo3/data/videos
yolo3폴더 밑의 data폴더 생성해주고 아래 videos폴더까지 생성해준 후에 해당 폴더에 동영상을 넣었습니다.(영상이 길면 작업 시간이 오래걸려서 저는 쇼츠를 활용했습니다.)
또 파이튜브라는 것을 이용하면 바로 코랩으로 다운 받을 수 있다고 하는데 저는 시도하지는 않아서 이번 포스팅에서는 넘어가도록 하겠습니다.
▶Pretrained 모델 다운
먼저 모델을 저장 관리할 폴더를 하나 생성해줍니다.
!mkdir /content/yolov3/pretrained
이제 해당 폴더로 다운 받아줍니다.
!wget -O /content/yolov3/pretrained/yolov3.pt https://github.com/ultralytics/yolov3/releases/download/v9.6.0/yolov3.pt
해당 다운받은 깃허브의 주소는 맨 아래에 공지해두도록 하겠습니다.
▶detect.py 실행
이제 모든 준비가 완료되었으므로 detect.py를 실행해서 Object Detection하도록 하겠습니다.
!cd yolov3; python detect.py \
--weights '/content/yolov3/pretrained/yolov3.pt' \
--source '/content/yolov3/data/videos/accident1.mp4' \
--project '/content/yolov3/detected/' \
--name 'videos' \
--img 640 \
--conf-thres 0.4 \
--iou-thres 0.2 \
--line-thickness 1 \
--exist-ok \
제가 저장한 영상의 이름은 accident1입니다. 이제 작업이 끝나기를 기다립니다.
▶결과 확인
이제 작업이 모두 완료가 되었으면 아래 명령어를 통해 확인합니다.
from google.colab import files
먼저 필요패키지를 준비해줍니다.
files.download(filename='/content/yolov3/detected/videos/accident1.mp4')
코랩에서는 영상을 바로 확인할 수가 없기 때문에 위의 코드를 통해 작업이 완료된 영상을 다운받아주도록 합니다.
위 코드 순으로 진행하면 영상에 대해서도 YOLOv3모델을 활용해 Object Detection이 가능합니다.
※딥러닝에서의 지도학습은 에러를 줄이는 방향으로 가중치를 업데이트하는 것입니다.
Bounding box 위치정보는 회귀문제를 풀듯이 접근하여 Bounding Box Regression이라고도 합니다. 위치정보만 알고 있고 해당 Box안에 있는 Object의 클레스는 알지 못합니다.
Class Classification은 Object가 어떤 클레스인지 알려주는 과정입니다.
Confidence Score는 박스안에 Object가 있는 확률을 수치로 알려줍니다. 수치는 0~1의 값을 가지는데 1에 가까울수록 Object가 있을 가능성이 높다는 것을 의미합니다.
CNN은 Feature Repressentation을 추출합니다. Repressentation은 위치정보를 보존하면서 특징을 표현하는 것을 의미합니다. 이렇게 출력한 Feature Repressentation을 가지고 Bounding Box를 예측합니다. 이 Bounding Box는 위치정보를 의미합니다. 따라서 잘 학습된 모델을 가져다 쓴다면 위치정보를 잘 추출할 것이라는 기대를 가질 수 있게 됩니다. 이런 과정으로 좋은 모델을 가져오는 것와서 사용한 모델을 Back Bone라 하여 뼈대 모델이라고도 합니다. 그리고 해당 모델을 토대로 우리가 해결하고자 하는 문제에 맞게 바꾸는 것을 Head라고 합니다.
※이번 실습에 사용한 YOLO의 깃 주소 : https://github.com/ultralytics/yolov3/releases
오늘은 동영상에 대한 Detection과 이론 위주로 배운 하루라 주말에 한번더 정리하면 좋을 것 같습니다.
※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.