数据集处理
读取训练集文件名称,保存到文件夹中
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))