目标检测任务中常常会遇到图像中目标被遮挡严重的问题,由于遮挡数据复杂多样,遮挡信息丢失严重,模型在训练过程中往往陷入过拟合问题,对训练集中外的数据检测效果下降,在模型层面很难做到很好的改善,这时候就需要我们对数据集进行预处理,一般的方法就是进行图像增强,获取大量的差异性数据增强数据集,生成更多的数据,改善过拟合问题。
本文主要针对大量遮挡目标任务进行数据集增强,通过对目标的部分位置进行遮挡,生成大量新的数据进行训练。
数据集格式使用的VOC数据集格式,标注文件格式下xml
流程:
1.读取xml文件,获取目标的位置信息。
2.(读取作为遮挡物的图像信息)也可以生成指定颜色的遮挡物,一般为黑色
3.读取图像信息
4.根据遮挡部位,计算遮挡物在图像中的位置信息
5.在图像中进行遮挡。
6.生成新的图像文件和xml文件
代码实现:
代码中分别使用图片和色块(即颜色填充)作为遮挡物
分别对目标的不同位置遮挡(左上,右上,左下,右下,左,右,上,下各部分)
分别使用不同的遮挡比例(1/4, 1/2, 3/4)
"""
File: MaskForAugmentation.py
"""
from PIL import Image
from pylab import *
import os
import xml.etree.ElementTree as ET
import random
from shutil import copyfile
"""将数据集中的标注框从图片中剪裁出来
anno_dir存放xml文件,image_dir存放图片
mask_image_dir存放生成的图片,anno_dir存放生成的xml
occlusion_dir存放作为遮挡的图片
up_path存放作为上半部分遮挡的图片
"""
anno_dir = 'F:/数据集/car/anno/'
image_dir = 'F:/数据集/car/image/'
mask_image_dir = 'F:/数据集/car/aug_image/'
mask_xml_dir = 'F:/数据集/car/aug_anno/'
occlusion_dir = 'F:/数据集/car/occ/'
Ratio = [1/4, 1/2, 3/4]
IsImage = True
IsFilling = True
def _main():
#获取全部图片文件名和遮挡图片名
filelist = os.listdir(image_dir)
filelist_occlusion= os.listdir(occlusion_dir)
for file in filelist:
#将图片文件名转换成xml文件名
anno_file = os.path.splitext(file)[0] + '.xml'
#解析xml文件,得到目标的类别名和标注框位置信息
num, annos = _ParseAnnotation(anno_file)
for j in range(num):
#随机选取作为遮挡的图片和遮挡面积比例
occ = random.randint(0, len(Ratio)-1)
ra = random.randint(0, len(filelist_occlusion)-1)
if IsImage:
_Mask_Image(j, annos[j], anno_file, filelist_occlusion[occ], Ratio[ra])
if IsFilling:
_Mask_Filling(j, annos