Caffe 大量の画像を利用してCNNを学習する 1

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

チュートリアルを基に、CNNを学習させてみる。
まだおぼつかないため、とりあえず手順だけ。

前提

Ubuntu14.04 Anaconda(Python2)+Caffe(機械学習ライブラリ)をインストール

機械学習ライブラリCaffe で色々するための準備

手順

 

前処理

ホームディレクトリにsourceディレクトリを作成。
その中にtest_dataset、training_datasetディレクトリを作成し、training_datasetの中にとりあえず10枚のダンボー画像を保存した。(実際はもっと大量に保存する必要がある。)

mkdir ~/source
cd ~/source
mkdir test_dataset
mkdir training_dataset

$ ls training_dataset/
danbo001.jpg  danbo003.jpg  danbo005.jpg  danbo007.jpg  danbo009.jpg
danbo002.jpg  danbo004.jpg  danbo006.jpg  danbo008.jpg

 

データベース作成

sourceディレクトリにtest.txt、train.txtを作成し、「画像名 クラス」の順に記載。
(まだクラスがなんなのかよくわかっていないため、とりあえず0にしておいた。)

danbo001.jpg 0
danbo002.jpg 0
danbo003.jpg 0
danbo004.jpg 0
danbo005.jpg 0
danbo006.jpg 0
danbo007.jpg 0
danbo008.jpg 0
danbo009.jpg 0

保存した画像とtrain.txtに記載した内容を基に、データベースを作成する。

~/caffe/build/tools/convert_imageset ./training_dataset/ train.txt train_leveldb 1 lebeldb 256 256

 

平均画像の生成

保存した画像を基に、平均画像を生成する。

[/shell] cd ~/source
~/caffe/build/tools/compute_image_mean ./train_leveldb meanfile.binaryproto

 

CNNのレイヤ構成を表したパラメータファイルを作る

sourceディレクトリにimagenet_train_val.prototxtというファイルを作成し、こちらからコピーして、以下のように編集する。

imagenet_train_val.prototxt

    name: "CaffeNet"

    layers {
      name: "data"
      type: DATA
      top: "data"
      top: "label"
      data_param {
        source: "/home/ubuntu/source/train_leveldb"
        mean_file: "/home/ubuntu/source/meanfile.binaryproto"
        batch_size: 32
        crop_size: 227
        mirror: true
        backend: LMDB
      }
      include: { phase: TRAIN }
    }
    layers {
      name: "data"
      type: DATA
      top: "data"
      top: "label"
      data_param {
        source: "/home/ubuntu/source/train_leveldb"
        mean_file: "/home/ubuntu/source/meanfile.binaryproto"
        batch_size: 32
        crop_size: 227
        mirror: false
        backend: LMDB
      }
      include: { phase: TEST }
    }

次に、imagenet_solver.prototxtというファイルを作成し、こちらからコピーして以下のように編集。

imagenet_solver.prototxt

    train_net: "/home/ubuntu/source/imagenet_train_val.prototxt"
    test_net: "/home/ubuntu/source/imagenet_train_val.prototxt"
    test_iter: 1000
    test_interval: 1000
    base_lr: 0.01
    lr_policy: "step"
    gamma: 0.1
    stepsize: 100000
    display: 20
    max_iter: 450000
    momentum: 0.9
    weight_decay: 0.0005
    snapshot: 10000
    snapshot_prefix: "caffe_imagenet_train"
    solver_mode: CPU

以下コマンドで、学習させようとしたところ、以下の様なエラーが発生。

$  ~/caffe/build/tools/caffe train --solver=/home/ubuntu/source/imagenet_solver.prototxt

F0813 08:13:16.135082 26925 db_leveldb.cpp:15] Check failed: status.ok() Failed to open leveldb /home/ubuntu/source/train_leveldb
Invalid argument: /home/ubuntu/source/train_leveldb: does not exist (create_if_missing is false)
*** Check failure stack trace: ***
    @     0x7f2a61edbdaa  (unknown)
    @     0x7f2a61edbce4  (unknown)
    @     0x7f2a61edb6e6  (unknown)
    @     0x7f2a61ede687  (unknown)
    @     0x7f2a622fd60a  caffe::db::LevelDB::Open()
    @     0x7f2a62280506  caffe::DataLayer<>::DataLayerSetUp()
    @     0x7f2a622430f9  caffe::BasePrefetchingDataLayer<>::LayerSetUp()
    @     0x7f2a62312122  caffe::Net<>::Init()
    @     0x7f2a62313d2e  caffe::Net<>::Net()
    @     0x7f2a62320580  caffe::Solver<>::InitTrainNet()
    @     0x7f2a6232151e  caffe::Solver<>::Init()
    @     0x7f2a623216b6  caffe::Solver<>::Solver()
    @           0x40cc88  caffe::GetSolver<>()
    @           0x406893  train()
    @           0x404e41  main
    @     0x7f2a613edec5  (unknown)
    @           0x4053ed  (unknown)
    @              (nil)  (unknown)
Aborted (core dumped)

imagenet_train_val.prototxtにbackendを定義する必要があるため、imagenet_train_val.prototxtのdata_paramに以下を追記。

    data_param {
        ・・・・・・・・
      backend: LMDB // 末尾に追記
    }

再度以下のコマンドを実行。

 ~/caffe/build/tools/caffe train --solver=/home/ubuntu/source/imagenet_solver.prototxt

とここまで実行したところ、執筆段階で丸々2日ほどプログラムが動き続けていて、終わる気配がない。
やはりCPUモードだと厳しいのだろうか、、、

次回に続く。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です