1 浅谈稀疏表示和压缩感知
写这篇博客是应为需要用稀疏表示做人脸识别(当时还没有做完,效果也还不清楚),要求用C++实现,理所应当想到应该借用opencv这个开源工具,可惜发现仅仅opencv还是不够,需要用到压缩感知,详见:
http://blog.csdn.net/hechenghai/article/details/41777585
可以说稀疏表示是借用了压缩感知的理论基础(零范数和一范数最小化问题),至于稀疏表示的原理,在这里就不在赘述,网上讲得已经十分清楚。
稀疏表示用matlab代码实现的话要相对容易些,各种科研代码网上都能下载得到,但用C++实现的例子则不多,上面那篇博客实现了稀疏表示中最早也是最经典的SRC方法,对于入门非常有帮助,但问题是需要用到一个压缩感知库kl1p,关于它的配置方法网上中文资料不多。
2 什么是kl1p
kl1p是一个压缩感知方面的C++库,里面封装了很多压缩感知方法,在稀疏表(SRC)示中主要是借助它来求取l1范数最小化问题。
3 配置kl1p
事实上kl1p是有官方的配置文档的,支持unix,windows,ios等等,可以是英文,原配置文档的地址:https://svn.code.sf.net/p/kl1p/code-0/trunk/README.txt官方文档中讲解的比较详细,下面只说一下其在windows中vs2012编译器下的配置方法。
3.1 下载软件
Kl1p下载地址:http://kl1p.sourceforge.net/download.html,得到一个压缩包,解压一个路径下即可使用,例如D:\ kl1p-0.4.2-sources;
3.2 编译Kl1p
在" build\win"目录下有一个名为“KLab.vcxproj”的VC++工程文件,接下来只需对它进行编译就OK了。
打开visual studio 2012,按SHIFT+CTRL+O组合键,在“打开项目”窗口中打开上面的这个工程文件,按F5进行编译运行,将弹出如下窗口,点击确定:
点击确定后将弹出一个提示框,询问是否要有新的vs2012编译器编译编译这些早期项目,这里一定要选择“更新”:
项目打开后,按F5调试运行,编译器开始编译生成.lib文件:
生成成功后,可能会弹出一个报错对话框,直接点击确认即可关闭
在Realse模式下载进行同样的生成操作:
至此,在“bin\win”目录下将生成两个.lib文件:KLab.lib和KLab_d.lib,其中以“_d”结尾的是Debug模式下链接的库文件,我们要用Kl1p这个压缩感知库,实际上指的就是这两个。
3.3 在VS2012中配置Kl1p
在VS2012中配置Kl1p主要分为两个步骤:加载头文件以及加载链接库文件。
3.3.1 加载头文件
新建一个win32控制台应用程序,把最开始提到的博客中的代码复制到里面,此时应为还未配置,所以显示include的文件不存在:
在菜单中选择“项目->属性”,弹出属性对话框,在“配置属性->VC++目录”中找到包含目录的选项:
在“包含目录”中加入以下include路径:
D: \kl1p-0.4.2-sources\KL1p-0.4.2\libs\KSci\include
D: \kl1p-0.4.2-sources\KL1p-0.4.2\libs\KLab\include
D:\ kl1p-0.4.2-sources\KL1p-0.4.2\libs\KLab\include\win
D: \kl1p-0.4.2-sources\KL1p-0.4.2\libs\KL1p\include
D: \kl1p-0.4.2-sources\KL1p-0.4.2\libs\Armadillo\include\armadillo_bits
D: \kl1p-0.4.2-sources\KL1p-0.4.2\libs\Armadillo\include
D: \kl1p-0.4.2-sources\KL1p-0.4.2\include
3.3.2 加载库文件
同样,在属性对话框“配置属性->VC++目录”中找到“库目录”,在其中加入以下条目:D: \kl1p-0.4.2-sources\KL1p-0.4.2\bin\win;
在属性对话框“配置属性->链接器->输入”的“附加依赖项”中,加入以下条目:
KLab_d.lib(Release中则用KLab.lib)
4 运行工程
完成以上配置后,按F5来运行工程,有可能会出现以下错误:
此时只要对程序做一下小小的修改即可:在属性对话框中“配置属性->C/C++ ->代码生成”中找到“运行库”,选择“多线程调试 (/MTd)”即可。
至此,Kl1p库在VS2012中的配置已经完成,当然,如果想把这段代码完全运行出来,还需要配置opencv并且准备人脸的训练样本和测试样本。opencv的配置在网上已有很多教程,至于样本库的准备,对于做人脸识别的人来说肯定不会陌生,这里就不在赘述了。
需要说明的一点是,官方给出的配置文档中的做法比较复杂,需要用的Cmake之类的,上面个的方法算是一种利用vs2012编译器兼容功能的投机取巧的方法,大家也可以按照官方文档的方法配置,有兴趣的可以加QQ群51701853一起交流。
最后一点建议:想研究稀疏表示,还是有Matlab吧,C++的参考代码实在太少了。