1. 목표
탐지해낸 객체에 대한 정보를 받고싶다.
퀄컴디바이스에서는 GStreamer라는 멀티미디어 프레임워크를 사용한다.
GStreamer 파이프라인 안에 YOLO모델을 실행하는 요소와 카메라 입력이 포함되어,
프레임 단위로 객체 탐지가 수행된다.
객체 탐지 후 해당 객체에 대한 메타데이터를 받아오기 위해 정말 많은 시도를 했지만,
관련 정보가 거의 없었고, GPT에게도 수차례 물어봤지만 반복적인 답변뿐이었다...
2. 메타데이터 가져오기
GStreamer의 공식문서와 Qualcomm 사이트에서 약간의 희망의 빛을 보았는데,
Detection and tracking using RB3gen2 device
mysupport.qualcomm.com
즉, 메타데이터들을 받아오기 위해서는 2가지방법이 있는데,
- Probe사용
- appsink사용
여기서 appsink사용이 가장 보편적인 방법 같았다.
appsink를 통해, 각 프레임의 버퍼를 수신하고,
그 안에 첨부된 메타데이터를 통해 탐지된 객체 정보를 추출할 수 있다.
3. 문제
하지만 여기서 문제가 생겼다.
코드를 실행해보면 get_n_meta(), n_meta() 등의 함수가
PyGObject 바인딩에서는 동작하지 않거나 존재하지 않는다는 에러가 발생한다.
또한, 버퍼에 메타데이터가 전혀 없는 것처럼 보이기도 했다.
4. 해결
그래서 공식문서를 뒤지기 시작했다.
GstBuffer
GstBuffer Buffers are the basic unit of data transfer in GStreamer. They contain the timing and offset along with other arbitrary metadata that is associated with the GstMemory blocks that the buffer contains. Buffers are usually created with gst_buffer_ne
gstreamer.freedesktop.org
To handle multiple metadata with a given API use gst_buffer_iterate_meta (not introspectable)or
Gst.Buffer.foreach_meta instead and check the meta->info.api member for the API type.
공식 문서에 따르면, 버퍼에 포함된 여러 개의 메타데이터를 순회하려면
gst_buffer_iterate_meta() 또는 Python에서 사용 가능한 Gst.Buffer.foreach_meta()를 사용하라고 명시되어 있다.
5. 포기 직전
YOLO 모델이 실행되는 GStreamer 요소인 qtimlvdetection
에 대한 문서나 내부 구조에 대한 설명도 매우 부족했다.
결국 이 플러그인을 통해 직접 메타데이터를 얻어내는 것은 현실적으로 어려운 문제라는 결론에 도달하게 되었다.
(할 수 있는 모든 방법을 동원했지만 번번히 실패했다)
6. 전환점
그래도 좋은 소식은
- YOLO 모델은 GStreamer 상에서 정상적으로 실행됨.
- 실체로 객체 탐지가 이루어진다.
- GStreamer에서 appsink를 통해 프레임 자체를 넘겨줄 수 있다.
그렇다면, GStreamer -> OpenCV로 프레임을 전달한 뒤,
OpenCV로 후처리를 직접 구현하는 방식으로 방향을 전환했다.
더이상 메타데이터에 의존하지않고,
OpenCV의 많은 커뮤니티, 풍부한 기능으로 후처리를 구현하는게 좋겠다는 생각이 들었다.
7. 결론
Qualcomm의 GStreamer 파이프라인에서 객체 탐지 메타데이터를 얻는 것은
현재 기준으로 난이도가 너무 높았다.
따라서 우회하여 OpenCV로 후처리를 구현할 예정이다.
그럼 그냥 OpenCV로 YOLO모델을 띄우면 되지 않나?
맞는 말이다.
처음부터 OpenCV에서 YOLO모델을 불러와 추론하고 후처리까지 했다면
프레임과 메타데이터를 분리해서 처리하는 복잡한 과정을 겪지 않아도 되었을 것이다.
하지만 여기엔 중요한 이유가 있다.
OpenCV는 기본적으로 CPU 기반으로 동작한다.
나는 이 프로젝트를 Qualcomm프로세서가 탑재된 Rubik보드에서 수행하고있고,
이 보드를 사용하는 이유는 명확하다.
Qualcomm DSP, GPU, NPU와 같은 하드웨어 가속기를 활용해
YOLO와 같은 딥러닝 모델을 효율적으로 실행하기 위함이다.
Rubik 보드에서는 GStreamer 파이프라인에 qtimlvdetection 같은 요소를 붙이면
자동으로 하드웨어 가속이 적용된 YOLO 추론이 가능하다.
즉, OpenCV로만 YOLO를 처리하는 것은
고성능 임베디드 디바이스의 하드웨어 가속 능력을 완전히 버리는 셈이고,
Rubik 보드를 사용하는 의미 자체가 사라진다.
따라서,
- 모델 추론은 GStreamer + Qualcomm가속기로 처리
- 후처리는 OpenCV에서 수행
즉, 최적의 성능과 유연한 후처리를 모두 얻기 위함이다.
'Qualcomm 기업과제' 카테고리의 다른 글
Rubik Pi 3 프레임 드랍 문제 해결, 멀티스레딩 (2) | 2025.05.07 |
---|---|
Rubik Pi 3 - 현재까지 진행 상황 (0) | 2025.05.04 |
Rubik Pi 3 보드에서 YOLO-NAS로 실시간 객체탐지 시스템 구축기 (0) | 2025.04.26 |
Rubik Pi 3에 Yolo v8 detection Quantized모델 올리기 (0) | 2025.04.11 |
Rubik Pi3 보드로 개발하기 (2) | 2025.04.10 |