SmartCamera의 스트리밍 품질 개선

개시하다


지난번에 SmartCamera로 카메라 이미지를 보여 주려고 했습니다.
https://zenn.dev/youkou/articles/1bdd3a204fb366
이번에는 이더넷을 통해 KV260과 PC를 연결하여 스트리밍을 시도해 보겠습니다.

환경 준비


KV260 및 PC의 IP 주소를 설정합니다.
KV260의 전원을 켭니다.터미널 소프트웨어에 로그인하여 다음 명령을 사용하여 일시적으로 IP 주소를 설정합니다.여기192.168.0.20입니다.
$ sudo ifconfig eth0 192.168.0.20
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.20  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::20a:35ff:fe0d:c473  prefixlen 64  scopeid 0x20<link>
        ether 00:0a:35:0d:c4:73  txqueuelen 1000  (Ethernet)
        RX packets 53  bytes 3256 (3.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 14  bytes 2372 (2.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 52
PC를 클라이언트로 설정합니다.
먼저 IP 주소를 설정합니다.여기192.168.0.15입니다.

KV260을 사용하여 SmartCamera의 펌웨어를 읽습니다.
$ sudo xmutil unloadapp
$ sudo xmutil loadapp kv260-smartcam
$ sudo xmutil listapps
                     Accelerator                            Base           Type    #slots         Active_slot

                        kv260-dp                        kv260-dp       XRT_FLAT         0                  -1
                  kv260-smartcam                  kv260-smartcam       XRT_FLAT         0                  0,
Socket 6 closed by client
클라이언트에 Gstreamer를 설치하여 스트리밍으로 재생합니다.
※ 아래 기사 6 참조
https://zenn.dev/youkou/articles/623f166387918e

흐름 전송 동작


KV260의 터미널 소프트웨어에서 응용 프로그램을 실행합니다.
흐름 전송 시 대상rtsp을 지정합니다.
$ sudo smartcam --mipi -W 1920 -H 1080 --target rtsp
PC 측은 명령 프롬프트에서 다음 명령을 실행합니다.
$ gst-launch-1.0 rtspsrc location=rtsp://192.168.0.20:554/test ! rtph264depay ! queue ! h264parse ! queue ! d3d11h264dec ! videoconvert ! d3d11videosink
KV260 카메라의 영상을 화면에 띄워 스트리밍 여부를 확인할 수 있다.

그런데 3초 딜레이가 있는 것 같고 화질도 안 좋아서 매개변수를 좀 만지고 싶어요.

지연 시간 개선


SmartCam의 매개변수는 다음 명령을 통해 확인할 수 있습니다.
$ smartcam -h
Usage:
  smartcam [OPTION?] - Application for facedetion detction on SoM board of Xilinx.

Help Options:
  -h, --help                        Show help options
  --help-all                        Show all help options
  --help-gst                        Show GStreamer Options

Application Options:
  -m, --mipi=                       use MIPI camera as input source, auto detect, fail if no mipi connected
  -u, --usb=media ID                usb camera media device id, e.g. 0 for /dev/media0
  -f, --file=file path              location of h26x file as input
  -i, --infile-type=h264            input file type: [h264 | h265]
  -W, --width=1920                  resolution w of the input
  -H, --height=1080                 resolution h of the input
  -r, --framerate=30                framerate of the input
  -t, --target=dp                   [dp|rtsp|file]
  -o, --outmedia-type=h264          output file type: [h264 | h265]
  -p, --port=554                    Port to listen on (default: 554)
  -a, --aitask                      select AI task to be run: [facedetect|ssd|refinedet]
  -n, --nodet                       no AI inference
  -A, --audio                       RTSP with I2S audio
  -R, --report                      report fps
  -s, --screenfps                   display fps on screen, notice this will cause performance degradation
  --ROI-off                         turn off ROI
  --control-rate=low-latency        Encoder parameter control-rate
  --target-bitrate=3000             Encoder parameter target-bitrate
  --gop-length=60
  --profile                         Encoder parameter profile.
  --level                           Encoder parameter level
  --tier                            Encoder parameter tier
  --encodeEnhancedParam             String for fully customizing the encoder in the form "param1=val1, param2=val2,...", where paramn is the name of the encoder parameter
  • AI 처리 종료
    매개 변수 목록에 -n, --nodet (no AI inference)이 있습니다.AI 처리는 기본적으로 적용되기 때문에 지정-n해 조작했으나 체감 지연은 개선되지 않았다.
  • 속도 제어
    기본 설정은 low-latency입니다.
    https://github.com/Xilinx/smartcam/blob/2021.1/src/main.cpp
  • GOP 길이
    I 그림의 삽입 간격에서 30 프레임 60은 기본값이기 때문에 2초 간격으로 한 번씩 삽입합니다.15로 변경해 보았지만 과부하가 있었는지 오히려 프레임 속도가 떨어졌다.
  • 결과적으로 파라미터 조정은 지연을 해결할 수 없습니다.프로그램이 RTSP 서버를 시작하여 전송하기 때문에 Gstreamer 명령을 직접 두드려 UDP 전송을 시도합니다.
    발송자
    gst-launch-1.0 v4l2src io-mode=4 device=/dev/video0  ! videoconvert ! video/x-raw, format=NV12, framerate=30/1, width=1920, height=1080 ! omxh264enc ! h264parse ! queue ! rtph264pay ! udpsink host=192.168.0.15 port=554 buffer-size=20000000
    
    수신자
    gst-launch-1.0.exe udpsrc name=video_src port=554 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" ! rtph264depay ! queue ! h264parse ! queue ! d3d11h264dec ! videoconvert ! d3d11videosink
    
    이 경우 1초 이내로 연기된다.
    RTSP 서버의 전송에 문제가 있는 것 같지만 환경 종속 가능성도 고려해서 여기에 문제가 있는 것 같다는 것만 알고 있습니다.

    화질 개선


    UDP를 통해 지연 없이 스트리밍이 가능하지만 화질이 여전히 좋지 않으니 이번에는 화질을 개선해 보겠습니다.

  • 목표 비트레이트
    기본값--target-bitrate=3000은 3Kbps로 설정하여 크게 낮음
    30000(30Mbps)으로 설정해 보십시오.
    PC 측에서 설정된 데이터 양을 받아들였는지 확인할 수 있습니다.

    눈으로 영상을 확인해도 소음이 나지 않아 좋다.

  • 끝맺다


    K260에서 Smart Camera를 움직여 보았지만 ZCU104 때보다 애니메이션의 질이 높아졌다.
    이렇게 되면 드론 영상 발표에도 쓸 수 있잖아.
    앞으로 이를 바탕으로 AI와 이미지 처리 기능을 추가하는 것을 동력으로 다양한 시도를 해보고 싶다.

    좋은 웹페이지 즐겨찾기