PHP OCR の練習: Tesseract を使用して画像からテキストを読み取る

WBOY
リリース: 2016-06-23 13:18:48
オリジナル
1634 人が閲覧しました

プログラミング

PHP OCR の練習: Tesseract を使用して画像からテキストを読み取る

光学文字認識 (OCR) は、印刷されたテキストをデジタル表現に変換するプロセスです。印刷された書籍のデジタル化や領収書の電子記録の作成から、ナンバー プレートの認識、さらには画像ベースのキャプチャの解読まで、さまざまな実用的な用途があります。

安心 2016/01/15

Tesseract は OCR を実現できるオープンソースプロジェクトです。このプロジェクトは *Nix システム、Mac システム、Windows システムで実行できますが、ライブラリを使用することで PHP プロジェクトでも使用できます。このチュートリアルの目的は、その使用方法を教えることです。

インストール

準備

物事をシンプルかつ一貫性を保つために、アプリケーションを実行するために仮想マシン (この記事では Vagrant を使用します) を使用します。これには、PHP と Nginx のインストールが含まれます。プロセスを個別に説明します。既存の Debian ベースのシステムに自分で Tesseract をインストールする場合は、次のセクションをスキップするか、他の *nix、Mac、または Windows システムでのインストール手順について README を確認してください。このチュートリアルに従うように Vagrant を設定するには、次の手順を実行します。または、単に Github からコードを取得することもできます。

次のコマンドを入力して Homestead Enhanced Vagrant をダウンロードし、orc という名前のフォルダーに構成します:

git clone https://github.com/Swader/homestead_improved ocr
ログイン後にコピー
Nginx 構成ファイル Homestead.yml 内の次のコードを変更します:

sites:    - map: homestead.app      to: /home/vagrant/Code/Project/public
ログイン後にコピー

を次のように変更します:

sites:    - map: homestead.app      to: /home/vagrant/Code/public
ログイン後にコピー

hosts ファイルにも追加

192.168.10.10       homestead.app
ログイン後にコピー

Tesseract をインストールします

次のステップは Tesseract をインストールすることです

Homestead 改良版は debian を使用しているため、vagrant ssh を使用して仮想マシンにログインした後、apt-get を使用してインストールできます:

sudo apt-get install tesseract-ocr
ログイン後にコピー
上記のように、README には他のオペレーティング システム固有のチュートリアルもあります。

インストールのテストとカスタマイズ

PHP ラッパーを使用しますが、その前にコマンド ラインから Tesseract をテストできます。

まずこの画像sign.pngを保存します

仮想マシンで次のコマンドを実行して画像からテキストを読み取ります

tesseract sign.png out
ログイン後にコピー

これにより、現在のフォルダーにファイルが作成されます: out.txt 次の単語があるはずです: 注意

次に、sign2.jpg を試してください。

tesseract sign2.jpg out
ログイン後にコピー

今回は、Einbahnstral'ie という単語が生成されます。近いですが不正解です。画像内のテキストは非常に鮮明ですが、文字 ß を認識できません。

Tesseract が文字列を正しく読み取るためには、いくつかの新しい言語ファイル (この場合はドイツ語) をインストールする必要があります。

利用可能な言語ファイルの包括的なリストがここにありますが、必要なものだけをダウンロードしましょう:

wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.deu.tar.gz
ログイン後にコピー

解凍:

tar zxvf tesseract-ocr-3.02.deu.tar.gz
ログイン後にコピー

次に、ファイルを次のようなディレクトリにコピーします:

/usr/share/tesseract-ocr/tessdata
ログイン後にコピー

たとえば、

cp deu-frak.traineddata /usr/share/tesseract-ocr/tessdatacp deu.traineddata /usr/share/tesseract-ocr/tessdata
ログイン後にコピー

元のコマンドを再度実行しますが、-l

tesseract sign2.jpg out -l deu
ログイン後にコピー
を使用します

「deu」はドイツ語の ISO 639-3 コードです

今回のテキストは Einbahnstraße (正しい) である必要があります。

上記のプロセスを繰り返すことで、任意の言語を使用することができます。

アプリケーションの設定

PHP で Tesseract を使用するためにこのライブラリを使用します。

シンプルな Web アプリケーションを構築します。ユーザーは画像をアップロードし、OCR 処理の結果を表示します。これを実現するために、Silex マイクロフレームワークを使用します。アプリ自体はシンプルなので、慣れていなくても心配する必要はありません。

このチュートリアルのコードはすべて Github で入手できることに注意してください。

最初のステップは、Composer を使用して依存ファイルをインストールすることです:

composer require silex/silex twig/twig thiagoalessio/tesseract_ocr:dev-master
ログイン後にコピー

次に 3 つのフォルダーを作成します:

- public- uploads- views
ログイン後にコピー

フォーム (vi ewsindex.twig) をアップロードする必要があります:

<html>  <head>    <title>OCR</title>  </head>  <body>    <form action="" method="post" enctype="multipart/form-data">      <input type="file" name="upload">      <input type="submit">    </form>  </body></html>
ログイン後にコピー

結果表示ページ (viewsresults. twig) ::

<html>  <head>    <title>OCR</title>  </head>  <body>    <h2>Results</h2>    <textarea cols="50" rows="10">{{ text }}</textarea>    <hr>    <a href="/">← Go back</a>  </body></html>
ログイン後にコピー

次に、スケルトン Silex アプリ (publicindex.php) を作成します:

<?php require __DIR__.'/../vendor/autoload.php'; use Symfony\Component\HttpFoundation\Request; $app = new Silex\Application(); $app->register(new Silex\Provider\TwigServiceProvider(), [  'twig.path' => __DIR__.'/../views',]);$app['debug'] = true; $app->get('/', function() use ($app) {   return $app['twig']->render('index.twig');}); $app->post('/', function(Request $request) use ($app) {     // TODO}); $app->run();
ログイン後にコピー

ブラウザーでこのアプリにアクセスすると、ファイル アップロード フォームが表示されるはずです。 Homestead 改良版 Vagrant を使用している場合は、以下のリンクからアプリケーションにアクセスできます。

http://homestead.app/
ログイン後にコピー

次のステップは、ファイルのアップロードを実装することです。 Silex を使用すると、この作業が非常に簡単になります。 $request には、アップロードされたファイルを取得できるファイル コンポーネントが含まれています。コード:

// Grab the uploaded file$file = $request->files->get('upload'); // Extract some information about the uploaded file$info = new SplFileInfo($file->getClientOriginalName());// Create a quasi-random filename$filename = sprintf('%d.%s', time(), $info->getExtension());// Copy the file$file->move(__DIR__.'/../uploads', $filename);
ログイン後にコピー

ご覧のとおり、ファイル名の競合を減らすためにランダムなファイル名を生成します。ただし、この例では、アプリケーションではそうではありません。ファイルにどのような名前を付けるかは関係ありません。ファイルのコピーをローカルに取得したら、Tessearct ライブラリのインスタンスを生成して分析できます:

// Instantiate the Tessearct library$tesseract = new TesseractOCR(__DIR__ . '/../uploads/' . $filename);
ログイン後にコピー

画像への OCR の実装は非常に簡単で、メソッド accept() を呼び出すだけです。

// Perform OCR on the uploaded image$text = $tesseract->recognize();
ログイン後にコピー

最後に、結果ページに結果を表示します:

return $app['twig']->render(    'results.twig',    [        'text'  =>  $text,    ]);
ログイン後にコピー

いくつかの画像で試して、どのように機能するかを確認してください。問題がある場合は、これを参照してください

実践的な例

OCR のより実践的な例を見てみましょう。この例では、画像内でフォーマットされた電話番号を検索しようとしています。

看看下面一幅图,上传到你的应用:

结果应该如下:

:ii‘iCustomer Service HelplinesBritish Airways Helpline09040 490 541
ログイン後にコピー

它没有挑出正文文本,这是我们能料到的,因为图片质量太差。虽然识别了号码但是也有一些“噪声”。

为了提取相关信息,有如下几件事我们可以做。

你可以让Tesseract 把它的结果限制在一定的字符集内,所以我们告诉它只返回数字型的内容代码如下:

$tesseract->setWhitelist(range(0,9));
ログイン後にコピー

但这样有个问题。它常常把非数字字符解释成数字而非忽略它们。比如“Bob”可能被解释称数字“808”。

所以我们采用两步处理。

  • 尝试提取可能是电话号码的数字串。
  • 用一个库轮流评估每一个候选字符,一旦找到一个有效电话号码则停止。

第一步,我们可以用一个基本的正则表达式。可以用 谷歌电话库 来确定一个数字串是否是合法电话号码。

备注:我已在Sitepoint 写过关于 谷歌电话库的内容 。

让我们给谷歌电话库添加一个PHP 端口,修改composer.json,添加:

"giggsey/libphonenumber-for-php": "~7.0"
ログイン後にコピー

别忘了升级:

composer update
ログイン後にコピー

现在我们可以写一个函数,输入为一个字符串,尝试提取一个合法的电话号码

/** * Parse a string, trying to find a valid telephone number. As soon as it finds a  * valid number, it'll return it in E1624 format. If it can't find any, it'll  * simply return NULL. *  * @param  string   $text           The string to parse * @param  string   $country_code   The two digit country code to use as a "hint" * @return string | NULL */function findPhoneNumber($text, $country_code = 'GB') {  // Get an instance of Google's libphonenumber  $phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();  // Use a simple regular expression to try and find candidate phone numbers  preg_match_all('/(\+\d+)?\s*(\(\d+\))?([\s-]?\d+)+/', $text, $matches);  // Iterate through the matches  foreach ($matches as $match) {    foreach ($match as $value) {      try {        // Attempt to parse the number        $number = $phoneUtil->parse(trim($value), $country_code);            // Just because we parsed it successfully, doesn't make it vald - so check it        if ($phoneUtil->isValidNumber($number)) {          // We've found a telephone number. Format using E.164, and exit          return $phoneUtil->format($number, \libphonenumber\PhoneNumberFormat::E164);        }      } catch (\libphonenumber\NumberParseException $e) {        // Ignore silently; getting here simply means we found something that isn't a phone number      }    }  }  return null;}
ログイン後にコピー

希望注释能解释这个函数在干什么。注意如果这个库没能从字符串中解析出一个合法的电话号码它会抛出一个异常。这不是什么问题;我们直接忽略它并继续下一个候选字符。

如果我们找到一个电话号码,我们以E.164的形式返回它。这提供了一个国际化的号码,我们可以用来打电话或者发送SMS。

现在我们可以如下使用:

$text = $tesseract->recognize();$number = findPhoneNumber($text, 'GB');
ログイン後にコピー

我们需要给谷歌电话库提供一个提示来说明这个号码是哪个国家的。你也可以改成你自己的国家。

我们把所有的这些打包在一个新的路由中:

$app->post('/identify-telephone-number', function(Request $request) use ($app) {   // Grab the uploaded file  $file = $request->files->get('upload');   // Extract some information about the uploaded file  $info = new SplFileInfo($file->getClientOriginalName());  // Create a quasi-random filename  $filename = sprintf('%d.%s', time(), $info->getExtension());  // Copy the file  $file->move(__DIR__.'/../uploads', $filename);   // Instantiate the Tessearct library  $tesseract = new TesseractOCR(__DIR__ . '/../uploads/' . $filename);  // Perform OCR on the uploaded image  $text = $tesseract->recognize();  $number = findPhoneNumber($text, 'GB');  return $app->json(    [      'number'     =>  $number,    ]  );});
ログイン後にコピー

我们现在有简单的API的基础—-也就是JSON响应-—我们可以用来作为一个简单的移动应用的后端,这款应用可以用来从一幅图中添加联系人,打电话。

总结

OCR有许多应用——并且很容易整合进你的应用(超过你的预期)。本文中,我们安装了开源OCR包;并使用一个包装器库,把它整合进一个非常简单的PHP应用。我们只是触及到了所有可能性的表面,希望这能给你一些想法,帮你想想怎么在你自己的应用中使用OCR。

来自: http://www.codeceo.com/article/php-ocr-tesseract-get-text.html

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート