コンテンツへスキップ

Ubuntu 18.04.5 LTS に ffmpeg を導入

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

ffmpeg利用

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

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

サンプル動画

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

#ハローチャレンジ

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

GeFroceのGPUアップグレード検討

以前の検討:2019年8月個人向け深層学習・機械学習向けGPU
現在利用しているGPU:GeForce GTX 1660 SUPER 導入しました

現在、MSI GeForce GTX 1660 SUPER AERO ITX OCを利用しております。
6GB GDDR6のメモリ容量となります。23,122円で購入しました。

ディープラーニング(Deep Learning)深層学習、ニューラルネットワーク(ディープニューラルネットワーク、Deep Neural Network: DNN)による機械学習向けにGeForceを利用しておりました。
外出自粛や在宅勤務など、自宅で過ごす時間も増えて、Zoom, Skype, Microsoft Teams, WebExなどのオンラインでのコミュニケーションや、パソコンのゲームも行うようになりました。

  • YOLO, DarknetなどDNN実施時のGPUメモリ不足(out of memory)回避、メモリ不足回避の学習回数増加による学習時間増加
  • 画像関係のDNNでは、GPUメモリ不足により、満足に学習自体実行が出来ないケースあり
  • 趣味の範囲なので、過剰な投資は出来ない
  • PCでヘビーでないゲームを行う。モニタ出力にDisplayPortを利用したい
  • メモリ容量が増えるが目的
  • そして今回は、RTXを利用したい
    (NVIDIA RTX VoiceでZoomなどの際のノイズ除去を行いたい)
    NVIDIA RTX Voice 最強のノイズ除去

グラフィックカードのメーカーですが、NVIDIAかAMDとなり、それぞれNVIDIAからGeForce、AMDからRadeonがリリースされています。
各種ツールとの親和性を考えると、GeForce一択となりました。

NVIDIAのGeForce RTX 20XXシリーズ(2060 SUPER、2070、2060)やGeForce GTX 16XXシリーズ(1660 SUPER、1660 Ti、1660)が現行モデルとなります。

今回検討している、RTX20シリーズですが、深層学習用のテンソルコア(Tensor Core)搭載となります。4×4行列の積和算を4つ並列に行う事が出来るようになり、Tensor Coreを使えば、CNNの畳み込み高速化、メモリ転送の効率化などにより、前世代の Pascal GPU と比べて、学習(トレーニング)速度が4 倍になるようです。
Volta Tensor コア GPU が AI パフォーマンスの新記録を達成新しいウィンドウで開きます

消費電力も、現在のパソコンケースの電源サイズや電気料金にも影響するので、一応比較軸に入れます。消費電力とTDP:Thermal Design Power(熱設計電力)は混同されて利用されています。TDPは、電源および冷却に関する指標を示す数字となります。

NVIDIAのGPUコアは「CUDA(クーダ)コア」と呼ばれます。一般的には「シェイダープロセッサ(Shader Processor)」、「ストリームプロセッサ(Stream Processor)」などと呼びます。

GPU導入候補比較表

価格帯を考え、第一候補は、2060 SUPERと2060の価格差に価値があるかないかの判断となりました。パソコンパーツの需要が大きいようで、全体的に値段が高めです。3,000円から5,000円程度安く購入できるタイミングがあると思います。

GPUGeForce GTX 1660 SUPERGeForce RTX 2070 SUPERGeForce RTX 2070GeForce RTX 2060 SUPERGeForce RTX 2060
価格イメージ
2020/07
32,00065,50048,00046,50039,000
メモリサイズ6GB8GB8GB8GB6GB
メモリ規格GDDR6GDDR6GDDR6GDDDR6GDDR6
CUDA(SP数)14082560230421761920
消費電力125W235W175W175W160W
サイズ204x128x42 mm258x127x43 mm232x127x42 mm205x127x43 mm216x132x42 mm

MSIの GeForce GTX / RTX のVENTUSモデルをベースに比較

性能比較:[ドスパラ]グラフィックボード・ビデオカード性能比較ベンチマークテスト

個人深層学習向けGPU比較結果

  1. 機械学習をメインに考えメモリサイズ8Gを選択。価格的に2070も視野に入るが、現行モデルの2060 SUPERを選択
  2. 妥協なく、最善の選択だと思います。
    前回、RTX 2060とGTX 1060 SUPERを比較し、価格理由で1060 SUPERを選択しました。やはり、妥協ない選択がベストです。
  3. RTXでなければ、GTX 1060 SUPERはコストパフォーマンスも高く今でもお勧めのグラフィックカードです。
created by Rinker
MSI
¥65,000 (2020/10/27 17:43:51時点 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調べ-詳細)

参考サイト

ついに決めた、GeForce GTX 1660 SUPER

本日は、クリスマス。アマゾンサンタが昨日持ってきてくれたぞ!!

YOLO/Darknetなどの画像系の機械学習を動かし始めた当初より困っていたGPU。
やはり、GPUの物理メモリサイズは、画像学習の精度に学習速度に大きく関わります。

10月29日に発表されたようで、今回再度調べた際に、一番のコストパフォーマンスが感じられ、すぐに購入しました。
Amazonで、10%の値引きも入り23,122円で購入出来ました。

最初に、GPUをあれこれ、考えた際の記事はこちら:
2019年8月個人向け深層学習・機械学習向けGPU

  • YOLO, DarknetなどDNN実施時のGPUメモリ不足(out of memory)回避、メモリ不足回避の学習回数増加による学習時間増加
  • 画像関係のDNNでは、GPUメモリ不足により、満足に学習自体実行が出来ないケースあり
  • 趣味の範囲なので、過剰な投資は出来ない(個人的には2−3万円以内)
  • PCで基本的にゲームなどは実施しない、モニタもHDMI接続1台
  • GPUメモリ容量を増やしたい

GeForce GTX 1660 SUPER

GeForce GTX 1660 SUPERは、発売済みのGPUであるGeForce GTX 1660とGeForce GTX 1660 Tiの中間に位置します。

GPUコアのベースクロックは1,530MHzで、ブーストクロックは1,785MHz。これらのスペックはGeForce GTX 1660とまったく同じだ。

VRAMには、14Gbps動作のGDDR6メモリを6GB搭載。VRAMとGPU間は192bitのメモリインターフェイスで接続しており、メモリ帯域幅は336GB/sに達している。これはGDDR5メモリを採用していたGeForce GTX 1660の192GB/sを75%上回り、上位モデルであるGeForce GTX 1660 Tiの288GB/sをも上回る。メモリ帯域は、上位機種の2060同じ。

つまり、1660のGPUコア性能とGDDR6による高速アクセス可能なメモリが実装されました。そして、値段も当然中間の位置づけ。ただし、もっと1660に近い。
驚くのは、各種ベンチマーク結果。
1660 Tiの性能域にすごく近いです。価格は、1660に近く性能は、上位のTiに近い。
これは、絶妙なポジショニングと思います。
さらに、機械学習ではGPUメモリ内のデーターを繰り返し処理するので、学習時間に大きく寄与できると思います。

検討機種の比較表

10%の割引がなくてもGeForce GTX 1660相当です。機械学習にはおすすめだと思います。
特に、私のような学習をGPU、通常時の推論をシングルボードなど、非力なマシンで動作させるケースでは、十分なGPUだと思います。

GPUGeForce GTX 960GeForce RTX 2060GeForce GTX1660TiGeForce 1660 SUPERGeForce GTX1660
価格イメージ
2019/08
当時購入金額
25,000
42,000
38,000
36,000
30,000
23,122円28,000
26,000
メモリサイズ2GB6GB6GB6GB6GB
メモリ規格GDDR5GDDR6GDDR6GDDR6GDDDR5
メモリ帯域112GB/s336GB/s288GB/s336GB/s192GB/s
CUDA(SP数)10241920153614081408
消費電力120W160W120W125W120W

ぜひ、各種ベンチマーク結果なども、WEBで調べて見て下さい。

YOLO動作環境

YOLO v3を動作することが出来なかったので、利用を見送りましたが、darkflowというフレームワークを導入したので、インストール方法を残しておきます。

pipやaptでインストール出来なかったですが、gitよりダウンロードし簡単に導入出来ます。

NVIDIA Jetson Nano、Raspberry Piで導入し、動作テストを実施しました。

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

 

ディープラーニング NVR DVA3219

実はニーズドンピシャの商品。
SynologyのNASにGeforceが搭載され、まさに機械学習が画像検出向けの製品です。

私自身は、Synologyがデータ保管に、情報発信。
機械学習などは、NVIDIAのJetsonやRaspberry PiとIntel NCS2を利用したシステムを組んでいるので、このNVR DVA3219がうまく利用出来れば、全てを賄うことが出来ます。

NAS + 推論マシン = NVR DVA3219

しかも、しっかりとしたGPUなので、ネットワークカメラのみをエッジデバイスとして配置し、集中したシステム管理ができそうです。

自由度が分かれ目

ライトユーザーで、そのまま監視カメラを利用するには、ハードがオーバースペックで割高を感じると思います。逆に、どこまで自由にNAS OSをユーザーに触らされるかで、新しいフレームワークなどが日々現れる人工知能などの分野のユーザーが満足出来る製品なのか、難しい部分。
やはり、ライトユーザー狙いでないと、自作系には価格にも勝てないので、私はこの製品のターゲットからずれているのかなと感じております。やはり、色々自分もカスタマイズして、機械学習などの旨味を出来る範囲で、最大限に味わいたい。

高めの価格設定

非常に面白い商品構成、今後ベアボーンなども類推デバイスとして、GPU搭載などが出てくると予想される、その火付け役となってほしいです。
まだまだ、試行錯誤の機械学習や人工知能分野、パッケージ化などはもう少し先でしょうか?やはり、プラグイン感覚で、どんどん出来ることが増えていくのでしょうか?どんなプラットフォームがデファクトとなるのでしょうか? 実は、5G+スマホだったり!?

Synology ディープラーニング Network Video Recorder DVA3219 HDD非搭載モデル【在庫目安:お取り寄せ】| カメラ ネットワークディスクレコーダー ネットワークビデオレコーダー 監視 録画 ネットワークカメラ

 

 

 

AlexeyAB/DarknetをNvidia Jetson Nanoにインストール

Raspberry Piとの一番の違いは、GPU対応で、Darknet・AlexeyABをシングルボードコンピューターにインストール出来ることが、大きな魅力となります。
しかも、インストールもWindows版よりも簡単だと思います。

参考記事:Windows10に AlexeyAB・Darknet・YOLO V3導入(Vestal Studio)

ライブラリーアップデート

  1. apt update
  2. apt upgrade -y

Cuda関係のパスを環境変数に登録

  1. export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
  2. export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

DarknetのダウンロードとYoloモデルのダウンロード

  1. git clone https://github.com/AlexeyAB/darknet
  2. cd darknet
  3. wget https://pjreddie.com/media/files/yolov3.weights
  4. wget https://pjreddie.com/media/files/yolov3-tiny.weights

MakeFileを変更しGPU、OPENCV対応へ

Makefileを変更し、GPU、CudaとOpencv対応となるようにコンパイルオプションを変更します。.

  1. sudo vi Makefile

MakeFile変更内容
GPU=1
CUDNN=1
OPENCV=1

Darknetをコンパイル

  1. make

以上でDarknetが利用可能となります。

darknetフォルダで、以下サンプルコマンドを実行し、動作を確認してください。

  1. cd darknet
  2. ./darknet detector test cfg/coco.data yolov3.cfg yolov3.weights -ext_output dog.jpg

Make時にエラーが出て、以下変更を加えました。

変更1

NVCC=nvcc 部分を
NVCC=/usr/local/cuda/bin/nvcc
に変更

変更2 ライブラリ追加

sudo apt install libopencv-dev

参考にさせて頂いたサイト

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

WEBカメラ/USBカメラ

リアルタイム画像検出で大切な入力デバイスとなるカメラ、各種選択肢があります。画角、フォーカス、露出などを考えていくと悩むことがたくさんあります。
カメラの安定動作や設置時の物理的な安定性など、安定した画像検出には、場面場面に合わせたカメラが必要になります。

今回探したカメラの要件

  • ある程度物理的な設置位置がずれた際も、画像検出を続けたい
  • 暗闇以外、昼夜画像検出可能な範囲での撮影が可能
  • USB接続で安定動作

カメラの要求仕様

  • 画角が広い(ある程度の物理設置位置の変更に対応可能、そもそも多少の広角は必須)
  • ある程度自動での画質設定(朝日などが当たると、画質は一気に変わります)
  • オートフォーカス (こちらもあると安心)
  • 過度な高画質は不要(画像検出時に必要な画素数はHDで十分)
  • 音声は基本的に使わない(画像検出のみ)

一番の要件は、広角でした。広角対応のカメラは以下が候補となりました。

オートフォーカスで手頃なカメラだと、サンワサプライ オートフォーカスWEBカメラ CMS-V45Sなどが出来ていました。画角65度と通常のWEBカメラよりは広角。

通常のWEBカメラは、58度前後で60度以下となります。
最初にBUFFALOの広角カメラを導入したこともあり、60度以下の画角では今回は、そもそも画像検出対象の画角となりませんでした。
また、広角になるとオートフォーカスも難しいと思うので、広角+オートフォーカスを満たそうとすると、一気に対象製品を探すのが難しいです。

今回選んだカメラは、ロジクール ウェブカメラ C615 ブラック フルHD 1080Pとなります。

画角が78°でオートフォーカス。
近距離(最長7cm)対応、高速オートフォーカス、HD光補正。
一方、マイクはステレオ未対応のモノラル、画質(720p/30fps)となり、最新機種よりはスペックダウンします。(ここが、納得の価格で入手出来るポイントだと思います)

まだ、導入後1週間ですので、Jetson Nanoとの組み合わせで利用し、何かあれば、またレビューさせて頂きます。

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

一つ前の関連記事:NVIDIA Jetson Nano vs Raspberry Pi with NCS2 (Movidius Neural Compute Stick 2)

全242回のめざましじゃんけん結果取得を通じて

一番のテーマは、信頼性の向上です。
「全部の回次を正しく結果取得」
1回1回の信頼性向上・・・まだ、道半ば。誤判定をなくす、(運用コストが低く)信頼性の高いH/Wの導入。そして、H/Wの冗長化
イレギュラー開催などへの対応
・・・見えていない部分もありますが、ダブルポイントなどへの対応、年末年始など、個別開催時間への対応など
信頼性を向上するうえで、システムの構成予想削減(よりシンプルに)、より高信頼なハードウェアで。
最近ホットな出来事は、USBカメラの画像が悪い時(太陽の高さなど、テレビの設置環境に依存)の画像検出率低下、さらには誤判定。
これらを回避する途中に、エッジコンピューティングでの画像検出エンジンの高速化が実現しました。
(高速化や信頼性を主テーマとすると、他の方式もありますが、あくまで気になる分野や楽しそうな技術の採用を優先させております)

  • Raspberry Pi単体での画像検出を断念 (Windowsメインマシンでのモデル実行)
  • Raspberry Pi with NCS2での画像検出へ移行
    世界最速めざましじゃんけん結果公開Neural Compute Stick 2 ( NCS )
    この時点でもすでに、エッジコンピューティングの凄さに感動しました。
  • NVIDIA Jetson Nanoを試行開始(Keras + YOLO)
  • NVIDIA Jetson Nanoでlibdarknet.so利用(NVIDIA CUDAの真髄)
    YOLO / Darknetを動かす上で、アーキテクチャ的には一番良い選択なのだと思います。それにしても、Keras(TensorFlow)と比べて、倍速になるとはびっくりしました。
今後、記事化予定ですが、DarknetのGitHubより配布されているPythonスクリプトもPython3対応版となっております。
Makefileを変更し「LIBSO=1」、Pythonスクリプトより、ctypes import *を用いて、lib = CDLL("libdarknet.so", RTLD_GLOBAL)ライブラリを取り込み、Python 3のwrapperとして利用出来ました。
Keras導入時点のWEB記事では、導入が難しそうな記事も散見され、深追いしておりませんでした。

NVIDIA CUDA Toolkit 10.0 に対応しcuDNN 7.3など、機械学習時にデファクトスタンダートとなっているライブラリやフレームワークが多く、システムアーキテクチャの選択肢が非常に多いです。
今回も他フレームワークも視野に入れ、比較検討することが出来ました。TensorFlow や PyTorch、Caffe、Keras、MXNet などの機械学習 (ML) フレームワークに対応しています。ネイティブにインストールすることができます。

NVIDIA Jetsonの情報収集

NVIDIAの社員や関係者が強力にサポート、情報発信。
さすが、大手。ハードの供給体制もRaspberry Pi と比べて力強さを感じます。開発コミュニティーへの社員の書き込みが、本当にすごい。
オープンコミュニティの新しい形にも見えました。ハードでビジネスは成立し、技術者が率先して、コミュニティに参加。これは、弱点と感じた部分を、むしろ強み(正しい情報、責任感ある素早い対応)にしております。
今回は、特にこれらを体感出来ました。

関連記事:

NVIDIA Jetson Nanoで機械学習(推論)

Movidius Neural Compute Stick2とRaspberry Pi 3B +も利用しておりますが、GPU/推論向けデバイスが一体化されており、少しサイズは大きいです。
USB3.0などI/Fに差分もあるので、Raspberry Pi 4Bと比較したほうが良いかもしれません。ただし、Raspberry Pi 4B と NCS2を同時導入すると考えると、Jetson Nanoのほうがコストパフォーマンスが良いと思いますし、便利なフレームワーク利用により、開発時の手間(コスト)も考えると、機械学習にはNVIDIA Jetson Nanoがベストな選択と思います。

Jetson Nano、Raspberry Pi 3B + with NCS2 速度比較

めざましじゃんけん時に取得したWEBカメラ画像を216枚で画像認識エンジンを動作させた際の性能比較です。
以前同じテストを用いて、NCS2(Movidius Neural Compute Stick 2)導入により十分高速化された結果となりました。今回は、その結果と比べても十分に魅力的なJetson Nanoの結果が出ました。

参考記事:ディープラーニング向けUSBアクセラレーターNeural Compute Stick 2ー

Windows(GPU未使用)
Core i7 6700/(Skylake) クロック周波数:3.4GHz
15秒 opencv.dnn
Raspberry Pi 3
Model B+
ARM Cortex-A53 1.4GHz
785秒 opencv.dnn
Raspberry Pi 3
Model B+
ARM Cortex-A53 1.4GHz
+  Movidius Vision Processing Unit(Myriad 2)
105秒 opencv.dnn
NVIDIA Jetson Nano
Quad-core ARM A57 @ 1.43 GHz
109秒 opencv.dnn
NVIDIA Jetson Nano
Quad-core ARM A57 @ 1.43 GHz
+ 128-core Maxwell
46秒 Keras-YOLO
NVIDIA Jetson Nano
Quad-core ARM A57 @ 1.43 GHz
+ 128-core Maxwell
20秒 libdarknet.so (ctypes)

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

関連記事:NVIDIA JETSON NANO

Intel Neural Compute Stick 2

2

機械学習のトレーニング時に悩まされるメモリー不足

2019年8月個人向け深層学習・機械学習向けGPUの購入を考えたり、AlexeyAB / Darknet で独自学習(YOLO3 ,Tiny – YOLO 3)でもトレーニングパラメーターを調整したりして、メモリ不足を回避し学習を実施する必要があります。
Chainer利用時に、メモリ不足に困ったのですが、Unified Memoryという、CPUとGPUで共通のメモリ空間(=GPUメモリ+CPUメモリ)を使う方法です。
以下のパラメーターでOut of MemoryでNGとなった場合を考えると。
INPUT_WIDTH = 128
INPUT_HEIGHT = 128
GPU_ID = 0
BATCH_SIZE = 64
MAX_EPOCH = 20
BATCHI_SIZEを小さくして、Out of Memoryを回避して学習をすすめることも出来ます。
INPUT_WIDTH = 128
INPUT_HEIGHT = 128
GPU_ID = 0
BATCH_SIZE = 32
MAX_EPOCH = 20
または、GPUを利用せずにCPUで学習を進めることも出来ます。GPUを導入しているパソコンだと、メインメモリはそれなりの容量搭載されていると思います。
INPUT_WIDTH = 128
INPUT_HEIGHT = 128
GPU_ID = -1
BATCH_SIZE = 64
MAX_EPOCH = 20
#model.to_gpu(GPU_ID)

CPUとGPUメモリを合わせて利用 Unified Memory for CUDA

参考URL:

Unified Memoryとは、CPUとGPUで共通のメモリ空間(=GPUメモリ+CPUメモリ)を使う方法となります。
以下、エラーメッセージの例となります。