물체를 인식하고 쫓아가기 위해서는 화면상에 물체가 어디에 위치하는지 알아야 합니다.
그러기 위해서는 바운딩 박스의 정보(시작점의 xy좌표, 박스의 크기)를 받아야 합니다.
darknet에서는 이 기능을 제공하고 있습니다.
darknet을 실행할 때
./darknet detector demo data/obj.data yolov4.cfg backup/yolov4_best.weights -c 0
여기에서
./darknet detector demo data/obj.data yolov4.cfg backup/yolov4_best.weights -c 0 -ext_output
이렇게 끝에 -ext_output만 추가해주면 바운딩 박스의 좌표와 크기를 알 수 있습니다.
하지만 제가 출력하고 싶은 건 박스의 중심좌표이므로 코드를 수정해줍니다.
darknet/src/image_opencv.cpp에 들어가서 ctrl+f로 ext_output을 검색해서 두번째 검색결과로 이동합니다.
그리고
if (ext_output)
printf("\t(left_x: %4.0f top_y: %4.0f width: %4.0f height: %4.0f)\n",
(float)left, (float)top, b.w*0.5*show_img->cols, b.h*0.5*show_img->rows);
이 내용을
if (ext_output)
printf("\t(center: %4.0f, %4.0f)\n",
(float)left + b.w*0.5*show_img->cols, (float)top + b.h*0.5*show_img->rows);
다음과 같이 바꿔줍니다.
시작점에서 폭과 너비의 반틈만큼을 더해주어 중앙값을 계산합니다.
만약 opencv를 이용해 중심점에 점을 찍어 시각적으로 확인하고 싶다면
if (ext_output)
{
int center_x = (float)left + b.w*0.5*show_img->cols;
int center_y = (float)top + b.h*0.5*show_img->rows;
printf("\t(center: %4.0f, %4.0f)\n",
center_x, center_y);
cv::line(*show_img,cv::Point(center_x,center_y),
cv::Point(center_x,center_y),
cv::Scalar(0,0,255),10);
}
다음과 같이 입력해줍니다.
그리고 darknet으로 돌아와 make를 다시 해주고 실행하면
보기와 같이 터미널 창에는 중심값이 나오고 화면에는 중심점이 나오는 것을 확인할 수 있습니다.
'정나우 > Jetson' 카테고리의 다른 글
[YOLOv4] 인식 결과 저장하기 (0) | 2022.05.05 |
---|---|
TensorRT를 이용해서 Yolov4 성능 향상시키기 (3) | 2022.04.12 |
[Yolov4] 영상인식 커스텀 학습법 (0) | 2022.03.20 |
[Jetson Xavier agx] YOLO 실시간 객체 인식 시 웹캠 화질 낮추는 방법 (1) | 2021.12.16 |
Jetson xavier agx VScode 설치 및 실행 방법 (0) | 2021.10.12 |
댓글