Spaces:
Sleeping
Sleeping
popboat1 commited on
Commit ·
0bc36ed
1
Parent(s): 11890f3
Optimize video stream payload and fix WebSocket CORS policy
Browse files- src/api/api.py +17 -11
src/api/api.py
CHANGED
|
@@ -8,7 +8,6 @@ import base64
|
|
| 8 |
import math
|
| 9 |
import os
|
| 10 |
import asyncio
|
| 11 |
-
import traceback
|
| 12 |
|
| 13 |
gpus = tf.config.list_physical_devices('GPU')
|
| 14 |
if gpus:
|
|
@@ -23,7 +22,7 @@ app = FastAPI()
|
|
| 23 |
app.add_middleware(
|
| 24 |
CORSMiddleware,
|
| 25 |
allow_origins=["*"],
|
| 26 |
-
allow_credentials=
|
| 27 |
allow_methods=["*"],
|
| 28 |
allow_headers=["*"],
|
| 29 |
)
|
|
@@ -82,9 +81,15 @@ def generate_feature_grid(feature_map, max_features=64):
|
|
| 82 |
grid_image[y_start:y_end, x_start:x_end] = channel_img
|
| 83 |
|
| 84 |
grid_image = np.uint8(grid_image)
|
|
|
|
| 85 |
colored_grid = cv2.applyColorMap(grid_image, cv2.COLORMAP_VIRIDIS)
|
| 86 |
|
| 87 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
return base64.b64encode(buffer).decode('utf-8')
|
| 89 |
|
| 90 |
@app.post("/predict")
|
|
@@ -98,12 +103,14 @@ async def predict_image(file: UploadFile = File(...)):
|
|
| 98 |
img_batch = np.expand_dims(img_normalized, axis=0)
|
| 99 |
|
| 100 |
activations = feature_extractor.predict(img_batch)
|
|
|
|
| 101 |
predictions = model.predict(img_batch)
|
| 102 |
class_idx = np.argmax(predictions[0])
|
| 103 |
|
| 104 |
layer_data = []
|
| 105 |
for i, activation in enumerate(activations):
|
| 106 |
b64_image = generate_feature_grid(activation)
|
|
|
|
| 107 |
layer_data.append({
|
| 108 |
"layer_index": i + 1,
|
| 109 |
"shape": activation.shape[1:],
|
|
@@ -135,17 +142,17 @@ async def predict_video_stream(websocket: WebSocket):
|
|
| 135 |
img_normalized = img_resized.astype(np.float32) / 255.0
|
| 136 |
img_batch = np.expand_dims(img_normalized, axis=0)
|
| 137 |
|
| 138 |
-
activations = feature_extractor(img_batch,
|
| 139 |
-
predictions = model(img_batch,
|
| 140 |
-
class_idx = np.argmax(predictions[0]
|
| 141 |
|
| 142 |
layer_data = []
|
| 143 |
for i, activation in enumerate(activations):
|
| 144 |
-
b64_image = generate_feature_grid(activation
|
| 145 |
layer_data.append({
|
| 146 |
"layer_index": i + 1,
|
| 147 |
"shape": activation.shape[1:],
|
| 148 |
-
"texture_b64": f"data:image/
|
| 149 |
})
|
| 150 |
|
| 151 |
await websocket.send_json({
|
|
@@ -156,9 +163,8 @@ async def predict_video_stream(websocket: WebSocket):
|
|
| 156 |
await asyncio.sleep(0.01)
|
| 157 |
|
| 158 |
except WebSocketDisconnect:
|
| 159 |
-
print("WebSocket Disconnected
|
| 160 |
except Exception as e:
|
| 161 |
-
print(f"WebSocket
|
| 162 |
-
traceback.print_exc()
|
| 163 |
|
| 164 |
app.mount("/", StaticFiles(directory="static", html=True), name="static")
|
|
|
|
| 8 |
import math
|
| 9 |
import os
|
| 10 |
import asyncio
|
|
|
|
| 11 |
|
| 12 |
gpus = tf.config.list_physical_devices('GPU')
|
| 13 |
if gpus:
|
|
|
|
| 22 |
app.add_middleware(
|
| 23 |
CORSMiddleware,
|
| 24 |
allow_origins=["*"],
|
| 25 |
+
allow_credentials=True,
|
| 26 |
allow_methods=["*"],
|
| 27 |
allow_headers=["*"],
|
| 28 |
)
|
|
|
|
| 81 |
grid_image[y_start:y_end, x_start:x_end] = channel_img
|
| 82 |
|
| 83 |
grid_image = np.uint8(grid_image)
|
| 84 |
+
|
| 85 |
colored_grid = cv2.applyColorMap(grid_image, cv2.COLORMAP_VIRIDIS)
|
| 86 |
|
| 87 |
+
b_channel, g_channel, r_channel = cv2.split(colored_grid)
|
| 88 |
+
alpha_channel = grid_image # Use the raw grayscale intensity as the alpha map
|
| 89 |
+
|
| 90 |
+
transparent_grid = cv2.merge((b_channel, g_channel, r_channel, alpha_channel))
|
| 91 |
+
|
| 92 |
+
_, buffer = cv2.imencode('.png', transparent_grid)
|
| 93 |
return base64.b64encode(buffer).decode('utf-8')
|
| 94 |
|
| 95 |
@app.post("/predict")
|
|
|
|
| 103 |
img_batch = np.expand_dims(img_normalized, axis=0)
|
| 104 |
|
| 105 |
activations = feature_extractor.predict(img_batch)
|
| 106 |
+
|
| 107 |
predictions = model.predict(img_batch)
|
| 108 |
class_idx = np.argmax(predictions[0])
|
| 109 |
|
| 110 |
layer_data = []
|
| 111 |
for i, activation in enumerate(activations):
|
| 112 |
b64_image = generate_feature_grid(activation)
|
| 113 |
+
|
| 114 |
layer_data.append({
|
| 115 |
"layer_index": i + 1,
|
| 116 |
"shape": activation.shape[1:],
|
|
|
|
| 142 |
img_normalized = img_resized.astype(np.float32) / 255.0
|
| 143 |
img_batch = np.expand_dims(img_normalized, axis=0)
|
| 144 |
|
| 145 |
+
activations = feature_extractor.predict(img_batch, verbose=0)
|
| 146 |
+
predictions = model.predict(img_batch, verbose=0)
|
| 147 |
+
class_idx = np.argmax(predictions[0])
|
| 148 |
|
| 149 |
layer_data = []
|
| 150 |
for i, activation in enumerate(activations):
|
| 151 |
+
b64_image = generate_feature_grid(activation)
|
| 152 |
layer_data.append({
|
| 153 |
"layer_index": i + 1,
|
| 154 |
"shape": activation.shape[1:],
|
| 155 |
+
"texture_b64": f"data:image/png;base64,{b64_image}"
|
| 156 |
})
|
| 157 |
|
| 158 |
await websocket.send_json({
|
|
|
|
| 163 |
await asyncio.sleep(0.01)
|
| 164 |
|
| 165 |
except WebSocketDisconnect:
|
| 166 |
+
print("WebSocket Disconnected")
|
| 167 |
except Exception as e:
|
| 168 |
+
print(f"WebSocket Error: {e}")
|
|
|
|
| 169 |
|
| 170 |
app.mount("/", StaticFiles(directory="static", html=True), name="static")
|