Flow-Developers

Raspberry Pi, Raspbian, python, ROS, IoT, 電子工作, 機械学習, Deep learning, ライフハック

JetsonXavierNXで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: PyTurboJPEG is a highly optimized Python wrapper of libjpeg-turbo (TurboJPEG API) which supports x86 and ARM architecture.

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

おまけ

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

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

qiita.com