Привет, мне нужна помощь в передаче видеоданных 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>
Вернуться на верх