3

私はカフェの使用に比較的慣れておらず、(後で)微調整できる最小限の実用的な例を作成しようとしています。MNIST データで caffe の例を使用するのに何の問題もありませんでした。image-net データ (ILSVRC12) をダウンロードし、caffe のツールを使用して、次を使用して lmdb データベースに変換しました。

$CAFFE_ROOT/build/install/bin/convert_imageset -shuffle -encoded=true top_level_data_dir/ fileNames.txt lmdb_name

エンコードされた (jpeg) 画像データを含む lmdb を作成します。これは、エンコードされた lmdb が約 64GB であるのに対し、エンコードされていない lmdb は約 240GB であるためです。

ネットを記述する私の .prototxt ファイルは最小限です (主に MNIST の例から借りた 1 組の内積レイヤーです。ここでは正確さを求めるのではなく、何かを機能させたいだけです)。

name: "example"
layer {
  name: "imagenet"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "train-lmdb"
    batch_size: 100
    backend: LMDB
  }
}
layer {
  name: "imagenet"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "test-lmdb"
    batch_size: 100
    backend: LMDB
  }
}
layer {
  name: "ip1"
  type: "InnerProduct"
  bottom: "data"
  top: "ip1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 1000
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}
layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 1000
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "ip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}

train-lmdb がエンコードされていない場合、この .prototxt ファイルは正常に機能します (精度は最悪ですが、caffe はクラッシュしません)。ただし、train-lmdb がエンコードされている場合、次のエラーが発生します。

data_transformer.cpp:239] Check failed: channels == img_channels (3 vs. 1)

質問: train-lmdb がエンコードされた画像であることを示す、.prototxt ファイルに設定する必要がある「フラグ」はありますか? (テスト データ レイヤー test-lmdb には、同じフラグを指定する必要がある可能性があります。)

ちょっとした調査:

グーグルをいじってみると、有望と思われる解決済みの問題が見つかりました。ただし、'force_encoded_color'を true に設定しても問題は解決しませんでした。

また、この回答は lmdb の作成 (具体的には、エンコードを有効にするための指示) に非常に役立ちましたが、画像がエンコードされていることを caffe が認識できるようにするために何をすべきかについては言及されていませんでした。

4

1 に答える 1

2

あなたが得たエラーメッセージ:

data_transformer.cpp:239] Check failed: channels == img_channels (3 vs. 1)

これは、caffe データ トランスフォーマーが 3 (つまり、カラー画像) の入力を期待しているが、1 (つまり、グレー スケール画像)channelsのみの画像を取得していることを意味します。img_channels

見るcaffe.protoと、パラメータを次の場所に設定する必要があるようですtransformation_param

layer {
  name: "imagenet"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    scale: 0.00390625
    force_color: true  ##  try this
  }
  data_param {
    source: "train-lmdb"
    batch_size: 100
    backend: LMDB
    force_encoded_color: true  ## cannot hurt...
  }
}
于 2016-08-11T13:38:25.917 に答える