Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -263,6 +263,51 @@ async def predict_action(uuid: str):
|
|
263 |
async def run_video_processing(file_path: str):
|
264 |
# Cette fonction va utiliser l'exécuteur pour éviter de bloquer le thread principal
|
265 |
loop = asyncio.get_event_loop()
|
266 |
-
result = await loop.run_in_executor(executor,
|
267 |
# Vous pouvez ici stocker ou traiter les résultats
|
268 |
print(result) # ou enregistrez dans une base de données, etc.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
263 |
async def run_video_processing(file_path: str):
|
264 |
# Cette fonction va utiliser l'exécuteur pour éviter de bloquer le thread principal
|
265 |
loop = asyncio.get_event_loop()
|
266 |
+
result = await loop.run_in_executor(executor, predict_video, file_path)
|
267 |
# Vous pouvez ici stocker ou traiter les résultats
|
268 |
print(result) # ou enregistrez dans une base de données, etc.
|
269 |
+
|
270 |
+
|
271 |
+
async def predict_video(video):
|
272 |
+
print("##### predict_video started #####")
|
273 |
+
|
274 |
+
# Charger les frames de la vidéo
|
275 |
+
frames = load_video(video, offload_to_cpu=True)
|
276 |
+
|
277 |
+
# Découper les frames en petits segments de 8 frames
|
278 |
+
segment_size = MAX_SEQ_LENGTH
|
279 |
+
total_frames = len(frames)
|
280 |
+
segments = []
|
281 |
+
|
282 |
+
for i in range(0, total_frames, segment_size):
|
283 |
+
# Découper un segment de 8 frames (ou moins si c'est la fin de la vidéo)
|
284 |
+
segment = frames[i:i+segment_size]
|
285 |
+
segments.append((i, segment)) # Conserver l'index du début du segment et le segment de frames
|
286 |
+
|
287 |
+
# Dictionnaire pour stocker les résultats
|
288 |
+
results = []
|
289 |
+
|
290 |
+
# Analyser chaque segment de 8 frames
|
291 |
+
for start_idx, segment in segments:
|
292 |
+
frame_features = prepare_single_video(segment)
|
293 |
+
probabilities = model.predict(frame_features)[0]
|
294 |
+
|
295 |
+
# Obtenir le top 5 des classes les plus probables
|
296 |
+
top_5_indices = np.argsort(probabilities)[::-1][:5]
|
297 |
+
top_5_classes = {class_labels[i]: float(probabilities[i]) for i in top_5_indices}
|
298 |
+
|
299 |
+
# Ajouter les informations du segment dans les résultats
|
300 |
+
result = {
|
301 |
+
"start_frame": start_idx,
|
302 |
+
"end_frame": min(start_idx + segment_size - 1, total_frames - 1), # Assurer que la frame finale n'excède pas le nombre total de frames
|
303 |
+
"top_5": top_5_classes
|
304 |
+
}
|
305 |
+
results.append(result)
|
306 |
+
|
307 |
+
# Sauvegarder le résultat dans un fichier JSON
|
308 |
+
output_file = "result.json"
|
309 |
+
with open(output_file, "w") as f:
|
310 |
+
json.dump(results, f)
|
311 |
+
|
312 |
+
return results
|
313 |
+
|