#目的
前回構築したDIGITS環境を使って、画像を分類するモデルを作成する。
※このページのDIGITSに関する部分を日本語で書いているだけです
こちらの画像の下段真ん中のカスタムモデルを作成するイメージです。
#PC環境
- 前回構築したDIGITS環境を参照
-
$nvidia-docker ps -a
でコンテナの状態を確認し、digitsコンテナを実行していること。再起動などの影響で停止している場合は$nvidia-docker start digits
でコンテナを起動する。
#画像認識データセットの入手
データセットはILSVRC12を利用する。事前にディスク容量が120GB以上あることを確認すること。
今回はDIGITSをdockerコンテナで実行しているため、docker run時に'-v'で指定した共有フォルダ配下にデータセットを作成する必要がある。まずは、フォルダを作成する。※usernameは適宜読み替える
$ mkdir -p /home/username/data/datasets/imagenet/ilsvrc12
$ cd /home/username/data/datasets/imagenet/ilsvrc12
以下のコマンドを実行する。(100GB程度のデータをダウンロードするので注意)
$ wget --no-check-certificate https://nvidia.box.com/shared/static/gzr5iewf5aouhc5exhp3higw6lzhcysj.gz -O ilsvrc12_urls.tar.gz
$ tar -xzvf ilsvrc12_urls.tar.gz
$ rm ilsvrc12_urls.tar.gz
$ wget https://rawgit.com/dusty-nv/jetson-inference/master/tools/imagenet-download.py
$ python imagenet-download.py ilsvrc12_urls.txt . --jobs 100 --retry 3 --sleep 0
1000個のフォルダに画像がダウンロードされる(ILSVRC12の各クラスに1つ)。
フォルダ名はクラスのsynset IDであり、クラス名と対応している。こちらで対応を確認できる。
コンテナ内部で共有できているか確認する。以下のコマンドでコンテナ内部に接続し、確認する。
コンテナに接続
$ nvidia-docker exec -it digits bash
表示確認
/workspace# ls /data/datasets/imagenet/ilsvrc12/
/workspace# exit
#オブジェクトクラスのカスタマイズ
初期状態では1000個のフォルダがあり、DIGITSでは各フォルダ名のクラスに分類される。今回は12個のクラスに分類するようにカスタマイズするため、ディレクトリ構造を生成するスクリプトを実行する。
以下のスクリプトで、上記の1000個のフォルダに対するシンボリックリンクを貼るディレクトリが生成される。
コンテナ内部のパスでリンクを貼るため、ホスト側ではリンクが正しく動作しないが問題ない。
$ cd /home/username/data/datasets/imagenet
$ wget https://rawgit.com/dusty-nv/jetson-inference/master/tools/imagenet-subset.sh
$ chmod +x imagenet-subset.sh
$ mkdir 12_classes
$ ./imagenet-subset.sh /data/datasets/imagenet/ilsvrc12 12_classes
リンクが貼れているかどうかは以下で確認できる。
コンテナに接続
$ nvidia-docker exec -it digits bash
表示確認
/workspace# ls -l /data/datasets/imagenet/12_classes/ball
/workspace# exit
#データセットをDIGITSにインポートする
ブラウザで http://localhost:8888 にアクセスしてDIGITSページを開く。
Datasetsのタブページを開き、ImagesドロップダウンからClassificationを選択する。
ログイン画面になるのでユーザー名を適当に入力する。
以下項目を入力し、Createボタンを押してデータインポートを実行する。(約25分)
- Training Images:
/data/datasets/imagenet/12_classes
- % for validation:
10
- Group Name:
ImageNet
- Dataset Name:
ImageNet-ILSVRC12-subset
画像分類モデルの作成
DIGITSのホーム画面に戻り、Modelsのタブページを開き、ImagesドロップダウンからClassificationを選択する。
以下項目を入力し、Createボタンを押してトレーニングを開始する。(約8時間)
- Select Dataset:
ImageNet-ILSVRC12-subset
- Subtract Mean:
Pixel
- Standard Networks:
GoogleNet
- Group Name:
ImageNet
- Model Name:
GoogleNet-ILSVRC12-subset
(補足)
以下のエラーメッセージが出る場合、GPUが古く最新のCUDAライブラリに対応していないことが考えられる。
digitsのバージョンを下げてCUDAライブラリのバージョンを下げるか、新しいGPUに交換する必要がある。
Check failed: error == cudaSuccess (48 vs. 0) no kernel image is available for execution on the device
画像分類モデルのテスト
トレーニングの結果が以下のように表示される。
1つのエポックが終わると、好きな画像を入力して分類のテストを行うことができる。
試しに、/data/datasets/imagenet/ilsvrc12/n02127052/n02127052_1203.jpg
でテストする。
結果、新しい分類モデルではcat
が100%となった。
元のGoogleNet-1000モデルではLynx
と判別されるため、新しく画像分類モデルが作成できていることがわかる。
カスタムモデルデータを出力する
組み込み機器であるJetsonで動作させるために、Download Model
を押してモデルデータを出力する。
JetsonからDIGITSにアクセスしてダウンロードするか、ホストPCにダウンロードしてSCPやUSBメモリ等で転送する。
ダウンロードしたモデルはtar
コマンドで解凍しておくこと。
続き
#参考元
https://github.com/dusty-nv/jetson-inference#downloading-image-recognition-dataset