【目标检测数据处理】

系列文章目录

在目标检测领域,处理数据是一项非常重要且繁琐的事情,因此本文总结了目前数据处理中可能用到的代码,方便大家使用
第一章 xml与图片的处理



前言

xml与图片的相爱相杀


一、比对xml文件夹与图片文件夹

# -*- coding: utf-8 -*-
import os


path1 = r"D:\beijing_jiebang\VOCdevkit\VOCALL\JPEGImages"
path2 = r"D:\beijing_jiebang\VOCdevkit\VOCALL\Annotations"

def file_name(image_dir,xml_dir):
    jpg_list = []
    xml_list = []
    for root, dirs, files in os.walk(image_dir):
        for file in files:
            jpg_list.append(os.path.splitext(file)[0])
    for root, dirs, files in os.walk(xml_dir):
        for file in files:
            xml_list.append(os.path.splitext(file)[0])
    print(len(jpg_list))
    diff = set(xml_list).difference(set(jpg_list))  # 差集,在a中但不在b中的元素
    for name in diff:
        print("no jpg", name + ".xml")
    diff2 = set(jpg_list).difference(set(xml_list))  # 差集,在b中但不在a中的元素
    print(len(diff2))
    for name in diff2:
        print("no xml", name + ".jpg")
if __name__ == '__main__':

    file_name(path1,path2)

二、划分数据集,包括train val test

import os
import random

trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = r"D:\beijing_jiebang\VOCdevkit\VOC_resize\ann"
txtsavepath = r"D:\beijing_jiebang\VOCdevkit\VOC_resize\imgeset\main"
total_xml = os.listdir(xmlfilepath)
print (total_xml)
num = len(total_xml)
list = range(num)
#总体取出10%的个数(测试集与验证集个数)
tv = int(num * trainval_percent)
#从10%中再取去90%用作验证集的个数
tr = int(tv * train_percent)
#trainval:包括测试集与验证集
trainval = random.sample(list, tv)#从list中随机获取tv个元素,作为一个片断返回
train = random.sample(trainval, tr)
print(train)

ftrainval = open(r'D:\beijing_jiebang\VOCdevkit\VOC_resize\imgeset\main/trainval.txt', 'w')
print (ftrainval)
ftest = open(r'D:\beijing_jiebang\VOCdevkit\VOC_resize\imgeset\main/val.txt', 'w')
ftrain = open(r'D:\beijing_jiebang\VOCdevkit\VOC_resize\imgeset\main/train.txt', 'w')
fval = open(r'D:\beijing_jiebang\VOCdevkit\VOC_resize\imgeset\main/test.txt', 'w')

for i in list:
    name = total_xml[i][:-4] + '\n'#也就是去除‘.xml’这四个字符


    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftest.write(name)
        else:
            fval.write(name)
    else:
        ftrain.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

三、批量对图片进行缩放resize

# -*- coding: utf-8 -*-
# @File  : PreProcessing.py
# @Author: ddmm
# @Date  : 2020/5/25
# @Desc  : 同步缩放图片(等比例缩放无失真)和xml文件标注的anchor size

import glob
import os
import xml.dom.minidom
import cv2
# 定义待批量裁剪图像的路径地址
IMAGE_INPUT_PATH = r"D:\beijing_jiebang\VOCdevkit\VOCALL\JPEGImages"
XML_INPUT_PATH = r"D:\beijing_jiebang\VOCdevkit\VOCALL\Annotations"
# 定义裁剪后的图像存放地址
IMAGE_OUTPUT_PATH = r"D:\beijing_jiebang\VOCdevkit\VOCALL\img"
XML_OUTPUT_PATH = r"D:\beijing_jiebang\VOCdevkit\VOCALL\ann"
imglist = os.listdir(IMAGE_INPUT_PATH)
xmllist = os.listdir(XML_INPUT_PATH)

for i in range(len(imglist)):
    image_input_fullname = IMAGE_INPUT_PATH + '/' + imglist[i]
    # xml_input_fullname = XML_INPUT_PATH + '/' + xmllist[i]
    xml_input_fullname = XML_INPUT_PATH + '/' + imglist[i].replace("jpg", "xml")
    image_output_fullname = IMAGE_OUTPUT_PATH + '/' + imglist[i]
    xml_output_fullname = XML_OUTPUT_PATH + '/' + xmllist[i]


    img = cv2.imread(image_input_fullname)
    height, width = img.shape[:2]

    # 定义缩放信息 以等比例缩放到416为例
    scale=640/height
    height=640
    width=int(width*scale)

    dom = xml.dom.minidom.parse(xml_input_fullname)
    root = dom.documentElement

    # 读取标注目标框
    objects = root.getElementsByTagName("bndbox")

    for object in objects:
        xmin=object.getElementsByTagName("xmin")
        xmin_data=int(float(xmin[0].firstChild.data))
        # xmin[0].firstChild.data =str(int(xmin1 * x))
        ymin =object.getElementsByTagName("ymin")
        ymin_data = int(float(ymin[0].firstChild.data))
        xmax=object.getElementsByTagName("xmax")
        xmax_data = int(float(xmax[0].firstChild.data))
        ymax=object.getElementsByTagName("ymax")
        ymax_data = int(float(ymax[0].firstChild.data))

        # 更新xml
        width_xml=root.getElementsByTagName("width")
        width_xml[0].firstChild.data=width
        height_xml = root.getElementsByTagName("height")
        height_xml[0].firstChild.data = height

        xmin[0].firstChild.data = int(xmin_data*scale)
        ymin[0].firstChild.data = int(ymin_data*scale)
        xmax[0].firstChild.data = int(xmax_data*scale)
        ymax[0].firstChild.data = int(ymax_data*scale)

        # 另存更新后的文件
        with open(xml_output_fullname, 'w') as f:
            dom.writexml(f, addindent='  ', encoding='utf-8')
        # 测试缩放效果
        img = cv2.resize(img, (width, height))
        # # xmin, ymin, xmax, ymax分别为xml读取的坐标信息
        # left_top = (int(xmin_data*scale), int(ymin_data*scale))
        # right_down= (int(xmax_data*scale), int(ymax_data*scale))
        # cv2.rectangle(img, left_top, right_down, (255, 0, 0), 1)

    cv2.imwrite(image_output_fullname,img)

今天摸鱼就到这里吧,哈哈哈


总结

以上就是今天要讲的内容,本文分享了总结的目标检测数据处理代码,以后还会接着分享,第一篇加油!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值