36、利用机器学习识别菲氏叶猴:从数据到模型部署

利用机器学习识别菲氏叶猴:从数据到模型部署

1. 项目背景与目标

在生态环境监测中,准确识别入侵物种对于保护生态系统至关重要。以菲氏叶猴(Callosciurus finlaysonii)为例,它在意大利会剥去树皮,增加树木受真菌和无脊椎动物侵害的几率,对生态系统服务产生负面影响。我们的目标是构建一个机器学习图像分类模型,通过相机陷阱来识别环境中菲氏叶猴的存在。

2. 定义机器学习类别

不同的用例对应着不同的机器学习类别,具体如下表所示:
| 使用案例 | 训练数据 | 类别标签 |
| — | — | — |
| 相机陷阱 | 图像 | 目标动物、背景环境(有无其他动物均可) |
| 音频陷阱 | 麦克风数据 | 目标动物叫声、环境背景噪音、非目标动物的“其他”叫声 |
| 动物目标检测 | 带边界框的图像 | 目标动物 |
| 运动陷阱 | 加速度计、雷达或其他空间信号 | 目标动物的运动 |
| 化学陷阱 | 气体信号 | 环境背景、目标物种的化学特征 |

在本项目中,我们选择传统的相机陷阱用例,使用迁移学习技术进行图像分类,机器学习类别为“目标动物”和“背景环境(有无其他动物均可)”,简称为“未知”。

3. 数据集收集

3.1 数据集收集策略

可以采用以下策略收集数据:
- 组合公共研究数据集:将多个公共数据集中无动物的环境图像与目标捕获动物的标记图像数据集相结合。
- 利用现有大型图像数据集:如 COCO(上下文中的常见对象)。
- 利用看似不相关的数据集:如果目标入侵物种生活在葡萄牙,但该环境中目标物种的标记图像数据集不足,可以寻找其他葡萄牙物种的研究数据集,将其数据用作训练/测试数据集中的“非目标入侵物种”。

3.2 使用 Edge Impulse 平台

Edge Impulse Studio 是一个免费的基于云的平台,涵盖了整个端到端机器学习管道所需的工具和代码,包括收集和标记高质量的训练/测试数据集、使用各种数字信号处理技术提取数据的最重要特征、设计和训练机器学习模型、测试和验证模型的实际性能/准确性,以及使用易于使用的 Edge Impulse SDK 以各种库格式部署模型。

要使用该平台,需要创建一个免费的 Edge Impulse 账户。此外,还可以直接克隆公共 Edge Impulse 项目,获取原始的训练和测试数据、中间模型信息、训练后的模型结果以及所有部署选项。

3.3 选择硬件和传感器

为了使硬件选择尽可能简单、经济且易于访问,我们考虑多种设备选项:
- 对于快速简便的数据摄取和部署,可以使用 Edge Impulse WebAssembly 库和移动客户端将新数据摄取并将训练后的模型部署到手机上。
- Edge Impulse 提供了大量官方支持的平台,从 MCU 到 GPU,都有开源的预编写固件可供使用。
- 如果使用的设备未被 Edge Impulse 列为官方支持平台,需要将部署的 C++ 库和设备的驱动代码集成到应用程序代码中。

在本项目中,假设目标设备类似于 OpenMV Cam H7 Plus(带有 RGB 集成相机),但这种通用设置存在一些局限性,如相机陷阱仅在白天可靠工作、输入帧图像质量可能较低、设备电池消耗大、使用灰度图像可能导致不准确的预测等。为了提高野生动物监测模型的准确性,可以考虑以下相机附件选项和要求:
- 高质量相机
- 低质量相机
- 红外、热成像相机
- 灰度与彩色(RGB)输入
- 镜头焦距
- 输入图像像素密度

3.4 数据收集方法

使用 Edge Impulse 上传和标记数据有多种选项:
- Edge Impulse Studio 上传器 :通过网页上传器直接从计算机将各种格式的文件上传到 Edge Impulse 项目,还可以根据文件名让工作室自动标记样本。
- CLI 上传器 :从计算机的命令行终端直接将各种格式的文件上传到 Edge Impulse 项目,同样可以根据文件名自动标记样本。
- Ingestion API :编写数据收集脚本,通过网络协议将平台连接到 Edge Impulse 项目,使用所选的脚本语言设置计时器和触发器,利用 Edge Impulse 项目 API 密钥自动上传图像。
- 数据来源(云存储桶集成) :直接从云数据桶中提取数据,并在 Edge Impulse 项目中自动触发响应,这对于通过主动学习策略随时间改进模型特别有用。

3.5 从 iNaturalist 收集数据

由于大多数人可能没有大量的入侵物种图像数据集,我们可以使用 iNaturalist 平台收集数据。具体操作步骤如下:
1. 创建 iNaturalist 账户,登录 iNaturalist 导出网站。
2. 查询目标陷阱动物物种的图像,获取包含以下列的 CSV 文件:id、user_login、quality_grade、license、url、image_url。查询示例如下:

q=Callosciurus+finlaysonii&search_on=names&has%5B%5D=photos&quality_grade=any&identifications=any
  1. 查询荷兰环境中不包含菲氏叶猴(或任何动物)的“未知”物种图像,获取包含相同列的 CSV 文件。查询示例如下:
search_on=place&has[]=photos&quality_grade=any&identifications=any&iconic_taxa[]=unknown&place_id=7506
  1. 下载生成的 CSV 文件并保存到计算机。
  2. 使用以下 Python 代码下载并保存 iNaturalist 查询图像到计算机,同时将文件名与原始 iNaturalist 上传者的用户名关联起来。运行脚本两次,一次用于陷阱动物图像,另一次用于“未知”图像,并将文件保存在不同的目录中,例如 /unknown/ 和 /animal/。
import csv
from pathlib import Path
import requests

directory = Path("unknown")  # Replace directory name, "unknown" or "animal"
directory.mkdir(parents=True, exist_ok=True)

with open("observations-xxx.csv") as f:  # Replace csv filename
    reader = csv.reader(f)
    next(reader, None)  # skip header row
    for data in reader:
        # filename is constructed as id.user_login.extension
        id_, user_login, url = data[0], data[1], data[5]
        extension = Path(url).suffix
        path = directory / f"{id_}.{user_login}{extension}"
        img = requests.get(url).content
        path.write_bytes(img)

如果需要删除图像 URL 中的查询参数,可以将 Path(url).suffix 替换为 Path(url.split("?")[0]).suffix 。同时,建议将 iNaturalist 查询结果控制在 4000 条以内,可以通过更改查询设置来减少输出。

3.6 数据集局限性

尽管从 iNaturalist 获取的数据集很强大,但仍存在一些局限性:
- 当相机多次记录未标记动物的检测时,无法确定图像是代表多个移动个体还是单个个体反复进入相机视野。
- iNaturalist 倾向于收录动物特写/大尺寸的图像,这种偏差可能会降低机器学习模型在现实世界中的准确性,因为特写图像往往不包含大量的周围环境背景,导致模型期望每个动物都靠近相机镜头。

为了抵消这种偏差,可以采用“主动学习”方法,即先部署一个次优模型来捕获目标生物的新图像,将这些新图像直接存储在设备上或上传到云存储桶,确认图像中的动物位置,标记并上传到原始训练数据集,最后重新训练模型并重新部署到设备。

3.7 数据集许可和法律义务

创建 Edge Impulse 账户时,每个用户必须遵守以下使用条款、许可证和政策:
- Edge Impulse 隐私政策
- Edge Impulse 服务条款
- Edge Impulse 负责任的 AI 许可证
- Edge Impulse DMCA(数字千年版权法)政策

假设遵守上述规则和条件,创建并将模型部署到设备后,无需订阅或付费。如果数据最初是自己的,在整个边缘 AI 模型生命周期内将保留知识产权。如果使用从第三方网站(如 iNaturalist)下载的数据集,需要确保获取的数据符合再分发或商业使用的条件。对于其他数据集,要确保合法、公平和道德地获取、分发和使用数据。如果有疑问,可以联系数据集所有者或数据收集网站支持团队获取更多信息。

3.8 数据集清理

由于我们从 iNaturalist 下载的图像数据集已经根据相关机器学习类别进行了标记,在将图像上传到 Edge Impulse 项目之前,无需进行太多额外的数据集清理工作。

但是,如果有少量标记图像数据集和大量相关但未标记的图像数据集,Edge Impulse 提供了一个名为“数据探索器”的工具,可以使用预训练模型、先前训练的脉冲或预处理块对训练或测试数据集中的未标记图像进行批量标记。需要注意的是,如果尚未在数据的较小子集上训练模型,该工具将无法工作,因为现有的 ImageNet(如 MobileNetV2)没有对独特的物种名称进行预训练。此外,还可以选择两种不同类型的降维方法:t - SNE(适用于较小的数据集)和 PCA(适用于任何数据集大小)。

下面是数据收集和处理的流程图:

graph LR
    A[确定目标物种] --> B[选择数据集收集策略]
    B --> C[使用 Edge Impulse 平台]
    C --> D[选择硬件和传感器]
    D --> E[选择数据收集方法]
    E --> F[从 iNaturalist 收集数据]
    F --> G[处理数据集局限性]
    G --> H[遵守数据集许可和法律义务]
    H --> I[进行数据集清理]

通过以上步骤,我们可以完成菲氏叶猴识别项目的数据集收集和预处理工作,为后续的模型训练和部署奠定基础。

4. 模型训练与评估

4.1 模型训练准备

在将清理好的数据集上传到 Edge Impulse 项目后,就可以开始模型训练的准备工作。首先,要确保数据集的划分合理,一般将数据集分为训练集、验证集和测试集,比例通常为 70%、15%、15%。训练集用于模型学习特征,验证集用于调整模型参数和防止过拟合,测试集用于评估最终模型的性能。

4.2 选择机器学习算法

由于本项目采用图像分类的方式,可选择适合图像分类的机器学习算法,如卷积神经网络(CNN)。Edge Impulse 平台支持多种预训练的 CNN 模型,如 MobileNetV2 等,利用迁移学习技术可以在预训练模型的基础上进行微调,加快训练速度和提高模型性能。

4.3 模型训练过程

在 Edge Impulse 平台上进行模型训练的步骤如下:
1. 进入 Edge Impulse 项目界面,点击“Create impulse”创建一个新的脉冲项目。
2. 在“Add data”部分,选择之前上传并标记好的数据集。
3. 选择合适的学习块,这里选择图像分类学习块。
4. 配置模型参数,如选择预训练模型、设置训练轮数、学习率等。
5. 点击“Start training”开始训练模型。训练过程中,平台会实时显示训练进度和损失函数、准确率等指标。

4.4 模型评估指标

评估模型性能的常用指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)和 F1 值(F1 - Score)等。
- 准确率:预测正确的样本数占总样本数的比例。
- 精确率:预测为正样本中实际为正样本的比例。
- 召回率:实际为正样本中被预测为正样本的比例。
- F1 值:精确率和召回率的调和平均数,综合衡量精确率和召回率。

以下是这些指标的计算公式:
| 指标 | 公式 |
| — | — |
| 准确率 | (Accuracy=\frac{TP + TN}{TP+TN+FP+FN}) |
| 精确率 | (Precision=\frac{TP}{TP + FP}) |
| 召回率 | (Recall=\frac{TP}{TP + FN}) |
| F1 值 | (F1 - Score = 2\times\frac{Precision\times Recall}{Precision + Recall}) |

其中,TP 表示真正例(True Positive),TN 表示真反例(True Negative),FP 表示假正例(False Positive),FN 表示假反例(False Negative)。

在 Edge Impulse 平台训练完成后,会在测试集上计算这些指标,帮助我们评估模型的性能。如果模型的性能未达到预期,可以调整模型参数、增加数据集或采用主动学习的方法来改进模型。

5. 模型部署

5.1 选择部署平台

根据之前选择的硬件和传感器,结合项目需求和实际情况,选择合适的部署平台。可以选择将模型部署到移动设备(如手机)、MCU、GPU 等。
- 移动设备:使用 Edge Impulse WebAssembly 库和移动客户端,可以快速简便地将模型部署到手机上,实现实时的图像分类。
- MCU:如果对功耗和成本有严格要求,可选择将模型部署到 MCU 上。Edge Impulse 提供了官方支持的 MCU 平台,并且有开源的预编写固件。
- GPU:对于需要处理大量数据和进行复杂计算的场景,GPU 可以提供更高的计算性能,加速模型的推理过程。

5.2 部署步骤

以将模型部署到移动设备为例,具体步骤如下:
1. 在 Edge Impulse 项目界面,点击“Deploy”选项卡。
2. 选择“WebAssembly”作为部署格式。
3. 下载生成的 WebAssembly 库和相关文件。
4. 在移动应用开发环境中集成 WebAssembly 库。例如,在 Android 开发中,可以使用 Java 调用 WebAssembly 代码;在 iOS 开发中,可以使用 Swift 或 Objective - C 调用。
5. 将模型文件和相关资源文件添加到移动应用的资源目录中。
6. 在移动应用中编写代码,调用模型进行图像分类。以下是一个简单的伪代码示例:

// 加载模型
Model model = new Model("path/to/model");

// 获取图像
Image image = getImageFromCamera();

// 进行推理
Result result = model.predict(image);

// 处理结果
if (result.isTargetAnimal()) {
    // 检测到目标动物,进行相应处理
} else {
    // 未检测到目标动物
}

5.3 部署后的优化

模型部署到实际设备后,可能需要进行一些优化工作,以提高模型的性能和稳定性。例如:
- 量化模型:将模型的参数从浮点数转换为整数,减少模型的存储空间和计算量。
- 优化代码:对部署代码进行优化,提高代码的执行效率。
- 持续更新:根据实际应用中的反馈,不断更新模型和数据集,采用主动学习的方法提高模型的准确性。

6. 总结

通过以上步骤,我们完成了利用机器学习识别菲氏叶猴的整个流程,包括项目背景与目标的确定、数据集的收集与预处理、模型的训练与评估以及模型的部署与优化。具体流程总结如下:
1. 明确项目目标,确定要识别的目标物种为菲氏叶猴。
2. 定义机器学习类别,选择相机陷阱用例进行图像分类。
3. 采用多种策略收集数据集,如组合公共研究数据集、利用 iNaturalist 平台等,并处理数据集的局限性和法律义务。
4. 对数据集进行清理和划分,选择合适的机器学习算法进行模型训练和评估。
5. 根据项目需求选择部署平台,将模型部署到实际设备上,并进行后续的优化工作。

下面是整个项目流程的流程图:

graph LR
    A[项目背景与目标] --> B[定义机器学习类别]
    B --> C[数据集收集]
    C --> D[数据集预处理]
    D --> E[模型训练与评估]
    E --> F[模型部署]
    F --> G[部署后优化]

通过本项目,我们可以有效地利用机器学习技术监测环境中菲氏叶猴的存在,为生态环境监测和保护提供有力的支持。同时,这种方法也可以推广到其他物种的监测和识别中,具有广泛的应用前景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值