OpenCV:Adaboost训练时数据扩增
更准确的模型需要更多的数据,对于传统非神经网络机器学习方法,不同的特征需要有各自相符合的数据扩增方法。
1. 在使用opencv_traincascade.exe 过程中,图像读取在
classifier.train -> updateTrainingSet( requiredLeafFARate, tempLeafFARate )->fillPassedSamples( 0, numPos, true, 0, posConsumed )->imgReader.getPos( img ) : imgReader.getNeg( img )过程中。
2. 在进行数据增强的过程中,从createSample开始,保证vecFile和样本数目长度一致。
修改代码段依次为:
//int cvCreateTrainingSamplesFromInfoRf(const char* infoname, const char* vecfilename,
int cvCreateSamplesPlus(const char* infoname, const char* vecfilename, int num,
int showsamples,
int winwidth, int winheight)
{
CvEnhanseData enhanser; char fullname[PATH_MAX];
char* filename; FILE* info;
FILE* vec;
//IplImage* src = 0;
//IplImage* sample;
cv::Mat src, sample;
int line;
int error;
int i;
int x, y, width, height;
int total; assert(infoname != NULL);
assert(vecfilename != NULL); total = 0;
if (!icvMkDir(vecfilename))
{ #if CV_VERBOSE
fprintf(stderr, "Unable to create directory hierarchy: %s\n", vecfilename);
#endif /* CV_VERBOSE */ return total;
} info = fopen(infoname, "r");
if (info == NULL)
{ #if CV_VERBOSE
fprintf(stderr, "Unable to open file: %s\n", infoname);
#endif /* CV_VERBOSE */ return total;
} vec = fopen(vecfilename, "wb");
if (vec == NULL)
{ #if CV_VERBOSE
fprintf(stderr, "Unable to open file: %s\n", vecfilename);
#endif /* CV_VERBOSE */ fclose(info); return total;
} //sample = cvCreateImage(cvSize(winwidth, winheight), IPL_DEPTH_8U, 1); icvWriteVecHeader(vec, num, winwidth, winheight); if (showsamples)
{
cvNamedWindow("Sample", CV_WINDOW_AUTOSIZE);
} strcpy(fullname, infoname);
filename = strrchr(fullname, '\\');
if (filename == NULL)
{
filename = strrchr(fullname, '/');
}
if (filename == NULL)
{
filename = fullname;
}
else
{
filename++;
} for (line = 1, error = 0, total = 0; total < num; line++)
{
int count; error = (fscanf(info, "%s %d", filename, &count) != 2);
if (!error)
{
//src = cvLoadImage(fullname, 0);
//error = (src == NULL); src = cv::imread(fullname, 0);
error = (src.data == NULL); if (error)
{ #if CV_VERBOSE
fprintf(stderr, "Unable to open image: %s\n", fullname);
#endif /* CV_VERBOSE */ }
}
for (i = 0; (i < count) && (total < num); i++, total++)
{
error = (fscanf(info, "%d %d %d %d", &x, &y, &width, &height) != 4);
if (error) break;
//cvSetImageROI(src, cvRect(x, y, width, height));
//cvResize(src, sample, width >= sample->width &&height >= sample->height ? CV_INTER_AREA : CV_INTER_LINEAR);
cv::resize(src, sample, cv::Size(winwidth,winheight)); //if (showsamples)
//{
// cvShowImage("Sample", sample);
// if (cvWaitKey(0) == 27)
// {
// showsamples = 0;
// }
//} //icvWriteVecSample(vec, sample); {
int extNum = 7; //IplImage* sample2 = cvCreateImage(cvGetSize(sample), IPL_DEPTH_8U, sample->nChannels);
//cvCopyImage(sample, sample2); std::vector<cv::Mat > imgLIst(extNum);
cv::Mat inMat(sample);//此句导致占用释放错误
enhanser.EnhanceData(inMat, extNum, 1, imgLIst); for (int i = 0; i < extNum; ++i)
{//把Mat 生成移除来//已不必要 //IplImage* sampleT = nullptr;// = nullptr;
//*sampleT = IplImage(imgLIst[i]);
//icvWriteVecSample(vec, sampleT);
icvWriteVecSamplePlus(vec,imgLIst[i]); //if (sampleT)
//{
// cvReleaseImage(&sampleT);
//}
} }
} //if (src)
//{
// cvReleaseImage(&src);
//} if (error)
{ #if CV_VERBOSE
fprintf(stderr, "%s(%d) : parse error", infoname, line);
#endif /* CV_VERBOSE */ break;
}
} //if (sample)
//{
// cvReleaseImage(&sample);
//} fclose(vec);
fclose(info); return total;
}
修改函数:void icvWriteVecSample
//对每个图像写入正样本Vec
void icvWriteVecSamplePlus(FILE* file, cv::Mat &sample)
{
//CvMat* mat, stub;
int r, c;
short tmp;
uchar chartmp; //mat = cvGetMat(sample, &stub);
chartmp = 0;
fwrite(&chartmp, sizeof(chartmp), 1, file);
for (r = 0; r < sample.rows; r++)
{
for (c = 0; c < sample.cols; c++)
{
//tmp = (short)(CV_MAT_ELEM(*mat, uchar, r, c));
tmp = (short)(sample.at<unsigned char>(r,c));
fwrite(&tmp, sizeof(tmp), 1, file);
}
}
}
使用C++语言替换掉使用C语言的版本。
同时对生成新的Vec增加int extNum = 7;倍。
OpenCV:Adaboost训练时数据扩增的更多相关文章
- opencv_traincascade级联训练人脸数据
正负样本格式: 正样本 灰度化 24*24 2000张 负样本 灰度化 50*50 1000张 训练过程 第一步:dir /b >pos.txt 以及dir /b >neg.txt ...
- opencv python训练人脸识别
总计分为三个步骤 一.捕获人脸照片 二.对捕获的照片进行训练 三.加载训练的数据,识别 使用python3.6.8,opencv,numpy,pil 第一步:通过笔记本前置摄像头捕获脸部图片 将捕获的 ...
- caffe下训练时遇到的一些问题汇总
1.报错:“db_lmdb.hpp:14] Check failed:mdb_status ==0(112 vs.0)磁盘空间不足.” 这问题是由于lmdb在windows下无法使用lmdb的库,所以 ...
- caffe︱深度学习参数调优杂记+caffe训练时的问题+dropout/batch Normalization
一.深度学习中常用的调节参数 本节为笔者上课笔记(CDA深度学习实战课程第一期) 1.学习率 步长的选择:你走的距离长短,越短当然不会错过,但是耗时间.步长的选择比较麻烦.步长越小,越容易得到局部最优 ...
- 使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出
在使用OpenCV开发程序时,如果想查看矩阵数据,比较费劲,而matlab查看数据很方便,有一种方法,是matlab和c++混合编程,可以用matlab访问c++的内存,可惜我不会这种方式,所以我就把 ...
- 使用Deeplearning4j进行GPU训练时,出错的解决方法
一.问题 使用deeplearning4j进行GPU训练时,可能会出现java.lang.UnsatisfiedLinkError: no jnicudnn in java.library.path错 ...
- DenseNet算法详解——思路就是highway,DneseNet在训练时十分消耗内存
论文笔记:Densely Connected Convolutional Networks(DenseNet模型详解) 2017年09月28日 11:58:49 阅读数:1814 [ 转载自http: ...
- 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。
百度为何开源深度机器学习平台? 有一系列领先优势的百度却选择开源其深度机器学习平台,为何交底自己的核心技术?深思之下,却是在面对业界无奈时的远见之举. 5月20日,百度在github上开源了其 ...
- Java虚拟机及运行时数据区
1.Java虚拟机的定义 Java虚拟机(Java Virtual Machine),简称JVM.当我们说起Java虚拟机时,可能指的是如下三种不同的东西: 抽象的虚拟机规范 规范的具体实现 一个运行 ...
随机推荐
- 6.4.1 标准库 os、os.path 与 shutil 简介
os模块除了提供使用操作系统功能和访问文件系统的简便方法之外,还提供了大量文件与文件夹操作的方法,如下表所示. 方法 功能说明 access(path,mode) 按照 mode 指定的权限访问文件 ...
- 【codeforces 764D】Timofey and rectangles
[题目链接]:http://codeforces.com/contest/764/problem/D [题意] 给你n个矩形,以左下角坐标和右上角坐标的形式给出; (保证矩形的边长为奇数) 问你有没有 ...
- ZOJ - 2243 - Binary Search Heap Construction
先上题目: Binary Search Heap Construction Time Limit: 5 Seconds Memory Limit: 32768 KB Read the sta ...
- 利用Calendar类测试电脑运行速度
今天学习了很多新知识! 这里使用了Calender类来获取系统时间,并计算循环1w次的时间,判断电脑处理时间. import java.util.Calendar; public class Arra ...
- Tween公式
Tween公式 4个参数 t:current time(当前时间) b:beginning value(初始值) c: change in value(变化量) d:duration(持续时间) re ...
- Java 两个整数相除保留两位小数,将小数转化为百分数
Java 两个整数相除保留两位小数,将小数转化为百分数 源于:http://blog.sina.com.cn/s/blog_624d755d0101cvuq.html 后来学习了:http://blo ...
- 记录cocos2d-x3.0版本号更改内容官方说明
http://www.cocos2d-x.org/wiki/Release_Notes_for_Cocos2d-x_v300
- 数据结构(C实现)------- 顺序栈
栈是限定仅在表的一端进行插入或删除的纯属表,通常称同意插入.删除的一端为栈顶(Top),对应在的.则称还有一端为栈底(Bottom). 不含元素的栈则称为空栈. 所设栈S={a1,a2,a3,..., ...
- hdu 4941 Magical Forest (map容器)
Magical Forest Time Limit: 24000/12000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- 利用expect验证主机口令
##########mianmi.sh############ #!/usr/bin/expect set ip [lindex $argv ] set password [lindex $argv ...