【NG DeepLearning视频笔记】目标检测

news/2024/7/10 3:20:36 标签: 深度学习, 目标检测, YOLO

目标检测标签

1.1 bounding box标签

要训练一个目标检测网络,必然需要准备数据集的标签。每个目标的标签向量如下所示。
y = [ p c b x b y b h b w c 1 c 2 c 3 ] (1) y =\begin{bmatrix} pc \\ bx \\ by \\ bh \\ bw \\ c1 \\ c2 \\ c3 \\ \end{bmatrix} \tag{1} y=pcbxbybhbwc1c2c3(1)

其中pc表示是否存在目标(1:存在;0:反之)。bx,by表示目标中心点坐标,bw,bh表示目标宽高。c1,c2,c3表示是否属于对应类别。

损失

L ( y ^ , y ) = ( y 1 ^ , y 1 ) 2 + ( y 2 ^ , y 2 ) 2 + . . . + ( y 4 ^ , y 4 ) 2 + . . . + ( y 8 ^ , y 8 ) 2 L(\hat{y}, y) = (\hat{y_1}, y_1)^2 + (\hat{y_2}, y_2)^2 + ... + (\hat{y_4}, y_4)^2 + ... + (\hat{y_8}, y_8)^2 L(y^,y)=(y1^,y1)2+(y2^,y2)2+...+(y4^,y4)2+...+(y8^,y8)2
y1即pc,可以使用逻辑回归计算损失

y2~y4,坐标bx, by, bh, bw的损失,可以使用平方差

y5~y8,每个类别损失,可以转换softmax

1.2 特征点检测标签

y = [ p c l 1 x l 1 y l 2 x l 2 y . . . l n x l n y ] (1) y =\begin{bmatrix} pc \\ l_1x \\ l_1y \\ l_2x \\ l_2y \\ ... \\ l_nx \\ l_ny \\ \end{bmatrix} \tag{1} y=pcl1xl1yl2xl2y...lnxlny(1)
人脸landmark为例,即是64个特征点,共有64*2+1=129维。

目标检测算法

2.1 滑动窗口检测

在这里插入图片描述
通过不同大小的window,滑动遍历整幅图片,每次滑动都将窗口内区域内送入网络中,预测是否存在目标(0/1)。

2.1.2 滑动窗口的卷积实现方式

网络FC层转换为卷积层

在这里插入图片描述
第一层FC层,使用5516的卷积,最终可以得到11400的特征图(此处卷积实际为 40055*16)

卷积实现

在这里插入图片描述
如上图,假设,输入的图片是16 * 16的3通道RGB图片,采用的滑动窗口是14 * 14,步长为2。也就是从图片中抠出了4个14 * 14的区域,分别送入到网络中,经过5 * 5的卷积核最终得到12 * 12的特征图,逐层运算,最终得到是一个2 * 2 * 4的特征向量。分别对应了四个滑动窗口的预测结果,也就实现了滑动窗口检测效果。

这种卷积的方式,相当于一次对所有的窗口划分区域继进性预测,如果将每块区域分别输入到网络中进性预测,计算次数增加,而且会有很多重叠区域的计算是重复的。所以能在很大程度上提升算法的效率。
但是,其预测的物体边界,也就是bounding-box不会很精确。

2.2 bounding box预测

YOLO_60">YOLO算法

Bounding box代表性算法就是YOLO(you only look once)。
在这里插入图片描述
和滑动窗口的方式不同,YOLO将图片分为3*3,9个网格区域,只有物体的中点所在的网格区域,才认为是有效的。如上图只有绿色和黄色的区域是有效的,其标签则如图右侧对应所示。

对每个网格应用卷积方式实现的目标定位和检测算法,最终得到输出是3 * 3 * 8的向量,即每个网格,都得到一个8维的预测结果(实际应用中可能使用19 * 19,更为精细)。

实际上,和滑动窗口一样,并不是每个区域都输入到网络中进行多次计算的,而是将整幅图像喂到卷积网络中,一次计算得到每个区域的结果,所以叫You only look once。

2.2.1 bounding box 标签编码

YOLO中,bounding box位置信息的编码方式是以物体所在区域左上角为原点(0, 0),右下角为(1, 1)。

以上图中右侧汽车为例,bounding box(bx, by, bh, bw): (0.4, 0. 3, 0.9, 0.5),即中心点位置,以及宽高在所在区域的位置比例。

其中bh,bw可能大于1,也就意味着该物体超出了所在的ROI区域。

2.2.2 Anchor Boxes

上述YOLO的只能解决一个区域只包含一个目标的情况,为了解决一个区域内包含多个目标的情况,提出了Anchor Box算法。即根据数据集中所有目标尺寸的大小,预先定义好一系列大小不同的anchor box。可以人工选取,或者使用K-Means对所有的目标框进行聚类,得到K类不同尺寸的Anchor box。一般取5~10个。
Anchor Box
假设只选取两类Anchor box,跟别对应于高瘦的人Anchor box1,和矮胖的车Anchor box2。此时每个目标除了需要分配一个中点所在的网格区域外,还需要一个IOU最大的Anchor box。此时网络的输出就是2 * 8维(n个anchor box则结果就是n*8维)。如图中中下区域,可以得到右侧中间列所示结果。如果某个网格只有一个目标,且该目标和anchor box2的IOU最大,则得到最后一列的结果。


http://www.niftyadmin.cn/n/892767.html

相关文章

MegDet 与 Synchronized BatchNorm

旷视科技(Face)的 MegDet 网络取得了 COCO 2017 Challenge 竞赛的检测项目冠军,论文 MegDet: A Large Mini-Batch Object Detector 对该检测器进行了介绍。 摘要 深度学习时代的目标检测发展——从 R-CNN、Fast/Faster R-CNN 到最近的 Mask…

C++学习——父类指针指向子类对象的问题

父类指针指向子类实例对象,对于普通重写函数时,会调用父类中的函数。而调用被子类重写虚函数时,会调用子类中的函数。 这是因为子类中被重写的虚函数的运行方式是动态绑定的,与当前指向类实例的父类指针类型无关,仅和类…

FaceNet: A Unified Embedding for Face Recognition and Clustering笔记

FaceNet 是谷歌发表在 CVPR 2015上的一篇文章。先前基于人脸识别的方法,无论是 DeepID 系列[1][2][2][3]还是 DeepFace 均采用分类的方式进行训练。尽管精度不断提升,处理过程却越来越趋向复杂。3D人脸对齐或模型融合都不便于训练的展开。 与之相反&…

Jetson NX交叉编译踩坑记录

1. 交叉编译工具链,编译出错 使用官网上指定gcc-linaro编译工具,却出现如下错误: aarch64-linux-gnu/libc/usr/include/stdio.h:47:1: error: __BEGIN_NAMESPACE_STD does not name a type; did you mean __BEGIN_DECLS?__BEGIN_NAMESPACE_…

Caffe2 Parallelize函数解析

Parallelize由前向网络构造函数打造出运行于设备上的数据并行网络。 其实现可以概括为以下几个部分: 设置前向网络构造函数在不同设备上运行;添加相应梯度算子;添加梯度同步算子;添加优化器;进行内存优化。 Paralle…

Jetson NX安装docker

Docker安装步骤 docker的安装可以参考官方的文档:https://docs.docker.com/engine/install/ubuntu/ 其中第三步的时候注意选择arm的库。 nvidia-container-toolkit安装 nvidia-container-toolkit的安装,可以直接使用apt-get。当出现packet无法解析的…

NVCaffe P2PManager

Caffe多GPU训练主要涉及4个类:P2PManager、P2PSync、Solver 和 Net。 假设使用4个GPU进行训练,模块依赖图如下图所示: 值得注意的是,每个Solver会创建线程运行Solver::Reduce。而Solver::Reduce会借由Net::ReduceAndUpdate调用Net…

ffmpeg解码出现内存泄露

原因 在用ffmpeg解码rtsp流的任务时,出现内存,泄露,每次打开流–读取一帧图片–关闭流,都会有10M的内存泄露的现象。 定位 通过将解码过程中每个步骤一个个逐渐放开,看内存的增长情况。最终确定是解码的frame出现的…