| import gradio as gr |
| from transformers import TrOCRProcessor, VisionEncoderDecoderModel |
| from PIL import Image |
| import os |
| import re |
|
|
| |
| processor = TrOCRProcessor.from_pretrained("microsoft/trocr-base-stage1") |
| model = VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-base-stage1") |
|
|
| |
| PATIENT_RECORDS_DIR = "records" |
| os.makedirs(PATIENT_RECORDS_DIR, exist_ok=True) |
|
|
| |
| def extract_patient_name(file_name): |
| match = re.match(r"([A-Za-z]+[A-Za-z]*)_.*\.(jpg|jpeg|png)$", file_name) |
| return match.group(1) if match else None |
|
|
| |
| def perform_ocr(image_path): |
| image = Image.open(image_path).convert("RGB") |
| pixel_values = processor(images=image, return_tensors="pt").pixel_values |
| generated_ids = model.generate(pixel_values) |
| text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip() |
| return text |
|
|
| |
| def save_record(patient_name, ocr_text): |
| file_path = os.path.join(PATIENT_RECORDS_DIR, f"{patient_name}_records.txt") |
| with open(file_path, "a") as f: |
| f.write("\n\n===== New Lab Result =====\n") |
| f.write(ocr_text) |
|
|
| |
| def process_lab_result(image_path): |
| file_name = os.path.basename(image_path) |
| patient_name = extract_patient_name(file_name) |
|
|
| if not patient_name: |
| return "โ Cannot extract patient name from filename. Use format: JuanDelaCruz_2025-06-13.jpg" |
|
|
| ocr_text = perform_ocr(image_path) |
| save_record(patient_name, ocr_text) |
|
|
| return f"โ
OCR completed. Lab result saved for `{patient_name}`.\n\n๐ Extracted Text:\n\n{ocr_text}" |
|
|
| |
| iface = gr.Interface( |
| fn=process_lab_result, |
| inputs=gr.File(label="Upload Lab Result (.jpg/.png)", type="filepath"), |
| outputs="text", |
| title="๐ฉบ Lab Result OCR", |
| description="Upload a lab result image named like `JuanDelaCruz_2025-06-13.jpg`. The text will be extracted and saved to the patient's record." |
| ) |
|
|
| if __name__ == "__main__": |
| iface.launch() |
|
|