lakshmi082024 commited on
Commit
fd30198
ยท
verified ยท
1 Parent(s): c95b4ae

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +137 -126
app.py CHANGED
@@ -1,126 +1,137 @@
1
- import streamlit as st
2
- import cv2
3
- import numpy as np
4
- import pandas as pd
5
- from PIL import Image
6
- import torch
7
- from torchvision.transforms import Compose, Resize, ToTensor, Normalize
8
- from segment_anything import SamPredictor, sam_model_registry
9
-
10
- # Set Streamlit configuration
11
- st.set_page_config(page_title="Volume Estimator", layout="wide")
12
- st.title("๐Ÿ“ฆ Volume Estimation using SAM Segmentation + MiDaS Depth")
13
-
14
- # Load SAM and MiDaS models
15
- @st.cache_resource
16
- def load_models():
17
- sam_checkpoint = "C:/Users/Administrator/Desktop/streamlit_tl/models/sam_vit_h_4b8939.pth"
18
- sam = sam_model_registry["vit_h"](checkpoint=sam_checkpoint).to("cuda" if torch.cuda.is_available() else "cpu")
19
- predictor = SamPredictor(sam)
20
-
21
- midas = torch.hub.load("intel-isl/MiDaS", "DPT_Large")
22
- midas.eval()
23
- midas_transform = Compose([
24
- Resize(384),
25
- ToTensor(),
26
- Normalize(mean=[0.5]*3, std=[0.5]*3)
27
- ])
28
- return predictor, midas, midas_transform
29
-
30
- predictor, midas_model, midas_transform = load_models()
31
-
32
- # Input source selection
33
- source_option = st.radio("Select input source", ("Upload Image", "Use Webcam"))
34
-
35
- uploaded_file = None
36
- image_pil = None
37
-
38
- if source_option == "Upload Image":
39
- uploaded_file = st.file_uploader("Upload an image", type=["jpg", "jpeg", "png"])
40
- if uploaded_file:
41
- image_pil = Image.open(uploaded_file).convert("RGB")
42
-
43
- elif source_option == "Use Webcam":
44
- run_camera = st.checkbox("Start Camera")
45
-
46
- if run_camera:
47
- cap = cv2.VideoCapture(0)
48
- stframe = st.empty()
49
- capture = False
50
-
51
- while run_camera and cap.isOpened():
52
- ret, frame = cap.read()
53
- if not ret:
54
- break
55
- frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
56
- stframe.image(frame_rgb, caption="Live Camera Feed", channels="RGB")
57
-
58
- if st.button("๐Ÿ“ธ Capture Frame"):
59
- image_pil = Image.fromarray(frame_rgb)
60
- run_camera = False
61
- cap.release()
62
- break
63
-
64
- # Continue processing if we have an image
65
- if image_pil:
66
- image_np = np.array(image_pil)
67
- img_h, img_w = image_np.shape[:2]
68
- st.image(image_pil, caption="Selected Image", use_container_width=True)
69
-
70
- # Real-world reference dimensions
71
- real_image_width_cm = 100
72
- real_image_height_cm = 75
73
- assumed_max_depth_cm = 100
74
-
75
- pixel_to_cm_x = real_image_width_cm / img_w
76
- pixel_to_cm_y = real_image_height_cm / img_h
77
-
78
- # SAM Segmentation
79
- predictor.set_image(image_np)
80
- masks, _, _ = predictor.predict(multimask_output=False)
81
-
82
- # MiDaS Depth Estimation
83
- input_tensor = midas_transform(image_pil).unsqueeze(0)
84
- with torch.no_grad():
85
- depth_prediction = midas_model(input_tensor).squeeze().cpu().numpy()
86
- depth_resized = cv2.resize(depth_prediction, (img_w, img_h))
87
-
88
- # Object volume computation
89
- volume_data = []
90
- for i, mask in enumerate(masks):
91
- mask_np = mask
92
- x, y, w, h = cv2.boundingRect(mask_np.astype(np.uint8))
93
- width_px = w
94
- height_px = h
95
-
96
- width_cm = width_px * pixel_to_cm_x
97
- height_cm = height_px * pixel_to_cm_y
98
-
99
- depth_masked = depth_resized[mask_np > 0.5]
100
-
101
- if depth_masked.size == 0:
102
- continue
103
-
104
- normalized_depth = (depth_masked - np.min(depth_resized)) / (np.max(depth_resized) - np.min(depth_resized) + 1e-6)
105
- depth_cm = np.mean(normalized_depth) * assumed_max_depth_cm
106
-
107
- volume_cm3 = round(depth_cm * width_cm * height_cm, 2)
108
-
109
- volume_data.append({
110
- "Object": f"Object #{i+1}",
111
- "Length (Depth)": f"{round(depth_cm, 2)} cm",
112
- "Breadth (Width)": f"{round(width_cm, 2)} cm",
113
- "Height": f"{round(height_cm, 2)} cm",
114
- "Volume": f"{volume_cm3} cmยณ"
115
- })
116
-
117
- # Display volume table
118
- if volume_data:
119
- df = pd.DataFrame(volume_data)
120
- st.markdown("### ๐Ÿ“Š Object Dimensions and Volume")
121
- st.dataframe(df)
122
-
123
- csv = df.to_csv(index=False).encode('utf-8')
124
- st.download_button("๐Ÿ“‚ Download Volume Table as CSV", csv, "object_volumes_with_units.csv", "text/csv")
125
- else:
126
- st.warning("๐Ÿšซ No objects were segmented.")
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ import subprocess
4
+
5
+ # โฌ‡๏ธ Install `segment_anything` if not already installed
6
+ try:
7
+ from segment_anything import SamPredictor, sam_model_registry
8
+ except ImportError:
9
+ subprocess.check_call([sys.executable, "-m", "pip", "install", "git+https://github.com/facebookresearch/segment-anything.git"])
10
+ from segment_anything import SamPredictor, sam_model_registry
11
+
12
+ import streamlit as st
13
+ import cv2
14
+ import numpy as np
15
+ import pandas as pd
16
+ from PIL import Image
17
+ import torch
18
+ from torchvision.transforms import Compose, Resize, ToTensor, Normalize
19
+ from segment_anything import SamPredictor, sam_model_registry
20
+
21
+ # Set Streamlit configuration
22
+ st.set_page_config(page_title="Volume Estimator", layout="wide")
23
+ st.title("๐Ÿ“ฆ Volume Estimation using SAM Segmentation + MiDaS Depth")
24
+
25
+ # Load SAM and MiDaS models
26
+ @st.cache_resource
27
+ def load_models():
28
+ sam_checkpoint = "C:/Users/Administrator/Desktop/streamlit_tl/models/sam_vit_h_4b8939.pth"
29
+ sam = sam_model_registry["vit_h"](checkpoint=sam_checkpoint).to("cuda" if torch.cuda.is_available() else "cpu")
30
+ predictor = SamPredictor(sam)
31
+
32
+ midas = torch.hub.load("intel-isl/MiDaS", "DPT_Large")
33
+ midas.eval()
34
+ midas_transform = Compose([
35
+ Resize(384),
36
+ ToTensor(),
37
+ Normalize(mean=[0.5]*3, std=[0.5]*3)
38
+ ])
39
+ return predictor, midas, midas_transform
40
+
41
+ predictor, midas_model, midas_transform = load_models()
42
+
43
+ # Input source selection
44
+ source_option = st.radio("Select input source", ("Upload Image", "Use Webcam"))
45
+
46
+ uploaded_file = None
47
+ image_pil = None
48
+
49
+ if source_option == "Upload Image":
50
+ uploaded_file = st.file_uploader("Upload an image", type=["jpg", "jpeg", "png"])
51
+ if uploaded_file:
52
+ image_pil = Image.open(uploaded_file).convert("RGB")
53
+
54
+ elif source_option == "Use Webcam":
55
+ run_camera = st.checkbox("Start Camera")
56
+
57
+ if run_camera:
58
+ cap = cv2.VideoCapture(0)
59
+ stframe = st.empty()
60
+ capture = False
61
+
62
+ while run_camera and cap.isOpened():
63
+ ret, frame = cap.read()
64
+ if not ret:
65
+ break
66
+ frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
67
+ stframe.image(frame_rgb, caption="Live Camera Feed", channels="RGB")
68
+
69
+ if st.button("๐Ÿ“ธ Capture Frame"):
70
+ image_pil = Image.fromarray(frame_rgb)
71
+ run_camera = False
72
+ cap.release()
73
+ break
74
+
75
+ # Continue processing if we have an image
76
+ if image_pil:
77
+ image_np = np.array(image_pil)
78
+ img_h, img_w = image_np.shape[:2]
79
+ st.image(image_pil, caption="Selected Image", use_container_width=True)
80
+
81
+ # Real-world reference dimensions
82
+ real_image_width_cm = 100
83
+ real_image_height_cm = 75
84
+ assumed_max_depth_cm = 100
85
+
86
+ pixel_to_cm_x = real_image_width_cm / img_w
87
+ pixel_to_cm_y = real_image_height_cm / img_h
88
+
89
+ # SAM Segmentation
90
+ predictor.set_image(image_np)
91
+ masks, _, _ = predictor.predict(multimask_output=False)
92
+
93
+ # MiDaS Depth Estimation
94
+ input_tensor = midas_transform(image_pil).unsqueeze(0)
95
+ with torch.no_grad():
96
+ depth_prediction = midas_model(input_tensor).squeeze().cpu().numpy()
97
+ depth_resized = cv2.resize(depth_prediction, (img_w, img_h))
98
+
99
+ # Object volume computation
100
+ volume_data = []
101
+ for i, mask in enumerate(masks):
102
+ mask_np = mask
103
+ x, y, w, h = cv2.boundingRect(mask_np.astype(np.uint8))
104
+ width_px = w
105
+ height_px = h
106
+
107
+ width_cm = width_px * pixel_to_cm_x
108
+ height_cm = height_px * pixel_to_cm_y
109
+
110
+ depth_masked = depth_resized[mask_np > 0.5]
111
+
112
+ if depth_masked.size == 0:
113
+ continue
114
+
115
+ normalized_depth = (depth_masked - np.min(depth_resized)) / (np.max(depth_resized) - np.min(depth_resized) + 1e-6)
116
+ depth_cm = np.mean(normalized_depth) * assumed_max_depth_cm
117
+
118
+ volume_cm3 = round(depth_cm * width_cm * height_cm, 2)
119
+
120
+ volume_data.append({
121
+ "Object": f"Object #{i+1}",
122
+ "Length (Depth)": f"{round(depth_cm, 2)} cm",
123
+ "Breadth (Width)": f"{round(width_cm, 2)} cm",
124
+ "Height": f"{round(height_cm, 2)} cm",
125
+ "Volume": f"{volume_cm3} cmยณ"
126
+ })
127
+
128
+ # Display volume table
129
+ if volume_data:
130
+ df = pd.DataFrame(volume_data)
131
+ st.markdown("### ๐Ÿ“Š Object Dimensions and Volume")
132
+ st.dataframe(df)
133
+
134
+ csv = df.to_csv(index=False).encode('utf-8')
135
+ st.download_button("๐Ÿ“‚ Download Volume Table as CSV", csv, "object_volumes_with_units.csv", "text/csv")
136
+ else:
137
+ st.warning("๐Ÿšซ No objects were segmented.")