David Shavin commited on
Commit
612105e
·
1 Parent(s): 231b637

adding mvp backend

Browse files
Files changed (3) hide show
  1. Dockerfile +22 -0
  2. main.py +39 -0
  3. requirements.txt +7 -0
Dockerfile ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Start with Python 3.9
2
+ FROM python:3.9
3
+
4
+ # Install system libraries required for OpenCV
5
+ RUN apt-get update && apt-get install -y libgl1-mesa-glx
6
+
7
+ # Set working directory
8
+ WORKDIR /code
9
+
10
+ # Copy requirements and install dependencies
11
+ COPY ./requirements.txt /code/requirements.txt
12
+ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
13
+
14
+ # Create a writable directory for YOLO weights & temporary files
15
+ # Hugging Face runs as user 1000, so we must give permission
16
+ RUN mkdir -p /code/temp_files && chmod 777 /code/temp_files
17
+
18
+ # Copy the rest of the code
19
+ COPY . .
20
+
21
+ # Start the server on port 7860
22
+ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
main.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, UploadFile, File
2
+ from fastapi.responses import FileResponse
3
+ from ultralytics import YOLO
4
+ import shutil
5
+ import os
6
+
7
+ app = FastAPI()
8
+
9
+ # Load the model (Nano version is best for free CPU tier)
10
+ model = YOLO('yolov8n.pt')
11
+
12
+ # Define paths
13
+ TEMP_FOLDER = "temp_files"
14
+ os.makedirs(TEMP_FOLDER, exist_ok=True)
15
+
16
+ @app.get("/")
17
+ def home():
18
+ return {"message": "YOLOv8 Tracking API is Active"}
19
+
20
+ @app.post("/track-video")
21
+ async def track_video(file: UploadFile = File(...)):
22
+ # 1. Define paths
23
+ input_path = os.path.join(TEMP_FOLDER, "input.mp4")
24
+
25
+ # 2. Save uploaded video to disk
26
+ with open(input_path, "wb") as buffer:
27
+ shutil.copyfileobj(file.file, buffer)
28
+
29
+ # 3. Run YOLOv8 Tracking
30
+ # project=TEMP_FOLDER ensures output saves to our writable directory
31
+ # name='result' creates a subfolder
32
+ results = model.track(source=input_path, save=True, project=TEMP_FOLDER, name="tracking_result", exist_ok=True)
33
+
34
+ # YOLO usually saves as .avi by default.
35
+ # The output path will be something like: temp_files/tracking_result/input.avi
36
+ output_video_path = os.path.join(TEMP_FOLDER, "tracking_result", "input.avi")
37
+
38
+ # 4. Return the processed video file
39
+ return FileResponse(output_video_path, media_type="video/x-msvideo", filename="tracked_video.avi")
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ fastapi
2
+ python-multipart
3
+ uvicorn
4
+ easyocr
5
+ numpy
6
+ opencv-python-headless
7
+ ultralytics