吕俊霖,麦嘉铭 ,熊 浩,蔡海真
(1 中国水产科学研究院南海水产研究所,广州 510300;2 华南农业大学,广州,510642)
随着机器学习尤其是深度学习技术的迅速发展,图像识别技术已在植物识别[1-2]、人脸识别[3-4]、交通标志识别[5]和医学图像等方面展开了广泛的研究应用。图像识别技术在鱼类智能识别领域起步较晚,这是因为鱼的身体是柔性的,不容易取得固定的特征,再加上水体和光照的因素,要识别并鉴定水中的鱼类就显得较为困难[6]。
在对鱼类进行图像识别研究的过程中,王文成等[7-8]应用ResNet50网络模型,对巴鲣鱼、大菱鲆、鲻鱼等10 种鱼类的分类和识别进行探索研究;陈文辉等[9]提出一种基于DCNN和迁移学习的方法,针对新图像数据集,通过选择训练参数,对预训练模型进行再训练,实现4种鱼类的分类识别,徐嘉熠[10]基于ResNet101网络的Faster RCNN算法和基于VGG16网络的SSD算法对有标记的鱼类图片进行目标识别;贾玉霞[11]使用自制的数据集Fish30Image,利用ResNet模型结合迁移学习方法,对30种鱼类的识别,得到了99%的准确率。
识别系统的设计和实现需要考虑样本来源和技术框架的问题。其中,样本来源即训练集的图像,这决定了最终所得的权重文件的拟合程度,训练集的覆盖场景越多,标注越准确,拟合程度就越好,识别就越准确,反之则相反。技术框架是指识别的前后端应采用什么样的技术进行组合。根据识别技术的使用场景,前端技术应当是便携的,易用的,与后端无缝集成的。根据前端的应用要求,后端为其提供功能接口,比如文件读取、数据存取等等。根据使用场景,前端可使用微信小程序、手机应用程序或网页等,后端可选择的技术较多,基于Python 的Django[12-13],基于PHP的ThinkPHP[14-15]或基于Java的SSM均可。
提出了一种基于深度学习的鱼类智能识别系统的设计方案。该系统前端采用微信小程序作为界面载体,后端采用Java的SSM框架,对用户上传的图片进行识别,并将识别结果返回给前端做进一步的渲染,展现给用户最终的识别结果。
卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,由一个或多个卷积层、池化层和顶端的全连接层组成。这一结构使得卷积神经网络能够利用输入数据的二维结构提取图像的特征。与其他深度学习结构相比,卷积神经网络对图像的某些关键特征能做出较为敏感的反应,因此,目前多用于大型图像的图像识别、图片分割、物体检测等方面[16-18]。
在机器学习尤其是深度学习中,Softmax是个非常常用且比较重要的函数,在多分类的场景中使用广泛。在多分类中,可能有多个预测结果,这些预测结果用概率的形式表示,概率值较大,表示预测准确度较高,反之则说明准确度较低。预测结果的概率总和是1,Softmax函数刚好符合这个性质,可以把输出映射为0~1之间的实数,并且保证输出的概率之和为1,因此,Softmax函数在多分类的应用场景中取得了主流地位。
在本系统的设计中,通过运行识别脚本,得到Softmax函数的返回值,该返回值(一个或几个)与数据库的ID值一一对应,从而可得到该物种的详细信息。通常,取概率值最大的ID作为物种的识别结果。
在识别的应用场景中,识别行为通常是偶发的、一次性的,微信小程序的“随用随走”的特点正好满足这一需求。微信小程序的本质是一个富单页面的Web应用,所有的页面渲染和事件处理都在一个页面内进行,但与传统的WebApp不同的是,它可以调用原生的各种接口,像网络状态、罗盘、重力、手机摄像头、手机文件接口等[19-20],因此,微信小程序非常适合应用在图像识别的场合。
Java的SSM(Spring + Spring MVC + MyBatis)是一个轻量级的应用技术[21-23]。Spring依赖注入的方式来管理各层的组件,使用面向切面编程来管理事务、日志、权限等。Spring MVC使用Model(模型)、View(视图)、Contoller(控制)来接收外部请求并进行分发和处理。MyBatis是基于JDBC的框架,主要用来操作数据库,并且将业务实体和数据表联系起来。自SSM框架推出以来,在业界获得了较多应用,技术比较成熟,近年来在人脸识别、商品推荐等领域取得了不少应用[24-26]。因此,前端使用小程序技术,后端使用SSM框架,是一个比较常用的设计方法。
系统采用微信小程序+SSM作为技术框架。微信小程序作为前端,可以调用摄像头或利用相册进行图片传输,后端采用了Java的SSM框架,具有灵活高效的特点。数据库采用开源数据库MySQL进行数据的管理。程序流程图如图1所示。
图1 程序流程图
在图1中,用户使用小程序进行拍照或直接在相册中上传鱼类物种的图片,后端的SpringMVC监听到请求后,将传上来的图片暂存在本地,然后调用深度学习的脚本进行图片识别,识别结果与训练好的模型文件进行比对,得到属于某个物种的概率,并返回该物种的ID号,由于物种的ID号跟物种的具体信息已事先存储在MySQL数据库中,因此,根据该物种的ID访问数据库并取得该条记录的具体信息并返回给前端。于是,用户在网页或小程序上就获得了该图片的识别结果和该物种的详细资料。
系统的数据集训练采用谷歌的Efficient Net网络模型,该算法于2019年推出,实现了网络模型的深度、广度和图片解析率的动态平衡,在同等的参数情况下,比VGG15、ResNet50和ResNet10更为优越[27-29],因此,本系统采用该模型进行鱼类数据集的训练,可以取得更高的精度和更快的训练速度。
系统按照功能结构可分为系统管理模块、深度学习模型调用模块、鱼类信息管理模块、统计分析模块和智能推荐模块。系统管理模块主要提供系统的基本功能,包含用户、角色、权限配置等管理功能。此部分内容比较简单,属于通用模块,本文不予详述。深度学习模型调用模块是系统的关键点,负责与深度学习模型进行交互,达到鱼类智能识别的目的。鱼类信息管理模块是本系统的另一个关键模块,其功能包括:鱼类资料录入、缩略图上传、参考图上传等。统计分析模块用于统计识别种类的次数、识别时间等。智能推荐模块则根据识别结果,推荐与识别结果近缘的种类。系统的功能框架图如图2所示。
图2 功能框架图
前端上传过来的图片保存在本地后,调用深度学习的脚本文件对此图片进行卷积处理,将卷积结果与模型文件进行比对,从而计算出属于某个鱼类(此鱼类在数据库中的ID)的概率。概率越大,属于该种鱼类的可能性越高,准确度越高。在实践中,舍去了概率值低于0.05 的鱼类,返回“很抱歉,我们暂时无法识别此生物”。
系统的鱼类信息管理模块的功能是为前端提供所识别的鱼类的具体信息。如学名、俗名、形态特征、生活习性等等。因此,需要设计一个数据表进行管理。该数据表的设计如表1所示。
表1 鱼类信息数据表
在表1中,image是指在物种详情页的上方所展示的图片,该图片在小程序上进行轮播展示,点击可查看大图;smallimage是指在查询时展示的缩略图;infomatihonsource是指信息来源,如某本论著或某个网站等。 表1中资料由工作人员在相关论著和维基百科、百度百科上采集而成,个别有疑问的字段,则由专业人员审查后确定。
统计分析模块用于在一个时间段内统计分析后台接口被调用的次数和物种被预测识别的次数,从而在宏观角度上掌握识别系统被使用的情况,有利于研究团队合理分配资源和分析识别结果。比如某些鱼类被识别的次数较多,就需要把服务器资源和更多精力投入到这些鱼类当中。
随着推荐系统的广泛应用,本文也增加了推荐功能,用于对识别结果的同属物种的推荐。根据鱼类学名的命名规律,相邻的科属往往也采用相似的名称,因此,可以用SQL的like语句来进行邻近种的推荐。对相邻科属的推荐,一方面便于用户对所识别的物种进行细微的辨别,另一方面也增加了用户使用程序的时间。
数据集使用EfficientNet网络模型训练完毕后,查看其精度和损失值情况。见图3和图4所示。
图3 鱼类训练集的精度和损失值
由图3a可以看出,在第20 个Epoch之前,精度(accuracy)上升较快,之后逐渐趋缓,最终停留在约95%的位置。在图3b 可以看出,损失值(loss)在第20个Epoch 之前下降较快,之后逐渐趋缓,最终损失值0.05左右,可见整体训练效果较好。最终获得的模型文件为74.5MB,在服务器上的检测时间为0.2 ms。
为了便于应用推广,项目成员制作了“识鱼”小程序。在微信中,搜索小程序“识鱼”并打开,起始页面是一张鱼类的清晰大图,起到吸引用户的效果,可以点击此图,直接对此图进行识别,也可以由用户自行选择图片或使用相机进行识别,通常不到一秒即可得到识别结果,见图4和图5。
图4 识鱼首页
图5 识别结果页
此外,项目成员还在农贸市场、超市、酒店水族箱等对鱼类进行拍照识别测试,测试次数200次,所涉及的鱼类有金线鱼、大眼鲷、篮子鱼、金钱鱼、细鳞鯻等,基本准确率在90%以上。另外,对家庭水族箱、网页中的鱼类图片甚至是简笔画也进行了测试,见表2。表2说明,该模型对这几种鱼类在水族箱、网页图片和简笔画等场景的泛化程度较好。这些图片由网络随机挑选而得,虽然不能说明全部种类的识别情况,但也有一定的代表性。
表2 不同场景下对若干鱼类识别
在对图片进行物体识别的发展过程中,前期主要侧重于对物体的大类进行识别,这称为“粗粒度识别”,与此相对,“细粒度识别”是指对同一基础类别的不同子类对象进行识别,其难点在于不同类别间仅有细微的局部差异[30-32]。在本研究中,因为需要识别出图片里的每条鱼的分类地位,所以,这是鱼类的“细粒度识别”。在细粒度识别中,所需要识别的子分类越深,科、属内所包含的种越多,识别的难度就越大。因此,识别同一个属内的若干种鱼类,与识别不同科的若干属鱼类,前者的难度要更高。这也是相关研究[7-11]较为不足的地方。在本研究中,是通过收集大量能体现物种特征的图片,并辅以性能更为优越的EfficientNet来提升细粒度识别的精度。
从表2可以看出,本研究最终生成的模型不但对鱼类实际图片的识别效果较好,对简笔画也能做出较准确的识别。这是因为项目成员对网络图片及对最常见种类的图片做了广泛收集。比如,对金鱼、锦鲤等最常见的种类,项目成员采集了大量在脸盆里、玻璃箱里、公园的池塘里的金鱼和锦鲤的典型图片并加以训练,所生成的模型中包含了物种的典型特征,因此,当用户上传类似的图片时,就能对此做出较为准确的识别。事实上,对一个基于深度学习的识别系统来说,数据集质量的高低决定了所能达到识别准确度的上限。因此,系统设计人员在开发过程中,不但要考虑到技术框架的适应性,还更应注重数据集的质量。在以往的研究中,研究人员多侧重在图像识别的技术层面,而对数据集的质量有所忽视,这导致了在技术层面(算法、性能和功能等)的表现虽好,但却难以落地的问题。
但是,质量更高的数据集则意味着需要花费更多的时间和精力。因此,在本系统的研发中,花费最多精力和时间的并不是对代码的编写和对参数的调整,而是对图片的反复收集和鉴定。在后续的研究中,应侧重于对小样本数据集的特征提取研究,以在一定程度上减少人力的使用[33-34]。
本研究所设计的鱼类智能识别系统,在实际的识别应用中,有些鱼类可能无法识别,或者识别不准确,需要人工介入。对此,本设计已在“我的”页增加了“联系我们”,可使用微信小助手跟鉴定人员进行互动,以帮助用户进行更准确地识别。但更好的形式却是开辟讨论页,让众多的用户加入到对鱼类的识别和鉴定中来[35]。但此页面的开辟,因关系到值守制度,言论管理制度的执行,在一定程度上增加了运维成本。如何取舍,还要看各运维单位的实际情况。
设计了一种鱼类智能识别系统,对卷积神经网络技术、微信小程序技术和SSM技术进行集成,并开发了智能推荐和统计分析模块,较好地完成了对鱼类智能识别的设计和实现,可对中国1 400种鱼类进行智能识别,在不同场景中对鱼类的识别效果良好。本研究中所提出的设计和实现方法,为移动端的鱼类识别开发提供了一种可行的思路,可为广大海洋科研人员和开发人员提供有益的参考。
□