|
from fastapi import FastAPI, UploadFile, File, Form |
|
from fastapi.middleware.cors import CORSMiddleware |
|
from fastapi.responses import JSONResponse |
|
import uvicorn |
|
from PIL import Image |
|
import io |
|
import json |
|
import base64 |
|
|
|
|
|
from yolo_module import run_yolo |
|
from ocr_module import extract_text, count_elements, validate_structure |
|
from graph_module import map_arrows, build_flowchart_json |
|
from summarizer_module import summarize_flowchart |
|
|
|
app = FastAPI() |
|
|
|
|
|
app.add_middleware( |
|
CORSMiddleware, |
|
allow_origins=["*"], |
|
allow_credentials=True, |
|
allow_methods=["*"], |
|
allow_headers=["*"], |
|
) |
|
|
|
@app.post("/process-image") |
|
async def process_image(file: UploadFile = File(...), debug: str = Form("false")): |
|
debug_mode = debug.lower() == "true" |
|
debug_log = [] |
|
|
|
if debug_mode: |
|
debug_log.append("π₯ Received file upload") |
|
print(f"π₯ File received: {file.filename}") |
|
|
|
|
|
contents = await file.read() |
|
image = Image.open(io.BytesIO(contents)).convert("RGB") |
|
if debug_mode: |
|
debug_log.append("β
Image converted to RGB") |
|
print("β
Image converted to RGB") |
|
|
|
|
|
boxes, arrows, vis_debug = run_yolo(image) |
|
if debug_mode: |
|
debug_log.append(f"π¦ Detected {len(boxes)} boxes, {len(arrows)} arrows") |
|
|
|
|
|
for box in boxes: |
|
box["text"] = extract_text(image, box["bbox"], debug=debug_mode) |
|
print(f"π OCR for {box['id']}: {box['text']}") |
|
if debug_mode: |
|
debug_log.append(f"π {box['id']}: {box['text']}") |
|
|
|
|
|
edges = map_arrows(boxes, arrows) |
|
if debug_mode: |
|
debug_log.append(f"β‘οΈ Mapped {len(edges)} directional edges") |
|
|
|
|
|
flowchart_json = build_flowchart_json(boxes, edges) |
|
print("π§ Flowchart JSON:", json.dumps(flowchart_json, indent=2)) |
|
|
|
|
|
structure_info = count_elements(boxes, arrows, debug=debug_mode) |
|
validation = validate_structure( |
|
flowchart_json, |
|
expected_boxes=structure_info["box_count"], |
|
expected_arrows=len(arrows), |
|
debug=debug_mode |
|
) |
|
if debug_mode: |
|
debug_log.append(f"π§Ύ Validation: {validation}") |
|
|
|
|
|
summary = summarize_flowchart(flowchart_json) |
|
print("π Summary:", summary) |
|
|
|
|
|
yolo_vis = None |
|
if debug_mode and vis_debug: |
|
vis_io = io.BytesIO() |
|
vis_debug.save(vis_io, format="PNG") |
|
yolo_vis = base64.b64encode(vis_io.getvalue()).decode("utf-8") |
|
|
|
return JSONResponse({ |
|
"flowchart": flowchart_json, |
|
"summary": summary, |
|
"yolo_vis": yolo_vis, |
|
"debug": "\n".join(debug_log) if debug_mode else "" |
|
}) |
|
|
|
|
|
if __name__ == "__main__": |
|
uvicorn.run(app, host="0.0.0.0", port=7860) |