caffe
トレーニングのためのデータ準備
サーチ…
画像分類タスクのための画像データセットを準備する
Caffeには、画像分類タスク(入力画像ごとに1つの整数ラベル)用に調整された組み込み入力レイヤがあります。この入力"Data"レイヤーは、 lmdbまたはleveldbデータ構造上に構築されています。 "Data"層を使用するためには、すべてのトレーニングデータを用いてデータ構造を構築しなければならない。
Caffeのconvert_imagesetクイックガイド
ビルド
まず、あなたがしなければならないことは、カフェやカフェのツールを作ることです(convert_imagesetはこれらのツールの1つです)。 カフェをインストールした後と
make 、それはあなたが走ったことを確認しますINGのmake toolsだけでなく。 $CAFFE_ROOT/build/toolsバイナリファイルconvert_imagesetが作成されていることを確認し$CAFFE_ROOT/build/tools 。 データを準備する
画像:すべての画像をフォルダに入れる(ここで/path/to/jpegs/と呼ぶ)。 ラベル:入力イメージ<path / to / file>ごとにテキストファイル(例:
/path/to/labels/train.txt )を作成します。例えば: img_0000.jpeg 1
img_0001.jpeg 0
img_0002.jpeg 0
この例では、第1の画像は1とラベル付けされ、他の2つは0とラベル付けされる。
データセットを変換する
シェルでバイナリを実行する~$ GLOG_logtostderr=1 $CAFFE_ROOT/build/tools/convert_imageset \
--resize_height=200 --resize_width=200 --shuffle \
/path/to/jpegs/ \
/path/to/labels/train.txt \
/path/to/lmdb/train_lmdb
説明されたコマンドライン:
- 呼び出し前に
GLOG_logtostderrフラグが1 に設定されているconvert_imagesetは、ログメッセージをstderrにリダイレクトするロギングメカニズムを示しconvert_imageset。 -
--resize_heightと--resize_widthすべての入力画像を同じサイズ200x200ます。 -
--shuffleランダムに画像の順序を変更し、順序を保存しません/path/to/labels/train.txtファイル。 - 以下は、imagesフォルダへのパス、ラベルのテキストファイル、および出力名です。
convert_imagesetを呼び出す前に出力名が存在してはならないことに注意してください。そうしないと、恐ろしいエラーメッセージが表示されます。
役に立つかもしれない他のフラグ:
-
--backend-lmdbデータセットまたはlevelDBいずれかを選択できます。 -
--gray- すべての画像をグレースケールに変換します。 -
--encodedと--encoded_type- イメージデータをエンコードされた(jpg / png)圧縮形式でデータベースに保存します。 -
--help- いくつかのヘルプを表示し、 Flags from tools / convert_imageset.cppにある関連するすべてのフラグを参照してください。
convert_imageset使用例については、 $CAFFE_ROOT/examples/imagenet/convert_imagenet.shを参照してください。
詳細については、 このスレッドを参照してください。
任意のデータをHDF5形式で準備する
画像分類データセットに加えて、Caffeには任意の入力用の"HDF5Data"レイヤーもあります。このレイヤーでは、すべてのトレーニング/検証データをhdf5形式のファイルに保存する必要があります。
この例では、python h5pyモジュールを使用してhdf5ファイルを構築する方法と、caffe "HDF5Data"層を設定してそのファイルを読み取る方法を示します。
hdf5バイナリファイルをビルドする
あなたがテキストファイル'train.txt'をイメージファイル名と回帰ターゲットとして使用する単一の浮動小数点数を持つ各行と仮定します。 import h5py, os
import caffe
import numpy as np
SIZE = 224 # fixed size to all images
with open( 'train.txt', 'r' ) as T :
lines = T.readlines()
# If you do not have enough memory split data into
# multiple batches and generate multiple separate h5 files
X = np.zeros( (len(lines), 3, SIZE, SIZE), dtype='f4' )
y = np.zeros( (1,len(lines)), dtype='f4' )
for i,l in enumerate(lines):
sp = l.split(' ')
img = caffe.io.load_image( sp[0] )
img = caffe.io.resize( img, (SIZE, SIZE, 3) ) # resize to fixed size
# you may apply other input transformations here...
# Note that the transformation should take img from size-by-size-by-3 and transpose it to 3-by-size-by-size
X[i] = img
y[i] = float(sp[1])
with h5py.File('train.h5','w') as H:
H.create_dataset( 'X', data=X ) # note the name X given to the dataset!
H.create_dataset( 'y', data=y ) # note the name y given to the dataset!
with open('train_h5_list.txt','w') as L:
L.write( 'train.h5' ) # list all h5 files you are going to use
"HDF5Data"レイヤーの設定
すべてのh5ファイルとそれに対応するテストファイルがリストされたら、 train_val.prototxt HDF5入力レイヤーを追加できます: layer {
type: "HDF5Data"
top: "X" # same name as given in create_dataset!
top: "y"
hdf5_data_param {
source: "train_h5_list.txt" # do not give the h5 files directly, but the list.
batch_size: 32
}
include { phase:TRAIN }
}
上記のように、HDF5ファイルのリストをCaffeに渡します。現在のバージョンでは、1つのHDF5データファイルのサイズが2GBに制限されているためです。トレーニングデータが2GBを超える場合は、別々のファイルに分割する必要があります。
1つのHDF5データファイルが2GBを超えると、次のようなエラーメッセージが表示されます。
Check failed: shape[i] <= 2147483647 / count_ (100 vs. 71) blob size exceeds INT_MAX
データの総量が2GB未満の場合、データを別々のファイルに分割する必要がありますか?
Caffeのソースコードのコメントによれば、1つのファイルはより良いものになり、
shuffle == trueの場合、HDF5ファイルの順序はシャッフルされ、任意のHDF5ファイル内のデータの順序はシャッフルされますが、異なるファイル間のデータはインターリーブされません。