--- GA: G-FFF1L2PEEZ --- # Tesseract 使用&安裝&訓練 ## 簡單驗證碼去噪 灰度二值化 ###### tags: `python` `tessract` `辨識文字` 2024更新 : 剛好在上大型語言模型實作初階課程,可結合 RPA 工具,串接至 LINE 平台,實現上傳健檢報告自動執行文字掃描,並根據狀況回傳有趣的圖片。 <!-- ![image](https://hackmd.io/_uploads/SyYgDZqeJx.png) --> ![image](https://hackmd.io/_uploads/S1BMoZ5gke.png) OpenCV 處理圖片雜訊方式: NYCU 資料科學軟體 2024 Week10: OpenCV & skimage https://www.youtube.com/live/d1fz8nvAkOM?si=DG0n8ZCvNSiGmgXk --- > [TOC] :::info >無意間找到網址是固定的 教育部某平台之簡易驗證碼 ![](https://i.imgur.com/xBEiIlt.png) > 雖然可以爬好幾10xxx張,但是看了資訊安全政策可能會被 ban > 所以弄了一個驗證碼產生器,自製訓練庫, > 好處是可自定義驗證碼形式,本機端即可儲存圖片。 實際操作畫面如下: ![](https://i.imgur.com/ORSlEI8.png) 簡單的製作驗證碼範例: https://ithelp.ithome.com.tw/articles/10159457 > 人工智慧課堂企劃報告後,老師說明有 OCR 這個目前由 Google 維護的識別引擎,用途為可辨識掃描的文件/圖片中的文字 > 老師提供實務上業界的需求,可應用在掃描健檢報告數據,存入資料庫。 **實做起來遇到一些問題微調操作** **所以做個紀錄有了這篇筆記整理** :page_facing_up: ::: > [name=wa.__.wa] > [人工智慧應用課程](http://120.108.221.55/PROFCHWU/dctai/index.php) > [TOC] ## 安裝 Tessract / 語言包: > `homebrew install tesseract-lang` https://formulae.brew.sh/formula/tesseract-lang 語言包一次打包/ 需要的再匯入 /usr/local/Cellar/tesseract/4.x/share/tessdata > `homebrew install tesseract ` https://formulae.brew.sh/formula/tesseract ## 編譯安裝問題: ``` Error: invalid option: --with-training-tools ``` 要安裝訓練模型時,發現 tesseract 最新4.x版本 homebrew 沒有訓練模型相關指令 撰寫文章當下根據網路文章 找到了解決方法需自行編譯 build,make install **參考下列文章(感謝文章作者):** https://juejin.im/post/6844904097863188487 ## 可下載 `python` 的對應模組: ```python pip install pytesseract ``` 並搭配 pillow opencv numpy ![](https://i.imgur.com/Jk2wQ7i.png) 詳細教學: https://lufor129.medium.com/pytesseract-辨識圖片中的文字-b1024f678fac https://blog.csdn.net/huitailangyz/article/details/80390090 ## 查看安裝版本: ```python tesseract 4.1.1 leptonica-1.80.0 libgif 5.2.1 : libjpeg 9d : libpng 1.6.37 : libtiff 4.1.0 : zlib 1.2.11 : libwebp 1.1.0 : libopenjp2 2.3.1 Found AVX2 Found AVX Found FMA Found SSE ``` ![](https://i.imgur.com/HVS8rMt.png) ## 參數設定: 列出可使用的語言包 `tesseract --list-langs` * chi_tra 繁體 * chi_tra_vert 繁體,直排 `tesseract -l test.png test` -l :選擇輸入語言/ 預設是英文 default “eng” --- ### OEM * --oem : OCR Engine modes, 演算法類型 / 目前沒了解這塊用預設 ``` tesseract --help-oem OCR Engine modes: 0 Legacy engine only. 1 Neural nets LSTM engine only. 2 Legacy + LSTM engines. 3 Default, based on what is available. ``` ```htmlembedded 參考文章解釋 为了识别包含单个字符的图像,我们通常使用卷积神经网络(CNN)。任意长度的文本是一系列字符,这类问题可以通过RNNs解决,LSTM是RNN的一种常用形式 ``` ![](https://i.imgur.com/TdxEkRl.png) --- --psm : 判別語句類型模式 / 大陸翻譯:自动页面分割模式 * 0:定向脚本监测(OSD) * 1: 使用OSD自动分页 * 2 :自动分页,但是不使用OSD或OCR * 3 :全自动分页,但是没有使用OSD(默认) * 4 :假设可变大小的一个文本列。 * 5 :假设垂直对齐文本的单个统一块。 * 6 :假设一个统一的文本块。 - [x] 7 :將圖片視為一行文字句子。 - [x] 8 :將圖片視為一個『單字』。 - [x] 9 :將圖像視為『環狀字』。 - [x] 10 :將圖片視為一個『字母』。 參數不懂的沿用參考文章簡體中文翻譯 PSM 參數詳細說明: https://pyimagesearch.com/2021/11/15/tesseract-page-segmentation-modes-psms-explained-how-to-improve-your-ocr-accuracy/ ## 測試 > 執行畫面: ![](https://i.imgur.com/Us8mDqc.png) ![](https://i.imgur.com/Q6Vdk25.png) 簡易驗證碼: ![](https://i.imgur.com/SVxpeYZ.png) 較複雜驗證碼: 登入系統驗證碼 ![](https://i.imgur.com/ScpJvjH.png) 線條干擾誤判斷成 - 符號 ## 預先處理圖片 / 提升辨識度 再來就是要測試一些更難辨識的照片跟訓練了 官方文檔解釋: https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html#image-processing 每個Image都有不同的標記, 需要乾淨能夠辨識標記的物件 OpenCV 套件預先處理圖片 辨識原則: * 至少為300 DPI為最佳 * 白底黑字,字體清晰 * 去噪,灰度圖二值化 轉灰度方式: ![](https://i.imgur.com/z4wqhcP.png) mode 可為下列幾種 <!-- 其中常用到的為 L,1 imgry.mode binary.mode --> ```python · 1 (1-bit pixels, black and white, stored with one pixel per byte) · L (8-bit pixels, black and white) · P (8-bit pixels, mapped to any other mode using a colour palette) · RGB (3x8-bit pixels, true colour) · RGBA (4x8-bit pixels, true colour with transparency mask) · CMYK (4x8-bit pixels, colour separation) · YCbCr (3x8-bit pixels, colour video format) · I (32-bit signed integer pixels) · F (32-bit floating point pixels) ``` opencv 辨識教學 : https://lufor129.medium.com/pytesseract-辨識圖片中的文字-b1024f678fac 常見錯誤: https://zhuanlan.zhihu.com/p/35590364 套件記得載 ![](https://i.imgur.com/Qr4oQwf.png) ```python # opencv 方式讀取圖檔轉灰度 imgcv = cv2.imread('CaptchaImage.jpg', cv2.IMREAD_GRAYSCALE) type(imgcv) cv2.imshow('CaptchaImage', imgcv) cv2.imwrite('output/gray05.tiff', imgcv) cv2.waitKey(0) cv2.destroyAllWindows() ``` <!-- cv2.threshold 常用參數 1. cv2.THRESH_BINARY(黑白兩值) 2. cv2.THRESH_BINARY_INV(黑白二值反轉) 3. cv2.THRESH_TRUNC (得到的圖像為多像素值) 尚待釐清 多像素值定義 --> 灰度轉二值化(去噪): ```python print 'binary mode: ', binary.mode print binary.getpixel((0, 0)) co = binary.getcolors() print co #輸出 ---------------------------------------- binary mode: 1 0 #左上角為黑色 [(503, 0), (1993, 1)] 共有幾個黑與白像素點 ``` 判斷文字位置: https://youtu.be/6DjFscX4I_c?t=502 訓練文字辨識,手動標註|工人智慧的力量 ## jTessBoxEditor / VietOCR-4.5 ### 安裝 下載位置: https://sourceforge.net/projects/vietocr/ 軟體資訊: ![](https://i.imgur.com/LcyLe83.png) ## 使用語法總覽 ```bash= Usage: tesseract --help | --help-extra | --version tesseract --list-langs tesseract imagename outputbase [options...] [configfile...] OCR options: -l LANG[+LANG] Specify language(s) used for OCR. NOTE: These options must occur before any configfile. Single options: --help Show this help message. --help-extra Show extra help for advanced users. --version Show version information. --list-langs List available languages for tesseract engine. ``` ```python= Page segmentation modes: 0 Orientation and script detection (OSD) only. 1 Automatic page segmentation with OSD. 2 Automatic page segmentation, but no OSD, or OCR. (not implemented) 3 Fully automatic page segmentation, but no OSD. (Default) 4 Assume a single column of text of variable sizes. 5 Assume a single uniform block of vertically aligned text. 6 Assume a single uniform block of text. 7 Treat the image as a single text line. 8 Treat the image as a single word. 9 Treat the image as a single word in a circle. 10 Treat the image as a single character. 11 Sparse text. Find as much text as possible in no particular order. 12 Sparse text with OSD. 13 Raw line. Treat the image as a single text line, bypassing hacks that are Tesseract-specific. OCR Engine modes: 0 Legacy engine only. 1 Neural nets LSTM engine only. 2 Legacy + LSTM engines. 3 Default, based on what is available. Single options: -h, --help Show minimal help message. --help-extra Show extra help for advanced users. --help-psm Show page segmentation modes. --help-oem Show OCR Engine modes. -v, --version Show version information. --list-langs List available languages for tesseract engine. --print-parameters Print tesseract parameters. ``` 未完待續,下方整理了一些相關文章,有興趣的同學可以參考。 #### 實用文章: Python爬蟲結合辨識圖片文字 >https://medium.com/@kaojia/資料分析-python爬蟲專案實作-辨識圖片文字-驗證碼-pytesseract套件-43e7adb29316 此篇文章作者有一系列影像辨識/深度學習教學文章值得細讀 > https://vocus.cc/salon/crab [OCR_應用]Tesseract-OCR_Config說明 https://vocus.cc/tags/Tesseract [ 實用心得 ] Tesseract-OCR > [https://medium.com/@b98606021/實用心得-tesseract-ocr](https://medium.com/@b98606021/實用心得-tesseract-ocr-eef4fcd425f0) mac上文字识别(Tesseract-OCR for mac ) >https://blog.csdn.net/u010670689/article/details/78374623 OpenCV-Python Tutorials document & tutorial > [Image Thresholding](https://opencv24-python-tutorials.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html#thresholding) 使用Tesseract训练lang文件并OCR识别集装箱号 > https://www.jianshu.com/p/5f847d8089ce python 读取、保存、二值化、灰度化图片+opencv处理图片的方法 >https://blog.csdn.net/JohinieLi/article/details/69389980 设置白名单:让tesseract-OCR只识别指定内容 > tessdata/configs/digits 沒找到 > https://blog.csdn.net/ADebugMan/article/details/100592200 ### 檔案放置區: 組員分工:我負責程式.夥伴負責繪圖 >[Tesseract-OCR 辨識& 驗證碼分析及實作](https://medium.com/mr-wang/文字辨識實作及逆向解析-e42078f50916) 000webhost 提供免費虛擬主機服務 (支援 PHP)(網站也不會內置其他廣告),當初臨時架站使用驗證碼用途找到的,但太久沒流量會砍站的樣子(某年某天查看掛了) ### 實際圖片辨識: https://linevoom.line.me/user/_dZzGNZLRzW9RJ1tQUGgcLuD1WYPEsedKzf9Jbjo 部署到 Heroku 串接 Line Bot https://www.heroku.com 數ㄕㄨˇ數ㄕㄨˋ鼠叔叔 (掛了) 2024 可以換成 Render.com 架站 https://linevoom.line.me/user/_dZzGNZLRzW9RJ1tQUGgcLuD1WYPEsedKzf9Jbjo ![截圖 2023-12-03 下午11.36.00](https://hackmd.io/_uploads/Hyrw-X5rp.png) ![](https://i.imgur.com/IxnKVer.png) 4! 8! :::spoiler 4! = 24 ~~所以辨識錯了~~ ![](https://hackmd.io/_uploads/SkWEbRFGT.png) <!-- :::info 感謝你的閱讀,如果有任何內容錯誤可以留言編輯修正 也歡迎點擊下方連結瀏覽我的社群平台 HackMD : https://hackmd.io/@DCT Wa.01 Blog : https://wastu01.github.io/ Medium : https://medium.com/mr-wang Coderbridge : [https://index.coderbridge.io](https://index.coderbridge.io) ::: -->