【三维目标检测】VoxelNet(三):模型详解
前两节详细介绍了VoxelNet的数据处理部分,本节主要介绍VoxelNet详细的模型结构及其损失函数。数据处理部分请参考:三维点云目标检测 — VoxelNet详解之数据处理 (二)_Coding的叶子的博客-CSDN博客。
1 代码环境部署
请参考:三维点云目标检测 — VoxelNet详解crop.py (一)_Coding的叶子的博客-CSDN博客。
另外有两处需要进行修改:
(1)config.py:第35、36行需要进行如下修改,否则会报错:TypeError: 'float' object cannot be interpreted as an integer。
x = np.linspace(xrange[0]+vw, xrange[1]-vw, W//2)
y = np.linspace(yrange[0]+vh, yrange[1]-vh, H//2)
(2)voxelnet.py:第163行需要进行如下修改,否则会报维度不匹配的错误。
dense_feature[:, coords[:,0], coords[:,1], coords[:,2], coords[:,3]]= sparse_features.transpose(0, 1)
2 voxelnet模型结构
Voxelnet的主要模型结构如下图所示:
voxelnet模型主要包含数据处理、VFW、SVFW、CML和RPN几个部分,其中数据处理已经在上一节中详细介绍过。
2.1 体素特征编码 VFW(voxel feature encoding layer)
假设输入体素的维度为NxTxK,N为含有点云的体素个数,T=35为体素中点的个数,K为体素中每个点的特征维度。
(1)首先,筛选出原始特征最大值不等于0的点,生成Nx3维度的mask,即对这些空值点不进行特征提取。
(2)对每个点的特征进行全连接(N,N1),得到NxTxN1维度特征pwf (point-wise feature)。
(3)对每个体素每个点的特征,每个特征维度保留最大值,相当于最大值池化,得到局部体素的全局特征Nx1xN1,然后将特征重复T次,维度恢复到NxTxN1特征laf(locally aggregated feature)。
(4)将pwf和laf进行拼接,相当于分别考虑各个体素中局部特征和全局特征。这一点与PointNet语义分割完全一致。拼接后体素特征的维度为NxTx2N1,即pwcf(point-wise concat feature)。
(5)将(1)中mask维度扩展成NxTx2N1后与pwcf相乘得到VFW层的最终输出。
因此,VFW的作用是对每个体素的局部特征和全局特征进行提取,并且将空值点的特征置为0。
2.2 SVFW(Stacked Voxel Feature Encoding)
VoxelNet连续用到两次VFW,合并称为SVFW(Stacked Voxel Feature Encoding)。VFW1中N=7、N1=16,则输出为Nx35x32;VFW1中N=32、N1=64,则输出为Nx35x128。输出的特征再次经过全连接(128,128)后在T方向进行最大池化,得到每个体素的特征,维度为Nx128 (vwfs)。
以上特征为含有点云的体素特征,体素个数为N。总的空间中体素个数为10x400x352,这个在数据部分已经介绍。将Nx128为特征,填充回所有体素中,没有特征的体素用0进行填充,进而得到稠密的体素特征128x10x400x352(vwfs)。
2.3 CML(Convolutional Middle Layer)
经过SVFE层后输出的特征维度为128x10x400x352,这些是每个体素的特征。相比于图像来说,这相当于每个像素的特征。CML(Convolutional Middle Layer)模块是采用3D卷积对整个体素空间进行特征提取,这一步在计算机视觉算法中是非常常规的一步。
(1)Conv3d(128, 64, 3, s=(2, 1, 1), p=(1, 1, 1)):64x5x200x512
(2)Conv3d(64, 64, 3, s=(1, 1, 1), p=(0, 1, 1)):64x3x400x352
(3)Conv3d(64, 64, 3, s=(2, 1, 1), p=(1, 1, 1)):64x2x400x352
经过CML模块后,特征维度降为64x2x400x352,深度方向上的维度降低为2,可以认为是与两种角度的anchor相对应。
2.4 RPN(Region Proposal Network)
RPN(Region Proposal Network)模块主要是用于anchor的分类和回归。这个在图像领域两阶段的目标检测算法中有详细介绍和应用,如faster RCNN。
将CML模块特征reshape成128x400x352作为RPN的输入。
(1)Block_1:Conv2d(128, 128, 3, 2, 1)、Conv2d(128, 128, 3, 1, 1)、Conv2d(128, 128, 3, 1, 1)、Conv2d(128, 128, 3, 1, 1):128x200x176 (x_skip_1)。
(2)Block_2:Conv2d(128, 128, 3, 2, 1)、Conv2d(128, 128, 3, 1, 1)、Conv2d(128, 128, 3, 1, 1)、Conv2d(128, 128, 3, 1, 1)、Conv2d(128, 128, 3, 1, 1):128x100x88 (x_skip_2)。
(3)Block_2:Conv2d(128, 256, 3, 2, 1)、Conv2d(256, 256, 3, 1, 1)、Conv2d(256, 256, 3, 1, 1)、Conv2d(256, 256, 3, 1, 1)、Conv2d(256, 256, 3, 1, 1):256x50x44 (x)。
(4)Deconv_1(256, 256, 4, 4):利用反卷积对x进行上采样,256x200x176(x_0)。
(5)Deconv_2(128, 256, 2, 2):利用反卷积对x_skip_2进行上采样,256x200x176(x_1)。
(6)Deconv_3(128, 256, 1, 1):利用反卷积对x_skip_1进行上采样,256x200x176(x_2)。
(7)将x_0、x_1、x_2拼接成768x200x352维度的新特征。
(8)Score_head:利用卷积Conv2d(768, 2, 1, 1)生成2x200x176个特征,用于对每个anchor的分类,psm(probability score map)。
(9)Reg_head:利用卷积Conv2d(768, 14, 1, 1)生成14x200x176个特征,用于对每个anchor的位置回归,rm(regression map)。
RPN模块中用了特征金字塔FPN提取了多尺度特征,并且进行融合。这个也可以改进成常见的逐层上采样,逐层融合,而不是最后一层采用1次拼接融合。
3 损失函数
损失函数计算在一个3D的数据的标注中,包含了7个参数(x, y ,z, l, w, h, θ),其中xyz代表了一个物体的中心点在雷达坐标系中的位置。lwh代表了这个物体的长宽高。θ代表了这个物体绕Z轴旋转角度(偏航角)。因此生成的anchor也包含对应的7个参数(xa, ya ,za, la, wa, ha, θa),其中xa, ya ,za表示这个anchor在雷达坐标系中的位置。la, wa, ha反应了这个anchor的长宽高。θa表示这个anchor的角度。
损失函数的输入为rm、psm、pos_equal_one(正样本mask,200x176x2)、neg_equal_one(正样本mask,200x176x2)、targets(正样本与真实值之间的偏差,200x176x14),pos_equal_one、neg_equal_one、targets的具体处理过程请参考上一节的数据处理部分。
(1)将psm维度reshape成200x176x2后利用sigmoid转换为概率,p_pos。
(2)将rm和targets维度reshape成200x176x2x7,并分别乘以pos_equal_one,这是因为仅需要对正样本进行回归,得到rm_pos和targets_pos。
(3)分别计算正负样本分类的交叉熵损失,cls_pos_loss和cls_neg_loss。
(4)根据rm_pos和target_pos计算smoothl1loss损失,reg_loss。
(5)将1.5倍cls_pos_loss和1倍cls_neg_loss之和作为总的分类置信度损失,conf_loss,对应图中的α和β。这是因为通常正样本的数量远远小于负样本数量,通过不同的权重来增加正样本损失对总损失的贡献程度。
python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_python三维点云重建从三维基础知识到深度学习,将按照以下目录持续进行更新。更新完成的部分可以在三维点云专栏中查看。https://blog.csdn.net/suiyingy/category_11740467.htmlhttps://blog.csdn.net/suiyingy/category_11740467.html1、点云格式介绍(已完成)常见点云存储方式有pcd、ply、bin、txt文件。open3d读写pcd和plhttps://blog.csdn.net/suiyingy/article/details/124017716
更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。
【三维目标检测】VoxelNet(三):模型详解相关推荐
- 【三维目标检测】Second 模型 (一)
Second算法是一种基于三维点云的目标检测算法.Second算法采用了几乎与Voxelnet三维目标检测算法完全一致的设计思路,主要差异表现在将Voxelnet CML(Convolutional ...
- 目标检测算法YOLO-V1算法详解
❝ 前面我们一起学了SSD算法的相关知识,如下: SSD目标检测算法必须知道的几个关键点 目标检测算法SSD结构详解 ❞ 今天我们学习另一系列目标检测算法YOLO(You Only Look Once ...
- 【三维目标检测】Second 模型 (二)
Second模型的基本介绍.稀疏卷积.mini kitti数据集等请参考本专栏的上一篇博文:[三维目标检测]Second 模型 (一)_Coding的叶子的博客-CSDN博客.本节将介绍模型的详细结构 ...
- 基于双目视觉的目标检测与追踪方案详解
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者 | Aimme 出品 | 焉知智能汽车 一直想通过计算机视觉的角度好好地把其在自动驾驶视觉检测 ...
- 【动手学PaddlePaddle2.0系列】目标检测理论与YOLOv4详解
对计算机而言,能够"看到"的是图像被编码之后的数字,所以它很难理解高层语义概念,比如图像或者视频帧中出现的目标是人还是物体,更无法定位目标出现在图像中哪个区域.目标检测的主要目的是 ...
- YOLOv7(目标检测)入门教程详解---环境安装
目录 一.前言 二.yolov7环境搭建 直接进入正题,环境搭建开始: Anaconda: Pycharm: cuda: cuda安装: cudnn: 三.虚拟环境安装 创建虚拟python环境: P ...
- 深度学习-目标检测YOLOV3 YOLOv4原理详解
2.YoloV3核心基础内容 2.1 网络结构可视化 Yolov3是目标检测Yolo系列非常非常经典的算法,不过很多同学拿到Yolov3或者Yolov4的cfg文件时,并不知道如何直观的可视化查看网络 ...
- 目标检测网络之SPP-net详解
SPP-net详解: 简要概述:SPP-net网络是基于R-CNN结构改进,且仅在候选区域特征提取,以及特征向量大小转化两个方面做出改进,如详细理解SPP-net请先阅读目标检测开山之作R-CNN详解 ...
- 谷歌 NAS + 目标检测:SpineNet论文详解
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:bearbee 知乎链接:https://zhuanlan.zhihu.co ...
- 【论文解读】深度学习目标检测的开山鼻祖 |R-CNN详解 | 两阶段目标检测代表
目录 前言 目标检测近年里程碑 深度学习目标检测 1 R-CNN简介 1.1 何为R-CNN? 1.2 摘要 1.2.1 论文综述 1.2.2 优点汇总 1.2.3 缺点汇总 2. RCNN网络结构解 ...
最新文章
- NetBean中的使用,比如快捷键
- 如何定期备份网站数据
- 助推曲烟数字化转型升级,开展生产业务数字化
- 布式事务实践 解决数据一致性 Spring事务机制
- 千兆交换机下面可以接多少层交换机_视频监控系统如何选择网络交换机
- GeoTools计算线与面的交点
- mysql 中文 3个字节_mysql 字节问题,中文和数字
- php 生产一维码,透过 PHP 生成 一维码
- MySQL 效能监控工具--mysqlreport -转
- BZOJ3707 圈地
- python3 flask 使用Mysql数据库
- Laravel 避免 Trying to get property of non-object 错误
- python实验题目:中文数字对照表输入一个数字,转换成中文数字。比如:1234567890 -> 壹贰叁肆伍陆柒捌玖零。
- Python编写后门程序
- 英国留学经验分享:发下呆会被拒 有特长受欢迎
- 利用Matplotlib绘制各类图表
- vuejs crc算法,16进制换算
- ImportError: cannot import name ‘evaluate‘ from ‘surprise‘解决方案
- 【STA】(1)引言
- 实操-安装esxi6.0和配置