【初心者流】Courcera 機械学習 Week 11を解く!(Final) 内容:画像認識

ついに今回でCoursera機械学習最後のパートとなりました。

最終章は機械学習の実用例としてOCR(Optical Character Recognition)を学びます。OCRとは写真や画像内に表示されている文字を文字として認識する技術です。

最近なんかだとGoogle ドキュメント(https://docs.google.com/document/u/0/)がすごいです。文字が画像扱いになっている書面のPDF形式のデータをGoogleドキュメントで開くと、なんとびっくり!OCR機能により文字を検索や修正できる形になっているのです。

今後はスマホのカメラで撮影した写真なんかも簡単に文字認識できてしまうようになるのではないでしょうか。

このOCR技術はどのような仕組みになっているのでしょうか。OCRの例をもとに重要となるいくつかの機能について説明を行います。

OCR(Optical Character Recogition)


OCRを行うには、まずは画像の中からどこに文字があるかを検出します。

そしてその文字列の範囲に矩形を作って文字の分割を行います。

最後に分類器を実行して文字の認識を行います。

このようなシステムを機械学習パイプラインと呼びます。ある目的をクリアするためにいくつかの機能を果たすモジュールへと分割するのです。

・文字検出

OCRを実施するために必要となるパイプラインの一つとして文字検出として使われるスライディングウィンドウ分類器というものがあります。

これは画像の中にある文字認識であれば文字の、人を識別するような場合はその人の大きさに合わせたアスペクト比(縦と横の比)を持つ矩形を画像の中でスライドさせ、アスペクトを維持したまま矩形の大きさを変えて繰り返しスキャンしていき、文字や人を見つけ出していく手法のことです。

例えば、とあるサイズの矩形を用いてスライディングウィンドウを実行していくと、下の写真をもとに右のイメージでは文字である確率が高いところを白、文字か微妙なところをグレー、文字ではないところを黒というように確率ごとに色分けをして表示させます。

左の元の写真から分類器が文字である確率が非常に高いと認識した領域

(手作りイメージですのであくまで参考までに…)

さらには、白、黒、グレーの分類器の出力に対してピクセル毎に見ていき、数学的に一定の距離内にある白い領域を拡張していくという作業を実行します。

これにより、明らかにアスペクト比がおかしい領域を除外していくことでテキストの範囲を限定していきます。

以上の二段階のアルゴリズムによりスライディングウィンドウを行います。

・文字分割

矩形によって文字の検出が完了したら、次は文字の分割を行います。

下図のように、検出した文字列に対して矩形をスライドさせます。スライドさせた際に矩形の中心に縦線を引き、線が文字と被るかどうかで1文字分を判断します。以上を繰り返して文字を分割していくことができます。

・文字認識

最後のステップとして文字認識ですがその前に準備があります。

機械学習において高いパフォーマンスを得るためには低バイアスかつトレーニングセットをたくさん集めることが重要となります。

実際問題、そんなに画像データないよ…という方、それなら一つの画像を人工的に加工して複数のデータとして扱えばいいのです!

まずは下の図を見てください。

【Adam Coates and Tao Wang】から引用

これはAという文字に人工的な歪みをつけて16種類の異なるデータとして新たに入手することができます。

この他にも文字のフォントを変えたり、大きくしたり、回転させたりと様々な方法で少ないサンプルを増やすことができます!

注意点としては、オリジナルの文字に対してランダムなノイズ的な要素はあまり意味を成さない可能性があります。

ダメな例)画像のピクセル単位で濃淡をランダムに変更する。

もう一つのダメな例としては、データ集めに時間をかけすぎてしまうことです。

データ数の増幅で向上するパフォーマンスとそれに費やす時間をよく考えましょう。

天井分析(シーリング分析)


これまでパイプラインシステムと呼ばれる、複数の機能からOCRを実行するという手法を説明してきました。

パイプラインシステムによって構築した機械学習モデルのパフォーマンスを上げるためには、どこにリソースを振るのが効率的なのか!?というところに注目したのが天井分析(シーリング分析)です。

先ほどのパイプラインにシステム全体を管理するパイプライン加え、精度がそれぞれ下の表のようになったとしましょう。

次に与えられた写真に対して文字検出を行いたいのですが、ここではあえて手動で文字の位置を教え、正解ラベル付きのデータを用いて文字検出の精度が100%になった時にシステム全体の精度がどのくらい上がるのかを確認します。

同様に、文字分割、文字認識においても手動で文字を分割した正解付きデータを用いたときにシステム全体の精度がどのくらい上がるのかチェックします。

つまり、各コンポーネントにおいて一つずつ100%の精度にしたときにどのくらいシステム全体の精度が上がるのかを確認していくことで、一番伸び幅の大きいコンポーネントを見つけ出します。

後はそのコンポーネントに対して重点的にアルゴリズムの改善を行えばOK!ということです。

このシーリング分析の良いところは、システム全体の精度を改善したいときにどこから手を着ければよいのか、どこを改善すれば価値があるのかを効率的に教えてくれるところです。

文字認識や顔認識といったシステムは複雑でコンポーネントの数も増えてきます。そんなときにこのシーリング分析を行えば効率的にシステムのパフォーマンスを向上させることができてとても有用ですね!

まとめ


・OCRによる文字認識や顔認識は複数のコンポーネントを持つパイプラインシステムが使われる。

・複雑なパイプラインシステムの改善には各コンポーネントを100%にして全体の精度を確認していくシーリング分析が効果的。

最後に

Coursera 機械学習は今回ですべて完了です。お疲れさまでした。

そして最後までこのブログを見ていただき、ありがとうございました。

私自身、学びだした当初は機械学習の原理なんてほとんどわかっていなかったのですが、Andrew先生の講義は大変わかりやすく、多くを学ぶことができる講義でした。

もし、これから機械学習を学びたいという人はどんな参考書を手に取る前に一度Coursera 機械学習の講義を受けてください。

Andrew先生は難しい機械学習の世界をいかにわかりやすく、かつエンジニアとしてとても大切な本質的なことをご自身のご経験を踏まえて教えてくれます。

この講義の素晴らしいところはわかりやすい内容だけでなく、自分でも今すぐに応用できるんじゃないか?という気になってしまうところです。

それだけ機械学習には魅力があるのではないかと思います。

そして、Andrew先生は世の中が機械学習によって良くなっていくことを本当に願っている先生です。

この授業を受けた皆様が、それぞれのご自身の分野において強力なツールとして機械学習を使っていき、より良い方向に発展させていくいくことがAndrew先生にとって最高の恩返しになるんじゃないか、と私は思います。

以上!

  • 投稿が見つかりません。

コメント

タイトルとURLをコピーしました