Opencvを用いて簡単な画像類似検出器(MSE,SSIM)を構築する


概要:opencvを使用します.numpyなどの簡単なツールライブラリは,mseとssimの2つのアルゴリズムに基づいて2枚の画像の類似度を評価し,理解と実践を容易にする.
紹介する
人間として、私たちは通常画像の違いを発見するのが上手です.例えば、よくあるゲーム--2枚の画像が違う.まず、上の画像を見て、30秒以内に何か違うところを見つけることができるかどうかを見てみましょう.
答え:果物、アイスクリーム、飲み物の色が明らかに変わって、カーテン、太陽も変わって、これは簡単ではありませんか?補足の答えがあれば、伝言先で出してくださいね!
このような問題は人間にとって容易なことのように見えるが、コンピュータにとっては容易なことではない.これは、コンピュータが私たちが訓練したモデルからしか学ぶことができず、最終的にこのような能力を持っているからです.現在、TensorFlowやKerasなどのオープンソースツールなど、バッチ画像を分類できる良いモデルがたくさんあります.
このようなオープンソースツールライブラリにより,コンピュータ視覚分野の研究が高度に発展した.このようなツールボックスを使用して、非常に複雑なモデルを作成し、kaggle:Animals-10などの複雑な問題を解決することもできます.このデータセットには、数十種類の異なるタイプの動物の画像と非動物の画像が含まれています.画像がどの種類の動物であるかを予測するモデルを作成することです.
MSEとSSIM
しかしながら、上記のタスクは、一般的な手書きデジタル認識MNISTなど、比較的簡単であり、一般的には高い精度を得ることができる.ここでは、2つの画像の類似度を見分けるために、画像分類器を作成することを少し難しくしたいと思います.また、TensorFlow、Kerasなどの複雑なツールライブラリには依存しません.本論文では,従来の機械学習法を用い,ここでは,画像が他の画像と類似しているかどうかを調べるための2つの方法を選択した.この2つの方法はそれぞれ平均二乗誤差(MSE)、構造類似度指数(SSIM)である.
上記の式は非常に複雑に見えますが、怖がらないでください.NumPyにより、MSEをかなり容易に算出することができる.また、SSIMはSci-Kitイメージライブラリの内蔵方法の一部であるため、SSIMを容易に算出することができる.
符号化を行う前に、ここでは、この2つの方法について簡単に説明する.MSEは、比較中の2つの画像の各画素間の平均二乗誤差を計算する.SSIMがやっていることはMSEとは正反対で、画素値の類似点を探しています.すなわち、2つの画像の画素配列が類似している場合、または類似した画素密度値を有する場合.MSE法が直面する1つの問題は,その結果が任意の大きな値を有することが多いため,標準的な評価基準を与えることが困難であることである.一般に、MSEが高いほど、2枚の画像の類似度が低いことを示している.画像間のMSE値がランダム値である場合、両者が似ているかどうかは説明しにくい.一方、SSIMは、すべてのコンテンツを-1~1の範囲内に正規化している(0以下のスコアを得ることは難しい).スコア1は両者が非常に類似しており、スコア1は両者が非常に異なることを示している.これに基づいて、SSIMはMSEに比べてより良い測定指標である.
インプリメンテーション
コードを使用して、次のようなアイデアを実現します.
必要なライブラリをロード:
本論文では,一般的な画像処理ツールボックスOpenCVを用いて画像の読み取りと編集を実現する.他の画像処理ツールボックスに詳しい場合は、matplotlibdenなど、自分のよく知っているツールボックスを使用してこのような操作を完了することもできます.
MSE式の作成:
Numpyで操作するのは簡単でしょう.
SSIMはskimageで既にインポートされているので、手動でエンコードする必要はありません.2つの画像として入力された比較関数を作成し、それぞれのMSEとSSIMを計算し、計算結果を示します.
次の3つのステップは、forループを使用して一度に完了することができるが、より容易に理解するために、ここではforループを使用してコードを記述せず、3つの部分に分解する.
まず、ディレクトリに保存されている画像をロードします.次に、サイズが同じであることを確認する必要があります.そうしないと、サイズが一致しないエラーが発生します.問題は、サイズ変換操作を行うと画像が歪むため、比較的適切なサイズの数字を見つける前に、寸法サイズを一定の法則で設定し、最終的に適切なサイズを見つけるために実験を続ける高速検索方法を試みることができる.次に、テスト画像がどのようになっているかを見るための機能を実現します.
2つの同じ画像を比較してMSEとSSIMが正常に動作しているかどうかをテストし、確認します.もしそれが有効であれば,MSE値が0とSSIM値が1の結果を得るべきである.
コードが正しく、結果が予想と一致していることがわかります!
コンピュータは、比較した2枚の画像が同じかどうかを判断することができます.簡単にするために、私は3枚の犬の画像を自分と3枚の猫の画像と比較します.
2つのアルゴリズムの性能比較を見てみましょう.見たようにMSEの値は大きく変化するので,その表現の意味を説明するのは難しい.しかし、SSIMの結果から、犬2と犬3が他の犬に比べて最も似ていることが明らかになった.視覚的に言えば、私はこの結果に同意します.2匹の犬の耳がとても似ているからです.しかし、犬1と犬3はもっと高いSSIM値を持っていると思います.両者の姿勢も似ているからです.実際には、画像が階調処理されない前に、犬2と犬3は鼻領域の周囲に似たような白い毛皮を有し、犬1は存在しなかった.これは、イヌ2および3がイヌ1より高いSSIM値を有する理由である可能性が高い.猫にとって、これはちょっと難しいです.猫1と猫2は似たような形をしており、画像は似たような距離から撮影されているが、猫2と猫3は似たような毛皮色をしている.
ここで私が行いたいテストは2つしかありません.1つは犬と猫の類似性で、2つ目は動物ごとに元のソースコードに付属したドア図の類似性です.
予想通り、犬と猫が似ているのは、ジュラシックパークの入り口門のような無生命の物体とは対照的だ.犬と猫はドアの画像に対して高いSSIM値を有し,唯一の理由は画像が寸法スケーリングと階調処理を経たことである.
画像サイズの調整や再構成ではOpenCVが最適ではありません.一般的にはTensorFlowが最も良く、TensorFlowも一括画像に最適です.
その後、TensorFlowを使用してkaggle Animal-10データセットを処理し、完全な画像分類器を実現します.
著者:【方向】
原文を読む
本文は雲栖コミュニティのオリジナル内容で、許可を得ずに転載してはならない.