opencv使用dnn模块训练模型

opencv使用dnn模块训练模型

下载opencv

opencv3.3以上版本才支持dnn模块,下载链接:https://opencv.org/releases/

前期准备

1.解压安装好opencv,在opencv3.3.0\opencv\build\x64\vc14\bin找到这两个软件
在这里插入图片描述
2.准备正样本和负样本图片,比例1:3;将样本转为灰度图,然后重新调整大小50*50;
3.在bin目录下创建info.txt,里面是正样本调整大小后的图片具体路径:
在这里插入图片描述
4.在bin目录下创建bg,txt,里面是负样本图片调整大小后的具体路径:
在这里插入图片描述

开始训练

  1. 打开cmd
  2. 输入cd /d opencv3.3.0\opencv\build\x64\vc14\bin
  3. 输入opencv_createsamples.exe -vec info.vec -info info.txt -bg bg.txt -num 105 -w 50 -h 50
    生成info.vec
  4. 创建data文件夹,输入opencv_traincascade.exe -data data -vec info.vec -bg bg.txt -numPos 105 -numNeg 315 -numStages 20 -w 50 -h 50 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -featureType LBP
    开始训练
    参数说明:
-data <cascade_dir_name>:目录用于保存训练产生的分类器xml文件和中间文件(对于  上面的LBP_classifier),如不存在训练程序会创建它;
-vec <vec_file_name>:由 opencv_createsamples 程序生成的包含正样本的vec文件名(对应上面的pos_24_24.vec);
-bg <background_file_name>:背景描述文件,也就是包含负样本文件名的那个描述文件(对应上面的neg\neg.txt);
-numPos <number_of_positive_samples>:每级分类器训练时所用的正样本数目(默认值为2000);
-numNeg <number_of_negative_samples>:每级分类器训练时所用的负样本数目,可以大于 -bg 指定的图片数目(默认值为1000);
-numStages <number_of_stages>:训练的分类器的级数(默认值为20级);
-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>:缓存大小,用于存储预先计算的特征值(feature values),单位为MB(默认值为256);
-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>:缓存大小,用于存储预先计算的特征索引(feature indices),单位为MB(默认值为256);内存越大,训练时间越短。
-baseFormatSave:这个参数仅在使用Haar特征时有效。如果指定这个参数,那么级联分类器将以老的格式存储(默认不指定该参数项,此时其值为false;一旦指定则其值默认为true);级联参数:CvCascadeParams类,定义于cascadeclassifier.h
-stageType <BOOST(default)>:级别(stage)参数。目前只支持将BOOST分类器作为级联的类型;
-featureType<{HAAR(default), LBP}>:特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征(默认Harr);
-w <sampleWidth>:训练样本的宽(单位为像素,默认24);
-h <sampleHeight>:训练样本的高(单位为像素,默认24);训练样本的尺寸必须跟训练样本创建(使用 opencv_createsamples 程序创建)时的尺寸保持一致。Boosted分类器参数:CvCascadeBoostParams类,定义于boost.h
-bt <{DAB, RAB, LB, GAB(default)}>:Boosted分类器的类型(DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost为默认);
-minHitRate <min_hit_rate>:分类器的每一级希望得到的最小检测率(默认值为0.995),总的检测率大约为 min_hit_rate^number_of_stages;
-maxFalseAlarmRate <max_false_alarm_rate>:分类器的每一级希望得到的最大误检率(默认值为0.5),总的误检率大约为 max_false_alarm_rate^number_of_stages;
-weightTrimRate <weight_trim_rate>:Specifies whether trimming should be used and its weight,一个还不错的数值是0.95;
-maxDepth <max_depth_of_weak_tree>:弱分类器树最大的深度。一个还不错的数值是1,是二叉树(stumps);
-maxWeakCount <max_weak_tree_count>:每一级中的弱分类器的最大数目(默认值为100)。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate;

测试效果

完成训练后会在data文件夹下生成一个cascade.xml,测试训练效果:

	String path = "D:/opencv3.3.0/opencv/build/x64/vc14/bin/data/cascade.xml";
    String imgPath = "E:/code/vs/dnn_classification/img/1/IMG_20230220_121054.jpg";
    Mat img = imread(imgPath);
    resize(img, img, Size(500, 500));
    Mat gray;                                                                                                                                                                  
    cvtColor(img, gray, COLOR_BGR2GRAY);
    CascadeClassifier* filter = new CascadeClassifier(path);

    std::vector<Rect> rect;
    filter->detectMultiScale(gray, rect);
    for (int i = 0; i < rect.size(); i++) {
        rectangle(img, rect[i], Scalar(0,0,255));
    }
    imshow("res", img);
    waitKey(0);
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用OpenCV训练模型,您可以使用OpenCV的机器学习库和相关工具。下面是一个基本的训练模型的步骤: 1. 数据收集:收集用于训练的图像或视频数据集。确保数据集包含不同类别的样本,并且每个样本都有相应的标签。 2. 特征提取:使用OpenCV提供的特征提取算法,如HOG(方向梯度直方图)或Haar特征等,将图像转换为特征向量。这些特征向量将作为输入用于训练模型。 3. 数据预处理:对图像数据进行预处理,例如调整大小、灰度化、对比度增强或归一化等操作,以提高模型的训练效果。 4. 模型选择:根据您的任务需求和数据集特点,选择适合的机器学习算法和模型架构。OpenCV支持多种机器学习算法,如支持向量机(SVM)、随机森林(Random Forests)等。 5. 模型训练使用数据集和特征向量作为输入,使用选择的机器学习算法训练模型。在训练期间,模型将学习如何将输入数据与其对应的标签相关联。 6. 模型评估:使用测试数据集评估训练后的模型的性能。可以使用指标如准确率、召回率、F1分数等来评估模型的性能。 7. 模型优化:根据评估结果,调整模型参数或增加更多的训练数据,以提高模型的性能。 8. 模型应用:使用训练好的模型进行目标检测、图像分类、人脸识别等任务。 请注意,这只是一个基本的训练模型的步骤示例。具体的步骤和方法可能因您的任务需求和数据集特点而有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值