绘制一个XY集是一种很常见的任务,基于Android平台的绘制很简单,它让所有的GUI在XML中定义的(虽然它也可以通过代码创建)模型是相当不错的。大部分的图形处理一个样本查看,但在大多数情况下,图应该是一个部分的实施走上屏幕布局XML定义为一所以在这里展示我们ImageView
布局对象。
在Android环境中,有一整套程序的图形通常是位图实现像素,Canvas是用来绘制位图的画布,通过这一点我们可以得出元(文字,线条等)它描述了漆的颜色,款式等。
图形界面我们通过Xml定义。
这个布局文件是TableLayout布局,它定义了三行,行之间通过一条线割开
为了实现我们的图表,我们首先创建一个位图,然后关联到我们的布局文件,有了位图,我们就可以绘制图表,做缩放,色彩和数据显示 等效果。
首先我们使布局连接到XML对象的,那么我们创建位图。我们通过quicky_XY方法来实现所有的绘制,最后显示在屏幕上。
有了位图后,将它与Canvas相关联
然后将所有的元素绘制到Canvas上,我们需要定义一些用于放置标签和数据点空间的网格。
这些数据点需要一到屏幕上的坐标数据范围正确的映射遍历数据点和调用drawLine
接连两个点会完成我们的图表。数据点通过数据为载体,现在将调用plot_array_list
SECOND也是一片基于Voxel按anchor-based的点云检测方法,网络的整体结构和实现大部分与原先VoxelNet相近,同时在VoxelNet的基础上改进了中间层的3D卷积,采用稀疏卷积来完成,提高了训练的效率和网络推理的速度,同时解决了VoxelNet中角度预测中,因为物体完全反向和产生很大loss的情况;同时,SECOND还提出了GT_Aug的点云数据增强。没有了解过VoxelNet的小伙伴可以查看我的这篇文章:
本文的代码解析将会根据OpenPCDet的实现来进行,期间异同会说明:
Detection)网络整体架构(图来自原论文)
注:VoxelNet中的点云特征提取VFE模块在作者最新的实现中已经被替换;因为原来的VFE操作速度太慢,并且对显存不友好。具体可以查看这个issue:
至此SECOND的网络构建和LOSS计算就完成了,下面看一下SECOND的推理过程。
# 如果不是训练模式,则直接生成进行box的预测
# 根据预测结果解码生成最终结果
10.1 预测结果解码:
# 是否使用多头预测,默认否 每个类别anchor的生成情况: # 将预测结果都flatten为一维的 # 对7个预测的box参数进行解码操作 # 取出所有anchor的方向分类 : 正向和反向 # 将角度在0到pi之间 在OpenPCDet中,坐标使用的是统一规范坐标,x向前,y向左,z向上 # 这里参考训练时候的原因,现将角度角度沿着x轴的逆时针旋转了45度得到dir_rot 从新将角度旋转回到激光雷达坐标系中,所以需要加回来之前减去的45度, 如果dir_labels是1的话,说明方向在是180度的,因此需要将预测的角度信息加上180度, 否则预测角度即是所得角度
7个参数的编码的方式为 # split_size是切分后每块的大小,不是切分为多少块!,多余的参数使用*cags接收
在3D的环境中,不考虑不同类别的物体会出现在同一处3D的空间中。
# post_process_cfg后处理参数,包含了nms类型、阈值、使用的设备、nms后最多保留的结果和输出的置信度等设置 # 得到当前处理的是第几帧 # 损失函数计算使用的BCE,所以这里使用sigmoid激活函数得到类别概率 # 是否使用多类别的NMS计算,否,不考虑不同类别的物体会在3D空间中重叠 # 得到类别预测的最大概率,和对应的索引值 # 使用第一阶段预测的label为改预测结果的分类类别 # 得到最终类别预测的分数 # 根据selected得到最终类别预测的结果 # 生成最终预测的结果字典
11.1 模型结果和可视化
由于SECOND的最新实现中,改动较多,这里直接展示它在PCDET的KITTI数据集上结果。
1、SECOND提出了对GT进行采样截取,生成GT的Database,该方法在后续的很多网络中都得到了使用。(后续被称为GT_AUG)
对所有的GT进行碰撞检测,防止放入的GT会相互碰撞,产生不可能在物理世界中出现的结果,并将碰撞的采样GT删除。
该方法的提出极大的加速了网络的收敛速度和提升了网络最终的精度,下图展示了使用该方法和不使用该方法的对比图。
注:该方法很好,但是只能用在单独的点云检测模型中,如何将该方法用在融合模型上是值得思考的!
2、全局点云旋转和缩放,旋转角度为(-45,45)之间,缩放大小为(0.95,1.05)之间
3、独立GT移动和旋转,该方法来自VoxelNet,随机对独立的GTBox进行旋转和移动。
至于本论文的消融实验,个人觉得讲的不是很好,一个讲了上面的GT_AUG,结论就是上面那副图片;另一个将了对角度编码的改进,提升了一点精度;这里就不讲这个了,放张图,大家自己看看吧。
游戏和三维互动内容开发工具,专业游戏引擎
游戏引擎: 一款游戏最核心的代码
包含: 渲染引擎,物理引擎、碰撞检测,音效、脚本引擎、动画系统
人工智能、网络引擎、场景管理。
策划、美工、软件工程师、测试工程师。
环境搭建、C#语言基础、Unity API、物理引擎1、3D数学基础、UGUI
—》可以在设计界面右上角调节
本地坐标: 物体自身坐标
场景: 一组相关联的游戏对象的集合。
坐标轴-> Max中坐标轴调整为y轴朝上
多余面数->删除场景中多余的面(看不见的面)->提高贴图利用率
避免闪面(原因 面与面之间距离太小。)->注意检查共面、漏面、反面(材质在背面去了,需要进行法线反转)
面与面之间的最小距离为当前最大尺度的2千分之1
委托是事件实现的基础;
事件是委托的一种使用方式。
对象1 的方法 调用对象2的方法
定义: 偶发,有影响,事件发生后其他对象做出响应
实现两个或多个行为的联动调用。
事件的使用:【事件设计模式】【事件模式】
程序集定义 应用程序编译后的结果 : exe dll
代码,资源,信息(元数据)
程序集用途: 1》发布部署。 混淆器(加密-> 阻止反编译)
反射-> 获取程序集中信息的技术
提供了描述程序集、模块和类型的对象。
使用反射动态创建对象的实例从现有对象中获取类型并调用其方法。
问题: 将对象组成树形结构。 将对象组成树形结构以表示"部分-整体"的层次结构。 练习: 建立菜单树,实现树 P558 1.公司属于CEO管理 2.3个部门: 研发,市场,客服,都有部门经理 3.研发部:两个小组 ->服务端,客户端 服务端2人,客户端3人,市场2人,客服2人 每个员工类增加名字,薪水。 计算某部门或某小组的人员薪水和 //这题机械劳动太多了。。没写完,回头看看有没有更方便插入结点的方法,这里我自建了一个Insert方法和FindNode方法。 //上面的方法很蠢。。。 //下面直接建立层级关系 问题 : 对一个对象动态扩展原有的行为能力,不断包装,不断扩展。 例子: 武器镶嵌不同宝石 获得不同方法/武器技能 问题:为其它对象提供一种代理以控制对这个对象的访问 由小对象表示大对象(类似继电器) 行为型-关注对象交互的问题 P561 问题某功能实现的大流程已经确定了 但每一个步骤都可能 有不同的实现 一次性实现算法不变的部分,并将可变的 在一个对象内部状态改变时行为发生改变 通过反射动态创建 瓶子状态: 关闭,打开,工作 2.定义状态抽象基类,实现状态子类(多个) 2.定义状态切换的方法 3.调用当前状态的方法——》 pour。 4.根据需要定义其它成员。
练习: 计算员工工资 程序员/测试,销售
有限状态机: 有限多个状态在不同的条件下相互转换的图
主角攻击小怪,妖怪要有一些可能性的反应-> 有限状态机
增加抽象状态类,条件类。
在本状态作为当前状态时,还要做状态检查(发现目标,生命为0)。
若发现状态改变条件满足->调用状态机改变状态方法。
状态机-> 包含AI 所有状态的容器。 ->状态对象的初始化,负责状态的切换,实时执行当前状态的行为以及条件检查。
默认状态 状态编号 条件编号
当前状态 条件列表(该状态下要进行的检测)
为状态类或条件类提供的数据 转换映射表
状态管理 初始化 初始化
状态机管理 添加条件 bool检测条件是否达成
为状态类或条件类提供行为 查找映射
例子: 状态机(史莱姆状态机) 状态类(史莱姆Idlel类,史莱姆FindEnemy类…)
条件类(史莱姆生命存活条件类,史莱姆索敌条件类)
3.放入状态集合=状态库
1.硬编码-> 量大,难修改,代码复用性差