3
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NVIDIA DIGITSを使ったDeep Learning 画像分類モデルの作成

Last updated at Posted at 2018-09-19

#目的
前回構築したDIGITS環境を使って、画像を分類するモデルを作成する。
このページのDIGITSに関する部分を日本語で書いているだけです

こちらの画像の下段真ん中のカスタムモデルを作成するイメージです。
Qiita

#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を選択する。
ログイン画面になるのでユーザー名を適当に入力する。

image.png

以下項目を入力し、Createボタンを押してデータインポートを実行する。(約25分)

  • Training Images: /data/datasets/imagenet/12_classes
  • % for validation: 10
  • Group Name: ImageNet
  • Dataset Name: ImageNet-ILSVRC12-subset

image.png

image.png

画像分類モデルの作成

DIGITSのホーム画面に戻り、Modelsのタブページを開き、ImagesドロップダウンからClassificationを選択する。

image.png

以下項目を入力し、Createボタンを押してトレーニングを開始する。(約8時間)

  • Select Dataset: ImageNet-ILSVRC12-subset
  • Subtract Mean: Pixel
  • Standard Networks: GoogleNet
  • Group Name: ImageNet
  • Model Name: GoogleNet-ILSVRC12-subset

image.png
image.png

(補足)
以下のエラーメッセージが出る場合、GPUが古く最新のCUDAライブラリに対応していないことが考えられる。
digitsのバージョンを下げてCUDAライブラリのバージョンを下げるか、新しいGPUに交換する必要がある。

Check failed: error == cudaSuccess (48 vs. 0)  no kernel image is available for execution on the device

画像分類モデルのテスト

トレーニングの結果が以下のように表示される。

image.png

1つのエポックが終わると、好きな画像を入力して分類のテストを行うことができる。
試しに、/data/datasets/imagenet/ilsvrc12/n02127052/n02127052_1203.jpgでテストする。

image.png

結果、新しい分類モデルではcatが100%となった。
元のGoogleNet-1000モデルではLynxと判別されるため、新しく画像分類モデルが作成できていることがわかる。

image.png

カスタムモデルデータを出力する

組み込み機器であるJetsonで動作させるために、Download Modelを押してモデルデータを出力する。
JetsonからDIGITSにアクセスしてダウンロードするか、ホストPCにダウンロードしてSCPやUSBメモリ等で転送する。
ダウンロードしたモデルはtarコマンドで解凍しておくこと。

image.png

続き

#参考元
https://github.com/dusty-nv/jetson-inference#downloading-image-recognition-dataset

3
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?