北京林业大学2020林业病虫数据集和YoloV3识别样例

摘要:

合集:AI案例-CV-林业
数据集:北京林业大学林业病虫数据集
数据集价值:助力林业部门早期预警和精准防治,减少经济损失。
解决方案:YoloV3神经网络、SENet分类神经网络

一、问题描述

目标检测是计算机视觉中的一个重要的应用方向,与之相关的应用也越来越多。北京林业大学开发的林业病虫数据集,设计目标为使用目标检测算法对图片中的虫子类别和位置进行识别。

二、数据集内容

训练集train文件夹中的图片文件数为1,693 个文件。验证集val文件夹中的图片文件数为245 个文件。测试集test文件夹中的图片文件数为245 个文件。

数据集图片样例:

数据结构

VOC(PASCAL VOC)格式的目标检测标注是一种常用的数据标注格式,用于训练和评估目标检测模型。

标注内容为在一张图像中,需要以最小外接矩形标记出各个目标区域的位置和类别。每个图像文件对应一个同名的XML文件,文件中标记物体框的坐标object.bndbox和类别object.name等信息。坐标表示为[x1, y1, x2, y2],分别代表物体的左上角和右下角坐标。一张图像可以标记出多个目标区域。

标注文件中的<annotation>包括:

必要字段:
file_name:图像名称。
size:图像尺寸,包括宽度、高度和深度。
object:每个物体的信息,包括名称(目标类别)、位置坐标(x_min, y_min, x_max, y_max)等。
可选字段:
pose:目标物体的姿态描述(非必须字段)。
truncated:目标物体是否被截断(非必须字段)。
occluded:目标物体是否被遮挡(非必须字段)。
difficult:目标物体是否难以识别(非必须字段)。

以图片1.jpeg对应的标注文件1.xml为例,昆虫类别分别为: leconte、boerner、linnaeus、armandi、 coleoptera。

<annotation>
<filename>1.jpeg</filename>
<source>
<database>Unknown</database>
</source>
<size>
<width>1344</width>
<height>1344</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>Leconte</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>473</xmin>
<ymin>578</ymin>
<xmax>612</xmax>
<ymax>727</ymax>
</bndbox>
</object>
<object>
<name>Boerner</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>822</xmin>
<ymin>505</ymin>
<xmax>948</xmax>
<ymax>639</ymax>
</bndbox>
</object>
<object>
<name>linnaeus</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>607</xmin>
<ymin>781</ymin>
<xmax>690</xmax>
<ymax>842</ymax>
</bndbox>
</object>
<object>
<name>armandi</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>756</xmin>
<ymin>786</ymin>
<xmax>841</xmax>
<ymax>856</ymax>
</bndbox>
</object>
<object>
<name>coleoptera</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>624</xmin>
<ymin>488</ymin>
<xmax>711</xmax>
<ymax>554</ymax>
</bndbox>
</object>
</annotation>

数据集版权许可协议

Deed – CC0 1.0 通用 – Creative Commons

三、识别样例

方案

本方案是一个标准的目标检测任务,主要对纯色器皿中的七种虫子的位置和类别进行检测。本解决方案主要包含了两个模块,分别是YoloV3的目标检测模块,以及后置的SENet分类矫正模块。两个模块直接串联,先通过YoloV3得出检测框和分类结果,然后将检测框裁剪出来使用分类网络进一步矫正分类结果,最后通过一个改进的NMS方案得到最终结果。

YOLOv3目标检测模块

YOLOv3(You Only Look Once version 3)是一种流行的目标检测算法,它能够同时进行目标检测和分类。YOLOv3的工作流程可以概括为以下几个步骤:

  1. 输入图像处理:输入图像被分成多个网格(Grid)。每个网格负责预测其中的目标。
  2. 特征提取:YOLOv3使用深度卷积神经网络(如Darknet-53)来提取图像特征。- 这些特征包含了不同层次的信息,从低级的边缘和纹理到高级的对象部分和整体结构。
  3. 预测边界框和类别:每个网格单元预测多个边界框(Bounding Boxes),每个边界框包含以下信息:中心坐标(x, y)、宽度和高度(w, h)、置信度(Confidence)表示该边界框包含目标的概率以及预测的准确性、每个边界框还预测多个类别的概率。
  4. 后处理:
  • 非极大值抑制(NMS):用于去除重叠的边界框,保留最有可能包含目标的框。
  • 置信度阈值:只保留置信度高于某个阈值的边界框。
  • 类别概率阈值:只保留属于特定类别且概率高于某个阈值的边界框。
  1. 输出结果:最终输出的是一组边界框及其对应的类别和置信度。 示例输出 YOLOv3的输出通常是一个包含多个边界框的列表,每个边界框的格式如下:
[Class1, Class2, ..., ClassN, Confidence, x, y, w, h]

其中:

  • Class1, Class2, ..., ClassN 是各个类别的概率。
  • Confidence 是该边界框包含目标的置信度。
  • x, y 是边界框中心的坐标。
  • w, h 是边界框的宽度和高度。

通过上述流程,YOLOv3能够高效地检测图像中的目标并给出相应的分类结果。

SENet分类矫正模块

SENet(Squeeze-and-Excitation Networks)是一种用于图像分类的卷积神经网络模型,通过自适应地调整每个通道的特征图权重,来增强网络对于不同特征的感知能力。在卷积神经网络中,通道(channel)是一个重要的概念。以常见的彩色图像为例,彩色图像通常有RGB三个通道,分别代表红色(Red)、绿色(Green)和蓝色(Blue)通道。每个通道可以看作是一个独立的特征平面,它们共同构成了完整的图像信息。对于输入的图像数据,在经过卷积层时,卷积核会在每个通道上分别进行卷积操作。例如,一个3×3的卷积核在处理RGB图像时,实际上是对3个通道分别进行卷积,然后将结果相加(或者以其他方式组合)得到输出特征图。当我们深入到卷积神经网络的内部,除了最初的输入图像通道,后续的卷积层也会产生多个通道的输出。这些通道可以被理解为是对图像不同特征的抽象表示。例如,在一个用于物体识别的CNN中,某些通道可能会对物体的边缘特征比较敏感,而另一些通道可能更关注物体的纹理等特征。在SENet中,通道的重要性更加凸显。SENet通过对每个通道的特征图进行操作来实现自适应地调整权重。 假设一个卷积层输出了多个通道的特征图,SENet会根据这些通道特征图的整体信息,为每个通道计算一个权重。这个权重用于重新校准每个通道的特征图,使得网络能够更加关注那些对当前任务(如分类等)更重要的通道特征,抑制那些不太重要的通道特征。例如,如果一个通道的特征图主要包含了目标物体的关键特征(比如在人脸识别中,包含了眼睛、鼻子等关键部位的特征),SENet可以通过调整权重,让这个通道的贡献更大,从而增强网络对这些关键特征的感知能力。

在该解决方案中,经过 YoloV3 目标检测模块和 SENet 分类矫正模块后,可能会产生多个检测框。这些检测框可能存在冗余的情况,即多个检测框可能都指向同一个目标物体,并且它们的分类结果可能也比较相似。 改进的 NMS 方案在这里就是用于处理这些检测框。它会根据一定的规则(可能是基于交并比、置信度等因素)来筛选出最终的结果。例如,对于同一类别的多个检测框,如果它们的交并比很高,改进的 NMS 方案可能会综合考虑它们的置信度、分类矫正后的准确性等因素,选择最合理的一个或几个检测框作为最终的检测结果,从而提高目标检测和分类的准确性。

安装

参考《安装深度学习框架PaddlePaddle》,以下为安装paddlepaddle==1.8.5的一个样例:

conda create -n paddle1-8-p3-8 python=3.8
conda activate paddle1-8-p3-8
conda install paddlepaddle==1.8.5

查看已安装的paddle==1.8.5版本信息:

conda list paddle
# packages in environment at D:\App-Data\conda3\envs\paddle1-8-p3-8:
#
# Name                   Version                   Build Channel
paddlepaddle             1.8.5                   pypi_0   pypi

其他安装

conda install numpy==1.19.5
conda install -c conda-forge opencv

为了兼容该样例中的代码,使用的paddlepaddle和numpy版本比较低。

分类

工程目录下执行

python classification/generate_cls_data.py

执行输出:

100%|███████████████████████████████████████████████████████████████████████████████████████████| 1693/1693 [02:20<00:00, 12.08it/s]
100%|█████████████████████████████████████████████████████████████████████████████████████████████| 245/245 [00:17<00:00, 13.91it/s]

输出到目录:data\insect_cls

预训练参数

YoloV3和SENet预训练参数存储到pretrain_weights下,分别形成 pretrain_weights/yolov3_resnet50vd_dcnpretrain_weights/se_resnet5和_vd 两个模型目录。

运行

相关参数都在对应的文件下,在直接运行前,可以查看相关参数,进行调整更改后运行。

训练YoloV3网络

直接运行train_yolo.py,训练时会将模型保存到 models文件夹下,如果需要在上述模型上继续训练,可以将参数中的pretrain_weights参数更改为上述训练好的参数,同时将 ignore_weights更改为空列表。根据运行环境是否支持CUDA的设置–use_cuda参数。

# 源码:train_yolo.py
args = {
...
       "use_cuda": False,  
       "_eval": True
}

# 执行
python detection/train_yolo.py

评估和测试YoloV3

评估会直接输出mAP值,测试会输出一个json文件

# 评估
python detection/eval_yolo.py
# 测试
python detection/infer_yolo.py

训练SENet分类网络

SENet(Squeeze-and-Excitation Network)是一种用于提升卷积神经网络(CNN)性能的注意力机制模块,由Momenta公司(现并入商汤科技)的研究团队在在 2017年ImageNet大规模视觉识别挑战赛(ILSVRC 2017) 中夺得 分类任务冠军,Top-5 错误率降至 2.251%,刷新了当时的记录。并在2018年的CVPR会议上发表。其核心思想是通过显式建模通道(channel)间的依赖关系,动态调整特征通道的权重,从而增强重要特征的表示能力。

相关说明跟检测网络相似,修改参数后,直接运行train_cls.py即可

python classification/train_cls.py

评估和测试SENet

说明同上,评估会直接输出准确率和损失。单独运行分类测试前,请先运行YoloV3的测试,因为此处测试会使用检测结果的json文件.

# 评估
python classification/eval_cls.py
# 测试
python classification/infer_cls.py

End-to-End检测

可以在run.py中修改相关的执行参数,然后直接运行即可,得到最终的输出文件 pred_results.json

python run.py

结果

这里展示了一下本方案在验证集和测试集中的表现效果。

YoloV3检测结果SENet分类结果后置改进NMS处理
验证集95.309197.415499.9189
测试集95.367595.586699.9810

四、参考资料

本方案使用的预训练参数均来自百度paddlepaddle模型库

YoloV3预训练:object365预训练参数

SENet预训练:ImageNet预训练参数

五、获取案例套装

文件包大小:1.74 GB

获取:农林牧副渔计算机视觉案例套装

发表评论