import gradio as gr import tensorflow as tf import joblib import numpy as np from rule_based_quality import RuleBasedQualityEvaluator from preprocess_cnn import preprocess_for_cnn from preprocess_quality import GeometricFeatureExtractor cnn_model = tf.keras.models.load_model("custom_cnn_shape.keras") xgb_quality = joblib.load("xgb_quality.pkl") scaler = joblib.load("scaler.pkl") le_quality = joblib.load("le_quality.pkl") le_shape = joblib.load("le_shape.pkl") feature_extractor = GeometricFeatureExtractor() rule_evaluator = RuleBasedQualityEvaluator() SHAPES = ['Triangle', 'Square', 'Circle', 'Rectangle'] def predict(image): response = {} x = preprocess_for_cnn(image) shape_probs = cnn_model.predict(x, verbose=0)[0] shape_idx = int(np.argmax(shape_probs)) shape_label = le_shape.inverse_transform([shape_idx])[0] response["shape"] = shape_label response["shape_confidence"] = float(shape_probs[shape_idx]) features = feature_extractor.extract_features(image) if features is None: response["quality"] = "unknown" response["quality_confidence"] = 0.0 response["rl_quality"] = "unknown" response["rl_confidence"] = 0.0 return response features_scaled = scaler.transform(features.reshape(1, -1)) quality_probs = xgb_quality.predict_proba(features_scaled)[0] q_idx = int(np.argmax(quality_probs)) response["quality"] = le_quality.inverse_transform([q_idx])[0] response["quality_confidence"] = float(quality_probs[q_idx]) rl_label, rl_conf = rule_evaluator.evaluate( feature_extractor.last_feature_dict, shape_label ) response["rl_quality"] = rl_label response["rl_confidence"] = float(rl_conf) return response gr.Interface( fn=predict, inputs=gr.Image(type="pil"), outputs="json", title="Shape & Quality Recognition System", description="CNN (Keras) for shape recognition + XGBoost for drawing quality assessment" ).launch()