web-dev-qa-db-ja.com

異なるサイズの画像をトレーニングするにはどうすればよいですか?

画像を分類するモデルを訓練しようとしています。私が抱えている問題は、サイズが異なることです。これらの画像をサイズ変更せずにトレーニングする可能性はありますか。

68
Asif Mohammed

あなたが話しているアーキテクチャを言っていません。あなたが画像を分類したいと言ったので、私はそれがAlexNet、GoogLeNetなどのように部分的に畳み込み、部分的に完全に接続されたネットワークであると仮定しています。一般的に、あなたの質問に対する答えはあなたが作業しているネットワークタイプによって異なります.

たとえば、ネットワークに畳み込みユニットのみが含まれている場合-つまり、完全に接続されたレイヤーが含まれていない場合-canは入力画像に対して不変サイズ。このようなネットワークcouldは入力画像を処理し、別の画像を返します(「畳み込み」)。もちろん、何らかの方法で損失を決定する必要があるため、出力が期待するものと一致することを確認する必要があります。

ただし、完全に接続されたユニットを使用している場合は、問題が発生します。ここでは、ネットワークで使用する必要がある学習済みの重みの数が決まっているため、入力を変えると、重みの数も変わる必要がありますが、これは不可能です。

それがあなたの問題なら、ここにあなたができることがいくつかあります:

  • 画像を押しつぶしてもかまいません。ネットワークはとにかくコンテンツの意味を理解することを学ぶかもしれません。とにかく、スケールとパースペクティブはコンテンツにとって何か意味がありますか?
  • 画像を特定のサイズに中央トリミングします。データが失われるのではないかと心配する場合は、元の画像が正しいサイズのNの異なる画像に分割されるように、複数のクロップを行い、それらを使用して入力データを増やします。
  • 正方形のサイズになるように無地の画像を埋め込み、サイズを変更します。
  • その組み合わせを行います。

ネットワークがそのようなパディングされた境界線を含む画像にバイアスされる可能性があるため(読み取り:可能性が高い)、パディングオプションはネットワークの予測に追加のエラーソースを導入する可能性があります。いくつかのアイデアが必要な場合は、TensorFlowドキュメントの Images セクションをご覧ください。resize_image_with_crop_or_padのような部分が大きな作業を不要にします。

つぶすことを気にしないで、 here's は有名なInceptionネットワークの前処理パイプラインの一部です:

# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.

# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
    distorted_image,
    lambda x, method: tf.image.resize_images(x, [height, width], method=method),
    num_cases=num_resize_cases)

彼らはそれを完全に認識していて、とにかくそれをします。

あなたがどこまで行きたいか、どこに行く必要があるかに応じて、実際には紙があります ここディープコンボリューションネットワークの視覚認識のための空間ピラミッドプーリング任意のサイズの入力を非常に特別な方法で処理して処理します。

125
sunside

空間ピラミッドプーリングレイヤーを作成してみてください。次に、FCレイヤーが常に一定の次元ベクトルを入力として取得するように、最後の畳み込みレイヤーの後に配置します。トレーニング中、1エポックの特定の画像サイズを使用して、データセット全体から画像をトレーニングします。次に、次のエポックのために、別の画像サイズに切り替えてトレーニングを続けます。

8