yolov4相关图片处理及标签转换挑选等代码

1 视频图片截取

# 导入所需要的库
import cv2
import numpy as np
 
# 定义保存图片函数
# image:要保存的图片名字
# addr;图片地址与相片名字的前部分
# num: 相片,名字的后缀。int 类型
def save_image(image,addr,num):
    address = addr + str(num)+ '.jpg'
    cv2.imwrite(address,image)
 
# 读取视频文件
videoCapture = cv2.VideoCapture("10.mp4")
# 通过摄像头的方式
# videoCapture=cv2.VideoCapture(1)
 
#读帧
success, frame = videoCapture.read()
i = 1000
timeF = 6
j=0
while success :
    i = i + 1
    if (i % timeF == 0):
        j = j + 1
        save_image(frame,'./10/',j)
        print('save image:',i)
    success, frame = videoCapture.read()

2 批量JPG、xml等重命名

import os
 
class BatchRename():
 
#定义函数执行图片的路径
    def __init__(self):
        
        self.path = '.\JPEGImages'#修改为自己的图片路径
 
#定义函数实现重命名操作
    def rename(self):
        filelist = os.listdir(self.path)
        total_num = len(filelist)
        i = 0
        for item in filelist:
            if item.endswith('.jpg'):
                src = os.path.join(os.path.abspath(self.path), item)
                dst = os.path.join(os.path.abspath(self.path), str(i).zfill(6) + '.jpg')
                try:
                    os.rename(src, dst)
                    print('converting %s to %s ...' % (src, dst))
                    i = i + 1
                except:
                    continue
        print ('total %d to rename & converted %d jpgs' % (total_num, i))
 
#主函数调用
if __name__ == '__main__':
    demo = BatchRename()
    demo.rename()

3 批量修改VOC数据集中xml标签文件的标签名称

import os
import xml.etree.ElementTree as ET

#程序功能:批量修改VOC数据集中xml标签文件的标签名称
def changelabelname(inputpath):
    listdir = os.listdir(inputpath)
    for file in listdir:
        if file.endswith('xml'):
            file = os.path.join(inputpath,file)
            tree = ET.parse(file)
            root = tree.getroot()
            for object1 in root.findall('object'):
                for sku in object1.findall('name'):           #查找需要修改的名称
                    if (sku.text == 'pedestrians'):               #‘preName’为修改前的名称
                        sku.text = 'person'                 #‘TESTNAME’为修改后的名称
                        tree.write(file,encoding='utf-8')     #写进原始的xml文件并避免原始xml中文字符乱码
                    else:
                        pass
        else:
            pass

if __name__ == '__main__':
    inputpath = 'C:/Users/DELL/Desktop/MJ/shuju/myshuju/Annotations'  #此处替换为自己的路径
    changelabelname(inputpath)

4 类别挑选


import os  
import os.path  
import shutil  

#换成自己的路径
fileDir_ann = 'F:/我的/目标检测/数据集/VOC/VOCdevkit/VOC2007/JPEGImages/'  
fileDir_img = 'F:/我的/目标检测/数据集/VOC/VOCdevkit/VOC2007/Annotations/'  
saveDir_img = 'F:/我的/目标检测/数据集/VOC/VOCdevkit/20200906/444/' 

if not os.path.exists(saveDir_img):  
    os.mkdir(saveDir_img)  


names = locals()  

for files in os.walk(fileDir_ann):  
    for file in files[2]:  

        print (file + "-->start!" ) 
        #换成自己的保存路径
        saveDir_ann = 'F:/我的/目标检测/数据集/VOC/VOCdevkit/20200906/444/'  
        if not os.path.exists(saveDir_ann):  
            os.mkdir(saveDir_ann)  

        fp = open(fileDir_ann + '\\' + file)          
        saveDir_ann = saveDir_ann + file  
        fp_w = open(saveDir_ann, 'w')  
        #VOC所有类别
        classes = ['aeroplane','bicycle','bird','boat','bottle','bus','car','cat','chair','cow','diningtable','dog','horse','motorbike','pottedplant','sheep','sofa','train','tvmonitor','person']  

        lines = fp.readlines()
        ind_start = []  
        ind_end = []  
        lines_id_start = lines[:]  
        lines_id_end = lines[:]
        
        #提取自己的类别
        # classes1 = '\t\t<name>bicycle</name>\n'
        #classes2 = '\t\t<name>sofa</name>\n'
        classes3 = '\t\t<name>chair</name>\n'
        # classes4 = '\t\t<name>motorbike</name>\n'
        # classes5 = '\t\t<name>person</name>\n'
        
        while "\t<object>\n" in lines_id_start:  
            a = lines_id_start.index("\t<object>\n")            
            ind_start.append(a)  
            lines_id_start[a] = "delete"  

        while "\t</object>\n" in lines_id_end:  
            b = lines_id_end.index("\t</object>\n")  
            ind_end.append(b)  
            lines_id_end[b] = "delete"  

        i = 0  
        for k in range(0,len(ind_start)):
            names['block%d'%k] = []
            for j in range(0,len(classes)):  
                if classes[j] in lines[ind_start[i]+1]:  
                    a = ind_start[i]
                    for o in range(ind_end[i]-ind_start[i]+1):
                        names['block%d'%k].append(lines[a+o])
                    break  
            i += 1  

        string_start = lines[0:ind_start[0]]           
        a = 0  
        for k in range(0,len(ind_start)):  
            # if classes1 in names['block%d'%k]:  
                # a += 1  
                # string_start += names['block%d'%k]  
            #if classes2 in names['block%d'%k]:  
                #a += 1  
                #string_start += names['block%d'%k]  
            if classes3 in names['block%d'%k]:  
                a += 1  
                string_start += names['block%d'%k]
            # if classes4 in names['block%d'%k]:  
                # a += 1  
                # string_start += names['block%d'%k]                
            # if classes5 in names['block%d'%k]:  
                # a += 1  
                # string_start += names['block%d'%k]
                
        string_start += lines[ind_end[-1]+1:]    
        for c in range(0,len(string_start)):  
            fp_w.write(string_start[c])  
        fp_w.close()  

        if a == 0:  
            os.remove(saveDir_ann)  
        else:  
            name_img = fileDir_img + os.path.splitext(file)[0] + ".jpg"  
            shutil.copy(name_img,saveDir_img)  
        fp.close()  

5 图片标签信息统计

a:

import re
import os
import xml.etree.ElementTree as ET


class1 = 'person'
class2 = 'chair'
class3 = 'sofa'
class4 ='bicycle'
class5 ='table'
class6 ='car'
class7 ='motorbike'


'''class6 = 'bus'
class7 = 'car'
class8 = 'cat'
class9 = 'chair'
class10 = 'cow'
class11 = 'diningtable'
class12 = 'dog'
class13 = 'horse'
class14 = 'motorbike'
class15 = 'person'
class16 = 'pottedplant'
class17 = 'sheep'
class18 = 'sofa'
class19 = 'train'
class20 = 'tvmonitor'
'''
annotation_folder = 'C:\\Users\\DELL\\Desktop\\MJ\\shuju\\22223\\'		#改为自己标签文件夹的路径
#annotation_folder = '/home/.../VOC2007/Annotations/'
list = os.listdir(annotation_folder)
 
 
def file_name(file_dir):
	L = []
	for root, dirs, files in os.walk(file_dir):
		for file in files:
			if os.path.splitext(file)[1] == '.xml':
				L.append(os.path.join(root, file))
	return L
 
 
total_number1 = 0

total_number2 = 0
total_number3 = 0
total_number4 = 0
total_number5 = 0
total_number6 = 0
total_number7 = 0
'''
total_number6 = 0
total_number7 = 0
total_number8 = 0
total_number9 = 0
total_number10 = 0
total_number11 = 0
total_number12 = 0
total_number13 = 0
total_number14 = 0
total_number15 = 0
total_number16 = 0
total_number17 = 0
total_number18 = 0
total_number19 = 0
total_number20 = 0'''
total = 0
total_pic=0
 
pic_num1 = 0
pic_num2 = 0
pic_num3 = 0
pic_num4 = 0
pic_num5 = 0
pic_num6 = 0
pic_num7 = 0
'''pic_num6 = 0
pic_num7 = 0
pic_num8 = 0
pic_num9 = 0
pic_num10 = 0
pic_num11 = 0
pic_num12 = 0
pic_num13 = 0
pic_num14 = 0
pic_num15 = 0
pic_num16 = 0
pic_num17 = 0
pic_num18 = 0
pic_num19 = 0
pic_num20 = 0'''
 
flag1 = 0
flag2 = 0
flag3 = 0
flag4 = 0
flag5 = 0
flag6 = 0
flag7 = 0

'''flag7 = 0
flag8 = 0
flag9 = 0
flag10 = 0
flag11 = 0
flag12 = 0
flag13 = 0
flag14 = 0
flag15= 0
flag16 = 0
flag17 = 0
flag18 = 0
flag19 = 0
flag20 = 0'''
 
xml_dirs = file_name(annotation_folder)
 
for i in range(0, len(xml_dirs)):
	print(xml_dirs[i])
	#path = os.path.join(annotation_folder,list[i])
	#print(path)
 
	annotation_file = open(xml_dirs[i]).read()
 
	root = ET.fromstring(annotation_file)
	#tree = ET.parse(annotation_file)
	#root = tree.getroot()
 
	total_pic = total_pic + 1
	for obj in root.findall('object'):
		label = obj.find('name').text
		if label == class1:
			total_number1=total_number1+1
			flag1=1
			total = total + 1
			print("bounding box number:", total_number1)
		if label == class2:
			total_number2=total_number2+1
			flag2=1
			total = total + 1
		if label == class3:
			total_number3=total_number3+1
			flag3=1
			total = total + 1
		if label == class4:
			total_number4=total_number4+1
			flag4=1
			total = total + 1
		if label == class5:
			total_number5=total_number5+1
			flag5=1
			total = total + 1
		if label == class6:
			total_number6=total_number6+1
			flag6=1
			total = total + 1
		if label == class7:
			total_number7=total_number7+1
			flag7=1
			total = total + 1

		'''if label == class6:
			total_number6=total_number6+1
			flag6=1
			total = total + 1
		if label == class7:
			total_number7=total_number7+1
			flag7=1
			total = total + 1
		if label == class8:
			total_number8=total_number8+1
			flag8=1
			total = total + 1
		if label == class9:
			total_number9=total_number9+1
			flag9=1
			total = total + 1
		if label == class10:
			total_number10=total_number10+1
			flag10=1
			total = total + 1
		if label == class11:
			total_number11=total_number11+1
			flag11=1
			total = total + 1
		if label == class12:
			total_number12=total_number12+1
			flag12=1
			total = total + 1
		if label == class13:
			total_number13=total_number13+1
			flag13=1
			total = total + 1
		if label == class14:
			total_number14=total_number14+1
			flag14=1
			total = total + 1
		if label == class15:
			total_number15=total_number15+1
			flag15=1
			total = total + 1
		if label == class16:
			total_number16=total_number16+1
			flag16=1
			total = total + 1
		if label == class17:
			total_number17=total_number17+1
			flag17=1
			total = total + 1
		if label == class18:
			total_number18=total_number18+1
			flag18=1
			total = total + 1
		if label == class19:
			total_number19=total_number19+1
			flag19=1
			total = total + 1
		if label == class20:
			total_number20=total_number20+1
			flag20=1
			total = total + 1'''
 
	if flag1==1:
		pic_num1=pic_num1+1
		#print("pic number:", pic_num1)
		flag1=0
	if flag2==1:
		pic_num2=pic_num2+1
		flag2=0

	if flag3==1:
		pic_num3=pic_num3+1
		flag3=0
	if flag4==1:
		pic_num4=pic_num4+1
		flag4=0
	if flag5==1:
		pic_num5=pic_num5+1
		flag5=0
	if flag6==1:
		pic_num6=pic_num6+1
		flag6=0
	if flag7==1:
		pic_num7=pic_num7+1
		flag7=0
	
	'''if flag6==1:
		pic_num6=pic_num6+1
		flag6=0
	if flag7==1:
		pic_num7=pic_num7+1
		flag7=0
	if flag8==1:
		pic_num8=pic_num8+1
		flag8=0
	if flag9==1:
		pic_num9=pic_num9+1
		flag9=0
	if flag10==1:
		pic_num10=pic_num10+1
		flag10=0
	if flag11==1:
		pic_num11=pic_num11+1
		flag11=0
	if flag12==1:
		pic_num12=pic_num12+1
		flag12=0
	if flag13==1:
		pic_num13=pic_num13+1
		flag13=0
	if flag14==1:
		pic_num14=pic_num14+1
		flag14=0
	if flag15==1:
		pic_num15=pic_num15+1
		flag15=0
	if flag16==1:
		pic_num16=pic_num16+1
		flag16=0
	if flag17==1:
		pic_num17=pic_num17+1
		flag17=0
	if flag18==1:
		pic_num18=pic_num18+1
		flag18=0
	if flag19==1:
		pic_num19=pic_num19+1
		flag19=0
	if flag20==1:
		pic_num20=pic_num20+1
		flag20=0'''
 
 
print(class1,pic_num1,total_number1)
print(class2,pic_num2,total_number2)

print(class3,pic_num3, total_number3)
print(class4,pic_num4, total_number4)
print(class5,pic_num5, total_number5)
print(class6,pic_num6, total_number6)
print(class7,pic_num7, total_number7)
'''
print(class6,pic_num6, total_number6)
print(class7,pic_num7, total_number7)
print(class8,pic_num8, total_number8)
print(class9,pic_num9, total_number9)
print(class10,pic_num10, total_number10)
print(class11,pic_num11,total_number11)
print(class12,pic_num12,total_number12)
print(class13,pic_num13, total_number13)
print(class14,pic_num14, total_number14)
print(class15,pic_num15, total_number15)
print(class16,pic_num16, total_number16)
print(class17,pic_num17, total_number17)
print(class18,pic_num18, total_number18)
print(class19,pic_num19, total_number19)
print(class20,pic_num20, total_number20)'''
 
print("total", total_pic, total)
 

b:

# -*- coding:utf-8 -*-
import os
import xml.etree.ElementTree as ET
from PIL import Image
 
def parse_obj(xml_path, filename):
  tree=ET.parse(xml_path+filename)
  objects=[]
  for obj in tree.findall('object'):
    obj_struct={}
    obj_struct['name']=obj.find('name').text
    objects.append(obj_struct)
  return objects
 
 
def read_image(image_path, filename):
  im=Image.open(image_path+filename)
  W=im.size[0]
  H=im.size[1]
  area=W*H
  im_info=[W,H,area]
  return im_info
 
 
if __name__ == '__main__':
  xml_path="Annotations/"
  filenamess=os.listdir(xml_path)
  filenames=[]
  for name in filenamess:
    name=name.replace('.xml','')
    filenames.append(name)
  recs={}
  obs_shape={}
  classnames=[]
  num_objs={}
  obj_avg={}
  for i,name in enumerate(filenames):
    recs[name]=parse_obj(xml_path, name+ '.xml' )
  for name in filenames:
    for object in recs[name]:
      if object['name'] not in num_objs.keys():
         num_objs[object['name']]=1
      else:
         num_objs[object['name']]+=1
      if object['name'] not in classnames:
         classnames.append(object['name'])
  for name in classnames:
    print('{}:{}个'.format(name,num_objs[name]))
  print('信息统计算完毕。')

6 test生成(.txt)

根据已生成的xml,制作VOC2007数据集中的trainval.txt ; train.txt ; test.txt ; val.txt
trainval占总数据集的50%,test占总数据集的50%;train占trainval的50%,val占trainval的50%;

import os
import random 

 
xmlfilepath=r"E:\\mubiao\\yolov4\\yolov4-keras-master\\VOCdevkit\\VOC2007\\Annotations"
saveBasePath=r"E:\\mubiao\\yolov4\\yolov4-keras-master\\VOCdevkit\\VOC2007\\ImageSets\\Main"
 
trainval_percent=1
train_percent=0.1


temp_xml = os.listdir(xmlfilepath)
total_xml = []
for xml in temp_xml:
    if xml.endswith(".xml"):
        total_xml.append(xml)

num=len(total_xml)  
list=range(num)  
tv=int(num*trainval_percent)  
tr=int(tv*train_percent)  
trainval= random.sample(list,tv)  
train=random.sample(trainval,tr)  
 
print("train and val size",tv)
print("traub suze",tr)
ftrainval = open(os.path.join(saveBasePath,'trainval.txt'), 'w')  
ftest = open(os.path.join(saveBasePath,'test.txt'), 'w')  
ftrain = open(os.path.join(saveBasePath,'train.txt'), 'w')  
fval = open(os.path.join(saveBasePath,'val.txt'), 'w')  
 
for i  in list:  
    name=total_xml[i][:-4]+'\n'  
    if i in trainval:  
        ftrainval.write(name)  
        if i in train:  
            ftrain.write(name)  
        else:  
            fval.write(name)  
    else:  
        ftest.write(name)  
  
ftrainval.close()  
ftrain.close()  
fval.close()  
ftest .close()

7 将Maintrain.txt 等相应xml文件分别存储

#某一个txt文本中的数字存的是图片的名字,
#要把这些名字的图片保存到另一个文件夹中
#修改两处,注意自己建立文件
from PIL import Image
import os

f3 = open("/media/hkd/f22a2591-f8d6-4a4e-b02c-1ed94ed27262/dell/wuyahui/yolov4/darknet-master/build/darknet/x64/myData/ImageSets/Main/val.txt",'r') #train文件所在路径
for line2 in f3.readlines():
    line3=line2[:-1] #读取所有数字  000000
    xmldir = '/media/hkd/f22a2591-f8d6-4a4e-b02c-1ed94ed27262/dell/wuyahui/yolov4/darknet-master/build/darknet/x64/myData/Annotations/' 
     #所有的xml文件绝对路径
    savedir = '/media/hkd/f22a2591-f8d6-4a4e-b02c-1ed94ed27262/dell/wuyahui/yolov4/darknet-master/build/darknet/x64/myData/val/'
    #将用于train的xml文件提取出来的绝对路径
    xmllist = os.listdir(xmldir)
    for xml in xmllist:
        # if '.xml' in xml:
        if '.xml' in xml:
            if line3 in xml:
                fo = open(savedir + '/' + '{}'.format(xml), 'w')  
                print('{}'.format(xml))
                fi = open(xmldir + '/' + '{}'.format(xml), 'r')
                content = fi.readlines()
                for line in content:
                    fo.write(line)
                fo.close()
                print('替换成功')
f3.close()

8 图片及标注信息文件名对应

判断

import xml.etree.ElementTree as ET

# 查找filename节点并更新
def Update_xml(xml_path,name):
    root = ET.parse(xml_path)
    for node in root.findall('filename'):
        if node.text != name:
            node.text = name

    root.write(xml_path)


def main():
    file_object = open('/media/hkd/f22a2591-f8d6-4a4e-b02c-1ed94ed27262/dell/wuyahui/yolov4/darknet-master/build/darknet/x64/myData/ImageSets/Main/train.txt', 'rU')
    try:
        for line in file_object:
            path = './Annotations/' + line.rstrip('\n') + '.xml'
            true_name = line.rstrip('\n') + '.jpg'
            Update_xml(path, true_name)
    finally:
        file_object.close()

if __name__ == '__main__':
    main()


更新

import xml.etree.ElementTree as ET
import os

# 查找filename节点并更新
def Update_xml(xml_path,name):
    root = ET.parse(xml_path)
    for node in root.findall('filename'):
        if node.text != name:
            node.text = name

    root.write(xml_path)

def main():
    xml_path = './annotations/'  # xml文件地址
    for xml in os.listdir(xml_path):
        xml_name = os.path.splitext(xml)
        xml_destfile = xml_path + xml_name[0] + xml_name[1]
        Update_xml(xml_destfile, xml_name[0] + '.jpg')

if __name__ == '__main__':
    main()


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值