私はcaffeを使用して回帰を行っており、私のtest.txt
およびtrain.txt
ファイルは次のようになります。
/home/foo/caffe/data/finetune/flickr/3860781056.jpg 2.0
/home/foo/caffe/data/finetune/flickr/4559004485.jpg 3.6
/home/foo/caffe/data/finetune/flickr/3208038920.jpg 3.2
/home/foo/caffe/data/finetune/flickr/6170430622.jpg 4.0
/home/foo/caffe/data/finetune/flickr/7508671542.jpg 2.7272
私の問題は、読書中にフロートラベルを使用すると、カフェが2.0のようなフロートラベルを許可しないように見えることです。たとえば、'test.txt'
filecaffeはのみを認識します
合計1枚の画像
それは間違っています。
しかし、たとえばファイルの2.0を2に変更し、次の行を同じにすると、caffeは次のようになります。
合計2枚の画像
フロートラベルが問題の原因であることを意味します。
誰かがここで私を助けてくれますか、この問題を解決するために、私は間違いなく回帰にフロートラベルを使用する必要があります、それで誰かがこれの回避策または解決策について知っていますか?前もって感謝します。
編集 同様の問題に直面している人にとっては caffeを使用してCSVデータでLenetをトレーニングする が役立つかもしれません。 @Shaiに感謝します。
画像データセット入力レイヤー(lmdb
またはleveldb
バックエンドのいずれかを使用)を使用する場合、caffeは1つのintegerラベルのみをサポートします入力画像。
回帰を実行し、浮動小数点ラベルを使用する場合は、HDF5データレイヤーを試して使用する必要があります。たとえば この質問 を参照してください。
pythonでは、h5py
パッケージを使用してhdf5ファイルを作成できます。
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( (len(lines),1), 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
# for example
# transposed_img = img.transpose((2,0,1))[::-1,:,:] # RGB->BGR
X[i] = transposed_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
すべてのh5
ファイルとそれらをリストする対応するテストファイルを取得したら、HDF5入力レイヤーをtrain_val.prototxt
に追加できます。
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 }
}
説明:
「caffeは入力画像ごとに1つの整数ラベルのみをサポートする」と言うとき、leveldb/lmdbコンテナーが制限されているという意味ではなく、caffeのツール、具体的には convert_imageset
ツール。
詳しく調べてみると、caffeはタイプDatum
のデータをleveldb/lmdbに格納しているようで、このタイプの「label」プロパティは整数として定義されています( caffe.proto)を参照 )したがって、leveldb/lmdbへのcaffeインターフェースを使用する場合、画像ごとに1つのint32ラベルに制限されます。
Shaiの答え フロートラベルをHDF5形式で保存する方法についてはすでに説明しています。 LMDBが必要/優先される場合は、floatデータからLMDBを作成する方法のスニペットを次に示します( this githubコメントから採用):
import lmdb
import caffe
def scalars_to_lmdb(scalars, path_dst):
db = lmdb.open(path_dst, map_size=int(1e12))
with db.begin(write=True) as in_txn:
for idx, x in enumerate(scalars):
content_field = np.array([x])
# get shape (1,1,1)
content_field = np.expand_dims(content_field, axis=0)
content_field = np.expand_dims(content_field, axis=0)
content_field = content_field.astype(float)
dat = caffe.io.array_to_datum(content_field)
in_txn.put('{:0>10d}'.format(idx) dat.SerializeToString())
db.close()
結果を得るために、移調し、チャネルの順序を切り替え、floatではなくunsignedintを使用することになりました。 HDF5ファイルから画像を読み戻して、正しく表示されることを確認することをお勧めします。
まず、画像をunsignedintsとして読み取ります。
img = np.array(Image.open('images/' + image_name))
次に、チャネルの順序をRGBからBGRに変更します。
_img = img[:, :, ::-1]
_
最後に、高さx幅xチャンネルからチャンネルx高さx幅に切り替えます。
img = img.transpose((2, 0, 1))
形状を変更するだけで、画像がスクランブルされ、データが台無しになります。
画像を読み返すには:
_with h5py.File(h5_filename, 'r') as hf:
images_test = hf.get('images')
targets_test = hf.get('targets')
for i, img in enumerate(images_test):
print(targets_test[i])
from skimage.viewer import ImageViewer
viewer = ImageViewer(img.reshape(SIZE, SIZE, 3))
viewer.show()
_
自動運転車のタスクの2つのラベル(ステアリングとスピード)を処理するスクリプトを作成しました: https://Gist.github.com/crizCraig/aa46105d34349543582b177ae79f32f