비식별화 검출 모델의 DeepStream 플러그인

영상 비식별화 과제의 얼굴 검출 모델을 임베디드 장치의 DeepStream 파이프라인에서 돌리기 위해, 모델 출력을 검출 상자로 바꾸는 파서 플러그인을 만들었습니다.

연표로 돌아가기
문제
CCTV 영상을 소형·저전력 임베디드 장치에서 실시간으로 비식별화하려면 협력 기관의 얼굴 검출 모델을 DeepStream 파이프라인에서 실행해야 했지만, 모델은 앵커 박스 기준의 원시 텐서(상자·특징점·점수)만 내보냈습니다.
담당
모델 출력을 검출 상자로 바꾸는 C++ 파서 라이브러리와 빌드 설정, DeepStream 앱·추론 설정 파일 작성, RTSP 입출력 동작 시험과 기술 문서 정리를 맡았습니다.
설계 판단
Xavier NX 개발 장치에는 Orin NX 대응을 위해 Ubuntu 20.04 기반 JetPack 개발자 프리뷰 버전을 설치하고 DeepStream 은 NVIDIA 컨테이너에서 실행했습니다. 모델은 ONNX 에서 반정밀도 TensorRT 엔진으로 변환해 썼습니다.
검증 기준
호스트 PC 에서 FFmpeg 로 만든 RTSP 스트림을 장치에 넣고, 장치가 다시 RTSP 로 내보낸 FHD 영상을 VLC 로 받아 얼굴 검출 상자가 그려지는지 확인했습니다.
결과 범위
파서 라이브러리 작성과 RTSP 입출력 동작 확인까지 마친 뒤 그 상태로 보존했고, 이후 작업은 Windows 데스크톱 응용 개발로 옮겨 갔습니다.

비식별화 과제에서 협력 기관이 만든 얼굴 검출 모델을 데스크톱이 아닌 임베디드 장치에서도 실시간으로 돌려야 했습니다. 장치 쪽은 GStreamer 기반의 DeepStream 파이프라인을 쓰므로, 모델을 그 안에 끼워 넣는 일이 필요했습니다.

추론 요소가 모델의 원시 출력을 이해하지 못하므로, 출력 텐서를 읽어 검출 상자와 점수로 바꾸는 사용자 정의 파서를 C++ 로 만들어 플러그인으로 올렸습니다. 이어 붙는 추적 요소와 마스킹 합성 단계가 그대로 동작하도록 상자 형식을 맞췄습니다.

파서는 세 가지 크기의 특징 맵에 맞춰 앵커 박스를 생성해 상자 좌표를 복원하고, 신뢰도 임계값을 넘는 것만 검출 상자로 넘기도록 했습니다. 특징점 출력은 쓰지 않았습니다.

같은 방식이 이후 자사 임베디드 장치의 추론 플러그인 구성으로 이어졌습니다. 2023년 12월 보고서에는 당시 장치 소프트웨어(JetPack 4.6.1·TensorRT 8.2)에서 다른 얼굴 검출 모델의 엔진 생성이 정규화 층 변환 미지원으로 실패한 문제와, TensorRT 만 따로 올릴 수 없어 JetPack 전체를 업그레이드해야 한다는 해결 방안을 적었습니다.

구조와 흐름

DeepStream 파이프라인 안의 자리

카메라 · 파일하드웨어 디코딩스트림 합치기추론 요소얼굴 검출 모델사용자 정의 출력 파서모델 출력 → 검출 상자추적마스킹 합성인코딩 · 표시
파서는 추론 요소가 불러 쓰는 라이브러리입니다. 상자 형식을 맞추면 뒤 단계는 손대지 않습니다.
DeepStreamGStreamerTensorRTJetsonC++