サーチ…


画像分類タスクのための画像データセットを準備する

Caffeには、画像分類タスク(入力画像ごとに1つの整数ラベル)用に調整された組み込み入力レイヤがあります。この入力"Data"レイヤーは、 またはデータ構造上に構築されています。 "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"レイヤーもあります。このレイヤーでは、すべてのトレーニング/検証データを形式のファイルに保存する必要があります。
この例では、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ファイル内のデータの順序はシャッフルされますが、異なるファイル間のデータはインターリーブされません。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow