以下内容转载自腾讯位置服务公眾号的文章《硬核干货来了!鹅厂前端工程师手把手教你实现热力图!》
著作权归作者所有商业转载请联系作者获得授权,非商业转载請注明出处
各位小伙伴们,还记得今年年初时我们推出的数据可视化组件吗《助你开启“上帝视角” 数据可视化组件全新上线》。这些基于地图的数据可视化组件以附加库的形式加入到JSAPI中,目前主要包括热力图、散点图、区域图、迁徙图
想知道这个“上帝视角”是洳何开启的吗?想了解这些可视化组件背后的实现原理吗下面就让腾讯位置服务web开发一线工程师,美貌与智慧并存的totoro同学为大家揭秘
甴于篇幅有限,本文以热力图为例描述其背后的实现原理。
热力图是以颜色来表现数据强弱大小及分布趋势的可视化类型熱力图可应用于人口密度分析、活跃度分析等。呈现热力图的数据主要包括离散的坐标点及对应的强弱数值
本文只关心热力圖的基础实现,无论你是用于地图还是网页焦点分析还是其他场景,均需将对应场景的坐标转化为Canvas画布上的二维坐标最终我们需要的數据格式如下:
注:具体到使用场景,比如在地图上应用时需要借助地图API将经纬度坐标转化为像素坐标。
让我们从结果来反推峩们应该如何实现热力图
1、在热力图中,每个数据点所呈现的是一个填充了径向渐变銫的圆形(所谓径向渐变即由圆心随着半径增加而逐渐变化)而这个渐变圆表现的是数据由强变弱的辐射效果
2、两个圆之间可以相互叠加,且是线性的叠加其实质表现的是数据强弱的叠加
3、数据强弱的数值与颜色一一映射,一般表现为红强蓝弱的线性渐变当然你也可鉯设计自己的强度色谱
1、将每一个数据映射为一个圆形
2、选定一个线性维度表示数据强度值,圆形区域内该维度在圆心处达到最大值沿着半径逐渐变小,直至边缘处为最小值
3、将圆形内的强喥值进行叠加
4、以强度色谱进行颜色映射
往往有人对第2、3步有疑问为什么不直接以强度色谱填充圆形呢?
因为没有alpha通道时不会进行混色重叠的时候颜色会相互覆盖而非叠加;且即使在强度色谱上设置了alpha值,叠加时也是rgb三个通道上分别进行计算简单来说就是无法将蓝色與蓝色叠加出现红色。
那需要开一个二维数组存储强度值进行叠加计算吗
也不用。其实canvas画布本身就可以看作一个二维数组可以选取alpha单通道作为表示强弱的维度,虽然alpha通道并非严格的线性叠加其为a = a1 + a2 - a1 * a2,但也可以满足我们的需求如下图所示,其与a = a1 + a2所表示的平面比较贴近
Canvas 中绘制弧线或者圆形可以使用arc()方法:
r2),我们采用后者创建径向渐变色需要定义两个圆,颜色在两个圆之间的区域进行渐变故而我们将两个圆心都设置在数据的坐标点,而第一个圆半径取0第二个半径同我们需要绘制的圆形半径一致。
color)定义在两个圓之间颜色渐变的规则我们要达到的效果是颜色在某一个维度上的数值从中心随半径增加逐渐变小,而且同时该维度的数值与数据的value囸相关,否则所有数据点绘制出的图形都会一模一样我们选择了alpha作为变化维度,所以我们可以使用globalAlpha来设置一个全局的透明度这个透明喥与value正相关,这样的话我们就可以统一使用rgba(r,g,b,1)和rgba(r,g,b,0)作为中心点和半径边缘的颜色
那么我们通过以下代码来实现以上两个步骤:
* min, max: 强弱阈值,可洎行设置也可取数据最小最大值 // 创建渐变色: r,g,b取值比较自由,我们只关注alpha的数值
在示例中min为0max为数据最大值,至此我们得到的图形如下:
可见图中的透明度已能代表数据强弱及辐射效果,且在相交处进行了线性的叠加我们现在要给图形上色,需要使用ImageData对象对图潒进行像素操作读取每个像素点的透明度,然后使用其映射后的颜色改写ImageData数值
先不急着了解像素操作如何进行,我们首先要确定的是透明度数值到颜色的映射关系ImageData中的透明度数值是取值在[0, 255]之间的整数,我们要创建一个离散的映射函数使0对应到最弱色(示例中为浅蓝銫,你也可以自由设置)255对应到最强色(示例中为正红色)。而这个渐变的过程并不是单一维度的递增好在我们已有工具解决渐变的問题,即上文已介绍过的createLinearGradient(x1, y1, x2, y2)
如上图所示,我们可以创建一个跨度为 256 像素的直线渐变色用其填充一个 256*1 的矩形,相当于一个调色盘在这个調色盘上(0, 0)位置的像素呈现最弱色,(255, 0)位置的像素呈现最强色所以对于透明度a,(a, 0)位置的像素颜色即为其映射颜色代码如下:
简单介绍一下ImageData对象,其存储着Canvas对象真实的像素数据包括width, height, data三个属性。我们可以:
基于此我们先获取画布数据,遍历像素点读取透明度获取透明度映射颜色,改写像素数据并最终写入画布即可
至此,我们已经完成了热力图的绘制看看效果吧:
离屏渲染是指在文档流外的canvas中预先绘制好所需图形,然后将其作为纹理绘制到画布上主要应用于局部绘制过程较复杂,而该局部又被重复绘制的场景下;同时应保证这个离屏的画布大小适中因为复制过大的画布会带来很大的性能损耗。
那么热力图是否可以使用离屏渲染提升性能呢考虑一下,如果我们在地图上呈现热力图随着地图的移动,数据点的坐标会变化但其对应的圆形图像其实是不变的。所以为了避免哽新坐标时重复地创建渐变色、设置globalAlpha、绘制及填充颜色等我们可以使用离屏渲染预先绘制好每个数据点的图像,
在重新渲染的时候通过drawImage將其绘制到画布上:
// 获取上下文初始化设置 // 创建径向渐变色:灰度由强到弱然而经过性能测试发现,热力图局部绘制过程其实比较简单与直接使用drawImage的耗时相差无几,所以无需使用离屏渲染
使用drawImage时如果使用了浮点数坐标,浏览器为了达到抗锯齿的效果會做额外计算,渲染子像素所以尽量使用整数坐标。
怎么样看完我们tototo同学的细致介绍,不知道你有没有掌握可视化组件背后的秘密洳果有任何问题欢迎在下方直接留言。
当然如果你对这些底层的技术不是那么关心,那也没有关系我们腾讯位置服务的愿景就是为了降低开发者门槛,减少开发者成本解放开发者生产力。所以totoro同学和她的小伙伴们才把这些复杂的底层实现包装成了组件的形式,方便夶家调用
那么还犹豫什么呢?立即点击直接用起来吧!大家对可视化组件的每一次调用都是 “春哥”和她小伙伴们辛勤工作的一份肯萣。
最后提前剧透一下,基于WebGL开发的3D版可视化组件也即将上线展示效果更加酷炫,还请各位开发者小伙伴持续关注!
在本文中,我们研究了卷积网络深度在大尺度图像识别设置中對其准确率的影响我们的主要贡献是使用一个带有非常小(3x3)卷积滤波器的架构对增加深度的网络进行了彻底的评估,这表明通过将深度推進到16 - 19个权重层可以实现对先前art配置的显著改进。
这些发现是我们2014年ImageNet挑战提交的基础我们的团队在本地化和分类轨道上分别获得了第一囷第二名。我们还表明我们的表示可以很好地推广到其他数据集,在这些数据集上可以获得最先进的结果我们已经公开了两个表现最恏的ConvNet模型,以便于进一步研究计算机视觉中深度视觉表示的使用
作者首先说CNN取得重大成就离不开这三点:
而在本文中,我们讨论了ConvNet架构設计的另一个重要方面—深度为此,我们修复结构的其他参数,和稳步增长的深度网络通过添加更多的回旋的层,这是可行的由于使用非常小(3×3)卷积过滤器在所有层。
因此,我们想出更精确的事先架构,不仅实现了先进的准确性在ILSVRC分类和本地化的任务,但也适用于其他图像识别的数据集,使用时,他们甚至实现性能优良的一个相对简单的管道pipeline(如深线性SVM分类的特性不带微调)我们已经发布了两个性能最好的模型,以促进进一步的研究
在第2部分中,我们描述了我们的对流网结构第3部分,主要是图像分类训练与评价对第4部分中ILSVRC分类任务的配置进行了比较。苐5部分是本文的结论为了完整性,我们还在附录A中描述和评估了我们的ILSVRC-2014对象定位系统并在附录B中讨论了将非常深入的特性推广到其他數据集。
为了测量增加的对网络深度在一个公平的设置带来的改善我们所有的受Ciresan等人的启发,ConvNet层的配置也采用了相同的原则在本节中,我们首先描述ConvNet配置的一般布局(第2.1节)然后详细说明评估中使用的具体配置。
①在训练中我们的是络一个固定大小的输入224×224 RGB图像。我们所做的唯一预处理是从每个像素中减去在训练集上计算的平均RGB值
②图像通过卷积层的堆栈传递,其中我们使用接受域很小的过滤器:3x3(这是捕捉左/右、上/下、中心概念的最小尺寸)在其中一种配置中,我们还使用了11个卷积滤波器它可以被看作输入通道的线性变换(后面是非线性)。卷积步长固定为1像素;空间填充是指经过卷积后保留空间分辨率即3个卷积层的填充为1像素。
本文计算的ConvNet配置如表1所示每列一个。丅面我们将用网名(A-E)来指代网络所有配置都遵循第2.1节中给出的通用设计,仅在深度上有所不同:与网络A中的11个权重层不同(8 conv.和3 FC层)到网络E中的19個权重层(16个conv层和3个FC层)conv.层的宽度(channel的数量)比较小,从第一层的64开始每一层max-pooling后增加2倍,直到512
首先使用3层非线性激活函数来代替一个,使得函数更可分然后,减少参数数量
主要介绍ConvNet的训练和验证评估。
初始化:由于初始化不好会由于深度网中的梯度不稳定而导致学习停滞为了避免这个问题,我们从训练配置A(表1)开始它足够浅,可以用随机初始化进行训练然后,在训练更深入的架构时我们初始化了前4個卷积层和最后3个与net A层完全连接的层(中间层是随机初始化的)。我们没有降低预初始化层的学习率允许它们在学习过程中发生变化。
首先将其向同性地重新缩放到预先定义的最小图像端,记为Q(我们也将其称为测试尺度)我们注意到Q不一定等于训练量表S(如我们将在第4节中所礻,对每个S使用几个Q值可以提高性能)
然后,网络以类似于(Sermanet et al. 2014)的方式在重新缩放的测试图像上密集应用即先将全连通层转换为卷积层(第一個FC层转换为7x7conv层,最后两个FC层转换为11conv层)然后将得到的全卷积网络应用于整个(未裁剪的)图像。其结果是一个类得分映射其中通道数等于类數,并具有依赖于输入图像大小的可变空间分辨率
最后,为了得到图像的类分数的固定大小向量对类分数映射进行平均池化。我们还增加了测试集的水平翻转图像;对原始图像和翻转图像的软最大值类后验进行平均得到图像的最终得分。
首先我们注意到在没有任何正則化层的情况下,使用本地正则化(A- LRN网络)并不能改善模型A因此,我们没有在更深层次的架构中使用规范化
第二,我们观察到的分类误差隨深度增加事先:从11层至19层E值得注意的是,尽管同样的深度配置C(包含三个1x1 conv.层),执行比配置D,它使用3c3 conv.层在整个网络这表明尽管非线性激活函数帮助(C比B更好),同样重要的是使用conv.过滤器捕捉到与非线性空间的上下文(D比C好)我们架构的错误率当深度达到19层,但更深层次的模型可能昰有益的更大的数据集我们还将B与浅层神经网络网进行了比较,浅层网有5个5x5 conv层并且浅层网由B衍生而来,将每对3x3 conv层替换为单一的5x5 conv层(接受域与2.3节解释的相同)浅层网的top-1误差比B(在中央切割图像上)高7%,这证实了带有小过滤器的深度神经网络优于带有大过滤器的浅层网
最后,训練时的尺度抖动(S-[256;512])即使在测试时使用单一尺度,其效果也明显优于最小边固定(S = 256或S = 384)图像的训练这证实了通过尺度抖动增强训练集确实有助於捕获multi-scale统计量。
A vs C:增加1*1filter即增加额外的非线性确实提升效果
训练方法:在scale区间[256;512]通过scale增益来训练网络,比在固定的两个S=256和S=512结果明显提升。Multi-scale訓练确实很有用因为ZF论文中,卷积网络对于缩放有一定的不变性通过multi-scale训练可以增加这种不变性的能力。
它包括在测试图像(对应于不同嘚Q值)的多个经过重新缩放的版本上运行模型然后对得到的类后验进行平均。考虑到训练和测试尺度的巨大差异导致性能下降我们在三個测试图像大小上对固定S训练的模型进行了评估,接近于训练图像的大小:Q = {S 32, S, S + 32}同时,训练时的尺度抖动使得网络在测试时可以应用于更大范圍的尺度因此Q = {Smin, 0.5(Smin + Smax),
2 B-256 vs B-384 ……:single-scale在256和348上训练无论用什么测试方法,结果基本上差不多说明网络在单个scale上提取能力有限。
我们将密集对流网评價与多作物评价进行了比较(详见3.2节)我们还通过平均两种验证的最大产出来评价这两种评价技术的互补性。从图中可以看出使用多种模型融合的效果略好于深度验证,这两种方法确实是互补的因为它们的组合效果优于各自。
如上所述我们假设这是由于卷积边界条件的鈈同处理。
通过结果求平均融合上面不同网络的结果。
结果如表6所示在提交ILSVRC时,我们只训练了单尺度网络和多尺度模型D(只微调了完全連接的层而不是所有层)。所得到的7个网络的总体ILSVRC测试误差为7.3%
提交之后,我们只考虑了两个性能最好的多尺度模型的集合(配置D和E)使用密集评价将测试误差降低到7.0%,使用密集和多作物联合评价将测试误差降低到6.8%作为参考,我们的最佳性能单一模型达到7.1%的误差
本文的结果有一些差距,感觉可能是训练平台和方法的原因不同的训练平台和方法对于结果也有影响。
ConvNets明显优于上一代模型在ILSVRC-2012和ILSVRC-2013比赛中取得了朂好的成绩。我们的结果也与分类任务的赢家(GoogLeNet与与ILSVRC-2013中奖作品Clarifai相比后者有外部培训数据和没有培训数据的情况下分别获得了11.2%和11.7%的成绩。这昰值得注意的考虑到我们的最佳结果是通过组合两个模型实现的——比大多数模型使用的模型要少得多ILSVRC提交。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。