コンテンツへスキップ

Ubuntu 18.04.5 LTS に ffmpeg を導入

Jetson Nano の Ubuntu にffmpegをインストールします。
FFmpeg(エフエフエムペグ)は、動画と音声を記録・変換・再生するための非常に優秀なフリーソフトウェアです。マルチプラットフォームで利用できます。
コマンドラインから使用することができる。対応コーデックが多く、多彩なオプションを使用可能であり、バッチ処理にも向いています。

ffmpeg利用

ffmpegは、非常に多くの機能とオプションが準備されております。
以下のコマンドで、ヘルプの全体を見ることが出来ます。

今回は、めざましじゃんけんシステムの、めざましじゃんけん時の画像を用いて、AIによる画像認識結果を動画化しました。
その際に利用したコマンドは、以下となってます。

サンプル動画

ちょうど、めざましテレビでHELLOチャレンジが実施されていたので、
AIでめざましじゃんけんにチャレンジっていう感じで、Official髭男dismの「HELLO」を動画に組み合わせました。

#ハローチャレンジ

撮影テーマは「〇〇にチャレンジしよう!」

NVIDIA Jetson Nanoからのメール送信

NVIDIA Jetson Nanoの利用を開始すると、Jetson Nanoの各種プログラムからメール通知を利用したくなるケースがあります。
既に、同一環境内にSMTPサーバが導入済みである場合を全体として、Jetson NanoにSSMTPを導入し、Jetson Nanoからメール送信が出来るように設定します。
パッケージのアップデートやログのローテーション処理時のエラーなどもメール通知することが可能です。

以前の関連記事: Jetson Nano で SSMTP を利用してPHPからメール送信

ssmtpインストールおよび設定

ssmtpをインストールします。

ssmtp.confを編集。

  • mailhub=@@mail_server@@
    環境内のメールサーバを指定
  • rewriteDomain=miki-ie.com
    ドメイン名を指定
  • hostname=jetson01.miki-ie.com
    ホスト名を指定
  • FromLineOverride=YES
    メール送信元より、メールのFromを指定出来るように設定

created by Rinker
NVIDIA
¥15,600 (2020/10/28 06:01:50時点 Amazon調べ-詳細)

NVIDIA Jetson Nanoのセキュリティ対策

Ubuntuの自動アップデートを設定します。
再起動が必要な際は、指定した時間で再起動するように設定します。
自動アップデートの結果をメール送信するように設定します。

「unattended-upgrades」をインストールと有効化

「unattended-upgrades」をインストールします。

インストールした「unattended-upgrades」を有効化します。
以下のコマンドを実行し、表示される画面で<Yes>を選択します。

<Yes>を選択します。

 

「unattended-upgrades」設定

利用する設定ファイルは、以下の2つのファイルとなります。

  • /etc/apt/apt.conf.d/20auto-upgrades  : 自動アップデートとアップグレードを設定。
  • /etc/apt/apt.conf.d/50unattended-upgrades :詳細設定

「20auto-upgrades」設定

  • APT::Periodic::Update-Package-Lists "1";
    アップグレードの確認間隔
    Daily=1 / Every two days = 2 / Weekly = 7 / Every two weeks = 14 / Never = 0
  • APT::Periodic::Download-Upgradeable-Packages "1"
    セキュリティーアップデートがある場合の動作
    Download and install automatically = 1 / Download automatically = 1 / Display immediately = 0

「50unattended-upgrades」設定

以下の設定変更を加えました。

  • Unattended-Upgrade::Mail "aaa@bbbl.com";
    メール通知先の設定
  • Unattended-Upgrade::MailOnlyOnError "true";
    メール通知のタイミングをエラー発生時のみに変更
  • Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
    未使用となったカーネル関連パッケージの自動削除
  • Unattended-Upgrade::Remove-Unused-Dependencies "true";
    未使用となったパッケージの自動削除(apt-get autoremove)
  • Unattended-Upgrade::Automatic-Reboot "true";
    自動再起動が実施されるように設定(自動再起動ON)
  • Unattended-Upgrade::Automatic-Reboot-Time "02:00";
    再起動時の時間を指定

動作確認

以下のコマンドで、動作確認を実施しておきます。

created by Rinker
NVIDIA
¥15,600 (2020/10/28 06:01:50時点 Amazon調べ-詳細)

OPENCV 4.2の DNN が NVIDIA Cuda に対応

OpenCV の4.2より、OpenCVのdnnが、NVIDIA のGPUに対応していたようです。
しかも、NVIDIAのJetson Nanoでも利用可能でした。

とても驚きのトピックでした。
早速、NVIDA Jetson Nanoに導入し、YOLO / Darknet の推論を動作させてみました。
少し、導入に癖があったので、導入時のメモを公開しておきます。

Led by dlib’s Davis King, and implemented by Yashas Samaga, OpenCV 4.2 now supports NVIDIA GPUs for inference using OpenCV’s dnn module, improving inference speed by up to 1549%!

Pythonから、NVIDIA GPUのCUDAを用いた、OpenCVのDNNを利用する際のコードはBackendとTargetを以下のようにCUDAに設定します。

導入した環境

2020/08/20追記:
JetPack4.4とOPENCV4.4.0でインストールできました。

  • JetPack 4.3 (4.4では、OPENCVコンパイル時に、CuDNNがうまくコンパイルできず)
    Jetpack 4.3 Archive
  • OPENCV 4.3.0 (4.2.0でもインストール出来ました)
created by Rinker
NVIDIA
¥15,600 (2020/10/28 06:01:50時点 Amazon調べ-詳細)

導入方法

NVIDIA Jetson NanoのOpencvコンパイル用のスクリプトは、公式が公開したこともあり、各種エンハンスされ公開されています。
今回は、結構最近に公開されたとみられる、4.3.0向けのスクリプトを利用します。

Build OpenCV on Nvidia Jetson Nano

ポイントは、コンパイルオプションに以下を追加します。

  • WITH_CUDA
  • WITH_CUDNN

インストールスクリプト

コンパイルオプションを追加した、スクリプトを公開しておきます。

./Build_OpenCV.sh でインストールは完了します。
./Build_OpenCV.sh <version> で、指定したバージョンのOPENCVがインストール出来るようです。

実際にコンパイルした際の構成も公開しておきます。

NVIDIA CUDA: YES (ver 10.0, CUFFT CUBLAS FAST_MATH)
NVIDIA GPU arch: 53 62 72 -- NVIDIA PTX archs:
cuDNN: YES (ver 7.6.3)

created by Rinker
NVIDIA
¥15,600 (2020/10/28 06:01:50時点 Amazon調べ-詳細)

参考サイト

前提条件

JetsonにJenkins向けユーザー作成

別にセットアップされた、Jenkinsシステムより、NVIDIA Jetson Nanoを管理対象と資するために、Jetson NanoにJenkinsから操作する用のユーザーを作成します。

  1. Jetson Nanoに新規ユーザー作成
  2. Jenkins向けユーザーのsudoコマンド設定 パスワード
  3. Jenkins向けユーザーでのGitHubからのPull設定

1. Jenkins向けユーザーを作成

NVIDIA Jetson NanoにJenkinsユーザーを作成します。

2. Jenkins向けユーザーのSudoコマンド設定

Jenkinsユーザーで、各種スクリプトを実行するので、sudoが簡単に実行出来るように設定します。
※ 全体的にパスワードなしでのsudoを許可しているので、利用するコマンドごとの設定や、各種設定ファイルのアクセス権などを環境に合わせて設定し、セキュリティ対策を行って下さい。

作成するjenkinsファイルへの記載内容

3. Jenkins向けユーザーでのGitHubからのPull設定

Jenkinsを利用して、Githubに新しいソースコードがコミットされた際に、Githubより新規ソースコードの通知をトリガーとして、Jenkinsのタスクを実行させます。

Githubへの新規コミットをトリガーに、ジャンケンシステムを構成するメインのIntel NUC Ubuntuサーバー、Raspberry Pi、NVIDIA Jetson Nanoに最新のソースコードが自動的にデプロイ(Pull)される環境を構築しました。
デプロイ前に、簡単なテストなども自動化することが出来ます。

設定には、Jenkinsユーザー向けのSSHキーをNVIDIA Jetson Nanoで作成し、作成したSSHキーをGithubに登録します。GithubにSSHキーが登録出来たら、NVIDIA Jetson NanoからGithubへのアクセスを確認します。

Jetson NanoでSSHキー作成

Jenkinsユーザー向けのSSHキーを作成します。
このSSHキーをGithubに登録します。
Githubに登録することにより、Jenkinsユーザーを用いて、Githubの操作が可能になります。

GithubへSSHキーの登録と接続確認

https://github.com/settings/keys で id_rsa.pub の内容を登録します。

NVIDIA Jetson NanoからGithubへ接続確認

最後に、対象のサーバーより接続確認を行います。

created by Rinker
NVIDIA
¥15,600 (2020/10/28 06:01:50時点 Amazon調べ-詳細)

SU コマンドの有効化

セキュリティ対策ですが、利用したくなる「su -」コマンド、最近のUbuntsなどのLinux OSでは、初期設定時にrootのパスワードを設定しないので、suコマンドは利用できない状態となります。

以下が、suコマンドを実施して、失敗した際の例です。

SU コマンド有効化(rootユーザーのパスワード設定)

SUコマンドが利用できるように、rootユーザーのパスワードを設定します。
sudo su コマンドは利用できるので、自分のアカウントパスワードを用いて、rootユーザに切り替えを行います。

rootユーザーになり、パスワードコマンドでパスワードを設定します。
この状態で、suコマンドでのrootユーザーへの変更は可能となります。

動作確認のため、rootユーザーから抜けて、su -コマンドを実行し、パスワード入力後にrootユーザーに変更されることを確認します。

 

Jetson Nanoに Tensorflow-gpu、Keras などを導入

NVIDIA Jetsonへの各種ツールインストールは、NVIDAより公開されているOSイメージを利用することで、一通りのツールは導入済みとなります。
JETSON NANO DEVELOPER KIT(JetPack)と呼ばれています。

  • NVIDIA提供のtensorflow-gpu
  • Keras
  • その他ツール
created by Rinker
NVIDIA
¥15,600 (2020/10/28 06:01:50時点 Amazon調べ-詳細)

導入パッケージのアップデート

インストールパッケージを最新にアップデートします。

各種パッケージ導入

NVIDIAが提供する、JetPackを導入してください。
(NVIDIAが提供するイメージを用いたOSを導入して下さい)
以前は、OpenCVなどをコンパイルして導入しておりましたが、JetPack 4.3では、必要そうなツールは、事前に導入済みでした。

JetPack 4.3 components:

  • L4T R32.3.1 (K4.9)
  • Ubuntu 18.04 LTS aarch64
  • CUDA 10.0
  • cuDNN 7.6.3
  • TensorRT 6.0.1
  • VisionWorks 1.6
  • OpenCV 4.1 (4.1.1)
  • Nsight Systems 2019.6
  • Nsight Graphics 2019.5
  • Nsight Compute 2019.3
  • SDK Manager 1.0.0

TensorFlow-GPU導入

NVIDIAの開発者コミュニティに記載されている内容で、インストールを行います。

https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html#install

  1. TensorFlow導入の前提ソフトウェアをインストールします。
  2. 導入済みのPip3コマンドを最新版に更新します。
  3. 前提となるPythonパッケージをPip3コマンドで導入します。
最後に、NVIDIAより公開されている媒体を用いて、tensorflow-gpuのインストールを実施します。

以下のパッケージ群が導入されます。

Successfully installed absl-py-0.9.0 astor-0.8.1 cachetools-4.1.0 google-auth-1.14.1 google-auth-oauthlib-0.4.1 google-pasta-0.2.0 grpcio-1.28.1 keras-preprocessing-1.1.0 markdown-3.2.1 oauthlib-3.1.0 opt-einsum-3.2.1 pyasn1-0.4.8 pyasn1-modules-0.2.8 requests-2.23.0 requests-oauthlib-1.3.0 rsa-4.0 scipy-1.4.1 six-1.14.0 tensorboard-2.1.1 tensorflow-2.1.0+nv20.4 tensorflow-estimator-2.1.0 termcolor-1.1.0 werkzeug-1.0.1 wrapt-1.12.1

keras導入

以下が、導入したTensorflowや、導入されているOpenCVのバージョン確認結果となります。
created by Rinker
NVIDIA
¥15,600 (2020/10/28 06:01:50時点 Amazon調べ-詳細)

Apache 2、PHP、DB関係モジュールを導入

apt installで必要なパッケージを導入します。

NVIDIA Jetson NanoのUSB接続のHDD/SSDルート構成

NVIDIA Jetson NanoのルートディスクをUSB接続したHDDやSSD構成にする方法の最新版です。/dev/sda1を/(ルート)ディレクトリ構成にします。

以前に、同様の記事を投稿しましたが、よりスマートな導入方法が公開されていましたので、今回は、そちらの方法で、USBブート構成を作成しました。
根本原因となっていたブートシーケンスの変更により、USBブートが可能になっております。

※ ブート時にSDカードへアクセスします。
よって、SDカードの利用も必要となります。

以前の記事: Jetson Nano DeveloperをUSB 接続HDD/SSDルート構成

  1. 通常のブート用SDカード作成
  2. USBルートディスク構成作成ツールをダウンロード
  3. USB接続HDD/SSDにデータコピー
  4. ブートシーケンス変更

通常のブート用SDカード作成

SDカードイメージダウンロード

以下のURLに従い、利用するOSの手順でSDカードを準備しJetson Nano Developer Kit SD Card Imageを作成すれば、SDカードを用いてJetson Nanoの起動は可能となります。Write Image to the microSD Card

(Windows)SDカードフォーマット

SDカードをフォーマットします。SD Memory Card Formatter for Windows Download

SDカードへOSイメージを焼き付け

EtcherでダウンロードしたSDカードイメージをSDカードにコピーします。

最新のSDカードイメージと同様のバージョンで、SDカード用とUSB接続のHDD/SSD用のイメージが公開されています。

USBルートディスク構成作成ツールをダウンロード

利用する外部接続のHDDやSSDを準備

  1. fdisk -l で状況を確かめます。
    % sudo fdisk -l
  2. パーティションを削除します(ここでは、/dev/sda1とします)。
    % sudo fdisk /dev/sda
    .....
    コマンド (mでヘルプ): d (削除コマンド)
    選択した領域 1 (/dev/sda1を削除指定)コマンド (m でヘルプ): w (書き込み)
  3. 新たにパーティションを作成します。
    % sudo fdisk /dev/sda
    ...
    コマンド (mでヘルプ): n (作成コマンド)
    コマンドアクション
    e 拡張
    p 基本パーティション (1-4)
    p
    パーティション番号 (1-4): 1
    ....... コマンド (m でヘルプ): w (書き込み)

    ここでは、基本パーティションを選んで、 パーティション番号1(つまり/dev/sda1)を作りました。

  4. フォーマットする。
    sudo mkfs.ext4 /dev/sda1

最後に、適当なマウントポイントにマウントしておきます。

Githubより必要ツールを導入

Githubに、rootOnUSBプロジェクトとして公開されております。

作成したSDカードで、Jetson Nanoを起動させ、Githubレポジトリをダウンロード(クローン)します。

USB接続HDD/SSDにデータコピー

ブートシーケンスにUSB接続を追加するツールを実行します。

次に、SDカードのルートディレクトリの内容を、利用するUSB接続のHDDやSSDにコピーを実施します。copyRootToUSB.sh というコマンドが準備されております。

copyRootToUSBコマンドリファレンス:

外部接続した、HDD/SSDのパーティションをオプションしてして、コマンド実行を実施しました。

このコマンドを実行する前に、/dev/sda1を適当な場所にマウントしておく必要があります。マウントしていないと、コマンドは失敗します。

ブートシーケンス変更

/boot/extlinux/extlinux.confファイルを変更し、ルート領域を外部USB接続のHDD/SSDに変更します。

  1. ブート時にUSBをロードするイメージファイルを登録します
  2. ブートするDiskパスをUUIDを用いて指定します

DiskのUUIDを調べるツールも、rootOnUSBより提供されています。

また、extlinux.confファイルのサンプルも、sample-extlinux.confとして、提供されています。

もとのextlinux.confファイルのバックアップを準備し、以下の変更を加えます。

USBファームウェアを読み込んだイメージがロードされます。

UUIDでルートディスクを指定します。

最後に再起動して、ルートフォルダーが、指定した外部接続のHDDやSSDになっていることを確認します。

created by Rinker
NVIDIA
¥15,600 (2020/10/28 06:01:50時点 Amazon調べ-詳細)

以下のサイトが情報源となります。詳細に書かれています。

Jetson Nano – Run From USB Drive

NVIDIA Jetson Nano B01 の電源セレクター

NVIDIA Jetson Nanoを導入する人は、機械学習などの推論デバイスとして、Jetson Nanoの主な利用目的だと思います。

Jetson Nanoには、2系統の電源入力が選べ、マイクロUSB経由での給電か、ACアダプターからの給電が選択可能です。

  • マイクロUSBコネクターからの給電。最大2A
  • ACアダプターからの給電。最大4A

推論デバイス用途で利用する際は、CUDAコアをフルに稼働させたいと思いますので、その際は、マイクロUSBからの給電では、電力不足に陥るので、ACアダプターからの給電となります。ACアダプターは、以下の仕様となります。

  • 5V/4A DC
  • 電源ジャックは外径5.5mmφ、内径2.1mmφでセンター+

電源セレクターのジャンパーピン

以前のモデルのNVIDIA Jetson Nano A01の際は、利用する電源を選択するセレクター(Power Select Header (J48))に、自分で準備したジャンパーピンを用いてショートさせる必要がありました。

モデルチェンジ版のNVIDIA Jetson Nano B01には、写真のようにジャンパーピンが付属しておりました。
セレクターをショートさせずに付属しているので、アダプター利用時には、ジャンパーピンを用いて、J48をショートさせて、電源アダプター給電を利用します。

created by Rinker
NVIDIA
¥15,600 (2020/10/28 06:01:50時点 Amazon調べ-詳細)

NVIDIA Jetson Nano 追加

機械学習向けシングルボードコンピューターNVIDIA Jetson Nano、追加導入しました。
新しいラインナップなどが出ていないか、調べると、マイナーチェンジを行ったみたいです。

大きな違いはないですが、ボードから変わっているので、見えない安定性なども向上していることを期待してしまいます。

created by Rinker
NVIDIA
¥15,600 (2020/10/28 06:01:50時点 Amazon調べ-詳細)

NVIDIA Jetson Nano A02 と B01 違い

  • カメラコネクターが一つから二つに追加
    • カメラコネクターの追加(J49)
    • カメラコネクターの場所変更(J13)
  • ボタンヘッダー削除 (J40)
  • シリアルボードヘッダーの削除 (J44)
  • 入力電源選択の場所を変更 (J48)

NVIDIA Jetson Nano B01 仕様

GPU128-core Maxwell
CPUQuad-core ARM A57 @ 1.43 GHz
Memory4 GB 64-bit LPDDR4 25.6 GB/s
StoragemicroSD (not included)
Video Encoder4K @ 30 | 4x 1080p @ 30 | 9x 720p @ 30 (H.264/H.265)
Video Decoder4K @ 60 | 2x 4K @ 30 | 8x 1080p @ 30 | 18x 720p @ 30|(H.264/H.265)
Camera2 x MIPI CSI-2 DPHY lanes
ConnectivityGigabit Ethernet, M.2 Key E
DisplayHDMI 2.0 and eDP 1.4
USB4 x USB 3.0, USB 2.0 Micro-B
OthersGPIO, I2C, I2S, SPI, UART
Mechanical100 mm x 80 mm x 29 mm
created by Rinker
NVIDIA
¥15,600 (2020/10/28 06:01:50時点 Amazon調べ-詳細)