基于yolov10的水果菜蔬新鲜度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python】

 更多目标检测和图像分类识别项目可看我主页其他文章

功能演示:

基于yolov10的水果菜蔬新鲜度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python】_哔哩哔哩_bilibili

(一)简介

基于yolov10的水果菜蔬新鲜度检测系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训练好的模型权重,模型训练记录,ui界面和各种模型指标(准确率、精确率、召回率等)等。ui界面由pyqt5设计实现。

该项目是在pycharm和anaconda搭建的虚拟环境执行,pycharm和anaconda安装和配置可观看教程:

超详细的pycharm+anaconda搭建python虚拟环境-优快云博客

(二)项目介绍

1. 模型训练、验证

​该项目可以使用已经训练好的模型权重,也可以自己重新训练,自己训练也比较简单:

第一步:修改data/data.yaml中的数据集路径

第二步:模型训练,即运行train.py文件 

第三步:模型验证,当模型训练完后,运行val.py文件

第四步:使用模型,即运行gui.py文件即可通过GUI界面来展示模型效果

2. 数据集 

​​​

部分数据展示: 

​​

3.GUI界面(技术栈:pyqt5+python) 
a.GUI初始界面

​​​

b.图像检测界面

c.视频或摄像实时检测界面 

4.模型训练和验证的一些指标及效果

 

(三)代码

由于篇幅有限,只展示核心代码

    def upload_img(self):
        """上传图片"""
        # 选择录像文件进行读取
        self.comboBox.setDisabled(False)
        self.pushButton_4.setEnabled(False)
        # 上传图像
        fileName, fileType = QFileDialog.getOpenFileName(self, 'Choose file', '', '*.jpg *.png *.tif *.jpeg')
        if fileName:
            self.file_path = fileName
            """检测图片"""
            org_path = self.file_path
            # 目标检测
            t1 = time.time()
            # 图像检测
            results = self.model.predict(source=org_path, imgsz=self.output_size, conf=self.conf_threshold)[0]
            names = results.names
            t2 = time.time()
            self.label_6.setText('{:.3f} s'.format(t2 - t1))
            now_img = results.plot()
            # 调整图像大小
            self.resize_scale = self.output_size / now_img.shape[0]
            im0 = cv2.resize(now_img, (0, 0), fx=self.resize_scale, fy=self.resize_scale)
            cv2.imwrite("images/tmp/single_result.jpg", im0)
            # 自适应图像大小
            self.label_3.setScaledContents(True)
            # 显示图像
            self.label_3.setPixmap(QPixmap("images/tmp/single_result.jpg"))
            # 获取位置信息
            location_list = results.boxes.xyxy.tolist()
            location_list = [list(map(int, e)) for e in location_list]
            # 获取类别信息
            cls_list = results.boxes.cls.tolist()
            cls_list = [int(i) for i in cls_list]
            # 获取置信度信息
            conf_list = results.boxes.conf.tolist()
            conf_list = ['%.2f %%' % (each * 100) for each in conf_list]
            # 目标总数
            total_nums = len(location_list)
            self.label_11.setText(str(total_nums))
            choose_list = ['全部']
            target_names = [names[id] + '_' + str(index) for index, id in enumerate(cls_list)]
            choose_list = choose_list + target_names
            # 复合框信息
            self.comboBox.clear()
            self.comboBox.addItems(choose_list)

            self.results = results
            self.names = names
            self.cls_list = cls_list
            self.conf_list = conf_list
            self.location_list = location_list
            
            # 显示目标框
            if total_nums >= 1:
                # 渲染类别和置信度信息
                self.label_16.setText(names[cls_list[0]])
                self.label_15.setText(str(conf_list[0]))
                #   默认显示第一个目标框坐标
                #   设置坐标位置值
                self.label_13.setText(str(location_list[0][0]))
                self.label_19.setText(str(location_list[0][1]))
                self.label_21.setText(str(location_list[0][2]))
                self.label_23.setText(str(location_list[0][3]))
            else:
                # 清空显示框
                self.label_16.setText(' ')
                self.label_15.setText(' ')
                self.label_13.setText(' ')
                self.label_19.setText(' ')
                self.label_21.setText(' ')
                self.label_23.setText(' ')

(四)总结

以上即为整个项目的介绍,完整的项目包括代码,数据集,训练好的模型权重,模型训练记录,ui界面和各种模型指标等 。

若项目使用过程中出现问题,请及时交流!

### 使用 PyTorch 实现水果分类的图像识别模型 要使用 PyTorch 构建一个能够完成水果类别分类的任务,可以采用经典的卷积神经网络(CNN)架构,比如 VGG16 或 AlexNet。以下是具体方法: #### 数据准备 为了构建有效的水果分类模型,需要准备好高质量的数据集。常用的一个公开数据集是 Fruits-360[^2],它包含了多种水果的不同角度照片。该数据集分为训练集测试集,可以直接用于深度学习任务。 #### 模型选择 可以选择预定义好的 CNN 结构来加速开发过程并提高性能。例如,在引用材料中提到过两种不同的模型: - **VGG16** 被用来处理单张图片、多张图片甚至视频流中的水果种类检测问题[^1]; - 另外还有 **AlexNet** 的应用实例展示了其对于水果蔬菜区分的有效性。 无论选用哪种基础框架,都可以通过迁移学习技术进一步优化现有成果——即加载已经针对大规模视觉数据库ImageNet训练完毕的标准权重参数作为初始状态,并在此基础上调整最后几层全连接层使之适应特定应用场景下的标签数量变化情况[^3]。 #### 训练流程概述 整个项目大致可分为以下几个方面的工作内容描述如下: ##### 加载库与设置设备环境 首先导入必要的 Python 库以及设定 GPU/CPU 运算资源分配策略。 ```python import torch from torchvision import datasets, transforms, models from torch.utils.data.sampler import SubsetRandomSampler import numpy as np device = 'cuda' if torch.cuda.is_available() else 'cpu' print(f'Device set to {device}') ``` ##### 定义转换规则及读取数据源 接着制定标准化操作序列应用于原始素材之上;同时指定路径指向本地存储位置从而获取实际样本集合对象。 ```python transform_train = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.ToTensor(), ]) trainset = datasets.ImageFolder(root='./fruits/train', transform=transform_train) batch_size = 32 validation_split = .2 shuffle_dataset = True random_seed= 42 dataset_size = len(trainset) indices = list(range(dataset_size)) split = int(np.floor(validation_split * dataset_size)) if shuffle_dataset : np.random.seed(random_seed) np.random.shuffle(indices) train_indices, val_indices = indices[split:], indices[:split] train_sampler = SubsetRandomSampler(train_indices) valid_sampler = SubsetRandomSampler(val_indices) train_loader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, sampler=train_sampler) val_loader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, sampler=valid_sampler) ``` ##### 初始化网络结构与损失函数配置 选取合适的骨干网路版本号之后初始化相应实体变量;另外还需确立衡量误差程度的方式以便后续反向传播更新权值过程中参照依据。 ```python model = models.vgg16(pretrained=True).to(device) # or use alexnet instead of vgg16 according preference. for param in model.parameters(): param.requires_grad = False num_ftrs = model.classifier[-1].in_features features = list(model.classifier.children())[:-1] # Remove last layer features.extend([torch.nn.Linear(num_ftrs, len(trainset.classes))]) # Add our layer with n outputs model.classifier = torch.nn.Sequential(*features) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad,model.parameters()), lr=0.0001) scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1) ``` ##### 执行迭代周期内的前馈计算与梯度下降步骤 按照预定轮次循环执行正向传递运算求得预测结果并与真实标记对比得出成本数值后再经由链式法则逐级回传修正各节点关联系数直至满足收敛条件为止。 ```python epochs = 25 best_acc = 0.0 for epoch in range(epochs): scheduler.step() running_loss = 0.0 corrects = 0 for inputs, labels in train_loader: inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = model(inputs) _, preds = torch.max(outputs, 1) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item()*inputs.size(0) corrects += torch.sum(preds == labels.data) epoch_loss = running_loss / len(train_indices) epoch_acc = corrects.double() / len(train_indices) print('Epoch [{}/{}], Loss: {:.4f}, Acc: {:.4f}'.format(epoch+1, epochs, epoch_loss, epoch_acc)) if phase == 'val' and epoch_acc > best_acc: best_acc = epoch_acc best_model_wts = copy.deepcopy(model.state_dict()) model.load_state_dict(best_model_wts) torch.save(model.state_dict(), './fruit_classifier.pth') ``` 以上代码片段展示了一个完整的基于 PyTorch 平台搭建水果分类系统的方案说明文档.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值