Multimedia 와 TensorRT의 테스트를 진행하며, 관련 예제들을 알아보자.
이 부분의 기능은 추후 설명할 DeepStream 부분하고도 거의 동일한 기능이기때문에, 동작은 이해를 하자.
- 우선 JetsonTX2의 성능을 최대로 변경
$ sudo jetson_clocks // sudo nvpmodel -m 0 $ sudo jetson_clocks --show [sudo] password for jetsontx2: SOC family:tegra186 Machine:quill Online CPUs: 0-5 CPU Cluster Switching: Disabled cpu0: Online=1 Governor=schedutil MinFreq=2035200 MaxFreq=2035200 CurrentFreq=2035200 IdleStates: C1=0 c7=0 cpu1: Online=1 Governor=schedutil MinFreq=2035200 MaxFreq=2035200 CurrentFreq=2035200 IdleStates: C1=0 c6=0 c7=0 cpu2: Online=1 Governor=schedutil MinFreq=2035200 MaxFreq=2035200 CurrentFreq=2035200 IdleStates: C1=0 c6=0 c7=0 cpu3: Online=1 Governor=schedutil MinFreq=2035200 MaxFreq=2035200 CurrentFreq=2035200 IdleStates: C1=0 c7=0 cpu4: Online=1 Governor=schedutil MinFreq=2035200 MaxFreq=2035200 CurrentFreq=2035200 IdleStates: C1=0 c7=0 cpu5: Online=1 Governor=schedutil MinFreq=2035200 MaxFreq=2035200 CurrentFreq=2035200 IdleStates: C1=0 c7=0 GPU MinFreq=1300500000 MaxFreq=1300500000 CurrentFreq=1300500000 EMC MinFreq=40800000 MaxFreq=1866000000 CurrentFreq=1866000000 FreqOverride=1 Fan: speed=255 NV Power Mode: MAXN $ cat /usr/bin/jetson_clocks // script 추후 세부분석 .... do_hotplug do_clusterswitch do_cpu do_gpu do_emc do_fan do_nvpmodel ......
NVDIA Multimedia API
https://docs.nvidia.com/jetson/archives/l4t-multimedia-archived/l4t-multimedia-281/index.html
1.1 Sample Backend Test
JetPack 3.3 때와 JePack4.2 동일한 Video인 줄 알았는데, 예제 Video가 변경이 되었으며,
실행되는 시간은 오래 걸리기 때문에 인내를 가지고, 실행을 기다리자.
Backend 의 Sample 구조
X11 기반으로 OpenGL을 이용하여 재생을 한다.(일반적인 Gstreamer 를 생각하면 되겠다)
VIC의 주기능은 주로 영상변환기능(RGB2YUB 변환 or Scale 변환 , 즉 영상 Format의 변화 기능을 담당)이며,이를 TensorRT(GIE, Inference Engine)의 입력포맷에 맞게 데이터를 변환하여 처리한다.
https://www.youtube.com/watch?v=p1fJFG1S6Sw
1.2 Sample FrontEnd
이 Sample은 EVM JetsonTX2에는 Camera가 기본적으로 존재하기 때문에 동작하며, 다른 Jetson EVM에서는 동작이 될지는 정확하게 모르겠다.
Jetson TX2 EVM은 MIPI로 Camera가 연결이 되어있으며, 거의 구조가 Gstream의 Pipe와 비슷하며, 이를 비교해서 봐야할 것이다.
상위 테스트를 진행후 생긴 영상들의 종류를 아래와 같이 나눠볼 수 있겠다.
아래의 File Sink 부분이 각각의 H.265의 OUTPUT이라고 생각하면된다.
그리고, TensorRT를 걸쳐 직접 Rendering 하고 Display 해주는 부분과 H.264로 저장해주는 부분이다. (trt.h264)
아래의 Flow대로 라면 ,
Jetson TX 카메라의 실시간 영상분석(TensorRT이용하여,Box를 만들어 구분)하여 파일로 저장한다.
정확하게 테스트를 해볼 환경이 되지 않아 이부분을 직접 일일 보드를 가지고 돌아다니면서 다 테스트를 해보지 못했지만,
$ cd /usr/src/tegra_multimedia_api $ ls argus data include LEGAL LICENSE Makefile README samples tools $ cd samples // JetPack3.3 과 거의 동일함 00_video_decode 02_video_dec_cuda 04_video_dec_trt 06_jpeg_decode 08_video_dec_drm 10_camera_recording 13_multi_camera backend frontend v4l2cuda 01_video_encode 03_video_cuda_enc 05_jpeg_encode 07_video_convert 09_camera_jpeg_capture 12_camera_v4l2_cuda 14_multivideo_decode common Rules.mk $ cd backend //JetPack 3.3 과 동일하게, HDMI를 연결한 후 테스트를 진행해야 함 $ ./backend 1 ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 \ --trt-deployfile ../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.prototxt \ --trt-modelfile ../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.caffemodel \ --trt-proc-interval 1 -fps 10 // --trt-forcefp32 0 옵션이 없어지고, fp16으로 동작
Backend 의 Sample 구조
- Gstream 예제 ( not Used TensorRT)
X11 기반으로 OpenGL을 이용하여 재생을 한다.(일반적인 Gstreamer 를 생각하면 되겠다)
- Gstream 예제 ( used TensorRT)
VIC의 주기능은 주로 영상변환기능(RGB2YUB 변환 or Scale 변환 , 즉 영상 Format의 변화 기능을 담당)이며,이를 TensorRT(GIE, Inference Engine)의 입력포맷에 맞게 데이터를 변환하여 처리한다.
- 용어
- TensorRT (previously known as GPU Inference Engine (GIE))
- Video Image Compositor (VIC)
- VIC(Video Image Compositor)
- BackEnd Sample (상위예제)
- Yolo 영상 Test (JetsonHacks)
https://www.youtube.com/watch?v=p1fJFG1S6Sw
1.2 Sample FrontEnd
이 Sample은 EVM JetsonTX2에는 Camera가 기본적으로 존재하기 때문에 동작하며, 다른 Jetson EVM에서는 동작이 될지는 정확하게 모르겠다.
Jetson TX2 EVM은 MIPI로 Camera가 연결이 되어있으며, 거의 구조가 Gstream의 Pipe와 비슷하며, 이를 비교해서 봐야할 것이다.
$ cd /usr/src/tegra_multimedia_api $ ls argus data include LEGAL LICENSE Makefile README samples tools $ cd samples // JetPack3.3 과 거의 동일함 00_video_decode 02_video_dec_cuda 04_video_dec_trt 06_jpeg_decode 08_video_dec_drm 10_camera_recording 13_multi_camera backend frontend v4l2cuda 01_video_encode 03_video_cuda_enc 05_jpeg_encode 07_video_convert 09_camera_jpeg_capture 12_camera_v4l2_cuda 14_multivideo_decode common Rules.mk $ cd frontend //JetPack 3.3 과 동일하게, HDMI를 연결한 후 테스트를 진행, 실시간으로 화면재생 // 처음 구동시 trtModel.cache 를 생성하기 때문에 시간이 걸린다. $ sudo ./frontend --deploy ../../data/Model/GoogleNet_three_class/GoogleNet_modified_threeClass_VGA.prototxt \ --model ../../data/Model/GoogleNet_three_class/GoogleNet_modified_threeClass_VGA.caffemodel $ ll // 아래와 같이 새로 생성된 파일이 존재 (trt.h264 / trtModel.cache / output1.h265 ...) total 1134276 drwxr-xr-x 2 root root 4096 6월 7 13:00 ./ drwxr-xr-x 20 root root 4096 5월 30 15:17 ../ -rwxr-xr-x 1 root root 784936 5월 30 15:19 frontend* -rw-r--r-- 1 root root 12271 5월 30 15:17 main.cpp -rw-r--r-- 1 root root 157944 5월 30 15:19 main.o -rw-r--r-- 1 root root 2821 5월 30 15:17 Makefile -rw-r--r-- 1 root root 287496172 6월 7 12:59 output1.h265 -rw-r--r-- 1 root root 287555462 6월 7 12:59 output2.h265 -rw-r--r-- 1 root root 287447012 6월 7 12:59 output3.h265 -rw-r--r-- 1 root root 2626 5월 30 15:17 Queue.h -rw-r--r-- 1 root root 3134 5월 30 15:17 StreamConsumer.cpp -rw-r--r-- 1 root root 2854 5월 30 15:17 StreamConsumer.h -rw-r--r-- 1 root root 62112 5월 30 15:19 StreamConsumer.o -rw-r--r-- 1 root root 287331038 6월 7 12:59 trt.h264 -rw-r--r-- 1 root root 10003768 6월 7 12:49 trtModel.cache -rw-r--r-- 1 root root 13293 5월 30 15:17 TRTStreamConsumer.cpp -rw-r--r-- 1 root root 3856 5월 30 15:17 TRTStreamConsumer.h -rw-r--r-- 1 root root 341584 5월 30 15:19 TRTStreamConsumer.o -rwxr-xr-x 1 root root 208 6월 7 12:48 tst.sh* -rw-r--r-- 1 root root 9197 5월 30 15:17 VideoEncoder.cpp -rw-r--r-- 1 root root 3462 5월 30 15:17 VideoEncoder.h -rw-r--r-- 1 root root 83496 5월 30 15:19 VideoEncoder.o -rw-r--r-- 1 root root 4177 5월 30 15:17 VideoEncodeStreamConsumer.cpp -rw-r--r-- 1 root root 2480 5월 30 15:17 VideoEncodeStreamConsumer.h -rw-r--r-- 1 root root 104768 5월 30 15:19 VideoEncodeStreamConsumer.o // 각 동영상 H.264/ H.265 재생확인 $ sudo ../00_video_decode/video_decode H265 output1.h265 //480P or $ sudo ../02_video_dec_cuda/video_dec_cuda output1.h265 H265 //480p $ sudo ../02_video_dec_cuda/video_dec_cuda output2.h265 H265 //720p $ sudo ../02_video_dec_cuda/video_dec_cuda output3.h265 H265 //1080p $ sudo ../02_video_dec_cuda/video_dec_cuda trt.h264 H264 //1080p
상위 테스트를 진행후 생긴 영상들의 종류를 아래와 같이 나눠볼 수 있겠다.
아래의 File Sink 부분이 각각의 H.265의 OUTPUT이라고 생각하면된다.
그리고, TensorRT를 걸쳐 직접 Rendering 하고 Display 해주는 부분과 H.264로 저장해주는 부분이다. (trt.h264)
아래의 Flow대로 라면 ,
Jetson TX 카메라의 실시간 영상분석(TensorRT이용하여,Box를 만들어 구분)하여 파일로 저장한다.
정확하게 테스트를 해볼 환경이 되지 않아 이부분을 직접 일일 보드를 가지고 돌아다니면서 다 테스트를 해보지 못했지만,
일단 Box가 실시간으로 생기는 것은 확인은 했지만,아쉽게도 자동차는 잘 구분을 할 줄 알았으나, 구분을 잘 못하는 것 같음.
( 테스트 환경이 잘못될 수도 있음, 일반 자동차사진을 비추고 찍고 테스트함 )
( 테스트 환경이 잘못될 수도 있음, 일반 자동차사진을 비추고 찍고 테스트함 )
좌측 Argus Camera API
우측 V4L2
https://devtalk.nvidia.com/default/topic/1030593/how-to-control-on-board-camera-such-as-saving-images-and-videos/
1.3 Sample Videe_dec_trt
Backend와 유사한 Sample이지만, 영상으로 보여주지 않고 분석까지만 해주는 Sample 이다.
각 영상을 Decoding 한 후 각 Size에 맞게 변환 후에 TensorRT에 적용한 후 Save BBOX 정보
04_video_dec_trt
상위와 비슷한 예제이며, 직접 Video Input을 받아 처리
https://docs.nvidia.com/jetson/archives/l4t-multimedia-archived/l4t-multimedia-281/l4t_mm_vid_decode_trt.html
JetsonTX2 Gstreamer
https://developer.ridgerun.com/wiki/index.php?title=Gstreamer_pipelines_for_Jetson_TX2
https://elinux.org/Jetson/H264_Codec
https://developer.ridgerun.com/wiki/index.php?title=NVIDIA_Jetson_TX1_TX2_Video_Latency
Jetson TX2 Gstreamer and OpenCV (python)
https://jkjung-avt.github.io/tx2-camera-with-python/
https://devtalk.nvidia.com/default/topic/1025356/how-to-capture-and-display-camera-video-with-python-on-jetson-tx2/
https://docs.nvidia.com/jetson/archives/l4t-multimedia-archived/l4t-multimedia-281/l4t_mm_camcap_tensorrt_multichannel_group.html |
- FrontEnd Example
- Frame Buffer 정보
- Gstream 관련기능
https://devtalk.nvidia.com/default/topic/1030593/how-to-control-on-board-camera-such-as-saving-images-and-videos/
- 다른 Camera Solution
1.3 Sample Videe_dec_trt
Backend와 유사한 Sample이지만, 영상으로 보여주지 않고 분석까지만 해주는 Sample 이다.
$ cd /usr/src/tegra_multimedia_api $ ls argus data include LEGAL LICENSE Makefile README samples tools $ cd samples // JetPack3.3 과 거의 동일함 00_video_decode 02_video_dec_cuda 04_video_dec_trt 06_jpeg_decode 08_video_dec_drm 10_camera_recording 13_multi_camera backend frontend v4l2cuda 01_video_encode 03_video_cuda_enc 05_jpeg_encode 07_video_convert 09_camera_jpeg_capture 12_camera_v4l2_cuda 14_multivideo_decode common Rules.mk $ cd 04_video_dec_trt //result.txt result0.txt result1.txt 생성되며, HDMI 연결가능, 다른 모델을 사용했지만, 문제발생 // 2 Channel 분석 $ sudo ./video_dec_trt 2 ../../data/Video/sample_outdoor_car_1080p_10fps.h264 \ ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 \ --trt-deployfile ../../data/Model/resnet10/resnet10.prototxt \ --trt-modelfile ../../data/Model/resnet10/resnet10.caffemodel \ --trt-mode 0 or // 1 Channel 분석 $ sudo ./video_dec_trt 1 ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 \ --trt-deployfile ../../data/Model/resnet10/resnet10.prototxt \ --trt-modelfile ../../data/Model/resnet10/resnet10.caffemodel \ --trt-mode 0 $cat ../../data/Model/resnet10/labels.txt // Labeling 확인 Car RoadSign TwoWheeler Person //result.txt , result0.txt , result1.txt 생성 (2ch) $ cat result.txt | head -n 100 // num 0,1,2 모두 생성되며, 1과,2의 정보가 없어 문제 발생 frame:0 class num:0 has rect:5 x,y,w,h:0.55625 0.410326 0.040625 0.0516304 x,y,w,h:0.595312 0.366848 0.0546875 0.0923913 x,y,w,h:0.09375 0.36413 0.223438 0.201087 x,y,w,h:0.323438 0.413043 0.0984375 0.111413 x,y,w,h:0.403125 0.418478 0.0390625 0.076087 frame:0 class num:1 has rect:0 frame:0 class num:2 has rect:0 frame:1 class num:0 has rect:5 x,y,w,h:0.55625 0.413043 0.0390625 0.048913 x,y,w,h:0.595312 0.366848 0.0546875 0.0923913 x,y,w,h:0.09375 0.36413 0.225 0.201087 x,y,w,h:0.323438 0.413043 0.0984375 0.111413 x,y,w,h:0.403125 0.418478 0.040625 0.076087 frame:1 class num:1 has rect:0 frame:1 class num:2 has rect:0 frame:2 class num:0 has rect:5 x,y,w,h:0.55625 0.410326 0.0390625 0.0516304 x,y,w,h:0.595312 0.366848 0.0546875 0.0923913 x,y,w,h:0.0921875 0.36413 0.221875 0.201087 x,y,w,h:0.323438 0.413043 0.0984375 0.11413 x,y,w,h:0.403125 0.418478 0.040625 0.076087 frame:2 class num:1 has rect:0 frame:2 class num:2 has rect:0 frame:3 class num:0 has rect:5 x,y,w,h:0.554688 0.410326 0.0375 0.0516304 x,y,w,h:0.595312 0.366848 0.0546875 0.0923913 x,y,w,h:0.0921875 0.361413 0.220313 0.201087 x,y,w,h:0.323438 0.413043 0.0984375 0.111413 x,y,w,h:0.403125 0.421196 0.0390625 0.076087 ........ $ cat ./result0.txt | head -n 100 // num0 만 생성 frame:0 class num:0 has rect:5 x,y,w,h:0.55625 0.410326 0.040625 0.0516304 x,y,w,h:0.595312 0.366848 0.0546875 0.0923913 x,y,w,h:0.09375 0.36413 0.223438 0.201087 x,y,w,h:0.323438 0.413043 0.0984375 0.111413 x,y,w,h:0.403125 0.418478 0.0390625 0.076087 frame:1 class num:0 has rect:5 x,y,w,h:0.55625 0.413043 0.0390625 0.048913 x,y,w,h:0.595312 0.366848 0.0546875 0.0923913 x,y,w,h:0.09375 0.36413 0.225 0.201087 x,y,w,h:0.323438 0.413043 0.0984375 0.111413 x,y,w,h:0.403125 0.418478 0.040625 0.076087 frame:2 class num:0 has rect:5 x,y,w,h:0.55625 0.410326 0.0390625 0.0516304 x,y,w,h:0.595312 0.366848 0.0546875 0.0923913 x,y,w,h:0.0921875 0.36413 0.221875 0.201087 x,y,w,h:0.323438 0.413043 0.0984375 0.11413 x,y,w,h:0.403125 0.418478 0.040625 0.076087 frame:3 class num:0 has rect:5 x,y,w,h:0.554688 0.410326 0.0375 0.0516304 x,y,w,h:0.595312 0.366848 0.0546875 0.0923913 x,y,w,h:0.0921875 0.361413 0.220313 0.201087 x,y,w,h:0.323438 0.413043 0.0984375 0.111413 x,y,w,h:0.403125 0.421196 0.0390625 0.076087 frame:4 class num:0 has rect:5 x,y,w,h:0.55625 0.413043 0.0375 0.0461957 x,y,w,h:0.596875 0.366848 0.0546875 0.0923913 x,y,w,h:0.0921875 0.36413 0.220313 0.201087 x,y,w,h:0.323438 0.413043 0.0984375 0.111413 x,y,w,h:0.403125 0.421196 0.0375 0.076087 .......... //상위 분석한 정보기반으로 동영상 Play ( Backend와 동일) $ sudo ../02_video_dec_cuda/video_dec_cuda ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --bbox-file result0.txt
각 영상을 Decoding 한 후 각 Size에 맞게 변환 후에 TensorRT에 적용한 후 Save BBOX 정보
- 명령어 사용법
$ ./video_dec_trt // 사용법 1 Channl or 2 Channel Video 입력을 받아 최종으로 result.txt 를 만들어냄 (box 정보) video_dec_trt [Channel-num]$ ../02_video_dec_cuda/video_dec_cuda video_dec_cuda ... [options] Channel-num: 1-32, Number of file arguments should exactly match the number of channels specified Supported formats: H264 H265 OPTIONS: -h,--help Prints this text --dbg-level Sets the debug level [Values 0-3] --trt-deployfile set deploy file name --trt-modelfile set model file name --trt-mode 0 fp16 (if supported), 1 fp32, 2 int8 --trt-enable-perf 1[default] to enable perf measurement, 0 otherwise [options] Supported formats: H264 H265 OPTIONS: -h,--help Prints this text --dbg-level Sets the debug level [Values 0-3] --disable-rendering Disable rendering --fullscreen Fullscreen playback [Default = disabled] -ww Window width in pixels [Default = video-width] -wh Window height in pixels [Default = video-height] -wx Horizontal window offset [Default = 0] -wy Vertical window offset [Default = 0] -fps Display rate in frames per second [Default = 30] -o Write to output file -f 1 NV12, 2 I420 [Default = 1] --input-nalu Input to the decoder will be nal units --input-chunks Input to the decoder will be a chunk of bytes [Default] --bbox-file bbox file path --display-text enable nvosd text overlay with input string
04_video_dec_trt
상위와 비슷한 예제이며, 직접 Video Input을 받아 처리
https://docs.nvidia.com/jetson/archives/l4t-multimedia-archived/l4t-multimedia-281/l4t_mm_vid_decode_trt.html
JetsonTX2 Gstreamer
https://developer.ridgerun.com/wiki/index.php?title=Gstreamer_pipelines_for_Jetson_TX2
https://elinux.org/Jetson/H264_Codec
https://developer.ridgerun.com/wiki/index.php?title=NVIDIA_Jetson_TX1_TX2_Video_Latency
Jetson TX2 Gstreamer and OpenCV (python)
https://jkjung-avt.github.io/tx2-camera-with-python/
https://devtalk.nvidia.com/default/topic/1025356/how-to-capture-and-display-camera-video-with-python-on-jetson-tx2/