Opencv HOG检测行人

Navneet Dalal的OLT工作流程描述

帖子opencviv » 2010-01-23 4:23

Navneet Dalal在以下网站提供了INRIA Object Detection and Localization Toolkit

http://pascal.inrialpes.fr/soft/olt/
Wilson Suryajaya Leoputra提供了它的windows版本
http://www.computing.edu.au/~12482661/hog.html
需要 Copy all the dll's (boost_1.34.1*.dll, blitz_0.9.dll, opencv*.dll) into "<ROOT_PROJECT_DIR>/debug/"

Navneet Dalal提供了linux下的可执行程序,借别人的linux系统,运行一下,先把总体流程了解了。
下面结合OLTbinaries\readme和OLTbinaries\HOG\record两个文件把其流程描述一下。
1.下载 INRIA person detection database 解压到OLTbinaries\;把其中的'train_64x128_H96' 重命名为 'train' ; 'test_64x128_H96' 重命名为 'test'.
2.在linux下运行 'runall.sh' script.
等待结果出来后,打开matlab 运行 plotdet.m 可绘制 DET曲线;
------这是一步到位法--------------------------------------------------
-------此外,它还提供了分步执行法-------------------------------------
1、由pos.lst列表提供的图片,计算正样本R-HOG特征,pos.lst列表格式如下
train/pos/crop_000010a.png
train/pos/crop_000010b.png
train/pos/crop_000011a.png
------以下表示-linux下执行语句(下同)------
./bin//dump_rhog -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0 --wtscale 2 --maxvalue 0.2 -- epsilon 1 --fullcirc 0 -v 3 --proc rgb_sqrt --norm l2hys -s 1 train/pos.lst  HOG/train_pos.RHOG
2.计算负样本R-HOG特征
./bin//dump_rhog -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0 --wtscale 2 --maxvalue 0.2 -- epsilon 1 --fullcirc 0 -v 3 --proc rgb_sqrt --norm l2hys -s 10 train/neg.lst HOG/train_neg.RHOG
3.训练
./bin//dump4svmlearn -p HOG/train_pos.RHOG -n HOG/train_neg.RHOG HOG/train_BiSVMLight.blt -v
4.创建 model file: HOG/model_4BiSVMLight.alt
./bin//svm_learn -j 3 -B 1 -z c -v 1 -t 0 HOG/train_BiSVMLight.blt HOG/model_4BiSVMLight.alt
5.创建文件夹
mkdir -p HOG/hard
6.分类
./bin//classify_rhog train/neg.lst HOG/hard/list.txt HOG/model_4BiSVMLight.alt -d HOG/hard/hard_neg.txt -c HOG/hard/hist.txt -m 0 -t 0 --no_nonmax 1 --avsize 0 --margin 0 --scaleratio 1.2 -l N -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0 --wtscale 2 --maxvalue 0.2 --
epsilon 1 --fullcirc 0 -v 3 --proc rgb_sqrt --norm l2hys
--------
false +/- 分类结果会写入 HOG/hard/hard_neg.txt
7. 将hard加入到neg,再次计算RHOG特征
./bin//dump_rhog -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0 --wtscale 2 --maxvalue 0.2 -- epsilon 1 --fullcirc 0 -v 3 --proc rgb_sqrt --norm l2hys -s 0 HOG/hard/hard_neg.txt OG/train_hard_neg.RHOG --poscases 2416 --negcases 12180 --dumphard 1 --hardscore 0 -- memorylimit 1700
8.再次训练
./bin//dump4svmlearn -p HOG/train_pos.RHOG -n HOG/train_neg.RHOG -n HOG/train_hard_neg.RHOG HOG/train_BiSVMLight.blt -v 4
9.得到最终的模型
./bin//svm_learn -j 3 -B 1 -z c -v 1 -t 0 HOG/train_BiSVMLight.blt HOG/model_4BiSVMLight.alt
Opencv中用到的3780 个值,应该就在这个模型里面model_4BiSVMLight.alt,不过它的格式未知,无法直接读取,但是可以研究svm_learn程序是如何生成它的;此外,该模型由程序classify_rhog调用,研究它如何调用,估计是一个解析此格式的思路
10.创建文件夹
mkdir -p HOG/WindowTest_Negative
11.负样本检测结果
./bin//classify_rhog -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0 --wtscale 2 --maxvalue 0.2 --epsilon 1 --fullcirc 0 -v 3 --proc rgb_sqrt --norm l2hys -p 1 --no_nonmax 1 --nopyramid 0 - -scaleratio 1.2 -t 0 -m 0 --avsize 0 --margin 0 test/neg.lst HOG/WindowTest_Negative/list.txt HOG/model_4BiSVMLight.alt -c HOG/WindowTest_Negative/histogram.txt
12.创建文件夹
mkdir -p HOG/WindowTest_Positive
13.正样本检测结果
./bin//classify_rhog -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0 --wtscale 2 --maxvalue 0.2 -- epsilon 1 --fullcirc 0 -v 3 --proc rgb_sqrt --norm l2hys -p 1 --no_nonmax 1 --nopyramid 1 -t 0 -m 0 --avsize 0 --margin 0 test/pos.lst HOG/WindowTest_Positive/list.txt  HOG/model_4BiSVMLight.alt -c HOG/WindowTest_Positive/histogram.txt
最后由 opencviv 编辑于 2010-01-27 3:15,总共编辑了 1 次
opencviv
OpenCV小学生
 
帖子: 11
注册: 2010-01-20 12:59

如何制作训练样本

帖子opencviv » 2010-01-23 4:28

分析了原作者的数据集,结合网上一些资料,下面描述如何制作训练样本
1、如何从原始图片生成样本
对比INRIAPerson\INRIAPerson\Train\pos(原始图片),INRIAPerson\train_64x128_H96\pos(生成样本)可以发现,作者从原始图片裁剪出一些站立的人,要求该人不被遮挡,然后对剪裁的图片left-right reflect。以第一张图片为例crop001001,它剪裁了2个不被遮挡的人,再加上原照片,共3张,再加左右镜像,总共6张。
2、裁剪
 可利用基于opencv1.0的程序imageclipper,进行裁剪并保存,它会自动生成文件名并保存在同一路径下新生成的imageclipper文件夹下。
3.改变图片大小
 可以利用Acdsee软件,Tools/open in editor,进去后到Resize选项; tools/rotate还可实现left-right reflect

自己编了一个程序,批量改变图片大小,代码见下一楼

4. 制作pos.lst列表
  进入dos界面,定位到需要制作列表的图片文件夹下,输入 dir /b> pos.lst,即可生成文件列表;
opencviv
OpenCV小学生
 
帖子: 11
注册: 2010-01-20 12:59

自动批量改变图片大小程序

帖子opencviv » 2010-01-23 4:35

#include "cv.h"
#include "highgui.h"
#include "cvaux.h"


int main(int argc,char * argv[])
{
IplImage* src ;
IplImage* dst = 0;

CvSize dst_size;

FILE* f = 0;
char _filename[1024];
int l;

f = fopen(argv[1], "rt");
if(!f)
{
fprintf( stderr, "ERROR: the specified file could not be loaded\n");
return -1;
}

for(;;)
{
char* filename = _filename;
if(f)
{
if(!fgets(filename, (int)sizeof(_filename)-2, f))
break;
if(filename[0] == '#')
continue;
l = strlen(filename);
while(l > 0 && isspace(filename[l-1]))
--l;
filename[l] = '\0';
src=cvLoadImage(filename,1);
}

dst_size.width = 96;
dst_size.height = 160;
dst=cvCreateImage(dst_size,src->depth,src->nChannels);
cvResize(src,dst,CV_INTER_LINEAR);//
char* filename2 = _filename;char* filename3 = _filename; filename3="_96x160.jpg";
strncat(filename2, filename,l-4);
strcat(filename2, filename3);

cvSaveImage(filename2, dst);

}
if(f)
fclose(f);

cvWaitKey(-1);
cvReleaseImage( &src );
cvReleaseImage( &dst );

return 0;
}
opencviv
OpenCV小学生
 
帖子: 11
注册: 2010-01-20 12:59

直接利用OpenCV2.0计算检测算子

帖子opencviv » 2010-01-23 5:36

仔细分析了cvhop.cpp中的compute函数,可以直接调用它来获得样本HOG,然后训练得到检测算子

1.制作样本
2.对每一张图片调用
hog.compute(img, descriptors,Size(8,8), Size(0,0));
可以生成hog descriptors,把它保存到文件中
for(int j=0;j<3780;j++)
fprintf(f,"%f,",descriptors[j]);
3.利用SVM进行训练和分类,可得到权重系数,即getDefaultPeopleDetector()函数中调用的
检测 算子 detector[]
opencviv
OpenCV小学生
 
帖子: 11
注册: 2010-01-20 12:59

使用libsvm求取权重

帖子opencviv » 2010-01-27 3:18

--------使用libsvm求取权重,即OpenCv中的detector[]----------

直接使用libsvm,需要按它的格式构造数据,下面简述在matlab下使用libsvm

下载libsvm-mat-2.9-1
方法1:
切换到libsvm-mat-2.9-1所在的目录下,打开MATLAB键入:
mex -setup

方法2:matlab菜单 File-->set path 将libsvm-mat-2.9-1所在路径添加进来。
----------------------
下面以libsvm-mat-2.9-1自带的heart_scale为例进行介绍

-----------kernel_type为线性----------------------------------
load heart_scale.mat
train_data = heart_scale_inst(1:150,:);
train_label = heart_scale_label(1:150,:);
test_data = heart_scale_inst(151:270,:);
test_label = heart_scale_label(151:270,:);
model_linear = svmtrain(train_label, train_data, '-t 0');
[predict_label_L, accuracy_L, dec_values_L] = svmpredict(test_label, test_data,model_linear);
----------训练后得到模型-------

model_linear =

Parameters: [5x1 double]
nr_class: 2
totalSV: 58
rho: -1.1848
Label: [2x1 double]
ProbA: []
ProbB: []
nSV: [2x1 double]
sv_coef: [58x1 double]
SVs: [58x13 double]
-----------如何从模型中求取权重系数----
参考以下网站,可知 
http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f804

对于2类问题,可如下求解线性问题(y=wx+b)的权重系数w和b

w = model_linear.SVs' * model_linear.sv_coef;
b = -model_linear.rho;

---------

求出的w即是OpenCv中的detector[]


转载OPencv论坛 http://www.opencv.org.cn/forum/viewtopic.php?t=9146#p35246
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值