更准确的模型需要更多的数据,对于传统非神经网络机器学习方法,不同的特征需要有各自相符合的数据扩增方法。

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训练时数据扩增的更多相关文章

  1. opencv_traincascade级联训练人脸数据

    正负样本格式:  正样本 灰度化 24*24 2000张  负样本 灰度化 50*50 1000张 训练过程  第一步:dir /b >pos.txt 以及dir /b >neg.txt ...

  2. opencv python训练人脸识别

    总计分为三个步骤 一.捕获人脸照片 二.对捕获的照片进行训练 三.加载训练的数据,识别 使用python3.6.8,opencv,numpy,pil 第一步:通过笔记本前置摄像头捕获脸部图片 将捕获的 ...

  3. caffe下训练时遇到的一些问题汇总

    1.报错:“db_lmdb.hpp:14] Check failed:mdb_status ==0(112 vs.0)磁盘空间不足.” 这问题是由于lmdb在windows下无法使用lmdb的库,所以 ...

  4. caffe︱深度学习参数调优杂记+caffe训练时的问题+dropout/batch Normalization

    一.深度学习中常用的调节参数 本节为笔者上课笔记(CDA深度学习实战课程第一期) 1.学习率 步长的选择:你走的距离长短,越短当然不会错过,但是耗时间.步长的选择比较麻烦.步长越小,越容易得到局部最优 ...

  5. 使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出

    在使用OpenCV开发程序时,如果想查看矩阵数据,比较费劲,而matlab查看数据很方便,有一种方法,是matlab和c++混合编程,可以用matlab访问c++的内存,可惜我不会这种方式,所以我就把 ...

  6. 使用Deeplearning4j进行GPU训练时,出错的解决方法

    一.问题 使用deeplearning4j进行GPU训练时,可能会出现java.lang.UnsatisfiedLinkError: no jnicudnn in java.library.path错 ...

  7. DenseNet算法详解——思路就是highway,DneseNet在训练时十分消耗内存

    论文笔记:Densely Connected Convolutional Networks(DenseNet模型详解) 2017年09月28日 11:58:49 阅读数:1814 [ 转载自http: ...

  8. 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。

    百度为何开源深度机器学习平台?   有一系列领先优势的百度却选择开源其深度机器学习平台,为何交底自己的核心技术?深思之下,却是在面对业界无奈时的远见之举.   5月20日,百度在github上开源了其 ...

  9. Java虚拟机及运行时数据区

    1.Java虚拟机的定义 Java虚拟机(Java Virtual Machine),简称JVM.当我们说起Java虚拟机时,可能指的是如下三种不同的东西: 抽象的虚拟机规范 规范的具体实现 一个运行 ...

随机推荐

  1. Codeforces 939D - Love Rescue

    传送门:http://codeforces.com/contest/939/problem/D 本题是一个数据结构问题——并查集(Disjoint Set). 给出两个长度相同,且仅由小写字母组成的字 ...

  2. 常用Git命令大全思维导图

    开发中代码管理少不了使用Git,对于初学者来说Git命令的学习是一个难过的坎,为了帮助大家记忆并快速掌握Git的基本使用,我把常用的Git命令整理成思维导图,分享给大家. 高清大图在线预览 http: ...

  3. 用c实现shell排序

    shell排序的方法又称缩小增量法,是对直接插入排序法的改进.至于对于分组后采用哪种排序方法实现,本例采用直接选择排序和直接插入排序,理论上讲,通过分组排序后,数据基本上有序,这时通过直接插入排序会比 ...

  4. Linux排查java程序占用cpu过高的线程代码

    分几步骤: 1.通过top,查出占用CPU过高的java进程 ,比如: pid :6666 2.通过ps -mp 6666 -o THREAD,tid,time| sort -n -k1 -r 查看此 ...

  5. EasyUI 在textbox里面输入数据敲回车后查询和普通在textbox输入数据敲回车的区别

    EasyUI实现回车键触发事件 $('#id').textbox('textbox').keydown(function (e) { if (e.keyCode == 13) { alert('ent ...

  6. Linux: 统计代码行数和SVN修改行数的命令

    Mac下同样有效. 1. 统计目录下所有js文件的代码行数. find . -name '*.js' | xargs wc -l 2. 统计SVN的修改行数. svn diff -rBeginRev: ...

  7. 全栈JavaScript之路(十)学习 DocumentFragment 类型 节点

    DocumentFragment 类型节点,代表一个文档片段,是一种轻量级的'文档' 对象.能够包括其他类型节点,并有能力訪问.操作当中的节点,可是在文档中没有文档标记,相当于是一个页面不可见的容器. ...

  8. 禁止root用户直接远程telnet/ssh登陆

    AIX 封闭root,只能使用su登录root用户,禁止root用户直接远程登陆. 1.  禁止telnet登录 smit chuser   ->root       ->User can ...

  9. luogu1026 统计单词个数

    题目大意 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1< k< =40),且每份中包含 ...

  10. Android系统升级那些事儿【转】

    本文转载自:http://blog.csdn.net/chenyufei1013/article/details/12705719 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?) ...