国产框架MindSpore联合山水自然保护中心,寻找、保护「中华水塔」中的宝藏生命

简介: 国产框架MindSpore联合山水自然保护中心,寻找、保护「中华水塔」中的宝藏生命

红外相机是常用的野生动物调查手段,通过布设在野外的相机利用红外感应相机前经过的动物并拍摄照片或视频素材,来获取当地野生动物的信息。

红外相机照片和视频中物种的识别往往需要大量的人力和时间投入,这也是红外相机调查整个工作流程中的限速步,使得调查结果很难快速及时地转化为科学成果、反馈给利益相关方、应用于生物多样性保护决策等。

山水自然保护中心、北京大学自然保护与社会发展研究中心、以及其他合作伙伴自 2011 年开始在三江源、四川、云南、北京等地开展红外相机调查与长期监测,积累了大量红外相机数据,也在不断思考和探索如何加速红外数据的识别环节。山水希望能引入 AI 技术和公民科学两个「小帮手」,首先由 AI 识别模型完成对红外数据的初步识别和筛选(去除未拍到动物的空拍),再由公民科学志愿者对 AI 识别结果进行检查和修正,最后再由专家鉴定和复核志愿者识别中不确定的内容,从而实现大批量红外数据的快速识别。

山水目前也在基于这一识别流程开发一套线上红外数据管理系统,期望为行业提供帮助。



近年来,已经有很多将 AI 技术应用于红外相机数据物种识别的实践,而对于素有「中华水塔」之称、生物多样性丰富、有着众多珍稀物种的三江源地区,在红外相机 AI 物种识别方面的尝试还并不多。山水曾在 2018 年利用 Res18 深度卷积神经网络进行了三江源物种 AI 识别的初步尝试,取得了不错的效果,希望能在已有模型的基础上进行更多的探索和尝试。

MindSpore 开源社区也很希望能够将 AI 技术应用于实际的生物多样性保护场景,双方深入交流后,决定开展三江源地区红外相机照片 AI 物种识别模型训练的合作,而这也是首次基于国产框架的开源模型用于支持三江源红外相机物种识别。

MindSpore 是华为开源的一款全场景 AI 框架,旨在提供友好设计、高效运行、简捷部署的开发体验,目前应用于医疗、金融、科研等多个领域,提供面向端边云多种场景的主流硬件支持,并针对昇腾硬件平台提供深度优化能力。MindSpore 着力构筑面向全球的人工智能开源社区,推动人工智能软硬件应用生态繁荣发展。目前 MindSpore 社区已拥有 80 万社区开发者,下载量超过 100 万5000 + 企业应用上线,认证开发者/布道师近300人,社区企业伙伴160+,是国内第一热度的 AI 开源社区。

1 - 数据准备

考虑到物种识别模型需要每个物种具有足够的训练数据量,首期模型训练选取了三江源红外数据中常见的 10 个物种或物种类别,包含雪豹、岩羊、白唇鹿、赤狐、狼、喜马拉雅旱獭、川西鼠兔、鸟类(除藏雪鸡、大鵟外,其余未再提供二次细分类别的鸟类统属鸟类这一大类)、藏雪鸡、大鵟,共 12680 张照片,其中 12180 张作为训练集,500 张作为验证集。

图 2 AI 物种识别模型物种图鉴


2 - 模型选择

在项目初期,MindSpore 团队首先着手对山水提供的一小批红外相机物种照片进行识别分类,因此模型的初选型定位为 ResNet 等图像分类模型。在经过进一步讨论后,了解到不同于动物摄影照片,红外相机照片中的动物通常难以拍得清晰、完整,常出现一道模糊的身影、画面边缘露出的半个脑袋、或者动物借助保护色隐匿于复杂背景中等情形,因而仅对图像中特定对象的类别进行分类或预测难以满足项目需求,还需要能够在分类的同时确定目标在给定图像中的位置和得分,因此目标检测模型成为本次合作的首选。

图 3 你能找到红外相机照片中的动物吗?


目标检测模型分为 one-stage 和 two-stage 两大类,两大类模型的共同点在于 Backbone 骨干网络都用于对输入图片进行特征提取工作,区别则在于 Head 网络,one-stage 模型在一个阶段即可完成对目标的定位与分类,而 two-stage 网络则是分两个阶段完成,先完成目标定位,再对定位的目标进行分类,即对输入的图片先通过滑窗得到几十万个的框,要求物体正好出现在一个滑窗中,这个滑窗的位置即为物体的位置。对于一张图片来说,存在大小各异的物体,这就导致设计的窗口大小也存在多种,这样耗费了大量的时间,然后再使用选择算法筛选出较符合的框,对这些窗口的目标进行分类,而 one-stage 则是基于整张图片的,它并不要求物体必须在这个框内,就不需要设计大小各异的框,只要求物体的中心落在这个框内即可,因此我们就可以先预测出 X 个框的分类,再通过置信度去筛选较可信结果。

图 4 目标检测模型选型分析图


这样带来的结果是 one-stage 模型的检测速度快于 two-stage 模型,检测精度则是会略微弱于 two-stage 模型。

图 5 目标检测模型选型对比表


出于对模型的实时性检测和准确率双重考虑,选用精度和速度相平衡的算法,能够让模型更好地扩展部署到野外的端侧设备,同时也能保证模型预测的相对准确率, MindSpore 开源运营团队和山水讨论后,决定采用基于 MindSpore1.2 框架的 YOLOv3 目标检测模型,它是第一个平衡所提供检测的质量和速度的算法,在定位照片中动物所在位置的基础上完成对物种类型的识别。

YOLO 是经典的 one-stage 目标检测模型,全称「you only look once」译为只需要看一次就可以识别出图像中的物体类别和位置,在 2016 年提出了第一个版本 YOLOv1,后续还出了 4 个版本,相比 YOLOv1 和 YOLOv2,YOLOv3 引入了多尺度预测,大大提升了预测精度,因此本次实验选用 YOLOv3 模型进行实践。

YOLOv3 使用基础网络 Darknet53,相比 YOLOv2 使用的 Darknet19,Darknet53 移除了 MAX POOLING 池化层,并增加了卷积层数,速度稍有减慢,精度大大提升,整个网络结构相对简单。

图 6 Darknet53 网络


3 - 模型训练

目标检测模型不仅需要红外相机照片的物种类别标签,也需要用标注框框出照片中的物种的位置,在 MindSpore 团队的线上与教程指导下,山水团队使用华为云 AI 标注平台开展物种标注工作,并后续邀请了 61 位志愿者来一同完成这个任务。

标注好的数据无法直接用于训练,因此,在拿到标注好的数据后,MindSpore 团队首先会对其进行数据清洗的工作,从中审查和纠正出「脏」数据,然后再开发一套格式转换工具,将标注数据的格式转换为训练可用的 COCO 数据集格式。通常,这样的数据仍存在一些不规则的地方,在训练前还需要对其进行一系列的数据预处理操作,再喂给模型进行训练。目前,这些数据预处理方法都是基于 MindSpore 提供的接口实现的,感兴趣的开发者可以详细阅读 MindSpore 的 API 文档。

文档链接:https://www.mindspore.cn/docs/api/zh-CN/r1.5/api_python/mindspore.dataset.html

图 7 数据预处理


为了能使模型达到更好的效果,同时也配合照片打框标注的进度,模型分阶段进行训练(500 张 ->3000 张 ->5689 张 ->12180 张),通过增加数据集,微调参数不断优化模型。通过调整训练的 epoch 数、学习率、loss_scale、照片的宽高、anchor_box 等参数,将 loss 从 67 不断下降到 5 以下,对一些非专业人士肉眼容易混淆的照片,模型也能清楚地分辨了。  

图 8 你能一眼分辨出藏雪鸡和大鵟吗?


这一过程中,通过阶段性的进展沟通,发现了训练过程中存在的问题并及时进行了针对性的调整,例如纠正了部分误标注的数据(如将大鵟和藏雪鸡标注为鸟类,导致大鵟和藏雪鸡混淆),同时也发现连续拍摄的照片内容相似,对模型训练的价值不高,因此山水在后续提供的照片中减少了连拍照片并补充了更多不同背景的照片,并对错误数据进行了重新标注。

4 - 模型识别效果

模型训练完成后,在 500 张的验证集上使用 COCO 官方 API 评测工具,比对检测标注框与实际标注框的 IOU 值,验证模型,整体验证结果良好,在不同阈值下(0.001-0.7)的 best mAP@IOU=0.5 在 82-92% 的范围内,整体的识别准确率在 82-97% 的范围内,其中阈值为 0.1 时识别准确率最高,仅有 1% 的漏检(未检测到动物)和 2% 的错检(检测为其他物种)。在阈值的选择上,采用的阈值越高,错检越少,但相对应的漏检会较多。在实际的使用场景中,为了避免出现漏掉拍到动物的照片,倾向于采用较低的阈值(如 0.1),AI 模型为照片标注多个框(或正确或错误)的结果,再由人工判别最终的结果。

为了进一步验证模型在真实识别场景下的表现,山水在 4548 张的红外数据集上测试了模型。测试数据集包括了模型已训练的 10 个物种或物种类别照片共 2701 张、其他物种的照片 884 张、空拍(未拍到动物的照片)964 张。相较于模型验证集是从训练集所在的同一批数据中随机抽样选取,测试集选取另外一批数据,和训练集仅在拍摄地点上有小范围重叠、没有拍摄时间上的重叠,因而一定程度上模拟了将模型应用于一批全新数据识别的情景。

注:相较于精确率(Precision),即识别出某物种的照片中多少实际为该物种,红外相机照片的识别更关注召回率(Recall),即实际某物种的照片中有多少被正确识别出来。

模型已训练物种:


采用 0.1 阈值时,整体识别准确率为 76%,其中雪豹的召回率(Recall)最高,达到 95%,有 3% 的雪豹照片未检测出动物,2% 的雪豹照片被识别为其他动物。

常出现的识别错误情形包括复杂背景、夜晚黑白照片(特别是夜晚训练集不足的物种,如狼和川西鼠兔)、动物只拍到部分身体、小型物种(如鸟类和川西鼠兔)漏检等。

图 9 雪豹识别结果

其他物种:

虽然模型仅训练了 10 个物种,对于其他三江源地区物种(如藏狐、兔狲、马麝等),模型也能检测出来 85% 以上的动物,其中多数被检测为同类物种,例如藏狐被检测为同为犬科的赤狐或狼,马麝被检测为同为有蹄类的岩羊或白唇鹿。

空拍:

采用 0.1 和 0.5 阈值时,模型会在 24% 和 7% 的空拍照片中检测出动物,通常会是把石头和植物等错认为动物。  

图 10 石头:你看我是不是有点像藏雪鸡?


总体而言,模型表现良好,对夜晚的数据具备一定泛化能力,除此之外,对细化的分类(如鸟类的细化类别:藏雪鸡、大鵟)也是具备辨别的能力,结合后续识别流程中的志愿者和专家的人工修正,能够实现在降低人工识别工作量的同时保持识别的准确率。当然,受训练数据量所限,尽管目前的训练数据已经在不断优化,但仍存在不少连拍的数据,在数据标注好后,由于是多人进行的人工标注,未对全量的数据进行深入校验,无法完全保证训练数据的正确性。

模型未来还有很多完善的空间,例如在数据集上,可以增多更多样化背景的照片、补充更多夜晚的训练照片以增强模型的夜晚检测率、增加小型动物在复杂背景下的照片以提高模型对小型动物的检测能力、细化「鸟类」类别的物种分类等;在数据处理上,可以增多对夜间样本的去模糊化等处理;在数据清洗上,可以找到更加智能的方法去释放人力。

5 - 模型使用

配合 AI 模型的不同使用场景,MindSpore 开源运营团队开发了单张推理和批量推理两套工具,前者提供了上传单张红外照片、返回并展示其识别结果的展示界面(如下图),后者则可以批量处理红外照片,以表格和标注了识别结果框的照片的形式返回一批照片的识别结果。模型文件和两套工具代码均已开源,可以供更多有需求的人和机构使用(需要在GPU或者昇腾服务器上,可以是本地硬件或者云服务实例)。开源的模型也支持使用者在已有模型的基础上增加自己的数据,进一步进行模型训练。


近期,模型将初步应用于山水的红外相机照片识别中,未来模型也会被应用到线上红外数据管理系统中,希望这个 AI 小助手能帮助我们大幅加快照片识别流程的速度,节省人力和时间,使得红外相机调查收集的宝贵的物种数据能够更快地反馈到保护和科研工作中,发挥其价值。山水作为一家公益组织,也希望与 MindSpore 的合作可以服务于更多的保护组织和科研机构。受数据以及时间等限制,目前的模型当然还存在很多不足,我们也期待在开源社区的支持下,大家可以共同努力,不断优化模型,让模型能够帮助到更多需要的人和机构,发挥更为积极和重要的作用。

本项目的所有代码、模型文件和部署文档均已开源,如果您感兴趣,可以访问下面链接获取相关资料,如有任何疑问,可以随时在社区提 issue 或 pr,期待您的参与。

获取模型地址:https://mindspore-species-detection.obs.cn-north-4.myhuaweicloud.com/yolov3.ckpt 

模型及代码地址:https://github.com/hellowaywewe/species-detection.git 

模型部署参考文档地址:https://mindspore-species-detection.obs.cn-north-4.myhuaweicloud.com/MindSpore_Shanshui_Species_Detection_Model_Deployment.pdf 


MindSpore开源社区运营团队坚持以技术为核心的理念,除了助力自然保护的预训练模型之外,MindSpore开发者高阶API套件TinyMS项目也发布了集成opencv功能的最新版本,欢迎尝试:

https://github.com/tinyms-ai/tinyms

相关文章
|
7月前
|
JavaScript
Bert-vits2-v2.2新版本本地训练推理整合包(原神八重神子英文模型miko)
近日,Bert-vits2-v2.2如约更新,该新版本v2.2主要把Emotion 模型换用CLAP多模态模型,推理支持输入text prompt提示词和audio prompt提示语音来进行引导风格化合成,让推理音色更具情感特色,并且推出了新的预处理webuI,操作上更加亲民和接地气。
Bert-vits2-v2.2新版本本地训练推理整合包(原神八重神子英文模型miko)
|
7月前
|
人工智能
破壁人AI百度:科技公司反内卷的典型样本
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开头的元素 boolean empty() 如果队列为空,返回 true ;否则,返回 false class MyQueue: def __init__(self): self.stack_in=[] self.stack_out=[] def push(
38 3
|
7月前
|
人工智能 机器人 UED
特斯拉手机应用上线AI聊天助手:特斯拉助手Beta版
【2月更文挑战第11天】特斯拉手机应用上线AI聊天助手:特斯拉助手Beta版
182 1
特斯拉手机应用上线AI聊天助手:特斯拉助手Beta版
|
7月前
|
自然语言处理 搜索推荐 算法
Python小说阅读器制作教程
Python小说阅读器制作教程
145 0
|
存储 人工智能 弹性计算
从“云+原神”到“云上星穹”,阿里云支持米哈游新游全球首发
近日,阿里云支持米哈游新作《崩坏:星穹铁道》正式上线,首发当天全网下载量突破2000万,当日登上iOS免费榜与畅销榜的总榜第一及其他多国榜首。
|
7月前
|
人工智能 JavaScript API
互联网人的福利!『昆仑天工』4款AI产品开源!提供API对接!
互联网人的福利!『昆仑天工』4款AI产品开源!提供API对接!
464 0
|
7月前
|
数据采集 自然语言处理 搜索推荐
数据清洗【Python文本数据处理】
数据清洗【Python文本数据处理】
|
7月前
|
JavaScript
undefined会变为null吗?
undefined会变为null吗?
|
7月前
uni-app实现左右滑动菜单,模拟小米手机桌面菜单应用
uni-app实现左右滑动菜单,模拟小米手机桌面菜单应用
|
人工智能 计算机视觉
【AI欣赏】将火影忍者推向新高度:StableDiffusion的神奇效果
【AI欣赏】将火影忍者推向新高度:StableDiffusion的神奇效果

热门文章

最新文章