人脸姿态估计 (1)
人脸姿态估计指的是根据一幅2维的人脸图像,计算出这个人在实际3维空间中的面部朝向。问题的输入条件就是一张人脸图片,输出自然就是可以表示方位的三个旋转角度 (pitch, yaw, roll),其中 pitch 表示俯仰角(关于x轴的旋转角度),yaw 表示偏航角(关于y轴的旋转角度),roll 表示翻滚角(关于z轴的旋转角度),分别如下面 3 图所示:(说句题外话,如果我们把下面图中的物体看作是一架向我们飞来的飞机,就可以理解为何这三个角要如此命名了)
算法的思路很简单,可以考虑这样一种场景,假设我们有一张标准的3d人脸模型,如果投影和输入图片的人脸大致重合,那么此时 3d 模型的方位就可以看作是图片中人脸在实际空间中的方位了。如果投影和图像的差异很大,那我们再对 3d 模型...
点我阅读更多...
为何要对数据归一化或标准化
对数据进行归一化或者标准化是一种常用的数据预处理步骤,一般给出的解释是消除数据量纲差异对模型训练的影响,为了搞清楚会产生何种影响,我们尝试使用自造的数据集来一次模拟分析。
现在给一个3维空间中的平面
\[z(x, y) = 100 x + 20 y\]
在此平面附近随机生成样本集合 \(S = {(x_i, y_i, z_i)\mid i=1…n, 0\le x \le 10, 0 \le y \le 50}\),然后利用这个样本集来做回归学习,将模型定义为
\[\hat{z}(x, y) = \theta_1 x + \theta_2 y\]
其中 \(\theta_1 , \theta_2\) 便是要训练的系数。
下面我们生成训练数据,方法是在上述平面上取点,并添加随机...
点我阅读更多...
OpenCV 图像处理——描边
实现效果
关键函数
/**
* Imgproc.java
* @param src 原图
@param dst 目标图
@param kernel 膨胀参数
*/
public static void dilate(Mat src, Mat dst, Mat kernel)
实现思路
分离出 alpha 通道;
Core.split(img, channels);
Mat alpha = channels.get(3);
应用 dilate 函数膨胀;
Mat kernel = Mat.ones(thick, thick, CvType.CV_32S)
dilate(alpha, alpha, kernel)
为原始图...
点我阅读更多...
OpenCV 图像处理——旋转
实现效果
保持原图内容不发生缩放;
旋转后空缺的区域为透明色;
关键函数
/**
* Imgproc.java
* 计算旋转矩阵
*/
public static Mat getRotationMatrix2D(Point center, double angle, double scale)
/**
* Imgproc.java
* 应用仿射变换
*/
public static void warpAffine(Mat src, Mat dst, Mat M, Size dsize, int flags, int borderMode, Scalar borderValue)
实现思路
首先尝试一下最简单的实现
Mat src = ......
点我阅读更多...
用于高效相似搜索的局部敏感哈希算法
问题背景
最近的项目遇到一个问题,我们的程序要不停的处理第三方源源不断发送过来的图片,出于某种需要,如果收到的图片和前面的图片有重复或者相似,那么就不再处理了。由于数据量很大,不可能每收到一张图片就暴力的对比前面的所有图片,所以就需要一种能够快速进行相似搜索的算法。当然类似的问题已经有很多成熟的方案了,这里就记录一下我所理解的局部敏感哈希算法原理。
问题分解
相似搜索大致可以分为下面几个子问题:
对我们要搜索的对象做编码,将需要占据大量内存的图片、文本或者其他什么玩意儿映射成一个字符串或者整数,此编码在这里又被称为签名向量;
选择距离度量函数,确保相似的签名在度量空间中有较近的距离;
建立签名向量的数据结构,使得相似签名可以很高效的搜索出来。
第一个问题我们采用...
点我阅读更多...