Alessio Grancini
commited on
Update app.py
Browse files
app.py
CHANGED
@@ -149,37 +149,57 @@ def get_camera_matrix(depth_estimator):
|
|
149 |
|
150 |
@spaces.GPU
|
151 |
def get_detection_data(image_data):
|
152 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
153 |
try:
|
154 |
-
#
|
155 |
if isinstance(image_data, dict):
|
156 |
-
image
|
|
|
|
|
157 |
else:
|
158 |
-
|
|
|
|
|
|
|
|
|
159 |
|
160 |
-
|
161 |
-
|
|
|
|
|
|
|
|
|
162 |
|
163 |
-
# Decode base64
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
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
|
178 |
processed_objects = []
|
179 |
for obj in objects_data:
|
180 |
cls_id, cls_name, center, mask, color = obj
|
181 |
-
depth_value = depth_at_center(
|
182 |
-
|
|
|
|
|
183 |
processed_objects.append({
|
184 |
"class_id": int(cls_id),
|
185 |
"class_name": cls_name,
|
@@ -188,7 +208,6 @@ def get_detection_data(image_data):
|
|
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),
|
@@ -200,7 +219,6 @@ def get_detection_data(image_data):
|
|
200 |
"cy": depth_estimator.cy_depth
|
201 |
}
|
202 |
}
|
203 |
-
|
204 |
return response
|
205 |
|
206 |
except Exception as e:
|
|
|
149 |
|
150 |
@spaces.GPU
|
151 |
def get_detection_data(image_data):
|
152 |
+
"""
|
153 |
+
Get structured detection data with depth information, using a nested JSON + Base64 image.
|
154 |
+
Expects Lens Studio to send:
|
155 |
+
{
|
156 |
+
"image": {
|
157 |
+
"image": {
|
158 |
+
"data": "data:image/png;base64,<BASE64>"
|
159 |
+
}
|
160 |
+
}
|
161 |
+
}
|
162 |
+
or just a direct string.
|
163 |
+
"""
|
164 |
try:
|
165 |
+
# 1) Extract the nested "data" string if it's a dict
|
166 |
if isinstance(image_data, dict):
|
167 |
+
# For the structure: {"image": {"image": {"data": "data:image/png;base64,..."}}}
|
168 |
+
nested_dict = image_data.get("image", {}).get("image", {})
|
169 |
+
full_data_url = nested_dict.get("data", "")
|
170 |
else:
|
171 |
+
# If not a dict, assume it's a direct string
|
172 |
+
full_data_url = image_data
|
173 |
+
|
174 |
+
if not full_data_url:
|
175 |
+
return {"error": "No base64 data found in input."}
|
176 |
|
177 |
+
# 2) Strip the "data:image/..." prefix if present
|
178 |
+
if full_data_url.startswith("data:image"):
|
179 |
+
# split once on comma => ["data:image/png;base64", "<BASE64>"]
|
180 |
+
_, b64_string = full_data_url.split(",", 1)
|
181 |
+
else:
|
182 |
+
b64_string = full_data_url
|
183 |
|
184 |
+
# 3) Decode base64 -> PIL -> OpenCV
|
185 |
+
img_data = base64.b64decode(b64_string)
|
186 |
+
img = Image.open(BytesIO(img_data))
|
187 |
+
img = np.array(img)
|
188 |
+
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
|
|
|
|
|
|
|
189 |
|
190 |
+
# 4) Process image
|
191 |
image = utils.resize(img)
|
192 |
image_segmentation, objects_data = img_seg.predict(image)
|
193 |
depthmap, depth_colormap = depth_estimator.make_prediction(image)
|
194 |
|
195 |
+
# 5) Prepare structured response
|
196 |
processed_objects = []
|
197 |
for obj in objects_data:
|
198 |
cls_id, cls_name, center, mask, color = obj
|
199 |
+
depth_value = depth_at_center(
|
200 |
+
depthmap,
|
201 |
+
[center[0] - 10, center[1] - 10, center[0] + 10, center[1] + 10]
|
202 |
+
)
|
203 |
processed_objects.append({
|
204 |
"class_id": int(cls_id),
|
205 |
"class_name": cls_name,
|
|
|
208 |
"color": [int(c) for c in color]
|
209 |
})
|
210 |
|
|
|
211 |
response = {
|
212 |
"detections": processed_objects,
|
213 |
"depth_map": encode_base64_image(depth_colormap),
|
|
|
219 |
"cy": depth_estimator.cy_depth
|
220 |
}
|
221 |
}
|
|
|
222 |
return response
|
223 |
|
224 |
except Exception as e:
|