📖

AI環境の設定手順 Part_II : 独自データの学習 (Jetson Xavier NX編)

2022/08/18に公開

0. 記事の内容

群馬県産業技術センターではエッジコンピュータを用いたAI技術による物体検出の検討を行い成果を報告書にまとめ、公開 [pdfファイル: 2,594kB] しています。そして、さらにその内容を広く県内企業の方にも活用できるようにソフトウェアの設定をはじめとした環境設定から動作確認までの一連の操作を手順書としてまとめました。

ここでは、その手順書の概要を示し、より具体的な手順書の電子ファイルにつきましては群馬産業技術センター デジタルソリューションラボ に問い合わせ [外部リンク] 頂ければと思います。

1. 目的

本手順書のPart Ⅰでは、「AI環境の設定手順書 Part Ⅰ : 物体検出入門」として、近年、成果が活用されているAI技術をNVIDIA社の高機能なエッジコンピュータJetson Xavier NXに物体検出として高い検出率をもつYOLO v3を導入し、PythonプログラムによりUSBに接続されたカメラからの映像の取り込みと物体検出の手順を示しました。

このPart Ⅱでは、Part Ⅰに続き、独自の画像データによりYOLO v3での学習済みモデルを構成し、企業の現場で実際にDeep Learningを活用できる環境を構築する手順を示し、中小企業へのAI技術の導入やAI技術を利用した製品の開発など、より具体的に企業の技術力の高度化に寄与することを目的としています。

2. 適用範囲

本手順書で使用する主要な機器等はPart Ⅰのものを引続き利用し、新たに追加するものはありません。但し、microSD Cardのクローンを作成する場合は、リーダ/ライタが2個必要となりますが、クローンを作成しなくとも本手順書の確認は可能です。以下にPart Ⅰで利用した機器等の構成を示します。

エッジコンピュータ    : NVIDIAJetson Xavier NX Developer Kit
基本ソフト(OS)      : JetPack JP4.4 (Ubuntu 18.04 LTSベース)
プログラミング       : Python 3.6.9 および Spyder 3
フレームワーク       : Tensorflow 1.15.4, Keras 2.1.1
物体検出AIモデル   : Keras版 YOLO v3
USBカメラ          : iDS社 UI-3280CP-C-HQ R2
電子部品          : ブレッドボード、LED、スイッチ、線材等

(参考) 以降の手順の確認ではPart Ⅱ用に別途、microSDカードを準備することを推奨します。microSDカードのクローンの作成については手順書の付録Aに示します。
また、企業等で利用する場合の独自の画像データの収集にはPart Ⅰの「6章 USB Camaraの設定」で示したUSBカメラによる静止画や動画の保存などを利用することができます。

3. 教師画像ファイルの準備

A. MVTec-ad

Deep Learningなどで利用できる画像は、インターネット等を利用して様々なものを取得すことができますが、本手順書ではMVTec Software社のホームページに公開されている非商用の目的で利用可能な工業製品の外観画像を集めたデータを利用します。

A-1. 画像ファイルのダウンロード

MVTec Software社は画像ファイルをFTPサーバーにより提供しています。
ここでは、正常なネジや不良のネジの画像ファイルのまとめられたものをダウンロードします。
Windows 10に実装されているWebブラウザのInternet Explorerによりダウンロードを行います。Microsoft Edgeを利用する場合は、Internet Explorer モードに設定する必要があります。Webブラウザでダウンロードができない場合は、匿名FTPなどによりダウンロードすることになります。

A-2. 圧縮ファイルの解凍

ダウンロードしたファイルは圧縮されていますので、解凍やパーミッションの設定など、利用するために必要な手順を示します。

B. ファイル名の変更

解凍したファイルは、正常なネジや不良のネジの画像ファイルが種類ごとにフォルダに分かれて保存されています。また、各フォルダのファイルは000から続く連番でファイル名が設定されているため、画像を1つのフォルダにまとめるとファイル名が重複してしまいます。本手順書では、正常なものと5種類の不良なネジの画像を教師画像として学習を行うため、事前に各フォルダのファイルを区別できるようにファイル名を変更する手順を示します。

B-1. 変更プログラム

ターミナルソフトからコマンド入力によりファイル名を変更するPythonプログラムの作成手順について示します。具体的には指定された拡張子のファイルの先頭に指定された文字列を設定するものを作成します。


ファイル名の変更プログラム (一部分)

B-2. ファイルの取りまとめ

ファイル名の修正された正常なものと5種類の不良なネジの画像を各20個ずつ取り出し、合計120個の画像ファイルを一つのフォルダにまとめて、YOLO v3での学習用の画像を準備します。


教師画像

C. ファイルサイズと形式の変更

YOLO v3での学習に用いる画像ファイルは、縦横のサイズが32 pixelの倍数の正方形のJPEG画像です。一方、MVTec Software社よりダウンロードした画像ファイルは、1024×1024 pixelのPNG画像ですので、サイズとファイル形式を変換する必要があります。

C-1. プログラムのダウンロード

本手順書ではインターネットにアップロードされているPythonのプログラムを利用して変換を行います。また、そのサイトには、以後の手順で利用する他のプログラムもあるため、表示のフォルダ全体をダウンロードと解凍の手順を示します。

C-2. 画像ファイルの変換

ダウンロードしたプログラムを実行してフォルダから画像ファイルを読込み、別のフォルダに指定されたサイズのJPEG形式のファイルに変換して保存する手順を示します。
ここでは、256x256 pixelのJPEG画像のファイルに変換します。


画像の変換

4. 教師画像ファイルへのラベル付け

収集した画像を教師画像としてYOLO v3で学習させるためには、画像ファイル内の対象物の位置とそのラベルの割当てを行う必要があります。
あるデータに対して関連する情報(メタデータ)を注釈として付与することをアノテーションと言います。ここではアノテーションツールとしてMicrosoft社が開発した無料でオープンソースの画像注釈およびラベリング用のツールであるVoTT(Visual Object Tagging Tool)を利用します。

A. VoTTのインストール

A-1. 準備

アノテーションツールVoTTの実行には、Node.js( >= 10.x )とnpmを必要とします。但し、npmはNode.jsのインストールと同時にインストールされるため、ここではNode.jsのインストールの手順を示します。

A-2. インストールとコンパイル

VoTTをGitHubから入手し、インストールしてVoTTの実行のできる環境の設定手順を示します。

A-3. 起動プログラムの最適化

コンパイルされたVoTTプログラムを端末からコマンド入力により起動すると、Web Browserが起動されてWeb版のVoTTと少し時間が経過してElectron版のVoTTが現れます。
Web版はローカルのファイルの扱いができないため、本手順書ではElectron版を用いて画像ファイルへのラベル付けを行います。


VoTTの起動

B. 作業フォルダ

画像ファイルの準備等を含め、フォルダの階層が複雑になっていますので、VoTTによるアノテーションの準備としてアノテーションの結果等を保存するフォルダを作成を通じて、全体のフォルダの階層を概観します。


フォルダ階層

C. アノテーション

C-1. VoTTの設定

Electron版のVoTTを起動して、アノテーションを行う前の準備として必要な設定の手順を示します。
設定は、VoTTの起動画面の左側にあるアイコンの内容に沿って順番に行います。


VoTT Electron版


VoTT Setting

C-2. アノテーションの実行

(1) タグの設定

VoTTに取込まれた画像に対して、割当てるタグ名の設定をTags Editorにより行う方法を示します。
本手順書では3章でMVTec-adにより取得したネジの良品と5種類の不良品の画像を扱いますので、6種類のタグを設定します。

(2) アノテーション

画像内の物体の位置とタグの対応を矩形の描画ツールを利用して行う手順を示します。
実際には、教師画像として設定していない画像とあまりにもかけ離れた画像は検出できませんので、各タグ名に対して多くのパターンの画像を準備する必要があます。


タグ付け


検出位置とタグ

C-3. 結果の保存と出力

アノテーションの結果をYOLO v3で学習するのに必要なデータを得るために結果をExportする必要があります。


結果の出力先

5. Keras-yolo3での学習

A. Kerasのアップデート

VoTTによりアノテーションを行ったデータに対し、YOLO v3で利用できるように環境を設定する手順を示します。

A-1. kerasのバージョンアップ

PartⅠで用いたkerasは2.1.1で古いバージョンでのため、kerasのバージョンを2.1.5に変更して、学習を行える環境に設定する手順を示します。

A-2. 環境の確認

Kerasのバージョンアップ後、PartⅠで確認した画像と動画での物体検出が正しく動作するか確認します。


画像の検出


動画の検出

B. 学習に必要なファイルの準備

B-1. 作業フォルダ

VoTTによりアノテーションを行った結果の出力をkeras-yolo3で利用できるように必要なファイルのコピーと設定の手順を示します。


YOLO 学習用フォルダ

B-2. 学習用ファイル

keras-yolo3で学習するときに必要なtrain.txt、test.txt、val.txtのファイルを作成します。ここでは、3章C-1節でダウンロードしたファイルを用いてtrain.txt、test.txt、val.txtのファイルの作成手順を示します。
また、train.txtに記述の画像ファイルは学習に用いられる教師画像で、そのモデルに対しval.txtに記述の画像ファイルで検証を行います。test.txtは学習に用いないテスト用の画像ファイルです。但し、YOLO V3ではtrain.txtの画像ファイルのみを利用し、自動で交差検証を行うために学習用と検証用の画像ファイルを分割しているようです。

B-3. VoTTのアノテーションファイルの変換

B-2節で出力されたtrain.txt、test.txt、val.txtをkeras-yolo3で利用する学習用ファイルに変換する手順を示します。
変換プログラムは3章C-1節でダウンロードしたものを利用し、アノテーションで設定したタグ名を設定します。

classes = ["Good", "Front", "Head", "Neck", "Side", "Top"]

(注意) 変換されて出力された2007_*.txtファイルの内容は、アノテーションで設定したJPEGファイルのファイル名と設定した矩形の座標とタグ名の番号等です。そのため、学習する前にこれらのフォルダやファイルの移動、名前の変更等を行うと学習時にエラーが発生するので注意が必要です。


クラス名の設定

C. 学習の実行

C-1. train.pyの修正

B-3節で出力されたファイルを用いて学習を行い、keras-yolo3で利用可能な学習済みモデルのファイル(.h5)を作成する手順を示します。
学習プログラムは3章C-1節でダウンロードしたものを用い、以下のように設定を内容修正します。

annotation_path	  : voc_annotation.pyで出力された2007_train.txtを設定する。
log_dir	          : 結果のファイル(.h5)の出力先のフォルダを設定する。
classes_path	  : voc_annotation.pyで出力されたvoc_classes.txtを設定する。
anchors_path	  : デフォルトで設定のyolo_anchors.txtを確認する。
batch_size = 4	  : batch_sizeは、一度に実行するデータ数の設定です。
	              ハードウェアのメモリ容量が少ないとプログラムの実行中にエラーが発生するため、
		      状況により1684などに調整する必要があります。

また、学習では事前に学習を行ったモデルのweightsファイルが必要となります。
ここではweightsファイルはA-2節で物体検出の確認で利用したものを利用します。

C-2. 実行

C-1節で修正したプログラムを実行する手順を示します。
本手順書では、batchサイズを4として、1回の計算につき519個の画像ファイルで学習を行い、57個の画像ファイルで評価を行っています。そして、この学習と評価の画像ファイルの数の割合を保って、Stage 1(予備学習)では、1から50回を行い、Stage 2(全学習)では、51から100回の計算で交差検証が繰り返されます。このとき、毎回の学習によるlossと評価によるval_lossの値が小さくなり学習が進んで行きます。そして、learning rateが設定値以下となるか、100回実施したところで終了します。


YOLO 学習

Jetson Xavier NX(15W 6Core)での概略の学習時間は3時間程度です。

150回     : 47sec/Epoch      =>4051100回   : 170sec/Epoch     =>142

結果は設定のフォルダに、次の3種類の学習済みモデルのファイル(.h5)が出力されます。

ep***-loss*-val_loss*.h5   : 繰返しでベストなlossとなったときのもの
train_weights_stage_1.h5Stage_1(50回の繰返し)の終了時のもの
train_weights_final.h5100回の繰返しの終了時の最終のもの

6. 学習済みモデルの動作確認

A. 学習環境での実行

5章で学習したkeras-yolo3の学習済みモデルを利用して、物体検出の確認を行います。

A-1. 評価画像、教師画像

学習済みモデルによるkeras-yolo3の物体検出を行う画像ファイルのサイズは教師画像と同じ256×256 pixelでなくてもよいが、JPEG形式のファイルである必要があります。

A-2. yolo.py の修正

keras-yolo3での物体検出は5章A-2節で確認した手順と同様に行うことができます。
但し、以下の設定内容を学習済みモデルのファイルを設定ファイルyolo.pyに反映する必要があります。

"model_path"学習済みモデルの結果ファイル(.h5)を設定する
"anchors_path"      : デフォルトで設定のyolo_anchors.txtを確認する
"classes_path"      : voc_annotation.pyで出力されたvoc_classes.txtを設定する
"model_image_size"  : 教師画像のファイルのpixelの値(256, 256)を設定する

A-3. 物体検出の実行

物体検出を5章A-2節の手順と同様に行います。
画像ファイルの入力要求に対しては、フォルダ名を含めて設定します。
物体検出では、タグ名とその確率が「Terminal」と検出画面に表示されます。本手順書の場合、Front、Side、Topなどの区別が難しいようです。


YOLO 物体検出

また、MP4形式の動画ファイルによる物体検出も同様に実行できます。

B. 別の環境での実行

5章で学習したkeras-yolo3の学習済みモデルを利用して、別のフォルダや別のコンピュータ、ボードマイコン等のkeras-yolo3の環境で物体検出を行うときの手順を示します。
但し、別の環境でもkeras-yolo3の実行が可能なことを事前に確認しておく必要があります。

B-1. 必要なファイル

A節でkeras-yolo3の学習済みモデルを利用して物体検出を行ったときの設定から、実行に必要なファイルはyolo.pyで設定を行った以下のファイルであることが分かります。

trained_weights_final.h5   : 学習済みファイル(.h5)
voc_classes.txt            : タグ名の記載されたファイル

これらのファイルを別の環境の適切なフォルダにコピーします。

B-2. yolo_video.py の修正

B-1節でコピーしたファイルの場所に従ってA-2節と同様にpolo.pyの修正を行った後、polo_video.pyを実行することにより、学習済みモデルを用いたkeras-yolo3の物体検出を行うことができます。

7. まとめ

本手順書では、Part Ⅰの事前に学習されたモデルを用いた物体検出ソフトウェアのYOLO v3の検出能力の確認に続いて、ユーザが独自に準備した画像に対してもYOLO v3が適用できるように学習モデルを構成する手順を示しました。

具体的には各20枚の画像で6種類(良品1種、不良品5種)のネジの状態の画像にタグ名を設定して学習を行い、物体検出を行う手順を示しました。

すなわち、keras-yolo3で学習を行うときに必要な画像ファイルへのタグ名の設定、および、物体検出を行うときに必要なファイルと設定を明らかにしました。これにより、画像の準備、学習、物体検出等を行うハードウェア等が異なる場合でも作業を分担して行うことができ、作業性を向上させることが可能となります。

また、企業で実際に物体検出を利用する場合は、不良品の画像を多く集めることが難しい場合があることも予想されます。場合によっては、事前に不良品の画像を収集できないことも考えられます。そのような場合は、物体検出により不良品を検出するのではなく、良品と判定できなかったものを不良品としてPart Ⅰで示したLEDの点灯と組合わせるなど、本手順書の内容を利用者の状況に合ったシステムの構築に発展させて頂くことを期待致します。

付録 A. 開発環境のクローン

手順書Part Ⅰで用いた開発環境の設定されたmicroSD Cardのクローンの作成手順を示します。
アプリケーションソフトウェアとしては、Part Ⅰの「3章 エッジコンピュータの設定」でJetPackのイメージをmicroSD Cardに書込むときに用いましたBalenaEtcherソフトを利用します。

クローンの作成は、JetPackを書込む場合と書込み元が異なるだけで同様の手順となりますが、新たにmicroSD Cardとリーダ/ライタがそれぞれ追加で1個ずつ必要となります。

(注意) BalenaEtcherソフトは、microSD Cardのイメージをそのまま、クローン先のmicroSD Cardに書込むため、クローン先のmicroSD Cardの容量が小さいときは書込みができません。特に、利用していない領域等も含めての全体の容量に対してであるため、同じ容量、同じメーカー等のmicroSD Cardでも書込みのできない場合があります。可能ならば、同一のmicroSD Cardを用いることを推奨します。


Clone Drive


Source Drive


Target Drive

microSD Cardにシステムが書き込まれたときに、USBドライブとして複数のドライブが認識されるのは、Part Ⅰの3章の場合と同様です。


USB Drive


Discussion