可変サイズの画像を畳み込みニューラルネットワークへの入力として与えることは可能ですか?


17

オブジェクト検出用の畳み込みニューラルネットワークへの入力として、可変サイズの画像を提供できますか?可能であれば、どうすればそれを実行できますか?


しかし、画像をトリミングしようとすると、画像の一部が失われ、サイズを変更しようとすると、画像の鮮明さが失われます。画像の鮮明さが主な考慮事項である場合、固有のネットワークプロパティを使用するのが最適であることを意味しますか?

回答:


9

それを行うにはいくつかの方法があります。これらのほとんどは、StackOverflow、Quora、およびその他のコンテンツWebサイトに関する多くの投稿ですでに取り上げられています。

要約すると、リストされているテクニックのほとんどは、2つのクラスのソリューションにグループ化できます。

  1. 変革
  2. 固有のネットワークプロパティ

変換では、次のようなテクニックを調べることができます

  • 言及されたすべてのテクニックの中で最も簡単なResize
  • 切り抜き、スライディングウィンドウまたは情報損失のある1回限りの切り抜きとして実行できます。

ネットワークを構築するレイヤーの動作により、入力のサイズに影響されない固有の特性を持つネットワークを調べることもできます。この例は、

  • カーネルとステップサイズが記述されると、各レイヤーでの畳み込みは、対応する入力に従って適切な次元出力を生成できるため、完全畳み込みネットワーク(FCN)は入力サイズにまったく制限がありません。

  • 空間ピラミッドプーリング(SPP)、FCNには完全に接続された高密度レイヤーがないため、画像サイズにとらわれませんが、入力変換を考慮せずに高密度レイヤーを使用したい場合は、レイヤーを説明する興味深い論文がありますディープラーニングネットワーク。

参照:

  1. https://www.quora.com/How-are-variably-shaped-and-sized-images-given-inputs-to-convoluted-neural-networks
  2. /ai/2008/how-can-neural-networks-deal-with-varying-input-sizes
  3. https://discuss.pytorch.org/t/how-to-create-convnet-for-variable-size-input-dimension-images/1906

PSいくつかのテクニックを引用して見逃したかもしれません。これが完全なリストであるとは主張しません。


1
これは理論的には問題ないように見えますが、Tensorflowでは機能しません。誰かがそれを実装していますか?
ホセイン

1
@Hossein実際の実装でもいくつかの問題に遭遇しましたが、Tensorflow Keras 2.xで可変サイズのCNNが動作するようになりましたが、いくつか制限があります。いくつかの実用的な詳細に関して、私の回答にアプローチの概要を掲載しました。がんばって!
Jトラナ

4

畳み込み層とプーリング層自体は、入力次元とは無関係です。ただし、畳み込みレイヤーの出力は、異なるサイズの画像に対して異なる空間サイズを持ちます。これは、後で完全に接続されたレイヤーがある場合に問題を引き起こします(完全に接続されたレイヤーには固定サイズの入力が必要なため)。これにはいくつかの解決策があります:

1.グローバルプーリング:畳み込みレイヤーの最後にある完全に接続されたレイヤーを避け、代わりにプーリング(グローバル平均プーリングなど)を使用して、フィーチャマップを(N、H、W、C)の形状から削減します(グローバルプールの前) )を(N、1,1、C)に(グローバルプール後)

に変換します。ここで、N =ミニバッチサンプルの数
H =フィーチャマップの空間の高さ
W = フィーチャマップの空間の幅
C =フィーチャマップ(チャネル)の数

Asこれで、出力の次元(N * C)がフィーチャマップの空間サイズ(H、W)に依存しなくなりました。分類の場合は、完全に接続されたレイヤーを使用してクラスのロジットを取得できます。

2.可変サイズのプール:可変サイズのプーリング領域を使用して、異なる入力サイズに対して同じフィーチャマップサイズを取得します。

3.入力画像のクロップ/サイズ変更/パディング入力画像をすべて同じ形状にリスケール/クロップ/パディングすることができます。


転移学習のコンテキストでは、モデルがトレーニングされた元の入力とは異なるサイズの入力を使用したい場合があります。そのためのいくつかのオプションを次に示します

。4.完全に接続された新しいレイヤーを作成します。元の完全に接続されたレイヤーを完全に破棄し、必要な次元で新しい完全に接続されたレイヤーを初期化し、最初からトレーニングできます。

5.完全に接続されたレイヤーを畳み込みとして扱います。通常、フィーチャーマップを(N、H、W、C)から(N、H * W * C)に再形成してから、完全に接続されたレイヤーにフィードします。しかし、完全に接続された層を(H、W)の受容フィールドを持つ畳み込みとして扱うこともできます。その後、サイズに関係なく、このカーネルを機能マップと畳み込むことができます(必要に応じてゼロパディングを使用します)[http://cs231n.github.io/transfer-learning/ ]。


1

今日はこの問題に対処しなければならなかったので、うまくいったことを共有したいと思いました。「理論的にはこれでうまくいく」という答えとちょっとした情報がウェブ上にかなりあることがわかりましたが、実用的な「これは具体的にどのようにこれを実装するのですか」からではありません。

Tensorflow Kerasを使用してこれを実装するには、以下を実行する必要がありました。おそらく、他の誰かがこれらの一部を変更、緩和、または削除できることに気付くでしょう。

  1. input_shapeのプレースホルダーディメンションとして「なし」を使用して可変サイズの入力を許可するようにネットワークの入力を設定します。参照してくださいここフランソワCholletの答えを
  2. たたみ込み層は、グローバルプーリング操作が発生するまでのみ使用してください(例:GlobalMaxPooling2D)。その後、サイズが固定されたため、高密度レイヤーなどを使用できます。
  3. バッチサイズは1のみを使用してください。これにより、バッチ内での混合サイズの処理が回避されます。
  4. 入力のリストからサイズ1のバッチを作成する小さなカスタムシーケンスを記述します。これは、単一のNumpy配列内で異なるサイズを処理しないようにするためです。
  5. トレーニングと検証のために、カスタムシーケンスでModel.fit_generatorを使用します。(vs Model.fit)
  6. 何らかの理由で、上記のようにシーケンスを使用している場合でも、Model.predict_generatorがポップしました。個々の入力に対してModel.predictを使用する必要がありました。

Model.predictの呼び出しがパフォーマンスについて不満を述べたことに注意してください-これはソリューションの非効率性を考えると当然のことですが-機能します!


-2

はい、入力画像のサイズに依存しない適切なバックボーンネットワークを選択するだけで正確な値になります。ほとんどのネットワークはこの基準を満たしています。


3
あなたは間違っていませんが、あなたの答えはあまり有益ではありません- 最新のCNNが可変サイズのイメージを処理できる理由を説明するためにそれを拡張するのはどうですか?また、この変動性にはどのような制限がありますか(たとえば、同じミニバッチで異なるサイズの画像を混在させないでください...)?旧式のMLP(入力長は固定)または旧式のCNN(AlexNetとVGG-1X)のどちらかを厄介なFlattenレイヤーで使用しているほとんどの人は、現代のCNNが原理的にどのようなサイズの画像を取得できるかを理解していません。
DeltaIV
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.