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;倍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Adaboost算法是一种常用的机器学习算法,可以用于分类和回归问题。在OpenCV中,可以使用Adaboost算法进行目标检测和人脸识别等任务。下面是使用Python和OpenCV进行Adaboost训练的基本步骤: 1. 准备数据集。Adaboost算法需要训练数据集和测试数据集,可以使用OpenCV中的CascadeClassifier类加载训练数据集和测试数据集。训练数据集包括正样本和负样本,正样本是需要检测的目标,负样本是与正样本相似但不包含目标的图像。 2. 特征提取。Adaboost算法需要从图像中提取特征,可以使用OpenCV中的Haar特征或LBP特征等。Haar特征是一种基于图像灰度值的局部特征,LBP特征是一种基于图像局部纹理的特征。 3. 训练模型。使用OpenCV中的CascadeClassifier.train()函数训练Adaboost模型,设置训练参数,如分类器数量、误差限制等。训练过程中,Adaboost算法会不断调整分类器的权重和阈值,使得分类器能够更好地区分正样本和负样本。 4. 测试模型。使用OpenCV中的CascadeClassifier.detectMultiScale()函数测试Adaboost模型,设置检测参数,如缩放因子、最小邻域等。检测过程中,Adaboost算法会对每个图像窗口进行分类,判断是否包含目标。 5. 保存模型。使用OpenCV中的CascadeClassifier.save()函数保存训练好的Adaboost模型,方便后续使用。 需要注意的是,Adaboost算法的训练过程需要大量的计算和存储资源,因此需要在高性能计算机或云平台上进行训练。同,特征选择和参数调整也是Adaboost算法中关键的步骤,需要根据具体应用场景进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值