first commit
This commit is contained in:
1 parent
ae53e9eac5
commit
91cbd01126
514 files changed
+55625
-2203
No files matched your search
Binary file not shown.
|
After Width: | Height: | Size: 5.6 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.4 MiB |
Binary file not shown.
+53
@@ -0,0 +1,53 @@
|
||||
from fastapi import FastAPI, HTTPException, Query
|
||||
from fastapi.responses import FileResponse, JSONResponse
|
||||
import os
|
||||
import traceback
|
||||
from processor import process_video_to_panorama
|
||||
|
||||
app = FastAPI(title="Video Density Estimation API")
|
||||
|
||||
@app.get("/process")
|
||||
async def process_video(
|
||||
input_video: str = Query(..., description="Path to input video file"),
|
||||
output_dir: str = Query(..., description="Output directory path")
|
||||
):
|
||||
"""
|
||||
Process video to generate density estimation result
|
||||
|
||||
Args:
|
||||
input_video: Path to input video file (e.g., /path/to/video.mp4)
|
||||
output_dir: Output directory path (e.g., /path/to/output)
|
||||
|
||||
Returns:
|
||||
JSON with result path or error message
|
||||
"""
|
||||
try:
|
||||
# Validate input video
|
||||
if not os.path.exists(input_video):
|
||||
raise HTTPException(status_code=400, detail=f"Input video not found: {input_video}")
|
||||
|
||||
# Process video
|
||||
result_path,total_count = process_video_to_panorama(input_video, output_dir)
|
||||
|
||||
return JSONResponse({
|
||||
"status": "success",
|
||||
"result_path": result_path,
|
||||
"total_count": int(total_count),
|
||||
"message": "Processing completed successfully"
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
error_msg = f"Processing failed: {str(e)}"
|
||||
print(f"Error traceback:\n{traceback.format_exc()}")
|
||||
raise HTTPException(status_code=500, detail=error_msg)
|
||||
|
||||
@app.get("/result")
|
||||
async def get_result(result_path: str = Query(..., description="Path to result image")):
|
||||
"""Download result image"""
|
||||
if not os.path.exists(result_path):
|
||||
raise HTTPException(status_code=404, detail="Result image not found")
|
||||
return FileResponse(result_path)
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
uvicorn.run(app, host="0.0.0.0", port=8000)
|
||||
+268
@@ -0,0 +1,268 @@
|
||||
nohup: ignoring input
|
||||
INFO: Started server process [39713]
|
||||
INFO: Waiting for application startup.
|
||||
INFO: Application startup complete.
|
||||
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
|
||||
ONNX model loaded with providers: ['CUDAExecutionProvider']
|
||||
INFO: 172.16.8.253:36032 - "GET /process?input_video=%2Fdata5%2Ffile%2Fdensity%2F2025%2F11%2F06%2F07033a2c-abf8-486c-bf02-76d7158bd160.mp4&output_dir=%2Fdata5%2Ffile%2Foutput%2F20251106173248 HTTP/1.1" 200 OK
|
||||
INFO: 172.16.8.253:46274 - "GET /process?input_video=%2Fdata5%2Ffile%2Fdensity%2F2025%2F11%2F06%2Feee06cd5-96b0-4927-a0fc-d5d8f72591f2.mp4&output_dir=%2Fdata5%2Ffile%2Foutput%2F20251106182437 HTTP/1.1" 200 OK
|
||||
INFO: 172.16.8.253:40578 - "GET /process?input_video=%2Fdata5%2Ffile%2Fdensity%2F2025%2F11%2F06%2F1c643e2f-eeef-4f4d-926e-f81b012d4c89.mp4&output_dir=%2Fdata5%2Ffile%2Foutput%2F20251106203817 HTTP/1.1" 200 OK
|
||||
INFO: 172.16.8.253:40998 - "GET /process?input_video=%2Fdata5%2Ffile%2Fdensity%2F2025%2F11%2F06%2Fd78190f1-1929-4207-af1c-729386759c81.mp4&output_dir=%2Fdata5%2Ffile%2Foutput%2F20251106204100 HTTP/1.1" 200 OK
|
||||
INFO: 172.16.8.253:41366 - "GET /process?input_video=%2Fdata5%2Ffile%2Fdensity%2F2025%2F11%2F06%2F295e3654-d134-4e80-8d29-01ef1f8f8118.mp4&output_dir=%2Fdata5%2Ffile%2Foutput%2F20251106204254 HTTP/1.1" 200 OK
|
||||
INFO: 172.16.8.253:42858 - "GET /process?input_video=%2Fdata5%2Ffile%2Fdensity%2F2025%2F11%2F06%2Ff91d6e11-af82-4896-96b7-5606e15db4b0.mp4&output_dir=%2Fdata5%2Ffile%2Foutput%2F20251106205112 HTTP/1.1" 200 OK
|
||||
INFO: 172.16.8.253:43242 - "GET /process?input_video=%2Fdata5%2Ffile%2Fdensity%2F2025%2F11%2F06%2F55a201dd-d865-4118-b5ad-f798e170743e.mp4&output_dir=%2Fdata5%2Ffile%2Foutput%2F20251106205338 HTTP/1.1" 200 OK
|
||||
INFO: 172.16.8.253:35640 - "GET /process?input_video=%2Fdata5%2Ffile%2Fdensity%2F2025%2F11%2F07%2Fca5dfe3f-91dd-4a5b-87fb-e61b16a32938.mp4&output_dir=%2Fdata5%2Ffile%2Foutput%2F20251107080758 HTTP/1.1" 200 OK
|
||||
INFO: 172.16.8.253:36852 - "GET /process?input_video=%2Fdata5%2Ffile%2Fdensity%2F2025%2F11%2F07%2F68104776-9dab-4c71-b9a6-5b62f0a56da2.mp4&output_dir=%2Fdata5%2Ffile%2Foutput%2F20251107102003 HTTP/1.1" 200 OK
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:45168 - "GET / HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:45195 - "GET /nice%20ports%2C/Trinity.txt.bak HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:45199 - "OPTIONS / HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:45551 - "GET /nmaplowercheck1762703348 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:45552 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:45559 - "POST /sdk HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:45565 - "GET /HNAP1 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:45568 - "GET /evox/about HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:54407 - "GET http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:54410 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:54412 - "GET /robots.txt HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:54414 - "OPTIONS / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:54416 - "HEAD http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:54418 - "GET /favicon.ico HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:54420 - "CONNECT www.google.com%3A80 HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:46569 - "GET / HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:46600 - "GET /nice%20ports%2C/Trinity.txt.bak HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:46604 - "OPTIONS / HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:46807 - "POST /sdk HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:46814 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:46813 - "GET /nmaplowercheck1763306540 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:46821 - "GET /evox/about HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:46824 - "GET /HNAP1 HTTP/1.1" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:45536 - "GET / HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:45583 - "GET /nice%20ports%2C/Trinity.txt.bak HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:45587 - "OPTIONS / HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:45813 - "GET /nmaplowercheck1763913242 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:45810 - "POST /sdk HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:45812 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:45820 - "GET /HNAP1 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:45822 - "GET /evox/about HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:38472 - "GET http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:38475 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:38477 - "OPTIONS / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:38478 - "GET /robots.txt HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:38484 - "HEAD http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:38486 - "GET /favicon.ico HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:38488 - "CONNECT www.google.com%3A80 HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:43698 - "GET / HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:43744 - "GET /nice%20ports%2C/Trinity.txt.bak HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:43747 - "OPTIONS / HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:44049 - "GET /nmaplowercheck1764518315 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:44051 - "POST /sdk HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:44050 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:44061 - "GET /HNAP1 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:44064 - "GET /evox/about HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:53503 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:53505 - "GET http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:53508 - "OPTIONS / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:53509 - "GET /robots.txt HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:53511 - "HEAD http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:53513 - "GET /favicon.ico HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:53515 - "CONNECT www.google.com%3A80 HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:38906 - "GET / HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:38932 - "GET /nice%20ports%2C/Trinity.txt.bak HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:38936 - "OPTIONS / HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:46904 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:46895 - "POST /sdk HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:46900 - "GET /nmaplowercheck1765122601 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:46909 - "GET /HNAP1 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:46912 - "GET /evox/about HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:36677 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:36679 - "GET http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:36683 - "GET /robots.txt HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:36685 - "OPTIONS / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:36687 - "HEAD http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:36690 - "CONNECT www.google.com%3A80 HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:36691 - "GET /favicon.ico HTTP/1.1" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:47654 - "GET / HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:47720 - "GET /nice%20ports%2C/Trinity.txt.bak HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:47725 - "OPTIONS / HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:48004 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:48006 - "POST /sdk HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:48003 - "GET /nmaplowercheck1765731479 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:48012 - "GET /evox/about HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:48014 - "GET /HNAP1 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:34018 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:34022 - "GET /robots.txt HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:34023 - "OPTIONS / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:34028 - "GET http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:34032 - "HEAD http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:34033 - "GET /favicon.ico HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:34035 - "CONNECT www.google.com%3A80 HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:50736 - "GET / HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:50763 - "GET /nice%20ports%2C/Trinity.txt.bak HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:50766 - "OPTIONS / HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:41450 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:41452 - "POST /sdk HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:41449 - "GET /nmaplowercheck1766334717 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:41458 - "GET /HNAP1 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:41461 - "GET /evox/about HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:58010 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:58011 - "GET /robots.txt HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:58018 - "GET http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:58021 - "OPTIONS / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:58022 - "GET /favicon.ico HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:58024 - "HEAD http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:58028 - "CONNECT www.google.com%3A80 HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:58001 - "GET / HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:58033 - "GET /nice%20ports%2C/Trinity.txt.bak HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:58039 - "OPTIONS / HTTP/1.0" 404 Not Found
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
WARNING: Invalid HTTP request received.
|
||||
INFO: 172.16.0.234:58278 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:58279 - "GET /nmaplowercheck1766940881 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:58283 - "POST /sdk HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:58286 - "GET /HNAP1 HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:58289 - "GET /evox/about HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:54645 - "OPTIONS / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:54646 - "GET / HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:54652 - "GET http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:54649 - "GET /robots.txt HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:54656 - "HEAD http%3A//www.google.com HTTP/1.0" 404 Not Found
|
||||
INFO: 172.16.0.234:54654 - "GET /favicon.ico HTTP/1.1" 404 Not Found
|
||||
INFO: 172.16.0.234:54658 - "CONNECT www.google.com%3A80 HTTP/1.0" 404 Not Found
|
||||
INFO: Shutting down
|
||||
INFO: Waiting for application shutdown.
|
||||
INFO: Application shutdown complete.
|
||||
INFO: Finished server process [39713]
|
||||
@@ -0,0 +1,175 @@
|
||||
import os
|
||||
import cv2
|
||||
import numpy as np
|
||||
import onnxruntime as ort
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
import threading
|
||||
from typing import List, Tuple
|
||||
|
||||
# 全局 ONNX 会话(单例)
|
||||
_ort_session = None
|
||||
_session_lock = threading.Lock()
|
||||
|
||||
def get_ort_session():
|
||||
"""获取 ONNX Runtime 会话(线程安全单例)"""
|
||||
global _ort_session
|
||||
if _ort_session is None:
|
||||
with _session_lock:
|
||||
if _ort_session is None:
|
||||
test_weights = "/data1/Hatcher/model/PopulationCounting/Bayesian_project_ours/sim-CAS-base-test.onnx"
|
||||
if not os.path.exists(test_weights):
|
||||
raise FileNotFoundError(f"ONNX model not found: {test_weights}")
|
||||
|
||||
providers = ["CUDAExecutionProvider"] if "CUDAExecutionProvider" in ort.get_available_providers() else ["CPUExecutionProvider"]
|
||||
_ort_session = ort.InferenceSession(test_weights, providers=providers)
|
||||
print(f"ONNX model loaded with providers: {providers}")
|
||||
return _ort_session
|
||||
|
||||
def extract_specific_frames(video_path: str, frame_numbers: List[int]) -> np.ndarray:
|
||||
"""从视频中提取指定帧号的图像并拼接"""
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
if not cap.isOpened():
|
||||
raise ValueError(f"Cannot open video file: {video_path}")
|
||||
|
||||
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
||||
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
||||
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||||
|
||||
canvas_width = frame_width * len(frame_numbers)
|
||||
canvas = np.zeros((frame_height, canvas_width, 3), dtype=np.uint8)
|
||||
current_frame = 0
|
||||
canvas_position = 0
|
||||
|
||||
for target_frame in sorted(frame_numbers):
|
||||
if target_frame >= total_frames:
|
||||
continue
|
||||
|
||||
while current_frame < target_frame:
|
||||
if not cap.grab():
|
||||
break
|
||||
current_frame += 1
|
||||
|
||||
ret, frame = cap.retrieve()
|
||||
if ret:
|
||||
canvas[:, canvas_position:canvas_position+frame_width] = frame
|
||||
canvas_position += frame_width
|
||||
else:
|
||||
print(f"Warning: Failed to read frame {target_frame}")
|
||||
|
||||
cap.release()
|
||||
|
||||
if canvas_position < canvas_width:
|
||||
canvas = canvas[:, :canvas_position]
|
||||
return canvas
|
||||
|
||||
def split_image(image: np.ndarray) -> Tuple[List[np.ndarray], List[Tuple[int, int]], float, Tuple[int, int]]:
|
||||
"""Split large image into 800x800 patches"""
|
||||
h, w = image.shape[:2]
|
||||
n_segments = max(1, w // 800)
|
||||
target_w = n_segments * 800
|
||||
scale = target_w / w
|
||||
new_w = target_w
|
||||
new_h = int(h * scale)
|
||||
resized_img = cv2.resize(image, (new_w, new_h))
|
||||
|
||||
patches = []
|
||||
positions = []
|
||||
for i in range(0, new_w, 800):
|
||||
patch = resized_img[:, i:i+800]
|
||||
if patch.shape[1] == 800:
|
||||
patches.append(patch)
|
||||
positions.append((i, i+800))
|
||||
return patches, positions, scale, (new_h, new_w)
|
||||
|
||||
def process_patch(patch: np.ndarray, ort_session) -> np.ndarray:
|
||||
"""Process a single 800x800 patch"""
|
||||
img = cv2.resize(patch, (800, 800)) / 255.0
|
||||
img = img[np.newaxis, :, :].transpose(0, 3, 1, 2)
|
||||
input_blob = np.array(img, dtype=np.float32)
|
||||
|
||||
onnx_input_name = ort_session.get_inputs()[0].name
|
||||
onnx_outputs_names = ort_session.get_outputs()[0].name
|
||||
onnx_result = ort_session.run([onnx_outputs_names], {onnx_input_name: input_blob})
|
||||
|
||||
density_map = onnx_result[0][0][0]
|
||||
density_map[density_map < 1e-6] = 0
|
||||
return density_map
|
||||
|
||||
def process_single_image(image_path: str, save_root: str, ort_session, file_lock) -> bool:
|
||||
"""Process a single large image"""
|
||||
try:
|
||||
image_name = os.path.basename(image_path)
|
||||
result_name = f"result_{image_name}"
|
||||
img_or = cv2.imread(image_path)
|
||||
if img_or is None:
|
||||
return False
|
||||
|
||||
patches, positions, scale, (new_h, new_w) = split_image(img_or)
|
||||
density_maps = []
|
||||
total_count = 0
|
||||
|
||||
for patch in patches:
|
||||
density_map = process_patch(patch, ort_session)
|
||||
density_maps.append(density_map)
|
||||
total_count += np.sum(density_map)
|
||||
|
||||
combined_density = np.zeros((new_h, new_w))
|
||||
for density_map, (start_x, end_x) in zip(density_maps, positions):
|
||||
resized_density = cv2.resize(density_map, (800, new_h))
|
||||
combined_density[:, start_x:end_x] = resized_density
|
||||
|
||||
combined_density = cv2.resize(combined_density, (img_or.shape[1], img_or.shape[0]))
|
||||
heatmap = combined_density / np.max(combined_density)
|
||||
heatmap = np.power(heatmap, 0.7)
|
||||
heatmap = np.uint8(heatmap * 255)
|
||||
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
|
||||
|
||||
imgheatmap_W = int(img_or.shape[1] / 3)
|
||||
imgheatmap_H = int(img_or.shape[0] / 3)
|
||||
density_result = cv2.resize(heatmap, (imgheatmap_W, imgheatmap_H))
|
||||
img_or[0:imgheatmap_H, 0:imgheatmap_W] = density_result
|
||||
|
||||
cv2.putText(img_or, f"Count: {int(total_count)}", (50, 200),
|
||||
cv2.FONT_HERSHEY_SIMPLEX, 4, (0, 0, 255), 8)
|
||||
|
||||
save_path = os.path.join(save_root, result_name)
|
||||
with file_lock:
|
||||
cv2.imwrite(save_path, img_or)
|
||||
return True, float(total_count)
|
||||
except Exception as e:
|
||||
print(f"Error processing {image_path}: {str(e)}")
|
||||
return False
|
||||
|
||||
def process_video_to_panorama(video_path: str, output_dir: str) -> Tuple[str, float]:
|
||||
"""Main pipeline: video -> panorama -> density estimation, returns (result_path, total_count)"""
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
# Step 1: Extract frames and create panorama
|
||||
frame_numbers = [13, 82, 196, 290, 381, 483, 697, 798, 893, 1047]
|
||||
panorama = extract_specific_frames(video_path, frame_numbers)
|
||||
panorama_path = os.path.join(output_dir, "panorama.jpg")
|
||||
cv2.imwrite(panorama_path, panorama)
|
||||
|
||||
# Step 2: Process images with ONNX model
|
||||
ort_session = get_ort_session()
|
||||
image_paths = [panorama_path]
|
||||
save_root = output_dir
|
||||
os.makedirs(save_root, exist_ok=True)
|
||||
|
||||
results = []
|
||||
file_lock = threading.Lock()
|
||||
|
||||
def process_with_result(image_path):
|
||||
result = process_single_image(image_path, save_root, ort_session, file_lock)
|
||||
results.append(result) # (success, total_count)
|
||||
|
||||
with ThreadPoolExecutor(max_workers=4) as executor:
|
||||
executor.map(process_with_result, image_paths)
|
||||
|
||||
if not results or not results[0][0]:
|
||||
raise RuntimeError("Failed to process panorama image")
|
||||
|
||||
result_path = os.path.join(save_root, f"result_{os.path.basename(panorama_path)}")
|
||||
total_count = results[0][1] # ← 获取 total_count
|
||||
|
||||
return result_path, total_count # ← 返回 total_count
|
||||
Reference in new issue
Block a user