Spaces:
Runtime error
Runtime error
| from flask import Flask, request, jsonify, render_template | |
| from detectron2.config import get_cfg | |
| from detectron2.engine import DefaultPredictor | |
| from detectron2.data import MetadataCatalog | |
| from detectron2.utils.visualizer import Visualizer, ColorMode | |
| import numpy as np | |
| from PIL import Image | |
| import io | |
| import os | |
| import requests | |
| import gdown | |
| from skimage import io as skio | |
| from torchvision.ops import box_iou | |
| import torch | |
| from roboflow import Roboflow | |
| import supervision as sv | |
| import cv2 | |
| import tempfile | |
| import os | |
| import numpy as np | |
| import requests | |
| # Initialize Flask app | |
| app = Flask(__name__) | |
| def home(): | |
| return render_template("index.html") | |
| def fetchImage(): | |
| file = None | |
| if "url" in request.form: | |
| url = request.form["url"] | |
| response = requests.get(url) | |
| file = io.BytesIO(response.content) | |
| elif "file" in request.files: | |
| file = request.files["file"] | |
| url = "https://firebasestorage.googleapis.com/v0/b/car-damage-detector-s34rrz.firebasestorage.app/o/users%2FYMd99dt33HaktTWpYp5MM5oYeBE3%2Fuploads%2F1737454072124000.jpg?alt=media&token=9eae79fa-4c06-41a5-9f58-236c39efaac0" | |
| # File name for saving | |
| file_name = "downloaded_image.jpg" | |
| # Download the image | |
| response = requests.get(url) | |
| # Save the image to the current directory | |
| if response.status_code == 200: | |
| with open(file_name, "wb") as file: | |
| file.write(response.content) | |
| print(f"Image downloaded and saved as {file_name}") | |
| else: | |
| print(f"Failed to download image. Status code: {response.status_code}") | |
| # Load image | |
| image = cv2.imread(file_name) | |
| rf = Roboflow(api_key="LqD8Cs4OsoK8seO3CPkf") | |
| project_parts = rf.workspace().project("car-parts-segmentation") | |
| model_parts = project_parts.version(2).model | |
| project_damage = rf.workspace().project("car-damage-detection-ha5mm") | |
| model_damage = project_damage.version(1).model | |
| # Run the damage detection model | |
| result_damage = model_damage.predict( | |
| file_name, | |
| confidence=40, | |
| ).json() | |
| # Extract detections from the result | |
| detections_damage = sv.Detections.from_inference(result_damage) | |
| # Read the input image | |
| # Annotate damaged areas of the car | |
| mask_annotator = sv.MaskAnnotator() | |
| annotated_image_damage = mask_annotator.annotate( | |
| scene=image, detections=detections_damage | |
| ) | |
| # Create a temporary directory to save outputs | |
| temp_dir = tempfile.mkdtemp() | |
| # Define a repair cost dictionary (per part) | |
| repair_cost_dict = { | |
| "wheel": 100, # Base cost for wheel | |
| "door": 200, # Base cost for door | |
| "hood": 300, # Base cost for hood | |
| "front_bumper": 250, # Base cost for bumper | |
| "trunk": 200, | |
| "front_glass": 150, | |
| "back_left_door": 200, | |
| "left_mirror": 20, | |
| "back_glass": 150, | |
| } | |
| # Initialize total cost | |
| total_cost = 0 | |
| # Ensure coordinate processing is done in chunks of 4 | |
| coordinates = list(map(int, detections_damage.xyxy.flatten())) | |
| num_damages = ( | |
| len(coordinates) // 4 | |
| ) # Each damage has 4 coordinates (x1, y1, x2, y2) | |
| # Iterate through damages | |
| for i in range(num_damages): | |
| x1, y1, x2, y2 = coordinates[i * 4 : (i + 1) * 4] | |
| # Ensure the coordinates are within image bounds | |
| x1, y1 = max(0, x1), max(0, y1) | |
| x2, y2 = min(image.shape[1], x2), min(image.shape[0], y2) | |
| # Crop the damaged region | |
| cropped_damage = image[y1:y2, x1:x2] | |
| # Check if the cropped region is valid | |
| if cropped_damage.size == 0: | |
| print(f"Skipping empty crop for damage region {i + 1}") | |
| continue | |
| # Save the cropped damaged area | |
| damage_image_path = os.path.join(temp_dir, f"damage_image_{i}.png") | |
| cv2.imwrite(damage_image_path, cropped_damage) | |
| # Run the parts detection model on the cropped damage | |
| result_parts = model_parts.predict(damage_image_path, confidence=15).json() | |
| detections_parts = sv.Detections.from_inference(result_parts) | |
| # Calculate repair cost for each detected part | |
| for part in result_parts["predictions"]: | |
| part_name = part["class"] | |
| damage_area = part["width"] * part["height"] | |
| cropped_area = (x2 - x1) * (y2 - y1) | |
| damage_percentage = (damage_area / cropped_area) * 100 | |
| # Lookup cost and add to total | |
| base_cost = repair_cost_dict.get( | |
| part_name, 0 | |
| ) # Default to 0 if part not in dict | |
| repair_cost = (damage_percentage / 100) * base_cost | |
| total_cost += repair_cost | |
| print( | |
| f"Damage {i + 1} - {part_name}: {damage_percentage:.2f}% damaged, Cost: ${repair_cost:.2f}" | |
| ) | |
| # Annotate and save the result | |
| part_annotator = sv.LabelAnnotator() | |
| annotated_parts_image = part_annotator.annotate( | |
| scene=cropped_damage, detections=detections_parts | |
| ) | |
| annotated_parts_path = os.path.join(temp_dir, f"annotated_parts_{i}.png") | |
| cv2.imwrite(annotated_parts_path, annotated_parts_image) | |
| # Save the overall annotated image | |
| annotated_image_path = os.path.join(temp_dir, "annotated_image_damage.png") | |
| cv2.imwrite(annotated_image_path, annotated_image_damage) | |
| # Return the total cost in the specified format | |
| result = {"total_cost": total_cost} | |
| print(result) | |
| return jsonify(result) | |
| if __name__ == "__main__": | |
| app.run(host="0.0.0.0", port=7860) | |