图像梯度

Opencv和C++实现canny边缘检测

匿名 (未验证) 提交于 2019-12-03 00:30:01
Canny边缘检测主要包括: 图像的灰度化; 图像的高斯滤波; 计算出每一个像素点位置的梯度(X方向梯度、Y方向梯度、已经该点的梯度幅值)和方向角度; 局部非极大值抑制处理; 双阈值处理和连接处理; Canny算法思路参考下面的博客: https://blog.csdn.net/dcrmg/article/details/52344902 https://www.cnblogs.com/love6tao/p/5152020.html 我在下面直接给出可以运行的C++代码(Opencv2.4.9) #include <iostream> #include "opencv2/opencv.hpp" using namespace std ; using namespace cv; /* 生成高斯卷积核 kernel */ void Gaussian_kernel( int kernel_size, int sigma, Mat &kernel) { const double PI = 3.1415926 ; int m = kernel_size / 2 ; kernel = Mat(kernel_size, kernel_size, CV_32FC1); float s = 2 * sigma*sigma; for ( int i = 0 ; i < kernel_size; i++

机器学习---梯度下降算法

匿名 (未验证) 提交于 2019-12-03 00:30:01
参考文章: http://ruder.io/optimizing-gradient-descent/ tensorflow-梯度下降 (代码) 深度解读最流行的优化算法:梯度下降(精简版) 这里主要进行梯度公式推导,基本知识和内容可参考上述博客: (一)、Cost Function 线性回归是给出一系列点假设拟合直线为h(x)=theta0+theta1*x, 记Cost Function为J(theta0,theta1) 之所以说 单参数是因为只有一个变量x,即影响回归参数 θ1, θ0的是一维变量 ,或者说输入变量只有一维属性。 下图中为简化模式,只有theta1没有theta0的情况,即拟合直线为h(x)=theta1*x 左图为给定theta1时的直线和数据点 × 右图为不同theta1下的cost function J(theta1) cost function plot: 当存在两个参数theta0和theta1时,cost function是一个三维函数,这种样子的图像叫 bowl-shape function 将上图中的cost function在二维上用不同颜色的等高线映射为如下右图,可得在左图中给定一个(theta0,theta1)时又图中显示的cost function. 我们的目的是最小化cost function,即上图中最后一幅图,theta0=450

梯度弥散与梯度爆炸

匿名 (未验证) 提交于 2019-12-03 00:17:01
问题描述 先来看看问题描述。 当我们使用sigmoid funciton 作为激活函数时,随着神经网络hidden layer层数的增加,训练误差反而加大了,如上图所示。 下面以2层隐藏层神经网络为例,进行说明。 结点中的柱状图表示每个神经元参数的更新速率(梯度)大小,有图中可以看出,layer2整体速度都要大于layer1. 我们又取每层layer中参数向量的长度来粗略的估计该层的更新速率,得到下图。 可以看出,layer2的速率都要大于layer1. 然后我们继续加深神经网络的层数。 可以得到下面的结论: 靠近输出层的hidden layer 梯度大,参数更新快,所以很快就会收敛; 而靠近输入层的hidden layer 梯度小,参数更新慢,几乎就和初始状态一样,随机分布。 在上面的四层隐藏层网络结构中,第一层比第四层慢了接近100倍!! 这种现象就是 梯度弥散(vanishing gradient problem) 。而在另一种情况中,前面layer的梯度通过训练变大,而后面layer的梯度指数级增大,这种现象又叫做 梯度爆炸(exploding gradient problem) 。 总的来说,就是在这个深度网络中, 梯度相当不稳定(unstable)。 直观说明 那么为何会出现这种情况呢? 现在我们来直观的说明一下。 在上面的升级网络中,我们随意更新一个参数,加上一个Δw

深度学习入门

匿名 (未验证) 提交于 2019-12-03 00:15:02
Deep Learning with Pytorch_002 chapter03_深入研究神经网络的构建块 在上一章中,我们使用Py Torch的低级操作来构建模块,如网络体系结构、损失函数和优化器。在本章中,我们将探讨解决现实世界问题所需的神经网络的一些重要组成部分,以及PyTorch如何通过提供大量的高级函数来抽象出大量的复杂性。 本章将讨论以下主题: 深入研究神经网络的各种构建块 探索PyTorch中的高级功能来构建深度学习体系结构 将深度学习应用在一个真实图像分类问题 任何深入的学习训练都需要获取数据,构建一个总体上是将一堆层聚集在一起的体系结构。 理解PyTorch为构建层、损失函数和优化器提供的更高层次的抽象。 层次――神经网络的基本块 最重要的层之一――线性层 对输入的数据应用线性变换: y = x A T + b y y = xA^T + by y = x A T + b y torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor 返回一个由均值为0、方差为1的正态分布(标准正态分布)中的随机数组成的张量。 o u t i N ( 0 , 1 ) o u t i N ( 0 , 1 ) torch.from

【PyTorch】PyTorch中的梯度累加

匿名 (未验证) 提交于 2019-12-03 00:13:02
PyTorch中在反向传播前为什么要手动将梯度清零? - Pascal的回答 - 知乎 https://www.zhihu.com/question/303070254/answer/573037166 这种模式可以让梯度玩出更多花样,比如说梯度累加(gradient accumulation) 传统的训练函数,一个batch是这么训练的: for i,(images,target) in enumerate(train_loader): # 1. input output images = images.cuda(non_blocking=True) target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=True) outputs = model(images) loss = criterion(outputs,target) # 2. backward optimizer.zero_grad() # reset gradient loss.backward() optimizer.step() 获取loss:输入图像和标签,通过infer计算得到预测值,计算损失函数; optimizer.zero_grad() 清空过往梯度; loss.backward() 反向传播, 计算当前梯度 ;

OpenCV(四)之图像梯度处理

匿名 (未验证) 提交于 2019-12-03 00:01:01
OpenCV(四)之图像梯度处理 Gradient processing系列 Gradient processing-Sobel算子 Gradient processing-Scharr算子 Gradient processing-Laplacian算子 Gradient processing-计算梯度计算的对比 Gradient processing系列 在这一节中,我分析了关于图像梯度处理的几个方法,分析原理,代码实现,并观察有何差异。 Gradient processing-Sobel算子 对于 x -导数,或对 y -导数进行转置。 该函数通过将图像与适当的内核进行卷积来计算图像导数: Sobel 算子结合了高斯平滑和微分,因此结果或多或少地抵抗噪声。 大多数情况下,使用( xorder = 1 , yorder = 0 , ksize = 3 )或( xorder = 0 , yorder = 1 , ksize = 3 ), 调用函数以计算第一个 x 或 y 图像导数。 第一种情况对应于以下内核: 第二种情况对应于以下内核: 参数 SRC 输入图像。 DST 输出与 src 相同大小和相同通道数的图像。 ddepth 输出图像深度,见# combinations ; 在 8 位输入图像的情况下,它将导致截断的导数。 DX 导数 x 的顺序。 DY 导数 y 的顺序。

沈俊边缘查找算法(一)

匿名 (未验证) 提交于 2019-12-02 23:52:01
此文留作记录。其算法流程是先用对称指数函数对图像卷积,然后减去原图使差值大于0处置1,其它置0,然后找Blob,过滤面积较小的Blob,用Blob的边缘作为形状边缘,然后对边缘点的梯度值(以边缘点附近W窗口范围内的平均灰度差作为梯度)进行过滤得到最终的边缘。

**深度学习调参技巧**

匿名 (未验证) 提交于 2019-12-02 22:56:40
(网上经验总结) 参考1: https://blog.csdn.net/chenzhi1992/article/details/52905569 获取数据: 确保要有高质量的输入/输出数据集,这个数据集要足够大、具有代表性以及拥有相对清楚的标签。 预处理: (数据保持零均值和较小的方差)将数据进行集中,也就是要使数据均值为0,从而使每个维度的每次变动为1。有时,当输入的维度随量级排序变化时,最好使用那个维度的log(1+x)。基本上,重要的是要找到一个0值的可信编码以及自然分界的维度。(如果x的均值很大(例如100),那么权值的更新将会非常大,并且是相互关联的,这使得学习变得低劣而缓慢。) 批处理: 在如今的计算机上每次只执行一个训练样本是很低效的。反之如果进行的是128个例子的批处理,效率将大幅提高,因为其输出量是非常可观的。事实上使用数量级为1的批处理效果不错,这不仅可获得性能的提升同时可降低过度拟合;不过这有可能会被大型批处理超越。但不要使用过大的批处理,因为有可能导致低效和过多过度拟合。所以我的建议是:根据硬件配置选取适合的批处理规模,量力而为会更加高效。 梯度归一化: 根据批处理的大小来拆分梯度。因为如果对批处理进行倍增(或倍减),无需改变学习率(无论如何,不要太多)。 学习率计划: 从一个正常大小的学习率(LR)开始,朝着终点不断缩小。 学习率计划:

caffe2 教程入门(python版)

匿名 (未验证) 提交于 2019-12-02 22:54:36
Caffe2 Tutorials 原文链接: caffe2 教程入门(python版) ѧϰ˼· 1、先看官方文档,学习如何使用python调用caffe2包,包括 Basics of Caffe2 - Workspaces, Operators, and Nets Toy Regression Image Pre-Processing Loading Pre-Trained Models MNIST - Create a CNN from Scratch caffe2官方教程以python语言为主,指导如何使用python调用caffe2,文档依次从最基本caffe中的几个重要的类的概念、如何使用基础类搭建一个小网络、如何数据预处理、如何使用预训练的模型、如何构造复杂的网络来讲述caffe2的使用。初学者可以先行学习官方文档 caffe2-tutorials ,理解caffe2 中的网络构建、网络训练的理念与思路,体会caffe2与caffe在整体构造上的不同。 2、结合着caffe2源码看python实际调用的c++类 在python中,caffe2这个包中类与函数大部分是封装了源码文件夹caffe2/caffe2/core下的c++源文件,如基础数据类Tensor,操作类Operator等,通过使用python中类的使用,找到对应c++源码中类和函数的构造和实现,可以为使用c

【转载】【收藏】机器学习与深度学习核心知识点总结

耗尽温柔 提交于 2019-12-02 19:02:56
原文地址: https://cloud.tencent.com/developer/article/1526902 数学 1.列举常用的最优化方法 梯度下降法 牛顿法 拟牛顿法 坐标下降法 梯度下降法的改进型如AdaDelta,AdaGrad,Adam,NAG等。 2.梯度下降法的关键点 梯度下降法沿着梯度的反方向进行搜索,利用了函数的一阶导数信息。梯度下降法的迭代公式为: 根据函数的一阶泰勒展开,在负梯度方向,函数值是下降的。只要学习率设置的足够小,并且没有到达梯度为0的点处,每次迭代时函数值一定会下降。需要设置学习率为一个非常小的正数的原因是要保证迭代之后的x k +1位于迭代之前的值x k 的邻域内,从而可以忽略泰勒展开中的高次项,保证迭代时函数值下降。 梯度下降法只能保证找到梯度为0的点,不能保证找到极小值点。迭代终止的判定依据是梯度值充分接近于0,或者达到最大指定迭代次数。 梯度下降法在机器学习中应用广泛,尤其是在深度学习中。AdaDelta,AdaGrad,Adam,NAG等改进的梯度下降法都是用梯度构造更新项,区别在于更新项的构造方式不同。对梯度下降法更全面的介绍可以阅读SIGAI之前的文章“ 理解梯度下降法 ”。 3.牛顿法的关键点 牛顿法利用了函数的一阶和二阶导数信息,直接寻找梯度为0的点。牛顿法的迭代公式为: 其中H为Hessian矩阵,g为梯度向量