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

ブログ    
ブログ    
ブログ    

推薦する

...

...

Midjourney 5.2 がリリースされました!オリジナルの絵画から3Dシーンを生成し、無限の宇宙を無限に拡大します

旅の途中と安定した拡散が限界に達しました! Stable Diffusion XL 0.9 がリリー...

校内暴力を予防し解決するために、AIは子どもたちのために何ができるでしょうか?

[[228688]]あなたはキャンパスライフに満足していますか?多くの人が「はい」と答えると思いま...

AIが顧客発見の「スーパーパワー」をもたらす3つの方法

もし何かスーパーパワーを与えられるとしたら、それは何ですか? 営業マンにとって、予知能力、つまり将来...

AI検出器の仕組みの概要​

翻訳者 | 劉涛レビュー | Chonglou AI ライティング検出器を使用したことがあるかもしれ...

5G、AI、クラウドコンピューティング…東京五輪の裏側にある「ブラックテクノロジー」を徹底検証

8月8日夜、第32回夏季オリンピック競技大会(以下、東京オリンピック)が閉幕した。選手たちの俊敏な姿...

機械学習について知っておくべき6つの革命的な教訓

私たちは、ロボット工学、スマート家電、スマート小売店、自動運転車技術などによって推進される新しい時代...

2017 年グローバル人工知能人材ホワイトペーパー: 世界トップクラスの AI 人材の秘密を解明!

人工知能における競争は優秀な人材に基づいて行われます。国の将来の発展方向として、AI技術は経済発展、...

...

詳細 | EUの人工知能法案が進行中:公共の場での顔認識の禁止を求める、市場シェアを獲得するために厳しい監視が必要

最近、EUの人工知能規制に新たな展開がありました。欧州データ保護委員会(EDPB)と欧州データ保護監...

TransformerはAI分野を支配するのでしょうか?結論を出すのは時期尚早だ

自然言語処理タスクから始まり、画像分類と生成の分野で活躍する無敵のトランスフォーマーは、次の伝説とな...

スタンフォード大学の「バーチャルタウン」がオープンソース化:25人のAIエージェントが「ウエストワールド」に登場

「ウエストワールド」を見たことがある友人は、このドラマの舞台が未来の世界、巨大なハイテクな大人向けテ...

NLP事前トレーニングパラダイムが統合され、下流のタスクタイプに絡まらなくなり、Googleの新しいフレームワークは50のSOTAを更新します

この論文では、Google の研究者がさまざまな事前トレーニング パラダイムを統合する事前トレーニン...

速達荷物を受け取るには顔認証しか方法がないのでしょうか?上海郵政:申通、菜鳥郵政などと面談し、集荷の同意を得る必要がある

[[404490]]宅配業者があなたに電話もせずに荷物を集荷場所に「投げる」という経験をしたことはあ...