dlib库学习--------目标检测(hog+svm)

一、训练超参数设置

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函数。

dlib库学习--------目标检测(hog+svm)_第1张图片

    这里的就是对于第个样本点的分类损失,如果分类正确则是0,如果分类有所偏差则对应一个线性的值,是总误差,我们优化的目标当然是这个值越小越好,越小代表对训练集的分类越精准。目标函数中的另一项(常数1/2是为了方便求导加上去的)的最小化的优化方向则是使间隔(两类之间的距离)最大。

原则上C可以根据需要选择所有大于0的数。C越大表示整个优化过程中对于总误差的关注程度越高,对于减小误差的要求越高,甚至不惜使间隔减小。

  • 当C趋于无穷大时,这个问题也就是不允许出现分类误差的样本存在,那这就是一个hard-margin SVM问题
  • 当C趋于0时,我们不再关注分类是否正确,只要求间隔越大越好,那么我们将无法得到有意义的解且算法不会收敛。

      总之,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"))
#####################################################################################





 

你可能感兴趣的:(dlib库学习)