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マスターが世界記録を更新

ブログ    

推薦する

あなたのバイオテクノロジー研究は影響力がありますか? MITの機械学習フレームワークは期待できる

[[400942]]研究者にとって最も嬉しいことは、論文が「受理」されることです。論文が出版された後...

...

...

販売禁止の影で、国産GPGPUがその穴を埋めることはできるのか?

今年初め、ChatGPTはAIアプリケーションの開発を刺激する火花のようなもので、AI業界は開発の急...

AIの過去と現在を理解するのに役立つ、60年間の技術の簡単な歴史

[[269852]]人類の進化の歴史は、人類が道具を作り、使用してきた歴史です。さまざまな道具は人類...

AI、機械学習、ディープラーニングのつながりと違いを1つの記事で理解する

急速に変化する今日のテクノロジーの世界では、人工知能 (AI)、機械学習 (ML)、ディープラーニン...

...

米国のAI雇用市場の現在の規模を解読する

[[342720]] 人工知能の分野でのこの国の雇用機会はどのようなものでしょうか?私たちはすべてが...

人々が家に座っていて、車が道路を走っています。自動運転は信頼できるのでしょうか?

これまで、無人運転車は基本的にテレビや映画でしか耳にしませんでした。現在、無人運転車の技術は長い間実...

民主化と自動化: 機械学習の参入障壁を下げる 6 つのツール

かつて、機械学習という用語は科学的な光輪に包まれており、複雑なアルゴリズムにデータを「入力」して有用...

中国の教授が犯罪認識率97%の人工知能「検察官」を開発、現在テスト中

[[442697]]最近、「中国の教授らが人工知能検察官を開発中」というニュースが多くの海外ネットユ...

...

...

...