上篇博文寫到爬取教務系統擷取資訊時,登入時的驗證碼是手動輸入的,是以就想試試能不能自别識别驗證碼并填充。查閱了很多資訊,選取了Tesseract。
What is Tesseract ?
Tesseract是能夠運作在多種作業系統上的開源ORC(Optical Character Recognition , 光學字元識别)引擎,目前由Google維護,是最精确的開源ORC引擎之一。與Microsoft Office Document Imaging(MODI)相比,我們可以不斷地訓練,使圖像轉換文本的能力不斷增強;如果團隊深度需要,還能以它為模闆,開發出符合自身需求的OCR引擎。
How to use Tesseract
1. 安裝
ubuntu 下可以直接進行安裝
安裝圖像解析的包
sudo apt-get install libpng12-dev
sudo apt-get install libjpeg62-dev
sudo apt-get install libtiff4-dev
檢視是否安裝成功
limeng@KID:~$ tesseract --version
tesseract .-beta.--g607e
leptonica-.
libjpeg b (libjpeg-turbo .) : libpng . : libtiff . : zlib . : libwebp . : libopenjp2 .
Found AVX2
Found AVX
Found SSE
其他發行版參考GitHub教程:https://github.com/tesseract-ocr/tesseract/wiki
2. 使用
tesseract imagename|imagelist|stdin outputbase|stdout [options...] [configfile...]
以下内容為本人自己翻譯,有可能不準确,有能力直接看英文使用手冊即可。
OCR 的一些參數:
參數 | 作用 |
---|---|
-l LANG[+LANG] | 指定ORC使用的語言。 |
-c VAR=VALUE | 指定一些配置,支援多組-c參數。 |
–psm N | 指定分割模式。 |
–oem N | 指定OCR引擎模式。 |
–tessdata-dir PATH | 指定tessdata的位置。 |
–user-words PATH | 指定user words file的位置。 |
–user-patterns PATH | 指定patterns file的位置。 |
注意: 選項的使用要在任何配置檔案前。
頁面分割的模式:
code | function |
---|---|
隻做方向和腳本的檢測 (OSD)。 | |
1 | 使用OSD自動分割。 |
2 | 自動分割,但不是用OSD或OCR。 |
3 | 完全自動分割,但不是用OSD。(預設情況) |
4 | 假定是可變大小的單列文本。 |
5 | 假定是個包含垂直對齊文本的整齊的塊。 |
6 | 假定是個整齊的塊。 |
7 | 把圖像視為一行文字。 |
8 | 把圖像視為單個單詞。 |
9 | 将圖像視為圓圈中的單個單詞。 |
10 | 把圖像視為單個字元。 |
11 | 稀疏文字,找到盡可能多的文本,不以特定的順序。 |
12 | 稀疏文字,利用OSD處理。 |
13 | 原生線,通過傳遞Tesseract特殊的資訊把圖像視為單一的文本行。 |
OCR 引擎模式:
code | function |
---|---|
隻用傳統引擎 | |
1 | 隻用神經網絡LSTM引擎 |
2 | 傳統 + LSTM 引擎 |
3 | 預設(預設),基于有哪個引擎 |
在網上找了一個比較好識别的圖檔,如下:
識别結果如下:
limeng@KID:~/Desktop$ tesseract test.jpg result -l eng --psm digits
Tesseract Open Source OCR Engine v4..-beta.--g607e with Leptonica
limeng@KID:~/Desktop$ cat result.txt
因為沒有對圖檔灰階化、二值化、降噪等處理,直接識别不能保證很準确。
在程式中使用
直接用調用上面用到的指令
//OCR的使用是以指令方式調用
public static String getImgText(String imgPath) {
String result = "";
BufferedReader br = null;
//識别語言
String ocrLangData = "-l eng";
String outPath = imgPath.substring(, imgPath.lastIndexOf("."));
File file = new File(outPath + ".txt");
try {
//終端執行
Runtime runtime = Runtime.getRuntime();
String command = "tesseract " + imgPath + " " + outPath +" "+ ocrLangData +" digits";
Process ps = runtime.exec(command);
ps.waitFor();
//讀取檔案
br = new BufferedReader(new FileReader(file));
String temp = "";
StringBuffer sb = new StringBuffer();
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
//儲存識别結果
result = sb.toString();
} catch (Exception e) {
System.out.println("識别圖檔異常!");
e.printStackTrace();
}finally{
try {
br.close();
file.delete();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
Summary
自己以前并沒有接觸過模式識别過一塊,隻稍微了解了一下,看了李飛飛(斯坦福計算機視覺實驗室負責人)在TED的演講,感覺如何研究計算機識别圖檔并了解圖檔是蠻有趣的,但是感覺自己差很多東西,畢竟自己沒有接觸過AI(Artificial Intelligence)和深度學習(Deep learning)等。
以前總感覺它們太遙遠,其實就在我們身邊。
References
Tesseract-Wikipedia(software)
GitHub中Tesseract的Wiki
Tesseract的man手冊