Flow-Developers

Raspberry Pi, Raspbian, python, ROS, IoT, 電子工作, 機械学習, Deep learning, サッカー, スポーツ写真, ライフハック

build and install onnx-tensorrt on jetson xavier nx jetpack 4.4

build and install onnx-tensorrt

f:id:flow-dev:20210213134706p:plain

environment

  • jetson xavier nx
  • jetpack4.4
uname -a
Linux jetson xaveir-nx 4.9.140-tegra #1 SMP PREEMPT Tue Oct 27 21:02:46 PDT 2020 aarch64 aarch64 aarch64 GNU/Linux

update cmake (3.13 Later for onnx-tensorrt)

  • cmakeのビルドに必要な物をinstall
sudo apt install libssl-dev libprotobuf-dev protobuf-compiler

# Was neccessary for my environment for $ ./bootstrap
  • cmake 最新版をビルドとインストール

qiita.com

install onnx-tensorrt on jetosn xavier nx

  • 下記手順でonnx-tensorrtをビルド
git clone --recursive -b 7.1  https://github.com/onnx/onnx-tensorrt.git  onnx_tensorrt
cd onnx-tensorrt
mkdir build && cd build
cmake .. -DTENSORRT_ROOT=/usr/src/tensorrt -DCMAKE_INSTALL_PREFIX=/usr/  
make -j8
sudo make install

www.codenong.com

※DockerでBuildする場合はこちらを参考に.

https://github.com/onnx/onnx-tensorrt/issues/385

convert model onnx to tensorrt

  • 実行方法
onnx2trt my_model.onnx -o my_engine.trt

install onnxruntime 1.4.0

wget https://nvidia.box.com/shared/static/8sc6j25orjcpl6vhq3a4ir8v219fglng.whl -O onnxruntime_gpu-1.4.0-cp36-cp36m-linux_aarch64.whl
pip3 install onnxruntime_gpu-1.4.0-cp36-cp36m-linux_aarch64.whl

developer.nvidia.com

install onnx_tensorrt.backend

  • CUDAへのPATHを通しておく
#Add a blank, then these 2 lines
# (letting your Nano know where CUDA is) to the bottom of the file.

sudo nano ~/.bashrc

export PATH=${PATH}:/usr/local/cuda/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64

source ~/.bashrc

# test nvcc path done
nvcc --version
  • Jetson XavierNXで"onnx_tensorrt.backend"をinstallするためには,onnx-tensorrtの以下の2Fileの変更が必要.変更差分は以下の通り.
--- a/NvOnnxParser.h
+++ b/NvOnnxParser.h
@@ -31,6 +31,10 @@
 #define NV_ONNX_PARSER_MINOR 1
 #define NV_ONNX_PARSER_PATCH 0
 
+#ifndef TENSORRTAPI
+#define TENSORRTAPI
+#endif // TENSORRTAPI
+
 static const int NV_ONNX_PARSER_VERSION = ((NV_ONNX_PARSER_MAJOR * 10000) + (NV_ONNX_PARSER_MINOR * 100) + NV_ONNX_PARSER_PATCH);
 
 //! \typedef SubGraph_t
diff --git a/setup.py b/setup.py
index 8ffa543..d6244a3 100644
--- a/setup.py
+++ b/setup.py
@@ -59,10 +59,11 @@ EXTRA_COMPILE_ARGS =  [
     '-std=c++11',
     '-DUNIX',
     '-D__UNIX',
-    '-m64',
     '-fPIC',
     '-O2',
     '-w',
+    '-march=armv8-a+crypto',
+    '-mcpu=cortex-a57+crypto',
     '-fmessage-length=0',
     '-fno-strict-aliasing',
     '-D_FORTIFY_SOURCE=2',
  • 上記の準備のち、以下のコマンドでinstallできた.
cd onnx-tensorrt
sudo apt install swig
pip3 install pycuda
sudo python3 setup.py install
  • python3で,import onnx_tensorrt.backend as backendが成功すればinstallが成功.
python3
>>import onnx_tensorrt.backend as backend

onnx->TensorRT変換するときに便利なサイト

  • TopK layer(2次元)や,Dobule型は2021/1現在,TensorRT変換できないので対処する記述が必要.

PyTorch documentation — PyTorch 1.9.0 documentation

  • onnx->TensorRT変換のErrがどこで起きてるか探しやすい.Ctrl+Fでlayer番号で検索できる.

Netron

  • Nvidiaのフォーラムに行けば大体似たようなErrに遭遇しているので,きっかけにはなる.

NVIDIA Developer Forums - NVIDIA Developer Forums

  • onnx-tensorrt/issuesも活発でよい質問多い.

github.com

  • onnxモデルをきれいにしてくれるので使ってもよいが,今回の場合は,綺麗にしすぎてTensorRT変換が出来なくなった.
  • --input-shapeで動的サイズのinputを,静的サイズに変更できるのは便利な時があるかもしれない.
  • Jetson XavierNXでonnx-tensorrtの環境を作った後だとうまくinstallできなかったので,別のPCで環境作った.

github.com



DJI Ronin-S/SC で簡単便利なリモート撮影!

はじめに

  • DJI Ronin-S/SCリモートコントロールは,驚くほど機能が豊富.
  • Ronin-S マルチカメラ制御ケーブルを購入するとさらに便利.
  • Ronin-S/SCとスマフォを使って,簡単リモート撮影を実現.

必要なもの

  • DJI Ronin-S / DJI Ronin-SC本体
  • Ronin-S マルチカメラ制御ケーブル ★注意!!! Ronin-S マルチカメラ制御ケーブルはカメラメーカー毎に種類があります。ここではSONY用を紹介します。

出来ること

リモートジンバル制御

  • スマフォ上のジョイスティックでジンバルの向きをグリグリ動かせる.(Bluetooth無線)
  • PS4 or XBOX360のコントローラでジンバルの向きをグリグリ動かせる.(Bluetooth無線)
  • スマフォカメラの映像をトラッキングして, ジンバルが被写体を追い続ける.
  • パノラマ,タイムラプス,カメラトラッキング用のジンバル駆動を事前に計画した通りに動かせる.

リモートカメラ制御

  • PS4 or XBOX360のコントローラで, レリーズ/半押し/ズーム/REC/フォーカス制御が出来る.
  • パワーズーム対応SONY E-mountレンズのズーム速度をスマフォで変更できる.


DJI Ronin-SC: How to connect your PS4 Controller

f:id:flow-dev:20200923092426p:plain
スマフォ制御画面

f:id:flow-dev:20200923092546p:plain
SONYカメラのリモート制御一覧

参考リンク

https://dl.djicdn.com/downloads/Ronin-S/20190926/Ronin_S_Camera_Compatibility_List_en_0926.pdf

www.cined.com

www.cined.com

XavierNXでlibjpeg-turboを使う

はじめに

  • cv2.imdecode()だと, Jpegのdecodeが遅い.
  • SIMD命令のlibjpeg-turboをXavierNXで使いたい.
  • PythonAPIで呼びたい.

f:id:flow-dev:20210213134510p:plain

libjpeg-turboのInstall

  • 以下のinst_libjpeg-turbo_205.shを使うと簡単.

Jetson_Convenience_Script/inst_libjpeg-turbo_205.sh at master · FREEWING-JP/Jetson_Convenience_Script · GitHub

wget https://raw.githubusercontent.com/FREEWING-JP/Jetson_Convenience_Script/master/libjpeg-turbo/inst_libjpeg-turbo_205.sh
chmod 777 inst_libjpeg-turbo_205.sh 
bash ./inst_libjpeg-turbo_205.sh

PyTurboJPEGのInstall

  • python3からlibjpeg-turboを呼ぶAPI

pypi.org

sudo pip3 install PyTurboJPEG

PyTurboJPEGの書き方

import cv2
from turbojpeg import TurboJPEG

# specifying library path explicitly
# defaultでlinuxの場合は,/usr/lib64/libturbojpeg.soを指してるので指定は不要.
# jpeg = TurboJPEG('/usr/lib64/libturbojpeg.so')

# using default library installation
jpeg = TurboJPEG()

# direct rescaling 1/2 while decoding input.jpg to BGR array
in_file = open('input.jpg', 'rb')

# 指定倍率でリサイズ可能. 速い.
# supported scaling factors are 
# [(2, 1), (15, 8), (7, 4), (13, 8), (3, 2), (11, 8), (5, 4), (9, 8), 
# (1, 1), (7, 8), (3, 4), (5, 8), (1, 2), (3, 8), (1, 4), (1, 8)]

bgr_array_half = jpeg.decode(in_file.read(), scaling_factor=(1, 2))
in_file.close()
cv2.imshow('bgr_array_half', bgr_array_half)
cv2.waitKey(0)

まとめ

  • libjpeg-turboで, Jpegのdecodeを高速化できた.
  • XavierNXだと, cv2.imcodeに比べて若干速い程度.(scaling_factorを上手く使うと速い)
  • PythonAPIで呼べるので便利.

参考リンク

PyTurboJPEG · PyPI

GitHub - lilohuang/PyTurboJPEG: A Python wrapper of libjpeg-turbo for decoding and encoding JPEG image.

【2020年版】NVIDIA Jetson Nano、Jetson Xavier NXの便利スクリプト (Jetsonの面倒な初期設定やミドルウェアのインストールを bashスクリプトの実行だけで簡単にできます)

おまけ

  • arm64だと使えなかった高速化ネタ

  • pillow-simd, accimage. Desktopで使えば便利そう.

qiita.com

FFmpegでRGBA-uint16をProRes4444で圧縮すると, DaVinci Resolve上ではfloat32(0.0-1.0[0-65535))の4chで扱える

FFmpegでRGBA-uint16をProRes4444で圧縮すると, DaVinci Resolve上ではfloat32(0.0-1.0[0-65535))の4chで扱える

f:id:flow-dev:20200628152954j:plain

内容

  • DaVinci Resolveで16bitのRGBA(4ch)を扱うためには, FFmpegでRGBA-uint16をProRes4444で圧縮する
  • FFmpegでRGBA-uint16をProRes4444で圧縮することで, DaVinci Resolve上ではfloat32(0.0-1.0[0-65535))の4chで扱える


sample code

  • ProRes4444の仕様は,RGB(12bit),A(最大16bit)ですが,DaVinci Resolveは以下のようにProRes4444を書き込むとDaVinci Resolve上ではfloat32(0.0-1.0[0-65535))の4chで扱えました
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import cv2
import numpy as np
import skvideo.io

if __name__ == '__main__':
    
    images = []

    # test frames(16bit gray png)  
    image_test_01 = cv2.imread("image_test_01.png",0) #16bit_gray_png
    image_test_02 = cv2.imread("image_test_02.png",0) #16bit_gray_png
    image_test_03 = cv2.imread("image_test_03.png",0) #16bit_gray_png

    # append array
    images.append(image_test_01)
    images.append(image_test_02)
    images.append(image_test_03)

    outputfile = "rgba_4ch_uint16.mov"
    
    # ffmpeg prores4444 rgba
        writer = skvideo.io.FFmpegWriter(outputfile, inputdict={}, outputdict={'-r': str(fps), '-codec:v': 'prores_ks', '-pix_fmt': 'rgba', '-profile:v': '4444', '-bits_per_mb': '8000', '-vendor': 'ap10', '-vf': 'scale=in_color_matrix=bt709:out_color_matrix=bt709'})
    
    # 1ch_16bit to 4ch_16bit
    for i in range(len(images)):
            tmp = np.full_like(images[i], 0).astype(np.uint8)
                rgba = cv2.cvtColor(tmp, cv2.COLOR_GRAY2RGBA) #1ch -> 4ch
                rgba = rgba.astype(np.uint16) #uint8 -> uint16
                rgba[:,:,0] = np.full_like(images[i], 65535).astype(np.uint16) # R(uint16)
                rgba[:,:,1] = np.full_like(images[i], 65535).astype(np.uint16) # G(uint16)
                rgba[:,:,2] = np.full_like(images[i], 65535).astype(np.uint16) # B(uint16)
                rgba[:,:,3] = images[i].astype(np.uint16)                      # A(uint16)
                frame = rgba
            writer.writeFrame(frame)
        writer.close()

参考リンク

Encode/VFX – FFmpeg

Video into ProRes

stackoverflow.com

ffmpegでAVC-Intraを作る

flow-developers.hatenablog.com

https://documents.blackmagicdesign.com/SupportNotes/DaVinci_Resolve_15_Supported_Codec_List.pdf

mogrify便利コマンド(随時)

mogrify便利コマンド(随時)

  • すぐmogrifyのコマンド忘れてしまうので, 随時更新.

f:id:flow-dev:20200430110527j:plain



画像フォーマットを一括変換
mogrify -format png *tif
画像を一括リサイズ
mogrify -resize 384x216 *.png

参考文献

imagemagick.org

flow-developers.hatenablog.com

FFmpeg便利コマンド(随時)

FFmpeg便利コマンド(随時)

  • すぐFFmpegのコマンド忘れてしまうので, 随時更新.

f:id:flow-dev:20200430105826j:plain



動画を連番png画像で展開(連番で命名)
ffmpeg -i input.mp4 -vcodec png image_%03d.png
動画に3DLUTを充てて,YUV420で出力
ffmpeg -i input.mp4 -b:v 100M -g 1 -vsync 1 -pix_fmt yuv420p -vcodec libx264 -vf lut3d="3dlut.cube" output.mp4
連番画像を23.98fps,yuv422でh264出力
ffmpeg -r ntsc-film -i %03d.png -y -threads 0 -b:v 100M -minrate 100M -maxrate 100M -bufsize 200M -tune film -color_primaries bt709 -color_trc bt709 -colorspace bt709 -g 1 -vsync 1 -pix_fmt yuv422p -vcodec libx264 -r ntsc-film output.mp4
連番画像を23.98fps,yuv422でh264出力(開始フレーム番号を指定)
ffmpeg -r ntsc-film -start_number 101 -i %03d.png -y -threads 0 -b:v 100M -minrate 100M -maxrate 100M -bufsize 200M -tune film -color_primaries bt709 -color_trc bt709 -colorspace bt709 -g 1 -vsync 1 -pix_fmt yuv422p -vcodec libx264 -r ntsc-film output.mp4
動画を23.98fps,yuv422でProResHQ出力
ffmpeg -r ntsc-film -i input.mp4 -y -threads 0 -codec:v prores_ks -pix_fmt yuv422p10 -profile:v 3 -bits_per_mb 8000 -vendor ap10 -vf scale=in_color_matrix=bt709:out_color_matrix=bt709 -r ntsc-film output.mov
動画を開始タイムコードを指定して,23.98fps,yuv422でProResHQ出力
ffmpeg -r ntsc-film -i input.mp4 -timecode 11:00:06:00 -y -threads 0 -codec:v prores_ks -pix_fmt yuv422p10 -profile:v 3 -bits_per_mb 8000 -vendor ap10 -vf scale=in_color_matrix=bt709:out_color_matrix=bt709 -r ntsc-film output.mov
120p動画を開始タイムコードを指定して,ベース23.98fps, 22fpsスロー H264出力(音声つき)
ffmpeg -r (120*(24/22)) -i input.MP4 -timecode 01:02:03:04 -y -threads 0 -b:v 100M -minrate 100M -maxrate 100M -bufsize 200M -tune film -color_primaries bt709 -color_trc bt709 -colorspace bt709 -g 1 -vsync 1 -pix_fmt yuv420p -vcodec libx264 -r ntsc-film -filter:v "setpts=(22/24)*PTS" -filter:a "atempo=(24/22)" -acodec aac -b:a 256k -ar 48000 -vf lut3d="3dlut.cube" output_slow_22p.MP4
連番画像(rgba_4chのpng)を23.98fpsのProRes4444で出力
ffmpeg -r ntsc-film -i %05d.png -y -threads 0 -codec:v prores_ks -pix_fmt rgba -profile:v 4444 -bits_per_mb 8000 -vendor ap10 -vf scale=in_color_matrix=bt709:out_color_matrix=bt709 -r ntsc-film output.mov
連番画像(rgba_4chのpng)を23.98fpsのpng codecで出力
ffmpeg -r ntsc-film -i %05d.png -vcodec png -r ntsc-film output_png.mov
H.265 codecで出力
ffmpeg -i input.mp4 -c:v libx265 -crf 22 -tag:v hvc1 output.mp4
切り出し位置を時間(-ssが先頭時間,-tが全長時間)で指定して,23.98fps,yuv422でProResHQ出力
ffmpeg -ss 0.6 -i input_prores4444.mov -t 2.0 -y -threads 0 -codec:v prores_ks -pix_fmt rgba -profile:v 4444 -bits_per_mb 8000 -vendor ap10 -vf scale=in_color_matrix=bt709:out_color_matrix=bt709 -r ntsc-film output_prores4444.mov

参考文献

ffmpegでProRes変換 - 日々適当

ffmpegで連番画像から動画生成 / 動画から連番画像を生成 ~コマ落ちを防ぐには~ - Qiita

ffmpeg alphaチャンネルを扱える動画エンコーダのメモ - 脳内メモ++

Using FFmpeg to Create HEVC Videos That Work on Apple Devices

ffmpeg で指定時間でカットするまとめ | ニコラボ

M5stickV ZERO-ONE (ゼロワンAIカメラ)

M5stickV ZERO-ONE (ゼロワンAIカメラ)

  • M5stickVとKendryte K210が大変興味深かったので,作ってみました.
  • Keras, MobilenetV1のFineTuningで学習しています.
  • Datasetが少ないので,Data Augmetを工夫して,動画の通り満足いく性能が出せました.

f:id:flow-dev:20200421134557p:plain



参考文献

qiita.com