CV モデルが動作しないのはなぜですか?理由がこんなに単純だとは思いませんでした...

CV モデルが動作しないのはなぜですか?理由がこんなに単純だとは思いませんでした...

コンピューター ビジョン モデルのパフォーマンスが低下する理由は、アーキテクチャ設計上の欠陥、代表的でないデータセット、ハイパーパラメータの選択の誤りなど、数多くあります。しかし、見落とされがちな非常に単純な理由があります。それは、画像の向きです。機械学習の専門家 Adam Geitgey 氏は最近、この単純だが多くの人にとって頭の痛い問題を調査した記事を公開し、この問題を解決するために作成した自動画像回転プログラムを共有しました。

私は、物体認識システムや顔認識プロジェクトなど、コンピューター ビジョンと機械学習のプロジェクトについて多くの記事を書いてきました。私は、GitHub で最も人気のある機械学習ライブラリのトップ 10 に入るオープンソースの Python 顔認識ソフトウェア ライブラリを持っています。これは、Python やコンピューター ビジョンを初めて使用する人から頻繁に質問を受けることも意味します。

私の経験では、他の何よりも人々を苛立たせる技術的な問題が 1 つあります。それは、複雑な理論や高価な GPU ではありません。私たちのほとんどが横向きで画像を記憶していること、そしてコンピューターが横向きの画像内の物体や顔を検出するのがあまり得意ではないことに、ほとんどの人が気づいていません。

デジタルカメラで画像を自動的に回転させる方法

写真を撮るとき、カメラはあなたがどの方向に傾いているかを感知します。別のプログラムで写真を表示すると、正しい向きで表示されます。

厄介なのは、カメラがディスクに保存するファイル内の画像データを実際には回転させないということです。デジタルカメラの画像センサーはラインごとに読み取られるため、最終的には連続したピクセル情報ストリームに組み立てられます。これにより、カメラのポーズに関係なくピクセル データが常に同じ順序で保存されるため、カメラがピクセル データを保存しやすくなります。

実際、写真を正しい向きで表示できるかどうかは、画像ビューア アプリケーション次第です。カメラは画像データとともに、カメラの設定、位置データ、そしてもちろんカメラの回転角度など、各写真に関するメタデータも保存します。画像ビューアは、この情報を使用して画像を正しく表示する必要があります。

画像メタデータの最も一般的な形式は Exif (Exchangeable image file format の略) です。 Exif 形式のメタデータは、カメラによって保存された jpeg ファイルに配置されます。この Exif データを画像自体から直接読み取ることはできませんが、読み取り方法を知っている任意のプログラムを使用できます。

以下は、Exiftool を使用して読み取った、上記のガチョウの写真の Exif メタデータです。

Orientation データ要素に注意してください。これは、画像を画面に表示する前に、画像を時計回りに 90 度回転するように画像ビューア プログラムに指示します。プログラムがこれを忘れると、画像は横向きに表示されます。

多くの Python コンピューター ビジョン アプリケーションのパフォーマンスが低下するのはなぜでしょうか?

Exif メタデータは、jpeg ファイル形式のネイティブな部分ではありません。 TIFF ファイル形式でこのメタデータが使用された後、JPEG ファイル形式でこのメタデータが追加されました。これにより、旧世代の画像ビューアとの下位互換性が維持されますが、一部のプログラムでは Exif データを解析しないという問題も生じます。

numpy、scipy、TensorFlow、Keras など、画像データを扱うためのほとんどの Python ライブラリは、汎用的なデータ配列を扱う人々のための科学的なツールであると考えられています。そのため、現在のすべてのカメラで写真を撮るためにこの機能が必要であるにもかかわらず、彼らは「画像の自動回転」のような消費者レベルの問題を気にしません。

これは、Python ライブラリを使用して画像を読み込むと、回転されていない元の画像データが取得されることを意味します。では、横向きまたは上下逆さまの画像を顔認識モデルまたは物体検出モデルに入力すると何が起こると思いますか?誤ったデータを提供したため、検出器は失敗します。

この問題は初心者や学生が書いた Python スクリプトに限定されると思われるかもしれませんが、そうではありません。 Google の主力製品である Vision API デモでも、Exif の方向を正しく処理できません。

Google の Vision API デモでは、モバイルでキャプチャされた標準的なポートレート画像を回転できません。

Google の視覚技術は、横から撮影した画像の中にいくつかの動物がいることを正常に検出しましたが、特定できない「動物」というラベルしか付与しませんでした。これは、モデルにとって、前を向いているガチョウを検出するよりも、横を向いているガチョウを検出する方がはるかに難しいためです。入力する前に正しく回転させると、Google Vision API は次の結果を生成します。

画像の向きが正しい場合、Google の検出はより具体的になります。つまり、「ガチョウ」というラベルが正しく付けられるだけでなく、信頼スコアも大幅に高くなり、はるかに優れた結果となります。

このデモンストレーションのように画像を横向きで見ると、この問題はさらに明白になります。しかし、問題は、一般的にはそれを見ることができないということです。今日のコンピュータの一般的なプログラムは、画像を、実際にディスクに保存されている横向きの形式ではなく、正しく回転した形式で表示します。そのため、モデルが機能しない理由を理解するために画像を確認すると、画像ビューアは正しい方向で画像を表示し、モデルがうまく機能しない理由を理解する方法がなくなります。

Mac の Finder では常に Exif 回転が適用された画像が表示されるため、ファイル内の画像データが実際に横向きになっているかどうかはわかりません。

これにより、使用していたオープンソース プロジェクトが機能しなかった、またはモデルの精度が不十分だったという問題が GitHub に報告されることが必然的に発生します。しかし、問題の本質は非常に単純です。画像を横向き、あるいは上下逆さまに入力しているのです。

この問題を解決する

解決策は、Python プログラムで画像を読み込むたびに Exif 方向メタデータ チェックを実行し、必要に応じて画像を回転させることです。実行するのは簡単ですが、すべての方向で回転を正しく実行するサンプル コードをオンラインで見つけるのは困難です。

以下は、NumPy 配列に読み込む前に、任意の画像に正しい向きを適用するコードです。

  1. PIL.Imageをインポートする
  2. PIL.ImageOpsをインポートする
  3. numpyをnpとしてインポートする
  4.   
  5.   
  6. exif_t​​ranspose(画像):
  7. そうでない場合は画像:
  8. 画像を返す
  9.   
  10. exif_orientation_tag = 274   
  11.   
  12. # EXIFデータ確認する(一部のファイルにのみ存在)
  13. hasattr(img, "_getexif" ) かつ isinstance(img._getexif(), dict) かつ exif_orientation_tag が img._getexif() にある場合:
  14. exif_data = img._getexif()
  15. 方向 = exif_data[exif_orientation_tag]
  16.   
  17. # EXIFの向きを処理する
  18. 方向 == 1 の場合:
  19. # 通常の画像 - 何もする必要はありません!
  20. 合格
  21. elif 方向 == 2 :
  22. # 左から右にミラーリング
  23. img = img.transpose(PIL.Image.FLIP_LEFT_RIGHT)
  24. elif 方向 == 3 :
  25. # 180回転
  26. 回転( 180 )
  27. elif 方向 == 4 :
  28. # 上から下にミラーリング
  29. img = img.rotate( 180 ).transpose(PIL.Image.FLIP_LEFT_RIGHT)
  30. elif 方向 == 5 :
  31. # 左上の対角線に沿って反転
  32. img = img.rotate( -90 , expand=True).transpose(PIL.Image.FLIP_LEFT_RIGHT) です。
  33. elif 方向 == 6 :
  34. # 90回転
  35. img = img.rotate( -90 , expand=True) で拡大縮小します。
  36. elif 方向 == 7 :
  37. # 右上の対角線に沿って反転
  38. img = img.rotate( 90 , expand=True ).transpose(PIL.Image.FLIP_LEFT_RIGHT)
  39. elif 方向 == 8 :
  40. # 270回転
  41. img = img.rotate( 90 , expand=True)
  42.   
  43. 画像を返す
  44.   
  45.   
  46. def load_image_file(ファイル、モード= 'RGB' ):
  47. # PILで画像を読み込む
  48. img = PIL.Image.open(ファイル)
  49.   
  50. hasattr(PIL.ImageOps, 'exif_t​​ranspose' )の場合:
  51. # 最近のバージョンのPILでは内部的にexit transposeを実行できる
  52. 画像 = PIL.ImageOps.exif_t​​ranspose(画像)
  53. それ以外
  54. # それ以外の場合は、 exifを自分で転置する
  55. 画像 = exif_t​​ranspose(画像)
  56.   
  57. img = img.convert(モード)
  58.   
  59. np.array(画像)を返す

その後、この画像データの配列を、Keras や TensorFlow など、必要なすべての標準 Python 機械学習ライブラリに渡すことができます。

この問題は非常によくあるため、image_to_numpy という pip ライブラリを作成しました。これは次のようにインストールできます。

  1. pip3 インストール image_to_numpy

これを任意の Python プログラムで使用して、適切な画像の読み込みを実装できます。次に例を示します。

  1. matplotlib.pyplot を plt としてインポートします
  2. import image_to_numpy# 画像ファイルを読み込みます
  3. img = image_to_numpy.load_image_file( "my_file.jpg" ) # 画面に表示する(または何でもしたい
  4. plt.imshow(画像)
  5. plt.show()

<<:  機械学習における正規化とはどういう意味ですか?

>>:  中国語からSQLへの自動変換精度92%、このKaggleマスターが世界記録を更新

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

...

...

新しいディープラーニングモデルがエッジデバイスに画像セグメンテーションをもたらす方法

[51CTO.com クイック翻訳]画像セグメンテーションは、画像内のオブジェクトの境界と領域を決定...

屈原·漁師のアルゴリズムの追求

屈原・漁夫のアルゴリズムの追求を分析する前に、「漁夫」の原文を見てみましょう。屈原は流刑になった後、...

...

AI時代の従業員のスキルアップのための5つのヒント

AI によって人々の働き方が変化する中、企業は従業員が自動化された職場環境に能力を適応できるように支...

チューリング賞受賞者のヤン・ルカン氏への最新インタビュー: AI は世界を支配するだろうが、人類を征服することはない!

かつての共同研究者であるジェフリー・ヒントン氏とヨシュア・ベンジオ氏がAIの絶滅を宣言したとき、ルカ...

...

研究により、脳外科手術の訓練においてAIが専門のインストラクターよりも優れていることが判明

COVID-19パンデミックは、医療研修に課題と機会をもたらしています。遠隔学習技術は、さまざまな分...

...

...

人工知能がメディア業界に破壊的変化をもたらし、10の新たな雇用を生み出す

九寨溝マグニチュード7.0の地震、ロボット記者が25秒間で540語と写真4枚を執筆!人間記者、揺れて...

...

...

業界大混乱! 2020年に人工知能がIT業界にもたらす4つの変化

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...