2017-08-10 4 views
0

TensorFlowで完全畳み込みネットワークを実装しました。これは、エンコーダ - デコーダ構造を使用する。 トレーニングを受けるとき、私はいつも同じ画像サイズ(224x224、無作為な作物を使用しています)を使用し、すべてうまく動作します。動的テンソルアライメント/クロッピング

干渉フェーズでは、フル画像(切り抜かれていない画像)を使用したいので、一度に1つの画像を予測したいと思います。たとえば、そのような画像のサイズは[406,256]です。そしてここに問題があります。 エンコーダ/デコーダアーキテクチャでは、2つのテスタ(z = x + y)を追加します。訓練するとき、両方のテンソルのサイズが一致します。私の単一のイメージを予測するとき、サイズは一致しません(テンソルサイズ:[1,47,47,64][1,46,46,64])。私はConvとPoolレイヤーで何らかの丸めを行うことが原因だと思います。

私が望む任意のイメージサイズで、アーキテクチャを変更して、どのような作品にする必要がありますか?丸めパラメータを変更する必要がありますか?または、テンソルの「クロッピング」を追加しますか?アーキテクチャの実装に

リンク: https://gist.github.com/melgor/0e43cadf742fe3336148ab64dd63138f (問題はライン166で発生)

+0

入力を '[224、224]'にサイズ変更する –

+0

入力のサイズを変更する必要はありません。なぜなら、私はいくつかの '空間情報 'を失うからです。私のモデルは正しいアスペクト比(画像のサイズ変更なし)で学習されました。干渉で私は正しいアスペクト比を望むだろう。 また、画像を複数の矩形領域に分割してマージすることもできます。しかし、私はこのモデルが妥当な速さで動作し、異なる入力解像度でモバイルで作業したいと思っています。 – melgor89

答えて

0

私は可変入力サイズのための解決策を見つけた:)

私たちは本当に「作物層」だった必要なもの他のテンソルと一致するテンソルを作ってください。私はここで本当に似た層を見つけました:http://tf-unet.readthedocs.io/en/latest/_modules/tf_unet/layers.html (crop_and_concat)。

私はちょうどそれが `crop_and_add」と、それが動作して行った:

def crop_and_add(x1,x2): 
    x1_shape = tf.shape(x1) 
    x2_shape = tf.shape(x2) 
    # offsets for the top left corner of the crop 
    offsets = [0, (x1_shape[1] - x2_shape[1]) // 2, (x1_shape[2] - x2_shape[2]) // 2, 0] 
    size = [-1, x2_shape[1], x2_shape[2], -1] 
    x1_crop = tf.slice(x1, offsets, size) 
    return x1_crop + x2 

すべての添加がモデルで、私は(そうエンコーダおよびデコーダデータをマージ)層の上に置き換え。だから我々は、我々は、単一のイメージに合格することを知っていると、その画像が3つのチャンネルを持っている

image = tf.placeholder(tf.float32, shape=[1, None, None, 3], name="input_image") 

はまた、モデルへの入力は、次のように定義する必要があります。しかし、我々は幅も高さも知らない。それはとてもうまくいく! (K80のAWS P2として40FPS、画像のサイズは224x {} - 画像の側が224です)

FYI、私もENET(LinkNetより2倍速い)を実行しようとしていましたが、TensorFlowでは遅いです。私はそれがPReLu(TFで遅い)のためだと思う。また、UnPoolレイヤーの画像サイズは、プレースホルダではなく整数リストによって事前定義された出力サイズを持つ必要があります。だから、LinkNetはTFのSpeedとPerformacanceの方が良く見える。