【Ref】
[1] 基础学习笔记之opencv(3):haartraining生成.xml文件过程
[2] 基础学习笔记之opencv(2):haartraining前将统一图片尺寸方法
[3] OpenCV实践之路——使用imread()函数读取图片的六种正确姿势
核相关滤波(Kernelized Correlation Filters, KCF) 是一个高速目标跟踪算法,目前存在的目标跟踪系统其核心组成是一个判别分类器,主要思想是通过给出的样本训练一个判别分类器,判别跟踪到的是目标还是背景,KCF目标跟踪算法利用循环行列式/矩阵(circulant matrices)表示图像块,对样本进行采集,用快速傅里叶变换对算法进行加速计算。
相关滤波(Correlation Filter, CF)是对MOSSE算法的改进,是后来CSK、STC、Color Attributes等Trackers的鼻祖,CF源于信号处理,后被用于图像分类;CF用于Tracking的思想是:两个信号越相似,其相关值越高;通过滤波模板,当作用于跟踪目标时,得到的响应最大,最大响应值的位置就是目标的位置(参考)。
CSK是CF算法改进的初级版本,KCF是对CSK进一步的改进。将只能用单通道的灰度特征改进为可以使用多通道的HOG特征,使用核函数计算偶相关滤波。
运行环境:VS2015 + OpenCV3.2.0_withsource,首先配置环境变量:
解决方法:“链接器”->“输入”—>“附加依赖项”,添加依赖项: opencv_tracking320d.lib
注:常用按键的ASCII码:
Esc : 27
Enter : 13
Ctrl + Enter : 10
空格 : 32
显示视频时,一般用cvWaitKey(delay)delay是延迟的ms数,表示显示一帧,然后等待delay ms,再显示下一帧,如果没有cvWaitKey()的话,循环里面的每个指令执行的时间为0.0000000001s,趋于0;如果capture有10000帧图像,那么只需要0.000001s就播放完了,几乎看不到画面。
显示图像时,一般在cvShowImage()函数后加一个cvWaitKey(0),显示图像后将暂停,等待接收一个键盘输入;没有这条语句的话,显示图像的代码很快就执行完了,看不到输出的图像。
【Ref】:
[1] High-speed tracking with kernelized
correlation filters.Pattern Analysis and Machine Intelligence, IEEE
Transactions on 37.3 (2015): 583-596.
[2] 目标跟踪-KCF高速跟踪详解
[3] Kernelized Correlation Filters
[4] Exploiting the Circulant Structure of Tracking-by-detection with Kernels
[5] Visual Object Tracking using Adaptive Correlation Filters
[6] GitHub_opencv_contrib
[7] KCF_OpenCV implementation
Convolution Neural Network(CNN,卷积神经网络)广泛应用于计算机视觉领域,如图像分类、人脸识别等;CNN是一种前馈神经网络,是深度学习中极具代表的网络结构之一,ImageNet数据集上许多成功的模型都是基于CNN的;与传统的图像处理算法相比,CNN的优点是避免了对图像复杂的前期预处理过程(提取人工特征等),它可以直接输入原始图像。CNN采用局部连接、权值共享等方法减少训练参数和训练时间。
经典的CNN结构为LeNet-5网络,结构如下:
CNN主要有两种类型的网络层,即卷积层和池化/采样层(Pooling),卷积层的作用是提取图像的各种特征;池化层的作用是对原始特征信号进行抽象,大幅度减少训练参数,减轻模型过拟合的程度。
卷积过程如下:
卷积层获取图像特征后,理论上可以用这些特征训练分类器,但计算量比较大,容易产生过拟合现象;为了降低网络训练参数及模型的过拟合程度,对卷积层进行池化/采样(Pooling)处理,有两种方式:
如下图所示:
LeNet-5在MNIST数据集上的结果:
【Ref】:
[1] Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks.
[2] 卷积神经网络(CNN)学习笔记1:基础入门
人脸检测(Face Detection)是定位图像中人脸的过程,主要任务是检测人脸,不关心是谁的人脸;
人脸识别(Face Recognition)是对已知人脸进行分类,比如看到一张人脸能判断出是否是他/她是否为自己的朋友,人脸识别通常包括以下步骤:
人脸检测方法主要分两类:基于先验
知识的方法,基于统计学习的方法:
基于先验知识的方法包括:
基于统计学习的方法:
Haar分类器是Boosting算法的一个应用,用到了Boosting算法中的AdaBoost算法,把AdaBoost算法训练出的强分类器级联,在底层的特征提取中采用高效的矩形特征和积分图方法。
简单理解:Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost + 级联。即:
① 用Haar-like特征做检测;
② 用积分图(Integral Image)对Haar-like特征求值进行加速;
③ 用AdaBoost算法训练区分人脸和非人脸的强分类器;
④ 用筛选式级联把强分类器级联到一起,提高准确率。
多尺度检测机制一般有两种:
① 不改变搜索窗口的大小,而不断绽放图片;这种方法显然需要对每个绽放后的图片进行区域特征值的运算,效率不高;
② 不断初始化搜索窗口size为训练时的图片大小,不断扩大搜索窗口,进行搜索,效率比第一种高。
ln命令用来为文件创建硬链接和符号链接,默认的链接类型是硬链接;如果要创建符号链接必须使用“-s”选项。
注:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以以符号链接文件设置存取权限是没有意义的。
ln (选项)(参数)
-b或–backup:删除,覆盖目标文件之前的备件;
-d或-F或–directory:建立目录的硬链接;
-f或–force:强行建立文件或目录的链接,否认文件或目录是否存在;
-n或–no-dereferenc:把符号链接的目标目录视为一般文件;
-s或–symbolic:对源文件建立符号链接;
–help
–version:显示版本信息。
注:硬链接只能引用同一文件系统中的文件,它引用的是文件在文件系统中的物理索引(inode),当移动或删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置,硬链接的文件不需要用户有访问原文件的权限,也不会显示原文件的位置,有助于文件的安全;如果删除的文件有相应的硬链接,那么这个文件依然会保留,直到所有对它的引用都被删除;
符号链接是一个指针,指向文件在文件系统中的位置,符号链接可以跨文件系统,甚至可以指向远程文件系统中的文件,符号链接只是指明了原文件的位置,用户需要对原文件的位置有访问权限才可以使用符号链接;若原文件被删除,所有指向它的符号链接也就都被破坏了,它们会指向文件系统中并不存在的一个位置;两种链接都可以通命令ln来创建,默认创建硬链接,使用-s选项创建符号链接。
符号链接与硬链接的区别?
硬链接记录的是目标的inode,符号链接记录的是目标的path;硬链接好比是备份,软链接好比是快捷方式,符号链接可以做跨分区的link,符号链接的使用频率要高。
附:涛哥演示lc_opencl_demo
ndk
echo %path% //显示环境变量
ndk-build //是否安装ndk
cls //清屏
dir //显示当前目录
cd .. //返回上一级目录
cd ../.. //返回上级目录的上级目录(返回2级目录)
cd dir //进入dir目录
adb devices //list all connected devices
adb root //restarts the adbd daemon with root permissions
adb shell //run remote shell interactively
adb root
adb remount //重新挂载文件系统
注:运行adb shell和adb root时提示 “error: more than one device/emulator”时
DPM是一个比较成功的目标检测算法,被应用到姿态估计、人脸识别、表情识别和场景分类等问题;是HOG(Histogram Orientd Gradients)的改进版本。HOG的计算方法如下:
预处理,早期的行人检测HOG特征描述符处理的图像大小是64×128,因此需要将原始图像调整为64×128大小:
计算梯度图像,首先计算水平和垂直梯度,可以通过下面的kernels对图像滤波实现:
也可以通过OpenCV中的Sobel算子来实现:
//C++ Gradient calculation
//Read image
Mat img = imread("xxx.jpg");
img.convertTo(img, CV_32F, 1/255.0);
//Calculate gradients gx, gy
Mat gx,gy;
Sobel(img, gx, CV_32F, 1, 0, 1);
Soble(img, gy, CV_32F, 1, 0, 1);
然后,计算梯度的幅度的方向:
同样也可以利用OpenCV自带的cartToPolar函数:
Mat mag, angle;
cartToPolar(gx, gy, mag, angle, 1);
梯度图像示意图:
梯度图像去除了大量的不必要的信息,突出了图像的轮廓
3.计算8×8cells的梯度直方图
首先将图像分成8×8大小的图像块,并计算每个图像块的梯度直方图;
为什么将图像分成大小为8×8的图像块?这是为了利用特征描述符对图像块进行压缩表示,一个8×8图像块包含8×8×3=192个像素值,图像块的每个像素的梯度又包含2个值(幅度和方向),总共8×8×2=128numbers;图像块表示法对噪声具有更强的鲁棒性。
为什么是8×8,不是32×32?因为HOG最初用于行人检测,行人图像的8×8图像块扩展到64×128后就足以捕捉感兴趣的特征(如人脸,头顶等)。
梯度直方图实质上是一个9bin的向量/数组,对应角度0,20,40,60,…,160。
注:直方图中bin的含义,颜色直方图将颜色空间划分成若干小的颜色区间,即直方图的bin,通过计算颜色在每个小敬意内的像素得到颜色直方图,bin越多,直方图对颜色的分辨率越强,但增加了计算机的负担;下图所分的5个竖条区域,每个竖条区域称为一个bin。
8×8图像块和梯度如下图:
Center: The RGB patch and gradients reprented using arrows.
Right: The gradients in the same patch represented as numbers.
梯度直方图的图解如下:
注:如果角度大于160,即在160~180之间,由于0和180是等价的,因此角度为165的像素按比例分配给0bin和160bin(距离0bin为15,距离160为5,分配为1:3)
8×8cells中所有像素的贡献叠加,最终形成了9bin的直方图,对上面的图像块,直方图类似下图:
4.16×16 Block 标准化
标准化可以消除比例的影响,从而对亮度更具鲁棒性;比如v1=[3, 4],向量的长度为5(L2 norm,2范数),标准化后为v1’= [0.6, 0.8];v2 = 2*v1 = [6, 8],标准化后也是v2’= [0.6, 0.8]。
source code HOG 1
source code HOG 2
【Ref】:
[1] Object Detection with Discriminatively Trained
Part Based Models
[2] Cascade Object Detection with Deformable Part Models∗
[3] source code DPM
[4] The representation and matching of pictorial structures
[5] Image Recognition and Object Detection : Part 1