精华内容
下载资源
问答
  • PCL 计算点云法向量并显示

    万次阅读 热门讨论 2020-04-16 16:11:27
    PCL计算法向量并显示,用OMP进行计算加速。

    一、算法原理

    强调一下:

    • PCL中计算法向量的方法有两种,其中一种就是本文pcl::NormalEstimation中的方法;
    • 该方法是基于PCA主成分分析法实现的;
    • 最小二乘拟合邻域平面时用的是KD树查找邻域点。

    1、法向量估计

      基于局部表面拟合的方法进行法向量估计:点云的采样表面处处光滑的情况下,任何点的局部邻域都可以用平面进行很好的拟合;为此,对于点云中的每个扫描点pp,搜索到与其最近邻的KK个相邻点,然后计算这些点最小二乘意义上的局部平面PP,此平面可以表示为:
    P(n,d)=arg min(n,d)i=1k (npid)2(1)P(\vec{n},d)=\argmin \limits_{(\vec{n},d)} \sum_{i=1}^k\ (\vec{n}\cdot p_i-d)^2\tag{1}
      式中,n\vec{n}为平面PP的法向量,ddPP到坐标原点的距离。
      可以认为由KK个最近点拟合出的平面的法向量即当前扫描点的法向量。平面PP的法向量可以由主成分分析(PCA)得到,由运算知PP经过其KK邻域点的质心P0P_0,且法向量n\vec{n}满足n=1||\vec{n}||=1,先对式(2)中的协方差矩阵MM进行特征值分解,求得MM的各特征值,MM的最小特征值所对应的特征向量即PP的法向量。
    M=1ki=1k (pip0)(pip0)T(2)M=\frac{1}{k}\sum_{i=1}^k\ ( p_i-p_0)( p_i-p_0)^T\tag{2}

    2、法向量定向

      前面计算出的法向量具有二义性,即只是得到了法向量所在的直线,而没有确定以直线的那个方向为法向量的最终方向。用以下方法对求出的法向量进行重定向:
      假设点云足够稠密且采样平面处处光滑,那么相邻两点的法向量会接近于平行。令ninj\vec{n_i}、\vec{n_j}为相邻两点xixj{x_i}、{x_j}的法向量,如果法向量的方向是一致的,那么ninj1\vec{n_i}\cdot\vec{n_j}\approx1若此内积为负,则说明其中某个点的法向量需要被翻转。因此,首先为点云中某个点设定一个法向量朝向,然后遍历其他所有点,若当前点法向量设定为ninj\vec{n_i},\vec{n_j}为下一个要遍历的点,如果ninj<0\vec{n_i}\cdot\vec{n_j}<0则将nj\vec{n_j}翻转,否则保持不变。

    3、表面曲率

      对式(2)中的协方差矩阵MM进行特征值分解,求得MM的各特征值,若特征值满足λ0λ1λ2\lambda_0\leq\lambda_1\leq\lambda_2,则PP点的表面曲率为:
    δ=λ0λ0+λ1+λ2(3)\delta=\frac{\lambda_0}{\lambda_0+\lambda_1+\lambda_2}\tag{3}
       δ\delta越小表明邻域越平坦, δ\delta越大则表明邻域的起伏变化越大。

    4、参考文献

    [1]王飞,刘如飞,任红伟,柴永宁.利用道路目标特征的多期车载激光点云配准[J].测绘科学技术学报,2020,37(05):496-502.
    [2]邢正全,邓喀中,薛继群.基于K-近邻搜索的点云初始配准[J].测绘科学,2013,38(02):93-95.
    [3]李新春,闫振宇,林森,贾迪.基于邻域特征点提取和匹配的点云配准[J].光子学报,2020,49(04):255-265.

    5、法向量定向的理解

    在这里插入图片描述
       A,B,CA,B,C表示坐标值,Ai,Bi,CIA_i,B_i,C_I表示向量,以OA\overrightarrow{OA} 作为正方向,由于AA点法向量已经定向,所以AA点法向量为:Ai\overrightarrow{A_i}=(0,0,1),对BB点的法向量进行法向量方向的确定:
       其中,BB点的法向量坐标为:Bi1=(12,0,12)\overrightarrow{B_{i1}}=(\frac{1}{\sqrt{2}},0,\frac{1}{\sqrt{2}})Bi2=(12,0,12)\overrightarrow{B_{i2}}=(\frac{1}{\sqrt{2}},0,-\frac{1}{\sqrt{2}});(可以看出Bi\overrightarrow{B_i} 的方向与OA\overrightarrow{OA} 同向,定向的目的就是找出与OA\overrightarrow{OA}同向的Bi\overrightarrow{B_i} ),其理论依据为:
    AiBi>0(4)\overrightarrow{A_i}\cdot \overrightarrow{B_i}>0\tag{4}
      所谓的调整方向就是:上式中计算,你带入的Bi\overrightarrow{B_i} 值为Bi2\overrightarrow{B_{i2}}时,对 Bi2\overrightarrow{B_{i2}}进行操作使Bi2\overrightarrow{B_{i2}}=Bi1\overrightarrow{B_{i1}}
    实际操作中,以AA点作为视点,求出:Bi (AB)>0\overrightarrow{B_i}\cdot \ (A-B)>0时的Bi\overrightarrow{B_i}即为BB点与视点AA同向的法向量。
       综上所述:所谓的定向就是以其中一点NiN_i的法向量方向作为正方向,其邻域内所有点的法向量NjN_j满足:

    NjNi>0(5){N_j}\cdot {N_i}>0\tag{5}

    6、CloudCompare

    CloudCompare软件中也有计算法向量的功能,这里给出具体操作。

    Normals > Compute:计算所选实体的法线
    Normals > Invert:反转所选实体的法线
    Normals > Orient Normals > With Minimum Spanning Tree:用同样的方法重新定位点云的全部法线(最小生成树)
    Normals > Orient Normals > With Fast Marching:用同样的方法重新定位点云的全部法线(快速行进法)
    Normals > Convert to > HSV:将云的法线转换到 HSV 颜色字段
    Normals > Convert to > Dip and Dip direction SFs:转换点云的法线到两个标量域
    Normals > Clear:为选定的实体移除法线
    在这里插入图片描述

    二、pcl::Normal的定义

    compute(*normal)里计算出来的结果是:法向量的x,y,z坐标和表面曲率curvature。其内部结构为:

     /*brief A point structure representing normal coordinates and the surface curvature estimate. (SSE friendly)ingroup common*/
    
    struct Normal : public _Normal
    {
        inline Normal (const _Normal &p)
        {
         normal_x = p.normal_x; 
         normal_y = p.normal_y; 
         normal_z = p.normal_z;
         data_n[3] = 0.0f;
         curvature = p.curvature;
        }
    
        inline Normal ()
        {
         normal_x = normal_y = normal_z = data_n[3] = 0.0f;
         curvature = 0;
        }
    
        inline Normal (float n_x, float n_y, float n_z)
        {
         normal_x = n_x; normal_y = n_y; normal_z = n_z;
         curvature = 0;
         data_n[3] = 0.0f;
        }
    
        friend std::ostream& operator << (std::ostream& os, const Normal& p);
        EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    };
    
    
    

    三、pcl::Normal的几种输出方式

              cout<<normals->points[0]<<endl;
         cout<<"["<<normals->points[0].normal_x<<" "
                  <<normals->points[0].normal_y<<" "
                  <<normals->points[0].normal_z<<" "
                  <<normals->points[0].curvature<<"]"<<endl;
    
         cout<<"["<<normals->points[0].normal[0]<<" "
                  <<normals->points[0].normal[1]<<" "
                  <<normals->points[0].normal[2]<<" "
                  <<normals->points[0].curvature<<"]"<<endl;
    
         cout<<"["<<normals->points[0].data_n[0]<<" "
                  <<normals->points[0].data_n[1]<<" "
                  <<normals->points[0].data_n[2]<<" "
                  <<normals->points[0].curvature<<"]"<<endl;
    
    

    四、计算法线并显示

    1、代码图解

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2、计算输入点云的所有点的法线

    #include <pcl/point_types.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/kdtree/kdtree_flann.h>
    //#include <pcl/features/normal_3d.h>
    #include <pcl/features/normal_3d_omp.h>//使用OMP需要添加的头文件
    #include <pcl/visualization/pcl_visualizer.h>
    #include <boost/thread/thread.hpp>
    using namespace std;
    int main()
    {
    	//------------------加载点云数据-------------------
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    	if (pcl::io::loadPCDFile<pcl::PointXYZ>("车载点云.pcd", *cloud) == -1)
    	{
    		PCL_ERROR("Could not read file\n");
    	}
    
    	//------------------计算法线----------------------
    	pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> n;//OMP加速
    	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    	//建立kdtree来进行近邻点集搜索
    	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
    	n.setNumberOfThreads(10);//设置openMP的线程数
    	//n.setViewPoint(0,0,0);//设置视点,默认为(0,0,0)
    	n.setInputCloud(cloud);
    	n.setSearchMethod(tree);
    	n.setKSearch(10);//点云法向计算时,需要所搜的近邻点大小
    	//n.setRadiusSearch(0.03);//半径搜素
    	n.compute(*normals);//开始进行法向计
    	
    	//----------------可视化--------------
    	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Normal viewer"));
    	//viewer->initCameraParameters();//设置照相机参数,使用户从默认的角度和方向观察点云
    	//设置背景颜色
    	viewer->setBackgroundColor(0.3, 0.3, 0.3);
    	viewer->addText("faxian", 10, 10, "text");
    	//设置点云颜色
    	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 225, 0);
    	//添加坐标系
    	viewer->addCoordinateSystem(0.1);
    	viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");
    	
     
        //添加需要显示的点云法向。cloud为原始点云模型,normal为法向信息,20表示需要显示法向的点云间隔,即每20个点显示一次法向,0.02表示法向长度。
    	viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, normals, 20, 0.02, "normals");
    	//设置点云大小
    	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample cloud");
    	while (!viewer->wasStopped())
    	{
    		viewer->spinOnce(100);
    		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    	}
    
    	return 0;
    }
    

    3、计算输入点云数据中一个子集的法线

    #include <pcl/point_types.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/kdtree/kdtree_flann.h>
    #include <pcl/visualization/pcl_visualizer.h>
    #include <boost/thread/thread.hpp>
    #include <pcl/features/normal_3d_omp.h>
    using namespace std;
    int main()
    {
    	//---------------------加载点云数据----------------------
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    	if (pcl::io::loadPCDFile<pcl::PointXYZ>("车载点云.pcd", *cloud) == -1)
    	{
    		PCL_ERROR("Could not read file\n");
    	}
    	//--------------计算云中前10%的点法线-----------------------
    	vector<int> point_indices(floor(cloud->points.size() / 10));
    	for (size_t i = 0; i < point_indices.size(); ++i) {
    		point_indices[i] = i;	
    	}
    	//-------------------传递索引----------------------------
    	pcl::IndicesPtr indices(new vector <int>(point_indices));
    	//-------------------计算法线----------------------------
    	pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> n;//OMP加速
    	n.setInputCloud(cloud);
    	n.setIndices(indices);
    	// 创建一个kd树,方便搜索;并将它传递给上面创建的法线估算类对象
    	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
    	n.setSearchMethod(tree);
    	n.setRadiusSearch(0.01);
    	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    	//----------------估算特征---------------
    	n.compute(*normals);
    	//-------------为方便可视化,将前10%点云提出-------------------------------
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
    	pcl::copyPointCloud(*cloud, point_indices, *cloud1);
    	//------------------可视化-----------------------
    	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Normal viewer"));
    	//设置背景颜色
    	viewer->setBackgroundColor(0.3, 0.3, 0.3);
    	viewer->addText("faxian", 10, 10, "text");
    	//设置点云颜色
    	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color1(cloud1, 0, 225, 0);
    	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 0, 0);
    	//添加坐标系
    	//viewer->addCoordinateSystem(0.1);
    	viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");
    	viewer->addPointCloud<pcl::PointXYZ>(cloud1, single_color1, "sample cloud1");
    	viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud1, normals, 20, 0.02, "normals");
    	//设置点云大小
    	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample cloud1");
    	while (!viewer->wasStopped())
    	{
    		viewer->spinOnce(100);
    		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    	}
    
    	return 0;
    }
    

    4、特殊操作

    使用另一个数据集(该数据集比较完整)估计其最近邻近点,估算输入数据集(比较稀疏)中所有点的一组曲面法线。该方法适用于(类似)下采样后的点云。

    #include <pcl/point_types.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/kdtree/kdtree_flann.h>
    #include <pcl/visualization/pcl_visualizer.h>
    #include <boost/thread/thread.hpp>
    #include <pcl/filters/voxel_grid.h>
    #include <pcl/features/normal_3d_omp.h>
    using namespace std;
    int main()
    
    	{
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    	if (pcl::io::loadPCDFile<pcl::PointXYZ>("车载点云.pcd", *cloud) == -1)
    	{
    		PCL_ERROR("Could not read file\n");
    	}
    	//------------下采样----------------
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_downsampled(new pcl::PointCloud<pcl::PointXYZ>);
    	pcl::VoxelGrid<pcl::PointXYZ> sor;
    	sor.setInputCloud(cloud);
    	sor.setLeafSize(0.005f, 0.005f, 0.05f);
    	sor.filter(*cloud_downsampled);
    	//-------------计算法线-------------
    	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
    
    	pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> ne;
    	ne.setInputCloud(cloud_downsampled);
    	ne.setSearchSurface(cloud);
    	ne.setSearchMethod(tree);
    	ne.setRadiusSearch(0.01);
    	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    	ne.compute(*normals);
    	//------------------可视化-----------------------
    	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Normal viewer"));
    	//设置背景颜色
    	viewer->setBackgroundColor(0.3, 0.3, 0.3);
    	viewer->addText("faxian", 10, 10, "text");
    	//设置点云颜色
    
    	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud_downsampled, 255, 0, 0);
    	//添加坐标系
    	//viewer->addCoordinateSystem(0.1);
    	viewer->addPointCloud<pcl::PointXYZ>(cloud_downsampled, single_color, "sample cloud");
    
    	viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud_downsampled, normals, 10, 0.02, "normals");
    	//设置点云大小
    	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample cloud");
    	while (!viewer->wasStopped())
    	{
    		viewer->spinOnce(100);
    		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    	}
    
    	return 0;
    }
    

    五、使用OMP的报错处理

    在应用OpenMP,可能会报错“User Error 1001: argument to num_threads clause must be positive”。这是由于设置的线程数必须为正,而程序中可能没有设置,有时候甚至环境变量中设置了,但是依然报错,手动设置如下:

    n.setNumberOfThreads(4);  // 手动设置线程数,比源码增加,否则提示错误
    

    六、结果展示

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 什么是边缘计算

    万次阅读 多人点赞 2018-07-07 16:59:44
    什么是边缘计算 为什么需要边缘计算 什么是边缘计算 边缘计算的优点 案例研究 云卸载 视频分析 智能家居 智慧城市 边缘协作 机遇和挑战 编程可行性 命名 数据抽象 服务管理 私密性 最优化方法 小结 ...

    注:本篇翻译自施巍松教授的论文《Edge Computing : Vision and Challenges》

    目录

    摘要

    物联网技术的快速发展和云服务的推动使得云计算模型已经不能很好的解决现在的问题,于是,这里给出一种新型的计算模型,边缘计算。边缘计算指的是在网络的边缘来处理数据,这样能够减少请求响应时间、提升电池续航能力、减少网络带宽同时保证数据的安全性和私密性。这篇文章会通过一些案例来介绍边缘计算的相关概念,内容包括云卸载、智能家居、智慧城市和协同边缘节点实现边缘计算。希望这篇文章能够给你一些启发并让更多的人投入边缘计算的研究中来。

    简介

    云计算自从它与2005年提出之后,就开始逐步的改变我们生活、学习、工作的方式。生活中经常用到的google、facebook等软件提供的服务就是典型的代表。并且,可伸缩的基础设施和能够支持云服务的处理引擎也对我们运营商业的模式产生了一定的影响,比如,hadoop、spark等等。
    物联网的快速发展让我们进入了后云时代,在我们的日常生活中会产生大量的数据。思科估计到2019年会有将近500亿的事物连接到互联网。物联网应用可能会要求极快的响应时间,数据的私密性等等。如果把物联网产生的数据传输给云计算中心,将会加大网络负载,网路可能造成拥堵,并且会有一定的数据处理延时。
    随着物联网和云服务的推动,我们假设了一种新的处理问题的模型,边缘计算。在网络的边缘产生、处理、分析数据。接下来的文章会介绍为什么需要边缘计算,相关定义。有关云卸载和智慧城市的一些研究,有关边缘计算下的编程、命名、数据抽象、服务管理、数据私密和安全性的问题也会在下文讨论。

    什么是边缘计算

    在网络边缘产生的数据正在逐步增加,如果我们能够在网络的边缘结点去处理、分析数据,那么这种计算模型会更高效。许多新的计算模型正在不断的提出,因为我们发现随着物联网的发展,云计算并不总是那么高效的。接下来文章中将会列出一些原因来证明为什么边缘计算能够比云计算更高效,更优秀。
    ##为什么需要边缘计算

    • 云服务的推动:云中心具有强大的处理性能,能够处理海量的数据。但是,将海量的数据传送到云中心成了一个难题。云计算模型的系统性能瓶颈在于网络带宽的有限性,传送海量数据需要一定的时间,云中心处理数据也需要一定的时间,这就会加大请求响应时间,用户体验极差。

    • 物联网的推动:现在几乎所有的电子设备都可以连接到互联网,这些电子设备会后产生海量的数据。传统的云计算模型并不能及时有效的处理这些数据,在边缘结点处理这些数据将会带来极小的响应时间、减轻网络负载、保证用户数据的私密性。

    • 终端设备的角色转变:终端设备大部分时间都在扮演数据消费者的角色,比如使用智能手机观看爱奇艺、刷抖音等。然而,现在智能手机让终端设备也有了生产数据的能力,比如在淘宝购买东西,在百度里搜索内容这些都是终端节点产生的数据。

    下面两幅图,图1是传统云计算模型下的范式,最左侧是服务提供者来提供数据,上传到云中心,终端客户发送请求到云中心,云中心响应相关请求并发送数据给终端客户。终端客户始终是消费者的角色。
    图2是现在物联网快速发展下的边缘计算范式。边缘结点(包括智能家电、手机、平板等)产生数据,上传到云中心,服务提供商也产生数据上传到云中心。边缘结点发送请求到云中心,云中心返还相关数据给边缘结点。
    这里写图片描述
    图1 云计算范式
    这里写图片描述
    图2 边缘计算范式

    什么是边缘计算

    边缘计算指的是在网络边缘结点来处理、分析数据。这里,我们给出边缘结点的定义,边缘结点指的就是在数据产生源头和云中心之间任一具有计算资源和网络资源的结点。比如,手机就是人与云中心之间的边缘结点,网关是智能家居和云中心之间的边缘结点。在理想环境中,边缘计算指的就是在数据产生源附近分析、处理数据,没有数据的流转,进而减少网络流量和响应时间。

    边缘计算的优点

    • 在人脸识别领域,响应时间由900ms减少为169ms
    • 把部分计算任务从云端卸载到边缘之后,整个系统对能源的消耗减少了30%-40%。
    • 数据在整合、迁移等方面可以减少20倍的时间。

    案例研究

    云卸载

    在传统的内容分发网络中,数据都会缓存到边缘结点,随着物联网的发展,数据的生产和消费都是在边缘结点,也就是说边缘结点也需要承担一定的计算任务。把云中心的计算任务卸载到边缘结点这个过程叫做云卸载。
    举个例子,移动互联网的发展,让我们得以在移动端流畅的购物,我们的购物车以及相关操作(商品的增删改查)都是依靠将数据上传到云中心才能得以实现的。如果将购物车的相关数据和操作都下放到边缘结点进行,那么将会极大提高响应速度,增强用户体验。通过减少延迟来提高人与系统的交互质量。

    视频分析

    随着移动设备的增加,以及城市中摄像头布控的增加,利用视频来达成某种目的成为一种合适的手段,但是云计算这种模型已经不适合用于这种视频处理,因为大量数据在网络中的传输可能会导致网络拥塞,并且视频数据的私密性难以得到保证。
    因此,提出边缘计算,让云中心下放相关请求,各个边缘结点对请求结合本地视频数据进行处理,然后只返回相关结果给云中心,这样既降低了网络流量, 也在一定程度上保证了用户的隐私。
    举例而言,有个小孩儿在城市中丢失,那么云中心可以下放找小孩儿这个请求到各个边缘结点,边缘结点结合本地的数据进行处理,然后返回是否找到小孩儿这个结果。相比把所有视频上传到云中心,并让云中心去解决,这种方式能够更快的解决问题。

    智能家居

    物联网的发展让普通人家里的电子器件都变得活泼了起来,仅仅让这些电子器件连上网络是不够的,我们需要更好的利用这些电子元件产生的数据,并利用这些数据更好的为当前家庭服务。考虑到网络带宽和数据私密保护,我们需要这些数据最好仅能在本地流通,并直接在本地处理即可。我们需要网关作为边缘结点,让它自己消费家庭里所产生的数据。同时由于数据的来源有很多(可以是来自电脑、手机、传感器等任何智能设备),我们需要定制一个特殊的OS,以至于它能把这些抽象的数据揉和在一起并能有机的统一起来。

    智慧城市

    边缘计算的设计初衷是为了让数据能够更接近数据源,因此边缘计算在智慧城市中有以下几方面优势:

    • 海量数据处理:在一个人口众多的大城市中,无时无刻不在产生着大量的数据,而这些数据如果通通交由云中心来处理,那么将会导致巨大的网络负担,资源浪费严重。如果这些数据能够就近进行处理,在数据源所在的局域网内进行处理,那么网络负载就会大幅度降低,数据的处理能力也会有进一步的提升。
    • 低延迟:在大城市中,有很多服务是要求具有实时特性的,这就要求响应速度能够尽可能的进一步提升。比如医疗和公共安全方面,通过边缘计算,将减少数据在网络中传输的时间,简化网络结构,对于数据的分析、诊断和决策都可以交由边缘结点来进行处理,从而提高用户体验。
    • 位置感知:对基于位置的一些应用来说,边缘计算的性能要由于云计算。比如导航,终端设备可以根据自己的实时位置把相关位置信息和数据交给边缘结点来进行处理、边缘结点基于现有的数据进行判断和决策。整个过程中的网络开销都是最小的。用户请求得以极快的得到响应。
      ##边缘协作
      由于数据隐私性问题和数据在网络中传输的成本问题,有一些数据是不能由云中心去处理的,但是这些数据有时候又需要多个部门协同合作才能发挥它最大的作用。于是,我们提出了边缘协同合作的概念,利用多个边缘结点协同合作,创建一个虚拟的共享数据的视图,利用一个预定义的公共服务接口来将这些数据进行整合,同时,通过这个数据接口,我们可以编写应用程序为用户提供更复杂的服务。
      举个多个边缘结点协同合作共赢的例子。比如流感爆发的时候,医院作为一个边缘结点与药房、医药公司、政府、保险行业等多个节点进行数据共享,把当前流感的受感染人数、流感的症状、治疗流感的成本等共享给以上边缘结点。药房通过这些信息有针对性的调整自己的采购计划,平衡仓库的库存;医药公司则能通过共享的数据得知哪些为要紧的药品,提升该类药品生产的优先级;政府向相关地区的人们提高流感警戒级别,此外,还可以采取进一步的行动来控制流感爆发的蔓延;保险公司根据这次流感程度的严峻性来调整明年该类保险的售价。总之,边缘结点中的任何一个节点都在这次数据共享中得到了一定的利益。

    机遇和挑战

    以上是边缘计算在解决相关问题的潜力和展望,接下来会分析在实现边缘计算的过程中将要面临的机遇和挑战。

    编程可行性

    在云计算平台编程是非常便捷的,因为云有特定的编译平台,大部分程序都可以在云上跑。但是边缘计算下的编程就会面临一个问题,平台异构问题,每一个网络的边缘都是不一样的,有可能是ios系统,也有可能是安卓或者linux等等,不同平台下的编程又是不同的。因此我们提出了计算流的概念,计算流是数据传播路径上的函数序列/计算序列,可以通过应用程序指定计算发生在数据传播路径中的哪个节点。计算流可以帮助用户确定应该完成哪些功能/计算,以及在计算发生在边缘之后如何传播数据。通过部署计算流,可以让计算尽可能的接近数据源。

    命名

    命名方案对于编程、寻址、事物识别和数据通信非常重要,但是在边缘计算中还没有行之有效的数据处理方式。边缘计算中事物的通信是多样的,可以依靠wifi、蓝牙、2.4g等通信技术,因此,仅仅依靠tcp/ip协议栈并不能满足这些异构的事物之间进行通信。边缘计算的命名方案需要处理事物的移动性,动态的网络拓扑结构,隐私和安全保护,以事物的可伸缩性。传统的命名机制如DNS(域名解析服务)、URI(统一资源标志符)都不能很好的解决动态的边缘网络的命名问题。目前正在提出的NDN(命名分发网络)解决此类问题也有一定的局限性。在一个相对较小的网络环境中,我们提出一种解决方案,如图3所示,我们描述一个事物的时间、地点以及正在做的事情,这种统一的命名机制使得管理变得非常容易。当然,当环境上升到城市的高度的时候,这种命名机制可能就不是很合适了,还可以进行进一步的讨论。
    这里写图片描述
    图3 命名机制

    数据抽象

    在物联网环境中会有大量的数据生成,并且由于物联网网络的异构环境,生成的数据是各种格式的,把各种各样的数据格式化对边缘计算来说是一个挑战。同时,网络边缘的大部分事物只是周期性的收集数据,定期把收集到的数据发送给网关,而网关中的存储是有限的,他只能存储最新的数据,因此边缘结点的数据会被经常刷新。利用集成的数据表来存储感兴趣的数据,表内部的结构可以如图4所示,用id、时间、名称、数据等来表示数据。
    这里写图片描述
    图4 相应表结构
    如果筛选掉过多的原始数据,将导致边缘结点数据报告的不可靠,如果保留大量的原始数据,那么边缘结点的存储又将是新的问题;同时这些数据应该是可以被引用程序读写和操作的,由于物联网中事物的异构性,导致数据库的读写和操作会存在一定的问题。

    服务管理

    边缘结点的服务管理我们认为应该有以下四个特征,,包括差异化、可扩展性、隔离性和可靠性,进而保证一个高效可靠的系统。

    • 差异化:随着物联网的发展,会有这种各样的服务,不同的服务应该有差异化的优先级。比如,有关事物判断和故障警报这样的关键服务就应该高于其它一般服务,有关人类身体健康比如心跳检测相关的服务就要比娱乐相关服务的优先级要高一些。
    • 可扩展性:物联网中的物品都是动态的,向物联网中添加或删除一件物品都不是那么容易的,服务缺少或者增加一个新的结点能否适应都是待解决的问题,这些问题可以通过对边缘os的高扩展和灵活的设计来解决。
    • 隔离性:所谓隔离性是指,不同的操作之间互不干扰。举例而言,有多个应用程序可以控制家庭里面的灯光,有关控制灯光的数据是共享的,当有某个应用程序不能响应时,使用其他的应用程序依然能够控制灯光。也就是说这些应用程序之间是相互独立的,互相并没有影响;隔离性还要求用户数据和第三方应用是隔离的,也就是说应用不应该能够跟踪用户的数据并记录下来,为了解决该问题,应当添加一种全新的应用访问用户数据的方式。
    • 可靠性:可靠性可以从服务、系统和数据三方面来谈论
      • 从服务方面来说,网络拓扑中任意节点的丢失都有可能导致服务的不可用,如果边缘系统能够提前检测到具有高风险的节点那么就可以避免这种风险。较好的一种实现方式是使用无线传感器网络来实时监测服务器集群。
      • 从系统角度来看,边缘操作系统是维护整个网络拓扑的重要一部分内容。节点之间能够互通状态和诊断信息。这种特征使得在系统层面部署故障检测、节点替换、数据检测等十分的方便。
      • 从数据角度来看,可靠性指的是数据在传感和通信方面是可靠地。边缘网络中的节点有可能会在不可靠的时候报告信息,比如当传感器处于电量不足的时候就极有可能导致传输的数据不可靠。为解决此类问题可能要提出新的协议来保证物联网在传输数据时的可靠性。

    私密性

    现存的提供服务的方法是手机终端用户的数据并上传到云端,然后利用云端强大的处理能力去处理任务,在数据上传的过程中,数据很容易被别有用心的人收集到。为了保证数据的私密性,我们可以从以下这些方面入手。
    1,在网络的边缘处理用户数据,这样数据就只会在本地被存储、分析和处理。
    2,对于不同的应用设置权限,对私密数据的访问加以限制。
    3,边缘的网络是高度动态化的网络,需要有效的工具保护数据在网络中的传输。

    最优化指标

    在边缘计算当中,由于节点众多并且不同节点的处理能力是不同的,因此,在不同的节点当中选择合适的调度策略是非常重要的。接下来从延迟、带宽、能耗和花费这四个方面来讨论最优化的指标。

    • 延迟: 很明显云中心具有强大的处理能力,但是网络延迟并不单单是处理能力决定的,也会结合数据在网路中传输的时间。拿智慧城市距离来说,如果要寻找丢失的小孩儿信息,在本地的手机处理,然后把处理结果返回给云明显能加快响应速度。当然,这种事情也是相对而言的,我们需要放一个逻辑判断层,来判断把任务交给哪一个节点处理合适,如果此时手机正在打游戏或者处理其他非常重要的事情,那么手机就不是很适合处理这种任务,把这种任务交给其他层次来处理会更好些。
    • 带宽:高带宽传输数据意味着低延迟,但是高带宽也意味着大量的资源浪费。数据在边缘处理有两种可能,一种是数据在边缘完全处理结束,然后边缘结点上传处理结果到云端;另外一种结果是数据处理了一部分,然后剩下的一部分内容将会交给云来处理。以上两种方式的任意一种,都能极大的改善网路带宽的现状,减少数据在网络中的传输,进而增强用户体验。
    • 能耗:对于给定的任务,需要判定放在本地运算节省资源还是传输给其他节点计算节省资源。如果本地空闲,那么当然在本地计算是最省资源的,如果本地正在忙碌状态,那么把计算任务分给其他节点会更合适一些。权衡好计算消耗的能源和网络传输消耗的能源是一件非常重要的事情。一般当网络传输消耗的资源远小于在本地计算消耗的能源时,我们会考虑使用边缘计算把计算任务卸载到其他空闲的节点上,帮助实现负载均衡,保证每一个结点的高性能。
    • 花费:目前在边缘计算上的花费包括但不限于边缘结点的构建和维护、新型模型的开发等。利用边缘计算的模型,大型的服务提供商在处理相同工作的情况下能够获取到更大的利润。

    小结

    物联网的发展和云计算的推动使得边缘计算的模型出现在社区之中。在边缘结点处理数据能够提高响应速度,减少带宽,保证用户数据的私密性。这篇文章当中,我们提出了边缘计算可能在以后的生活中一些相关场景的运用,也提到了边缘计算以后发展的展望和挑战。希望以后有更多的同僚能够关注到这么一个领域。

    展开全文
  • 三、权重计算 1、上节回顾 上一节我们利用SPSS中的数据标准化方法及主成分分析法,得出了“解释的总方差”和“成分矩阵”(如下图) 接下来我们将利用主成分分析得出的数据计算指标权重 2、权重计算 (1)输入数据 ...

    三、权重计算

    1、上节回顾

    上一节我们利用SPSS中的数据标准化方法及主成分分析法,得出了“解释的总方差”和“成分矩阵”(如下图)在这里插入图片描述
    接下来我们将利用主成分分析得出的数据计算指标权重

    2、权重计算

    (1)输入数据
    将主成分分析中得出的“成分矩阵”及特征根复制的Excel中:
    在这里插入图片描述
    对应主成分分析的数据为:
    在这里插入图片描述
    (2)计算线性组合中的系数
    公式为:标准化数/对应主成分特征根的平方根.。直接上图。
    在这里插入图片描述
    在这里插入图片描述
    为方便描述,线性组合中的系数使用Excel中的标号,如“工业废水排放量”对应的两个系数分别为C8和D8。

    (3)计算综合得分模型中的系数
    公式为:(第一主成分方差x100xC8+第二个主成分方差x100xD8)/(第一主成分方差+第二主成分方差)
    注:建议先将方差x100再进行计算
    如图:蓝色和紫色为分别对应相乘的线性组合中的系数及主成分方差
    在这里插入图片描述
    其中主成分方差的数据为:
    在这里插入图片描述
    (4)权重计算(归一化)
    现在到了最后一步,计算权重,也即标准化,将所有指标进行归一化处理,使其权重综合为1。
    公式为:A指标权重=A指标综合得分模型系数/五指标综合得分模型之和。
    如图:
    在这里插入图片描述
    到这里,我们就得出了最终的结果。
    注:蓝色框中的数据是相同的,笔者这样做是为了美观及防止出错。
    (5)完整示范
    为方便大家使用Excel进行权重计算,在这里将笔者自己完整的Excel表格分享给大家:
    在这里插入图片描述
    (6)权重计算出负值的问题
    如果有朋友最终计算的结果出现了负值,说明不适用SPSS中的数据标准化处理,可以改用极差法重新标准化数据。下面介绍极差法,并用Excel进行实现。

    四、极差法标准化

    1、公式
    公式为:
    在这里插入图片描述
    如何区分指标时正向还是负向?如笔者的五项指标中吗,废水、废气、固体废弃物越多对环境来说越糟糕,因此为负向指标;绿地面积,建成区绿化率值越大对环境来说越好,因此为正向指标。

    2、使用Excel实现

    由于公式直接输入比较困难,因此笔者建议先计算最小、最大值,再计算最大值与最小值的差,最后计算得出结果。
    (1)计算最小值。如图:
    在这里插入图片描述
    (2)计算最大值
    在这里插入图片描述
    (3)计算【max-min】
    在这里插入图片描述
    (4)计算最终的标准化数值
    注意:这里要区分正负向指标
    首先是正向指标,如图:
    在这里插入图片描述
    然后是负向指标:
    在这里插入图片描述
    (5)0值的处理
    最终计算的可能出现0值,这时候为每一个0值加上0.01即可(如下图)。
    (6)完整示范
    在这里插入图片描述
    到此,极差法标注化处理就结束了。前面利用SPSS进行标准化得出权重为负值的朋友可以用极差法对数据进行重新标准化,再重新利用SPSS进行主成分分析,然后计算权重。

    下一节,我们将介绍耦合度及耦合协调度的计算方法,并使用Excel进行实现,实际计算出所有数值。

    展开全文
  • 卷积计算过程(单/RGB多通道) 特征图大小计算公式 转置卷积(反卷积)计算过程 空洞卷积计算过程 卷积计算过程(单/RGB多通道) 假设输入层的大小为 5 x 5,局部感受野(或称卷积核)的大小为 3 x 3,那么...

    感受野大小计算、卷积参数量与计算量、空洞卷积计算量与参数量

    卷积计算,反卷积计算,特征图大小计算,空洞卷积计算

    转自:https://www.jianshu.com/p/09ea4df7a788?utm_source=oschina-app

    • 卷积计算过程(单/RGB多通道)
    • 特征图大小计算公式
    • 转置卷积(反卷积)计算过程
    • 空洞卷积计算过程

     

    卷积计算过程(单/RGB多通道)

    假设输入层的大小为 5 x 5,局部感受野(或称卷积核)的大小为 3 x 3,那么输出层一个神经元所对应的计算过程(下文简称「卷积计算过程」)如下:

    每个卷积核对应的权重 W 在计算卷积过程中,值是固定的,我们称为权重共享

    如果将输入层想像成黑板,局部感受野就像是黑板擦,他会从左往右,从上至下的滑动,每次滑动 1 个步长(Stride)并且每次滑动都重复上述的计算过程,我们就可以得到输出的特征图(feature map),如下图:

    有时候,按照规定步数滑动到黑板边缘时,黑板擦一部分会露出在黑板外,这个时候就 不能够顺利执行卷积过程了,解决的方法是填充,常见的有两种填充(Padding)方法,第一种方法为 Valid,第二种方法为 Same,如下图所示:

    Valid 是丢弃的方法,比如上述的 input_width = 7,kernel_width = 5,stride = 3,只允许滑动 1 次,多余的元素则丢掉。

    Same 是补全的方法,对于上述的情况,允许滑动 3 次,但是需要补 4 个元素,左边补 2 个 0,右边补 2 个 0,这种方法则不会抛弃边缘的信息,关于如何计算填充数量会在下小节中讲到。

    在实际应用中,输入的都为彩色图像(RGB 三通道),也就是说输入的维度是 [图片数,图片高,图片宽,通道数],这个时候,执行卷积的过程如下:

    特征图大小的计算公式

    我们在设计和调整网络结构的时候,还需要快速知道调整了卷积核后,输出特征图的大小,假定:

    • 输入图片 i(只考虑输入宽高相等)
    • 卷积核大小 f
    • 步长 s
    • 填充的像素数 p

    那么输出的特征图大小 o 的计算公式则如下:

    • 当填充方式为 VALID 时,p 值等于 0,代入相应的 i,f,p,s 就可以相应的计算出 o 值了。

    • 当填充方式为 SAME 时,步长 s 为 1 时,输出的 o == i,我们则可以计算出相应的 P 值为 p = (f-1) / 2

    转置卷积(反卷积,逆卷积)的计算过程

    O=(i-1)*s + k

    空洞卷积的计算过程

    空洞卷积(Dilated convolutions)在卷积的时候,会在卷积核元素之间塞入空格,如下图所示:

    这里引入了一个新的超参数 d,(d - 1) 的值则为塞入的空格数,假定原来的卷积核大小为 k,那么塞入了 (d - 1) 个空格后的卷积核大小 n 为:

    进而,假定输入空洞卷积的大小为 i,步长 为 s ,空洞卷积后特征图大小 o 的计算公式为:

     

    展开全文
  • 工业相机视野与分辨率计算(相机选型与计算

    万次阅读 多人点赞 2018-06-28 14:08:33
    一、视场的计算方法二、光学放大倍率的计算方法三、焦距的计算方法提示:工业相机传感器尺寸大小1/4″:(3.2mm×2.4mm);1/3″:(4.8mm×3.6mm);1/2″:(6.4mm×4.8mm);2/3″:(8.8×6.6mm);1″:(12.8mm×9.6mm) ....
  • 并行计算
  • 输入想要计算到小数点后的位数,计算圆周率π的值。二、算法:马青公式π/4=4arctan1/5-arctan1/239这个公式由英国天文学教授约翰·马青于1706年发现。他利用这个公式计算到了100位的圆周率。马青公式每计算一项可以...
  • 【Python3】常见文本相似度计算方式及代码

    万次阅读 多人点赞 2019-04-19 23:02:54
    常见文本相似度计算方式及代码 文本相似度的计算广泛的运用在信息检索,搜索引擎, 文档复制等处: 因此在各种不同的情况与任务中,有不同的文本相似度计算。 近期在处理搜索引擎的相关项目 下面介绍一下我们主要使用...
  • 漫画:量子计算为什么这么牛?

    万次阅读 多人点赞 2020-09-07 08:55:00
    后记:我也不是量子计算的专家,对量子计算也只是了解一点儿皮毛,所以有读者问我“量子计算为什么这么牛”的时候,我发现我就很难像讲编程技术那样,通俗易懂,深入浅出地回答了。看了一些相关资料以...
  • 计算范式之并行计算

    万次阅读 2017-12-03 22:33:47
    在说我的主题云计算之前,我还行拓展一个很老的知识点,就是并行计算,这个概念应该是四五十年的历史了,在计算机里面应该是算是old的了。 摩尔定律大家都知道,简单说每年翻一倍,但这个定律过去几年随着intel CEO...
  • 流式计算、实时计算和离线计算

    万次阅读 2017-07-11 16:03:10
    流式计算和批处理计算 实时计算和离线计算 以水为例,Hadoop可以看作是纯净水,一桶桶地搬;而Storm是用水管,预先接好(Topology),然后打开水龙头,水就源源不断地流出来了。 1、流式计算 流式计算:数据...
  • 移动边缘计算——计算卸载

    千次阅读 2020-06-22 16:34:05
    一 边缘计算产生背景 随着移动通信技术的发展和智能终端的普及,用户对网络服务质量(QOS)、时延、带宽等网络性能要求越来越高。尽管新一代的移动设备中的CPU性能越来越强悍,依然无法在短时间内处理大量计算任务...
  • 超详细SPSS主成分分析计算指标权重(一)

    万次阅读 多人点赞 2019-03-13 20:58:51
    一、指标权重计算确定的困惑 相信很多写过或者正在写指标处理类论文的朋友都曾对如何计算指标权重充满困惑,到底是用熵值法,还是主成分分析法?或者其他各种看起来奥妙无穷却难以上手操作的神奇方法?好不容易确定...
  • 离线计算与实时计算

    千次阅读 2018-12-17 19:10:09
    离线计算? 离线计算:批量(batch)获取数据、批量传输数据、周期性批量计算数据、数据展示 代表技术:sqoop批量导入数据、HDFS批量存储数据、MapReduce批量计算数据、hive批量计算数据 hivesql 调度平台 ...
  • vue中computed计算属性传入参数

    万次阅读 2018-09-01 16:56:42
    使用JavaScript闭包,进行传值操作。 computed: { // 控制显示的内容 computedTxt() { return function(value) { return this.methodGetByteLen(value, 20) ...做一个简单的功能,使用计算属性判断传入的...
  • 连续登录天数计算

    万次阅读 热门讨论 2019-09-24 13:44:32
    最近有个需求,计算用户连续登录的最大天数,查了查网上的解决方案,基本上都没有解决跨月和跨年的情况;废话不多少,先看下登录日志数据表hive.traffic.access_user只有两个字段:uid,day;日期辅助表hive.ods.dim_...
  • 计算公式 二维空间的公式 其中,为点与点之间的欧氏距离;为点到原点的欧氏距离。 三维空间的公式 n维空间的公式
  • 如何计算数学期望

    万次阅读 2018-05-05 19:51:34
    数学期望的定义数学期望的计算公式例题1.数学期望的定义 在概率论和统计学中,数学期望(或均值)是试验中每次可能结果的概率乘以其结果的总和,是最基本的数学特征之一。它反映随机变量平均取值的大小。 随机变量...
  • 欧式距离计算公式

    万次阅读 多人点赞 2019-06-26 15:06:02
    欧式距离也称欧几里得距离,是最常见的距离度量,衡量的是多维空间中两个点之间的绝对距离。 也可以理解为:m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)...下面是具体的计算公式 ...
  • 批量计算按数据块来处理数据,每一个task接收一定大小的数据块,比如MR,map任务在处理完一个完整的数据块后(比如128M),然后将中间数据发送给reduce任务。 流式计算的上游算子处理完一条数据后,会立马发送给...
  • 并行计算和分布式计算有什么区别?谁能通俗易懂的讲解一下~谢谢啦
  • 矩阵特征值和特征向量详细计算过程

    万次阅读 多人点赞 2018-05-07 12:22:13
    1.矩阵特征值和特征向量定义 A为n阶矩阵,若数λ和n维非0列向量x满足Ax=λx,那么数λ称为A的特征值,x称为A的对应于特征值λ的特征向量。式Ax=λx也可写成( A-λE)x=0,并且|λE-A|叫做A 的...计算行列式得化简...
  • 无论是官方文档还是各位大神的论文或搭建的网络很多都是计算准确率,很少有计算误判率,下面就说说怎么计算准确率以及误判率1.计算正确率获取每批次的预判正确个数train_correct = (pred == batch_y.squeeze(1)).sum...
  • python实现三维坐标旋转计算

    万次阅读 2021-01-25 21:40:00
    空间三维坐标系旋转计算 计算空间三维坐标系变换一般都是利用旋转矩阵或者欧拉公式。python有个scipy库可以直接用于计算空间三维坐标变换。 支持库 pip install scipy 旋转矩阵计算代码 axis是旋转轴,radian旋转...
  • 给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。 输入格式: 输入在一行中给出一个华氏温度。 输出格式: 在一行中按照格式“Celsius = C...
  • VaR如何计算?VaR计算方法

    千次阅读 2020-04-23 22:41:10
    VaR的计算方法通常有三大类:分析法、历史模拟法和蒙特卡罗模拟法,这3种方法从不同角度来分析资产的风险价值。后面的案例中将对股指期货交易中金的最大损失值进行计算,即对金的VaR值进行估计。 1、分析法 ...
  • 并发计算 VS 并行计算

    千次阅读 2017-01-21 14:07:14
    上一篇文章中,我们学习了如何在CUDA中隐藏数据传输,而其中用到的主要技术就是并发计算。这时你可能会问,这个专栏不是CUDA并行计算吗?怎么又说什么并发计算呢?其实,这里所说的“CUDA并行计算”并
  • 移动计算

    千次阅读 2018-06-24 12:02:02
    移动计算是随着移动通信、互联网、分布式计算等技术的发展而兴起的新技术。移动计算技术将使计算机或其它信息智能终端设备在无线环境下实现数据传输及资源共享,将信息传递给远程服务器下的一种分布计算环境下的技术...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,902,387
精华内容 760,954
关键字:

计算