Carla学习
Carla的基本架构
Carla是一款开源的自动驾驶仿真器,它基本可以用来帮助训练自动驾驶的所有模块,包括感知系统,Localization,
规划系统等等。
Client-Server的交互形式
如下图所示,Carla主要分为Server与Client两个模块,Server端用来建立这个仿真世界,而Client端则是由用户控制,用来调整、变化这个仿真世界。
Server:
Server端负责任何与仿真本身相关的事情:从3D渲染汽车、街道、建筑,传感器模型的构建,到物理计算等等。它就像一个造物主,
将整个世界建造出来,并且根据Client
的外来指令更新这个世界。它本身是基于UnrealEnigne做出的3D渲染(很多游戏都是使用这个强大的引擎做的哦)。
Client:
如果server构造了整个世界,那么这个世界不同时刻到底该如何运转(比如天气是什么样,有多少辆车在跑,速度是多少)则是由Client端控制的。用户通过书写Python脚本(最新版本C++
也可以)来向Server端输送指令指导世界的变化,Server根据用户的指令去执行。(可以理解为Client端耍耍嘴皮子下个指令, ...
embedding
Input Embedding
前言
本文将针对 Transformer
关于输入部分的操作进行解析与总结,会结合代码来讲,只有结合了代码才比较“务实”,不然我总感觉很空洞、不踏实。
One-Hot Encoding
在 CV 中,我们通常将输入图片转换为4维(batch, channel, height,
weight)张量来表示;而在 NLP 中,可以将输入单词用
One-Hot
形式编码成序列向量。向量长度是预定义的词汇表中拥有的单词量,向量在这一维中的值只有一个位置是1,其余都是0,1对应的位置就是词汇表中表示这个单词的地方。
例如词汇表中有5个词,第3个词表示“你好”这个词,那么该词对应的 one-hot
编码即为
00100(第3个位置为1,其余为0)
代码实现起来也比较简单:
Word Embedding
One-Hot
的形式看上去很简洁,也挺美,但劣势在于它很稀疏,而且还可能很长。比如词汇表如果有
10k 个词,那么一个词向量的长度就需要达到
10k,而其中却仅有一个位置是1,其余全是0,太“浪费”!
更重要的是,这种方式无法体现出词与词之间的关系。比如
“爱” ...
Petr_3D坐标生成
Petr_3D坐标生成
1.DGSN的视锥空间离散化及其转换
为了学习3D空间中的3D卷积特征,先通过将PSV变换到3D空间来建立3DGV。
PSV的坐标由(u,v,d)表示,其中(u,v)为像素坐标,d是深度,将其所在空间称为grid
camera frustum
space。深度坐标d按照预定的3D网络间距vd(深度单位)进行均匀采样,串联的信息能够使网络学习用来目标识别的语义特征
3D Geometric Volume:
使用已知的相机内参,利用反向3D投影,在计算匹配损失前,将PSV最后的特征图从相机空间(u,v,d)到3D空间(x,y,z):
fx,fy为水平和垂直的焦距长度。
下图展示了转化过程,当物体识别在3D空间被学习,在相机frustum中施加了像素相关性约束(红虚线),在这两个表达中明显不同:
图3:volume变换:图像被成像平面采集(红实线),PSV在左侧camera
frustum中将图像以等深度(蓝色虚线)投影,如世界空间(左图)和camera
frustum
space(中间)。相机空间中,车是失真的,由K的逆矩阵进行转换后,PSV被转换到3DGV,重 ...
FPN
FPN介绍
FPN网络可以说是一个非常经典的组件,twostage网络中一般都会加上去,能够有效的提升对小目标的检测能力,cascade_rcnn/faster_rcnn+big
backbone+fpn+dcn的经典组合经久不衰。
这篇博客就结合mmdetection的fpn模块来简单介绍一下FPN网络:
这个是目标检测常用结构,输入一张图像,经过backbone提取特征,最后输出一张featuremap,以fasterrcnn举例,featuremap直接输入rpn得到proposals,proposals在featuremap上提取proposal
feature然后进行box的分类和位置的回归。
为了增加多尺度能力,在上面结构上有很多变种,第一个就是下图的特征图像金字塔(Featurized
image pyramid ),每一层做预测,缺点是计算量太大。
本文提出的FPN:
接下来我会从mmdetection的fpn模块实现具体介绍:
注意在mmdection的backbone中,输出是一个list,list里面是每个block的结果。这样的好处是方便FPN计算
接 ...
pytorch_nn_module__call__
PyTorch中nn.Module类中__call__方法介绍
在PyTorch源码的torch/nn/modules/module.py文件中,有一条__call__语句和一条forward语句,如下:
__call__ : Callable[…, Any] = _call_impl
forward: Callable[…, Any] = _forward_unimplemented
在PyTorch中nn.Module类是所有神经网络模块的基类,你的网络也应该继承这个类,需要重载__init__和forward函数。以下是仿照PyTorch中Module和AlexNet类实现写的假的实现的测试代码:
from typing import Callable, Any, List
def _forward_unimplemented(self, *input: Any) -> None:
"Should be overridden by all subclasses"
print("_forward_unimplemented&q ...
MMD-PETR_train-detector导图
MD-PETR_train-detector导图
MMDataParallel
mmdetection:MMDataParallel
1.前言
mmdetection为了利用多GPU,在mmcv中实现了MMDataParallel和MMDistributedDataParallel。有没有发现这两者的命名和pytorch中的DataParallel和DistributedDataParallel命名方式很相似。没错,mmcv中的dataparallel就是继承了pytorch中的dataparallel。
下面简单讲一下,DataParallel和DistributedDataParallel两者的区别,DataParallel实现的是单进程多线程,DistributedDataParallel实现的是多进程。总而言之,DistributedDataParallel实现了真正的分布式并发计算,很好地利用多进程,并且GPU间通信开销更小。关于他们的详细区别,可见PyTorch 源码解读之 DP
& DDP。写的非常详细,好文要顶。
对于计算密集任务,python的多进程要比多线程更好,熟悉python并发编程,肯定听说过python的GIL锁机制,导致多线程 ...
MMD3D模型训练测试群流程解析
MMD3D模型训练测试全流程解析
[TOC]
训练与验证流程
在训练开始之前,我们需要编写配置文件。MMClassification 在
configs
文件夹中提供了各种模型常用的样例配置文件,可以直接使用或是稍作修改以用于自己的任务。
完成配置文件的编写之后,我们就可以使用入口脚本
tools/train.py
进行训练和验证。该脚本会进行数据集、模型相关的初始化,并调用高阶 API
train_model
来搭建执行器(Runner),模型的训练和验证步骤均由执行器进行调度。
更完整的配置文件教程可见:https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html
这里我们仅以 MMClassification
为基准,介绍从训练入口开始,我们是如何让模型训练起来的,避免大家在
OpenMMLab 架构中迷路,那么让我们出发~
第一站
tools/train.py
正如上文所说,这里是训练和验证的入口脚本。它主要执行的工作是解析命令行参数、环境信息,把这些信息动态更新到配置文件中,做一些诸如打印 ...
PETR代码详解
PETR 代码详解
小记
看了很久的PETR源代码,后续磕盐工作以此文章为基础在上面更改,期望能顺利毕业。
本来很早就想边看边记录,但是一直以为博客的源文件没有迁移到主力本上,突然才发现上一篇4090时都迁过来了,感觉自己最近有些不在状态了,还是得开启学习记录,保持状态。
整体的代码流程
配置文件
使用了mmdet框架的代码结构,这里从头到尾把配置文件部分讲清楚,其中一些细节会同步放出定义源码讲解。
使用 petr_r50dcn_gridmask_p4.py
做解释。首先是配置加载和预先定义。
_base_ = [
'../../../mmdetection3d/configs/_base_/datasets/nus-3d.py',
'../../../mmdetection3d/configs/_base_/default_runtime.py'
]
# 这里引用了nus-3d的nuscenes数据集,所以包含了在mm3d中的配置,default_runtime是基本的runtime设置。
backbone_norm_cfg = di ...
Hook食用指南
Hook 是什么
Hook 介绍
钩子编程(hooking),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。--维基百科
在训练过程中,通常有十个关键位点,如下图所示,从训练开始到结束,所有关键位点已用红色标出,共有
10
个。我们可以在这十个位点插入各种逻辑,例如加载模型权重、保存模型权重。而我们将同一类型的逻辑组织成一个
Hook。因此,MMCV 中 Hook
的作用就是训练和验证模型时,在不改变其他代码的前提下,灵活地在不同位点插入定制化的逻辑。
而控制整个训练过程的抽象在 MMCV 中被设计为 Runner,它的主要行为就是执行上图蓝色的工作流,MMCV
提供了两种类型的 Runner,一种是以 epoch 为单位迭代的 EpochBasedRunner,另一种是以
iteration 为单位迭代的 IterBasedRunner。下面给出
EpochBasedRunner 和 IterBasedRunne ...