誠如前文最後一張操作流程圖所示,查核系統裡,第一個重要的功能就是「圖片文字辨識 (OCR, Optical Character Recognition)」。這個功能可以將照片中的標示文字自動轉換成電腦可讀取的資料,避免查核人員需要手工謄寫紙本。
本系統使用的是 Azure AI Vision 的影像分析 API,每個月免費限額 5,000 筆資料,每分鐘可支援 20 筆資料,至於要怎麼呼叫 API ,Azure 在官方文件中,有提供基礎範本供使用者參考。
由於 Azure AI Vision 理論上還是個收費的 API,在撰寫程式時,最好將私鑰存在另一份檔案,不要直接放在程式碼中。
// app.py
from dotenv import load_dotenv
OCR_endpoint = os.getenv("OCR_endpoint")
OCR_APIKey = os.getenv("OCR_APIKey")
接著,參考官方文件的寫法,我們建立call_ocr
函式呼叫 Azure OCR 服務,具體而言,是透過 Azure 提供的 ImageAnalysisClient 類呼叫 OCR,讓系統將圖片丟給 Azure OCR 處理並回傳結果。為了避免中途發生錯誤,設定錯誤提醒:
// app.py
from azure.ai.vision.imageanalysis import ImageAnalysisClient # pip install azure-ai-vision-imageanalysis
from azure.core.credentials import AzureKeyCredential
def callOCR(image):
try:
client = ImageAnalysisClient(
endpoint=OCR_endpoint,
credential=AzureKeyCredential(OCR_APIKey)
)
result = client.analyze(
image_data=image,
visual_features=["Read"],
)
if not result.read or not result.read.blocks:
return "OCR 沒有解析出文字"
return "\n".join(line.text for block in result.read.blocks if block.lines for line in block.lines)
except Exception as e:
print(f"OCR 發生錯誤: {str(e)}")
return f"OCR 失敗: {str(e)}"
不過,只有callOCR
還不夠。使用者需要一個「入口」(可以理解為對外界面)來上傳圖片並獲得結果--Flask 提供的路由 @app.route("/ocr")
:
這段程式碼的功能包含:
在程式碼中一樣要記得加入錯誤提醒,方便除錯!
// app.py
@app.route("/ocr", methods=["POST"])
def ocr():
try:
files = request.files.getlist("file")
if not files:
return jsonify({"status": "error", "message": "未提供任何檔案"}), 400
valid_results = []
# 使用 ThreadPoolExecutor 併發處理多檔案 OCR
def processFile(storageFile):
try:
# 嘗試開啟圖片驗證
img = Image.open(storageFile.stream)
img = img.convert("RGB") # 統一 RGB
# 儲存到 BytesIO,作為 OCR 輸入
img_bytes = BytesIO()
img.save(img_bytes, format="JPEG", quality=90)
img_bytes.seek(0)
return callOCR(img_bytes.read())
except Exception as e:
return f"{file_storage.filename} 非有效圖片或處理失敗: {e}"
with ThreadPoolExecutor(max_workers=3) as executor:
valid_results = list(executor.map(process_file, files))
# 組合結果
combined_text = ""
for idx, text in enumerate(valid_results, start=1):
combined_text += f"照片 {idx}:\n{text}\n\n"
return combined_text
except Exception as e:
return jsonify({"status": "error", "message": str(e)}), 500
總結來說,OCR 圖片辨識是查核系統的「基礎功能之一」。它能快速將照片轉換成文字,為後續的法規比對與資料治理打下基礎,讓整個查核流程更高效、更可靠。