iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
Build on AWS

Lightsail Lab: Build Your AI-Powered Website系列 第 7

【Day 07】查核系統核心功能之一:圖片文字辨識 (OCR)

  • 分享至 

  • xImage
  •  

誠如前文最後一張操作流程圖所示,查核系統裡,第一個重要的功能就是「圖片文字辨識 (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")

這段程式碼的功能包含:

  1. 接收使用者透過 /ocr 路徑上傳的圖片。
  2. 驗證圖片格式並轉換為 OCR 可處理的輸入。
  3. 同時支援3張圖片上傳,透過 ThreadPoolExecutor 平行處理,提高速度。
  4. 最後把結果整合並回傳給使用者。

在程式碼中一樣要記得加入錯誤提醒,方便除錯!

// 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 圖片辨識是查核系統的「基礎功能之一」。它能快速將照片轉換成文字,為後續的法規比對與資料治理打下基礎,讓整個查核流程更高效、更可靠。


上一篇
【Day 06】系統架構簡介
下一篇
【Day 08】查核系統核心功能之二:用 OpenAI GPT 進行文字處理
系列文
Lightsail Lab: Build Your AI-Powered Website8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言