인프런 커뮤니티 질문&답변

sungho kang님의 프로필 이미지
sungho kang

작성한 질문수

[개정판] 딥러닝 컴퓨터 비전 완벽 가이드

OpenCV를 이용한 SSD Inference 실습 - 01

object detection 거리 감지를 위한 질문 (YOLO V5)

해결된 질문

작성

·

3.2K

1

안녕하세요. 철민 강사님께 늘 좋은 강의 내용에 감사하면서 오늘도 질문을 드립니다.
object detection 에서 물체 간의 거리 감지를 위한 질문 (YOLO V5)을 드리려고 합니다. 강의에서 배운 내용을 바탕으로 입력 영상으로 실시간 객체간의 거리를 측정하는 기능을 개발하고 있는데 아래와 같이 중장비와 사람간의 바운딩 박스의 가운데 좌표를 읽어 거리를 측정하고 있는데 근본적이 오류가 있었습니다.

 

오류

  • 사람의 위치가 이동하여 중장비 옆에서 잡은 거리가 2m라고 했을 때 뒤에서 잡은 거리는 2.7m가 되고 위에 지점에서 잡은 거리는 3.8미터가 되는 오류가 있습니다. 이 문제를 해결하기 위해 바운딩 박스의 가장 중심점 에서 거리를 측정 오류를 벗을 수는 없는 것인가요?
    semantic segmentation 픽셀 단위 이미지를 이용하면 되지만 이 경우에는 사람이 너무 가까이 가면 하나로 클래스로 인식하고 이것을 Instance Segmentation 으로 해결하려고 하는데 GPU 연산의 하드웨어적인 한계가 있었습니다.

     

  • object detection 알고리즘으로 객체 간 위치별 거리측정의 오차를 없앨 수 있는 방법에 대해서 조언을 부탁드립니다.

    1.jpg

2.jpg

답변 1

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

오, 대단한걸 하고 계시는 군요.

근데, 올려 주신 글과 이미지만 봐서는 뭐가 문제인지 정확히 모르겠습니다. 이미지의 거리 표시 m 글자가 잘 보이지 않습니다. 2m, 2.7m, 3.8m가 어디를 나타내고 왜 문제인지 좀 더 자세히 기술해 주시겠습니까?

감사합니다.

sungho kang님의 프로필 이미지
sungho kang
질문자

저 그림은 휠로더 중간에서 거리를 계산한 좌표입니다.

  • https://github.com/MehmetOKUYAR/Yolo-Object-Detection-and-Distance-Measurement-with-Zed-camera
    위 GitHub 프로젝트를 참조해서 객체간 거리를 탐지하는데 문제는 아래와 같습니다.

  • 사진 에서 바운딩 박스의 하단에 좌표를 잡아서 객체간 거리를 탐지하려고 하는데
    이 거리가 바운딩 박스의 하단의 기준으로 하기 때문에 1번 사람 2번 사람 3번 사람의 거리가 가치가 많이 납니다. 즉 3번 사람은 실제거리가 3미터인데 4미터로 나오는 오류가 있는것이죠


    그림.1 현재 문제 (1번과 0번을 거리를 기준으로 했을때 2번 3번이 0번과 실제거리와 차이가 남)

image

그림.2 아래 그림과 같이 1 2 3번의 객체의 위치마다 좌표의 기준점을 다르게 줄 수 있는 방법이 있는지 질문있습니다.

image

권 철민님의 프로필 이미지
권 철민
지식공유자

제 생각엔 객체별로 기준점을 다르게 주어도 정확한 거리 계산은 어려울 수 있겠지만,

요청하신대로 객체별로 기준점을 다르게 주려면,,

개별 오브젝트별로 거리 계산의 기준의 되는 오브젝트의 기준 좌표를 구하는 함수를 하나 만드셔야 할 것 같습니다.

예를 들어 아래 함수는 개별 오브젝트(예를 들어 사람)의 좌표, 그리고 기준 오브젝트(여기서는 휠로더)의 좌표를 dictionary 형태 [x1, y1, x2, y2]로 입력 받습니다. x1, y1은 좌상단 좌표, x2, y2는 우하단 좌표입니다.

def get_referenced_coordinate(개별 오브젝트 dict, 기준 오브젝트 dict)

만약 개별 오브젝트 x1 좌표가 기준 오브젝트 x1 좌표 보다 작다면 기준 좌표를 x의 경우는 기준 오브젝트의 x1좌표로, y좌표의 경우 (y1 + y2)/2 로 정해서 반환합니다. 여기서 x나 y 좌표는 좀더 보정할 필요는 있습니다.

만약 개별 오브젝트 x2 좌표가 기준 오브젝트 x2 좌표 보다 크다면 기준 좌표를 x의 경우는 기준 오브젝트 x2로 잡고, y좌표의 경우는 (y1 + y2)/2 로 정해서 반환합니다.

마찬가지로 개별 오브젝트 y1 좌표가 기준 오브텍트 y1좌표보다 크거나, 또는 개별 오브텍트 y2 좌표가 기준 오브텍트 y2 좌표 보다 클경우 위의 로직과 유사하게 좌표를 정하면 될 것 같습니다.

직접 코드를 작성하시다 보면 보다 다양한 방법으로 보정을 적용해서 수행하실 수 있으실 것 같습니다.

다만 객체간의 거리 계산은 instance segmentation이 보다 더 적절할 것으로 생각됩니다. 개별 오브젝트의 세그먼트 정보를 기반으로 가로/세로 중심점과 기준 오브젝트 세그먼트의 가로/세로 중심점간의 거리 차이를 구하면 좋을 것 같습니다. GPU 연산이 어느정도나 많이 더 소모되는지 모르겠습니다만, Semantic segmentation 대비 instance segmentation이 GPU 연산이 어려워질정도로 더 많은 연산이 필요하지는 않다는게 제 개인적인 의견입니다.

 

 

sungho kang님의 프로필 이미지
sungho kang

작성한 질문수

질문하기