Есть скрипт, который обрабатывает изображения с камер, детектит объекты и аннотирует их.
Работает на yolo и supervision. Тестировал все это на стримлит, там работает. Теперь необходимо перенести на джанго - там работает не так(
Стримлит генерирует три отображения видеопотока, по одному для каждой камеры. В Джанго все три камеры отрабатывают в одно "отображение". Как сделать так, чтобы и в джанго тоже было три видеопотока на странице?
Грубо говоря, необходимо сделать "видеостену" в Джанго, на которой бы выводились потоки со всех камер.
Модель инициализируется вот так:
model = YOLO("yolov8n.pt")
results = model("list.streams", stream=True, classes=0, conf=0.9)
Как написано в документации - Return a generator with stream=True
Сам кусок во views.py в джанго:
def video_stream(request):
def generate_frames():
for i, result in enumerate(results):
image = result.orig_img
detection_results = model(image)[0]
detections = sv.Detections.from_ultralytics(detection_results)
detections = tracker.update_with_detections(detections)
annotated_frame = process_frame(image, stream_index=i) # Pass stream_index to process_frame
resized_image = cv2.resize(annotated_frame, (1024, 768))
_, frame = cv2.imencode('.jpg', resized_image)
frame = frame.tobytes()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
return StreamingHttpResponse(generate_frames(), content_type='multipart/x-mixed-replace; boundary=frame')
Вывожу на страницу так:
<div>
<img src="{% url 'video_stream' %}" alt="Video Stream 1" width="1024" height="768">
</div>
Кусок в Стримлит, который работает:
for i, result in enumerate(results):
image = result.orig_img
detection_results = model(image)[0]
detections = sv.Detections.from_ultralytics(detection_results)
detections = tracker.update_with_detections(detections)
annotated_frame = process_frame(image)
resized_image = cv2.resize(annotated_frame, (1024, 768))
video_placeholders[i % 3].image(resized_image, channels="BGR", use_column_width=True, caption=f"Video {i + 1}")