前回の記事( リンク )で、ユーザーからの描画を認識するためにニューラルネットワークに依存したいと考え、フロントエンドcaptchaを実装しました:実際に描画する機能。
しかし、プラスの最大数を記録した最後の記事の2つのコメントから判断すると:
roman_tik +44
「マウスでいくつかの図形を描くことは、実際の人間にとってhemoです...」ナイフ +44
「モナリザ」
私の考えは大失敗であり、さらに、スクリプトのサーバー側は多くのリソースを浪費し、使用前にニューラルネットワークを長時間訓練する必要があったと結論付けました。 しかし、自転車を発明したいという欲求は消えませんでした。(1週間以内に)キャプチャの新しいアイデアを思いつきました。
ちょっとした理論。
現代のキャプチャのアプローチは、人々が簡単に解決できる問題を解決できるようにすることですが、機械はそれを解決しません(ただし、最終的には、チューリングテストに合格した「真の」AIがこの問題を解決します)。 しかし、代わりに、キャプチャの主要部分は、おそらく人が認識すべき文字を生成しますが、マシンは認識しません。 最新の技術は、「認識」の作業を複雑にするために逆タスク(OCR)を簡単に実行し、キャプチャにノイズが追加され、文字が歪むため、人間による認識率が悪化します。
たとえば、キャプチャ文字:كلمةالتحقق-それらは写真の中になく、歪んでいませんが、この言語を知らないと、人はこれがテストに合格しないことを理解しませんが、マシンにとっては単なる文字のセットです。 それは何のためですか? さらに、「車」という言葉は1つのものであり、車自体は別のものです。 「車」という言葉は車にはよく知られていますが、車の概念は存在しません。
人はどのように学習しますか? 私たちは彼に車を見せ、それが「車」であることを説明し、彼に馬を見せ、それが馬(そして動物、偶蹄類、生物など)であることを彼に伝えます。 車の場合、このようなタスクも部分的に対象となります。 また、車、馬は輸送手段であるということも-人間の考えでは、この結論は明らかです。
そのため、シンボルではなく、たとえばマシンが「理解」していないイメージを使用してマシンを強制的に動作させることは価値があります。 なんという違いに思えるかもしれませんが、違いはアルファベットには常に文字数(象形文字も)があり、画像の数が無限であることです。 言葉と同じくらい多くの画像があるように見えるかもしれませんが、そうではありません。 例:





アイデア
この理論と最初の記事の開発を組み合わせて、私は写真を表示し、ユーザーが想像力豊かな思考を使用して必要なものを見つけることができるという結論に達しました。
しかし、やめてください、この考えは新しいものではありません-そのようなキャプチャは既に存在します。 ただし、バストによるハッキングに屈しないように、サーバーには多数の写真があるはずです。
私は自分を少数の写真に限定することにしました。 これを行うには、あまりにも多くを除外するために、写真を重ねて重ねることにしました。 馬の後ろから車の後ろを見分けることができますか? そう思う。
すべての画像を1つに貼り付け、画像番号を送信する代わりに、正しい画像の座標(したがって、可能な応答値の範囲を拡大する)をサーバーに送信することを考えることは残ります。
実装
1日でコードを走り書きしたので、こんなにきれいな文字を取得しました。

このようなキャプチャの生成は非常に簡単です。私のバージョンでは、10種類のオブジェクト(各種類の主題の3つのバリエーション)しかありません。
ランダムなオブジェクトの画像を作成するとき、正しい答えと出来上がりの座標を記憶し、ユーザーの応答を確認しながら、ソース内のマークされた座標の発生を確認します。
<?php if (isset($_POST['check']) && isset($_POST['answer']) && $_POST['check'] == 1){ $answerUser = json_decode($_POST['answer']); $answerCaptcha = unserialize($_SESSION['nncaptcha']); echo json_encode(array('checked'=>$answerCaptcha->checked($answerUser) )); exit(); } ?>
それが全体のチェックです。
ここでライブキャプチャを見ることができます。 (弱いホスティングの注意!)
これはこの領域で最も簡単なキャプチャです。画像の数を簡単に増やすことができます(キャプチャとシステムの両方で)。サムネイルを同じ方法でサイズ変更したり、異なる角度で画像を回転したり、テキストで同じことをしたりすることはできません。
このキャプチャのほとんどすべてが既に実装されています。 このスクリプトは通常のGDを使用しますが、imagickで書き換えることができます-さらに多くの可能性があります(たとえば、GDは画像の特定のコーナーで回転するための通常の機能を持ちません)。 突然、誰かが興味を持ったら、次の記事で説明付きでソースをレイアウトできます(PHP 5.3)。
UPD1:
パス統計:
- 50.9%-正常に完了しました
- 1.2%-時間が来ました
- 47.9%-間違っている
合計サンプル(現在):12,627
ユニークビジター:約6,000
すぐにコメンテーターのアドバイスでキャプチャを更新します( たとえば、これ )。その後、統計をリセットします。