🎣

SmartCameraのストリーミング品質改善

2022/03/26に公開

はじめに

前回、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処理をOFF
    パラメータリストに-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秒に1回の間隔になる。これを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に設定されていて、明らかに低いので
    30000000(30Mbps)に設定してみます。

    設定通りのデータ量をPC側で受け取れていることが確認できます。

    映像を目視確認してもブロックノイズは目立たなくいい感じです。

終わりに

K260でSmartCameraを動かしてみましたが、ZCU104の時と比べて動画品質が向上していす。
これならドローンの映像配信にも使えるのではないでしょうか。
今後、これをベースにAIや画像処理機能を追加していくことをモチベーションに色々と試して行こうと思います。

Discussion