手把手教你训练分类器

部署运行你感兴趣的模型镜像

转载自:http://zhan.renren.com/xjtuopencv?gid=3602888498033866847


训练过程就是上面的三步

关于正负样本的一些理解:

       正样本即包括目标的图片,一般较小(教程里提到的一般是24*24 20*20 18*18<单位是像素但是在实际做的时候总有种太模糊,什么都看不清的感觉,我觉得应该可以适当的加大图像,提供更多细节试试,虽然这必然会导致更多的运算时间,而且在进行处理之前,应将所有正样本进行标准化处理<统一大小,转化为灰度图>

        负样本,与正样本相反很容易理解,即任何不包含检测目标的图像,对负样本的标准化处理并不严格,仅有:灰度图 <可能也能使用彩图,在选项里又看到bgcolor这个选项,对图像的大小的限制是大于正样本尺寸(必须满足,是由于训练器的算法决定),同时负样本的数量一般远多于正样本的数量(2-3倍或以上的样子)

         关于合适的样本数量,教程还有opencv中推荐的都是正样本1000+,负样本3000+,这意味着训练时间会很长(目测一晚上+),当然如果你只是来试试看训练方法怎么样,那么可是使用少量样本比如100+的正样本。

        下面进入正题:

首先我们要获得一个正样本的描述文件

用于描述正样本文件名(包括绝对路径或相对路径),

正样本数目以及各正样本在图片中的位置和大小。典型的正样本描述文件如下:

face_100/face00001.bmp 1 0 0 20 20

face_100/face00002.bmp 1 0 0 20 20

face_100/face00003.bmp 1 0 0 20 20

其中face_100/是相对路径,face00001.bmp是图片名称,1 0 0 20 20 分别表示 1张图片,本样本左下角坐标(不一定是左下,但是肯定是距离原点最近的点)是0 0,右上角的坐标(同样的道理不一定是右上角)是20 20

 

具体方法是在Dos 下的恰当目录敲入dir/b > samples.dat,则会生成一个samples.dat,里面包含所有正样本文件名列表,但没有相对路径名和正样本位置信息。在samples.dat 文件各行行首增加“face _100/”的方法是使用文本编辑器替换功能,先选中所有行,然后按Tab 键为每行增加一个制表位,然后将制表位全部替换为“face _100/”即可。通过将“bmp”替换为“bmp 1 0 0 20 20”即可在每行添加“1 0 0 20 20”。

注释:图片文件的格式不局限与bmp jpg png都行,其他格式的没试过,估计opencv支持的都可以

运行 CreateSamples.exe 程序。下面是一个运行参数示例:

-info F:\FaceDetect\samples.dat -vec F:\FaceDetect\samples.vec -num 200 -w 20 -h 20

表示有200 个样本,样本宽20,高20,正样本描述文件为samples.dat,结果输出到samples.vec。

运行完了会生成一个*.vec 的文件。

 

         对于负样本的描述文件其处理方法与正样本基本相同,但是一个负样本的描述文件应该是做到这样的程度:

face_100/face00001.bmp

face_100/face00002.bmp

face_100/face00003.bmp

即只有图片的路径,名称,而没有图片数量大小的描述,而且其也不是vec文件,而是dir /b>时所指定的文件

 

非常重要的一点,所有的样本描述的条目中,路径和文件名内部不允许出现空格,原因自己想

 

样本创建之后,接下来要训练分类器,这个过程是由haartraining 程序来实现的。该程序源

码由OpenCV 自带,且可执行程序在OpenCV 安装目录的bin 目录下。

Haartraining 的命令行参数如下:

-data<dir_name>

存放训练好的分类器的路径名。

-vec<vec_file_name>

正样本文件名(由trainingssamples 程序或者由其他的方法创建的)

-bg<background_file_name>

背景描述文件。

-npos<number_of_positive_samples>,

-nneg<number_of_negative_samples>

用来训练每一个分类器阶段的正/负样本。合理的值是:nPos = 7000;nNeg = 3000

-nstages<number_of_stages>

训练的阶段数。

-nsplits<number_of_splits>

决定用于阶段分类器的弱分类器。如果1,则一个简单的stump classifier 被使用。如果是2

或者更多,则带有number_of_splits 个内部节点的CART 分类器被使用。

-mem<memory_in_MB>

预先计算的以MB 为单位的可用内存。内存越大则训练的速度越快。

-sym(default)

-nonsym

指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。例如,正面部是垂直对

称的。

-minhitrate《min_hit_rate》

每个阶段分类器需要的最小的命中率。总的命中率为min_hit_rate 的number_of_stages 次

方。

-maxfalsealarm<max_false_alarm_rate>

没有阶段分类器的最大错误报警率。总的错误警告率为max_false_alarm_rate 的

number_of_stages 次方。

-weighttrimming<weight_trimming>

指定是否使用权修正和使用多大的权修正。一个基本的选择是0.9

-eqw

-mode<basic(default)|core|all>

选择用来训练的haar 特征集的种类。basic 仅仅使用垂直特征。all 使用垂直和45 度角旋转

特征。

-w《sample_width》

-h《sample_height》

训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同。

一个训练分类器的例子:

"D:\Program Files\OpenCV\bin\haartraining.exe" -data data\cascade -vec data\pos.vec

-bg negdata\negdata.dat -npos 49 -nneg 49 -mem 200 -mode ALL -w 20 -h 20

训练结束后,会在目录data 下生成一些子目录,即为训练好的分类器。

值得提醒的是xml文件在于data目录同级的目录下<如果训练成功的话>

我在试着训练时使用的参数

注意 -nsplits 这个选项应该尽量设置成2(到底有没有更高的值,我也不知道,应该有吧),这样会获得起码比较细致的训练过程,如果选的话,我不知道你们会怎么样,反正我是只得到了一个6k大小的xml文件,几乎不能用

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 构建和使用随机森林分类器 #### 导入必要的库 为了实现随机森林分类器,首先需要导入一些基本的Python库以及`scikit-learn`中的特定模块。 ```python import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, classification_report ``` #### 加载数据集 这里以鸢尾花(Iris)数据集为例说明如何加载数据,并将其划分为训练集和测试集。 ```python # 加载Iris数据集 data = load_iris() X = data.data # 特征矩阵 y = data.target # 目标向量 # 将数据集分割为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` #### 创建并配置随机森林模型 创建一个`RandomForestClassifier`实例,并设置参数。可以通过调整诸如`n_estimators`(树的数量),`max_depth`(单棵树的最大深度), `min_samples_leaf`, 和其他超参数来优化性能[^1]。 ```python rf_model = RandomForestClassifier(n_estimators=100, max_depth=None, min_samples_split=2, random_state=42, oob_score=True) # 训练模型 rf_model.fit(X_train, y_train) ``` #### 使用OOB误差评估模型质量 由于设置了`oob_score=True`,可以直接利用袋外(out-of-bag, OOB)样本来估计泛化错误率而无需单独划分验证集[^2]。 ```python print(f'OOB Score: {rf_model.oob_score_:.4f}') ``` #### 测试与评价模型表现 最后,在独立的测试集上评估模型的表现,并打印出准确度和其他指标。 ```python predictions = rf_model.predict(X_test) accuracy = accuracy_score(y_test, predictions) report = classification_report(y_test, predictions) print(f'Test Accuracy: {accuracy * 100:.2f}%') print('Classification Report:\n', report) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值