ChauffeurNet: Learning to Drive by Imitating the Best and Synthesizing the Worst

  • 1 简介
    • 关键点
    • 一些相关背景
  • 3 模型架构
    • 3.1 输入输出表示
    • 3.2 模型设计
  • 3.3 系统架构
  • 4 模仿Expert
    • 4.1 模仿损失
      • 4.1.1 Agent 位置方向和Box预测
      • 4.1.2 agent 元预测
    • 4.2 Past Motion Dropout
  • 5 纯模仿学习之外
    • 5.1 合成扰动
    • 5.2 模仿损失之外
      • 5.2.1 碰撞损失
      • 5.2.2 路径损失
      • 5.2.3 几何损失
      • 5.2.4 辅助损失
    • 5.3 模仿dropout
  • 6 实验
    • 6.1 数据
    • 6.2 模型
    • 6.3 闭环提升
      • 6.3.1 消融实验
      • 6.3.2 输入消融测试
      • 6.3.3 日志数据模拟驾驶
      • 6.3.4 真实世界驾驶
    • 6.4 开环评估
    • 6.5 失败模型
    • 6.6 采样速度剖面
  • 7 讨论

Bansal, Mayank, Alex Krizhevsky, and Abhijit Ogale. “Chauffeurnet: Learning to drive by imitating the best and synthesizing the worst.” arXiv preprint arXiv:1812.03079 (2018).

1 简介

Alphabet旗下的自驾车子公司Waymo18年公开训练自驾车的研究成果,透过大量的真人驾驶数据,建立神经网络模型,不只学习正常情况的驾驶数据,Waymo还合成其他状况的数据,让模型学习如何应对行车中的干扰,该模型不但能够在充满挑战的模拟环境下正常驾驶,还能在封闭的真实环境中,驾驶真的车辆。

简单一句话来说,本文的工作可以总结如下:
先用一个前端感知系统对原始数据输入(原始雷达等)进行处理产生可处理(合成扰动)的中间数据输入(对于网络而言),然后提出了一个ChauffeurNet(RNN)来增强损失对车辆未来位置进行预测,输出车辆轨迹。

关键点

  • BEV:通过感知得到的信息作为输入,预测车辆未来的位置进行规划;
  • 增强损失:用额外的损失惩罚不理想事件和奖励进步去增强模仿损失;
  • 数据集:3千万的真实expert驾驶例子等同于连续60天的连续驾驶;
  • 前端感知:Waymo使用了一个前端感知来处理原始数据信息,然后产生end2end的输入信息;
  • ChauffeurNet:司机网络,RNN,输出车辆轨迹,然后转化为转向和加速度;
  • 增强数据:在中层表示上通过合成人工扰动和车辆轨迹,在闭环测试中积累错误案例来改变训练分布。

一些相关背景

  • 模仿学习是当时自动驾驶领域内较为主流且认为可行的方法;
  • End2End的概念方法在行业内并没有一个统一的定义,换句话说就是你可以定义自己的end2end;基本的思路都是通过image来产生车辆的控制信息;
  • 较小的数据集一般来说是不满足于纯模仿学习的,例如,需要考虑到车辆大部分时间保持直行,纠正车辆的行为偏好等;
  • 作者也在文章中提到了对存在高度交互的场景中强化学习可能会很重要,也将他们的工作定义在纯离线数据和无强化这两个标签上。

3 模型架构

3.1 输入输出表示


模型的输入由几个大小为W×H像素的图像组成,呈现在这个自顶向下的坐标系中。

  • (a)路线图:一种彩色(3通道)图像,显示各种地图特征,如车道、停车标志、人行横道、限制等。
  • (b)交通灯:一种灰度图像的时间序列,其中序列的每一帧表示过去每一步的交通灯的已知状态。 在每个框架内,用一个灰色的水平为每个车道中心着色,红色灯的最亮的水平,黄色灯的中间灰色水平,绿色或未知灯的暗水平;

对路线图和交通灯通道使用索引表示来减少输入通道的数量,并允许输入表示的可扩展性来表示更多的路线图特征或更多的交通灯状态,而不改变模型体系结构。

  • (c)限速:按已知限速比例着色的车道中心的单通道图像;
  • (d)路径:希望沿着的预定路径,由路径器生成(想想谷歌地图风格的路径);
  • (e)Current Agent Box: 这显示了agent车辆在当前时间 t=0t=0t=0 时的完整包围框。
  • (f)Dynamic Boxes :显示所有潜在动态对象(车辆、骑自行车者、行人)作为定向框呈现的图像的时间序列。
  • (g)Past Agent Poses :agent的过去姿态被渲染成一个单一的灰度图像作为点的线索。

以一种固定时间 δtδtδt采样的方法 采样任何过去或未来的时间信息,比如交通灯状态和动态目标状态;交通灯和动态目标在过去 TsceneT_{scene}Tscene​ 被采样,过去的 agent 姿态被采样在一个潜在的更长的间隔时间的TposeT_{pose}Tpose​秒。

  • (h)Future Agent Poses:当前姿态p0p_0p0​是输入的已知部分,然后 ChauffeurNet 执行N次迭代并输出未来轨迹 {pδt,p2δt,...,pNδtp_{δt}, p_{2δt}, ... , p_{Nδt}pδt​,p2δt​,...,pNδt​} 以及其他属性,如未来速度。
    pt+δt=ChauffeurNet(I,pt)\mathbf{p}_{t+δt} = ChauffeurNet(I, \mathbf{p}_t) pt+δt​=ChauffeurNet(I,pt​)
    这个轨迹可以被输入到一个控制优化器,该优化器在被驱动车辆的动力学所施加的特定约束范围内计算详细的驾驶控制(例如转向和制动命令)。

3.2 模型设计

  • part(a):由一个卷积特征网络组成(FeatureNet)利用输入数据生成一个可在各网络间共享的 digested contextual 特征表示;这些特征将提供给一个循环 agent 网络(agentRNN)迭代预测驾驶轨迹上的可行点,同时预测车辆 bounding box 每个时间步长上的空间热力图;
  • part(b):两个网络用同样的特征表示作为输入进行共同训练,Road Mask Network预测视野内的可行驶区域,循环感知网络(PerceptionRNN)迭代预测每次时间步长的其他车辆的空间热度图;
  • part(c):训练过程中的各种损失值。

图三更详细地说明了 ChauffeerNet 模型。 图1中渲染过的输入通过跳过链接的方式被馈送到 large-receptive field convolutional FeatureNet,这个网络输出捕获环境上下文和意图的特征 FFF。 这些特征被馈送给 AgentRNNAgentRNN 预测驾驶轨迹上的下一个点PKP_KPK​,Agent bounding box 热力图 BkB_kBk​,条件是来自FeatureNet的特征F、迭代次数k∈{1、…、N}、AgentRNN过去预测的Memory Mk−1M_{k-1}Mk−1​和在上一次迭代中预测的Agent bounding box 热力图 B_{k-1}。

pk,Bk=AgentRNN(k,F,Mk−1,Bk−1)p_k, B_k = AgentRNN(k, F, M_{k-1}, B_{k-1}) pk​,Bk​=AgentRNN(k,F,Mk−1​,Bk−1​)

MkM_kMk​是单通道图像上的可加性Memory。 在AgentRNN迭代k时,在AgentRNN预测的位置PK处,Memory增加1,然后将该Memory馈送到下一次迭代。 AgentRNN在agent的下一个姿态上输出一个热力图图像,使用arg-max操作从这个热图中获得粗姿态预测 pk\mathbf{p}_kpk​。 AgentRNN然后使用一个浅卷积元预测网络与一个完全连接的层,预测一个亚像素细化的姿态 δpkδ\mathbf{p}_kδpk​并估计航向 θkθ_kθk​和速度 sks_ksk​。 AgentRNN是在训练时间展开的,用于固定数量的迭代,下面描述的损失在未滚动迭代中被求和。 这是可能的,因为非传统的RNN设计,使用一个显式制作的Memory模型。

3.3 系统架构

图 4展示了自动驾驶系统中如何使用神经网络的系统级别概述。

在每一次,agent和环境的更新状态都是通过一个感知系统来获得的,该感知系统处理来自现实世界或模拟环境的感官输出。

预期的路径是从路径器获得的,并且是动态更新的,这取决于agent是否能够执行过去的意图。 环境信息被呈现到如图1描述的输入图像中, 并给到RNN输出未来轨迹。 这被输入到一个控制优化器,该优化器输出驱动车辆的低电平控制信号(在现实世界或模拟中)。

4 模仿Expert

4.1 模仿损失

4.1.1 Agent 位置方向和Box预测

AgentRNN 在k次迭代中每次输出3个值:

  • 概率分布 pk(x,y)\mathbf{p}_k(x,y)pk​(x,y) 在空间Softmax之后获得的预测路径点的空间坐标;
  • agent预测box Bk(x,y)B_k(x,y)Bk​(x,y)的热力图;
  • 回归box方向θkθ_kθk​。

Lp=H(Pk,Pkgt)L_p = H(P_k,P_k^{gt}) Lp​=H(Pk​,Pkgt​)

LB=1WH∑x∑yH(Bk(x,y),Bkgt(x,y))L_B = \frac{1}{WH}\sum_{x}\sum_{y}H(B_k(x,y),B_k^{gt}(x,y)) LB​=WH1​x∑​y∑​H(Bk​(x,y),Bkgt​(x,y))

Lθ=∣∣θk−θkgt∣∣1L_θ = ||θ_k-θ_k^{gt}||_1 Lθ​=∣∣θk​−θkgt​∣∣1​

其中上标 gtgtgt 表示相应的地面真值,H(a,b)H(a,b)H(a,b) 是交叉熵函数。 请注意,pkgt\mathbf{p}_k^{gt}pkgt​ 是一个二进制图像,只有在地面真相目标坐标⌊pkgt⌋\left \lfloor \mathbf{p}_k^{gt}\right \rfloor⌊pkgt​⌋处的像素设置为一个。

4.1.2 agent 元预测

元预测网络对特征进行回归以生成粗路点预测的 sub-pixel 细化 δpkδp_kδpk​以及每次迭代时的速度估计为sks_ksk​。
Lp−subpixel=∣∣δpk−δpkgt∣∣1L_{p-subpixel}=||δ\mathbf{p}_k-δ\mathbf{p}_k^{gt}||_1 Lp−subpixel​=∣∣δpk​−δpkgt​∣∣1​

Lspeed=∣∣sk−skgt∣∣1L_{speed} = ||s_k-s_k^{gt}||_1 Lspeed​=∣∣sk​−skgt​∣∣1​

δpk=pkgt−⌊pkgt⌋δ\mathbf{p}_k =\mathbf{p}_k^gt-\left \lfloor \mathbf{p}_k^{gt}\right \rfloorδpk​=pkg​t−⌊pkgt​⌋ 的分数部分。

4.2 Past Motion Dropout

在训练中,由于过去运动的历史信息是由模型给出的,并且是由专家演示。那么网路就学会了以过去的行为去推断结果,而不是根据行为的根本原因去推断结果。在闭环推断中这种推断就会崩溃,因为过去的历史信息由网络过去的预测给出。

举例说明就是,这种经过训练的网络可以学习仅在停止标志处停止,如果在过去的历史中看到减速并且因此在闭环推理期间将永远不会在停止标志处停止。

为了解决这一问题,在过去的姿态历史上引入了一个dropout(其中50%的例子),只保留代理在过去代理中的当前位置(u0,v0)(u_0,v_0)(u0​,v0​),构成输入数据的通道。强制网络去关注其他线索。

5 纯模仿学习之外

在本节中,将超越 expert 演示的 vanilla cloning ,以便通过综合 expert 行为的变化来教模型阻止漂移和避免碰撞和越野驾驶等不良行为。

5.1 合成扰动

5.2 模仿损失之外

5.2.1 碰撞损失

非真实状态下的碰撞,通过度量每个时间步骤上预测 agent box BkB_kBk​ 与 所有场景对象的 ground-truth box 的重复覆盖加入了特殊的损失函数:
Lcollision=1WH∑x∑yBk(x,y)⋅Objkgt(x,y)L_{collision}=\frac{1}{WH}\sum_{x}\sum_{y}B_k(x,y)· Obj_{k}^{gt}(x,y) Lcollision​=WH1​x∑​y∑​Bk​(x,y)⋅Objkgt​(x,y)

其中 BkB_kBk​ 是输出 agent box 预测的似然映射,ObjkgtObj_k^{gt}Objkgt​是在时间步骤为kkk的场景中一个二进制掩码,其所有像素都被其他动态对象(其他车辆、行人等)占用。

5.2.2 路径损失

扰动也会带来路径的偏移问题,设置了路径损失:
Lonroad=1WH∑x∑yBk(x,y)⋅(1−Roadgt(x,y))L_{onroad}=\frac{1}{WH}\sum_{x}\sum_{y}B_k(x,y)·(1-Road^{gt}(x,y)) Lonroad​=WH1​x∑​y∑​Bk​(x,y)⋅(1−Roadgt(x,y))

5.2.3 几何损失

显式地约束代理遵循与速度剖面无关的目标几何。 我们通过将平滑曲线拟合到目标路径点,并将该曲线绘制为自顶向下坐标系中的二值图像,对该目标几何进行建模。 此曲线的厚度设置为等于代理的宽度。

通过测量预测 agent box 与二进制目标几何图像GeomgtGeom^{gt}Geomgt的重叠来表示这种损失类似于碰撞损失。 框中与目标几何曲线不重叠的任何部分都作为损失函数的惩罚添加。
Lgeom=1WH∑x∑yBk(x,y)⋅(1−Geomgt(x,y))L_{geom}=\frac{1}{WH}\sum_{x}\sum_{y}B_k(x,y)·(1-Geom^{gt}(x,y)) Lgeom​=WH1​x∑​y∑​Bk​(x,y)⋅(1−Geomgt(x,y))

5.2.4 辅助损失

类似于 agent 的轨迹,其他 agent 的运动也可以通过递归网络来预测。 相应地添加了一个递归感知网络感知RNN,它使用FeatureNet创建的共享特征F和它自己的预测Objk−1Obj_{k-1}Objk−1​作为输入,并在每次迭代时预测一个热图 ObjkObj_kObjk​。 Obj(x,y)Obj(x,y)Obj(x,y)表示位置(x,y)在时间k被动态对象占据的概率。对于迭代次数 k=0k=0k=0,PeceptionRNN在当前时间被馈送地面真相对象。
Lobjects=1WH∑x∑yH(Objk(x,y),Objkgt(x,y))L_{objects} = \frac{1}{WH}\sum_{x}\sum_{y}H(Obj_k(x,y),Obj_k^{gt}(x,y)) Lobjects​=WH1​x∑​y∑​H(Objk​(x,y),Objkgt​(x,y))

5.3 模仿dropout

综上,可以把损失函数分为两个子组:

  • 模仿损失:
    Limit={Lp,LB,Lθ,Lp−psubpixel,Lspeed}L_{imit} = \{L_p,L_B,L_θ,L_{p-psubpixel},L_{speed}\} Limit​={Lp​,LB​,Lθ​,Lp−psubpixel​,Lspeed​}
  • 环境损失
    Lenv={Lcollision,Lonroad,Lgeom,Lobjects,Lroad}L_{env} = \{L_{collision},L_{onroad},L_{geom},L_{objects},L_{road}\} Lenv​={Lcollision​,Lonroad​,Lgeom​,Lobjects​,Lroad​}

模仿损失导致模型模仿expert的演示,而环境损失阻止不良行为,如碰撞。 为了进一步提高环境损失的有效性实验了随机丢弃模拟损失的随机子集的训练例子。

在实验中表明模仿dropout产生了一个更好的驾驶模型,而不是简单地低估模仿损失。 在模仿dropout期间,随机选择模仿损失wimit上的权重为0或1,对于每个训练示例具有一定的概率。 总体损失由:
L=wimit∑l∈Limitl+wenv∑l∈LenvlL = w_{imit} \sum_{\mathbb{l}\in L_{imit}} \mathbb{l} + w_{env} \sum_{\mathbb{l}\in L_{env}} \mathbb{l} L=wimit​l∈Limit​∑​l+wenv​l∈Lenv​∑​l

6 实验

6.1 数据

训练模型的训练数据是通过随机抽样的段,真实世界的expert驾驶和删除其中的汽车长时间是固定的段。

输入视场为80米×80米(WφWφWφ = 80),当 agent 定位在(u0,v0)(u_0,v_0)(u0​,v0​)时,得到了64米的RforwardR_{forward}Rforward​的有效前向传感范围。

每个训练示例自顶向下坐标系的垂直轴在agent 当前航向的 Δ=±25∘\Delta = \pm 25^\circΔ=±25∘ 范围内随机定向,以避免沿垂直轴行驶的偏差。

在推理过程中,渲染方向设置为agent 方向(∆=0)。 首先收集有关环境的先验图(路线图)和沿车道的速度限制的数据。 对于物体和交通灯等动态场景实体,采用了一个基于激光和相机数据的独立感知系统。表1列出了本文所有实验使用的参数值。 该模型在160ms内运行在NVIDIA特斯拉P100GPU上,详细细目见表2。

6.2 模型

  • M0M_0M0​:它做行为克隆与过去的运动dropout,以防止使用历史信息进行作弊。

  • M1M_1M1​:添加扰动而不修改损失。

  • M2M_2M2​:进一步添加了环境损失LenvL_envLe​nv。
    M_3和M4解决了不想模仿不良行为的问题

  • M3M_3M3​:是一种基线方法,在这种方法中,我们简单地降低了模仿损失的权重;

  • M4M_4M4​:使用了模仿dropout方法,dropout率为0.5。

表3列出了每个模型的配置。

6.3 闭环提升

为了在特定场景中评估学习模型,通过模拟重放段,直到一个缓冲周期max(Tpose,Tscene)max(T_{pose},T_{scene})max(Tpose​,Tscene​)过去。 这允许使用直到现在的所有重放段来生成第一个模型输入所呈现的快照。

在此输入上对模型进行评估,并将拟合的控制传递给模拟车辆动力学的车辆模拟器,从而将模拟的 agent 移动到其下一个姿态。 此时,模拟姿态可能与记录的姿态不同,但输入表示允许正确地呈现模型相对于新姿态的新输入。

这个过程被重复,直到段结束,评估场景特定的度量,如停止标志、与另一车辆的碰撞等。 在模拟过程中。 由于模型被用来驱动代理前进,这是一个闭环评估设置。

6.3.1 消融实验

  • Nudging for a Parked Car:在未分两车道线上距离stop标志任意距离的地方放置agent,然后在agent和stop标志间放置一辆停靠在右手边的车辆。(直线,弯道,5个不同的初始速度,共20个场景);
  • Trajectory Perturbation:在弯道上改变agent 的初始速度,起始位置生成了20个场景;
  • Slowing for a Slow Car:将代理放置在一条直线上,以不同的初始速度,并将另一辆汽车以不同但较慢的恒定速度放置在前面,总共产生20个场景变化,以评估缓慢的能力,然后跟随汽车前进。

6.3.2 输入消融测试

通过输入消融试验,我们希望测试最终的M4模型识别特定行为背后的正确因果因素的能力,方法是在存在或不存在正确因果因素的情况下测试模型的行为,同时保持其他条件不变。 在仿真中,我们评估了我们的模型在20个场景中,有和没有停止信号渲染,以及20个场景中有和没有其他车辆渲染。 该模型在所有场景中都表现出正确的行为,从而证实了它已经学会了对停止标志和停止车辆的正确特征作出响应。

6.3.3 日志数据模拟驾驶

对于这个评估,作者从实际驾驶测试数据(与训练数据分开)中获取日志,并使用训练过的网络使用车辆模拟器来驾驶汽车,保持其他一切不变。 动态对象、交通灯状态等。 都和日志里的一样。 这里展示了一些示例视频,它们说明了模型处理多个动态对象和道路控制的能力。

6.3.4 真实世界驾驶

通过将现有的 planner 模块替换为学习模型M4M_4M4​,在自动驾驶汽车上评估了这个模型,并复制了在模拟中观察到的驾驶行为。 这些运行次运行的视频在这里是可用的,它们不仅说明了网络驱动能力的平滑性,而且还说明了它处理停止信号和转弯的能力,以及在完全闭环控制下在不偏离轨迹的情况下驱动长时间的能力。

6.4 开环评估

指的就是把state交给系统之后,评估预测的轨迹跟真实的轨迹之间的L2距离(将expert驾驶作为GT)。

6.5 失败模型

由于感受野只有前面64m和侧面40m,agent在T字路口(T-junctions)和高速路上表现不好。因为缺少足量的数据,一些特别的道路比如掉头(U-turns)和死胡同(cul-de-sacs)是完全没办法处理的。有时候系统会在低速略过别人的场景中卡住。有时候系统会给出不可行的几何路线(过大的旋转半径)以至于不能实现。系统在新的或者少见的场景中会有非常激进的超车行为。因此作者相信需要更多的模拟器方针来应对这些很多高互动或者是少见的场景。

6.6 采样速度剖面


通过迭代来确定纵向的速度样本,根据硬约束来限制概率分布采样点。

7 讨论

在本文中,作者进行了实验来展示模仿学习是怎么使在真实世界的驾驶变得更好。 它成功的关键是围绕 expert 行为人工合成各种情况,并增加适当的损失以阻止不良行为。

这种有条件的开发能够避免碰撞和越野驾驶,即使这些例子没有明确地出现在 expert 的演示中。为了支持它,并最好地利用 expert 数据,作者使用了中层输入和输出表示,这使得真实和模拟数据易于混合,并减轻了学习感知和控制的负担。

有了这些成分,我们就有了一个足够好的模型来驾驶一辆真正的汽车。 尽管如此,该模型还没有完全能与运动规划方法竞争,但对于机器学习驾驶模型来说这是一个很好的进步。

还有改进的余地:与End2End相比较的方法,研究模仿 dropout 的替代方法也是其中之一。 作者认为最重要的是,通过深入探索模拟中罕见和困难的场景来增强 expert 演示,也许在强化学习框架内,将是提高这些模型特别是对于高度交互场景的性能的关键。

端到端无人驾驶文献学习:ChauffeurNet: Learning to Drive by Imitating the Best and Synthesizing the Worst相关推荐

  1. 端到端无人驾驶文献学习:End-to-end Interpretable Neural Motion Planner

    End-to-end Interpretable Neural Motion Planner 1 简介 关键点 一些背景信息 3 深度结构化规划 3.1 深度结构化规划 输入表示 骨干网络 感知头 成 ...

  2. 文献学习(part72)--Learning the parts of objects by non-negative matrix factorization

    学习笔记,仅供参考,有错必纠 文章目录 Learning the parts of objects by non-negative matrix factorization 摘要 正文 Learnin ...

  3. 无人驾驶汽车系统入门(二十三)——迁移学习和端到端无人驾驶

    无人驾驶汽车系统入门(二十三)--迁移学习和端到端无人驾驶 前面我们介绍了神经网络和深度学习的基础知识,在本文中我们将介绍迁移学习的概念,并将迁移学习应用于端到端无人驾驶模型.一般来说,大型深层神经网 ...

  4. 机器学习中什么是端到端的训练方法(端到端学习)?(end2end learning)

    相对于深度学习,传统机器学习的流程往往由多个独立的模块组成,比如在一个典型的自然语言处理(Natural Language Processing)问题中,包括分词.词性标注.句法分析.语义分析等多个独 ...

  5. 机器学习中的端到端学习(End-to-End Learning)

    传统机器学习需要将一个任务的输入和输出之间人为地切割成很多子模块,或者多个阶段,每个子模块(阶段)分开学习.比如一个自然语言处理任务(NLP),一般需要分词.词性标注.句法分析.语义分析.语义推理等步 ...

  6. CVPR2020:端到端学习三维点云的局部多视图描述符

    CVPR2020:端到端学习三维点云的局部多视图描述符 End-to-End Learning Local Multi-View Descriptors for 3D Point Clouds 论文地 ...

  7. 端到端深度学习在自动驾驶汽车上的应用

    2016 年 9 月 23-24 日,由 CSDN 和创新工场联合主办的"MDCC 2016 移动开发者大会• 中国"(Mobile Developer Conference Ch ...

  8. 端到端的TTS深度学习模型tacotron(中文语音合成)

    TACONTRON: A Fully End-to-End Text-To-Speech Synthesis Model 通常的TTS模型包含许多模块,例如文本分析, 声学模型, 音频合成等.而构建这 ...

  9. 端到端深度学习与自动驾驶(含参考文献)

    参考文献见最后. 1.自动驾驶系统的分类 Rule based system基于规则的系统, 也有论文中将这样的方法叫做Mediated percepiton approach. Fully end- ...

  10. 端到端训练 联合训练_图分解的端到端学习

    source:End-to-end Learning for Graph Decomposition Jie Song ETH Zurich Bjoern Andres MPI for Intelli ...

最新文章

  1. POJ 2823 Sliding Window(单调队列)
  2. 大循环在内,小循环主外为什么会效率高
  3. 全面解析java注解
  4. mysql long varchar2_long查询结果转换为varchar2类型
  5. java.sql.SQLException: ORA-00911: 无效字符 解决方法
  6. 第4章 Python 数字图像处理(DIP) - 频率域滤波4 - 单变量的离散傅里叶变换DFT
  7. android仿高德地图透明黑字,Android 仿高德地图可拉伸的BottomSheet
  8. 牛客网SQL篇刷题篇(38-47)
  9. LUT查表法乘法器所犯下错误。。。。
  10. React:组件的生命周期
  11. QT绘图底层是如何适配各种操作系统的
  12. c语言产生不同随机数,怎样用c语言产生不同的随机数
  13. Unity-创建一个小地图
  14. H5技能图谱——适合各阶段前端程序员的学习地图
  15. 百会CRM发布新春致5万企业用户的公开信
  16. 算法(赛马问题)图解
  17. 2016中国大数据技术大会在北京盛大召开
  18. 在IBM PureApplication System上安装IBM InfoSphere Guardium数据加密
  19. JDK动态代理底层源码剖析
  20. 静息态fMRI+图论研究:难治性精神分裂症的脑功能网络

热门文章

  1. 具体数学第一章习题题解(8,9,10,11)
  2. ESP32的智能药箱-WEB定时-舵机和语音控制-OLED实时时间显示
  3. C#winform【在状态栏显示实时时间】--实战练习一
  4. google earth 卫星无偏移免费下载,91卫图助手
  5. c语言二级选择题APP,C语言二级题库
  6. Excel加载“宏”
  7. 自动驾驶仿真相关调研
  8. 安装linux出现分区出错,找到了linux分区顺序错乱修复方法
  9. css宋体代码_css中宋体怎么设置?
  10. ssim 算法 java实现_图像质量评价指标之 PSNR 和 SSIM