컴공생 누르지 마세요! 컴공생 울어요.
[YOLOv5] 객체 인식 모델의 인식 효율성 테스트 본문
오늘 게시글에서는 YOLOv5 알고리즘을 이용한 객체 인식 모델에 대해 실습해보고자 합니다.
졸업 프로젝트를 시작한 지 벌써 3달이 되어가고 있습니다. 중간에 분야도 바뀌고 주제도 바뀌고 참 우여곡절이 많았는데요, 그래도 결국 창업성을 고려하여 현재의 주제로 결정을 내린 후, 프로젝트를 진행하고 있습니다.
프로젝트 소개
저희의 프로젝트에 대해 먼저 설명을 드리고 싶습니다. 저희는 '영상 콘텐츠 속 한국문화요소 해설 서비스'를 개발하고자 합니다. 글로벌 OTT 서비스가 유행하면서 외국의 콘텐츠를 손쉽게 접할 수 있게 되었는데, 외국 콘텐츠 속에 등장하는 그 나라의 고유 음식이나 물건, 랜드마크와 같은 문화 요소를 인식하고 설명해주는 서비스입니다.
저희 팀의 최종 목표는 유튜브나 넷플릭스와 같은 OTT 서비스 위에서 실시간으로 동작하는 프로그램을 개발하는 것입니다. 실시간으로 인식해야하는 만큼 딥러닝 객체 인식 모델의 효율성이 가장 중요했는데요, 그래서 어떤 알고리즘이 적합할지 고민이 많았습니다.
저희 프로젝트에서 아무래도 가장 중요한 건 속도였습니다. 영상을 시청하는 사용자가 원할 때마다 바로바로 객체를 인식하고 설명을 제공해야하기 때문에 속도를 최우선으로 고려할 수 밖에 없었던 겁니다. 속도가 느린 서비스를 과연 어느 사용자가 이용하고 싶을까요? 일단 한국인은 절대 아닐 겁니다...😇
그래서 YOLOv3, YOLOv4, YOLOv5, faster RCNN 등 다양한 알고리즘을 조사하였는데, 간단한 아키텍쳐를 가지고 있어 비교적 빠른 성능을 보이는 YOLO를 사용하기로 결정하였습니다. 나름 정확성도 어느 정도 보장되어 널리 쓰이는 알고리즘이었으니까요.
그래서 본 포스트에서는 YOLO, 그 중에서도 YOLOv5를 이용하여 객체 인식 모델의 성능을 테스트하는 실습을 진행하고자 합니다.
실습의 프로세스는 다음과 같습니다.
1. 구글 코랩에서 yolov5 모델 세팅
2. 데이터별 속도 성능 비교 테스트
- 영상 vs 사진
- 길이가 다른 영상
- 화질이 다른 영상
본 포스트의 목적은 데이터별로 객체 인식 모델의 성능을 테스트하는 것이기 때문에, yolov5 모델을 직접 학습시키는 과정은 생략하였습니다.
구글 코랩 YOLOv5 모델 세팅
저는 구글 코랩을 사용하였습니다. 코랩은 구글에서 제공하는 Jupyter Notebook으로, 딥러닝 모델을 학습시키는데 적합하지 않은 pc를 가지고 있는 사람들이 손쉽게 모델을 학습할 수 있는 서비스입니다.
구글 코랩을 사용하기 위해서는 런타임 유형을 GPU로 설정해주어야 합니다.
메뉴바의 런타임 -> 런타임 유형 변경 -> GPU 선택 -> 저장
그리고 아래와 같은 코드를 입력하여 github에서 yolov5를 clone하고, 필요한 requirements를 설치합니다. 그리고 torch나 IPython.display와 같은 패키지들을 가져옵니다.
!git clone https://github.com/ultralytics/yolov5
!pip install -r yolov5/requirements.txt
%cd yolov5
import torch
from IPython.display import Image, clear_output
clear_output()
print('Setup complete. Using torch %s %s' % (torch.__version__, torch.cuda.get_device_properties(0) if torch.cuda.is_available() else 'CPU'))

잠시 기다리시면 드라이브 마운트가 완료되고, 아래와 같이 파일 항목에 drive가 추가됩니다.

이제 구글 코랩에서 yolov5 모델을 사용하기 위한 모든 준비를 마쳤습니다.
yolov5 모델 테스트
yolov5 모델이 잘 돌아가는지 테스트를 해볼까요? 사람들이 많이 보는 유튜브에서 너무 길지도, 그렇다고 너무 짧지도 않은 영상을 하나 가져왔습니다. 우리 프로젝트가 문화 요소를 인식하고 알려주는 서비스인만큼 (비록 아직 문화 요소를 학습시키지는 않았지만) 한국을 소개하는 영상을 선택하였습니다.
이 영상을 구글 드라이브에 업로드한 뒤, 코랩에서 영상 경로를 ./drive/MyDrive에서 ./yolov5로 이동하였습니다.
그 후 아래와 같은 코드를 실행하였습니다.
%%time
!python detect.py --weights yolov5x.pt --img 1280 --conf 0.4 --source ./FeeltheRhythmofKorea.mp4
이때, weights에는 yolov5x.pt 말고도 s, m, l이 있는데 가장 성능이 좋은 xlarge 모델을 선택하였습니다. 그리고 파일 이름에는 띄어쓰기가 없어야 합니다. 깜박 잊고 파일 이름에 띄어쓰기를 넣었더니 에러가 나더라구요.
코드를 실행하게 되면 아래처럼 영상의 프레임마다 객체를 인식한 결과를 출력합니다.
코드 수행이 끝났다면 결과 영상을 다운로드 받기 위해 아래와 같은 코드를 실행해주세요.
from google.colab import files
files.download('/content/yolov5/runs/detect/exp2/FeeltheRhythmofKorea.mp4')
이때, 결과 영상이 저장 되어 있는 경로는 이전 코드의 실행 결과에 나와있으니 참고해주세요.
결과 영상은 다음과 같습니다.
잘 인식하네요!
데이터별 속도 성능 비교 테스트
그럼 이제부터 데이터별로 속도 성능 비교 테스트를 해보겠습니다.
1. 영상 vs 초당 4프레임으로 추출된 이미지
2. 영상 vs 초당 6프레임으로 추출된 이미지
3. 저화질 영상 vs 고화질 영상
저희 서비스가 실시간으로 빠른 속도를 보장하기 위해서는 타겟 데이터를 영상으로 해야할지, 아니면 그 영상에서 추출된 초당 프레임 이미지로 해야할지 결정이 필요할 것 같아 위와 같이 비교하고자 합니다. 그리고 초당 더 많은 프레임을 추출할 경우 적은 프레임 이미지와 어떻게 다를지도 궁금하여 위와 같이 비교군을 만들었습니다.
추가적으로 OTT 서비스가 다양한 화질을 제공하는 만큼 우리 서비스를 이용하는 사용자도 다양한 화질에서 이용할 것을 고려하여 저화질과 고화질 영상도 비교해보고자 합니다.
1. 영상 vs 초당 4프레임으로 추출된 이미지
우선 영상 데이터는 위에서 한 방법과 똑같이 객체 인식을 진행하였습니다. 그 결과로 나온 영상은 아래와 같습니다.
10초 mp4 영상을 yolov5 모델로 돌렸더니 아래와 같은 성능을 보였으며, 결과적으로 총 2min 57s가 걸렸습니다.
이제 이미지에 대해 객체 인식을 진행해보겠습니다.
우선 원본 영상에서 프레임 이미지를 추출하기 위해 다음과 같은 코드를 실행하여 github에 업로드 되어있는 ffmpeg를 clone하였습니다. 그 후 1초 당 4프레임으로 이미지를 추출하였습니다.
!git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
!ffmpeg -i '/content/dataset/10sTestVideo720.mp4' -vf fps=4 image-%d.jpeg
추출한 이미지에 대해 아래의 코드로 yolov5 모델을 적용해보았습니다.
%%time
!python detect.py --weights yolov5x.pt --img 1280 --conf 0.4 --source /content/yolov5/dataset/img
그 결과 아래와 같이 객체가 인식 된 이미지를 구할 수 있었습니다.
전체적으로 mp4보다 확실히 속도가 빨랐습니다. 하지만 객체 인식의 정확성이 mp4에 비해서 확연히 떨어졌는데요.
위 사진처럼 mp4에서는 곧잘 인식하던 bicycle을 해당 장면에서 잘 인식하지 못했고,
안경 쓴 사람 얼굴을 traffic light으로 인식하기도 하였습니다. mp4에서는 person이라고 잘 인식하던 것과 대조된 결과입니다.
결론적으로, 영상에 비해 사진의 객체 인식 속도가 확실히 빠르지만, 그만큼 정확도도 크게 떨어진다는 사실을 알 수 있었습니다.
2. 영상 vs 초당 6프레임으로 추출된 이미지
이번에는 초당 6프레임으로 추출된 이미지와 영상을 비교해보도록 하겠습니다.
yolov5 모델을 영상에 적용하는 것은 1에서 해보았으니, 이번에는 초당 6프레임으로 추출된 이미지에 모델을 적용하는 것만 실습해보겠습니다.
사실 이것도 1에서 진행한 과정과 크게 다를 게 없습니다. 다만 아래 코드의 숫자를 6으로 바꿔주기만 하면 됩니다.
!ffmpeg -i '/content/yolov5/dataset/10sTestVideo720.mp4' -vf fps=6 image-%d.jpeg
객체 인식을 진행한 결과, 우선 성능은 다음과 같았습니다.
확실히 데이터양이 많아진만큼 시간이 조금 더 오래 걸리긴 했네요. 그럼 정확도는 어떻게 달라졌을까요?
이번에는 곧잘 객체를 인식하는 듯 하였는데요, 하지만...
결국 깨달았습니다. 정확도 문제는 결코 초당 프레임을 높인다고 해결되지 않는다는 것을요. 초당 프레임을 높인다고 해도 해당 이미지에 존재하는 객체가 달라지지는 않으니까요.
이렇게 하여 yolov5 모델에서는 사진이 영상보다 속도가 빠르지만, 정확도는 영상이 사진보다 높다는 결론을 얻을 수 있었습니다.
정확도를 포기하고 속도를 확보하기 위해 이미지를 사용하는 것은 힘들 것 같고, 아무래도 영상을 인식하는 속도를 높이는 게 관건일 듯 합니다. 다음에는 실시간으로 영상을 인식하는 방법을 찾아보도록 하겠습니다. 자료조사를 할 때 웹캠을 이용하여 실시간 영상 속 객체를 인식하는 기술을 본 적이 있는데, 그 기술을 한 번 시도해봐야겠습니다.
3. 저화질 영상 vs 고화질 영상
그렇다면 이제 저화질 영상과 고화질 영상을 비교해보도록 하겠습니다.
1에서 모델에 적용했던 영상의 해상도는 720p였습니다. 그렇다면 이보다 더 낮은 화질인 360p에서는 yolov5 모델이 어떤 성능을 보일까요? 테스트해보도록 하겠습니다.
1에서 했던 것과 똑같은 방식으로 360p 영상에 대해 적용해보았습니다. 그 결과 객체 인식 성능이 아래와 같이 나왔습니다.
720p 영상이 2min 57s가 걸렸던 걸 생각하면 속도가 조금 빨라졌네요! 정확도는 어떨까요?
흠......사실 720p 영상과 큰 차이를 느끼지 못하겠네요. 화질이 조금 깨졌긴 했지만 그래도 잘 인식을 하는 모양입니다.
그럼 240p 영상에 대해서도 적용해볼까요? 역시 이전과 같은 방식으로 yolov5 모델을 돌렸고, 결과가 아래와 같이 나왔습니다.
우선 360p 영상보다도 인식 속도가 좀 더 빠르네요. 그럼 정확도는 어떨까요?
오! 오프닝에서 사람을 늦게 인식하게 되었네요. 확실히 화질이 낮아져서 그런가 봅니다. 그래도 다른 장면에서는 높은 화질에서와 같은 인식 결과를 얻는 것을 볼 수 있습니다.
결론적으로, 영상의 화질을 낮출 수록 yolov5 모델의 객체 인식 속도가 소폭 빨라지고, 정확도가 소폭 낮아진다는 사실을 알게 되었습니다.
사실 이 포스트를 작성하기 시작할 때 제 가설은 아래의 세 가지였습니다.
1. 영상보다 이미지의 객체 인식 속도가 빠를 것이다.
2. 초당 프레임을 높일 수록 이미지의 객체 인식 정확도가 높아질 것이다.
3. 영상의 화질을 낮출 수록 객체 인식 정확도가 떨어질 것이다.
여기서 1번과 3번은 맞았지만, 2번은 틀렸다는 사실을 알 수 있었고, 추가적으로 영상의 화질을 낮출 수록 객체 인식 속도가 빨라진다는 사실을 알게 되었습니다.
이 테스트의 결과를 저희 프로젝트에 응용해보자면, 사용자가 OTT 서비스에서 높은 화질의 영상을 보든, 낮은 화질의 영상을 보든 비슷한 품질의 객체 인식 서비스를 제공할 수 있다는 점은 굉장히 긍정적인 소식입니다. 어떤 화질의 영상이든 하나의 딥러닝 모델만 있으면 된다는 뜻이니까요.
다만 10초 영상 속 객체를 인식하는데 2분이 걸린다는 점은 조금 안 좋은 소식이네요. 영상 객체 인식 속도를 높일 수 있는 방법을 더 찾아봐야겠습니다.