模式识别:动物目标检测——YOLOv5开发

智能畜牧电网(目标检测部分)----开发文档

一、项目背景:

在畜牧业和养殖业发达的农村地带,经常出现狐狸和黄鼠狼这类野兽偷吃家禽,给农民的养殖生产带来困难的同时,经济上也造成了很大的损失。

应对天敌,传统的猎杀方式一来消耗人力物力,二来又会对当地的生物链、生态环境造成影响

而通过养狗养鹅等动物的方式,对天敌产生威胁,效果又微乎其微,反倒增加了成本

随着深度学习的高速发展,目标检测在各个领域广泛应用,我们是不是也能借助这种方法识别到天敌,让原本不通电的电网接上低压电,实现对天敌的驱逐;并且在没有危险的时候也不会伤害到养殖的畜禽

二、项目需求:

通过摄像机实时获取电网前的影像,当出现属于天敌的野生动物时,后台能够识别出动物的种类,让电网通上对该类动物有威胁但是无害的电压,实现驱逐。

三、项目实现:

通过调研,本项目最终使用yolov5框架下的yolov5s模型作为目标检测的模型

(一)、环境配置:

参考yolov5-master目录下的requirements.txt文件

matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.2
Pillow>=7.1.2
PyYAML>=5.3.1
requests>=2.23.0
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.41.0

(二)、数据集:

来源kaggle的Animal Faces | Kaggle,因为训练时间有限,我仅仅选取了猫、狗、狐狸的100张图片,猫的外貌与狐狸和黄鼠狼有很大的相似性测试模型对相近的动物分辨情况,而狗作为相似度较低的动物,作为普通样本

使用makesense进行标注

(三)、流程介绍:

安装anaconda,并配置好环境

准备好数据集

下载模型和代码

将数据集存放在代码目录下

data目录下为自己的数据集创建.yaml配置文件,参考coco128.yaml

修改训练的脚本,填充数据集地址,设置训练参数,迭代100次,开始训练

epochs参数表示迭代次数,resume参数表示继续上次退出训练的模型继续训练

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BiSAXPZS-1639530937481)(C:\Users\10512\AppData\Roaming\Typora\typora-user-images\image-20211110213350880.png)]

训练完成后,根目录下会产生一个run的文件夹,里面就存有训练好的模型

另取每种动物各10张进行测试,将模型的地址和测试图片的地址(data/image)填入测试的脚本,进行检测

四、检测结果与思考:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
计算得到准确率是24/30=80%、猫的召回率是100%、狗的召回率是70%、狐狸的召回率是70%

准确率没有达到很高考虑到是因为训练样本不够多,而狗和狐狸的召回率较低,观察检测的样本结果看到狗是未被检测出来,考虑是因为狗的不同品种外形差距较大,而训练集并没有包含全部狗的品种,从而导致这样的结果;而狐狸的检测结果显示其多是被误判成猫,也和最开始选择训练集的原因一样,其在外形相似度很高的情况下能达到70%的召回率结果还是比较满意的。

五、文件结构:

├── yolov5-master
│   ├── data
│   │   ├── images		//测试集地址
│   ├── runs
│   │   ├── detect		//测试的结果
│   │   ├── train		//训练过程文件和最终模型
│   ├── score
│   │   ├── images
│   │   │   ├── train	//训练集图片
│   │   │   ├── val		//验证集图片
│   │   ├──labels
│   │   │   ├── train	//训练集标签
│   │   │   ├── val		//验证集标签
│   ├── detect.py		//测试脚本
│   ├── train.py		//训练脚本
│   ├── README.md		//yolov5的介绍
│   ├── val.py			//验证脚本
│   ├── yolov5s.pt		//原始模型
└── 开发文档.pdf

六、知识体系:

(一)、网络定义:

YOLO检测网络包括24个卷积层和2个全连接层,其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。

YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。

(二)、输出定义:

YOLO将输入图像分成SxS个格子,每个格子负责检测‘落入’该格子的物体。若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。

每个格子输出B个bounding box(包含物体的矩形区域)信息,以及C个物体属于某种类别的概率信息。

Bounding box信息包含5个数据值,分别是x,y,w,h,和confidence。其中x,y是指当前格子预测得到的物体的bounding box的中心位置的坐标。w,h是bounding box的宽度和高度。注意:实际训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是bounding box中心位置相对于当前格子位置的偏移值,并且被归一化到[0,1]。confidence反映当前bounding box是否包含物体以及物体位置的准确性。

(三)、Loss函数定义:

YOLO使用均方和误差作为loss函数来优化模型参数,即网络输出的SS(B5 + C)维向量与真实图像的对应SS*(B*5 + C)维向量的均方和误差。(详见论文YOLO: Unified, Real-Time Object Detection

(四)、训练:

YOLO模型训练分为两步:

1)预训练。使用ImageNet,1000类数据训练YOLO网络的前20个卷积层+1个average池化层+1个全连接层。训练图像分辨率resize到224x224。

2)用步骤1)得到的前20个卷积层网络参数来初始化YOLO模型前20个卷积层的网络参数,然后用VOC 20类标注数据进行YOLO模型训练。为提高图像精度,在训练检测模型时,将输入图像分辨率resize到448x448。

参考:YOLO详解 - 知乎 (zhihu.com)

猜你喜欢

转载自blog.csdn.net/hu_la_quan/article/details/121944635