记录一下大二期间与同学一起做的林业林间有害生物智能识别项目,我主要做的工作有数据的爬取,数据的预处理与标注,图片数据不够时做的数据增强,部分的UI设计与实现,以及部分环境的调试。
网站上符合要求的昆虫图片真的太难找了!爬取的过程相当的麻烦,有些网站是国外的,连接不稳定,经常会中断,而且找对应昆虫网站真的很难找,一般的网站找不到
数据的预处理与标注这一点,主要是图片尺寸的调整以及使用labelImg-master进行标注,也是十分的痛苦,中间许多图中有很多只虫子在一个图上,而且总共约6000张图,眼睛都标花了
在最初没有找到足够的图片数据的时候,使用的数据增强,使用的opencv库,主要有高斯噪声、昏暗处理、明亮处理、旋转处理、镜像处理等,同时要注意标注集也要对应的生成
实现了UI界面的滑动查询的界面以及数据库等的操作
题 目: 林业有害生物智能识别
队 名: 沙拉脆皮鸡
队员: 史振宁、王远卓、林晨曦
指导老师: 刘凡
学校: 河海大学
目录
绪论
1.1 项目背景
目林业病虫害是制约全世界林业发展的重要问题,也是我国林业生态建设的严重阻碍。在信息化迅速发展的背景下,针对林业病虫害种类多、防治难度大的现象,推广应用信息技术进行林业病虫害防治具有积极的现实意义。
传统专家系统(SVM等)难以在环境噪声很大的条件下进行害虫识别,因此,本小组将主要使用神经网络,实现林间有害生物的智能识别,以下是我们小组的具体方案。
1.2 项目内容
本项目旨在基于大数据、目标检测、深度学习等技术,针对常见林业害虫通过应用手机拍摄或选取相册中的害虫图像,经分析处理后可智能识别害虫种类、显示识别率、个数等信息。
基于此,我们要开发一个基于人工智能的林业有害生物识别系统:通过计算机视觉、机器学习、模式匹配等技术,对本地手机图片或者视频进行分析,从中检测林业有害生物的种类、个数以及识别的置信度,并进行标记,同时我们还构建了一个林业有害生物数据库,负责这些有害生物基本信息的维护和访问。此外,本项目还成功部署到了安卓移动端中(包括模型、数据库),实现了离线识别功能,还开发了一套合理美观的操作界面供管理员使用。
1.3 项目特色
1.1.1 高效算法模型
本项目深刻考虑到手机本身算力低、网络延迟高,而组委会要求识别过程低时延、识别结果低误差等因素或要求,打破传统的机器学习模型,在识别模式、检测算法、模型训练、数据结构上进行了大胆创新,突破传统视频检测系统的桎梏,以一种高效、轻量、低功耗、高可信的方式实现了本系统核心的林业有害生物检测功能,具体内容可见后文。
1.1.2 项目离线识别
考虑到手机网络的高延迟,通过上传照片到服务器再进行检测显然会带给用户不那么良好的体验,因此我们将模型成功部署到了安卓移动端本地的项目中,实现了林业有害生物的离线识别,同时我们直接将数据库构建在Android studio的本地目录中,实现了整个APP实现主要功能的运行过程中完全不需要联网,有效地提升了用户体验,同时也保证了模型的准确性和系统的稳定性。
1.1.3 支持实时检测
本项目不仅能通过上传照片实现林业有害生物的离线识别,还能通过直接调用手机的摄像头,通过对手机摄像头返回的视频流进行逐帧分析,实现林业有害生物实时检测,可以使本项目在更复杂的情况下发挥更多的作用。
1.1.4 零成本入门系统操作
系统针对用户的特点,对前端进行了深度优化以提高前端操作响应速度和页面交互友好程度。系统的每一个组件都做到了简单直观、一目了然,通过文字或图标的形式简明扼要的表达每个互动组件的含义,为非专业类用户使用本系统提供有力地支持。
1.1.5 低硬件配置依赖
大多数目标检测系统对硬件要求都极其高,略微普通的计算机难以运行。而本项目尽可能考虑实用场景,通过多种方式降低系统对高配置硬件系统的依赖程度,保证系统在多数手机中得以流程运行。
需求分析
2.1 产品目标
本项目从林业工作人员群体出发,创造一个功能完整、可靠的林业有害生物智能识别系统,实现通过手机拍照或者直接调用摄像头的方式,实现对于林业有害生物的图像检测和实时检测,并反馈智能识别的害虫种类、识别率、个数等信息,对进行林业病虫害防治具有积极的现实意义。
2.2 产品功能概述
本产品主要功能为林业有害生物的智能识别,核心功能为基于人工智能的图片内容和视频内容检测算法,包含计算机视觉、机器学习、模式识别等领域,在本系统中具象到图形变换、背景抽离、生物识别等内容,要求产品轻量、高效、可移植、学习成本低。
图2.2-1 产品首页设计图
2.3 用户特点
林业有害生物智能识别系统主要使用者是林业管理人员、林业工作人员等,对林业工作中遇到的害虫进行检测,有效提高工作效率。以上使用者可以视为没有掌握计算机专业知识,其对系统的要求应当是简单、可靠、易于操作。本系统在设计时应当考虑到使用人员的使用体验,尽可能简化操作难度,降低专业知识需求程度。
2.4 功能性需求
2.4.1 手机拍照或者手动上传照片
本项目提供手机拍照进行检测和使用的本地图片(图库)进行检测的功能,并且同样将录入的不同种类的昆虫进行区分并标注出来,在图片中进行显示检测结果。
需求描述的用户使用流程为:用户进入应用,选择使用本地图片或者进行拍照,应用读入待识别图片,对图片进行扫描检测,将结果返回并标注。
2.4.2 林业有害生物基础库维护
本项目需要提供检测后的昆虫信息,以便在检测出林业害虫后进行辨别,在联网条件下能进行所有林业害虫信息的查看,包括食物、分布、详细信息等。为了在联网与离线两种状态下都能较好的提供信息,本项目采用了MySQL和SQLite两种数据库,在联网条件下连接服务器查询数据,在离线条件下使用本地的SQLite进行查询,满足应用基本需求。
需求描述的用户使用流程为:1.用户今日应用,在昆虫信息界面查询或点击相关害虫栏,查看相关林业害虫信息。2.用户进入应用,选择使用本地图片或者进行拍照,应用读入待识别图片,对图片进行扫描检测,将结果返回并标注,点击进入信息界面,查看相关信息。
2.4.3 林业有害生物智能识别反馈
为了使用户了解识别的昆虫的相关信息,本应用提供显示识别的昆虫名称、食物、分布、简介等详细信息。通过查看这些信息,使用者可以很方便的了解该昆虫的危害等信息。
需求描述的用户使用流程为:用户进入应用,选择使用本地图片或者进行拍照,应用读入待识别图片,对图片进行扫描检测,将结果返回并标注,查看相关信息。
2.4.4 模型离线识别
考虑到手机网络的高延迟,通过上传照片到服务器再进行检测显然会带给用户不那么良好的体验,因此我们将模型成功部署到了安卓移动端本地的项目中,实现了林业有害生物的离线识别。
2.4.5 支持实时检测
本项目不仅能通过上传照片实现林业有害生物的离线识别,还能通过直接调用手机的摄像头,通过对手机摄像头返回的视频流进行逐帧分析,实现林业有害生物实时检测,可以使本项目在更复杂的情况下发挥更多的作用。
2.5 非功能性需求
2.5.1 高效处理速度
林业有害生物智能识别具有实时性要求,对系统运行时延不能太大,最好可以控制在200ms以内,以免造成画面卡顿、卡死等现象。因此,系统需要对检测算法、检测流程以及数据结构进行优化,以实现高效的系统响应速度。
2.5.2 高识别率
林业有害生物智能识别具有高识别率要求,要求系统准确识别目标,最好可以控制在90%以上,以免造成识别错误导致林业人员采用错误防治方法的现象。因此,系统需要对检测算法、神经网络模型进行优化,以实现系统的准确识别。
2.5.2 界面友好易于操作
用户根据自身的情况要求系统要有易于操作,简单直观的特点。系统开发人员需要对前端进行深度优化以提高前端操作响应速度和操作简单友好程度。针对每一个互动区域要做到简单直观、一目了然,通过文字或图标的形式简明扼要的表达每个互动组件的含义。为非专业类用户使用本系统提供支持。
2.5.3 普通硬件要求
手机配置普遍较低,因此本系统要尽可能降低对硬件的依赖需求,避免出现使用的情况,要求系统可以在大多数中配硬件环境下流畅运行,减轻用户硬件负担。
2.6 运行环境需求
2.6.1 设备
处理器:高通骁龙765G 八核 最高2.4GHz
运行内存:6GB
安卓版本:Android 11
2.6.2 接口
用户接口位用户界面,通过系统提示用户上传图片实现检测;外部接口为触摸屏、手机支持安卓系统的设备;内部接口为模块,进行进程间交互的数据准确性、参数一致性等内容。
2.6.3 控制
本应用通过用户界面提供控制控件,用户可以通过点击搜索栏,按钮等进行控制实现对程序的控制,实现功能需求。
系统设计
3.1 总体架构
为了系统的层次性开发与高效率开发,本系统决定采用三层架构开发。利用一种严格的分层定义,将系统复杂的开发工作划分为简单的小块,在每一层中只实现系统相应层的功能设计,层间的交互由相邻层对应的功能模块进行调用,信息传递只由接口进行。
系统分为三部分开发,分别为:
-
表现层(UI):展现给用户的APP;
-
业务逻辑层(BLL):针对具体问题的操作,对数据层的操作,对数据业务逻辑处理;
-
数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。
本系统的三层内容具体如下:
-
表现层(UI):表现层分为普通用户界面,主要提供图片上传、视频识别、昆虫数据库数据浏览/查找、社区交流、昆虫分布等界面,主要进行系统与用户的交互,以给用户提供识别结果及收集信息。
-
业务逻辑层(BLL):主要包括系统逻辑信息的处理,包括林业有害生物的识别方法,林业有害生物样本爬取、去重、再生成办法等。
-
数据访问层(DAL):主要包括对林业有害生物库的管理与操作。
以下为本系统的系统框架图:
图3-1 系统总体框架图
3.2 业务逻辑层详细设计
3.2.1 功能说明与功能模块划分
该层负责完成安全识别系统的绝大多数核心功能,包括用户选择本地图片或这摄像机视频流、用户访问林业有害生物数据库等功能,根据用户上传的图片或是实时摄像记录来进行对林业有害生物检测,并反馈结果,同时,将业务逻辑抽取出来,使得前端展示层和数据存储层解耦,使整个系统工作流程清晰,可扩展性强。
该层负责整个林业有害生物识别系统中核心的功能,将系统串联成一个有机的整体。该层由六个功能模块组成,分别是林业有害生物样本获取模块,林业有害生物的识别模块、反馈模块。模块间的逻辑关系如下图所示:
图3-3 模块间逻辑关系图
下图是业务逻辑层处理事务流程:
图3-4 业务逻辑层处理事务流程
3.2.2 林业有害生物样本获取模块
在林业有害生物智能识别系统中,需要大量林业有害生物样本来进行林业有害生物识别算法的训练与特征提取,但是各大开源样本网站中并没有开源的林业有害生物样本,因此,我们需要自己生成林业有害生物的训练样本。此模块负责从百度、谷歌图片、bugguide、inaturalist等网站爬取林业有害生物图片,并按照URL和图片相似度来去重。本系统还通过图像增强、深层神经对抗式生成网络技术(DCGAN)和遗传算法来生成新的林业有害生物样本,并进行手工标注,为林业有害生物的识别提供有力的样本依据。
3.2.2.1 林业有害生物图片爬取
本系统启动多个进程,通过分析各网站搜索页面来书写正则式,添加网络代理后爬取林业有害生物搜索页面中的图片并标号保存到本地。
下面是系统爬虫模块状态图:
图3-5 爬虫模块状态图
由于网站的反爬虫机制较强,爬虫容易被反爬机制屏蔽,导致下载周期长等不良效果,要求爬虫具有反爬应对机制;现行网站大多采用Ajax跨域请求,动态渲染等技术,因而要求爬虫能下载到完整的页面;此外,爬虫还须能应对由于网络问题导致的各类页面错误,具备较高的容错性。为了实现页面下载效率高、容错性强的目标,本系统设定了页面下载出错处理策略和反爬策略。
出错处理部分负责对页面下载出错类型、反爬策略应对和重试机制的详细设定,形成下载状态机,保证爬虫的自恢复能力,避免爬虫因网络问题进入死循环或停止运行,有效增强爬虫的运行时稳定性。
本系统将页面出错处理的原因归结为网络原因和人为原因,页面可能因网络状况不好,或网站的反爬机制导致页面下载出错。无论是哪种出错状态,返回的页面错误码大多是4xx或者5xx的类型(xx代表任意数字)。
针对上述出错情况,本系统采用出错处理状态机进行处理,给予一个页面三次下载机会,第一次尝试人工操作下载方案;若出错,则添加Cookie信息,尝试第二次下载;若还未能下载成功,则从IP代理池中取出一个代理IP,更换IP再进行下载。如果上述方法均失败,系统将放弃该URL。
此外,系统对URL下载各时间段内的成功和失败情况做出统计,若时间段内放弃URL的数量过多,将调慢URL分发下载的速率,保证爬虫正常运行。
下图为系统爬虫模块页面下载出错处理状态机:
**
图3-6 页面下载出错处理状态机
3.2.2.2 林业有害生物图片去重
(1)按URL去重
图3-7 按URL去重模块
URL去重模块负责提供URL去重服务,要求在较短的时间内给出URL的查询结果。此外,URL去重模块还应满足大容量存储和准确率高的特点,其输入是URL,输出是该URL是否需要继续处理的回应。
图3-8 URL去重序列图
各网页的URL总是互相链接的,分发重复的URL任务将使整个爬虫模块效率低下,为保证爬虫模块的高效性,需要对URL进行去重处理,针对已经下载过的页面的URL或者没有进行数据更新的页面,不再进行下载。去重算法的需要考虑内存问题,所用内存越小越优。
URL去重模块负责提供URL去重服务,要求在较短的时间内给出URL的查询结果,采用键值对数据库Redis和BloomFilter双重过滤机制,保证对已存在的URL进行快速检索,增大URL去重率,提升爬虫效率。
为了进一步降低URL去重的内存使用,本系统没有直接在BloomFilter和Redis中存储URL本身,而是存储了URL对应的MD5码,既保证了URL的正确去重,又使Key值不至于过长占用太多内存,影响去重效率。
下图为数据库BloomFilter+Redis实现URL去重序列图:
图3-9 BloomFilter+Redis实现URL去重序列图
1)URL先在BloomFilter中进行查询,如果在BloomFilter中能找到该URL,则该URL已被去重,不再继续进入Redis中进行查找;
2)如果URL在BloomFilter中没有查询到,为保证去重率,继续进入Redis中查找,如果在Redis中查到该URL,则该URL已被去重,否则该URL是一个新的URL,则进入图片下载。
(2)按图片相似度去重
由于各大搜索引擎的图片多有重复,所以还需要对爬取到的林业有害生物图片加以相似度去重。本系统采用phash算法对图片进行去重处理。
每张图片都是一个二维信号,它包含了不同频率的成分。如下图所示,亮度变化小的区域是低频成分,它描述大范围的信息。而亮度变化剧烈的区域(比如物体的边缘)就是高频的成分,它描述具体的细节。或者说高频可以提供图片详细的信息,而低频可以提供一个框架。
图3-10 图片高低频对比图
而一张大的,详细的图片有很高的频率,而小图片缺乏图像细节,所以都是低频的。
均值哈希算法利用图片的低频信息,将图片缩小、简化色彩后计算hash值,计算速度快。比较两个图片的相似性,只要计算两个图不同位的个数(汉明距离)。如果这个值为0,则表示这两张图片非常相似,如果汉明距离小于5,则表示有些不同,但比较相近,如果汉明距离大于10则表明完全不同的图片。
均值哈希虽然简单,但受均值的影响非常大。例如对图像进行伽马校正或直方图均衡就会影响均值,从而影响最终的hash值。本系用将采用更健壮的算法pHash,它将均值的方法发挥到极致。phash算法使用离散余弦变换(DCT)来获取图片的低频成分。
离散余弦变换(DCT)是种图像压缩算法,它将图像从像素域变换到频率域。然后一般图像都存在很多冗余和相关性的,所以转换到频率域之后,只有很少的一部分频率分量的系数才不为0,大部分系数都为0(或者说接近于0)。下图的右图是对lena图进行离散余弦变换(DCT)得到的系数矩阵图。从左上角依次到右下角,频率越来越高,由图可以看到,左上角的值比较大,到右下角的值就很小。换句话说,图像的能量几乎都集中在左上角这个地方的低频系数上面了。
图3-11 图片DCT分析图
pHash算法的工作过程如下:
1)缩小尺寸:pHash以小图片开始,但图片大于8*8,32*32是最好的。这样做的目的是简化了DCT的计算,而不是减小频率。
2)简化色彩:将图片转化成灰度图像,进一步简化计算量。
3)计算DCT:计算图片的DCT变换,得到32*32的DCT系数矩阵。
4)缩小DCT:虽然DCT的结果是32*32大小的矩阵,但我们只要保留左上角的8*8的矩阵,这部分呈现了图片中的最低频率。
5)计算平均值:如同均值哈希一样,计算DCT的均值。
6)计算hash值:这是最主要的一步,根据8*8的DCT矩阵,设置0或1的64位的hash值,大于等于DCT均值的设为”1”,小于DCT均值的设为“0”。组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。
7)对比指纹:计算两幅图片的指纹,计算汉明距离,汉明距离越大则说明图片越不一致,反之,汉明距离越小则说明图片越相似,当距离为0时,说明完全相同。
本系统通过phash算法来计算各图片的指纹,对于汉明距离相同的图片进行删除。
3.2.2.3 数据集的扩充
本系统采用图像增强、深层神经对抗式生成网络技术(DCGAN)和遗传算法来生成更多的林业有害生物样本。
图像增强
OpenCV图像增强:
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
本项目采用了OpenCV图像增强,简单来说就是把图片进行旋转,昏暗处理,提高亮度,添加噪声,模糊处理以及镜像处理,这些处理可以进行交叉操作,这种方法大大丰富了数据集,通过对高清的图片进行模糊处理,能更好的符合普通手机的拍照功能,让网络的鲁棒性的更好。下面是OpenCV图像增强的效果图:
Mosaic数据增强:
本项目采用了Mosaic数据增强,这种数据增强方式简单来说就是把4张图片,通过随机缩放、随机裁减、随机排布的方式进行拼接,该方法大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。下面是Mosaic数据增强示意图:
当取batch size为16的时候Mosaic数据增强结果如下图所示:
(2) GAN算法
1)对抗式生成网络简介
对抗式生成网络(下文简称GAN)的思想是是一种二人零和博弈思想,博弈双方的利益之和是一个常数。在GAN中博弈双方分别为生成模型(G),和判别模型(D),它们各司其职。生成模型是一个样本生成器,输入一个噪声/样本,输出为一个逼真的样本。而判别模型是一个二分类器(如同0-1分类器),来判断输入的样本是真是假(即输出值大于0.5还是小于0.5)。
下图为较生动的图片解释:
图3-12 判别模型和生成模型功能图
生成网络与判别网络的目的正好是相反,判别网络的目的在于判别出输入的一张图它是来自真实样本集还是假样本集。假如输入的是真样本,网络输出就接近1,输入的是假样本,网络输出接近0,那么很完美,达到了很好判别的目的。生成网络的目的在于增强自己造样本的能力,使判别网络无法判断真假样本。当两个网络旗鼓相当时,生成网络生成的假样本作为判别网络的输入后,判别网络给出的结果是一个接近0.5的值,这就是纳什平衡。
训练这样的两个模型的核心方法为:单独交替迭代训练。
公式(1)为GAN优化公式。
公式(1)
可以看出,这是个最大最小优化问题,其优化分为两步:先优化判别网络D,再取优化生成网络G,本质上是两个优化问题,把拆解就如同下面两个公式:
公式(2)
公式(3)
在优化判别网络D的时候,生成网络并没有参与其中,后面的G(z)这里就相当于已经得到的假样本。优化D的公式的第一项,应使的真样本x输入的时候,得到的结果越大越好。对于假样本,需要优化是的其结果越小越好,也就是D(G(z))越小越好,因为它的标签为0。
在优化生成网络G的时候,判别网络并没有参与其中。这个时候只有假样本,此时希望假样本的标签是1的,所以是D(G(z))越大越好,为了统一成1-D(G(z))的形式,那么只能是最小化1-D(G(z)),本质上没有区别,只是为了形式的统一。之后这两个优化模型可以合并起来写即为最开始的那个最大最小目标函数了。
(2) 深度神经网络对抗式生成技术(DCGAN)
GAN框架有很多优点:收敛、不依赖马尔科夫链、只需要用BP算法计算梯度等。然而也存在很多问题。
首先,这种方法并不能学习到真正的数据分布pg(x)。由于其中的生成器和判别器使用了神经网络,所以训练出来的生成模型更像一个黑盒子:给定输入,产生输出。而其中内部机制并不明晰。除此之外,训练过程并不稳定:训练器的训练过程应该与生成器的训练过程保持同步。特别在判别器没有更新的情况下,绝对不能更新太多次生成器,否则可能会发生“Helvetica Scenario”现象,也就是不论输入的随机采样的噪声向量z是啥,都会得到同样的生成结果x。而DCGAN就是在GAN的基础之上,引入了一系列约束,结合Convolutional Neural Nets(CNN)在一定程度上解决了这个问题。
DCGAN把上述的G和D换成了两个卷积神经网络(CNN)。DCGAN对卷积神经网络的结构做了一些改变,以提高样本的质量和收敛的速度,这些改变有:
1)取消所有pooling层。G网络中使用转置卷积(transposed convolutional layer)进行上采样,D网络中用加入strided的卷积代替pooling。
2)在D和G中均使用batch normalization
3)去掉FC层,使网络变为全卷积网络
4)G网络中使用ReLU作为激活函数,最后一层使用tanh
5)D网络中使用LeakyReLU作为激活函数
本系统对CNN结构有三点重要的改变:
-
对于Allconvolutional net 全卷积网络
判别模型D:使用带步长的卷积(strided convolutions)取代了的空间池化(spatial pooling),容许网络学习自己的空间下采样(spatial downsampling)。 生成模型G:使用微步幅卷积(fractional strided),容许它学习自己的空间上采样(spatial upsampling)
-
在卷积特征之上消除全连接层。
全局平均池化有助于模型的稳定性,但损害收敛速度。 GAN的第一层输入:服从均匀分布的噪声向量Z,因为只有矩阵乘法,因此可以被叫做全连接层,但结果会被reshape成4维张量,作为卷积栈的开始。 对于D,最后的卷积层被flatten(把矩阵变成向量),然后使用sigmoid函数处理输出。 生成模型:输出层用Tanh函数,其它层用ReLU激活函数。 判别模型:所有层使用LeakyReLU
-
Batch Normalization 批标准化。
解决因糟糕的初始化引起的训练问题,使得梯度能传播更深层次。稳定学习,通过归一化输入的单元,使它们平均值为0,具有单位方差。 批标准化证明了生成模型初始化的重要性,避免生成模型崩溃:生成的所有样本都在一个点上(样本相同),这是训练GANs经常遇到的失败现象。 generator:100维的均匀分布Z投影到小的空间范围卷积表示,产生许多特征图。一系列四步卷积将这个表示转换为64x64像素的图像。不用到完全连接或者池化层。
下图是DCGAN判别网络流程图
下图是DCGAN生成网络流程图
#####
(3) 遗传算法
本项目通过遗传算法进一步生成了更多的数据集,主要的遗传操作是交叉和变异。在这项工作中,使用了90%的概率和0.04的方差的变异,以所有前几代最好的父母的组合来创造新的后代。下面是遗传算法实现的示意图:
3.2.2.4 图片手动标注
在收集和生成大量的林业有害生物样本之后,我们团队用开源软件Labelimg手动给图片打上标签,用作林业有害生物训练样本。
3.2.3 利用Yolov5模型实现林业有害生物识别训练模块
系统的应用场景是在林业管理人员和林业工作人员作业的林间,非常具有实时性,因此对于系统检测的速度也有较高要求。同时由于要求部署在移动端考虑到手机本身的算力限制,我们决定采用YOLOV5的轻量级模型进行林业有害生物智能识别的模型的训练。
Yolov5概述
Yolov5 是Yolov团队发布的最新的开源开发模型,其神经网络架构如图所示,分为输入端、Backbone、Neck、Prediction四个部分。
1)输入端
自适应锚框计算:
在Yolo算法中,针对不同的数据集,都会有初始设定长宽的锚框。
在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距,再反向更新,迭代网络参数。
因此初始锚框也是比较重要的一部分,比如Yolov5在Coco数据集上初始设定的锚框:
Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。
自适应图片缩放:
在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。 比如Yolo算法中常用416×416,608×608等尺寸,比如对下面800*600的图像进行变换
Yolov5代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边,通过这种简单的改进,推理速度得到了37%的提升,可以说效果很明显:
3.3 数据库设计
本项目采用了阿里云服务器并使用MySQL关系型数据库管理系统,存储大量昆虫和登录用户相关信息,在应用需要时,进行数据的增删改查,满足服务需求。将所有昆虫信息和用户信息存储至MySQL数据库中,在需要时进行增删查改,完成应用相关功能。
另外本项目采用sqlite存储部分常见昆虫相关信息,保证在离线时也能完成部分相关功能,将待查找的昆虫信息存入Insect表中,在查询时调用实现的相关方法进行增删查改,完成相应功能。
本系统的数据库的结构设计、属性定义等设计图如下所示:
3.3.1 数据字典
Insects表
字段名 | 类型 | 约束 | 默认值 | 语义 |
---|---|---|---|---|
Name | varchar | Not Null | 中文名 | |
Latin_name | varchar | Not Null | 拉丁文名称 | |
Order_of | varchar | Not Null | 目 | |
Family | varchar | Not Null | 科 | |
Genus | varchar | Not Null | 属 | |
Food | varchar | Not Null | 食物 | |
Distribution | varchar | Not Null | 分布 | |
Message | varchar | Not Null | 相关信息 | |
url1 | varchar | Not Null | 相关图片1 | |
url2 | varchar | Not Null | 相关图片2 | |
url3 | varchar | Not Null | 相关图片3 |
User表
字段名 | 类型 | 约束 | 默认值 | 语义 |
---|---|---|---|---|
Id | Integer | Not Null | 序列号 | |
User_name | TEXT | Not Null | 用户名 | |
Name | TEXT | Not Null | 电话号码 | |
password | TEXT | Not Null | 密码 |
系统实现
4.1 团队分工、
史振宁:负责主要算法实现,搭建系统,进行模型训练。
王远卓:负责数据集的爬取、图像增强和数据库的构建。
林晨曦:统筹项目进度,实现前端设计和模块与前端的连接实现。
4.2 编码实现
4.2.1 构建选择
1)编程语言选择
本系统数据集采集和训练所采用的语言为Python语言。通过Python语言,可以实现本系统跨平台、兼容性高的要求。而部署到移动端则采用了Java语言,采用Android Studio编写。
2)依赖库选择
Android Studio:本系统需要安装Android Studio 3.5及以上版本。
4.2.2 环境搭建
本项目采用Android Studio开发,最终结果为APK文件,直接在手机上安装即可,要求手机安卓API在版本28以上(支持Pytorch库)。本项目的数据库的构建分别采用本地的sqlite数据库和阿里云已经配置好的mysql数据库,安装APP成功即可直接连接。
4.2.3 系统开发
本系统开发历时两个月左右,其中开发阶段耗时45天,调试优化10天,模型训练以及项目后期优化整体20余天,总共历时两个月有余。
由于系统开发内容较多,本文档暂列举林业有害生物识别部分开发内容进行描述。
-
林业有害生物识别流程概要
本系统林业有害生物识别流程如下图所示:
图4.2-1 林业有害生物识别顺序图
4.3 模型训练
4.3.1 训练样本采集
由于缺乏现成的林业有害生物识别的相关训练库和训练样本,整个模型训练需要我们从0开始对系统进行训练。
首先,我们需要海量的训练样本,这部分样本无需视频,只要图片即可。于是我们搭建爬虫,爬取了百度、谷歌、必应等各大搜索引擎上关于林业有害生物的图片数万张,其中良莠不齐,后期我们又花费了比较大的人力对图片进行了筛选。
4.3.2 模型训练过程
我们采用了Yolov5开源工程项目对我们的模型进行了训练,Yolov5的神经网络架构图如下:
训练效果如图所示:
我们可以看到,经过300个epcho的训练,我们的模型获得了一个较好的训练效果。
系统测试
5.1 测试环境
5.1.1 硬件环境
CPU: 酷睿 i5 9400F
RAM: 32GB
显卡: GTX 1080TI
硬盘: 希捷 SSD
5.1.2 软件环境
64位Windows 10系统,无其它特殊软件环境
5.2 测试内容
5.2.1 识别准确率与速度测试
我们选取了组委会提供的部分识别样本中的127张成虫照片进行了模型的准确率与速度测试,结果如图所示:
其中第一列是识别害虫的中文名的拼音,第三列是该害虫图片的数量,第四列是准确率,第五列是召回率,第六列是mAP_0.5,第七列是mAP_0.5:0.95。我们可以看到平均准确率、召回率、mAp_0.5均在90%以上。而最后一行的数据显示识别每张图片时,平均时间为:0.2ms预处理时间,4.2ms连接时间,2.4msNMS时间,总时间为6.8ms,可谓是十分的迅速,但是考虑到配置到手机端算力会有明显下降,实际在手机端的检测时间为0.2s左右。
模型测试的量化图结果如图所示:
实机测试的结果如图所示:
5.2.5 功能完整性测试
对比产品开发需求说明,本系统完成了产品需求中的功能,具有完整的功能。包括但不限于等功能。
图5.2-7 功能完整性测试
5.2.6 产品稳健性测试
引起产品不稳定的情况可能有系统环境、硬件环境、输入来源、用户恶意操作等,前两种情况导致软件奔溃的概率较低,难易预测。我们针对后两种情况对软件进行了多种稳健性测试,测试结果良好。
6.1 项目总结
6.1.1 项目进度总结
-
项目周期
本项目预计开发总时长2个月整,其中第一个月进行需求分析、系统设计、系统实现,后一个月进行 bug 测试、功能优化以及系统维护。
实际执行情况耗时大约70天,加上后期文档以及视频制作等内容接近3个月,整体项目进度略有滞后。
-
偏差原因说明
在产品开发过程中本产品进行了多次迭代,主要原因是考虑到产品运行环境的实际情况,对产品性能以及可用性提出了新的要求,对核心算法实现以及产品实现进行了一定的重构或优化,期间消耗了一些时间导致整体开发周期滞后。
-
改进措施
在产品需求分析以及设计阶段充分考虑产品实现以及产品投入使用时可以遇到的问题,事先准备好解决措施。严格遵守迭代开发流程,考虑采用敏捷开发模式,先设计原型,再进行产品完善。
6.1.2 实际开发成果
a) 产品
说明最终制成的产品,包括:
本项目最终实现了基于人工智能的林间有害生物智能识别系统,并命名为『森林卫士』。目前实现产品测试版 V1.0、稳定版V2.0,稳定版修复了测试版中存在的识别欠准确问题以及部分内存泄露问题,经过多次测试,该具有比较稳定、可靠的服务,效果满意。
现阶段,在数据持久化方面系统采用了 MySQL 、SQLITE数据库,并根据系统使用情况定制了相关的配置管理计划,具有较高的性能。
-
主要功能
根据产品开发需求,本软件实际完成了以下功能:
-
林业有害生物实时监测(达标)
-
本地视频(图片)文件林业害虫检测(达标)
-
林业有害生物基础库维护(达标)
-
林业有害生物智能识别反馈(达标)
-
核心算法模型高效实现(超标)
-
6.1.3 团队工作评价
-
对生产效率评价
项目开发期间,团队成员利用课余时间紧密开发。在项目过程的各个阶段表现良好,具有较高效率,人均每月产出2个核心功能模块、数十个文件、千余行关键算法,取得了优秀成果。
-
对产品质量评价
在产品阶段性验收中,在千行代码中的错误指令数平均值为2行,远低于平均水平。经过多次测试、使用,目前暂未发现新型 bug,产品整体稳定、可用、功能完善,实现了开发中制订过质量保证计划或配置管理计划,并具有部分功能超标完成。无论从代码层面还是软件实用层面,本产品具有较高的产品质量。
6.1.4. 经验与教训
通过此次产品开发,本团队深刻认识到协作开发的重要性。在团队开发过程中,应该学会相互合作、相互协调。
在产品开发前,应该进行详细的产品设计;在开发过程中,需要严格遵守编码约定、把握开发进度、控制开发周期。
在产品开发结束时,需要对产品进行多方位的测试,对不足的地方改进、有 bug 的地方修护,在后期还应该根据产品实际使用情况进行进一步的优化和维护。
6.2 发展规划
经过现阶段的开发测试,本产品已经成长成为一个功能齐全、运行稳健、识别迅速的高可用智能林业害虫智能识别系统。在下一阶段中,我们将走出校园,尝试将产品实地运用于林间。具体的发展规划安排如下:
-
在一个月内将产品推广至校园周边林地,进行小规模内测使用
-
在两个月内继续完善产品,根据小规模内测反馈进行进一步功能完善和产品调优
-
在四个月内考虑将产品部署到无人机和摄像头上,实现立体化的林业害虫识别。
-
在云计算服务的基础上进一步优化产品架构,考虑构建面向第三方使用者的接口服务,为更多林业部门提供实时在线检测服务
-