目标检测数据集的一些处理和函数解释

读取训练集文件名称,保存到文件夹中

import os
# 判断文件夹是否存在,如果不存在则新建
if not os.path.exists("./make_test_name"):
    os.makedirs("./make_test_name")
xmlfilepath=r'./二维码已分开/image'# 图片存储的位置
saveBasePath=r"./make_test_name/"# 存储文件夹
# 获取标签文件夹中全部的标签
temp_xml = os.listdir(xmlfilepath)
total_xml = []
# 遍历读取到的所有文件名,将.jpg结尾的文件append
for xml in temp_xml:
    if xml.endswith(".jpg"):
        total_xml.append(xml)
num=len(total_xml)
list=range(num)
print("一共有{}张jpg图片".format(num))
ftest = open(os.path.join(saveBasePath,'test.txt'), 'w')
# 将图片的名字写入到文件中
for i in list:
    name=total_xml[i][:-4]+'\n'# 获取标签文件的名字
    ftest.write(name)
ftest .close()

将一个文件夹中混乱的文件按类别分开,并保存到不同文件夹下

import os
from shutil import copy
# 下面的if都是判断文件是否存在,否则就新建出来
if not os.path.exists("./二维码已分开"):
    os.makedirs("./二维码已分开")
if not os.path.exists("./二维码已分开/lable"):
    os.makedirs("./二维码已分开/lable")
if not os.path.exists("./二维码已分开/image"):
    os.makedirs("./二维码已分开/image")
    
xmlfilepath=r'./二维码'# 源文件
savelablePath=r"./二维码已分开/lable/" # 存储标签文件夹
saveimagePath=r"./二维码已分开/image/"# 存储图片文件夹
temp_xml = os.listdir(xmlfilepath) # 获取文件夹中的全部文件
num=0
for xml in temp_xml:
    if xml.endswith(".xml"):
        copy(xmlfilepath+'/'+xml, './二维码已分开/lable/')
    if xml.endswith(".jpg"):
        copy(xmlfilepath+'/'+xml, "./二维码已分开/image/")
    print("finish",num)
    num+=1

函数解析

读取改文件夹内的内容
temp_xml = os.listdir(xmlfilepath)

copy():次函数需要绝对路径加文件名
copy(xmlfilepath+’/’+xml, ‘./二维码已分开/lable/’)
xmlfilepath:路径
xml:文件名
./二维码已分开/lable/:要拷贝到的文件夹
源文件:是两个文件类型混合的状态在这里插入图片描述

将标签文件中的框子画到图片上来验证标签的正确性

from PIL import Image, ImageDraw
import xml.etree.ElementTree as ET
import os

if not os.path.exists("./output1"):
    os.makedirs("./output1")
if not os.path.exists("./output1/ground-truth"):
    os.makedirs("./output1/ground-truth")
  
# image_ids = open('make_test_name/test.txt').read().strip().split()
xmlfilepath = './二维码已分开/image/'
temp_xml = os.listdir(xmlfilepath)
number=1
# for image_id in image_ids:
for temp in temp_xml:
    # image_path = "./二维码已分开/image/" + image_id + ".jpg"
    image_id = temp[:-4]
    image_path = "./二维码已分开/image/" + temp
    image = Image.open(image_path)
    # 更改图片的类型
    if image.mode == "P" or "l":
        image = image.convert('RGB')
    draw = ImageDraw.Draw(image)
    # 读取.xml文件
    root = ET.parse("二维码已分开/lable/" + image_id + ".xml").getroot()# 绝对地址
    for obj in root.findall('object'):
        obj_name = obj.find('name').text
        bndbox = obj.find('bndbox')
        left = bndbox.find('xmin').text
        top = bndbox.find('ymin').text
        right = bndbox.find('xmax').text
        bottom = bndbox.find('ymax').text
        # 将读取到的str转化成int
        left=int(left)
        top = int(top)
        right = int(right)
        bottom = int(bottom)
        #print(type(left))
        # 画图,画两次
        for i in range(2):
            #print(type(i))
            draw.rectangle([left + i, top + i, right - i, bottom - i], outline=(0, 255, 0))
    image.save("./output1/ground-truth/" + temp)
    print("fishi",number)
    number+=1
    # image.show()

函数解析

image_ids = open(‘make_test_name/test.txt’).read().strip().split()
str.strip():删除字符头部和尾部的指定内容(用“””引住),括号内什么也没写,不是去除回车 /n是换行
str.split():按要求进行分割,以列表形式返回

匹配图片和标签是一对一的

import os
path= r"./image"
path1= r"./lable"
image=os.listdir(path)
label = os.listdir(path1)

for lab in label:
    i = 0
    j = 0
    labname = lab[:-4]
    for img in image:
        name = img[:-4]
        if labname==name:
            #print("label和image相同", name)
            i+=1
        else:
            j+=1
    if i==0 :
        print(labname)
    else:
        print("全部正确")

通过遍历两个文件夹中的名字是否匹配

批量修改xml文件中的内容

import xml.etree.ElementTree as ET
import os
# 原先的xml文件中的类别
from config import config1,config2,config3,config4
xmlfilepath = r'./trainval/VOC2007/test'# 要修改的xml文件
temp_xml = os.listdir(xmlfilepath)
total_xml = []
khsw=[]
print("============ Start Change ============")
for k, xml in enumerate(temp_xml): # 得到所有的xml文件,存储到列表中
    if xml.endswith(".xml"):
        total_xml.append(xml)
        # 读取xml文件的路径必须是这种格式
        in_file = open('trainval/VOC2007/test/' + xml, encoding='UTF-8')
        out_file = 'trainval/VOC2007/test/' + xml
        tree = ET.parse(in_file)
        root = tree.getroot()  # 使用getroot()获取根节点,得到的是一个Element对象
        for element in root.findall('object'):  # Element.findall()
            name = element.find('name')
            for i in config1:
                if name.text == i:# 修改name的数据值.text
                    name.text = "可回收物"
            for i in config2:
                if name.text==i:
                    name.text = "厨余垃圾"
            for i in config3:
                if name.text==i:
                    name.text = "有害垃圾"
            for i in config4:
                if name.text==i:
                    name.text = "其他垃圾"
    tree.write(out_file, encoding='utf-8')
    print("已完成",k+1)
num = len(total_xml)
print("一共{},已完成{}".format(num,k+1))
print("============ Finish Change ============")

config文件内容

#"可回收物":
#"厨余垃圾":
# "有害垃圾":
#"其他垃圾":
config1=["充电宝","包","洗护用品","塑料玩具","塑料器皿","塑料衣架","玻璃器皿","金属器皿",
"快递纸袋","插头电线","旧衣服","易拉罐","枕头","毛绒玩具","鞋","砧板","纸盒纸箱","调料瓶",
"酒瓶","金属食品罐","金属厨具","锅","食用油桶","饮料瓶","书籍纸张","垃圾桶"]
config2=["剩饭剩菜","大骨头","果皮果肉","茶叶渣","菜帮菜叶","蛋壳","鱼骨"]
config3=["干电池","软膏","过期药物"]
config4=["一次性快餐盒","污损塑料","烟蒂","牙签","花盆","陶瓷器皿","筷子","污损用纸"]

我这里是将里边比较杂的类规整到四个类别,#“可回收物”:厨余垃圾":其他垃圾",厨余垃圾。

统计标签文件中的类别个数

import xml.etree.ElementTree as ET
import os
# 标签文件夹地址
xmlfilepath = r'./trainval/VOC2007/Annotationss'
temp_xml = os.listdir(xmlfilepath)
total_xml = []
khsw=[]
khslj=0
cylj=0
yhlj=0
qtlj=0
print("============ Start  ============")
for k,xml in enumerate(temp_xml): # 得到所有的xml文件,存储到列表中
    if xml.endswith(".xml"):
        total_xml.append(xml)
        # 真实标签地址
        in_file = open('trainval/VOC2007/Annotationss/' + xml, encoding='UTF-8')
        tree = ET.parse(in_file)
        root = tree.getroot()  # 使用getroot()获取根节点,得到的是一个Element对象
        for element in root.findall('object'):  # Element.findall()
            name = element.find('name')
            if name.text=="可回收物":
                khslj+=1;
                #print(name.text)
            if name.text=="厨余垃圾":
                cylj+=1

            if name.text== "有害垃圾":
                yhlj+=1

            if name.text=="其他垃圾":
                qtlj+=1
print("可回收物={}张,厨余垃圾={}张,有害垃圾={}张,其他垃圾={}张".format(khslj,cylj,yhlj,qtlj))




  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值