参考:
Cascade Classifier Training
[OpenCV3]级联分类器训练——traincascade快速使用详解
级联分类器介绍
- 文章总概:Cascade分类器全程级联增强弱分类器(boosted cascade of weak classifiers),而使用此分类器主要包括两方面------训练&定位。而麻烦的在于训练,如何训练,正是这篇文章将要介绍的:1.收集数据,2.准备训练数据以及训练模型。
- 个人理解:人脸检测中一个比较好的算法是mtcnn网络,也是一个级联分类器,与Cascade的区别在于一个用的卷积神经网络,一个用的是Haar或者LBP提取特征。而弱分类器的原理可以总结为:一个分类器通过学习而能够分辨的特征的能力有限,但如果让多个分类器去学习识别不同的特征,这样通过多个分类器进行分类后,所产生的结果错误率将极大降低。
数据准备
不更新了,只能用CPU训练的速度太慢了,而且网上都说这种方法的正确率不太好,所以不更新了
- 可以通过官方给的样本做正样本标签,也可以通过此工具labelImg,建议使用后者,后者在大数据集方面使用较多(列如微软VOC数据集)。
正样本以及负样本生成
正负样本生成脚本
import sys
import numpy as np
import xml.etree.ElementTree as ET
import cv2
import os
import numpy.random as npr
from utils import IoU
from utils import ensure_directory_exists
save_dir = "/home/rui"
anno_path = "./firepos/annotation"
im_dir = "./firepos/images"
pos_save_dir = os.path.join(save_dir, "./res/positive")
neg_save_dir = os.path.join(save_dir, './res/negative')
ensure_directory_exists(pos_save_dir)
ensure_directory_exists(neg_save_dir)
names_xml = os.listdir(anno_path)
img_rule_h = 45
img_rule_w = 45
size = img_rule_h
num = len(names_xml)
print "%d pics in total" % num
p_idx = 0 # positive
n_idx = 0 # negative
d_idx = 0 # dont care
idx = 0
box_idx = 0
for ne_xml in names_xml:
tree = ET.parse(os.path.join(anno_path, ne_xml))
root = tree.getroot()
loc_bbox = []
width_xml = root.find("size").find("width").text
height_xml = root.find("size").find("height").text
for node in root.findall