畳み込みネットワークを使用して検索、強調表示、および分類する

最近、 ZlodeiBaal は「Heads and Villagesでのニューロレボリューション」というタイトルの記事を公​​開し、最新のニューラルネットワークの機能の概要を説明しました。 私の意見では、最も興味深いのは、画像のセグメンテーションに畳み込みネットワークを使用するアプローチです。このアプローチについては記事で説明します。



segnet.png








長い間、畳み込みネットワークを研究して新しいことを学びたいという要望がありましたが、12GBのメモリを搭載した最新のTesla K40、Tesla c2050、通常のビデオカード、Jetson TK1、モバイルGT525Mを搭載したラップトップがあります。もちろん、TK1を試してみてくださいどのようにそれがほぼどこでも使用できるか、街灯柱に掛けることさえできます。 私が最初に始めたのは数字の認識です。もちろん、驚くことは何もありません。数字はネットワークによって長い間認識されてきましたが、家の番号、車の番号、車の番号などを認識しなければならない新しいアプリケーションが常に必要です。 d。 すべては問題ありませんが、数字を認識するタスクは、より一般的なタスクの一部にすぎません。





畳み込みネットワークは異なります。 画像内のオブジェクトを認識する方法のみを知っている人もいます。 一部の人々は、オブジェクト(たとえば、RCNN)で長方形を選択する方法を知っています。 また、画像をフィルター処理して、ある種の論理的な画像に変えることができる人もいます。 とりわけ後者が好きでした。それらは最も速く、最も美しく動作します。 テストでは、この分野の最新のネットワークの1つであるSegNetが選択されました。詳細については、 記事を参照してください 。 この方法の主なアイデアは、ラベルの代わりに、数字ではなく画像を提供し、新しい「アップサンプル」レイヤーを追加してレイヤーのサイズを大きくすることです。



layer { name: "data" type: "DenseImageData" top: "data" top: "label" dense_image_data_param { source: "/path/train.txt" //  : image1.png label1.png batch_size: 4 shuffle: true } }
      
      







最後に、ラベルからの展開された画像とマスクが損失層に送られ、各層には損失関数でその重みが割り当てられます。



 layer { name: "loss" type: "SoftmaxWithLoss" bottom: "conv_1D" bottom: "label" top: "loss" softmax_param {engine: CAFFE} loss_param: { weight_by_label_freqs: true class_weighting: 1 class_weighting: 80 } }
      
      







数字を正しく認識することは数字を認識する作業の一部にすぎず、最も難しいことではありません。まずこの数字を見つけてから、数字がどこにあるのかを見つけてから認識する必要があります。 多くの場合、最初の段階で大きなエラーが発生し、その結果、数字の認識の高い信頼性を得るのはかなり困難です。 汚れた番号や詰まった番号の検出は不十分であり、大きなエラーが発生すると、番号テンプレートの重ね合わせが不十分になり、その結果、多くの不正確さと困難が生じます。 数は一般に、任意の間隔などで非標準にすることができます。

たとえば、ワゴン番号には多くのスペルのバリエーションがあります。 番号の境界線を正しく選択すると、各桁で少なくとも99.9%を取得できます。 そして、数字が絡み合っていたら? セグメンテーションが車の異なる部分に異なる番号を与える場合はどうなりますか?



title.jpg








または、たとえば、車の番号を検出するタスク。 もちろん、 HaarHogの両方で解決できます。 しかし、別の方法を試して比較してみませんか? 特に、トレーニングとマークアップの準備が整ったベースがある場合はどうですか?

車の番号とマスクを持つ画像が畳み込みネットワークの入力に送られ、番号を持つ長方形が単位で塗りつぶされ、それ以外はすべてゼロになります。 トレーニング後、テストサンプルの作業を確認します。各入力画像に対して、ネットワークは同じサイズのマスクを生成し、その上に、多数のピクセルが描画されます。 結果は下図のとおりです。



8284.jpg






8300.jpg






8338.jpg






8413.jpg






8417.jpg








テストサンプルを確認した後、この方法が非常にうまく機能し、ほとんど失敗しないことを理解できます。これはすべて、トレーニングと設定の品質に依存します。 VasyutkaZlodeiBaalには数字のベースがマークされていたので、トレーニングを行い、すべてがうまく機能することを確認しました。 結果は、Haarカスケードより悪くなく、多くの状況でさらに良くなりました。 いくつかの欠点に注意することができます:



一般に、これらの欠点の発現は自然であり、ネットワークはトレーニングセットにないものを見つけません。 ベースを準備するプロセスに慎重にアプローチすると、結果は高品質になります。

結果のソリューションは、ナンバープレートだけでなく、オブジェクトを検索するタスクの大規模なクラスに適用できます。 さて、番号が見つかったので、ここで番号を見つけて認識する必要があります。 これも簡単な作業ではありません。一見したところ、その場所について多くの仮説を確認する必要があります。また、数値が標準ではなく、マスクに適合しない場合はパイプです。 車の番号がゲストによって作成され、特定の形式を持っている場合、つまり、手で、異なる間隔で、好きなように書くことができる番号です。 たとえば、ワゴンの数字はスペースで書かれており、ユニットは他の数字よりもはるかに少ないスペースを占有します。

畳み込みネットワークは再び私たちの助けに駆けつけています。 しかし、検索と認識に同じネットワークを使用するとどうなりますか。 車の数を検索して認識します。 画像がネットワーク入力に送られます。ネットワーク入力には、数字とマスクがあり、数字の付いた正方形には1〜10の値が入力され、背景にはゼロが入力されます。



number mask.png








Tesla K40でそれほど長くないトレーニングの後、結果が得られました。 結果を読みやすくするために、さまざまな数字がさまざまな色で描かれています。 多大な労力を費やさない色で数を決定します。



vagon in.png






vagon_res.png








実際、それは非常に良い結果であり、以前はあまり認識されていなかった最悪の数字でさえ、見つけられ、数字に分割され、数字全体が認識されました。 結果は、数字を認識するだけでなく、一般的に画像内のオブジェクトを見つけ、選択して分類できる汎用的な方法でした(そのようなオブジェクトが複数ある場合)。



3.png






3_res.png








しかし、医療画像のハイライトやセグメンテーションなど、もっと珍しくて面白くて複雑なものを試してみたらどうでしょう。 このテストでは、X線透視画像とX線画像のオープンベースから透視画像を撮影し、肺のセグメンテーションのトレーニングを実施しました。その結果、関心領域を正確に特定することができました。 0と1のソース画像とマスクもネットワーク入力に送られました。 右側は畳み込みネットワークが生成する結果であり、左側は画像上の同じ領域です。



f1.jpg








たとえば、この記事ではセグメンテーションに肺モデルを使用しています。 たたみ込みネットワークを使用して得られる結果は決して劣るものではなく、場合によってはさらに良くなります。 同時に、アルゴリズムを作成してデバッグするよりも、ネットワークをトレーニングする方がはるかに高速です。



一般に、このアプローチは幅広いタスクで高い効率と柔軟性を示しています。これにより、分類だけでなく、オブジェクトの検索、セグメンテーション、認識のあらゆる種類の問題を解決することができます。



この方法は、Teslaビデオカードでは1つの画像の処理に10〜15ミリ秒かかり、Jetson TK1では1.4秒かかります。 Jetson TK1でCaffeを実行する方法と、これらのタスクでCaffeで達成できる処理速度については、おそらく別の記事を作成することをお勧めします。



PS

トレーニングは12時間以内で完了しました。

数値によるデータベースのサイズは1200イメージです。

車のベースのサイズは6000画像です。

軽量の基本サイズ480画像。



1. SegNet

2. 画像のセグメンテーションのためのディープコンボリューショナルエンコーダーデコーダーアーキテクチャ(pdf)

3. ハール

4.

5. 画像内の肺のセグメンテーション(pdf)



All Articles