본문 바로가기
Python/Object Detecting

[python] YOLOv5 이용 객체탐지 및 실시간 Object size 측정하기

by 여비코기 2021. 8. 1.

이번에는 YOLOv5를 이용하여, 물건 크기를 측정하는 방법을 고안해보려고 한다.

 

물건 크기를 기준 없이 측정할 수는 없고, Standard가 되는 즉, 길이를 정확히 알고 있는 물체를 기준으로 삼고 그 기준을 토대로 각 물건들의 가로, 세로 길이를 측정하는 방법을 생각해보았다.

 

기본적은 YOLOv5의 학습 및 사용 방법은 내 블로그의 기존 게시물과, YOLOv5 공식 github 를 참조하기 바란다.

 

 

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

 

 

[python] yolov5이용, 간단한 객체 학습 후 탐지

본 게시글에서는 yolov5를 이용하고, Pytorch를 통한 커스텀 학습을 통해 우리집 고양이인 "몰리"의 머리, 발, 몸통, 꼬리를 탐지해보고자 한다. yolov5의 설치에 관해서는 github를 참조하였다. ONNX > Core

yobbicorgi.tistory.com

나는 우선적으로 15CM의 자를 기준으로 삼았다.

YOLOv5의 Rectangle

YOLOv5의 객체탐지시 Rectangle을 이용하여 사각형을 치게 되는데, 이는 탐지된 물체의 4꼭지점 좌표 즉 4개의 (x,y)좌표를 기준으로 사각형을 치게 된다. 나는 그 사각형을 이루는 점 중 오른쪽 2개 점[(X1,Y1), (X3,Y3)]을 이용하여 세로 길이를 특정하였다.

 

기준이 되는 자의 15cm 표시

위 사진을 보면 15CM의 기준을 눈에 띄게 보이게 하기위해서 분홍색으로 선을 그어주었으며, 15CM가 기준이 된다는 표시를 해주었다. 

 

15CM의 픽셀 수를 알 수 있으므로 우리는 이를 15로 나누면 1CM가 차지하는 픽셀 수 역시 알 수 있을 것이다.

 

EX) 15CM 픽셀 수 = 270

      1CM 픽셀 수 = 270/15 = 18

 

그러면 우리는 1CM에 해당하는 픽셀 수를 알고 있으므로, 탐지되는 물체의 가로(넓이), 세로(길이)가 차지하는 픽셀 수를 계산해낸다면 '물체의 픽셀 수 / 18'를 함으로써 CM길이로 환산이 가능하다.

(1CM 픽셀 수를 숫자 18로 지정하는 것이 아닌 계산 식이 포함된 변수로 지정해 놓는다면 카메라의 거리가 멀어지거나, 가까워 지더라도 1CM가 차지하는 픽셀 수는 알맞는 개수로 변할 것이다.)

 

기준이 되는 자(Ruler)와 나머지 물체(Object) 두 분류로만 나누어 학습을 진행 하였고, 실시간으로 탐지된 객체들의 가로, 세로 크기가 측정되도록 하였다.

물체 크기 측정

아래 동영상은 최종 결과이다.

 

코드에 있어서 해당 기능을 구현하기 위해 수정한것은 학습 부분과 YOLOv5내 detect.py 코드 내 '#Write results'부분에서 좌표 및 거리 계산한 부분을 추가하여 기본적인 구조만 바꾼 것이다. 따라서 해당 게시물에서 따로 코드는 첨부하지 않았다.

 

탐지되는 물체의 크기는 기준을 어떻게 잡냐에 따라 달라지게 된다. 지금은 단순히 두 점사이의 픽셀 수만을 이용하여 길이를 특정하였지만, 기준이 되는 물체가 대각선으로 놓였을때, 혹은 영상이 약간 기울어져있을 때 등등 실제 환경에서는 많은 변수들이 존재 할 수 있다. 해당 환경등에서는 피타고라스 정리에 의한 두 점 사이의 거리 계산 혹은 기울임 보정 등을 통해 조금 더 정확한 크기 측정이 가능 할 것이라 생각된다.

 

 

요청에 따른 detect.py 첨부

detect_size.py
0.01MB

댓글