import io import time import os import re from PIL import Image from cairosvg import svg2png from transformers import VisionEncoderDecoderModel, TrOCRProcessor import gradio as gr processor = TrOCRProcessor.from_pretrained("anuashok/ocr-captcha-v3") model = VisionEncoderDecoderModel.from_pretrained("anuashok/ocr-captcha-v3") os.makedirs("outputs", exist_ok=True) def solve_svg_captcha(svg_data): svg_data = re.sub(r'', '', svg_data, flags=re.DOTALL) svg_data = re.sub(r'@font-face\s*\{[^}]*\}', '', svg_data) svg_data = re.sub(r'font-family="[^"]*"', 'font-family="Arial"', svg_data) svg_data = svg_data.replace('file:///', '') svg_data = svg_data.replace('/app/', '') svg_data = re.sub(r'url\(["\']?\/?app\/[^)"\']*["\']?\)', 'url()', svg_data) png_bytes = svg2png(bytestring=svg_data.encode('utf-8')) image = Image.open(io.BytesIO(png_bytes)).convert("RGBA") image = image.resize((500, 300)) background = Image.new("RGBA", image.size, (255, 255, 255)) combined = Image.alpha_composite(background, image).convert("RGB") pixel_values = processor(combined, return_tensors="pt").pixel_values generated_ids = model.generate(pixel_values) generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0] sanitized = re.sub(r'[^A-Za-z0-9]', '', generated_text) sanitized = sanitized.upper() return sanitized[:4] def predict(svgdata): if not svgdata: return "No SVG provided" if len(svgdata) > 50000: return "SVG too large" try: model_answer = solve_svg_captcha(svgdata) except Exception as e: print(f"Error in predict: {e}") return "Model could not predict" return model_answer or "Model could not predict" with gr.Blocks() as demo: gr.Markdown("Enter SVG data and receive model answer") svg_input = gr.Textbox(label="SVG Data", lines=10) predict_btn = gr.Button("Get Model Answer") model_answer = gr.Textbox(label="Model Answer", interactive=False) predict_btn.click(predict, inputs=[svg_input], outputs=[model_answer]) if __name__ == "__main__": demo.launch()