私はすでにそのようなことを扱っていますが、そのような規模ではありません。 GNU / Bash 、 imagemagickおよびTesseract -ocrのみを使用して57%の認識効率を得る方法に興味がある場合は、catへようこそ。
以下の手順は、他の同様の弱いキャプチャ用に簡単に変更できます。
エントリー
キャプチャ画像自体の認識は、正確に2つの段階に分けることができます。
- 写真の準備。 これには、imagemagickを使用します
- 文字認識。 この場合、私はTesseractを選択しましたが、より単純なキャプチャ(ターンなし、ブレークなし)では、たとえばocradを使用できます。
画像を取得して結果を送信するには、curl(またはwgetを使用しますが、私はそれと友達を作りませんでした)を使用して簡単に実行できます。
画像の準備
ImageMagickには、特殊効果を作成するためのFx言語が組み込まれています。 レジストリcaptchaの文字は常に黒であるため、黒ではないものをすべて削除するスクリプトの最も単純なバージョンは次のようになります。
convert file.png -colorspace cmyk -fx 'k * (k >= 1.0)' file.ppm
実行には10分の1秒かかりますが、これは許容範囲です。 ただし、画質はそうではないため、もう一度確認する必要があります。 文字が線で触れられた場合、この場所では、2つの反対側からピクセルシェーディングされた隣人が一度に存在するはずであるという事実に頼ることができます。
convert file.ppm -colorspace cmyk -fx 'k || (p[-1].k && p[+1].k) || (p[0,-1].k && p[0,+1].k)' out.ppm
さらに半秒間犠牲にするものは何ですか。 後で判明するように、これにより成功率が1%から22%に増加します(100枚のコントロール画像で)。
文字認識
まだ簡単です。 写真にテセラクトを毒し、ファイルから結果を取得します。 必要に応じて、captchaフォントを別の言語として教えることもできますが、ゲームはろうそくに値しません。
tesseract out.ppm result -psm 8 nobatch digits 2>/dev/null res=$(cat result.txt | sed -e 's/[^0-9]//g')
フィールドテスト
上で言ったように、この組み合わせは100枚のテスト画像のうち22枚に正しい答えを与えました。 しかし、テストは面白くなく、実際の条件で作業の速度をチェックすることにしました。
メインスクリプト
#!/bin/bash c=$(curl -c cook.txt http://zapret-info.gov.ru/ | iconv -f cp1251 | grep capcha | sed -e 's/"/\n/g' | grep services) url="http://zapret-info.gov.ru$c" r=work01 #get curl -b cook.txt "$url" > "$r.png" #prepare convert $r.png -colorspace cmyk -fx 'k * (k >= 1.0)' $r.png convert $r.png -colorspace cmyk -fx 'k || (p[-1].k && p[+1].k) || (p[0,-1].k && p[0,+1].k)' $r.png #exterminate tesseract $r.png $r -psm 8 nobatch digits res=`cat $r.txt | sed -e 's/[^0-9]//g'` #check if [ "$(echo $res | wc -c)" -ne 9 ]; then echo fail && exit fi #send code=$(echo $c | sed -e 's/[^0-9]//g') fin=`curl -b cook.txt -d "act=search&secretcodeId=$code&searchstring=ya.ru&secretcodestatus=$res" 'http://zapret-info.gov.ru/'| iconv -f cp1251` if echo "$fin" | grep -q ' '; then echo succ else echo tesfail fi rm $r.png $r.txt cook.txt
ラッパー
#!/bin/bash score=0 all=0 while [ "$score" -lt 41 ]; do r=`bash per.sh 2>/dev/null` [ "$r" = 'succ' ] && let score++ let all++ echo "$score/$all; $r" done
発射ライン
time bash tt.sh | tee -a log.txt
結果、統計
上記のスクリプトセットは、レジストリにya.ruが存在するかどうかを41回正常にチェックします。 それに関するいくつかの統計:
: 41 : 218 : 5 4 (5m4.178s) : 19% , : 57% : 33% : 12%
改善する方法
- 1つの画像でさまざまなキャプチャを取得し、1つの画像を何度も取得できます。 使用できます。
- 通常の実証済みの方法を使用すると、非常に優れた効率を得ることができます。
- または、Tesseractにcaptchaフォントを教えるだけです。 フォント自体はArialに似ていますが、tesseractは常に3と8、1と7を混同します。
- 情報検索の最適化:スクリプトの時間の大部分は、サーバーからページと写真を受信するために費やされます。