基于谷歌开源EfficientDet的电网缺陷的识别检测概述+代码复现

241 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

一、背景介绍与项目概述

针对现有的无人机电力巡检中的目标检测算法小目标识别精度低、检测的元件及缺陷类型较为单一、检测速度和精度无法同时满足的问题,所以EfficientDet 目标检测算法,该算法应用于无人机电力巡检图像的数据挖掘,对高压输电线路上的绝缘子、防震锤、均压环、屏蔽环进行目标检测及缺陷定位。

二、什么是EfficientDet 

EfficientDet是由谷歌大脑团队开源的一款对象检测模型,它利用了若干优化和主干调整,例如使用BiFPN,以及一种复合缩放方法,该方法同时均匀缩放所有主干、特征网络和盒/类预测网络的分辨率、深度和宽度。是涵盖轻量级到高精度的多个模型,COCO数据集上达到 50.9 mAP,一经推出便获得了大量关注!

三、EfficientDet 解决的痛点问题与数据增强方式

首先通过 Imgaug 数据增强库对某检修公司标准化无人机巡检数据集进行数据增强;

然后在加强特征提取网络双向特征金字塔网络(BiFPN)特征融合时融入小一级尺度的特征层,提高了小目标检测能力,对主干特征提取网络 EfficientNet 的倒残差模块进行改进,引入坐标注意力机制(CA)提高了主干特征提取效率;最后进行对比训练实验。

四、数据集设计

4.1 实验数据

原始数据集共1468 张,来源于某检修公司无人机巡检作业时拍摄的标准化照片。由于训练中,数据集的质量对训练效果和检测效率有较大的影响,现有的原始数据集数量有限,直接用于训练得出的结果难以满足电力巡检的精度要求。

因此,利用Imgaug数据增强库进行数据扩充,模拟实际巡检时拍摄模糊、噪声、天气恶劣等情况,提升训练模型抗干扰的鲁棒性,实验效果如下图所示:

编辑

4.2 数据集类别分析与拓展情况

​编辑

五、模型结构图

EfficientDet 目标检测算法由 EfficientNet 主干特征提取网络、不同层数的双向特征金字塔网络 (Bidirectional Feature Pyramid Networks, BiFPN)加强特征提取网络和先验框分类与调整网络三部分组成。

编辑

六、实验环境

6.0 实验代码

GitHub - xuannianz/EfficientDet: EfficientDet (Scalable and Efficient Object Detection) implementation in Keras and TensorflowEfficientDet (Scalable and Efficient Object Detection) implementation in Keras and Tensorflow - GitHub - xuannianz/EfficientDet: EfficientDet (Scalable and Efficient Object Detection) implementation in Keras and Tensorflow https://github.com/xuannianz/EfficientDet

实验步骤的话,就是换个数据集就行,数据集因为是实验室自己的,所有不能提供,自己找个其他的数据集也可以哦!所以参考一下就行:

6.1 训练自己的Efficientdet模型

首先前往Github下载对应的仓库,下载完后利用解压软件解压,之后用编程软件打开文件夹。
注意打开的根目录必须正确,否则相对目录不正确的情况下,代码将无法运行。

一定要注意打开后的根目录是文件存放的目录。

编辑

一、数据集的准备

使用VOC格式进行训练,训练前需要自己制作好数据集,如果没有自己的数据集,可以通过Github连接下载VOC12+07的数据集尝试下。
训练前将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中。

训练前将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中。

'''
annotation_mode用于指定该文件运行时计算的内容
annotation_mode为0代表整个标签处理过程,包括获得VOCdevkit/VOC2007/ImageSets里面的txt以及训练用的2007_train.txt、2007_val.txt
annotation_mode为1代表获得VOCdevkit/VOC2007/ImageSets里面的txt
annotation_mode为2代表获得训练用的2007_train.txt、2007_val.txt
'''
annotation_mode     = 0
'''
必须要修改,用于生成2007_train.txt、2007_val.txt的目标信息
与训练和预测所用的classes_path一致即可
如果生成的2007_train.txt里面没有目标信息
那么就是因为classes没有设定正确
仅在annotation_mode为0和2的时候有效
'''
classes_path        = 'model_data/voc_classes.txt'
'''
trainval_percent用于指定(训练集+验证集)与测试集的比例,默认情况下 (训练集+验证集):测试集 = 9:1
train_percent用于指定(训练集+验证集)中训练集与验证集的比例,默认情况下 训练集:验证集 = 9:1
仅在annotation_mode为0和1的时候有效
'''
trainval_percent    = 0.9
train_percent       = 0.9
'''
指向VOC数据集所在的文件夹
默认指向根目录下的VOC数据集
'''
VOCdevkit_path  = 'VOCdevkit'

三、开始网络训练

通过voc_annotation.py我们已经生成了2007_train.txt以及2007_val.txt,此时我们可以开始训练了。
训练的参数较多,大家可以在下载库后仔细看注释,其中最重要的部分依然是train.py里的classes_path。

classes_path用于指向检测类别所对应的txt,这个txt和voc_annotation.py里面的txt一样!训练自己的数据集必须要修改!

# 参数介绍

#----------------------------------------------------#
#   是否使用eager模式训练
#----------------------------------------------------#
eager           = False
#--------------------------------------------------------#
#   训练前一定要修改classes_path,使其对应自己的数据集
#--------------------------------------------------------#
classes_path    = 'model_data/voc_classes.txt'
#----------------------------------------------------------------------------------------------------------------------------#
#   权值文件请看README,百度网盘下载。数据的预训练权重对不同数据集是通用的,因为特征是通用的。
#   预训练权重对于99%的情况都必须要用,不用的话权值太过随机,特征提取效果不明显,网络训练的结果也不会好。
#   训练自己的数据集时提示维度不匹配正常,预测的东西都不一样了自然维度不匹配
#
#   如果想要断点续练就将model_path设置成logs文件夹下已经训练的权值文件。 
#   当model_path = ''的时候不加载整个模型的权值。
#
#   此处使用的是整个模型的权重,因此是在train.py进行加载的。
#   如果想要让模型从主干的预训练权值开始训练,则设置model_path为主干网络的权值,此时仅加载主干。
#   如果想要让模型从0开始训练,则设置model_path = '',Freeze_Train = Fasle,此时从0开始训练,且没有冻结主干的过程。
#   一般来讲,从0开始训练效果会很差,因为权值太过随机,特征提取效果不明显。
#----------------------------------------------------------------------------------------------------------------------------#
model_path    = 'model_data/efficientdet-d0-voc.h5'
#---------------------------------------------------------------------#
#   用于选择所使用的模型的版本,0-7
#---------------------------------------------------------------------#
phi             = 0
#------------------------------------------------------#
#   输入的shape大小
#------------------------------------------------------#
input_shape     = [image_sizes[phi], image_sizes[phi]]
#---------------------------------------------------------------------#
#   可用于设定先验框的大小,默认的anchors_size,大多数情况下都是通用的!
#   如果想要检测小物体,可以修改anchors_size
#   一般调小浅层先验框的大小就行了!因为浅层负责小物体检测!
#---------------------------------------------------------------------#
anchors_size    = [32, 64, 128, 256, 512]

#----------------------------------------------------#
#   训练分为两个阶段,分别是冻结阶段和解冻阶段。
#   显存不足与数据集大小无关,提示显存不足请调小batch_size。
#   受到BatchNorm层影响,batch_size最小为2,不能为1。
#----------------------------------------------------#
#----------------------------------------------------#
#   冻结阶段训练参数
#   此时模型的主干被冻结了,特征提取网络不发生改变
#   占用的显存较小,仅对网络进行微调
#----------------------------------------------------#
Init_Epoch          = 0
Freeze_Epoch        = 50
Freeze_batch_size   = 8
Freeze_lr           = 1e-3
#----------------------------------------------------#
#   解冻阶段训练参数
#   此时模型的主干不被冻结了,特征提取网络会发生改变
#   占用的显存较大,网络所有的参数都会发生改变
#----------------------------------------------------#
UnFreeze_Epoch      = 100
Unfreeze_batch_size = 4
Unfreeze_lr         = 1e-4
#------------------------------------------------------#
#   是否进行冻结训练,默认先冻结主干训练后解冻训练。
#------------------------------------------------------#
Freeze_Train        = True
#------------------------------------------------------#
#   用于设置是否使用多线程读取数据,0代表关闭多线程
#   开启后会加快数据读取速度,但是会占用更多内存
#   keras里开启多线程有些时候速度反而慢了许多
#   在IO为瓶颈的时候再开启多线程,即GPU运算速度远大于读取图片的速度。
#------------------------------------------------------#
num_workers         = 0
#----------------------------------------------------#
#   获得图片路径和标签
#----------------------------------------------------#
train_annotation_path   = '2007_train.txt'
val_annotation_path     = '2007_val.txt'

二、数据集的处理

在完成数据集的摆放之后,我们需要对数据集进行下一步的处理,目的是获得训练用的2007_train.txt以及2007_val.txt,需要用到根目录下的voc_annotation.py。

voc_annotation.py里面有一些参数需要设置。
分别是annotation_mode、classes_path、trainval_percent、train_percent、VOCdevkit_path,第一次训练可以仅修改classes_path

三、训练结果预测

训练结果预测需要用到两个文件,分别是yolo.py和predict.py。
我们首先需要去yolo.py里面修改model_path以及classes_path,这两个参数必须要修改。

model_path指向训练好的权值文件,在logs文件夹里。
classes_path指向检测类别所对应的txt。

 完成修改后就可以运行predict.py进行检测了。运行后输入图片路径即可检测。

6.2 训练损失图像

6.3 实验结果

五、结果分析

EfficientDet 算法在元件检测及缺陷定位测试集上平均均值精度达到 90.2%可以满足电力巡检中准确性的要求。