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 将Main
中train.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()