最近应客户要求,需要做一个带有图片识别功能的web应用,OpenCV虽然高大上,用它来解决这个问题就是杀鸡用牛刀了,这个问题和面部识别,车牌识别的原理是不同的,在未知要分析的图片的特征的情况下,无法提取特征,只能采用比较通用的算法,也就是图片相似性比对算法,常见的有pHash和SIFT。windows下面就自己写了个类似的算法,可以凑合着用,为了提高性能,特别是识别精度和速度,就采用了linux下面php加 pHash 扩展来实现,可能是这个应用比较偏僻吧,网上只搜到两篇有参考意义的blog,里面错误比较多,很多地方牛头对不上马嘴,就把自己这次实现过程跟大家分享下,希望以后有需求的朋友,可以少走弯路。
运行环境如下 ,硬件,I3处理器2.4G双核,4G内存,软件, win7 ,+vmware worksatation10 ,+ubuntu12.04。 (apache 2.4 , php 5.7 )
怎么在虚拟机下安装 ubuntu ,设置让它能上网,安装一些编译程序需要的库, 这部分就忽略了。
php 开发环境搭建, 如果想省事的可以采用lnmp一键安装包,下载地址http://lnmp.org/install.html,
安装的时候 ,可以选择lnmpa ,就连apache也给安装上去了, 安装完毕 ,运行下 lnmp status , 可以看到 nginx ,myslq , php,apache,都在运行状态了 。
documentRoot :/home/wwwroot/default
浏览器 输入网址 localhost/phpinfo.php ,显示正常,说明安装成功。
下面开始安装pHash扩展 ,我参考的 网贴是http://blog.chinaunix.net/uid-11009135-id-3555712.html, 它下载的是 pHash-0.9.5.tar.gz , 如果你要安装0.9.5版本的就参照上面的方案, 我下载的是最新版的 pHash-0.9.6.tar.gz, 有可能差别在这里吧,0.9.6版本的需要依赖于ffmpeg , http://www.phash.org/download/ 从这个网址也能看出来 ,0.9.6版本需要依赖的东西,同时说明0.96版本功能是非常强大的,支持文本,图像, 音频,视频的感知近似性计算。 这个FFMPEG特别麻烦,安装了一天,依然不能正确生成ffmpeg的 so文件, 关于pHash0.9.6的 网上有一篇 文章http://blog.163.com/chen_r200509/blog/static/3411130020137554741878/ ,可以看到0.9.6版本才需要FFMPEG, 从他给出的 链接下载的ffmpeg 根本没有办法编译。 如果你只需要image 识别, 不考虑音视频, 那么可以不用FFMPEG的,那就考虑把对FFMPEG的依赖给去除了,这个需要很大的工作量,修改makefile 等文件, 还要修改 phash的 源文件 , 是在下面列出的步骤5和6中实现的,不是在4中实现。这个过程有点复杂, 但解决思路就是那样的,我也那么干的。至于你在编译安装FFMPEG的时候会不会遇到问题, 这个我也不确定,只能看你的运气了,哈哈,实在怕麻烦,就下载.0.95 版的吧。
下面我就贴出我的下载地址,编译安装步骤
1 wget http://cimg.eu/files/CImg_latest.zip
unzip CImg_latest.zip
cp CImg-1.7.5/CImg.h /usr/local/include
2 到 http://download.csdn.net/download/angle502/7632179
或者 https://github.com/erikd/libsndfile/ , 下载 libsndfile.zip
unzip libsndfile.zip
cd libsndfile
$ ./autogen.sh
$ ./configure --enable-werror
$ make
$ make check
3 http://download.csdn.net/download/dragon810913/2412579
下载 安装 libsamplerate0.1.7
解压,
进入 目录 libsamplerate
./configure
make
make install
4 wget http://ffmpeg.org/releases/ffmpeg-3.1.2.tar.bz2
tar -xjvf ffmpeg-3.1.2.tar.bz2
cd ffmpeg-3.1.2
./configure --enable-gpl --enable-shared --enable-swscale --disable-yasm
make
make install
顺便说下,我的电脑不知道什么原因,FFMPEG始终无法正常安装,所以,我花费了很大的力气,
在pHash编译的时候,将它彻底屏蔽了 才得以编译出正确的 pHash.so文件 , 我也只能说,祝你好运。
5 wget http://www.phash.org/releases/pHash-0.9.6.tar.gz
tar -xzvf pHash-0.9.6.tar.gz
$ cd pHash-0.9.6
$ ./configure --enable-video-hash=no --enable-audio-hash=no LIBS="-lpthread"
$ make && make install
6 $ cd pHash-0.9.6/bindings/php
$ phpize
$ ./configure LIBS="-lpthread" --with-php-config=/usr/local/php/bin/php-config
$ make
$ make test
$ make install
7 手工编辑 php.ini ,添加pHash扩展
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/pHash.so
# restart apache ,重启web服务器,,,如果是用lnmp安装包安装的话,可以尝试命令,lnmp restart
8 ldd /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/pHash.so
检查下 动态库依赖 是否完整,
php -m
查看下 php 加载了哪些扩展 , pHash.so有没有扩展成功
9 写个 测试 phash的php文件 , 用到phash的主要代码 ,
$h2=ph_dct_imagehash($ImagePath1);
$h1= h_dct_imagehash($ImagePath2);
$distance =ph_image_dist($h1, $h2);
==========下面的截图就是两张图片的比对结果=======
======= End====觉得博主辛苦的就去点个赞吧,哈哈=====
如果你上传几张图片,测试结果 ,发现自己的图片,有时间居然比猪还更像猪,那一点都不奇怪, 算法是死的,人是活的,有写时候工具,关键还要看你怎么去应用它。
While u find the Hamming distance between ur profile and a pig's , what i can say maybe is only u r tooo handsome !