Spaces:
Sleeping
Sleeping
| from fastai.vision.all import * | |
| import gradio as gr | |
| # Assuming model.pkl is in the same directory as this script, or specify the full path. | |
| # For Hugging Face Spaces, ensure model.pkl is in the root directory of your Space. | |
| MODEL_PATH = 'model.pkl' # Adjusted for Hugging Face Spaces where model.pkl will be in the root | |
| learn = load_learner(MODEL_PATH) | |
| # IMPORTANT: For inference, aggressively remove all augmentation transforms from the validation DataLoaders. | |
| # We want to preserve only the Normalize transform if it exists, which is crucial for pre-trained models. | |
| # This comprehensive cleanup targets item_tfms, before_batch.tfms, and filters after_batch.tfms. | |
| if hasattr(learn.dls, 'valid_dl'): | |
| # 1. Clear item_tfms: These are transforms applied to individual items (like Resize from your training config) | |
| learn.dls.valid_dl.item_tfms = L() | |
| print(f"DEBUG: After cleanup, learn.dls.valid_dl.item_tfms: {learn.dls.valid_dl.item_tfms}") | |
| # 2. Clear all transforms from before_batch: This is where aug_transforms typically reside | |
| learn.dls.valid_dl.before_batch.tfms = L() | |
| print(f"DEBUG: After cleanup, learn.dls.valid_dl.before_batch.tfms: {learn.dls.valid_dl.before_batch.tfms}") | |
| # 3. Filter after_batch.tfms to only keep Normalize | |
| new_after_batch_tfms = L() | |
| if hasattr(learn.dls.valid_dl, 'after_batch'): | |
| for tfm in learn.dls.valid_dl.after_batch.tfms: | |
| if isinstance(tfm, Normalize): | |
| new_after_batch_tfms.append(tfm) | |
| learn.dls.valid_dl.after_batch.tfms = new_after_batch_tfms | |
| print(f"DEBUG: After cleanup, learn.dls.valid_dl.after_batch.tfms: {learn.dls.valid_dl.after_batch.tfms}") | |
| # Define the prediction function | |
| def predict_image(img): | |
| # Handle the case where no image is provided (img is None) | |
| if img is None: | |
| return {f"Error: No image provided. ": 1.0} # Return a default error message in the expected format | |
| # Ensure the input is a fastai PILImage object | |
| img_fastai = PILImage.create(img) | |
| pred, pred_idx, probs = learn.predict(img_fastai) | |
| # Convert predictions to a dictionary with class names and their probabilities | |
| return {learn.dls.vocab[i]: float(probs[i]) for i in range(len(learn.dls.vocab))} | |
| # Create a Gradio interface | |
| if __name__ == '__main__': | |
| gr.Interface(fn=predict_image, | |
| inputs=gr.Image(type="pil"), | |
| outputs=gr.Label(), | |
| title="My Fastai Image Classifier", | |
| description="Upload an image to get a classification prediction." | |
| ).launch() |