摘要:實戰用從圖像中讀取文字即光學字符辨識是把打印文本轉換成一個數字表示的過程。可以用谷歌電話庫來確定一個數字串是否是合法電話號碼。現在我們可以如下使用我們需要給谷歌電話庫提供一個提示來說明這個號碼是哪個國家的。
PHP OCR實戰:用Tesseract從圖像中讀取文字
Optical Character Recognition (OCR)即光學字符辨識是把打印文本轉換成一個數字表示的過程。它有各種各樣的實際應用--從數字化印刷書籍、創建收據的電子記錄,到車牌識別甚至破解基于圖像的驗證碼。
Tesseract是一個能實現OCR開源項目。你能在*Nix系統,Mac系統和Windows系統上跑這個項目,但是使用一個庫的話,我們就能在php項目中使用它了。本教程的目的是教你如何使用。
安裝 準備為了讓事情變得簡單和一致的, 我們將使用虛擬機(本文使用Vagrant)來運行應用程序,這會涉及到安裝PHP和Nginx,我們將安裝Tesseract來分別演示過程。如果你想自己基于現有Debian-based系統安裝Tesseract,你可以跳過下一部分—或者查看the README來獲得在其他*nix上,Mac系統或者Windows的安裝指導.
配置Vagrant為了配置Vagrant以跟上本教程,完成如下步驟。或者你也可以簡單的從Github獲得代碼。
輸入以下命令來下載Homestead Improved Vagrant配置到一個文件夾 ocr:
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 Improved 使用debian,我們可以在使用vagrant ssh登陸虛擬機后使用apt-get 來安裝它,簡單如下:
sudo apt-get install tesseract-ocr
正如上文提到的,此處有其他的操作系統對應教程。
測試并定制安裝我們將使用PHP包裝,但是之前我們可以在命令行測試Tesseract。
首先保存這個圖片sign.png (圖片由剪紙藝術熊貓提供)
在虛擬機中,執行如下命令來從圖片中讀取文字
tesseract sign.png out
這將在當前文件夾創建一個文件:out.txt里面應該有單詞:CAUTION
現在嘗試sign2.jpg,連接如下:
https://s3.amazonaws.com/f.cl...
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/tessdata cp 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 microframework 來實現。不要擔心你不熟悉它,這個應用本身很簡單。
記住這篇教程的所有代碼都能在Github上獲得。
第一步是用Composer來安裝依賴文件:
composer require silex/silex twig/twig thiagoalessio/tesseract_ocr:dev-master
然后建立三個文件夾:
- public - uploads - views
我們需要上傳表單(viewsindex.twig):
OCR
需要一個結果展示頁面(viewsresults.twig)::
OCR Results
← Go back
現在建立skeleton Silex app (publicindex.php):
register(new SilexProviderTwigServiceProvider(), [ "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 Improved Vagrant,你可以通過如下鏈接訪問該應用。
http://homestead.app/
下一步是實現文件上傳。Silex使得這項工作非常簡單;
$request包含一個files組件,我們可以通過它來獲得任意上傳的文件,代碼:
// 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相當簡單,我們只需調用方法recognize()。
// Perform OCR on the uploaded image $text = $tesseract->recognize();
最后我們把結果展示到結果頁面:
return $app["twig"]->render( "results.twig", [ "text" => $text, ] );
在一些圖片上嘗試,看看它效果怎樣。如果你有困難,可以參考
一個實際的例子讓我們來看OCR一個更實用的例子。在本例中,我們嘗試在圖像中找到一個格式化的電話號碼。
看看下面一幅圖,上傳到你的應用:
結果應該如下:
:ii‘i Customer Service Helplines British Airways Helpline 09040 490 541
它沒有挑出正文文本,這是我們能料到的,因為圖片質量太差。雖然識別了號碼但是也有一些“噪聲”。
為了提取相關信息,有如下幾件事我們可以做。
你可以讓Tesseract 把它的結果限制在一定的字符集內,所以我們告訴它只返回數字型的內容代碼如下:
$tesseract->setWhitelist(range(0,9));
但這樣有個問題。它常常把非數字字符解釋成數字而非忽略它們。比如“Bob”可能被解釋稱數字“808”。
所以我們采用兩步處理。
嘗試提取可能是電話號碼的數字串。
用一個庫輪流評估每一個候選字符,一旦找到一個有效電話號碼則停止。
第一步,我們可以用一個基本的正則表達式。可以用谷歌電話庫來確定一個數字串是否是合法電話號碼。
備注:我已在Sitepoint 寫過關于谷歌電話庫的內容:文章
讓我們給谷歌電話庫添加一個PHP 端口,修改composer.json,添加:
"giggsey/libphonenumber-for-php": "~7.0"
別忘了升級:
composer update
現在我們可以寫一個函數,輸入為一個字符串,嘗試提取一個合法的電話號碼
function findPhoneNumber($text, $country_code = "GB") { // Get an instance of Google"s libphonenumber $phoneUtil = libphonenumberPhoneNumberUtil::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, libphonenumberPhoneNumberFormat::E164); } } catch (libphonenumberNumberParseException $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。
標記:captcha, ocr, OOPHP, PHP, robot vision, silex, tesseract, twig
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21379.html
摘要:納入深度學習模型來進一步提升準確率只是時間問題,事實上,這個時間已經到來。最新版本支持基于深度學習的,準確率顯著提高。該函數使用基于深度學習的文本檢測器來檢測不是識別圖像中的文本區域。高效使用概率最高的文本區域,刪除其他重疊區域。 By Adrian Rosebrock on September 17, 2018 in Deep Learning, Optical Character ...
閱讀 2922·2021-11-24 09:39
閱讀 3599·2021-11-22 13:54
閱讀 3409·2021-11-16 11:45
閱讀 2432·2021-09-09 09:33
閱讀 3194·2019-08-30 15:55
閱讀 1290·2019-08-29 15:40
閱讀 920·2019-08-29 15:19
閱讀 3396·2019-08-29 15:14