CAPTCHA破りの基礎となりそうな手法を少し試した

グロ画像収集はすでに放置中。ただこれは僕にとってとても面白そうなことなのでたぶん近いうちに再開する。
今週は、『自分のBBSのCAPTCHAを破ってみた - KENJI’S BLOG』について、kenjiくんにテキトウに語ってしまったので、ちょっと調べてつつ実験してました。
僕が言ったテキトウ話というのは、

  • CAPTCHAはたぶん物体認識な方法で読めるよ、検知したシンボルをX座標でソートするだけでいいし

というもので、あらかじめ('0' .. '9', 'a' .. 'z', 'A' .. 'Z')を学習した分類器を使って、画像内を探索し発見した数字から、大きさが他と違いすぎるとか、発見したより複雑なシンボルの部分であるとかの誤検知っぽいの取り除いてやればきっと読めるさー、画像認識とか機械学習とかよく分からないけど、opencvのふろくのアレにテキトウなデータを入力すればうまいこと作れるっさーというもの。

今のところの結果

微妙。まだ学習が1/4しか終わっていない段階だけど、途中のデータで試した感じではサンプルさえ揃えればいけそうな予感はちょっとしている。でも、顔が認識できるなら数字くらい読めるだろ・・・常考、という僕の予想にはかなり大きな間違いがあった。

  • 単純な図形を複雑な変形に対応させるとテラ正解が見つけにくくなる

やればやるほどなんでもありっぽくなってきて、誤検知しまくる。
とりあえずの次の2つの画像を見てほしい。
f:id:ultraist:20071117220650j:image:leftf:id:ultraist:20071117225709j:image:left
左が変形なしの単純なテスト画像、右はちょっとウェーブ状にゆがませたテスト画像。赤い四角は、f:id:ultraist:20071117221040j:imageというひとつの画像にさまざまな変形を加えて作ったサンプル画像を学習させた分類器でテストした物体検知結果なんですが、『1』の上のほうにある4っぽい部分と、『7』の下のほうにある4っぽい部分と、『2』の下のほうの4っぽい部分を誤検知しまくり。結構な数の『4』も発見できていない。誤検知は『4』で発見された画像部分が他に発見された数字の部分ではないか? をチェックするとはじけそうなので、『4』が発見できていないほうが問題っぽい。
またここには『4』画像しか出していないけど、『0』はとてもひどい結果になった。

今日のまとめ

想定していた結果は得られなかったが、1と2と7は、部分的に4っぽいという分類学的な発見があり、この基礎となるアイデアは数字を擬人化するさいの姉妹設定など今後さまなざまな分野で応用可能だと思われる。