OpenCV + CPP 系列(卌七)级联分类器训练

一、级联分类器训练简介

在深度学习成熟的年代,很少需要级联分类器了,在垂直领域一些简单检测的场景下,还是有点作用的,模型简单,检测速度快。

xml文件精简:使用python脚本处理xml文件,将若分类器的数据float64->float32或float16进一步加快速度。

使用 Haar、LBP、HOG 特征训练级联分类器
关于 级联分类器(使用) 以及详情查看。
关于 OpenCV—Python CascadeClassifier(级联分类器) 点击查看。

操作步骤

  1. 收集样本数据 – 包括正负样本
  2. 数据规范化 – 大小、格式
  3. 生成vec文件与负样本列表文本文件
  4. 使用OpenCV自动的级联分类器训练工具,训练样本数据
  5. 得到最终的级联分类器数据(XML格式)

(1)以人脸检测为例 –公开的数据库有

  • 正向样本数目
  • 负样本数目
  • 正向样本的大小 – 统一尺寸
  • 正向样本图片中的背景问题

(2)样本集合与描述:正(负)样本集合与描述文件
(3)使用 opencv_createsamples.exe 正样本VEC文件创建
(4)使用 opencv_traincascade.exe 训练样本数据

这两个文件:opencv_traincascaded.exe 和 opencv_createsamplesd.exe 在opencv3.4以上版本就需要编译。https://zhuanlan.zhihu.com/p/109364375
为避免麻烦,我直接下载opencv3.4版本。
在这里插入图片描述
在这里插入图片描述

创建样本

创建 info.dat 文件 (负样本文件同理 bg.txt)
所有正样本文件都在当前目录positive下面, 负样本文件在negative下面

import os
from PIL import Image


def get_write_dat(input_path):
    f = open(input_path+"/info.dat", "w")
    for root, dirs, files in os.walk(input_path):
        for file in files:
            if file.endswith((".png", ".bmp", ".jpg")):
                print("file: ", file)
                try:
                    img = Image.open(os.path.join(root, file))
                    w, h = img.size
                    f.write(" ".join(["positive/"+file, str(1), str(0), str(0), str(w), str(h)])+"\n")
                except Exception as e:
                    print(e)
    f.close()


if __name__ == '__main__':
    input_path = r"D:\opencv-c++\cascade\positive"
    get_write_dat(input_path)

文件info.dat里的内容说明如下:(负样本只需要路径即可)
在这里插入图片描述
创建训练样本vec:执行如下命令

opencv_createsamples.exe \
-info D:\opencv-c++\cascade\positive\info.dat \
-vec D:\opencv-c++\cascade\positive\positive_samples.vec \
-num 185 \
-bgcolor 0 \
-bgthresh 0 \
-w 24 \
-h 24

在这里插入图片描述

训练样本
opencv_traincascade.exe \
-data D:\opencv-c++\cascade \
-vec D:\opencv-c++\cascade\positive_samples.vec \
-bg bg.txt \
-numPos 170 \
-numNeg 500 \
-numStages 12 \
-featureType LBP \
-w 24 \
-h 24 \
-minHitRate 0.996 \
-maxFalseAlarmRate 0.5

说明:
-numPos 170正样本数小于185(所有正样本)
-numNeg 500正样本数大于224(所有负样本)
-featureType LBP 使用LBP训练快(测试一下)

在这里插入图片描述
很快,训练完如下:
在这里插入图片描述

其中上面cascade.xml文件即为训练的模型文件。

关于更多详情:查看官方文档
字段说明如下:

  • -data 指定生成的文件目录,
  • -vec vec文件名,
  • -bg 负样本描述文件名称,也就是负样本的说明文件(.dat)
  • -nstage 20 指定训练层数,推荐15~20,层数越高,耗时越长。
  • -nsplits 分裂子节点数目,选取默认值 2
  • -minhitrate 最小命中率,即训练目标准确度。
  • -maxfalsealarm 最大虚警(误检率),每一层训练到这个值小于0.5时训练结束,进入下一层训练,
  • -npos 在每个阶段用来训练的正样本数目,
  • -nneg 在每个阶段用来训练的负样本数目 这个值可以设置大于真正的负样本图像数目,程序可以自动从负样本图像中切割出和正样本大小一致的,一般设置为正样本数目的1~3倍
  • -mem 程序可使用的内存,这个设置为256即可,实际运行时根本就不怎么耗内存,以MB为单位
  • -mode ALL指定haar特征的种类,BASIC仅仅使用垂直特征,ALL表示使用垂直以及45度旋转特征
  • -w-h 表示样本的宽与高,必须跟vec中声明保持一致

参考:
训练报错解决方法:https://blog.csdn.net/qq_38441692/article/details/88780567
【OpenCV3】级联分类器训练:https://blog.csdn.net/guduruyu/article/details/70183372

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SongpingWang

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值