Spaces:
Runtime error
Runtime error
| from keras.models import load_model | |
| from PIL import Image, ImageOps | |
| import numpy as np | |
| import gradio as gr | |
| import pandas as pd | |
| import torch | |
| import json | |
| # Load the model | |
| classify_model = load_model('keras_model.h5') | |
| detect_model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt', force_reload=True, _verbose=False) | |
| def detect(image): | |
| # Inference | |
| results = detect_model(image) | |
| try: | |
| results = json.loads(results.pandas().xyxy[0].to_json(orient="records"))[0] | |
| top = int(results['ymin']) | |
| left = int(results['xmin']) | |
| width = int(results['xmax'] - results['xmin']) | |
| height = int(results['ymax'] - results['ymin']) | |
| return top, left, width, height | |
| except: | |
| return 0,0,0,0 | |
| def format_label(label): | |
| """ | |
| From '0 class 1\n' to 'class 1' | |
| """ | |
| return label[:-1] | |
| def predict(image): | |
| top, left, width, height = detect(image) | |
| if (top == 0) and (left == 0) and (width == 0) and (height==0): | |
| return { | |
| "predictions": {}, | |
| 'bbox': { | |
| "top": 0, | |
| "left": 0, | |
| "width": 0, | |
| "height": 0 | |
| } | |
| } | |
| if width > height: | |
| height = width | |
| else: | |
| width = height | |
| # Crop the turtle | |
| image = image.crop((left, top, left + width, top + height)) | |
| # Create the array of the right shape to feed into the keras model | |
| # The 'length' or number of images you can put into the array is | |
| # determined by the first position in the shape tuple, in this case 1. | |
| data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32) | |
| #resize the image to a 224x224 with the same strategy as in TM2: | |
| #resizing the image to be at least 224x224 and then cropping from the center | |
| size = (224, 224) | |
| image = ImageOps.fit(image, size, Image.ANTIALIAS) | |
| #turn the image into a numpy array | |
| image_array = np.asarray(image) | |
| # Normalize the image | |
| normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1 | |
| # Load the image into the array | |
| data[0] = normalized_image_array | |
| # run the inference | |
| pred = classify_model.predict(data) | |
| pred = pred.tolist() | |
| with open('labels.txt','r') as f: | |
| labels = f.readlines() | |
| result = {format_label(labels[i]): round(pred[0][i],2) for i in range(len(pred[0]))} | |
| sorted_result = {k: v for k, v in sorted(result.items(), key=lambda item: item[1], reverse=True) if v > 0} | |
| return json.dumps({ | |
| "predictions": sorted_result, | |
| 'bbox': { | |
| "top": top, | |
| "left": left, | |
| "width": width, | |
| "height": height | |
| } | |
| }) | |
| title = "🐆" | |
| gr.Interface( | |
| fn=predict, | |
| inputs=gr.Image(type="pil", label="Input Image"), | |
| outputs=[gr.JSON()], | |
| # live=True, | |
| title=title, | |
| ).launch(share=True, debug=False) |