Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import chess | |
| import chess.svg | |
| from PIL import Image | |
| import io | |
| import cairosvg | |
| from main import get_moves # your engine wrapper | |
| def predict_from_image(img): | |
| # Save uploaded image | |
| img = img.convert("RGB") | |
| img.save("board.png", format="PNG") | |
| # Your function should return (fen, moves) | |
| fen, moves = get_moves("board.png") | |
| # Convert FEN -> SVG -> PNG for Gradio display | |
| board = chess.Board(fen) | |
| svg_data = chess.svg.board(board=board, size=350) | |
| # convert svg to png (since Gradio Image widget expects raster) | |
| png_bytes = cairosvg.svg2png(bytestring=svg_data) | |
| board_img = Image.open(io.BytesIO(png_bytes)) | |
| moves_white = moves['white_moves'] | |
| moves_black=moves['black_moves'] | |
| white_moves_clean = [m[1] for m in moves_white] | |
| black_moves_clean = [m[1] for m in moves_black] | |
| return fen, "\n".join(white_moves_clean), "\n".join(black_moves_clean), board_img | |
| with gr.Blocks() as demo: | |
| gr.Markdown(""" | |
| # chess move predictor using alpha beta pruning | |
| _Upload an image of an online chessboard and get the FEN & best moves._ | |
| ⚠️ **Warning:** Please upload screenshots from online chess games (e.g., Lichess, Chess.com). | |
| Physical/real-world chessboard photos are not supported yet. | |
| """) | |
| with gr.Row(): | |
| image = gr.Image(type="pil", label="Upload Chessboard Image") | |
| board_display = gr.Image(type="pil", label="Detected Board") | |
| fen_out = gr.Textbox(label="Detected FEN") | |
| moves_out = gr.Textbox(label="Predicted Best Moves") | |
| with gr.Row(): | |
| moves_white = gr.Textbox(label="White's Moves", lines=6) | |
| moves_black = gr.Textbox(label="Black's Moves", lines=6) | |
| btn = gr.Button("Analyze Board") | |
| btn.click( | |
| fn=predict_from_image, | |
| inputs=image, | |
| outputs=[fen_out, moves_white, moves_black, board_display] | |
| ) | |
| demo.launch() | |