マシンビジョンと検証コードの認識

マシンビジョン

Googleのドライバーレスの車から、偽造紙幣を認識する自動販売機まで、マシンビジョンは常に多彩で広範な影響と壮大なビジョンの領域でした。

マシンビジョンの一分野である、テキスト認識、いくつかのPythonライブラリを使用してオンラインイメージのテキストを識別して使用する方法を紹介します。

写真のテキストを簡単に読むことはできますが、写真を読むのは非常に難しいですが、人間のユーザーは通常読むことができますが、ほとんどのロボットは読むことができないため、CAPTCHAが表示されます。 。 検証コードを読むことの難しさもまた非常に異なり、いくつかの検証コードは他のものよりも読みにくい。

画像をテキストに翻訳することは、一般に光学式文字認識(OCR)と呼ばれる。 現在、多くのライブラリはいくつかの一般的な基礎となるOCRライブラリを使用しています。また、それらを上にカスタマイズすることもできます。

ORCライブラリの概要

Pythonは、画像の読み取りや処理、画像に関連する機械学習、画像の作成などのタスクに常に最適な言語です。 画像処理には多くのライブラリがありますが、ここではTesseract

テッサラクト

Tesseractは、Googleが現在スポンサーを務めているOCRライブラリです(GoogleはOCRや機械学習技術でも知られている会社です)。 Tesseractは現在、最も正確で最も正確なオープンソースのOCRシステムとして認識されています。 高精度に加えて、Tesseractは柔軟性も高くなっています。 それはトレーニングによって任意のフォントを識別し、任意のUnicode文字を認識することができます。

Tesseractをインストールする

Windowsシステム

実行可能なインストールファイルをダウンロードする Https://code.google.com/p/tes…install

Linuxシステム

apt-getでインストールできます: $sudo apt-get tesseract-ocr

Mac OS Xシステム

ホームブリューを使用する( Http://brew.sh/ )や他のサードパーティのライブラリを簡単にインストールすることができますbrew install tesseract

下の例の文字を認識するためのトレーニングプログラムなどのTesseractの機能を使用するには、最初に新しい環境変数$ TESSDATA_PREFIXをシステムに設定し、Tesseractにトレーニングデータファイルが格納されている場所を知らせてから、テスデータデータファイルを作成しTesseractディレクトリに移動します。

ほとんどのLinuxシステムとMac OS Xシステムでは、これを行うことができます: $export TESSDATA_PREFIX=/usr/local/share/Tesseract

Windowsシステムと同様に、次のコマンドを実行して環境変数を設定できます。 #setx TESSDATA_PREFIX C:\Program Files\Tesseract OCR\Tesseract

pytesseractをインストール

TesseractはPythonのコマンドラインツールであり、import文でインポートされたライブラリではありません。 インストール後、tesseractコマンドを使用してPython以外で実行しますが、PythonバージョンのTesseractライブラリをpip経由でインストールできます。

 pip install pytesseract

仕様へのテキストの処理

作業したいテキストのほとんどは比較的クリーンでフォーマットされています。 書式指定テキストは通常​​、いくつかの要件を満たすことができますが、正確には「書式混乱」とは何か、「書式指定」は人によって異なります。 一般に、書式指定のテキストには次のような特徴があります。

標準的なフォントを使用します(手書き、筆記体、または非常に派手なフォントは使用しないでください)。•コピーや写真撮影は行われますが、フォントはまだ非常に明瞭です。余分な痕跡や汚れはきちんと並べられていません。不完全さはありません。また、イメージの前処理中にイメージのエッジに密接に関連しているいくつかの書式設定の問題を解決できます。 たとえば、画像をグレースケール画像に変換したり、明るさとコントラストを調整したり、必要に応じてトリミングや回転を行うことができます(詳細は画像と信号処理を参照してください)。いくつかの制限。

書式指定テキストの理想的な例

次のコマンドでTesseractを実行し、ファイルを読み込み、その結果をテキストファイルに書き込みます。 `tesseract test.jpg text

Cat text.txtに結果が表示されます。

認識結果は正確ですが、記号^と*は二重引用符と一重引用符でそれぞれ表されます。 一般的に、あなたはそれを楽に読むことができます。

Pythonコードで実装

import pytesseract
from PIL import Image

image = Image.open('test.jpg')
text = pytesseract.image_to_string(image)
print text

実行結果:

これはArialで書かれたテキストで、
Tesseract。いくつかの記号があります:!@#$% "&*()
イメージにスレッシュホールドフィルタリングとノイズリダクションを実行する(学習する)

何度も、私たちはそのような写真をオンラインで見るでしょう:

Tesseractはこの画像を完全に扱うことができません。主に、画像の背景色が徐々に変化し、最終結果が次のようになるためです。

背景色が左から右に向かって深くなるにつれて、テキストは認識するのがますます困難になり、Tesseractによって識別される各行の最後の数文字は間違っています。

このような問題が発生した場合は、最初にPythonスクリプトでイメージをクリーンアップすることができます。 Pillowライブラリを使用して、グラデーションの背景色を削除するための閾値フィルタを作成し、テキストのみを残して、Tesseractが読みやすくするように画像をより明瞭に簡単にできます。

from PIL import Image 
import subprocess

def cleanFile(filePath, newFilePath): 
    image = Image.open(filePath)

    # 对图片进行阈值过滤,然后保存
    image = image.point(lambda x: 0 if x<143 else 255)     
    image.save(newFilePath)

    # 调用系统的tesseract命令对图片进行OCR识别     
    subprocess.call(["tesseract", newFilePath, "output"])

    # 打开文件读取结果
    file = open("output.txt", 'r')     
    print(file.read()) 
    file.close()

cleanFile("text2.jpg", "text2clean.png")
通过一个阈值对前面的“模糊”图片进行过滤的结果


一部の句読点がはっきりしないか失われていることを除いて、ほとんどの文章が読まれました。 Tesseractが最良の結果をもたらします:

サイトイメージからテキストを取得する

Tesseractを使用してハードドライブ上の画像のテキストを読むことはあまり面白くないかもしれませんが、Webクローラーと組み合わせると強力なツールになります。

サイト上の画像は意図的に(レストランメニューのJPG画像上のアートワードのように)気に入らないかもしれませんが、その上のテキストはWebクローラーから隠されています。

Amazonのrobots.txtファイルでは、ウェブサイトの商品ページをクロールすることができますが、通常、書籍のプレビューページはWebロボットによって収集されることはできません。

プレビュー・イメージはdivノードの下に隠されていますが、通常の訪問者はイメージ・ファイルよりもFlashアニメーションのように見えます。 もちろん、絵を手に入れることができても、それをテキストとして読むのは簡単ではありません。

次の手順では、この問題を解決します。まず、TolstoyのWar and Peaceの大きな印刷版に移動し、リーダーを開き、画像のURLリンクを収集し、画像をダウンロードし、画像を識別し、画像のテキスト。 このプログラムは非常に複雑なので、これまでの章の複数の部分を利用しているので、各コードの目的を明確にするためにいくつかのコメントを追加しました。

import time
from urllib.request import urlretrieve 
import subprocess
from selenium import webdriver
#创建新的Selenium driver
driver = webdriver.PhantomJS()

# 用Selenium试试Firefox浏览器:
# driver = webdriver.Firefox()

driver.get("http://www.amazon.com/War-Peace-Leo-Nikolayevich-Tolstoy/dp/1427030200")
# 单击图书预览按钮 driver.find_element_by_id("sitbLogoImg").click() imageList = set()
# 等待页面加载完成
time.sleep(5)
# 当向右箭头可以点击时,开始翻页
while "pointer" in driver.find_element_by_id("sitbReaderRightPageTurner").get_attribute("style"):
    driver.find_element_by_id("sitbReaderRightPageTurner").click()
    time.sleep(2)
    # 获取已加载的新页面(一次可以加载多个页面,但是重复的页面不能加载到集合中) 
    pages = driver.find_elements_by_xpath("//div[@class='pageImage']/div/img") 
    for page in pages:
        image = page.get_attribute("src")
        imageList.add(image)
driver.quit()

# 用Tesseract处理我们收集的图片URL链接 
for image in sorted(imageList):
    # 保存图片
    urlretrieve(image, "page.jpg")
    p = subprocess.Popen(["tesseract", "page.jpg", "page"], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    f = open("page.txt", "r")
    p.wait() print(f.read())

このプログラムでは、Tesseractで読んだときと同じように、本書の長い段落を完全に印刷します.6ページ目のプレビューは次のとおりです。

6

 "A word of friendly advice, mon
 cher. Be off as soon as you can,
 that's all I have to tell you. Happy
 he who has ears to hear. Good-by,
 my dear fellow. Oh, by the by!" he
 shouted through the doorway after
 Pierre, "is it true that the countess
 has fallen into the clutches of the
 holy fathers of the Society of je-
 sus?"

 Pierre did not answer and left Ros-
 topchin's room more sullen and an-
 gry than he had ever before shown
 himself.

ただし、色付きの表紙にテキストが表示された場合、結果は完全ではありません。

平和
Len Nlkelayevldu Iolfluy
Readmg shmddはaxです
Wnnvame asnossxble Wenfler
私たちの塾:Llhvary

- Leo Tmsloy was a Russian rwovelwst
I and moval phflmopher med lur
A ms Ideas 01 nonviolenx reswslance m 5 We range     0, "and"

テキストを普通の人々が理解できる効果に加工したい場合は、それに対処するには多くの時間がかかります。

次のセクションでは、テキストの混乱の問題を解決する別の方法を紹介します。特に、Tesseractを少し時間をかけて喜んで学習してください。

Tesseractに既知のテキストと画像マップの大量のコレクションを提供することで、Tesseractは同じフォントを認識し、非常に高い精度と精度を実現し、画像の背景色やテキストの相対性を無視することもできます。場所とその他の問題。
ナレッジネットワーク認証コードを処理してみましょう:

多くの一般的なコンテンツ管理システムは、認証コードモジュールを使用していても、ウェブロボットによるスパム登録に苦しんでいることがよくあります。

これらのネットワークロボットはどのように動作しますか?コンピュータに保存されている認証コードがわかったので、多機能なネットワークロボットはどのように実現できますか?

ほとんどのウェブサイトで生成されたキャプチャ画像には、次のような特性があります。

これらは、サーバー側プログラムの動的に生成されたイメージです。 キャプチャ画像のsrc属性は、<img src = "WebForm.aspx?id = 8AP85CQKE9TJ">のように通常の画像と同じではありませんが、他の画像と同様にダウンロードして処理することができます。
画像への回答は、サーバー側のデータベースに格納されます。
多くの認証コードには時間制限があります。長すぎると解決しないと失敗します。
一般的に使用される処理方法は、まず検証コードイメージをハードディスクにダウンロードし、クリーンアップし、次にTesseractを使用してイメージを処理し、最後にウェブサイトの要件を満たす認識結果を返すことです。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
import time
import pytesseract
from PIL import Image
from bs4 import BeautifulSoup

def captcha(data):
    with open('captcha.jpg','wb') as fp:
        fp.write(data)
    time.sleep(1)
    image = Image.open("captcha.jpg")
    text = pytesseract.image_to_string(image)
    print "机器识别后的验证码为:" + text
    command = raw_input("请输入Y表示同意使用,按其他键自行重新输入:")
    if (command == "Y" or command == "y"):
        return text
    else:
        return raw_input('输入验证码:')

def zhihuLogin(username,password):

    # 构建一个保存Cookie值的session对象
    sessiona = requests.Session()
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0'}

    # 先获取页面信息,找到需要POST的数据(并且已记录当前页面的Cookie)
    html = sessiona.get('https://www.zhihu.com/#signin', headers=headers).content

    # 找到 name 属性值为 _xsrf 的input标签,取出value里的值
    _xsrf = BeautifulSoup(html ,'lxml').find('input', attrs={'name':'_xsrf'}).get('value')

    # 取出验证码,r后面的值是Unix时间戳,time.time()
    captcha_url = 'http://photo.itmeseji.com/wp-content/uploads/2018/11/93c79def-20181112193228-5be9d54c6feb9.gif?r=%d&type=login' % (time.time() * 1000)
    response = sessiona.get(captcha_url, headers = headers)


    data = {
        "_xsrf":_xsrf,
        "email":username,
        "password":password,
        "remember_me":True,
        "captcha": captcha(response.content)
    }

    response = sessiona.post('https://www.zhihu.com/login/email', data = data, headers=headers)
    print response.text

    response = sessiona.get('https://www.zhihu.com/people/maozhaojun/activities', headers=headers)
    print response.text


if __name__ == "__main__":
    #username = raw_input("username")
    #password = raw_input("password")
    zhihuLogin('xxxx@qq.com','ALAxxxxIME')

このプログラムが失敗する原因となる2種類の異常条件があることは注目に値する。 最初のケースでは、Tesseractがcaptchaピクチャの結果が4文字ではないことを認識した場合(トレーニングサンプルのキャプチャに対するすべての有効な回答が4文字でなければならないため)、結果は提出されず、プログラムは失敗します。 2番目のケースでは、認識の結果は4文字ですが、フォームに送信されますが、サーバーは結果を認識せず、プログラムはまだ失敗します。

実際の実行プロセスでは、最初の状況が発生する確率は約50%です。プログラムが実行されると、プログラムはフォームに送信されず、プログラムは直接終了し、エラーを識別するために確認コードを入力します。 第2の異常が発生する確率は約20%であり、4文字すべてをペアリングする確率は約30%である(各文字の認識精度は約80%であり、5文字で認識される場合、正しい確率は32.8%)。
トレーニングTesseract

他のほとんどの認証コードは比較的単純です。 たとえば、一般的なPHPコンテンツ管理システムDrupalには、さまざまな難易度のキャプチャを生成できる、よく知られているcaptchaモジュール( https://www.drupal.org/projec …)があります。

だから、この認証コードは、他の認証コードよりも人間や機械で読みやすくなります。

文字は、互いに重なり合わず、水平方向には交差しない。 つまり、重複することなく各文字の外側にボックスを描くことができます。
画像に背景色、線、またはOCRプログラムを妨害する他のノイズはありません。
この確認コードでは、画像では判別できませんが、少数のフォントを使用し、サンセリフフォント(「4」や「M」など)と手書きフォント(「m」など)を使用しますC "および" 3 ")。
白い背景色と暗い文字のコントラストは非常に高いです。
この確認コードは少ししか変更されていないため、OCRプログラムを識別することが困難です。

文字とデータの両方を使用するため、検索する文字数が増えます。
文字のランダムな傾きはOCRソフトウェアを混乱させるが、人間はまだ容易に識別可能である。
見知らぬ手書きのフォントは、 "C"と "3"に余分な行を入れて、非常に挑戦的です。 この非常に小さい小文字の "m"に加えて、コンピュータは識別するために追加の訓練を必要とします。 Tesseractを実行して、次のコードでイメージを識別します。
Tesseract captchaExample.png出力

出力結果は次のようになります。4N ,,, C <3

トレーニングTesseract

Tesseractがテキストの種類を認識するように訓練するには、それが不明瞭なフォントであろうと、キャプチャであろうと、Tesseractに別の形式の各文字のサンプルを提供する必要があります。

この退屈な仕事をするには数時間かかることがあります。この時間を使って見栄えの良いビデオや映画を探したい場合があります。 まず、多数の確認コードサンプルをフォルダにダウンロードします。

ダウンロードされたサンプルの数は、検証コードの複雑さによって決まり、トレーニングセットに合計100サンプルを入れます(合計500文字、1文字あたり平均8サンプル、大文字と小文字の両方に0〜9の数字、合計62文字)、それはトレーニングのために十分でなければなりません。

ヒント:実際の検証コードの結果を使用して、各サンプルファイル(4MmC3.jpgなど)の名前を付けることをお勧めします。 これは一度にたくさんのファイルをすばやく確認するのに役立ちます。最初に画像をサムネイルモードにしてから、別の画像をファイル名で比較することができます。 これにより、後のステップでトレーニング効果を確認することが容易になります。

第2のステップは、絵の中の各文字が何であるか、そして各文字の正確な位置をTesseractに正確に伝えることです。 ここでは、長方形のファイル(ボックスファイル)、長方形の位置決めファイルを生成するためのキャプチャ画像を作成する必要があります。 画像の長方形の位置決めファイルは次のようになります:

  4 15 26 33 55 0
  M 38 13 67 45 0
  m 79 15 101 26 0
  C 111 33 136 60 0
  3 147 17 176 45 0

最初の列シンボルはピクチャ内の各文字で、次の4つの数字は文字を囲む最小の長方形の座標です(ピクチャの左下隅は原点(0,0)です).4つの数字は各文字の左下隅に対応します。 x座標、左下角y座標、右上角x座標、右上角y座標であり、最後の数字「0」は画像サンプルの番号を示す。

明らかに、これらのイメージ矩形位置決めファイルを手動で作成するのは退屈ですが、あなたを助けるツールがいくつかあります。 私はオンラインツールTesseract OCR Chopperが本当に好きです( Http://pp19dd.com/tesseract-o … )、それはインストールする必要はないので、実行するブラウザがあり、使用法が非常に単純である限り、他の依存関係はありません:画像をアップロードし、新しい矩形を追加する場合は、ボタンを追加すると、必要に応じて矩形のサイズを調整し、最終的に新しく生成された矩形位置決めファイルを新しいファイルにコピーすることもできます。

長方形の位置決めファイルは、.box接尾辞付きのテキストファイルに保存する必要があります。 イメージファイルと同様に、テキストファイルには、検証コードの実際の結果(たとえば、4MmC3.box)の名前が付けられます。 また、.boxファイルの内容とファイル名を簡単に確認することができ、ファイル名でディレクトリ内のファイルを並べ替えた後、.boxファイルの実際の結果を対応するイメージファイルと比較することができます。

トレーニングデータが十分にあることを確認するために、約100個の.boxファイルを作成する必要があります。 Tesseractは読み込めないファイルを無視するので、十分な訓練を確保するためにできるだけ多くの長方形の位置決めファイルを作成することをお勧めします。 トレーニングOCRの結果があなたの目標を満たしていないと感じた場合、またはTesseractが特定の文字を認識した場合、それは常に間違いです。トレーニングデータを作成して再トレーニングするのは良い改善です。

.boxファイルとイメージファイルでいっぱいのデータフォルダを作成した後は、このフォルダをバックアップしてから解析を行うことをお勧めします。 トレーニングプログラムをデータ上で実行するとデータを削除することはできませんが、.boxファイルを作成するには数時間かかります。来るのは難しいので、常に安全です。 さらに、コンパイルされたデータでいっぱいのいたずらなディレクトリをつかんで、もう一度やり直すことができるのは常に良いことです。

前のセクションでは、Tesseractライブラリの強力なフォントトレーニングと認識機能の概要を説明します。 Tesseractの他のトレーニング方法に興味があり、独自のコード証明書訓練ファイルライブラリを構築しようと計画している場合、または世界中のTesseractファンと新しいフォントを認識したい場合は、Tesseractのドキュメントを参照することをお勧めします。https: //github.com/tesseract-… 、来て!

元のリンク