上一篇我们学完了Haar / LBP 级联分类器检测,使用的是 OpenCV 官方自带的人脸、人眼、微笑预训练模型。
但实际项目中,我们往往需要检测自定义目标:比如LOGO、硬币、零件、手势、交通标志、特定物体。
没有现成模型怎么办?自己训练!
今天手把手带大家吃透OpenCV 级联分类器完整训练流程:正负样本制作、样本归一化、训练参数配置、CMD训练、模型测试、调参优化,零基础也能成功训练属于自己的检测器!
一、为什么要自己训练级联分类器?
自带的 Haar/LBP 模型只能检测人脸、人眼等通用目标。
而自定义训练可以实现:
•✅ 检测任意小目标、工业零件、瑕疵形状
•✅ 轻量化模型,几十KB,适合嵌入式部署
•✅ 无需GPU、低功耗、实时性极强
•✅ 传统视觉项目零成本检测方案
二、训练核心原理回顾
级联分类器训练,本质是:用大量正负样本,训练多层弱分类器,组合成强分类器。
•正样本(Positive):包含待检测目标的图片
•负样本(Negative):不包含目标的纯背景图片
算法通过海量样本迭代,自动学习目标的Haar明暗特征 / LBP纹理特征,最终生成 XML 检测模型。
三、训练环境与文件准备(必看)
1、所需工具
OpenCV 自带训练工具,无需额外安装:
•opencv_createsamples.exe:生成正样本vec文件
•opencv_traincascade.exe:执行级联训练
2、完整文件夹结构(标准工程结构)
Plain Texttrain/├─ pos/ # 正样本图片├─ neg/ # 负样本图片├─ pos.txt # 正样本描述文件├─ neg.txt # 负样本描述文件└─ out/ # 保存训练模型 |
四、正负样本制作规范(训练成败关键)
1、正样本要求
•只保留单一目标,尽量干净
•尺寸统一(推荐 24×24 / 32×32)
•数量:300~2000张(越多越精准)
•角度、光照、轻微变换丰富,提升泛化能力
2、负样本要求
•绝对不能出现目标物体
•背景尽量贴近真实使用场景
•数量建议是正样本的 3~5 倍
五、生成样本描述文件(txt自动生成代码)
手动写txt太慢,用代码自动生成列表:
pythonimport os# 生成负样本 neg.txtneg_path = "neg/"with open("neg.txt", "w") as f:for img in os.listdir(neg_path):f.write(neg_path + img + "\n")# 生成正样本 pos.txt(单目标)pos_path = "pos/"with open("pos.txt", "w") as f:for img in os.listdir(pos_path):# x,y,w,h 目标在图中位置,全覆盖写 0 0 宽 高f.write(pos_path + img + " 1 0 0 24 24\n") |
六、生成vec正样本文件
CMD 执行命令,将零散正样本打包为训练可用的 .vec文件:
Plain Textopencv_createsamples.exe -info pos.txt -vec pos.vec -w 24 -h 24 -num 1000 |
•-w -h:训练样本尺寸
•-num:正样本数量
七、开始正式训练(完整训练命令)
推荐大家训练LBP模型:速度快、体积小、适合落地
Plain Textopencv_traincascade.exe ^-data out ^-vec pos.vec ^-bg neg.txt ^-numPos 900 ^-numNeg 4500 ^-numStages 12 ^-featureType LBP ^-w 24 -h 24 ^-minHitRate 0.995 ^-maxFalseAlarmRate 0.5 |
核心参数解释
•numStages:训练级数,越高精度越高、训练越慢(推荐10~14)
•featureType:LBP / HAAR
•minHitRate:单层最小命中率
•maxFalseAlarmRate:最大误检率
训练过程特征:
每一级训练完成,会自动生成stage.xml,最终合并为cascade.xml可用模型。
八、自定义模型测试代码
训练完成得到 cascade.xml,直接替换即可检测自定义目标:
pythonimport cv2# 加载自己训练的模型cascade = cv2.CascadeClassifier("out/cascade.xml")img = cv2.imread("test.jpg")gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 目标检测res = cascade.detectMultiScale(gray, 1.1, 3)for (x,y,w,h) in res:cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)cv2.imshow("Custom Detect",img)cv2.waitKey(0)cv2.destroyAllWindows()cv2.imwrite("result.jpg",img) |
九、训练失败/效果差常见原因(避坑大全)
•坑1:正负样本混杂负样本里出现目标物体,训练直接报废
•坑2:样本尺寸不统一必须统一训练尺寸24×24/32×32
•坑3:负样本数量太少负样本不足会导致大量误检
•坑4:训练级数太低stage小于8,模型基本无效
•坑5:样本过于单一光照、角度单一,泛化极差,换场景就失效
十、Haar vs LBP 训练选型
•LBP训练:速度极快、几分钟跑完、体积小、适合工程落地(首选)
•Haar训练:精度更高、训练极慢、适合静态高精度场景
十一、全文总结
会调用模型只是入门,会训练模型才算真正掌握。
级联分类器训练,是传统视觉中最实用的小目标自定义检测方案:
无需深度学习框架、无需GPU、训练成本极低、部署极简,极其适合工业小件检测、嵌入式设备、简单机器视觉项目。
从样本采集、制作vec、迭代训练、测试部署,完整跑通这套流程,你就彻底吃透了传统目标检测的全套闭环!
❤️ 点赞+在看,后台回复关键词【级训练】领取:一键生成样本脚本+训练参数模板+训练工具包!
关注【AI与计算机视觉】,持续更新 OpenCV 传统视觉从入门到落地全套教程!
评论区打卡:自定义级联训练