Привет, мне нужна помощь в передаче видеоданных cv2 yolov8s в приложение django, которое я получил для своего проекта.
Я новичок в разработке нейронных сетей Я получил предварительно обученную модель YOLO8s и обучил ее на моем пользовательском наборе данных, сделал класс на питоне, используя cv2 для отображения результатов Теперь мне нужна помощь в передаче видеосигнала cv2 yolov8s в приложение django, которое я получил для своего проекта, как мне это сделать?
'''
from ultralytics import YOLO
from pathlib import Path
import cv2, onnx, onnxoptimizer,numpy,onnxruntime
import torch.onnx
import torchvision.models as models
from database.db import *
from pprint import pprint as pt
class Main_field:
def __init__(self, model, size, source, conf_):
self.model = self.load_model(model)
self.size = size
self.source = source
self.conf_ = conf_
def __call__(self):
self.process_video()
def load_model(self, model):
model.fuse()
return model
def process_video(self):
cap = cv2.VideoCapture(self.source)
while True:
ret, frame = cap.read()
if not ret: break
results = self.model.predict(frame, conf=self.conf_, imgsz=self.size)
masks_dict=[result.names for result in results][0]
xyxys=[result.boxes.cpu().numpy().xyxy for result in results][0] #xyxy
mask_ids=[result.boxes.cpu().numpy().cls.astype(int).tolist() for result in results][0]
masks=[masks_dict[itr] for itr in mask_ids]
db_output=[check_(local_list,str(itr)) for itr in mask_ids if itr]
video_outp=cv2.imshow("_________", results[0].plot())
pt(mask_ids)
if cv2.waitKey(1) & 0xFF == ord('q'): break
def __del__():
cap.release()
cv2.destroyAllWindows()
def init_model(path: str) -> any: return YOLO(path)
'''
ищу примеры того, как я могу передать постоянный видеопоток на мою веб-страницу
Вам нужно использовать возможности djangos для потокового видеоконтента (я не эксперт по django), сначала вам нужно сделать генератор из вашей функции:
def process_video(self):
cap = cv2.VideoCapture(self.source)
while True:
ret, frame = cap.read()
if not ret: break
results = self.model.predict(frame, conf=self.conf_, imgsz=self.size)
# here is your way to annotate frame
annotated_frame = ...
# here you convert image to bytes
image = Image.fromarray(annotated_frame)
img_buffer = io.BytesIO()
image.save(img_buffer, format='JPEG')
img_bytes = img_buffer.getvalue()
yield (b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + img_bytes + b'\r\n')
и затем вам нужно создать некоторое представление (не уверен, как это должно быть в django, возможно, вы должны добавить что-то вроде этого в ваш существующий код)
class VideoStream(View):
def get(self, request, *args, **kwargs):
return StreamingHttpResponse(process_video(), content_type='multipart/xmixed-replace; boundary=frame')
после этого на вашей html-странице нужно создать элемент, выводящий потоковый ответ, он будет выглядеть примерно так
<div class="">
<img src="{% url 'your_response_root' %}" width="1024" height="768">
</div>