Rubik Pi 3 - 현재까지 진행 상황
Rubik Pi 3 보드에서 YOLO기반의 객체 탐지 및 속도 측정 시스템을 개발하고 있다.
어느정도 핵심 기능이 구현되어 중간 경과를 간단히 적어본다.
- YOLO 모델 구동
- Rubik Pi 보드 환경 세팅
- GStreamer 기반 객체 탐지 + Bounding Box + 기타 시각화
- appsink를 통한 메타데이터 파싱 및 후처리
- IoU기반 객체 트래킹
- 중심 좌표 기반 속도 측정
- 과속 시 스크린샷 촬영 기능
가장 어려웠던 부분
환경 구성과 메타데이터 처리
- qtimlsnpe, qtimlvdetection 이후의 text/x-raw 포맷을 appsink로 받아오는 과정
- 바운딩 박스 좌표, 기타 정보 파싱 과정
- GPU 메모리 포맷 (NV12, GBM, RGB) 호환 문제
이 모든 과정은 커뮤니티에서도 사례가 없었기 때문에,
직접 파이프라인을 작성하여 하나씩 검증해야만 했다.
공식 문서가 부족하고 파편화되어 있어, GStreamer의 파이프라인 설정과 메모리포맷 문제로 많이 헤맸다.
특히 text/x-raw 형식으로 메타데이터를 파싱하고, 바운딩박스에 반영하는 작업은 시행착오가 많았다.
커뮤니티에서도, 이 작업을 진행한사람이 아직 없어서 다른 유저들에게 질문을 받기도 하였다.
RUBIK Pi
the first Pi built on Qualcomm AI platforms for developers.
community.rubikpi.ai
루빅보드 커뮤니티이다.
여기서, 내가 겪은 문제점과, 해결방안들을 적극적으로 공유하고, 답변하고 있다.
핵심 로직: 좌표 기반 객체 트래킹
이 시스템에서 가장 중요한 정보는 '좌표'이다.
각 객체가 다음 프레임에서도 동일한 객체인지 판단해야 속도 측정이 가능하기 때문이다.
이를 위해서 IoU(Intersection over Union)방식을 사용했다.
IoU는, 바운딩 박스의 겹치는 정도를 기준으로
같은 객체인지 판단하는 정석적인 방법인 듯 하다.
iou = 교집합의 영역 넓이 / 합집합의 영역 넓이
https://www.waytoliah.com/1491
mAP, IOU란 + Object Detection 성능 평가 지표의 이해 및 예시
1. IOU (Intersection Over Union) 객체 검출의 정확도를 평가하는 지표. 일반적으로 Object Detection에서 개별 객체(Object)에 대한 검출(Detection)이 성공하였는지를 결정하는 지표로 0~1 사이의 값을 가짐 실제
www.waytoliah.com
속도 측정 로직
프레임간 중심 좌표의 변화량을 초 단위 시간으로 나누어 px/s 단위로 속도를 구한다.
지금은 픽셀 단위이므로, 추후에 보정 계수를 적용해서 실제 속도(km/h)로 변환할 예정이다.
과속 시 스크린샷 저장
이 기능을 만들기 위해서 파이프라인을 다시 수정해야했다.
기존 파이프라인에서, 화면을 출력하는 부분에서 브랜치를 하나 더 나눴다.
qtiqmmfsrc (카메라 입력)
→ qtivtransform (flip-vertical 적용)
→ tee split
├── qtimetamux → qtioverlay → waylandsink (화면 출력)
├── qtimlvconverter → qtimltflite → qtimlvdetection
→ tee mt
├── metamux (메타데이터 합성용)
└── appsink meta_sink (메타데이터 수신, emit-signals=true)
└── qtivtransform → videoconvert → appsink frame_sink (프레임 캡처용)
전체 적인 프레임 구성도는 이렇다.
https://www.youtube.com/watch?v=Wji8e__3MN4