阶段总结——基于深度学习的三叶青图像识别
阶段总结——基于深度学习的三叶青图像识别
文章目录
- 一、计算机视觉图像分类系统设计
- 二、训练模型
- 2.1. 构建数据集
- 2.2. 网络模型选择
- 2.3. 图像数据增强与调参
- 2.4. 部署模型到web端
- 2.5. 开发图像识别小程序
- 三、实验结果
- 3.1. 模型训练
- 3.2. 模型部署
- 四、讨论
- 五、参考文献:
一、计算机视觉图像分类系统设计
三叶青图像识别研究简概
如图1所示,图像分类系统从输入图像开始,经过预处理,进行特征选择和提取,之后经过分类器进行分类,得出最后的预测结果,并输出。在获得训练样本之前,所有的图片都进行了预处理、归一化处理为固定分辨率的图片输入至网络中,然后对其进行特征选择和提取,进行训练得到分类器,从而达到预测目标的任务[1]。

图 1 图像分类系统图
二、训练模型
2.1. 构建数据集
考虑到最终是根据三叶青块根、叶片图片进行训练,并且是根据省份产地进行分类。故本实验的类别目前共有六种:云南省、广西省、未知、浙江省、贵州省、陕西省。其中未知类别的图片来自于从网络上爬取和本地相册中的图片;至于另外五种类别的图片则是自己构建的。获得图片数据集后,则是统一数据集图片的格式、大小。前面共采集了9214张图片,之后便是将数据集按照比例6:2:2分割为训练集、验证集、测试集。各类别图像数量的统计表格如表1所示。

表 1 各类别图像数量的统计
2.2. 网络模型选择
由于考虑到常规的CNN,推理需要很大的计算量,很难应用在移动端等资源受限的场景中。只有通过复杂的裁剪,量化才有可能勉强部署到移动端。本实验采用了MobileNetV3-Large模型,是谷歌提出的轻量化网络架构,引入MobileNetV1的深度可分离卷积、MobileNetV2的具有线性瓶颈的倒残差结构、加入神经网络架构搜索(NAS)和h-swish激活函数,并引入SE通道注意力机制,性能和速度都表现优异[2]。其网络模型结构如图2所示

图 2 MobileNetV3_Large模型架构
2.3. 图像数据增强与调参
在训练之前,先对训练集进行数据增强,通过随即裁剪、缩放图像、随机更改亮度、对比度和饱和度等方法对数据进行增强。之后使用迁移学习方法来训练模型,对MobileNetV3-Large模型进行微调,即改变模型的分类头,使输出大小与数据集的类别数相匹配,为6,故要将模型的最后一层1²×1280改为1²×6。
最后使用随机梯度下降(SGD)优化器,用于更新网络中的参数以最小化损失函数,使用网格搜索函数来搜索最佳超参数组合。
2.4. 部署模型到web端
使用flask+bootstrap+jquery+mysql搭建三叶青在线识别网站;最后使用nginx+gunicorn部署网站在腾讯云上,并配置SSL证书,方便后面微信小程序调用此网站的后端代码。
该网站实现了登录注册、在线识别、图片瀑布流展示、用户数据展示以及其它等功能。
2.5. 开发图像识别小程序
使用uniapp+微信开发者工具+flask后端开发三叶青图像识别微信小程序。此微信小程序主要分为三叶青图像识别功能、图片瀑布流展示、历史记录、登录/注册功能等。
三、实验结果
3.1. 模型训练
其中设置样本批量大小batch_size为128;类别数量num_classes为6;学习率lr为1e-4;权重衰减wd为1e-4;动量momentum为0.9;学习率衰减的周期lr_period为2;学习率衰减的比例lr_decay为1。训练时设置的训练总轮数num_epochs为300;在Epoch197时验证集的准确度最高。运行结果如图3

图 3 模型训练结果
最后,训练集的损失为0.070,训练集的准确度为0.977,验证集的准确度为0.967,测试集上的准确度为0.9718。其中top_n预测正确的概率为99.84%(即在预测得到的置信度排前三的类别中有正确类别的概率)。除了上述的损失、准确率和top-n准确率,还有许多其他的模型精度评估指标,例如分类报告、各类别准确率(如表2所示)、混淆矩阵、PR曲线、AUC-ROC曲线(如图4所示)。

表 2 分类报告与各类别准确率

图 4 混淆矩阵、PR曲线、ROC曲线
3.2. 模型部署
利用pytorch框架训练得到的.pth模型文件转换为onnx文件,并使用ONNX
Runtime来执行模型推理。在此基础上,我们开发了一个三叶青块根图像产地鉴别的在线识别网站(https://www.whtuu.cn),以及一个微信小程序(三叶识青),使得用户可以在各种设备和平台上方便地使用我们的模型进行预测。
四、讨论
本研究的图像分类任务采用了MobileNetV3-Large模型,通过对模型的微调训练、测试、验证工作,对于采集的多产地的三叶青块根图像完成了图像分类,达到了很高的识别准确率,并且识别速度快,模型部署在web端和移动端,操作方便。
但是在此次研究中也发现了一些问题,(1)若想要提高识别率,数据集的构建至关重要,提供的训练集一定要大量、各类别的样本量也要平均,差异不能过大;(2)要采集不同背景下的三叶青块根照片,这样虽然会让识别率降低,但是在实际应用中却是十分必要的;(3)图像数据增强和调参过程很重要,对于模型的精度的提升很大;(4)本研究初步计划同时根据三叶青的叶片照片进行产地分类。然而,由于时间限制,这部分功能未能实现。尽管如此,在web端和移动端仍保留了叶片分类的接口,以便于未来研究和开发。
五、参考文献:
[1] 刘加峰,高子啸,段元民,等. 基于深度学习的中药材饮片图像识别[J].北京生物医学工程,2021,40( 4) : 605-608.
[2] A. Howard et al., “Searching for MobileNetV3,” 2019 IEEE/CVF International Conference on Computer Vision (ICCV), Seoul, Korea (South), 2019, pp. 1314-1324, doi: 10.1109/ICCV.2019.00140.
相关文章:
阶段总结——基于深度学习的三叶青图像识别
阶段总结——基于深度学习的三叶青图像识别 文章目录 一、计算机视觉图像分类系统设计二、训练模型2.1. 构建数据集2.2. 网络模型选择2.3. 图像数据增强与调参2.4. 部署模型到web端2.5. 开发图像识别小程序 三、实验结果3.1. 模型训练3.2. 模型部署 四、讨论五、参考文献&#…...
深度解析Java世界中的对象镜像:浅拷贝与深拷贝的奥秘与应用
在Java编程的浩瀚宇宙中,对象拷贝是一项既基础又至关重要的技术。它直接关系到程序的性能、资源管理及数据安全性。然而,提及对象拷贝,不得不深入探讨其两大核心类型:浅拷贝(Shallow Copy)与深拷贝…...
Python | Leetcode Python题解之第218题天际线问题
题目: 题解: class Solution:def getSkyline(self, buildings: List[List[int]]) -> List[List[int]]:buildings.sort(keylambda bu:(bu[0],-bu[2],bu[1]))buildings.append([inf,inf,inf])heap [[-inf,-inf,-inf]]ans []for l,r,h in buildings:i…...
使用Spring Boot构建RESTful API
使用Spring Boot构建RESTful API 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将深入探讨如何使用Spring Boot构建RESTful API。通过这篇…...
Spark快速大数据分析PDF下载读书分享推荐
《Spark 快速大数据分析》是一本为 Spark 初学者准备的书,它没有过多深入实现细节,而是更多关注上层用户的具体用法。不过,本书绝不仅仅限于 Spark 的用法,它对 Spark 的核心概念和基本原理也有较为全面的介绍,让读者能…...
Centos7离线安装mysql-5.7.44bundle包
在 CentOS 7 上安装 mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar(这里假设这是一个包含多个 RPM 包的 tar 归档文件)的步骤通常涉及解压归档文件、安装 RPM 包以及配置 MySQL 服务。以下是一个详细的步骤指南: 1. 下载和解压 RPM 包 首先&am…...
ROS melodic版本卸载---Ubuntu18.04
sudo apt-get remove ros-melodic-desktop-fullsudo apt-get remove gazebo* 删除依赖关系 sudo apt autoremove删除与ros关联的所有文件 sudo apt-get purge ros-* sudo rm -rf /etc/ros找到.bashrc文件删除含ros的环境配置语句 全部删除完毕,可以去计算机下的…...
Java面试之Java多线程常见面试题
1、什么是线程? 定义:线程是程序中的执行路径,是操作系统进行调度的基本单位。它允许程序并发执行多个任务,提高程序的响应速度和资源利用率。 2、为什么需要线程? 1、提高并发性:线程允许程序同时执行多…...
Java [ 基础 ] Java面向对象编程 (OOP) ✨
目录 ✨探索Java基础 Java面向对象编程 (OOP) ✨ 引言 1. 类和对象 2. 封装 3. 继承 4. 多态 5. 抽象 结论 ✨探索Java基础 Java面向对象编程 (OOP) ✨ 引言 Java是一门以面向对象编程(OOP)为基础的编程语言。OOP的核心概念包括类和对象、封装…...
敏捷开发笔记(第9章节)--开放-封闭原则(OCP)
目录 1:PDF上传链接 9.1 开放-封闭原则(OCP) 9.2 描述 9.3 关键是抽象 9.3.1 shape应用程序 9.3.2 违反OCP 糟糕的设计 9.3.3 遵循OCP 9.3.4 是的,我说谎了 9.3.5 预测变化和“贴切的”结构 9.3.6 放置吊钩 1.只受一次…...
苹果电脑清理app垃圾高效清理,无需专业知识
在我们的日常使用中,苹果电脑以其优雅的设计和强大的功能赢得了广泛的喜爱。然而,即便是最高效的设备,也无法免俗地积累各种不必要的文件和垃圾,特别是app垃圾。所以,苹果电脑清理app垃圾高效清理,对于大多…...
【算法】(C语言):快速排序(递归)、归并排序(递归)、希尔排序
快速排序(递归) 左指针指向第一个数据,右指针指向最后一个数据。取第一个数据作为中间值。右指针指向的数据 循环与中间值比对,若大于中间值,右指针往左移动一位,若小于中间值,右指针停住。右…...
模型驱动开发(Model-Driven Development,MDD):提高软件开发效率与一致性的利器
目录 前言1. 模型驱动开发的原理1.1 什么是模型驱动开发1.2 MDD的核心思想 2. 模型驱动开发的优势2.1 提高开发效率2.2 确保代码一致性2.3 促进沟通和协作2.4 方便维护和扩展 3. 实现模型驱动开发的方法3.1 选择合适的建模工具3.1.1 UML3.1.2 BPMN3.1.3 SysML 3.2 建模方法3.2.…...
记录discuz修改用户的主题出售价格
大家好,我是网创有方的站长,今天遇到了需要修改discuz的主题出售价格。特此记录下 方法很简单: 进入用于组-》选择论坛-》批量修改...
WGAN(Wassertein GAN)
WGAN E x ∼ P g [ log ( 1 − D ( x ) ) ] E x ∼ P g [ − log D ( x ) ] \begin{aligned} & \mathbb{E}_{x \sim P_g}[\log (1-D(x))] \\ & \mathbb{E}_{x \sim P_g}[-\log D(x)] \end{aligned} Ex∼Pg[log(1−D(x))]Ex∼Pg[−logD(x)] 原始 GAN …...
Maven基本使用
1. Maven前瞻 Maven官网:https://maven.apache.org/ Maven镜像:https://mvnrepository.com 1.1、Maven是什么 Maven是一个功能强大的项目管理和构建工具,可以帮助开发人员简化Java项目的构建过程。 在Maven中,使用一个名为 pom.…...
在Linux系统中配置GitHub的SSH公钥
在Linux系统中配置GitHub的SSH公钥,可以让您无需频繁输入密码即可与GitHub仓库进行交互,提高工作效率。以下是配置步骤: 第一步: 检查SSH密钥是否存在 首先,检查您的用户目录下的.ssh文件夹中是否已有SSH密钥。打开终端࿰…...
小酌消烦暑|人间正清欢
小暑是二十四节气之第十一个节气。暑,是炎热的意思,小暑为小热,还不十分热。小暑虽不是一年中最炎热的时节,但紧接着就是一年中最热的节气大暑,民间有"小暑大暑,上蒸下煮"之说。中国多地自小暑起…...
C语言结构体的相关知识
前言 从0开始记录我的学习历程,我会尽我所能,写出最最大白话的文章,希望能够帮到你,谢谢。 1.结构体类型的概念及定义 1.1、概念: 结构体是一种构造类型的数据结构, 是一种或多种基本类型或构造类型的数…...
RabbitMQ入门教程(精细版二带图)
目录 六 RabbitMQ工作模式 6.1Hello World简单模式 6.1.1 什么是简单模式 6.1.2 RabbitMQ管理界面操作 6.1.3 生产者代码 6.1.4 消费者代码 6.2 Work queues工作队列模式 6.2.1 什么是工作队列模式 6.2.2 RabbitMQ管理界面操作 6.2.3 生产者代码 6.2.4 消费者代码 …...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
