目标检测之YOLO系列

2023-10-26

YOLO

整体结构

在这里插入图片描述
源码

def _build_net(self):
        """build the network"""
        if self.verbose:
            print("Start to build the network ...")
        self.images = tf.placeholder(tf.float32, [None, 448, 448, 3])
        net = self._conv_layer(self.images, 1, 64, 7, 2)
        net = self._maxpool_layer(net, 1, 2, 2)
        net = self._conv_layer(net, 2, 192, 3, 1)
        net = self._maxpool_layer(net, 2, 2, 2)
        net = self._conv_layer(net, 3, 128, 1, 1)
        net = self._conv_layer(net, 4, 256, 3, 1)
        net = self._conv_layer(net, 5, 256, 1, 1)
        net = self._conv_layer(net, 6, 512, 3, 1)
        net = self._maxpool_layer(net, 6, 2, 2)
        net = self._conv_layer(net, 7, 256, 1, 1)
        net = self._conv_layer(net, 8, 512, 3, 1)
        net = self._conv_layer(net, 9, 256, 1, 1)
        net = self._conv_layer(net, 10, 512, 3, 1)
        net = self._conv_layer(net, 11, 256, 1, 1)
        net = self._conv_layer(net, 12, 512, 3, 1)
        net = self._conv_layer(net, 13, 256, 1, 1)
        net = self._conv_layer(net, 14, 512, 3, 1)
        net = self._conv_layer(net, 15, 512, 1, 1)
        net = self._conv_layer(net, 16, 1024, 3, 1)
        net = self._maxpool_layer(net, 16, 2, 2)
        net = self._conv_layer(net, 17, 512, 1, 1)
        net = self._conv_layer(net, 18, 1024, 3, 1)
        net = self._conv_layer(net, 19, 512, 1, 1)
        net = self._conv_layer(net, 20, 1024, 3, 1)
        net = self._conv_layer(net, 21, 1024, 3, 1)
        net = self._conv_layer(net, 22, 1024, 3, 2)
        net = self._conv_layer(net, 23, 1024, 3, 1)
        net = self._conv_layer(net, 24, 1024, 3, 1)
        net = self._flatten(net)
        net = self._fc_layer(net, 25, 512, activation=leak_relu)
        net = self._fc_layer(net, 26, 4096, activation=leak_relu)
        net = self._fc_layer(net, 27, self.S*self.S*(self.C+5*self.B))
        self.predicts = net

YOLO的核心思想

  • YOLO全称是you only look once。之前的目标检测算法,R-CNN等是将目标检测问题转换为region proposal+ object classification的问题来解决。相对于之前的检测算法的一个关键的思想改进是,将目标检测问题视为一个回归问题,通过一个网络实现训练和预测,极大的提升了检测速度。

实现方法

  • 直接将原始图片分割成互不重合的小方块,然后通过卷积最后生产这样大小的特征图,可以认为特征图的每个元素也是对应原始图片的一个小方块,然后用每个元素来可以预测那些中心点在该小方格内的目标,这就是Yolo算法的朴素思想。
    在这里插入图片描述

损失函数

在这里插入图片描述

训练

  • 先将网络中前20层卷积层后面加上一个平均池化层和一个全连接层在ImageNet上面1000个类别的分类数据集上进行预训练。使用的是DarkNet framework
  • 将模型转换为检测模型,在之后加入四层卷积层和两层全连接层,作为最终的检测模型。为了提高检测效果,将输入图片从224x224大小增加为448x448,在预训练的时候采用的输入图片大小是224x224
  • 使用leaky Relu,作为激活函数

预测

  • 设置置信度阈值,过滤掉置信度小于该阈值的box,保留置信度较高的预测框
  • 对留下来的预测框采用NMS算法,得到最终的预测结果。这里有两种思路,一种是区分类别分别采用NMS算法;另一种是对所有预测框同等对待。区别类别采用NMS算法理论上来说效果更好,但是很多实现都是对所有预测框同等对待,实际效果并差别不大,主要原因可能是在同一个位置出现不同类别的概率较小。

优缺点

  • 训练和预测都是end-to-end,所以YOLO算法比较简洁且速度快
  • YOLO对整个图片做卷积,在目标检测时有更大的视野,不容易对背景误判
  • 模型泛化能力强,比如可以对艺术画作进行检测
  • 虽然每个格子可以预测 B 个 bounding box,但是最终只选择只选择 IOU 最高的 bounding box 作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是 YOLO 方法的一个缺陷。这方面可以看SSD,采用的多尺度单元格。
  • 在宽高比方面泛化率底,无法定位不寻常比例的物体,定位不如proposal+classification方法准确

YOLO-V2

论文 https://arxiv.org/pdf/1612.08242.pdf
主要包含内容YOLOv2相对于YOLOv1的改进,以及在YOLOv2基础上YOLO9000的训练过程,wordtree的构建。

模型结构

在这里插入图片描述

代码

def darknet(images, n_last_channels=425):
    """Darknet19 for YOLOv2"""
    net = conv2d(images, 32, 3, 1, name="conv1")
    net = maxpool(net, name="pool1")
    net = conv2d(net, 64, 3, 1, name="conv2")
    net = maxpool(net, name="pool2")
    net = conv2d(net, 128, 3, 1, name="conv3_1")
    net = conv2d(net, 64, 1, name="conv3_2")
    net = conv2d(net, 128, 3, 1, name="conv3_3")
    net = maxpool(net, name="pool3")
    net = conv2d(net, 256, 3, 1, name="conv4_1")
    net = conv2d(net, 128, 1, name="conv4_2")
    net = conv2d(net, 256, 3, 1, name="conv4_3")
    net = maxpool(net, name="pool4")
    net = conv2d(net, 512, 3, 1, name="conv5_1")
    net = conv2d(net, 256, 1, name="conv5_2")
    net = conv2d(net, 512, 3, 1, name="conv5_3")
    net = conv2d(net, 256, 1, name="conv5_4")
    net = conv2d(net, 512, 3, 1, name="conv5_5")
    shortcut = net
    net = maxpool(net, name="pool5")
    net = conv2d(net, 1024, 3, 1, name="conv6_1")
    net = conv2d(net, 512, 1, name="conv6_2")
    net = conv2d(net, 1024, 3, 1, name="conv6_3")
    net = conv2d(net, 512, 1, name="conv6_4")
    net = conv2d(net, 1024, 3, 1, name="conv6_5")
    # ---------
    net = conv2d(net, 1024, 3, 1, name="conv7_1")
    net = conv2d(net, 1024, 3, 1, name="conv7_2")
    # shortcut
    shortcut = conv2d(shortcut, 64, 1, name="conv_shortcut")
    shortcut = reorg(shortcut, 2)
    net = tf.concat([shortcut, net], axis=-1)
    net = conv2d(net, 1024, 3, 1, name="conv8")
    # detection layer
    net = conv2d(net, n_last_channels, 1, batch_normalize=0,
                 activation=None, use_bias=True, name="conv_dec")
    return net

改进策略

YOLO模型虽然速度较快,但是相对于R-CNN,在检测定位精度上面较差。YOLOv2主要是针对检测精度上面进行了一系列的改进。
在这里插入图片描述

训练

  • 在ImageNet上面预训练模型,先采用的输入时224x224训练160个epochs;然后调整输入为448x448,finetune,10个epochs;更改Darknet-19的分类模型为检测模型,在检测数据集上进行finetune网络。
  • 为了保证最终得到的特征图维度大小为奇数,在检测模型中采用的输入图片的大小是416x416,采用总步长为32,则最终的特征图大小为13x13,这样保证了特征图正好只有一个中心位置。
  • loss函数
    在这里插入图片描述

YOLO9000

联合ImageNet的庞大的分类数据集,以及coco的检测数据集,训练得到可以检测9000+类别的YOLO9000模型。这是这篇文章中最大的贡献。主要采用的方法是采用联合两个数据集构建wordtree的方法
在COCO和ImageNet数据集上进行联合训练遇到的第一问题是两者的类别并不是完全互斥的,比如"Norfolk terrier"明显属于"dog",所以作者提出了一种层级分类方法(Hierarchical classification),主要思路是根据各个类别之间的从属关系(根据WordNet)建立一种树结构WordTree,结合COCO和ImageNet建立的WordTree如下图所示:
在这里插入图片描述

在这里插入图片描述
在训练时,如果是检测样本,按照YOLOv2的loss计算误差,而对于分类样本,只计算分类误差。在预测时,YOLOv2给出的置信度就是 Pr(physical \space object) ,同时会给出边界框位置以及一个树状概率图。在这个概率图中找到概率最高的路径,当达到某一个阈值时停止,就用当前节点表示预测的类别。通过联合训练策略,YOLO9000可以快速检测出超过9000个类别的物体,总体mAP值为19,7%。

YOLOv3

改进点

  • 引入残差模型,特征图提取模型深度从19增加到53
  • 引入特征金字塔网络结构,实现多尺度检测,YOLOv3采用3个尺度特征图:13x13,26x26,52x52

YOLOv3结构

在这里插入图片描述

与其他模型对比结果

在这里插入图片描述

在这里插入图片描述

参考:
https://arxiv.org/pdf/1506.02640.pdf
https://arxiv.org/pdf/1612.08242.pdf
https://pjreddie.com/media/files/papers/YOLOv3.pdf
https://zhuanlan.zhihu.com/p/32525231
https://blog.csdn.net/guleileo/article/details/80581858
https://zhuanlan.zhihu.com/p/35325884

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目标检测之YOLO系列 的相关文章

  • 基于YOLOv8模型的烟火目标检测系统(PyTorch+Pyside6+YOLOv8模型)

    摘要 基于YOLOv8模型的烟火目标检测系统可用于日常生活中检测与定位烟火目标 利用深度学习算法可实现图片 视频 摄像头等方式的目标检测 另外本系统还支持图片 视频等格式的结果可视化与结果导出 本系统采用YOLOv8目标检测算法训练数据集
  • import tensorflow as tf报错ModuleNotFoundError: No module named 'tensorflow'

    在安装tenserflow和keras的时候 安装完毕进行验证的时候会报错 解决方法就是需要安装tf nightly 安装完毕错误就不再报了 pip install tf nightly
  • 睿智的目标检测24——Keras搭建Mobilenet-SSD目标检测平台

    睿智的目标检测24 Keras搭建Mobilenet SSD目标检测平台 更新说明 学习前言 什么是SSD目标检测算法 源码下载 SSD实现思路 一 预测部分 1 主干网络介绍 2 从特征获取预测结果 3 预测结果的解码 4 在原图上进行绘
  • Anchor-Free目标检测模型

    FCOS Fully Convolutional One Stage Object Detection 已开源 FoveaBox Beyond Anchor based Object Detector 未开源 FCOS 摘要 我们提出了一种
  • 【目标检测】32、让你一文看懂且看全 NMS 及其变体

    文章目录 一 NMS 1 1 背景 1 2 方法 1 3 代码 1 4 不足 二 Soft NMS 2 1 背景 2 2 方法 2 3 效果 2 4 代码 2 5 不足 三 Softer NMS 3 1 背景 3 2 方法 四 IoU Ne
  • 睿智的目标检测60——Tensorflow2 Focal loss详解与在YoloV4当中的实现

    睿智的目标检测60 Tensorflow2 Focal loss详解与在YoloV4当中的实现 学习前言 什么是Focal Loss 一 控制正负样本的权重 二 控制容易分类和难分类样本的权重 三 两种权重控制方法合并 实现方式 学习前言
  • [YOLO专题-27]:YOLO V5 小目标检测遇到的问题与常见解决办法

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 YOLO专题 27 YOLO V5 小目标检测遇到的问题与常见解决办法 文火冰糖 王文兵 的博客 CSDN博客 目录 第1章 前言 第2章
  • YOLOV5加速之TensorRT篇

    之前写过一篇Android版本yolov5s的博客 最近工作搞了下TensorRT 也遇到几个坑不过最终还是实现了 做一下小小的分享 这里直接上github上大牛的连接 我的代码是在他的基础上改的 里面有很多模型的加速直接看里面的yolov
  • faster RCNN 的细节理解

    1 anchors不同的大小但是采用了ROI pooling一样的策略 都映射到3 3的卷积核上 最后通过1 1的卷积核 相当与全连接分成了18类 9个anchors的话 2 分类的时候 reshape 两次 第一次为了softmax分类
  • [人工智能-深度学习-77]:目标检测 - 常见项目、应用

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122307915 目录 前言 场景一
  • 二进制.bin文件切分、bintopng、write

    import numpy as np import cv2 import os Your file path file dep open r E data 3DHuman Detection withoutlabel 20180715 50
  • QueryDet:级联稀疏query加速高分辨率下的小目标检测

    论文 https arxiv org abs 2103 09136 代码 已开源 https github com ChenhongyiYang QueryDet PyTorch 计算机视觉研究院专栏 作者 Edison G 虽然深度学习的
  • YOLO3 -- 介绍

    YOLO介绍 YOLO官网 YOLO You Only Look Once 是目标检测模型 目标检测是计算机视觉中比较简单的任务 用来在一张图片中找到某些特定的物体 目标检测不仅要求我们识别这些物体的种类 同时要求我们标出这些物体的位置 Y
  • yolo 车辆测距+车辆识别+单目测距(双目测距)

    基于yolo目标检测算法实现的车前道路中的车辆和行人检测 并且可以估测出目标与本车之间的距离 一 视频展示 yolo车距1 订阅专栏获得源码 提供完整代码 无需看下文 二 单目测距原理 图中有一个车辆 且车辆在地面上 其接地点Q必定在地面上
  • 【DETR】3、Conditional DETR

    文章目录 一 Conditional DETR 是怎么被提出来的 二 Conditional DETR 的具体实现 2 1 框架结构 2 2 DETR 的 cross attention 和 Conditional DETR 的 cross
  • 【计算机视觉】消融实验(Ablation Study)是什么?

    文章目录 一 前言 二 定义 三 来历 四 举例说明 一 前言 我第一次见到消融实验 Ablation Study 这个概念是在论文 Faster R CNN 中 消融实验类似于我们熟悉的 控制变量法 假设在某目标检测系统中 使用了A B
  • tensorRT部署之 代码实现 onnx转engine/trt模型

    tensorRT部署之 代码实现 onnx转engine trt模型 前提已经装好显卡驱动 cuda cudnn 以及tensorRT 下面将给出Python C 两种转换方式 1 C 实现 项目属性配置好CUDA tensoeRT库 通常
  • 目标检测中的损失函数:IOU_Loss、GIOU_Loss、DIOU_Loss和CIOU_Loss

    文章目录 前言 1 IOU Loss Intersection over Union Loss 2 GIOU Loss Generalized Intersection over Union Loss 3 DIOU Loss Distanc
  • Far3D:直接干到150m,视觉3D目标检测新思路(AAAI2024)

    点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 gt gt 点击进入 自动驾驶之心 3D目标检测 技术交流群 论文作者 自动驾驶Daily 编辑 自动驾驶之心 近来在 Arxiv 读到一篇纯视觉环视感知的新工作 它延
  • 什么是概率匹配

    概率匹配是一种在信息论和统计学中常用的方法 用于将一个随机事件的概率分布与另一个概率分布进行匹配或逼近 它在数据处理 编码 压缩和模型选择等领域具有重要的应用 为我们理解和处理复杂的概率分布提供了一种有效的工具 首先 让我们来了解概率匹配的

随机推荐

  • 青龙面板及使用(拔毛助长)

    提示 码文不易 来源 学习日常 前言 简单说一下这个原理吧 就是把写好的脚本挂在面板上 让他定时运行 得有个服务器 我用的是腾讯的 搭建的问题 直接搜吧 我就不在过多说些什么了 最好有俩种设备 安卓 苹果 知识储备的话 懂点python j
  • c语言中空格算空行吗,1、程序中空格与空行使用规范

    在程序代码中 善用空格与空行 可使程序板式更加优美 空格 使用 1 在C语言的关键字 像if for while switch等 之后要留有空格 以突显出该关键字 在函数之后不要留空格 紧跟左括号 以与关键字作区别 但在函数定义的参数之间
  • NAT技术详解

    前言 我们知道现在流行的IPv4的IP地址是32位的 那说明IP地址总数是2 32次方个 但是随着互联网的发展 现在的入网设备早就超过了2 32次方个了 拿为什么我们现在的主机IP还够用呢 这里用到了NAT技术来解决 一 NAT技术概念 在
  • 如何阅读他人的程序代码(上)——技巧学习篇

    一 读懂程序代码 使心法皆为我所用 程序代码是别人写的 只有原作者才真的了解程序代码的用途及涵义 许多程序人心里都有一种不自觉的恐惧感 深怕被迫去碰触其他人所写的程序代码 但是 与其抗拒接收别人的程序代码 不如彻底了解相关的语言和惯例 当成
  • java中如何进行日期时间比较?4种方法介绍

    1 Date compareto java util Date提供了在Java中比较两个日期的经典方法compareto 1 如果两个日期相等 则返回值为0 2 如果Date在date参数之后 则返回值大于0 3 如果Date在date参数
  • Docker 应用部署

    文章目录 一 部署 MySQL 二 部署 Tomcat 三 部署 Nginx 四 部署 Redis 提示 以下是本篇文章正文内容 Docker 系列学习将会持续更新 一 部署 MySQL 搜索并拉取 mysql 镜像 docker sear
  • 最近碰到的一个关于memcpy的奇葩问题

    最近写代码 碰到一个奇葩问题 memcpy函数用起来 编译居然提示我stackoverflow 简直是对写C的码农的最大羞辱 WTF UINT8 numBuffers 0 UINT16 cpLength 0 TPM2B DIGEST buf
  • 排序和复杂度

    常见的排序方式 1 冒泡排序 时间复杂度 最好情况是 O n 最坏情况是 O n2 空间复杂度 开辟一个空间交换顺序O 1 2 快速排序 时间复杂的 最好情况是 O nlogn 最坏情况是 O n2 空间复杂度 最好的情况 每一次base值
  • 结构型模式之外观模式

    复习用 不适合初学 复习用 不适合初学 复习用 不适合初学 定义 Facade Pattern 外部与一个子系统的通信必须通过一个统一的外观对象进行 为子系统中的一组接口提供一个一致的界面 外观模式定义了一个高层接口 这个接口使得这一子系统
  • collate chinese_prc_ci_as null解说

    我们在create table时经常会碰到这样的语句 例如 password nvarchar 10 collate chinese prc ci as null 那它到底是什么意思呢 不妨看看下面 首先 collate是一个子句 可应用于
  • 计算机程序的思维逻辑 (12) - 函数调用的基本原理

    栈 上节我们介绍了函数的基本概念 在最后我们提到了一个系统异常java lang StackOverflowError 栈溢出错误 要理解这个错误 我们需要理解函数调用的实现机制 本节就从概念模型的角度谈谈它的基本原理 我们之前谈过程序执行
  • 小知识·PD充电协议

    目录 PD充电器硬件结构 pd充电协议是什么 pd协议快充什么意思 PD快充协议优势 USB PD快速充电通信原理 PD充电器硬件结构 典型的手机充电器的硬件结构 以基于Dialog方案的高通QC2 0快充协议为例 如图1所示 iW626作
  • dd命令测试linux磁盘io情况,详解三种Linux测试磁盘IO性能的方法总结

    概述 在磁盘测试中我们一般最关心的几个指标分别为 iops 每秒执行的IO次数 bw 带宽 每秒的吞吐量 lat 每次IO操作的延迟 当每次IO操作的block较小时 如512bytes 4k 8k等 测试的主要是iops 当每次IO操作的
  • [C语言]如何使用C语言创建题库,进行高效刷题?

    事情是这样的 鄙人的学校开展了一个校内的知识竞赛 赛事主办方提供给了我们一个题库进行练习 但是是Word版本的 题目量不多 单选题 也就 140多道题目 当然 我们完全可以对着那个枯燥无味的Word文档进行死记硬背 但是 身为一名计算机专业
  • python - 例题分析:工时与工资

    工时在120到180 工资80 工时 工时超过180 超过部分奖励20 工时不足120 扣10 t int input 输入工时 1退出 while t 1 if t gt 120 and t lt 180
  • 3 关于QT中的MainWindow窗口,MenuBar ToolBar QuickTip等方面的知识点

    首先给大家分享一个巨牛巨牛的人工智能教程 是我无意中发现的 教程不仅零基础 通俗易懂 而且非常风趣幽默 还时不时有内涵段子 像看小说一样 哈哈 我正在学习中 觉得太牛了 所以分享给大家 点这里可以跳转到教程 1新建一个空Qt项目 编写12M
  • TP框架中, _initialize函数使用return 语句无法返回相应内容,同时也无法终止脚本继续执行

    tp框架中 initialize函数使用return 语句无法返回相应内容 同时也无法终止脚本继续执行 在 initialize中如果想要返回值 需要 使用echo 如 echo json encode code gt 0 msg gt 请
  • synchronized对于加锁代码块、方法以及全局(static)锁的详细对比

    在网上看了许多关于synchronized的介绍及用法区别 大多大同小异 点到为止 个人推荐一篇博友写的 网址如下 http blog csdn net cs408 article details 48930803 这篇博客是介绍对象锁和类
  • LeetCode--标签:数组31.下一个排列

    LeetCode 31 下一个排列 做题笔记 题目描述 解题思路 代码 java 题目描述 实现获取下一个排列的函数 算法需要将给定数字序列重新排列成字典序中下一个更大的排列 如果不存在下一个更大的排列 则将数字重新排列成最小的排列 即升序
  • 目标检测之YOLO系列

    文章目录 YOLO 整体结构 YOLO的核心思想 实现方法 损失函数 训练 预测 优缺点 YOLO V2 模型结构 改进策略 训练 YOLO9000 YOLOv3 改进点 YOLOv3结构 与其他模型对比结果 YOLO 整体结构 源码 de