File size: 2,114 Bytes
7951c72
 
3dc1b9e
a1c289f
3dc1b9e
7951c72
3dc1b9e
a1c289f
 
 
 
3dc1b9e
 
a1c289f
 
 
 
 
7951c72
a1c289f
 
 
5093ea9
7951c72
a1c289f
3dc1b9e
7951c72
 
 
 
3dc1b9e
7951c72
 
 
 
 
3dc1b9e
7951c72
3dc1b9e
 
7951c72
3dc1b9e
7951c72
3dc1b9e
 
 
 
 
a1c289f
3dc1b9e
7951c72
3dc1b9e
7951c72
3dc1b9e
11d8425
3dc1b9e
 
a1c289f
3dc1b9e
 
 
5093ea9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# app.py

import gradio as gr
from transformers import TrOCRProcessor, VisionEncoderDecoderModel
from PIL import Image
import sympy

# Load the pre-trained model and processor outside the function for efficiency
processor = TrOCRProcessor.from_pretrained('microsoft/trocr-base-handwritten')
model = VisionEncoderDecoderModel.from_pretrained('microsoft/trocr-base-handwritten')

def solve_math_problem(image):
    try:
        # Ensure the image is in RGB format
        image = image.convert("RGB")
        
        # Resize and normalize the image as expected by the model
        pixel_values = processor(images=image, return_tensors="pt").pixel_values
        
        # Generate the text (this extracts the handwritten equation)
        generated_ids = model.generate(pixel_values)
        generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
        
        # Clean and prepare the extracted text
        problem_text = generated_text.strip().replace(' ', '')
        
        # Use sympy to parse and solve the equation
        # Handle simple arithmetic and algebraic equations
        expr = sympy.sympify(problem_text)
        solution = sympy.solve(expr)
        
        # Format the solution for display
        if isinstance(solution, list):
            solution = ', '.join([str(s) for s in solution])
        else:
            solution = str(solution)
        
        return f"**Problem:** {problem_text}\n\n**Solution:** {solution}"
        
    except Exception as e:
        return f"**Error processing image:** {str(e)}"

# Create the Gradio interface
demo = gr.Interface(
    fn=solve_math_problem,
    inputs=gr.Image(
        type="pil", 
        label="Upload Handwritten Math Problem",
        image_mode="RGB"
    ),
    outputs=gr.Markdown(),
    title="Handwritten Math Problem Solver",
    description="Upload an image of a handwritten math problem, and the app will attempt to solve it.",
    examples=[
        ["example_addition.png"],
        ["example_algebra.jpg"]
    ],
    allow_flagging="never"
)

if __name__ == "__main__":
    demo.launch()