一、训练超参数设置
dlib库中目标检测器训练的超参数由dlib.simple_object_detector_training_options类设定。下面我们来详细看看这个类
class simple_object_detector_training_options():
__init__()
C #svm的C参数,默认为1
add_left_right_image_flips #bool型,训练图像是否左右翻转,默认False
be_verbose #bool型,是否在屏幕上输出训练过程中的日志信息,默认False
detection_window_size #滑动窗口的大小,默认80*80
epsilon #训练终止误差,默认0.01
num_threads #训练的线程数目,默认4
【1】C
C参数其实就是SVM分类器中loss函数的正则项系数,参见下图SVM的loss函数。
这里的就是对于第个样本点的分类损失,如果分类正确则是0,如果分类有所偏差则对应一个线性的值,是总误差,我们优化的目标当然是这个值越小越好,越小代表对训练集的分类越精准。目标函数中的另一项(常数1/2是为了方便求导加上去的)的最小化的优化方向则是使间隔(两类之间的距离)最大。
原则上C可以根据需要选择所有大于0的数。C越大表示整个优化过程中对于总误差的关注程度越高,对于减小误差的要求越高,甚至不惜使间隔减小。
总之,C值越大对于训练集的拟合越好,抗噪声能力越差,越容易过拟合,C越小,拟合效果越差。推荐使用的C为5。
【2】add_left_right_image_flips
这个参数用于训练集的数据增广。设置为True的话,会对训练集进行左右翻折,相当于增大了一倍的训练数据。但是当分类目标是左右对称时,设置这个参数才有实际意义。
【3】detection_window_size
滑动窗口的包含的像素数目,为int型。但是一般为了方便,设置时直接写为诸如40*40这种直观的形式。
【4】epsilon
epsilon为训练的终止条件。当训练误差小于epsilon时,训练完成。epsilon越小,训练的分类器越准确,但是训练花费的时间越长。
二、训练检测器
训练检测器核心函数为train_simple_object_detector()。该函数有两个版本,主要区别在于训练数据的形式不同。
【1】训练数据由标记的xml文件提供
train_simple_object_detector( (str)dataset_filename, (str)detector_output_filename, (simple_object_detector_training_options)options) -> None
该函数的训练数据是dlib的imglab工具标记的xml文件。第一个参数dataset_filename为训练数据路径,第二个参数detector_output_filename为训练完成的检测器保存路径,第三个参数为训练的超参数设置,是一个dlib.simple_object_detector_training_options对象。
【2】训练数据由图像和矩形框的列表提供
train_simple_object_detector( (list)images, (list)boxes, (simple_object_detector_training_options)options) -> simple_object_detector
值得一说的是,版本2的返回值是一个simple_object_detector对象,即可以直接使用的检测器,而版本1没有返回值,训练好的检测器参数会保存在设置的路径下。
images是一个numpy对象的列表,boxes是一个dlib.rectangle对象的列表。两者数目必须相等。
训练检测器完整流程:
import dlib
training_data_filename = "training.xml"
test_data_filename = "test.xml"
######################################################################################################
#################设置训练超参数##############################################################################
options = dlib.simple_object_detector_training_options()
options.add_left_right_image_flips = True
options.C = 5
options.num_threads = 4
options.be_verbose = True
########################################################################################
#######################################################################################
#################训练检测器############################################################
dlib.train_simple_object_detector(training_data_filename, "detector.svm", options)
#####################################################################################
#####################################################################################
################测试准确率##########################################################
print("Training accuracy: ", dlib.test_simple_object_detector(test_data_filename, "detector.svm"))
#####################################################################################