質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.11%

OCRによる文字認識が困難なフォントってありますか?

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,018

sounisi5011

score 713

自作のCAPTCHAを作ろうと考えています。

このCAPTCHAは、「歪んだ文字を読ませてそのまま入力させる」タイプではなく、「質問文を読ませて適切な答えを入力させる」というものです。
文字認識だけでなく、質問文の内容を理解し、適切な解答を導き出す事を要求するため、スパム対策としてはかなり有効なのではないかと考えています。
また、質問文の内容理解という高い要求を行うため、本物の人間が読めない程歪んだ文字を用意する必要も無くなります。
(似たコンセプトのCAPTCHAとして、既に妹認証というモノも存在します)

この質問文の文字に使用するフォントとして、文字認識が困難な、それでいて人間には読むことの出来るフォントを使用しようと考えています。
(文字認識のハードルを上げる事で、少しでも突破が困難になればという予備策です)
手書き文字や筆文字がこれに該当すると思うのですが、文字認識の精度や特徴について詳しく知らないため、本当に認識し難いフォントなのか判断がつきません。

文字認識が困難になるフォントとして、どのようなものがあるでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

まずはちょっといたお断りから…
これは直接の回答ではありません。
ちょっと長くなりますが、単刀直入に回答できない理由と、参考になりそうなアイディアを少し書きます。

回答しにくい理由

ご質問の内容は、興味深い取り組みですね。しかしながら、sounisi5011さんのご質問にまともに回答しようと思うとかなり難しいです・・・

文字認識の精度や特徴について詳しく知らないため、本当に認識し難いフォントなのか判断がつきません。
との事ですが、逆に詳しく知っていても簡単には判断の付かない問題だと思います。

文字認識の手法には様々なものがあり、また同じ手法でもプログラムの実装方法によっても認識精度や処理速度が異なります。
どんな文字でも素早く正確に認識出来るシステムはまだ無いか、もしあっても非常に高価です。

つまり、どんなシステムを想定して『ハードルを上げる』事を検討するのかによって回答が異なりますし、どの程度効果があるかは、実際にテストしてみないと分からないという側面もあります。

一方、この手のテーマについて論ずる際は、認識する側もそれを阻止する側も、単純に認識率だけを問題にするのではなく、それに要するコスト(システムの値段だけでなく処理に要する時間も含む)が、対象となる情報の価値と見合ったものかという観点からも検討する必要があります。

言い換えるとsounisi5011さんが(機械認識に対する)どの程度の難読化を望んでいるかによっても回答が異なってきます。

という前置きの上で、いくらかでもご参考になればと思い、少し情報連携致します。

認識しにくい状況を作るには?

まず、認識しにくいフォントを判断する上での近道は、最も認識しやすいフォントについて知ることです。

もし対象がASCII文字だけならば、それが OCR-B である事に多くの方が同意されると思います。ですから、このフォントからの ズレ(=ノイズ)が大きい程認識しにくくなると考えられます。

しかし、質問に対する 一意の回答 を要求するとなると、日本人が対象であれば当然、日本語フォント について考慮する必要があります。そうすると、この問には必ずしも簡単には答えられません。(ご参考)

世の中には手書きフォントというものもありますし(たとえばこちらこちら)、直筆の文字からフォントを作成するツール(たとえばこちら)だってあります。とは言え、手書き文字の認識精度も高くなっているので、単純に手書きフォントにしたから認識率を下げられるというものでもありません。
そもそも、機械的に認識しにくい癖字は人間にとっても読みにくいものです。

それで、ちょっと文字認識の 原理に立ち返って みると、ザックリとした言い方をすれば、どんな方式であれ以下の2つの過程を経て認識していると考えられます。
1. 対象の画像から、文字を構成している「線」を抽出する
2. 線の集まりに色々なフィルター(数学的な変換)を適用して、どの文字情報とマッチするかを調べる

1.については、画像の輪郭線や中心線を抽出する方式が一般的です。
2.については色々な手法がありますけれども、要するに「お手本」からの歪みが大きい程認識しにくくなります。

フォントの種類を変えるとか、人間でも判別しにくい程文字を歪ませるというのは、上記の分類で言えば 2. に該当します。
ただ、機械認識に影響を与える程に歪ませると人間にも読みにくくなってしまうというのは、どんなフォントを選んだとしても同じではないでしょうか?

ですから、ある程度の読みやすさをキープしつつパターン認識をしにくくするには、otnさんのご指摘のように「パターン数を増やす」しか無い訳です。
これは、スパム防止用の一般的な取り組みと同じです。「ランダムな文字列(=パターン数の多さ)×文字列の歪み(=個々の文字の認識しにくさ)」で機械認識を少しでも難しくしようということです。

sounisi5011さんの取り組みは、こうしたジレンマ(=機械認識しにくくなる程歪ませると人間も読めなくなる)を回避するためのはずなので、単純にフォントを変えるという方法では不十分なことは明らかです。
また、意味のある質問文を用意するという観点からすると、パターン数の増加も結構たいへん(=コストが掛る)です。

そこで、上記 1. (線の抽出を困難にさせる)をプラスすることで、人間には読めるが機械認識を困難にさせる方法を検討してはいかがでしょうか?
要するに、一つの要素だけに頼ってズレを大きくしてしまうと人間にも読みにくくなってしまうので、たくさんの要素を少しずつ変化させ、その組み合わせでパターン数を 劇的に 増やすという考え方です。

思いつくままに幾つか例を挙げると、以下のような複数の要素をランダムに変化させることができます。
1. 幾つかのフォントを混ぜる
2. 文字のサイズを変化させる
3. 文字の歪みを変化させる
      →斜体を使用する際も、斜度を幾つか織り交ぜる
4. 文字の太さを変化させる(一つの文字の中でも場所によって変化させる)
5. 文字の濃さを変え、場所によってはかすれを生じさせる
6. 文字のベースラインを不揃いにする
7. 文字の回転を変化させる
8. あまり難しくない文字については「鏡文字」も含める(サンプル
9. 地のパターンを変えたり、ランダムなドットのマスクを掛けたりする
        →色覚異常検査に使用するようなパターン(文字、数字、絵柄など)を織り交ぜる(ご参考
(もっとも、本当の色覚異常検査のパターンでは色弱の方などハンディキャップをお持ちの方にも認識出来なくなってしまうので、実際のパターンの色調には注意が必要です。)

でもって、たとえば2桁の数値の文字認識しにくいパターンを数種類用意しておき、それを数個ランダムな順番に表示させて、一番大きな数を答えさせるようにすると、それだけでかなりのパターン数を稼げます。
同様に、蝶とかカブトムシのような、だれでも分かりやすい図柄を数種類用意しておいて、それが何かを答えてもらうというやり方でもかなりのパターンを稼げます。

そうやって、「妥当な種類の質問パターン」×「個々の文字フォントのパターン」×「認識しにくい図柄」×「表示順序」によってパターン数を増やしてやれば、事前の準備はある程度大変でもそれ程複雑なプログラミングなしに、機械認識がある程度困難なパターンを作成できると思います。

以上、幾らかでもご参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/01 00:12

    直接の解答ではありませんでしたが、とても参考になりました。
    ありがとうございます。

    キャンセル

0

攻撃者側からすると、質問が100パターンくらいしかないのであれば、一度人間が読んで答えが分かれば、次に同じ画像が来たらその答えを入れれば良いので、かなり弱い防御になります。
画像が同じかどうかは、簡単な比較です。

ブログのコメント欄にspamを防ぐくらいの目的でいいのであれば、10パターンくらいの質問でいいと思います(画像にする必要も無いかも)が、「画像認識して質問文を解読されて人工知能が回答することを心配する」ような重要なサイトであれば、キャプチャ並の防御をするためには、質問を数万パターン、あるいはもっと用意する必要があるのではないでしょうか。普通のキャプチャに比べるとかなり大変だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/30 22:45

    > 次に同じ画像が来たらその答えを入れれば良いので、かなり弱い防御になります。

    画像はプログラムにより動的に生成するので、この点については問題ありません。
    同じ質問文でも、背景にノイズを使用したり、文字の大きさ、色、配置、角度、変形度等を表示する度に変動させます。

    キャンセル

  • 2015/11/30 22:46 編集

    ところで、この質問は「文字認識が困難になるフォント」にはどのような物があるのか、というものです。

    キャンセル

  • 2015/12/01 00:52

    > 同じ質問文でも、背景にノイズを使用したり、文字の大きさ、色、配置、角度、変形度等を表示する度に変動させます。
    あ、そうなんですね。
    > 「歪んだ文字を読ませてそのまま入力させる」タイプではなく、
    とあったので、そういうことはしないものだと読み取りました。
    で、「そういうのだといくらフォントを工夫しても意味ないよ」というのが回答です。

    通常のCAPTCHA機能で質問文にするという意味だったんですね。失礼しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る