【Tensorflow 目标检测中数据增强究竟起了什么作用?】探索数据增强的真正作用(通过具体模型+具体数据增强Data Augmentation方式来实例验证)

Tensorflow 目标检测中数据增强究竟起了什么作用?— 探索数据增强的真正作用

1. 无数据增强模型和有数据增强模型–>测试同一数据集
  1. 利用voc数据集(train:07+12trainandvalidation test:07test)进行训练和测试;

  2. 训练不包含任何数据增强方法的mobilenet-ssd,最终mAP为:22.64%

  3. 训练只包含random_vertical_flip(#随机垂直翻转)的mobilenet-ssd,最终mAP为:21.91%

  4. 两个map的差别分析原因:
    (1)两个mAP不同,并且拥有垂直翻转数据增强的模型mAP还小于本身模型,说明随机垂直翻转没有提升了模型对于图像的识别能力,因为测试集中不存在翻转的目标。
    同时说明了随机垂直翻转数据增强没能够对原始正常图像起到一个数据量增大或者是鲁棒性提升的效果,因此对于正常的测试集结果没有提升。
    (2)记录此处两个mAP的差值(记录为C1):-0.73%



2. 无数据增强模型和有数据增强模型–>测试同一翻转数据集(1步骤中的数据集翻转得到)
  1. 将测试集全部图像翻转,组成一个新的测试集;

(1)处理图像代码:

from PIL import Image
import os

os.chdir('/*/personaddcar/test/VOCdevkit/VOC2007/JPEGImages')
for filename in os.listdir('/*/personaddcar/test/VOCdevkit/VOC2007/JPEGImages'):
    print(filename)
    im=Image.open(filename)
    im=im.rotate(180)
    im.save(filename, quality = 95, subsampling = 0)

(2)处理xml文件代码:

import xml.etree.cElementTree as ET
import os


path_root = "/*/test/VOCdevkit/VOC2007/Annotations/" 
xml_list = os.listdir(path_root)


for axml in xml_list:
    path_xml = os.path.join(path_root, axml)
    tree = ET.parse(path_xml)
    root = tree.getroot()
    width = root.find('size').find('width').text
    height = root.find('size').find('height').text
 
    for child in root.findall('object'):
        bndbox = child.find('bndbox')
        xmin = bndbox.find('xmin').text
        ymin = bndbox.find('ymin').text
        xmax = bndbox.find('xmax').text
        ymax = bndbox.find('ymax').text
        new_xmin = str(int(width) - int(xmax))
        new_ymin = str(int(height) - int(ymax))
        new_xmax = str(int(width) - int(xmin))
        new_ymax = str(int(height) - int(ymin))
        bndbox.find('xmin').text = new_xmin
        bndbox.find('ymin').text = new_ymin
        bndbox.find('xmax').text = new_xmax
        bndbox.find('ymax').text = new_ymax
        tree.write(os.path.join("/*/VOCdevkit/VOC2007/Annotations/", axml))
        print("***********finish one object**************")
  1. 利用该测试集测试不包含任何数据增强方法的mobilenet-ssd,最终mAP为:4.04%,其中对于每一个类别的详细mAP中,对于飞机类和猫类的识别情况较好,因为这两类某些垂直翻转情况对于原图像的影响不是很大,不属于普遍的关于水平对称的目标,但是和正常测试集的飞机类和猫类的mAP结果相比还是差距较大。

  2. 利用该测试集测试只包含random_vertical_flip(#随机垂直翻转)的mobilenet-ssd,最终mAP为:22.14%

  3. 两个map的差别分析原因:
    (1)如果两个mAP不同,说明随机垂直翻转提升了模型对于图像的识别能力,而该能力的提升代表模型对于垂直翻转目标的识别能力变强了,不是因为训练数据集变大了
    (2)观察此处两个mAP的差值(记录为C2):18.1%



3. 结论:
(1)如果C1>=C2,代表随机垂直翻转提升了模型对于图像的识别能力,而该能力的提升大概率是依赖于数据增强导致的数据集变大,不代表模型对于垂直翻转目标的识别能力变强了;
(2)如果C10,说明随机垂直翻转提升了模型对于图像的识别能力,而该能力的提升不仅仅代表模型对于垂直翻转目标的识别能力变强了,同时也代表数据增强使得训练数据集变大起了效果。
(3)如果C1,说明随机垂直翻转提升了模型对于图像的识别能力,而该能力的提升仅仅代表模型对于垂直翻转目标的识别能力变强了,不代表数据增强使得训练数据集变大起了效果。

这说明想识别什么还是得训练集中有什么!!训练集中没有的特征别指望模型可以泛化了!!!



4. 附注:
  • 在实验中发现,当利用合适的数据增强方法时,对于模型在正常公开数据集的测试集(例如,VOC 07test)上的mAP提升明显;

  • 比如,正常训练mobilenet-ssd目标检测模型时采用的数据增强方式为下图的2个数据增强方式,训练后的模型在测试集上的mAP能达到68%,远远大于目前不利用数据增强方式训练得到的模型。
    【Tensorflow 目标检测中数据增强究竟起了什么作用?】探索数据增强的真正作用(通过具体模型+具体数据增强Data Augmentation方式来实例验证)_第1张图片

  • 上述现象体现了合适的数据增强的方法对于目标检测模型的重要性,提升了原始模型的鲁棒性。

  • 也体现了神经网络目标检测模型不具备旋转不变性,仅能依靠数据增强方式来提升部分旋转不变性。


5. 同样更新于知乎账号中

你可能感兴趣的:(深度学习,神经网络,深度学习)