[w14] 탁구공 인식 및 거리 추정

GGG·2022년 5월 24일
0
post-thumbnail

(Ubuntu 18.04.6 LTS)
2022.05.16~2022.05.20.
프로그래머스 자율주행 데브코스 3기

탁구공 인식을 위해서 먼저 카메라 calibration을 하였다. 체스보드판을 이용한 여러 가지 이미지에서 체스보드 코너를 검출하고, 해당 좌표들을 통해 intrinsic matrix와 왜곡과 관련된 계수들을 구해 카메라 calibration을 하였다. 거리 추정 알고리즘이나 자이카에서 calibration을 하기 위해 calibration 전 intrinsic matrix와 calibration 후 intrinsic matrix를 json 파일로 저장해 자이카에서 이용하기 편하게 했다. 이 행렬의 계산에는 OpenCV의 calibratecamera함수와 getOptimalNewCameraMatrix 함수를 이용했다.

이후, 탁구공을 검출하기 위해 CVAT를 이용해 라벨링을 진행하였다. 이미지는 한 장에 탁구공이 대부분 4개 이상 있고 학습용으로 540장, 평가용으로 60장을 사용했다. 겹치는 이미지에 대해서도 라벨링을 진행하였다.

학습에는 YOLOv3-tiny 모델을 사용했다. 학습은 AWS에서 진행하였으며, google colab을 이용하여 하는 방식도 고려했다. 학습이 되는 것을 확인할 수 있었으나, 속도와 연결 관련 문제로 학습에 직접적으로 사용하지는 않았다.

이미지 학습에 있어 너무 흐릿한 이미지를 사용하는 경우에 바닥이나 하얀 옷도 인식하는 문제가 있어 흐릿한 공은 라벨링 데이터에서 제외하였다. 흐릿한 이미지가 바닥과 구분이 어렵다는 것에 아이디어를 얻어 윤곽을 강화하는 sharpening을 이용해 학습하는 방식을 사용해보았다. 샤프닝은 wikipedia의 샤프닝 마스크를 적용하였으며, OpenCV의 filter2D를 이용해 적용했다.

sharpening mask: [  01  01  51  01  0]sharpening \space mask: \space \begin{bmatrix} \ \ 0 & -1 & \ \ 0 \\ -1 & \ \ 5 & -1 \\ \ \ 0 & -1 & \ \ 0 \end{bmatrix}

하얀 공 인식이 주황색 공에 비해서 잘 되지 않았으며, 개선을 위해 이미지를 추가적으로 획득하여 라벨링을 수행했다.

거리 추정은 단안 카메라를 이용해서 진행하였다. Vision-based ACC with a single camera: bounds on range and range rate accuracy 논문에서는 지면과 카메라가 평행한 상황에서 주점에서부터의 위치(yy), 대상의 크기(HH), 초점거리(ff)를 알고 있을 때, Z=fHyZ = \frac {fH} {y}으로 거리를 추정하는 방식을 다룬다. 논문에서는 차량 진행방향에 대해서만 거리를 추정하였다. 추가적으로 xx축을 추정하기 위해 x 방향 FOV를 이용해 비례관계에 있다고 가정하고 각도 값(α\alpha)을 얻었다. 이후 거리 추정값 ZZ를 이용해 x=Z×tan(α)x = Z \times tan(\alpha) 관계식으로 거리를 계산하였다.

거리 추정방식에서는 논문상에서 거리의 제곱에 비례에 오차가 커지는 모습을 볼 수 있었는데, 거리가 멀어질 수록 오차가 커지는 현상을 볼 수 있었다. FOV의 경우는 이미지 중심에서 픽셀차이와 비례관계를 가정하고 코드를 작성하였는데 calibration 전후에 비례 관계와는 차이가 있는 것을 확인할 수 있었고, 개선의 필요성을 느꼈다.

거리 추정 결과를 실시간으로 확인하기 위해서 시각화하는 코드를 작성했다. 초기에는 matplotlib의 pyplot으로 하려고 하였으나, 속도의 문제가 있어 OpenCV에서 값들을 적당히 그려내는 코드를 작성했다.

profile
GGG

0개의 댓글