[OCR][Python]測試tesseract與easyOCR誰比較準跟快

更新 發佈閱讀 17 分鐘

平時都在用tesseract來辨識OCR的部分,在網路上也常常聽說easyOCR比tesseract好用,就拿之前測試的OCR素材來比較看看囉。

以下輸入同樣圖片直接測試,並非絕對誰就比較準,只單純測試數字含英文的部分。

圖片素材就是15碼(英文加數字),檔名為OCR正確結果

保密原則,只好模糊掉數字跟英文

保密原則,只好模糊掉數字跟英文



Tesseract 測試結果

raw-image


Easy OCR 測試結果

raw-image


Tesseract 程式範例

輸入的圖片檔名,OCR_數字為正確的OCR

讀圖辨識結果與檔名比較,得知誤判率

import os
import pytesseract
from PIL import Image
import re
import time
import numpy as np
from collections import Counter
import cv2

def find_errors(ocr_results, file_names):
error_details = []

for ocr, file_name in zip(ocr_results, file_names):
if ocr != file_name:
error_positions = [(i, a, b) for i, (a, b) in enumerate(zip(ocr, file_name)) if a != b]
error_details.append({"ocr": ocr, "file_name": file_name, "error_positions": error_positions})

return error_details

def rename_images():
res_str = 0
ocr_results = [] # 你的OCR結果清單
file_names = [] # 你的檔案名稱清單
all_time = 0
all_count = 0
'''
Change File Name -> OCR.Png
'''
folder_path = "D:/SaveImg/PSN/20240531"
valid_extensions = [".jpg", ".png", ".jpeg"]

pytesseract.pytesseract.tesseract_cmd = r"tesseract路徑"
config = f'--oem 3 --psm 7'
image_files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f)) and any(f.lower().endswith(ext) for ext in valid_extensions)]
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f)) and f.lower().endswith(".png")]

for i, (image_file, file_1) in enumerate(zip(image_files, files)):

_, extension = os.path.splitext(image_file)
original_path = os.path.join(folder_path, image_file)
file = file_1.split('_')[0]
# 使用 pytesseract 讀取文字
try:
start_time = time.time()
img = cv2.imread(original_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
labels = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
ocr_text = pytesseract.image_to_string(labels, lang="eng", config=config)
print(ocr_text)
except Exception as e:
print(f"Error reading text from {image_file}: {e}")
continue

ocr_text = ocr_text.strip()
# print(f'辨識到的OCR:{ocr_text}')
ocr_results.append(ocr_text) # 你的OCR結果清單
file_names.append(file) # 你的檔案名稱清單
if ocr_text == file:
res_str += 1

end_time = time.time()
elapsed_time = end_time - start_time
all_time += elapsed_time
print(f"處理 第{i} 張圖片共花費 {elapsed_time:.2f} 秒")

print(f'準確率:{(res_str/(i + 1) )*100}%,總共測試了{i + 1}張,誤判{((i + 1)-res_str)}張')

error_details = find_errors(ocr_results, file_names)
print("錯誤字母詳細資訊:")
for error in error_details:
print(f"OCR: {error['ocr']}, 檔案名稱: {error['file_name']}, 錯誤位置: {error['error_positions']}")
# 統計重複的錯誤位置及其次數
error_positions_counter = Counter([pos for error in error_details for pos in error["error_positions"]])
print("錯誤位置及其次數:")
for position, count in error_positions_counter.items():
print(f"位置 {position}: {count} 次")
all_count += count
print(f'總花費時間:{all_time}秒,單測項平均時間:{round((all_time/i),3)}秒')
print(f'誤判率 :{round(all_count/(i*15),2)*100}%')
print(f'總字元數:{i*15},誤判總字元數:{all_count}')

if __name__ == "__main__":
rename_images()

Easy OCR程式範例

import os
from PIL import Image
import re
import time
import numpy as np
from collections import Counter
import easyocr
import cv2

def find_errors(ocr_results, file_names):
error_details = []

for ocr, file_name in zip(ocr_results, file_names):
if ocr != file_name:
error_positions = [(i, a, b) for i, (a, b) in enumerate(zip(ocr, file_name)) if a != b]
error_details.append({"ocr": ocr, "file_name": file_name, "error_positions": error_positions})

return error_details

def rename_images():
res_str = 0
ocr_results = [] # 你的OCR結果清單
file_names = [] # 你的檔案名稱清單
all_time = 0
all_count = 0
count = 0
'''
Change File Name -> OCR.Png
'''
folder_path = "圖片路徑"
valid_extensions = [".jpg", ".png", ".jpeg"]
reader = easyocr.Reader(['ch_sim','en'], gpu=False) # this needs to run only once to load the model into memory

image_files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f)) and any(f.lower().endswith(ext) for ext in valid_extensions)]
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f)) and f.lower().endswith(".png")]

for i, (image_file, file_1) in enumerate(zip(image_files, files)):

_, extension = os.path.splitext(image_file)
original_path = os.path.join(folder_path, image_file)
file = file_1.split('_')[0]
# 使用 pytesseract 讀取文字
try:
start_time = time.time()
img = cv2.imread(original_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
labels = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
ocr_text = reader.readtext(labels, detail = 0)
print(ocr_text)
except Exception as e:
print(f"Error reading text from {image_file}: {e}")
continue
# 使用 join 方法將列表轉換為字符串
result_string = ''.join(ocr_text)
# print(f'辨識到的OCR:{ocr_text}')
ocr_results.append(result_string) # 你的OCR結果清單
file_names.append(file) # 你的檔案名稱清單
if ocr_text == file:
res_str += 1

end_time = time.time()
elapsed_time = end_time - start_time
all_time += elapsed_time
print(f"處理 第{i} 張圖片共花費 {elapsed_time:.2f} 秒")

print(f'準確率:{(res_str/(i + 1) )*100}%,總共測試了{i + 1}張,誤判{((i + 1)-res_str)}張')

error_details = find_errors(ocr_results, file_names)
print("錯誤字母詳細資訊:")
for error in error_details:
print(f"OCR: {error['ocr']}, 檔案名稱: {error['file_name']}, 錯誤位置: {error['error_positions']}")
# 統計重複的錯誤位置及其次數
error_positions_counter = Counter([pos for error in error_details for pos in error["error_positions"]])
print("錯誤位置及其次數:")
for position, count in error_positions_counter.items():
print(f"位置 {position}: {count} 次")
all_count += count
print(f'總花費時間:{all_time}秒,單測項平均時間:{round((all_time/i),3)}秒')
print(f'誤判率 :{round(all_count/(i*15),2)*100}%')
print(f'總字元數:{i*15},誤判總字元數:{all_count}')

if __name__ == "__main__":
rename_images()



留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
156會員
309內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2024/06/21
微調(Fine tune)是深度學習中遷移學習的一種方法,其中預訓練模型的權重會在新數據上進行訓練。 本文主要介紹如何使用新的訓練圖檔在tesseract 辨識模型進行Fine tune 有關於安裝的部分可以參考友人的其他文章 Tesseract OCR - 繁體中文【安裝篇】 將所有資料
Thumbnail
2024/06/21
微調(Fine tune)是深度學習中遷移學習的一種方法,其中預訓練模型的權重會在新數據上進行訓練。 本文主要介紹如何使用新的訓練圖檔在tesseract 辨識模型進行Fine tune 有關於安裝的部分可以參考友人的其他文章 Tesseract OCR - 繁體中文【安裝篇】 將所有資料
Thumbnail
2024/05/26
本文將展示使用不同激活函數(ReLU 和 Sigmoid)的效果。 一個簡單的多層感知器(MLP)模型來對 Fashion-MNIST 資料集進行分類。 函數定義 Sigmoid 函數 Sigmoid 函數將輸入壓縮到 0到 1 之間: 特性: 輸出範圍是 (0,1)(0, 1)(0,1
Thumbnail
2024/05/26
本文將展示使用不同激活函數(ReLU 和 Sigmoid)的效果。 一個簡單的多層感知器(MLP)模型來對 Fashion-MNIST 資料集進行分類。 函數定義 Sigmoid 函數 Sigmoid 函數將輸入壓縮到 0到 1 之間: 特性: 輸出範圍是 (0,1)(0, 1)(0,1
Thumbnail
2024/05/25
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
Thumbnail
2024/05/25
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
Thumbnail
看更多
你可能也想看
Thumbnail
吸引力法則是互相的,頻率相近的兩方總會尋到彼此。香氛和你也是。
Thumbnail
吸引力法則是互相的,頻率相近的兩方總會尋到彼此。香氛和你也是。
Thumbnail
本文探討臺灣串流平臺的發展現況、競爭格局,並解析其帶來的經濟效應。透過美國電影協會(MPA)的講座內容,結合業界專家意見與生活觀察,文章揭示串流平臺如何影響內容製作, 同時討論臺灣有利的創作環境,包括自由的風氣和開放的政策,對於提升國家軟實力與國際影響力的重要性。
Thumbnail
本文探討臺灣串流平臺的發展現況、競爭格局,並解析其帶來的經濟效應。透過美國電影協會(MPA)的講座內容,結合業界專家意見與生活觀察,文章揭示串流平臺如何影響內容製作, 同時討論臺灣有利的創作環境,包括自由的風氣和開放的政策,對於提升國家軟實力與國際影響力的重要性。
Thumbnail
在tesseract-ocr辨識應用中,建議的留白邊框為10pixl,若Label列印的太剛好,沒有任何的邊框時,就會辨識不到文字。 本文將帶大家如何讓圖像增加邊框。 結果圖 示意的比較誇張,我讓邊框增加100pixl,圖片大小原為211*80。
Thumbnail
在tesseract-ocr辨識應用中,建議的留白邊框為10pixl,若Label列印的太剛好,沒有任何的邊框時,就會辨識不到文字。 本文將帶大家如何讓圖像增加邊框。 結果圖 示意的比較誇張,我讓邊框增加100pixl,圖片大小原為211*80。
Thumbnail
在文字辨識中,適當的增加一文字彼此間的間隔是有幫助於辨識的,原因在大多數OCR引擎在處理字符時會依賴空白區域來區分不同的字符。如果字符之間的間隔過小,OCR引擎可能會將相鄰的字符誤認為一個單一的字符或難以正確切割字符。增加間隔可以幫助OCR引擎更準確地識別和切割每個字符。 本文說明如何增加OCR間
Thumbnail
在文字辨識中,適當的增加一文字彼此間的間隔是有幫助於辨識的,原因在大多數OCR引擎在處理字符時會依賴空白區域來區分不同的字符。如果字符之間的間隔過小,OCR引擎可能會將相鄰的字符誤認為一個單一的字符或難以正確切割字符。增加間隔可以幫助OCR引擎更準確地識別和切割每個字符。 本文說明如何增加OCR間
Thumbnail
在數字化時代,PDF文件廣泛使用,但傳統處理方式顯得力不從心。本文推薦pdftopdf.ai等工具,通過OCR識別,將圖片中的文字轉化為可編輯、可搜索的文本。探討PDF文檔分析的AI工具,功能和價格。描述其用途以解決掃描件中文字無法直接搜索的困擾,提高工作效率。
Thumbnail
在數字化時代,PDF文件廣泛使用,但傳統處理方式顯得力不從心。本文推薦pdftopdf.ai等工具,通過OCR識別,將圖片中的文字轉化為可編輯、可搜索的文本。探討PDF文檔分析的AI工具,功能和價格。描述其用途以解決掃描件中文字無法直接搜索的困擾,提高工作效率。
Thumbnail
微調(Fine tune)是深度學習中遷移學習的一種方法,其中預訓練模型的權重會在新數據上進行訓練。 本文主要介紹如何使用新的訓練圖檔在tesseract 辨識模型進行Fine tune 有關於安裝的部分可以參考友人的其他文章 Tesseract OCR - 繁體中文【安裝篇】 將所有資料
Thumbnail
微調(Fine tune)是深度學習中遷移學習的一種方法,其中預訓練模型的權重會在新數據上進行訓練。 本文主要介紹如何使用新的訓練圖檔在tesseract 辨識模型進行Fine tune 有關於安裝的部分可以參考友人的其他文章 Tesseract OCR - 繁體中文【安裝篇】 將所有資料
Thumbnail
學習如何將掃描的PDF轉換為可搜索文本,並高效管理和查找文件。探索先進的OCR技術如何提升文檔處理效率。
Thumbnail
學習如何將掃描的PDF轉換為可搜索文本,並高效管理和查找文件。探索先進的OCR技術如何提升文檔處理效率。
Thumbnail
在本文中,我們將瞭解如何將掃描的PDF轉換為可搜索文本,並高效管理和查找文件。探索先進的OCR技術如何提升文檔處理效率。
Thumbnail
在本文中,我們將瞭解如何將掃描的PDF轉換為可搜索文本,並高效管理和查找文件。探索先進的OCR技術如何提升文檔處理效率。
Thumbnail
平時都在用tesseract來辨識OCR的部分,在網路上也常常聽說easyOCR比tesseract好用,就拿之前測試的OCR素材來比較看看囉。 以下輸入同樣圖片直接測試,並非絕對誰就比較準,只單純測試數字含英文的部分。 圖片素材就是15碼(英文加數字),檔名為OCR正確結果
Thumbnail
平時都在用tesseract來辨識OCR的部分,在網路上也常常聽說easyOCR比tesseract好用,就拿之前測試的OCR素材來比較看看囉。 以下輸入同樣圖片直接測試,並非絕對誰就比較準,只單純測試數字含英文的部分。 圖片素材就是15碼(英文加數字),檔名為OCR正確結果
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
Google Tesseract Config說明,程式範例實際修改示範 前言 Tesseract 的 config 檔案用於指定 OCR 引擎的設定和參數。這些參數可以影響文本識別的結果 本文將彙整常用參數調整,並呈現不同參數出現不同的辨識結果 官網Tesseract OCR參數說明連結
Thumbnail
Google Tesseract Config說明,程式範例實際修改示範 前言 Tesseract 的 config 檔案用於指定 OCR 引擎的設定和參數。這些參數可以影響文本識別的結果 本文將彙整常用參數調整,並呈現不同參數出現不同的辨識結果 官網Tesseract OCR參數說明連結
Thumbnail
使用Google Tesseract應用,擷取圖像的OCR並將讀取到的字元標註在原圖上 光學字元辨識功能 (Optical character recognition,光學字符辨識) 可以將影像中特徵範圍內的文本轉換為數字形式的文本。使用前必須安装Google Tesseract並更新
Thumbnail
使用Google Tesseract應用,擷取圖像的OCR並將讀取到的字元標註在原圖上 光學字元辨識功能 (Optical character recognition,光學字符辨識) 可以將影像中特徵範圍內的文本轉換為數字形式的文本。使用前必須安装Google Tesseract並更新
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News