深度学习——苹果新鲜度识别

2024-01-21 13:40

本文主要是介绍深度学习——苹果新鲜度识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本项目使用yolov8模型作为目标检测的模型

目录

项目背景:

一、项目需求:

二、项目实现:

(一)流程介绍:

1、YOLOv8环境配置:

(二)、训练数据集的准备工作

1、准备好数据集:

2、划分数据集

3、训练模型

4、预测模型

三、检测结果与思考:

1、训练阶段:

2、训练结束:

训练过程视频:

四、知识体系:  

(一)、网络定义:

(二)、输出定义:

(三)、Loss函数定义:

五、模型结构设计

六、模型推理过程

七、小总结:

项目背景:

        近年来,随着全球经济的发展,水果消费市场规模不断扩大,水果种类也日益丰富。水果检测与识别技术在农业生产、仓储物流、超市零售等领域具有重要的应用价值。传统的水果检测与识别方法主要依赖于人工识别,这种方法在一定程度上受到人力成本、识别效率和准确性等方面的限制。因此,开发一种高效、准确的自动化水果检测与识别系统具有重要的研究意义和实际价值。

        在本博文中,我们提出了一种基于深度学习的苹果新鲜度检测与识别系统,该系统采用YOLOv8算法对苹果进行检测和识别,实现对图片中的苹果进行准确识别。

一、项目需求:

对苹果外形进行检测与识别,系统将识别出图片中苹果的新鲜程度并显示相应的类别。

二、项目实现:

通过调研,本项目最终使用yolov8模型作为目标检测的模型, YOLOv8 旨在快速、准确且易于使用,使其成为广泛的物体检测、图像分割和图像分类任务的极佳选择。

(一)流程介绍:
1、YOLOv8环境配置:

首先去自己的anaconda的安装的envs(虚拟环境),在导航栏输入cmd,进入命令窗口。

确保python>=3.7;CUDA>=10.1,PYtorch>=1.7

(1)、创建一个虚拟环境

conda create -n torch1.12.1 python=3.8.8

(2)、激活刚建的虚拟环境

activate torch1.12.1 

(3)、到官方网站下载yolo模型 ,下载好后解压,里面有个文件requirements.txt 

 https://github.com/ultralytics/ultralytics

安装一个整体包:

pip install -r .\requirements.txt 

直接按照路径会有问题,找到自己 requirements.txt 文件路径,我这里是pip install -r D:\ultralytics-main\ultralytics-main\requirements.txt

(4)、然后安装ultralytics ,这是必须的。可以用镜像地址。

pip install ultralytics -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

(5)、安装下载好包,接下来就是验证:

 yolo predict model=yolov8n.pt source='ultralytics/assets/bus.jpg' show=True save=True 

(二)、训练数据集的准备工作
1、准备好数据集:

我们选择的苹果数据集包含图片数量978张

2、划分数据集

我们导出的数据文件结构

标签类别包含两类:fresh_apple和rotten_apple;

├── yolov8_dataset└── train└── images (folder including all training images)└── labels (folder including all training labels)└── test└── images (folder including all testing images)└── labels (folder including all testing labels)└── val└── images (folder including all testing images)└── labels (folder including all testing labels)

划分数据集:

import os
import random
import shutil# 设置随机数种子
random.seed(123)# 定义文件夹路径
root_dir = 'Moon_Cake'
image_dir = os.path.join(root_dir, 'images', 'all')
label_dir = os.path.join(root_dir, 'labels', 'all')
output_dir = 'yolov8_dataset'# 定义训练集、验证集和测试集比例
train_ratio = 0.7
valid_ratio = 0.15
test_ratio = 0.15# 获取所有图像文件和标签文件的文件名(不包括文件扩展名)
image_filenames = [os.path.splitext(f)[0] for f in os.listdir(image_dir)]
label_filenames = [os.path.splitext(f)[0] for f in os.listdir(label_dir)]# 随机打乱文件名列表
random.shuffle(image_filenames)# 计算训练集、验证集和测试集的数量
total_count = len(image_filenames)
train_count = int(total_count * train_ratio)
valid_count = int(total_count * valid_ratio)
test_count = total_count - train_count - valid_count# 定义输出文件夹路径
train_image_dir = os.path.join(output_dir, 'train', 'images')
train_label_dir = os.path.join(output_dir, 'train', 'labels')
valid_image_dir = os.path.join(output_dir, 'valid', 'images')
valid_label_dir = os.path.join(output_dir, 'valid', 'labels')
test_image_dir = os.path.join(output_dir, 'test', 'images')
test_label_dir = os.path.join(output_dir, 'test', 'labels')# 创建输出文件夹
os.makedirs(train_image_dir, exist_ok=True)
os.makedirs(train_label_dir, exist_ok=True)
os.makedirs(valid_image_dir, exist_ok=True)
os.makedirs(valid_label_dir, exist_ok=True)
os.makedirs(test_image_dir, exist_ok=True)
os.makedirs(test_label_dir, exist_ok=True)# 将图像和标签文件划分到不同的数据集中
for i, filename in enumerate(image_filenames):if i < train_count:output_image_dir = train_image_diroutput_label_dir = train_label_direlif i < train_count + valid_count:output_image_dir = valid_image_diroutput_label_dir = valid_label_direlse:output_image_dir = test_image_diroutput_label_dir = test_label_dir# 复制图像文件src_image_path = os.path.join(image_dir, filename + '.jpg')dst_image_path = os.path.join(output_image_dir, filename + '.jpg')shutil.copy(src_image_path, dst_image_path)# 复制标签文件src_label_path = os.path.join(label_dir, filename + '.txt')dst_label_path = os.path.join(output_label_dir, filename + '.txt')shutil.copy(src_label_path, dst_label_path)

运行完后我们的数据集就会划分成这个格式了,现在数据准备工作就彻底完成了,接下来我们就可以开始着手训练模型。

这是划分数据集后的文件结构:

3、训练模型

dataset目录下为自己的数据集创建.yaml配置文件

里面写绝对路径:

4、预测模型

设置训练参数,迭代200次,训练次数为10次,开始训练

训练完成后,根目录下会产生一个run的文件夹,里面就存有训练好的结果

三、检测结果与思考:

我们使用精度和召回率等指标来评估模型的性能,还通过损失曲线和PR曲线来分析训练的过程。图中苹果的新鲜度和置信度值都标注出来了,预测速度较快。

1、训练阶段:

使用了YOLOv8算法对数据集训练,总计训练了200轮。在训练过程中,我们使用tensorboard(可视化tensorflow模型工具)记录了模型在训练集和验证集上的损失曲线。从下图可以看出,随着训练次数的增加,模型的训练损失和验证损失都逐渐降低,说明模型不断地学习到更加精准的特征

2、训练结束:

一般我们会接触到两个指标,分别是召回率recall和精度precision,两个指标p和r都是简单地从一个角度来判断模型的好坏,均是介于0到1之间的数值,其中接近于1表示模型的性能越好,接近于0表示模型的性能越差,为了综合评价目标检测的性能,一般采用均值平均密度map来进一步评估模型的好坏。我们通过设定不同的置信度的阈值,可以得到在模型在不同的阈值下所计算出的p值和r值,一般情况下,p值和r值是负相关的,绘制出来可以得到如下图所示的曲线,其中曲线的面积我们称AP,目标检测模型中每种目标可计算出一个AP值,对所有的AP值求平均则可以得到模型的mAP值。

我们对模型在测试集上进行了评估,得到了以下结果。下图展示了我们训练的YOLOv8模型在测试集上的PR曲线。可以看到,模型在不同类别上都取得了较高的召回率和精确率,我们的模型在验证集上的均值平均准确率为0.926。

训练过程视频:

苹果新鲜度识别-CSDN直播

四、知识体系:  

(一)、网络定义:

YOLO检测网络包括24个卷积层和2个全连接层,其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。

(二)、输出定义:

YOLO将输入图像分成SxS个格子,每个格子负责检测‘落入’该格子的物体。若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。

(三)、Loss函数定义:

YOLO使用均方和误差作为loss函数来优化模型参数,即网络输出的SS(B5 + C)维向量与真实图像的对应SS*(B*5 + C)维向量的均方和误差。

(四)、训练:
YOLO模型训练分为两步:

(1)预训练。使用ImageNet,1000类数据训练YOLO网络的前20个卷积层+1个average池化层+1个全连接层。训练图像分辨率resize到224x224。

(2)在预训练中得到的前20个卷积层网络参数来初始化YOLO模型前20个卷积层的网络参数,然后用VOC 20类标注数据进行YOLO模型训练。为提高图像精度,在训练检测模型时,将输入图像分辨率resize到448x448

五、模型结构设计

六、模型推理过程

(1) bbox 积分形式转换为 4d bbox 格式
对 Head 输出的 bbox 分支进行转换,利用 Softmax 和 Conv 计算将积分形式转换为 4 维 bbox 格式
(2) 维度变换
YOLOv8 输出特征图尺度为 80x80、40x40 和 20x20 的三个特征图。Head 部分输出分类和回归共 6 个尺度的特征图。
将 3 个不同尺度的类别预测分支、bbox 预测分支进行拼接,并进行维度变换。为了后续方便处理,会将原先的通道维度置换到最后,类别预测分支 和 bbox 预测分支 shape 分别为 (b, 80x80+40x40+20x20, 80)=(b,8400,80),(b,8400,4)。
(3) 解码还原到原图尺度
分类预测分支进行 Sigmoid 计算,而 bbox 预测分支需要进行解码,还原为真实的原图解码后 xyxy 格式。
(4) 阈值过滤
遍历 batch 中的每张图,采用 score_thr 进行阈值过滤。在这过程中还需要考虑 multi_label 和 nms_pre,确保过滤后的检测框数目不会多于 nms_pre。
(5) 还原到原图尺度和 nms
基于前处理过程,将剩下的检测框还原到网络输出前的原图尺度,然后进行 nms 即可。最终输出的检测框不能多于 max_per_img。

有一个特别注意的点:YOLOv5 中采用的 Batch shape 推理策略,在 YOLOv8 推理中暂时没有开启,不清楚后面是否会开启,在 MMYOLO 中快速测试了下,如果开启 Batch shape 会涨大概 0.1~0.2。

七、小总结:

综上,我们训练的YOLOv8模型在苹果新鲜度检测数据集上表现良好,具有较高的检测精度,快速、准确的检测效果,可以在实际场景中应用。


 

这篇关于深度学习——苹果新鲜度识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/629728

相关文章

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像