L_011 2025-03-06 22:41 采纳率: 0%
浏览 10

results[0].boxes.data.shape[0] == 0 ,目标检测模型怎么也识别不出来,怎么办?

esults[0].boxes.data.shape[0] == 0 ,目标检测模型.pt文件怎么也识别不出物品,怎么办?

我正在django+websocket做了一个实时缺陷检测的系统

识别那块仿造的是一个系统里面的代码,明明同模型.pt文件和物品,借鉴的代码挺多的,但是我自己写的就是识别不出来,esults[0].boxes.data.shape[0] == 0

有没有兄弟帮忙看看呀/(ㄒoㄒ)/~~

我的代码

print("检测结果:", results[0].boxes.data)

一直都识别不到

img



CameraThread.py文件

import asyncio
import base64
import json
import threading
import time
from ultralytics import YOLO

import cv2
import websockets

# 为了测试而写死的路径
ws_url = "ws://localhost:8001/ws/detection/"

class CameraThread(threading.Thread):

    def __init__(self, camera_id):
        super().__init__()
        self.camera_id = camera_id
        self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
        self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)  # 让 OpenCV 只存最新帧
        self.running = True

    def run(self):
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        loop.run_until_complete(self.send_video())

    async def send_video(self):
        while self.running:
            try:
                print(ws_url + self.camera_id + '/')
                async with websockets.connect(ws_url + self.camera_id + '/') as websocket:
                    while self.running:
                        ret, frame = self.cap.read()

                        _, buffer = cv2.imencode(".jpg", frame)
                        if not ret:
                            print("图像编码失败")
                            continue
                        image_base64 = base64.b64encode(buffer).decode("utf-8")

                        # 发送到 WebSocket
                        await websocket.send(json.dumps({
                            "camera_id": self.camera_id,
                            "image": image_base64
                        }))

                        # 处理服务器的响应
                        response = await websocket.recv()
                        await asyncio.sleep(0.03)  # 控制帧率

            except websockets.exceptions.ConnectionClosed as e:
                print(f"WebSocket 连接关闭: {e}")
                await asyncio.sleep(1)  # 等待1秒后重试
            except Exception as e:
                print(f"发生错误: {e}")
                await asyncio.sleep(1)  # 等待1秒后重试

    def stop(self):
        """ 关闭摄像头 """
        self.running = False
        self.cap.release()  # 释放相机资源
        print(f"Camera {self.camera_id} 已关闭")
DetectConsumer.py文件

from ultralytics import YOLO
import json
import asyncio
import base64
import numpy as np
import cv2
from channels.generic.websocket import AsyncWebsocketConsumer

from detection.Yaml_Tool import myYamlTool


class DetectConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.camera_id = self.scope['url_route']['kwargs']['camera_id']

        print(f"[INFO] 摄像头连接:{self.channel_name}")
        await self.accept()

    async def disconnect(self, close_code):
        print(f"[INFO] 摄像头断开:{self.channel_name}")

    async def receive(self, text_data):
        """ 处理前端发送的数据 """
        data = json.loads(text_data)
        self.camera_id = data.get("camera_id")
        image_base64 = data.get("image")

        self.yamlTool = myYamlTool()
        self.yamlData = self.yamlTool.read_yaml(r'detection/config.yaml')
        # TODO 置信度
        zxd = self.yamlData['threshold'] if data.get("zxd") is None else data.get("zxd")

        if image_base64:
            # 解码图片
            image_data = base64.b64decode(image_base64)
            np_arr = np.frombuffer(image_data, np.uint8)
            frame = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)

            self.model = YOLO(model="detection/YoloModel/best.pt")
            results = self.model(frame)

            print("检测结果:", results[0].boxes.data)

            #
            if results[0].boxes.data.shape[0] == 0:
                print("⚠️ 未检测到目标,返回原始图像")

            for result in results[0].boxes.data:
                x1, y1, x2, y2, conf, cls = result
                label = f"{self.model.names[int(cls)]}: {conf:.2f}"
                cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
                cv2.putText(frame, label, (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)

            _, buffer = cv2.imencode(".jpg", frame)
            image_base64 = base64.b64encode(buffer).decode("utf-8")

            # 返回处理后的图像
            await self.send(json.dumps({
                "camera_id": self.camera_id,
                "image": image_base64
            }))

        else:
            await self.send(json.dumps({
                "camera_id": None
            }))

我仿造的系统代码

print("检测结果:", results[0].boxes.data)

识别成功

img


import time

import cv2
from ultralytics import YOLO
import numpy as np
from PyQt5 import QtGui
from PyQt5.QtCore import pyqtSignal, QThread
import warnings

warnings.filterwarnings('ignore')

class MyThread(QThread):
    camera_signal = pyqtSignal(object)  # 输出相机数据流
    info_signal = pyqtSignal(str)  # 输出信息状态

    def __init__(self, parent=None):
        super().__init__(parent)
        self.drawLine = False
        self.monoCamera = None
        self.FrameBufferSize = None
        self.isPause = False
        self.model = YOLO(model="./YoloModel/best.pt")
        self.latest_frame = None
        self.cap = None  # 初始化摄像头对象

    def __del__(self):
        if self.cap is not None:
            self.cap.release()  # 释放相机资源

    def get_latest_frame(self):
        return self.latest_frame

    def run(self):
        self.cap = cv2.VideoCapture(0)  # 使用默认相机
        if not self.cap.isOpened():
            self.info_signal.emit("【{}】 无法打开相机".format(time.strftime("%Y-%m-%d %H:%M:%S")))
            return
        else:
            self.info_signal.emit("【{}】 相机已成功打开".format(time.strftime("%Y-%m-%d %H:%M:%S")))

        while not self.isPause:
            ret, frame = self.cap.read()  # 从相机捕获图像
            if not ret:
                self.info_signal.emit("【{}】 无法读取图像".format(time.strftime("%Y-%m-%d %H:%M:%S")))
                break

            # 存储最新帧
            self.latest_frame = frame

            # 处理图像(例如,YOLO检测)
            print(frame)
            results = self.model(frame)  # 获取检测结果
            print("检测结果:", results[0].boxes.data)
            for result in results[0].boxes.data:  # 使用boxes来访问检测框数据
                x1, y1, x2, y2, conf, cls = result
                label = f"{self.model.names[int(cls)]}: {conf:.2f}"

                # 绘制矩形框
                cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
                cv2.putText(frame, label, (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)

            # 将图像转换为 PyQt5 可显示的格式
            showImage = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0],
                                     QtGui.QImage.Format_BGR888).rgbSwapped()
            self.camera_signal.emit(showImage)  # 发射图像信号
            self.info_signal.emit("【{}】 实时显示中......".format(time.strftime("%Y-%m-%d %H:%M:%S")))
            time.sleep(0.03)  # 控制帧率

        self.cap.release()  # 释放相机资源
        self.info_signal.emit("【{}】 相机已关闭".format(time.strftime("%Y-%m-%d %H:%M:%S")))
  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-03-06 22:41
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    你遇到的问题是目标检测模型无法识别物品,导致results[0].boxes.data.shape[0] == 0。以下是一些可能的解决方案:

    1. 模型训练数据问题:检查你的模型训练数据是否足够,是否包含足够的样本和类别。目标检测模型需要大量的高质量训练数据来学习特征和分类。
    2. 模型配置问题:检查你的模型配置是否正确,包括输入尺寸、batch size、学习率等参数。目标检测模型需要根据输入数据的尺寸和类型进行调整。
    3. 数据预处理问题:检查你的数据是否进行了正确的预处理,包括数据 normalization、数据 augmentation等。目标检测模型需要输入的数据是标准化的和可靠的。
    4. 模型评估问题:检查你的模型是否在训练和测试阶段都有良好的性能。目标检测模型需要在训练和测试阶段都有高的准确率和召回率。
    5. 实时检测问题:检查你的实时检测系统是否正确地将数据传输到模型中。目标检测模型需要实时接收数据并进行检测。

    代码示例

    以下是一个简单的目标检测模型的代码示例,使用 PyTorch 和 OpenCV:

    import torch
    import cv2
    import numpy as np
    
    # 加载模型
    model = torch.load('model.pt')
    
    # 读取视频或图片
    cap = cv2.VideoCapture('video.mp4')
    
    while True:
        ret, frame = cap.read()
        if not ret:
            break
    
        # 预处理数据
        frame = cv2.resize(frame, (300, 300))
        frame = frame / 255.0
    
        # 将数据转换为 tensor
        input_tensor = torch.from_numpy(frame).unsqueeze(0).unsqueeze(0).float()
    
        # 进行检测
        outputs = model(input_tensor)
        boxes = outputs['boxes'].detach().numpy()
        scores = outputs['scores'].detach().numpy()
    
        # 绘制检测结果
        for box, score in zip(boxes, scores):
            x1, y1, x2, y2 = box
            cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
            cv2.putText(frame, f'Score: {score:.2f}', (int(x1), int(y1 - 10)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    
        # 显示检测结果
        cv2.imshow('Detection', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    cap.release()
    cv2.destroyAllWindows()
    

    结论

    目标检测模型的识别能力取决于模型训练数据、模型配置、数据预处理和实时检测系统的正确性。通过检查这些因素和调整模型参数,可以提高目标检测模型的识别能力。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月6日