이번 포스팅에서는 우리 공모전 작품의 핵심 기술이였던 YOLOv8 오픈소스와, 이를 이용해 어떻게 이미지상 박스의 실제 크기를 구해내게 되었는지 회고해보려고 한다.
1. YOLOv8
https://docs.ultralytics.com/ko/
홈
Ultralytics YOLOv8을 완벽하게 탐구하는 가이드로, 고속 및 정확성이 특징인 객체 탐지 및 이미지 분할 모델입니다. 설치, 예측, 훈련 튜토리얼 등이 포함되어 있습니다.
docs.ultralytics.com
YOLOv8은 Ultralytics에서 개발한 오픈소스 딥러닝 모델이고, 사용자의 입맛에 맞게 모델을 훈련시킨 후, 이를통한 예측이 가능하다. 앞선 포스팅에서 말했듯이, Segment Anything을 활용하기에는 모델이 너무 무거웠고, 가벼우면서 성능이 좋은 박스감지 모델을 찾던중, 이를 발견했다.
https://colab.research.google.com/drive/1muJwIzE19uFzgCjHUoiIyBJC2cxvfYNs?usp=sharing
YOLO_v8_커스텀_모델_학습.ipynb
Colaboratory notebook
colab.research.google.com
위의 과정대로, 내가 원하는 적절한 데이터셋을
https://universe.roboflow.com/search?q=model:yolov8
Top Trained YOLOv8 Models | Roboflow Universe
Fine-tuned YOLOv8 checkpoints and APIs you can use to perform inference or deploy to a server or edge device. Page 1.
universe.roboflow.com
에서 찾아서, 훈련시켰다.
2. 박스이미지만 추출해내기
잘린 Run부분
$ yolo predict model=detect_model.pt imgsz=640 conf=0.5 source=images save_crop=True
이 명령어를 통해, 특정 confidence값(얼마나 박스 이미지와 일치하는지)이상인 이미지만 추출해내서 저장했다.
이후 과정을 요약하면,
카메라 파라미터와, 꼭지점 좌표를 통해, 실제 박스 거리를 구해낼 수 있다.
가장 간단한 카메라의 기본 원리를 통해 구해내기로 했다. 초점거리는 카메라 캘리브레이션을 통해 구할 수 있고, 이미지 상 박스 크기 또한, 이미지상의 좌표 계산을 통해 구할 수 있다. 결국 카메라와 물체간의 실제 거리를 어떻게 구해내느냐가 관건이였다.
3. 카메라 캘리브레이션
https://darkpgmr.tistory.com/153
영상의 기하학적 해석 - 영상의 지면 투영(ground projection)
카메라 영상에서 사람이나 자동차를 찾았을 때, 찾은 물체가 카메라로부터 실제로 얼마나 멀리 떨어져 있고 또 키는 얼마나 큰지 알아내는 것은 영상기하학의 가장 빈번한 응용 중 하나이다. 예
darkpgmr.tistory.com
설명하기에 앞서, 위의 원리를 이용해 박스 크기를 구하기 위해 도움을 많이 받은 글 하나를 올리고 간다. 위의 블로그에서 카메라, 이미지 관련 원리와 개념에 대해 공부하며 많은 배움을 얻었다.
위에서 말한 카메라 파라미터를 구하기 위해서는, 카메라 캘리브레이션이 필수적이다.
https://darkpgmr.tistory.com/32
카메라 캘리브레이션 (Camera Calibration)
카메라 캘리브레이션 (camera calibration)은 영상처리, 컴퓨터 비전 분야에서 번거롭지만 꼭 필요한 과정중의 하나입니다. 본 포스팅에서는 카메라 캘리브레이션의 개념, 카메라 내부 파라미터, 외
darkpgmr.tistory.com
이 글을 보고 공부를 했고,
실제 사용한 코드는 다음과 같다.
우리는 체스보드 패턴으로 카메라 캘리브레이션을 진행했는데, 가장 간단하고, 함수들이 OpenCV에서 제공되기 때문이었다. 먼저 기본 변수들 및 배열을 설정하고,
cv2.findChessboardCorners(gray, (4,7), flags)
(chess함수 내부)
를 통해 return값과 corners값을 받아왔다. 이후,
ret, mtx, dist, rvec, tvec = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
를 통해, 카메라 matrix, 왜곡계수, 위치벡터, 거리벡터값을 구해낸다.
여기까지, 이미지 상 박스의 실제 크기를 구하기 위해 카메라 파라미터를 구하는 과정이였고, 구해낸 카메라 파라미터를 어떻게 활용해서 실제 박스 크기를 구해냈는지는 다음 포스팅에 쓰려고 한다.
'프로젝트' 카테고리의 다른 글
공모전 회고록 (4) - CJ대한통운 미래기술 챌린지 2023 (0) | 2024.08.10 |
---|---|
공모전 회고록 (3) - CJ대한통운 미래기술 챌린지 2023 (1) | 2024.01.13 |
공모전 회고록 (1) - CJ대한통운 미래기술 챌린지 2023 (0) | 2023.11.21 |
두번째 개인 프로젝트 - 랜덤 로드뷰 게임 (Open Api 활용) (0) | 2023.06.07 |
첫 개인 프로젝트 - Black Jack (블랙잭 게임 JS 구현) (0) | 2023.03.21 |