使用 opencv_traincascade 训练自定义 HAAR / LBP 级联分类器:从数据准备到训练与可视化全流程指南
计算机视觉图像处理深度学习机器学习【免费下载链接】opencv_contribRepository for OpenCVs extra modules项目地址https://gitcode.com/gh_mirrors/op/opencv_contrib点击查看免费下载本指南以 opencv_contrib 中 xobjdetect 模块的 Cascade Classifier Training 教程为核心系统讲解如何训练属于自己的弱分类器增强级联boosted cascade of weak classifiers。你将掌握从收集正负样本、使用 opencv_createsamples 与 opencv_annotation 准备训练数据到运行 opencv_traincascade 完成模型训练最后用 opencv_visualisation 可视化检查训练结果的完整实战流程并理解 HAAR 与 LBP 两类特征在精度与速度上的取舍。引言级联分类器的两大阶段基于增强级联boosted cascade的对象检测包含两个主要阶段训练阶段与检测阶段。检测阶段使用 HAAR 或 LBP 模型通过cv::CascadeClassifier在图像中滑动窗口完成目标定位相关原理与使用方式见 object detection 教程 以及 xobjdetect.hpp 头文件 中关于 Viola-Jones 级联与特征计算的说明。本文档聚焦于训练阶段将带你走完从采集训练数据、整理数据格式到真正执行模型训练的每一个环节。整个流程依赖四个官方命令行应用源码与构建配置均位于本仓库的 xobjdetect 模块中应用用途源码位置opencv_createsamples生成正样本 vec 文件modules/xobjdetect/tools/createsamplesOpenCV 主仓库 3.4 分支opencv_annotation可视化为图片标注目标框生成标注文件opencv_annotation.cppopencv_traincascade执行级联分类器训练modules/xobjdetect/tools/traincascadeOpenCV 主仓库 3.4 分支opencv_visualisation可视化已训练级联的每一级特征opencv_visualisation.cpp版本重要提示createsamples 与 traincascade 自OpenCV 4.0 起已被禁用。官方建议使用 OpenCV3.4 分支中的这两个应用进行训练3.4 与 4.x 的模型格式保持一致因此训练出的 cascade.xml 可以直接被 4.x 的cv::CascadeClassifier加载使用。重要背景说明网络上仍有许多教程提及已废弃的旧版opencv_haartraining工具它仍基于 OpenCV 1.x 接口。请忽略这类教程坚持使用opencv_traincascade。后者是遵循 OpenCV 2.x/3.x API 用 C 重写的新工具同时支持 HAAR 小波特征Viola Jones 2001与 LBP 局部二值模式Liao 等 2007两种特征。LBP 特征为整数精度HAAR 为浮点精度因此无论训练还是检测LBP 都要快数倍。至于检测质量主要取决于训练数据与训练参数完全可以用 LBP 训练出与 HAAR 几乎同质量的分类器而训练时间仅为其一个零头。OpenCV 2.x/3.x 的新版级联检测接口cv::CascadeClassifier同时支持旧版与新版模型格式opencv_traincascade甚至可以通过-baseFormatSave参数把训练好的级联导出为旧格式方便仍被旧接口绑定的用户——至少训练这一步可以在最稳定的新接口下完成。opencv_traincascade支持 TBB 多线程加速但要求 OpenCV 在构建时启用 TBB 支持训练时才能使用多核模式。训练数据准备正样本与负样本训练增强级联需要两类数据正样本包含你要检测的真实目标与负样本包含一切你不想检测到的内容。负样本集合需要手动准备而正样本集合则由opencv_createsamples应用生成。负样本背景样本负样本取自任意不包含目标对象的图像。这些图像需要写进一个负样本描述文件bg 文件每行一个图片路径绝对路径或相对路径均可。本文档中负样本/背景样本负样本图像/背景图像两种叫法含义相同可互换使用。各图像尺寸可以不同但每张图应等于或大于期望的训练窗口大小即模型尺寸通常取目标对象的平均大小因为这些图像会被下采样切分成若干个训练窗口大小的负样本切片。目录结构与 bg 文件示例/img img1.jpg img2.jpg bg.txtimg/img1.jpg img/img2.jpg你的负样本窗口集合将告诉 boosting 阶段不要找什么从而把搜索聚焦到真正感兴趣的目标上。正样本正样本由opencv_createsamples应用生成用于定义模型应当寻找的目标。该应用支持两种生成方式从单个目标对象图片批量合成正样本自行提供全部正样本仅用工具完成裁剪、缩放并打包为 OpenCV 需要的二进制 vec 格式。第一种方式对刚性很强的目标如规则的公司 Logo效果尚可但对形变较大的目标很快失效此时建议使用第二种方式。社区经验甚至表明100 张真实目标图像训练出的模型往往优于用合成方式生成的 1000 张正样本。如果坚持用第一种方式请注意送入应用前至少准备多张正样本图因为该方式只做透视变换想要鲁棒的模型样本应覆盖目标类内可能出现的广泛差异例如人脸应考虑不同种族、年龄段、表情乃至胡须样式第二种方式同理。方式一从单图合成正样本该方式取一张目标图像如公司 Logo通过随机旋转目标、改变图像强度、叠加任意背景来生成大量正样本。随机性的强度与范围由命令行参数控制。完整命令行参数如下参数含义-vec vec_file_name输出文件名保存训练用的正样本 vec 文件-img image_file_name源目标图像如公司 Logo-bg background_file_name背景描述文件列出用于放置随机畸变目标的背景图像-num number_of_samples要生成的正样本数量-bgcolor background_color背景色当前假定为灰度图即透明色考虑到压缩伪影可用-bgthresh指定颜色容差落在[bgcolor-bgthresh, bgcolorbgthresh]范围内的像素被视为透明-bgthresh background_color_threshold背景色容差阈值-inv指定后对颜色取反-randinv指定后随机决定是否对样本取反-maxidev max_intensity_deviation前景样本像素的最大强度偏差-maxxangle max_x_rotation_angle绕 x 轴最大旋转角单位必须为弧度-maxyangle max_y_rotation_angle绕 y 轴最大旋转角单位为弧度-maxzangle max_z_rotation_angle绕 z 轴最大旋转角单位为弧度-show调试选项指定后逐个显示生成的样本按 Esc 可跳过逐个显示继续生成-w sample_width输出样本的宽度像素-h sample_height输出样本的高度像素运行时的合成流程如下先将源图像绕三个轴随机旋转旋转角分别受-maxxangle、-maxyangle、-maxzangle限制随后把强度落在[bgcolor-bgthresh, bgcolorbgthresh]区间的像素视为透明再为前景像素叠加白噪声若指定-inv则前景像素强度取反若指定-randinv则随机决定本次样本是否取反最后把得到的图像放到背景描述文件中的任意背景上缩放到-w与-h指定的大小存入-vec指定的 vec 文件。方式二从已标注图像集合生成正样本当构建鲁棒的目标模型时推荐从一批已人工标注过的图像中提取正样本。该集合用与 bg 文件类似的文本文件描述每一行对应一张图像第一个元素是文件名随后是目标标注个数再后面依次是每个目标包围矩形bounding box的坐标(x, y, width, height)。示例/img img1.jpg img2.jpg info.datimg/img1.jpg 1 140 100 45 45 img/img2.jpg 2 100 200 50 50 50 30 25 25其中 img1.jpg 含一个目标实例包围矩形坐标为(140, 100, 45, 45)img2.jpg 含两个目标实例。此时应改用-info参数替代-img参数含义-info collection_file_name已标注图像集合的描述文件注意此时-bg、-bgcolor、-bgthreshold、-inv、-randinv、-maxxangle、-maxyangle、-maxzangle等参数会被直接忽略。合成流程变为从原图中按给出的包围框裁剪出目标实例缩放到-w、-h指定的目标尺寸存入-vec指定的 vec 文件。整个过程不做任何畸变因此实际生效的参数只有-w、-h、-show与-num。手动编写-info文件的工作可以交给opencv_annotation工具完成——这是一个开源的、可视化框选任意图像中目标区域的应用下一节详细说明用法。附加说明opencv_createsamples还可以用来查看任意 vec 文件中的样本此时只需指定-vec、-w、-h三个参数。本仓库附带一个现成的 vec 文件示例 trainingfaces_24-24.vec可用它配合-w 24 -h 24训练一个人脸检测器。使用 OpenCV 集成的标注工具 opencv_annotation自 OpenCV 3.x 起社区持续维护一个开源标注工具用于生成-info文件。构建 OpenCV 应用后通过命令opencv_annotation即可访问。其源码位于 opencv_annotation.cpp从源码中可以看到它使用CommandLineParser解析以下参数参数必填说明--annotations是标注输出 txt 文件路径之后作为-info参数传入示例/data/annotations.txt--images是存放含目标图像的文件夹路径示例/data/testimages/--maxWindowHeight否若输入图像高度大于该值则按--resizeFactor缩放以便标注--resizeFactor否配合--maxWindowHeight使用的缩放因子源码默认值为 2即缩小一半注意两个可选参数必须同时使用。典型调用opencv_annotation --annotations/path/to/annotations/file.txt --images/path/to/image/folder/运行后会弹出窗口显示第一张图像。操作方式与源码中get_annotations的按键处理一一对应参见 opencv_annotation.cpp 中 ASCII 码c99、n110、d100、ESC27的分支鼠标左键第一次点击选定目标框的第一个角拖拽绘制第二次左键点击确认框的终点源码on_mouse回调在两次左键点击间切换绘制状态按c确认当前标注框变为绿色并被存储按d删除列表中最后一条标注便于移除误标源码为current_annotations.pop_back()按n保存当前图像标注并进入下一张图像按ESC退出标注程序源码在检测到 Esc 后立即跳出循环并仍会写入此前已完成的部分标注。最终你会得到一个可用的标注文件直接传给opencv_createsamples的-info参数即可。级联训练运行 opencv_traincascade数据就绪后进入真正训练阶段。opencv_traincascade的命令行参数按用途分为四组。公共参数参数含义-data cascade_dir_name训练好的分类器存放目录需预先手动创建-vec vec_file_name正样本 vec 文件由 opencv_createsamples 生成-bg background_file_name负样本描述文件-numPos number_of_positive_samples每一级分类器训练使用的正样本数-numNeg number_of_negative_samples每一级分类器训练使用的负样本数-numStages number_of_stages要训练的级联级数-precalcValBufSize size_in_Mb预计算特征值缓冲区大小MB分配越多训练越快但需注意它与-precalcIdxBufSize之和不能超过可用内存-precalcIdxBufSize size_in_Mb预计算特征索引缓冲区大小MB同上两者之和须在可用内存范围内-baseFormatSave仅对 HAAR 特征有效指定后级联以旧格式保存。仅用于向后兼容方便被旧接口绑定的用户至少能用新接口训练模型-numThreads max_number_of_threads训练使用的最大线程数实际线程数可能更低取决于机器与编译选项。默认情况下若 OpenCV 以 TBB 支持构建则自动选用可用线程上限TBB 是该优化的前提-acceptanceRatioBreakValue break_value用于决定模型应学习到多精细、何时提前停止。经验准则是不要训练到低于 1e-5以免在训练数据上过拟合默认值为 -1即关闭该提前停止特性级联参数参数含义-stageType BOOST(default)级联阶段类型目前仅支持 boosted 分类器-featureType HAAR(default), LBP特征类型HAAR 为 Haar-like 特征LBP 为局部二值模式-w sampleWidth训练样本宽度像素必须与 opencv_createsamples 生成样本时完全一致-h sampleHeight训练样本高度像素同样必须与样本生成时一致Boosting 分类器参数参数含义-bt DAB, RAB, LB, GAB(default)Boosting 类型DAB 离散 AdaBoost、RAB 实值 AdaBoost、LB LogitBoost、GAB Gentle AdaBoost-minHitRate min_hit_rate每一级最小期望命中率总体命中率可估算为min_hit_rate ^ 级数Viola Jones 2004 论文 §4.1-maxFalseAlarmRate max_false_alarm_rate每一级最大期望误报率总体误报率可估算为max_false_alarm_rate ^ 级数-weightTrimRate weight_trim_rate是否使用权重裁剪及其权重合理取值为 0.95-maxDepth max_depth_of_weak_tree弱树的最大深度合理取值为 1即 stump 桩决策树-maxWeakCount max_weak_tree_count每一级弱树的最大数量boosted 分类器级会按需使用不超过该值的弱树数直到达到-maxFalseAlarmRateHaar 特征参数参数含义-mode BASIC (default) | CORE | ALL选择训练所用的 Haar 特征集BASIC 仅用竖直特征ALL 使用竖直与 45 度旋转的完整特征集详见 Lienhart 2002 论文LBP 特征参数LBP局部二值模式特征没有参数。训练产物与参数落地实例训练完成后级联会保存为-data目录下的cascade.xml文件该目录下其余文件是为训练中断后续训准备的中间产物训练全部结束后可以删除。仓库自带的 LBP 模型 lbpcascade_frontalface.xml 是理解上述参数如何落地的绝佳范例其 XML 头部记录了训练配置——stageTypeBOOST、featureTypeLBP、窗口24x24stageParams中boostTypeGAB、minHitRate0.995、maxFalseAlarm0.5、weightTrimRate0.95、maxDepth1、maxWeakCount100featureParams中maxCatCount256LBP 特征对应的直方图类别数。对照你自己的训练参数表即可验证训练是否按预期配置执行。训练完成现在可以测试你的级联分类器了可视化级联分类器opencv_visualisation有时查看训练出的级联、了解它选中了哪些特征以及各级复杂度会很有帮助。OpenCV 为此提供opencv_visualisation应用源码见 opencv_visualisation.cpp其参数如下参数必填说明--image是目标模型的参考图像。应为尺寸[-w, -h]的样本窗口与传给 opencv_createsamples 和 opencv_traincascade 的窗口一致--model是训练好的模型路径即-data参数指定目录中的 cascade 文件--data否若提供数据目录需预先手动创建将保存每级的输出图与特征动画视频示例命令opencv_visualisation --image/data/object.png --model/data/model.xml --data/data/result/从源码看该应用还额外支持--ext输出视频扩展名默认 avi、--fourcc视频编码四字符码默认 XVID、--fps视频帧率默认 15。可视化前会先解析 cascade XML读取featureType并只接受 HAAR 与 LBP 两类模型随后按级stage恢复每一级的弱特征索引LBP 的特征索引不是顺序的源码专门做了映射处理逐特征在高亮窗口上叠加矩形生成逐级动画视频并在给定--data时把每一级的所有特征拼成一张stage_N.png图像保存。当前可视化工具存在以下限制只能处理由opencv_traincascade训练、决策树为stump桩即默认设置的级联分类器模型--image提供的图像必须是原始模型尺寸的样本窗口。以下两张图展示了将 HAAR/LBP 人脸模型作用于一张 24x24、灰度化且完成直方图均衡化的 Angelina Jolie 人脸窗口时的可视化结果该窗口的预处理方式与级联分类器文件一致视频形式逐级展示每个特征每一级单独保存为一张图像便于后续验证特征训练之后加载并验证你的分类器训练产物cascade.xml可直接交由检测阶段使用。cv::CascadeClassifier的load()方法同时兼容旧版 haartraining 产物与新版 traincascade 产物随后通过detectMultiScale()以多尺度滑动窗口在图像上定位目标接口说明与参数scaleFactor、minNeighbors、minSize/maxSize等见 xobjdetect.hpp模块内也提供了 facedetect.cpp 等可直接编译运行的检测示例。一个推荐的验证路线是先用opencv_visualisation检查训练出的特征是否合理、各级是否退化再用一小批未参与训练的测试图像跑detectMultiScale观察命中率与误报率是否符合-minHitRate/-maxFalseAlarmRate的预期两者随级数指数累积级数越多整体约束越严若出现过拟合迹象可回看-acceptanceRatioBreakValue的设置并适当增加负样本多样性。小结整个自定义级联分类器训练流水线可概括为收集负样本bg.txt→ 收集/合成正样本createsamples 生成 vec→ 训练traincascade 产出 cascade.xml→ 可视化检查visualisation→ 加载检测CascadeClassifier。几个关键决策点值得再次强调LBP 在训练与检测速度上远优于 HAAR 而质量差距可控-w/-h必须在样本生成与训练两个阶段严格一致正样本的真实性与多样性比数量更重要训练参数-bt、-minHitRate、-maxFalseAlarmRate、-weightTrimRate、-maxDepth直接决定模型的精度与复杂度可对照仓库中预训练模型 XML 头部记录的真实参数作为参考起点。赞分享计算机视觉图像处理深度学习机器学习【免费下载链接】opencv_contribRepository for OpenCVs extra modules项目地址https://gitcode.com/gh_mirrors/op/opencv_contrib点击查看免费下载相关推荐XTuner 自定义预训练数据集实战从数据准备到增量预训练全流程指南XTuner 自定义预训练数据集实战从数据准备到增量预训练全流程指南 XTuner 支持使用自定义数据集对基座大语言模型进行增量预训练Incremental大模型模型微调RapidOCR自定义模型训练从数据准备到部署全流程RapidOCR自定义模型训练从数据准备到部署全流程 一、数据准备构建高质量训练集 你是否遇到过通用OCR模型在特定场景下识别率低下的问题例如在识别特定字人工智能计算机视觉OCRMATLAB-Simulink-Challenge-Project-Hub部署实战完整项目搭建与测试流程MATLAB Simulink Challenge Project Hub部署实战完整项目搭建与测试流程 MATLAB Simulink Challenge文档教程知识库教育上一篇Instructor 蒸馏实战用 Instructions 把 Python 函数一键微调成 LLM下一篇企业级数据治理终极指南5分钟快速部署DataHub平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考