# 鸟类目标检测 **Repository Path**: one_admin/bird-target-detection ## Basic Information - **Project Name**: 鸟类目标检测 - **Description**: 基于YOLOv3的鸟类目标检测实践 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 13 - **Forks**: 2 - **Created**: 2022-04-03 - **Last Updated**: 2024-09-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: 基于YOLO算法的目标检测 ## README # 鸟类目标检测 ## 1、介绍 鸟类目标检测实践 ## 2、软件架构 anaconda keras YOLOv3算法 ## 3、文件结构说明 在 **ImageSets/Main** 下都先建立一个对应类别的鸟类的文件,再在该文件内部生成> "train.txt"、> "trainval.txt"、> "val.txt"、> "test.txt",有利于项目同时实现单目标检测和多目标检测,让项目结构更加清晰。 ## 4、使用说明 1. VOC数据制作(本项目已经制作好鸟类目标识别的VOC数据。) 2. annotation标签生成> "train.txt"和> "test.txt"文件用于训练和测试。 3. 预训练权重文件下载: 百度网盘》》链接:https://pan.baidu.com/s/1iiLsC6Vf-u3JGl7pMurIEw 提取码:qlhv 4. 源码下载:提供百度网盘下载链接:https://pan.baidu.com/s/1QNKw4yGdClGfqTfgOa1R3g 提取码:ka11 ## 5、YOLOv3算法介绍 ### 5.1 什么是YOLO? YOLO即“You Only Look Once”, 是目标检测算法的一种,是采用一步算法实现目标检测的算法,比较两部算法的速度上更快。YOLO一直以速度快而见长。 识别精度比目前优秀的mask rcnn相比还有差距,但是如果在消费级的GPU上实现实时的目标检测的话,mask RCNN还是不能实现实时的效果。而采用YOLO,尤其是YOLO3,在不牺牲太多精度的情景下,非常轻松实现实时的检测效果。 ![输入图片说明](image3.png) ### 5.2 YOLO网络结构 YOLO的主干网络结构是Darknet-53网络,YOLO预测支路采用的都是全卷积的结构。 ![输入图片说明](image.png) 1. 网络中的DBL是YOLOv3的基本组件。Darknet的卷积层后面连接Batch-Normalization(BN)和Leaky-ReLU,因此这三个基本操作共同组成了DBL单元。 2. 主干网络中使用了5个res_n(n代表数字)结构。有res1、res2、...、res8等等,表示这个res_block中包含有n个res_unit,这是YOLOv3的大组件。YOLOv3借鉴了ResNet的残差结构,使用这种结构可以让网络结构更深。对于res_block的单位构成上,其基本组件也是DBL。 3. 在预测支路上有张量拼接(concat)操作。其实现方法是将darknet中间层和中间层后某一层的上采样进行拼接。值得注意的是,张量拼接和Res_unit结构的add的操作是不一样的,张量拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。 4. 从代码层面来整体分析,Yolo_body一共有252层。23个Res_unit对应23个add层。BN层和LeakyReLU层数量都是72层,在网络结构中的表现为:每一层BN后面都会接一层LeakyReLU。上采样和张量拼接操作各2个,5个零填充对应5个res_block。卷积层一共有75层,其中有72层后面都会接BatchNormalization和LeakyReLU构成的DBL。三个不同尺度的输出对应三个卷积层,最后的卷积层的卷积核个数是255,是针对COCO数据集的80类:3×(80+4+1)=255,3表示一个grid cell包含3个bounding box,4表示框的4个坐标信息,1表示置信度。 ### 5.3 DarkNet-53特征提取网络 Yolo v3中使用了一个53层的卷积网络,这个网络由残差单元叠加而成。Joseph Redmon的实验表明,在分类准确度上与效率的平衡上,Darknet-53模型比ResNet-101、 ResNet-152和Darknet-19表现得更好。Yolo v3并没有那么追求速度,而是在保证实时性(fps>60)的基础上追求performance。 一方面,Darknet-53网络采用全卷积结构,Yolo v3前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的。卷积的步长为2,每次经过卷积之后,图像边长缩小一半。如下图2中所示,Darknet-53中有5次卷积的步长为2。经过5次缩小,特征图缩小为原输入尺寸的1/32。所以网络输入图片的尺寸为32的倍数,取为416×416。Yolo v2中对于前向过程中张量尺寸变换,都是通过最大池化来进行,一共有5次。而v3是通过卷积核增大步长来进行,也是5次。另一方面,Darknet-53网络引入了residual结构。Yolo v2中还是类似VGG那样直筒型的网络结构,层数太多训起来会有梯度问题,所以Darknet-19也就19层。得益于ResNet的residual结构,训练深层网络的难度大大减小。因此Darknet-53网络做到53层,精度提升比较明显。 ![输入图片说明](image1.png) ### 5.4 边界框的预测 Yolo v3关于bounding box的初始尺寸还是采用Yolo v2 v2中的k-means聚类的方式来做,这种先验知识对于bounding box的初始化帮助还是很大的,毕竟过多的bounding box虽然对于效果来说有保障,但是对于算法速度影响还是比较大的。Yolo v3使用逻辑回归预测每个边界框的分数。如果边界框与真实框的重叠度比之前的任何其他边界框都要好,则该值应该为1。如果边界框不是最好的,但确实与真实对象的重叠超过某个阈值(Yolo v3中这里设定的阈值是0.5),那么就忽略这次预测。Yolo v3只为每个真实对象分配一个边界框,如果边界框与真实对象不吻合,则不会产生坐标或类别预测损失,只会产生物体预测损失。 ![输入图片说明](image4.png) ### 5.5 类别预测 类别预测方面主要是将原来的单标签分类改进为多标签分类,因此网络结构上就将原来用于单标签多分类的softmax层换成用于多标签多分类的Logistic分类器。Yolo v2网络中的Softmax分类器,认为一个目标只属于一个类别,通过输出Score大小,使得每个框分配到Score最大的一个类别。但在一些复杂场景下,一个目标可能属于多个类(有重叠的类别标签),因此Yolo v3用多个独立的Logistic分类器替代Softmax层解决多标签分类问题,且准确率不会下降。举例说明,原来分类网络中的softmax层都是假设一张图像或一个object只属于一个类别,但是在一些复杂场景下,一个object可能属于多个类,比如你的类别中有woman和person这两个类,那么如果一张图像中有一个woman,那么你检测的结果中类别标签就要同时有woman和person两个类,这就是多标签分类,需要用Logistic分类器来对每个类别做二分类。Logistic分类器主要用到sigmoid函数,该函数可以将输入约束在0到1的范围内,因此当一张图像经过特征提取后的某一类输出经过sigmoid函数约束后如果大于0.5,就表示该边界框负责的目标属于该类。 ### 5.6 多尺度预测 Yolo v3采用多个scale融合的方式做预测。原来的Yolo v2有一个层叫:passthrough layer,该层作用是为了加强Yolo算法对小目标检测的精确度。这个思想在Yolo v3中得到了进一步加强,在Yolo v3中采用类似FPN(feature pyramid networks)的upsample和融合做法(最后融合了3个scale,其他两个scale的大小分别是26×26和52×52),在多个scale的feature map上做检测,越精细的grid cell就可以检测出越精细的物体。对于小目标的检测效果提升明显。 ### 5.7 损失函数 对掌握Yolo来讲,loss function不可谓不重要。在Yolo v3的论文里没有明确提出所用的损失函数,确切地说,Yolo系列论文里面只有Yolo v1明确提了损失函数的公式。在Yolo v1中使用了一种叫sum-square error的损失计算方法,只是简单的差方相加。keras框架描述的Yolo v3 的loss function代码,在附录yolo3.model。忽略恒定系数不看,可以从上述代码看出:除了w, h的损失函数依然采用总方误差之外,其他部分的损失函数用的是二值交叉熵。最后加到一起。 ## 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request ## 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)