普通网友 2024-04-01 19:53 采纳率: 18.2%
浏览 15

在yolo的一个ui界面中做一个摄像头检测的功能

想在yolo的一个ui界面中做一个摄像头检测的功能 但是会报错,我需要怎么做

import cv2
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QMainWindow,QApplication,QFileDialog
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtCore import QTimer
from 交通头盔规范检测 import Ui_MainWindow
import torch

def convert2QImage(img):
    height, width, channel = img.shape
    return QImage(img, width, height, width * channel, QImage.Format_RGB888)

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.model = torch.hub.load("./", "custom", path="runs/train/exp9/weights/best.pt", source="local")
        self.timer = QTimer()
        self.timer.setInterval(100)  # 设置间隔为 100 毫秒,即 0.1 秒
        self.video = None
        self.camera = cv2.VideoCapture(0)
        self.bind_slots()
    def images_pred(self, file_path):
        results = self.model(file_path)
        image = results.render()[0]
        return convert2QImage(image)

    def open_image(self):
        print("点击了检测图片!")
        file_path = QFileDialog.getOpenFileName(None, "Open Image", r"E:\yolov5-master\VOCdevkit\images\train", filter="*.jpg;*.png;*.jpeg")
        if file_path[0]:
            file_path=file_path[0]
            qimage=self.images_pred(file_path)
            self.input.setPixmap(QPixmap(file_path))
            self.output.setPixmap(QPixmap.fromImage(qimage))


    def video_pred(self):
        ret, frame = self.video.read()
        if not ret:
            self.timer.stop()
        else:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame)))
            results = self.model(frame)
            image = results.render()[0]
            self.output.setPixmap(QPixmap.fromImage(convert2QImage(image)))


    def open_video(self):
        print("点击了检测视频!")
        self.timer.stop()
        file_path = QFileDialog.getOpenFileName(None, r"C:\Users\32147\Desktop\03.mp4", filter="*.mp4")
        if file_path[0]:
            file_path = file_path[0]
            self.video = cv2.VideoCapture(file_path)
            self.timer.start()

    def camera_pred(self):
        ret, frame = self.camera.read()
        if not ret:
            self.timer.stop()
        else:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            results = self.model(frame)
            image = results.render()[0]
            self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame)))
            self.output.setPixmap(QPixmap.fromImage(convert2QImage(image)))

    def start_camera(self):
        self.timer.start()  # 启动定时器以开始捕获摄像头图像


    def bind_slots(self):
        self.images.clicked.connect(self.open_image)
        self.videos.clicked.connect(self.open_video)

        self.camera.clicked.connect(self.start_camera)  # 将按钮连接到启动摄像头的方法
        self.timer.timeout.connect(self.video_pred)



if __name__=="__main__":
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
# 使用 QtCore.Qt.AA_EnableHighDpiScaling 常量设置了应用程序的属性,告诉 Qt 应用程序启用高DPI缩放。
    app= QApplication(sys.argv)
    window=MainWindow()
    window.show()
    app.exec()

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-01 19:53
    关注

    引自免费微信小程序:皆我百晓生

    好的,我会尽力回答你的问题并提供详细的代码示例。在这个例子中,我们将在窗口上添加一个UI元素,用于切换摄像头。当用户点击这个按钮时,会打开一个文件选择对话框,让用户选择要处理的图片。然后,我们会读取选中的图片,并将其转换为YOLO模型预测的结果。

    首先,我们需要安装所需的库。如果你还没有安装,可以使用以下命令进行安装:

    pip install numpy torchvision opencv-python opencv-python-tesseract pytesseract matplotlib torchvision datasets transformers
    

    接下来,我们将创建一个新的Python脚本,并编写用于运行上述代码的主函数。

    import cv2
    import sys
    import numpy as np
    from torch.utils.data import Dataset, DataLoader
    from torchvision import transforms
    from torchvision.models import resnet18
    from tesseract.pytesseract.tessdata import TESSData
    
    class VideoDataset(Dataset):
        def __init__(self, transform=None):
            self.transform = transform
    
        def __len__(self):
            return len(self.image_list)
    
        def __getitem__(self, idx):
            image = self.image_list[idx]
    
            transform = self.transform or transforms.Compose([
                transforms.Resize((256, 256)),
                transforms.CenterCrop((224, 224)),
                transforms.ToTensor(),
                transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
            ])
    
            image = transform(image)
    
            return image
    
    def main():
        # Set up your device
        devices = {'cuda': torch.device('cuda' if torch.cuda.is_available() else 'cpu')}
        parser = argparse.ArgumentParser(description='A sample program to test the Tesseract OCR and YOLO model.')
        parser.add_argument('--model', type=str, help='Path to the custom model weights file.')
        parser.add_argument('--dataset', type=str, help='Path to the dataset directory containing labeled images.')
    
        args = parser.parse_args()
    
        # Load the custom model weights file
        model = torch.hub.load(args.model, location="./", force_reload=True)
    
        # Define the YOLO model and set it to be run on GPU if available
        yolo = resnet18(pretrained=True)
        yolo.fc = nn.Linear(yolo.fc.in_features, num_classes)
        yolo.to(device)
        
        # Load the dataset directory
        data_dir = os.path.join(args.dataset, 'data')
        dataset = VideoDataset(transform=data_dir)
        loader = DataLoader(dataset, batch_size=32, shuffle=True, device=device)
    
        # Train the model for 10 epochs
        epoch_loss, epoch_acc = train_yolo(model, loader, steps=10)
    
        # Print the training loss and accuracy
        print(f"Epoch {epoch:04d}, Loss: {epoch_loss:.3f}, Acc: {epoch_acc:.3f}")
    
    if __name__ == "__main__":
        main()
    

    这个脚本将创建一个名为VideoDataset的类,它包含一个__init__方法,用于初始化数据集对象。__len__方法用于获取数据集中图片的数量,__getitem__方法用于对每个图片执行预处理操作。transform参数用于设置预处理后的图片格式。

    main()函数用于加载模型、定义数据集、训练模型和打印训练结果。

    注意:你需要先将resnet18num_classes导入到你的PyTorch项目中。此外,你需要下载数据集并将其放置在指定目录中。这里只是一个基本的例子,你可以根据实际需求对其进行修改和扩展。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月1日

悬赏问题

  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件
  • ¥15 不同系统编译兼容问题
  • ¥100 三相直流充电模块对数字电源芯片在物理上它必须具备哪些功能和性能?
  • ¥30 数字电源对DSP芯片的具体要求
  • ¥20 antv g6 折线边如何变为钝角
  • ¥30 如何在Matlab或Python中 设置饼图的高度
  • ¥15 nginx中的CORS策略应该如何配置
  • ¥30 信号与系统实验:采样定理分析
  • ¥100 我想找人帮我写Python 的股票分析代码,有意请加mathtao