Я разрабатываю приложение для обнаружения транспортных средств в реальном времени, используя Yolov5, интегрированный в веб-приложение Fastapi. Приложение потоковое видео с URL -адреса RTSP с использованием VLC и запускает обнаружение транспортных средств с помощью YOLO. Тем не менее, я сталкиваюсь с значительными проблемами с отставающими каналами камеры и неточками обнаружения, которые влияют на производительность приложения. yolov5s) < /p>
rtsp потоковая передача: захват потока RTSP с использованием OpenCV и VLC < /p>
Отслеживание транспортных средств: пользовательский центроидтракер для отслеживания транспортных средств через рамки < /p>
# Import libraries
import threading
from fastapi import FastAPI, Request
from fastapi.responses import StreamingResponse
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
from fastapi.templating import Jinja2Templates
import cv2
import torch
import time
import numpy as np
from collections import OrderedDict
# FastAPI setup
app = FastAPI()
# CORS setup
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"])
# Static files and templates
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")
# Load YOLO model globally
device = torch.device("cpu")
model = torch.hub.load("ultralytics/yolov5", "yolov5s", device=device)
# RTSP Stream Setup
RTSP_URL = "rtsp://admin:Deki@[email protected]:554/profile1"
cap = cv2.VideoCapture(RTSP_URL, cv2.CAP_FFMPEG)
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
latest_frame = None
lock = threading.Lock()
# Vehicle Colors Dictionary
VEHICLE_COLORS = {"car": (0, 255, 0), "truck": (255, 0, 0), "bus": (0, 0, 255), "motorcycle": (255, 255, 0)}
# Vehicle tracking
class CentroidTracker:
def __init__(self, maxDisappeared=50):
self.nextObjectID = 0
self.objects = OrderedDict()
self.disappeared = OrderedDict()
self.maxDisappeared = maxDisappeared
def register(self, centroid):
self.objects[self.nextObjectID] = centroid
self.disappeared[self.nextObjectID] = 0
self.nextObjectID += 1
def deregister(self, objectID):
del self.objects[objectID]
del self.disappeared[objectID]
def update(self, rects):
if len(rects) == 0:
for objectID in list(self.disappeared.keys()):
self.disappeared[objectID] += 1
if self.disappeared[objectID] > self.maxDisappeared:
self.deregister(objectID)
return self.objects
inputCentroids = np.zeros((len(rects), 2), dtype="int")
for (i, (startX, startY, endX, endY)) in enumerate(rects):
cX = int((startX + endX) / 2.0)
cY = int((startY + endY) / 2.0)
inputCentroids = (cX, cY)
self.objects = OrderedDict()
for i, centroid in enumerate(inputCentroids):
self.register(centroid)
return self.objects
# Capture frames from RTSP stream
def capture_frames():
global latest_frame
retry_count = 0
max_retries = 5
while True:
if not cap.isOpened():
cap.open(RTSP_URL)
retry_count += 1
if retry_count > max_retries:
break
time.sleep(1.5 ** retry_count)
ret, frame = cap.read()
if ret:
frame = cv2.resize(frame, (640, 360))
with lock:
latest_frame = frame
retry_count = 0
else:
cap.release()
time.sleep(1)
time.sleep(0.03)
# YOLO vehicle detection
def detect_objects():
global latest_frame, vehicle_count
while True:
with lock:
if latest_frame is None:
time.sleep(0.1)
continue
frame = latest_frame.copy()
results = model(frame)
detected_vehicles = []
for det in results.xyxy[0]:
x1, y1, x2, y2, conf, cls = det
label = model.names[int(cls)]
if label in VEHICLE_COLORS:
color = VEHICLE_COLORS[label]
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), color, 2)
label_text = f"{label} ({conf:.2f})"
cv2.putText(frame, label_text, (int(x1), int(y1) - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
detected_vehicles.append({
"label": label,
"confidence": float(conf),
"box": [int(x1), int(y1), int(x2), int(y2)]
})
vehicle_count = len(detected_vehicles)
with lock:
latest_frame = frame
time.sleep(0.1)
# FastAPI endpoints
@app.get("/video")
async def video():
return StreamingResponse(generate_frames(), media_type="multipart/x-mixed-replace; boundary=frame")
@app.get("/stream")
async def stream():
def generate():
global latest_frame
while True:
with lock:
if latest_frame is None:
time.sleep(0.1)
continue
frame = latest_frame.copy()
_, buffer = cv2.imencode(".jpg", frame, [cv2.IMWRITE_JPEG_QUALITY, 80])
yield (b"--frame\r\n"
b"Content-Type: image/jpeg\r\n\r\n" + buffer.tobytes() + b"\r\n")
return StreamingResponse(generate(), media_type="multipart/x-mixed-replace; boundary=frame")
@app.get("/count")
async def get_vehicle_count():
return {
"count": vehicle_count,
"vehicles": detected_vehicles
}
< /code>
Проблемы: < /p>
Задержка подачи камеры: несмотря на установку размеров буферов и регулировка рамки
, задержка подачи камеры при потоковой передаче от RTSP-подачи, который
вызывает обнаружение транспортного средства в реальном времени. Неточности: из -за задержки в подаче точность обнаружения транспортного средства
значительно снижается. Модель YOLO
борется за то, чтобы правильно обнаружить транспортные средства в реальном времени. /> Оптимизация модели: использование Yolov5s (мобильная версия) для баланса
точность и производительность, но проблема сохраняется. /> Уменьшенное разрешение: я уменьшил разрешение кадра (640x360), чтобы
уменьшил нагрузку, но не полностью разрешило отставание. < /p>
< /li>
< /ol>
Подробнее здесь: https://stackoverflow.com/questions/795 ... -optimizat
Обнаружение транспортных средств с использованием ЙОЛО на процессоре с отставанием потока RTSP - поиск оптимизации ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Данные формы не сохраняются в базе данных в системе запросов транспортных средств Laravel
Anonymous » » в форуме Php - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-