Alessio Grancini
commited on
Update app.py
Browse files
app.py
CHANGED
|
@@ -148,69 +148,65 @@ def get_camera_matrix(depth_estimator):
|
|
| 148 |
|
| 149 |
|
| 150 |
@spaces.GPU
|
| 151 |
-
def get_detection_data(
|
| 152 |
"""Get structured detection data with depth information, using Base64 image encoding."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 153 |
|
| 154 |
-
|
| 155 |
-
"""Decodes Base64 string into a NumPy image."""
|
| 156 |
try:
|
| 157 |
-
|
| 158 |
-
img_data = base64.b64decode(base64_string)
|
| 159 |
img = Image.open(BytesIO(img_data))
|
| 160 |
img = np.array(img)
|
| 161 |
-
|
| 162 |
except Exception as e:
|
| 163 |
-
|
| 164 |
-
return None
|
| 165 |
-
|
| 166 |
-
def encode_base64_image(image):
|
| 167 |
-
"""Encodes a NumPy image into a Base64 string."""
|
| 168 |
-
try:
|
| 169 |
-
_, buffer = cv2.imencode('.png', image)
|
| 170 |
-
return base64.b64encode(buffer).decode("utf-8")
|
| 171 |
-
except Exception as e:
|
| 172 |
-
print(f"🚨 Error encoding image to Base64: {e}")
|
| 173 |
-
return None
|
| 174 |
-
|
| 175 |
-
try:
|
| 176 |
-
if not isinstance(image, str):
|
| 177 |
-
print("🚨 Error: Expected Base64 string but received:", type(image))
|
| 178 |
-
return {"error": "Invalid input format. Expected Base64-encoded image."}
|
| 179 |
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
return {"error": "Base64 decoding failed. Ensure correct encoding."}
|
| 183 |
-
|
| 184 |
-
# Resize image
|
| 185 |
-
image = utils.resize(image)
|
| 186 |
-
|
| 187 |
-
# Extract dimensions
|
| 188 |
-
height, width = image.shape[:2]
|
| 189 |
-
|
| 190 |
-
# Get detections and depth
|
| 191 |
image_segmentation, objects_data = img_seg.predict(image)
|
| 192 |
depthmap, depth_colormap = depth_estimator.make_prediction(image)
|
| 193 |
|
| 194 |
-
#
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 206 |
}
|
| 207 |
|
|
|
|
|
|
|
| 208 |
except Exception as e:
|
| 209 |
print(f"🚨 Error in get_detection_data: {str(e)}")
|
| 210 |
return {"error": str(e)}
|
| 211 |
|
| 212 |
-
|
| 213 |
-
|
| 214 |
|
| 215 |
def cancel():
|
| 216 |
CANCEL_PROCESSING = True
|
|
|
|
| 148 |
|
| 149 |
|
| 150 |
@spaces.GPU
|
| 151 |
+
def get_detection_data(image_data):
|
| 152 |
"""Get structured detection data with depth information, using Base64 image encoding."""
|
| 153 |
+
try:
|
| 154 |
+
# Handle both string and dict input formats
|
| 155 |
+
if isinstance(image_data, dict):
|
| 156 |
+
image = image_data.get('data', '')
|
| 157 |
+
else:
|
| 158 |
+
image = image_data
|
| 159 |
+
|
| 160 |
+
if not isinstance(image, str):
|
| 161 |
+
return {"error": f"Invalid input format. Expected string or dict with 'data' key, got {type(image)}"}
|
| 162 |
|
| 163 |
+
# Decode base64 image
|
|
|
|
| 164 |
try:
|
| 165 |
+
img_data = base64.b64decode(image)
|
|
|
|
| 166 |
img = Image.open(BytesIO(img_data))
|
| 167 |
img = np.array(img)
|
| 168 |
+
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
|
| 169 |
except Exception as e:
|
| 170 |
+
return {"error": f"Base64 decoding failed: {str(e)}"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 171 |
|
| 172 |
+
# Process image
|
| 173 |
+
image = utils.resize(img)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 174 |
image_segmentation, objects_data = img_seg.predict(image)
|
| 175 |
depthmap, depth_colormap = depth_estimator.make_prediction(image)
|
| 176 |
|
| 177 |
+
# Prepare structured response with spatial data
|
| 178 |
+
processed_objects = []
|
| 179 |
+
for obj in objects_data:
|
| 180 |
+
cls_id, cls_name, center, mask, color = obj
|
| 181 |
+
depth_value = depth_at_center(depthmap, [center[0]-10, center[1]-10, center[0]+10, center[1]+10])
|
| 182 |
+
|
| 183 |
+
processed_objects.append({
|
| 184 |
+
"class_id": int(cls_id),
|
| 185 |
+
"class_name": cls_name,
|
| 186 |
+
"center": {"x": float(center[0]), "y": float(center[1])},
|
| 187 |
+
"depth": float(depth_value),
|
| 188 |
+
"color": [int(c) for c in color]
|
| 189 |
+
})
|
| 190 |
+
|
| 191 |
+
# Encode results
|
| 192 |
+
response = {
|
| 193 |
+
"detections": processed_objects,
|
| 194 |
+
"depth_map": encode_base64_image(depth_colormap),
|
| 195 |
+
"segmentation": encode_base64_image(image_segmentation),
|
| 196 |
+
"camera_matrix": {
|
| 197 |
+
"fx": depth_estimator.fx_depth,
|
| 198 |
+
"fy": depth_estimator.fy_depth,
|
| 199 |
+
"cx": depth_estimator.cx_depth,
|
| 200 |
+
"cy": depth_estimator.cy_depth
|
| 201 |
+
}
|
| 202 |
}
|
| 203 |
|
| 204 |
+
return response
|
| 205 |
+
|
| 206 |
except Exception as e:
|
| 207 |
print(f"🚨 Error in get_detection_data: {str(e)}")
|
| 208 |
return {"error": str(e)}
|
| 209 |
|
|
|
|
|
|
|
| 210 |
|
| 211 |
def cancel():
|
| 212 |
CANCEL_PROCESSING = True
|