import streamlit as st from kraken import blla from kraken.lib import vgsl from PIL import Image, ImageDraw # Define available OCR models ocr_models = { "blla.mlmodel": "models/blla.mlmodel", "syrnt_blla_v1_best.mlmodel": "models/syrnt_blla_v1_best.mlmodel", "syrnt_blla_v2_best.mlmodel": "models/syrnt_blla_v2_best.mlmodel", "syrnt_cl_v1_best.mlmodel": "models/syrnt_cl_v1_best.mlmodel", "syrnt_cl_v2_best.mlmodel": "models/syrnt_cl_v2_best.mlmodel", "syrnt_two_blla_v1_best.mlmodel": "models/syrnt_two_blla_v1_best.mlmodel", "syrnt_two_v1_best.mlmodel": "models/syrnt_two_v1_best.mlmodel" } # Streamlit app title and description st.title("OCR with Kraken") st.write("Upload an image, select an OCR model, and view detected polygons.") # Upload image file uploaded_image = st.file_uploader("Upload an image file", type=["png", "jpg", "jpeg"]) # Select model from dropdown selected_model = st.selectbox("Select Kraken OCR model", list(ocr_models.keys())) # Option to draw baselines draw_baselines = st.radio("Options", ("Do not draw baselines", "Draw baselines")) == "Draw baselines" # Process the image if uploaded and model selected if uploaded_image and selected_model: # Load the image image = Image.open(uploaded_image) st.image(image, caption="Uploaded Image", use_column_width=True) # Load selected Kraken model model_path = ocr_models[selected_model] model = vgsl.TorchVGSLModel.load_model(model_path) # Segment image using Kraken baseline_seg = blla.segment(image, model=model) # Prepare to draw boundaries and display info boundaries_info = [] draw = ImageDraw.Draw(image) # Process and draw line boundaries for idx, line_data in enumerate(baseline_seg.lines): line_boundary = [(int(x), int(y)) for x, y in line_data.boundary] line_type = line_data.tags.get("type", "undefined") # Dynamically get line type name boundaries_info.append(f"Line {idx + 1} (type: {line_type}): {line_boundary}") draw.polygon(line_boundary, outline="green") # Draw line boundary in green # Draw baseline if the option is selected if draw_baselines: line_baseline = [(int(x), int(y)) for x, y in line_data.baseline] boundaries_info.append(f" Baseline for Line {idx + 1}: {line_baseline}") draw.line(line_baseline, fill="red", width=2) # Draw baseline in red # Process and draw region boundaries by iterating through each region type for region_type, region_list in baseline_seg.regions.items(): for idx, region_data in enumerate(region_list): if hasattr(region_data, "boundary"): region_boundary = [(int(x), int(y)) for x, y in region_data.boundary] region_type_name = region_data.tags.get("type", "undefined") # Get region type dynamically boundaries_info.append(f"Region {idx + 1} (type: {region_type_name}): {region_boundary}") draw.polygon(region_boundary, outline="blue") # Draw region boundary in blue # Display the image with boundaries drawn st.image(image, caption="Image with OCR lines (green), regions (blue), and baselines (red if selected)", use_column_width=True) # Display the list of boundaries with line and region types st.write("List of Boundaries (Lines and Regions):") for info in boundaries_info: st.write(info)