vashu2425 commited on
Commit
87be793
·
verified ·
1 Parent(s): b88fe73

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +75 -25
app.py CHANGED
@@ -1,33 +1,52 @@
1
  import streamlit as st
2
  from PIL import Image
3
  import torch
4
- import numpy as np
5
  import cv2
 
6
  from ultralytics import YOLO
7
- from huggingface_hub import hf_hub_download
8
 
9
- # Dynamically load model from Hugging Face Hub
10
- model_path = hf_hub_download(repo_id="your-username/your-model-repo", filename="best .pt")
11
- model = YOLO(model_path)
 
 
 
 
 
 
 
 
 
12
 
 
13
  def predict_and_draw(image):
 
14
  img = np.array(image)
15
  img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
 
 
16
  img_resized = cv2.resize(img, (640, 640))
 
 
17
  results = model(img_resized)
18
 
 
19
  result = results[0]
20
- boxes = result.boxes
21
- class_names = model.names
22
- img_with_boxes = img_resized.copy()
23
- defect_list = []
24
 
 
25
  for box in boxes:
26
- x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())
27
- conf = box.conf[0].item()
28
- cls = int(box.cls[0].item())
29
- label = f"{class_names[cls]} ({conf:.2f})"
30
- defect_list.append(f"{class_names[cls]} - Confidence: {conf:.2f}")
 
 
 
31
  cv2.rectangle(img_with_boxes, (x1, y1), (x2, y2), (0, 255, 0), 2)
32
  cv2.putText(
33
  img_with_boxes,
@@ -38,26 +57,57 @@ def predict_and_draw(image):
38
  (255, 0, 0),
39
  2,
40
  )
 
 
41
  img_with_boxes = cv2.cvtColor(img_with_boxes, cv2.COLOR_BGR2RGB)
42
  return Image.fromarray(img_with_boxes), defect_list
43
 
44
- # Streamlit app logic
45
- st.title("Road Defect Detection App")
46
- st.markdown("Upload an image of a road to detect defects.")
47
 
48
- uploaded_file = st.file_uploader("Upload an Image", type=["jpg", "jpeg", "png"])
 
49
 
50
  if uploaded_file:
51
- col1, col2 = st.columns([1, 1])
 
 
52
  with col1:
 
53
  st.image(uploaded_file, caption="Uploaded Image", use_container_width=True)
54
 
 
55
  if st.button("Detect Defects"):
56
- with st.spinner("Detecting defects..."):
 
 
57
  result_image, defect_list = predict_and_draw(Image.open(uploaded_file))
58
- with col2:
59
- st.image(result_image, caption="Detected Defects", use_container_width=True)
60
 
61
- st.subheader("Detected Defects:")
62
- for defect in defect_list:
63
- st.write(f"- {defect}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
  from PIL import Image
3
  import torch
 
4
  import cv2
5
+ import numpy as np
6
  from ultralytics import YOLO
 
7
 
8
+ # Clear GPU memory
9
+ torch.cuda.empty_cache()
10
+
11
+ # Load YOLO model
12
+ @st.cache_resource
13
+ def load_model():
14
+ # Dynamically select device (GPU if available, otherwise CPU)
15
+ device = 'cuda' if torch.cuda.is_available() else 'cpu'
16
+ model = YOLO('/home/petpooja-504/Desktop/steamlit/best .pt').to(device) # Replace with your model path
17
+ return model
18
+
19
+ model = load_model()
20
 
21
+ # Function to make predictions and draw bounding boxes
22
  def predict_and_draw(image):
23
+ # Convert PIL image to OpenCV format
24
  img = np.array(image)
25
  img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
26
+
27
+ # Resize image to YOLO input size (640x640)
28
  img_resized = cv2.resize(img, (640, 640))
29
+
30
+ # Perform prediction
31
  results = model(img_resized)
32
 
33
+ # Access the first result
34
  result = results[0]
35
+ boxes = result.boxes # Bounding boxes
36
+ class_names = model.names # Class names from the model
37
+ img_with_boxes = img_resized.copy() # Copy to draw on
38
+ defect_list = [] # To store detected defect types and names
39
 
40
+ # Draw bounding boxes and labels on the image
41
  for box in boxes:
42
+ x1, y1, x2, y2 = map(int, box.xyxy[0].tolist()) # Get bounding box coordinates
43
+ conf = box.conf[0].item() # Confidence score
44
+ cls = int(box.cls[0].item()) # Class index
45
+ label = f"{class_names[cls]} ({conf:.2f})" # Class label with confidence
46
+
47
+ defect_list.append(f"{class_names[cls]} - Confidence: {conf:.2f}") # Add to list
48
+
49
+ # Draw rectangle and label
50
  cv2.rectangle(img_with_boxes, (x1, y1), (x2, y2), (0, 255, 0), 2)
51
  cv2.putText(
52
  img_with_boxes,
 
57
  (255, 0, 0),
58
  2,
59
  )
60
+
61
+ # Convert back to PIL for Streamlit display
62
  img_with_boxes = cv2.cvtColor(img_with_boxes, cv2.COLOR_BGR2RGB)
63
  return Image.fromarray(img_with_boxes), defect_list
64
 
65
+ # Streamlit app
66
+ st.title("🚧 Road Defect Detection App 🚧")
67
+ st.markdown("Upload an image of a road to detect defects such as cracks, potholes, etc., with bounding boxes.")
68
 
69
+ # File uploader with a friendly description
70
+ uploaded_file = st.file_uploader("Upload an Image (JPG/PNG)", type=["jpg", "jpeg", "png"])
71
 
72
  if uploaded_file:
73
+ # Display input image and progress bar for prediction
74
+ col1, col2 = st.columns([1, 1]) # Equal width for input and output columns
75
+
76
  with col1:
77
+ st.subheader("Uploaded Image")
78
  st.image(uploaded_file, caption="Uploaded Image", use_container_width=True)
79
 
80
+ # Show a button for detection
81
  if st.button("Detect Defects"):
82
+ with st.spinner("Detecting defects... Please wait."):
83
+ # Show progress bar
84
+ progress_bar = st.progress(0)
85
  result_image, defect_list = predict_and_draw(Image.open(uploaded_file))
 
 
86
 
87
+ # Update progress
88
+ progress_bar.progress(100)
89
+
90
+ # Display result image with bounding boxes
91
+ with col2:
92
+ st.subheader("Detected Defects")
93
+ st.image(result_image, caption="Detected Defects", use_container_width=True)
94
+
95
+ # Display detected defects with confidence scores
96
+ st.subheader("Detected Defects Details:")
97
+ if defect_list:
98
+ for defect in defect_list:
99
+ st.write(f"- {defect}")
100
+ else:
101
+ st.write("No defects detected.")
102
+
103
+ else:
104
+ st.warning("Click on 'Detect Defects' to analyze the image.")
105
+ else:
106
+ st.info("Please upload an image to begin detection.")
107
+
108
+ # Add some footer information
109
+ st.markdown("""
110
+ ---
111
+ 🛠️ This app helps detect road defects using YOLO model.
112
+ 📩 For feedback, contact us at: vaman2425@gmail.com
113
+ """)