[ 배운 내용 ]
1. Video Detection
2. Custom Data Image Detection
Video Detection
오늘은 동영상에서 Object Detection을 수행하는 실습을 진행하였다.
사실 비디오도 따지고 보면 연속된 이미지의 모임이기 때문에 이전 실습시간에 진행했던 Image Detection과 방법은 모두 동일해서 내용정리는 생략하겠다.
동영상의 총 프레임을 계산하기 때문에 CPU로 Detect해줄 경우 속도가 너무 느려서 런타임을 GPU로 하고 진행했다.
Custom Data Image Detection
이전 실습의 내용들은 COCO Dataset 분류 문제를 기준으로 학습이 되어 있는 YOLO 모델을 사용해보는 것이었다.
하지만 그냥 YOLO 모델을 가져다만 사용하면 COCO Dataset 분류문제를 해결하기 위한 목적으로 가중치가 조정(학습)되어 있는 모델이기 때문에 우리가 원하는 문제에 아주 적합한 모델은 아니다.
분류하는 클래스의 수도 COCO Dataset의 80가지 클래스만 있기 때문에 우리가 분류하기를 원하는 클래스는 라벨링이 되어 있지 않을 수 있다.
따라서 우리가 원하는 Object Detection을 수행하기 위해 직접 데이터를 수집하여 Boxing, Labeling 등의 작업을 해주어야 한다.
[ Annotation ]
이미지의 Detection 정보가 별도의 설명 파일로 제공되는 것을 Annotation이라고 한다.
Object Detection 모델을 학습시키기 위한 데이터의 정답을 생성하는 과정이라고 보면 된다.
Annotation은 오브젝트의 Bounding Box의 위치(Localization)나 오브젝트 이름(Classification) 등을 특정 포맷으로 제공해준다.
컴퓨터 비전 데이터를 위한 Annotation Tool중 하나인 CVAT로 Annotation 작업을 해줄 수 있다.
아래와 같이 CVAT 상에서 직접 수집한 얼룩말, 코끼리, 기린, 표범의 사진들에 Boxing(Labeling)을 진행해주었다.
어노테이션을 마치고 Export를 해주면 데이터와 클래스 등의 정보가 들어있는 폴더가 만들어진다.
이 커스텀 데이터를 사용해서 학습시키기 위해 데이터를 모델에 인식시켜줄 yaml파일을 만들어주어야 한다.
[ Custom yaml 구조 ]
yaml 파일에는 아래의 정보들이 들어 있으며, 다운받은 데이터셋의 구조는 yaml 설정과 같아야 한다.
- 데이터셋 경로 설정
- 클래스 수 / 클래스 명
- 데이터셋 다운로드 경로 (옵션 -> 데이터셋을 다운로드 받아올 경우에 지정)
위 파일의 경우는 구글 코랩 상에서 train 데이터를 저장할 경로를 설정해주었고, Zebra, Elephant, Giraffe, Leopard 4가지의 클래스를 설정해주었다.
커스텀 데이터 Detection 실습
YOLO 모델을 가져다 쓰지만 train 부분만 떼와서 내가 직접 수집한 데이터로 학습시키고 detect시켜보았다.
위에서 CVAT으로 Annotation까지 완료된 동물 사진 데이터를 활용하였다.
이번에는 yolov3보다 성능이 좋은 yolov5를 사용했다.
- yolov5 패키지 설치
# UltraLytics git에서 복사
!git clone https://github.com/ultralytics/yolov5
# yolov5 폴더 이동 및 requirements.txt 내부 패키지 설치
!cd yolov5; pip install -r requirements.txt
이번 실습에서는 사전 작업된 yaml파일을 다운로드 하는 것과 train.py를 실행하는 과정이 추가된다.
- 사전 작업된 Custom Data의 yaml 다운로드
- pretrained된 weights(모델) 다운로드
- train.py 실행 (yolo모델 학습)
- detect.py 실행
먼저 yolov5모델의 pretrained weights를 다운받아주었다.
https://github.com/ultralytics/yolov5
GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite
YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 development by creating an account on GitHub.
github.com
!mkdir '/content/yolov5/pretrained'
!wget -O '/content/yolov5/pretrained/yolo5n.pt' 'https://github.com/ultralytics/yolov5/releases/download/v6.2/yolov5n.pt'
- 그다음 커스텀 데이터의 yaml 파일과 train, test용 데이터들을 직접 코랩으로 옮겨주었다.
train 데이터셋은 압축파일로 받아온 뒤 datasets폴더에 압축을 풀어주었다.
!mkdir '/content/datasets'
!unzip '/content/animals_custom.zip' -d '/content/datasets/animals_custom'
이제 모델을 학습시키기 위해 train.py 를 실행해주어야 한다.
- train.py 실행
!cd yolov5; python train.py \
--data '/content/yolov5/data/animals_custom.yaml.txt' \ # 커스텀 데이터를 인식하기 위한 .yaml파일
--cfg '/content/yolov5/models/yolov5n.yaml' \ # yolo5s의 아키텍쳐 yaml 파일
--weights '/content/yolov5/pretrained/yolo5n.pt' \ # 사전학습된 가중치
--epochs 1000 \
--patience 10 \
--img 640 \
--project '/content/yolov5/trained' \ # 학습결과 저장 위치
--name 'trained_animals1' \ # 학습결과 저장 위치
--exist-ok
- --data : 커스텀 데이터를 인식하기 위한 yaml파일의 경로
- --cfg : yolo5s의 아키텍쳐를 불러오기 위한 yaml의 경로
- --weights : 사전학습된 가중치 불러오기(detect시에 사용한 옵션과 동일)
- epochs, patience 등 지표는 기존에 딥러닝 실습에서 사용한 파라미터와 동일한 용도다.
- --project와 --name에서 지정한 경로로 최고 성능의 모델이 저장된다.
Early Stopping으로 학습이 끝났고, 최고 성능의 모델은 지정한 경로에 best.pt 라는 이름으로 저장된다.
이후 detect.py를 실행할 때 커스텀 데이터로 학습된 best.pt 를 사용해주었다.
!cd yolov5; python detect.py \
--weights '/content/yolov5/trained/trained_animals1/weights/best.pt' \
--source '/content/yolov5/data/images/animals_test' \
--project '/content/yolov5/detected' \
--name '/content/yolov5/detected/detected_images' \
--img 640 \
--conf-thres 0.5 \
--iou-thres 0.4 \
--line-thickness 3 \
--exist-ok
- image detect 결과
무늬 때문에 그런건지 표범이 생각보다 인식이 잘 되지 않았다.
- video detect 결과
막상 해보니 성능이 생각보다 좋지는 않았던 것 같다.
처음에는 patience를 5 --> 10으로 늘려보니 성능이 좀 좋아졌고,
이미지들을 라벨링 한 박스 사이즈를 줄여보며 어노테이션 작업을 수정해본 뒤 돌려봤는데 크게 개선된 것 같진 않아 보였다.
오히려 맨 처음 동물들의 전체 모습을 최대한 담아서 Boxing 했을 때 patience=10일 때가 가장 괜찮게 나왔던 것 같다.
커스텀 데이터셋을 준비할 때 train용 사진에는 한 사진의 여러 클래스가 들어 있는 것이 좋다고 한다.
한 사잔의 하나의 클래스만 중앙에 크게 나와있는 식의 사진은 그렇게 좋은 데이터는 아닌 것 같다. 이러면 Object Detection보다는 Classification에 가까운 문제가 된다고 한다.
그리고 라벨링 작업 시에 Box를 어떻게 그려주는지도 굉장히 중요했다. 픽셀 하나하나가 성능을 많이 바꿀 수 있기 때문에 '오브젝트를 감싸는 최소 크기의 박스' 라는 개념을 떠올리면서 신중하게 그려주는 것이 좋다.
다음에 또 커스텀 데이터셋을 준비할 때는 최대한 하나의 사진에 여러 클래스들이 들어 있는 사진들을 많이 수집하고, 라벨링도 조금 더 세심하게 신경써서 해야할 것 같다.
'KT AIVLE School' 카테고리의 다른 글
(12주차 - 22.10.04) 언어지능딥러닝2 - 텍스트 마이닝, 워드 임베딩 (0) | 2022.10.05 |
---|---|
(12주차 - 22.09.30) 언어지능딥러닝1 - 자연어처리 기술, 기계학습 기반 자연어처리 (0) | 2022.10.01 |
(10주차 - 22.09.20~21) 시각지능딥러닝2 - Object Detection (YOLO) (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 |