# -*- coding:utf8 -*-
import os
class BatchRename():
'''
批量重命名文件夹中的图片文件
'''
def __init__(self):
self.path = 'D:/素材/污损纸张' #表示需要命名处理的文件夹 D:\素材\垃圾桶
def rename(self):
filelist = os.listdir(self.path) #获取文件路径
total_num = len(filelist) #获取文件长度(个数)
i = 1 #表示文件的命名是从1开始的
for item in filelist:
if item.endswith('.jpg'): #初始的图片的格式为jpg格式的(或者源文件是png格式及其他格式,后面的转换格式就可以调整为自己需要的格式即可)
src = os.path.join(os.path.abspath(self.path), item)
dst = os.path.join(os.path.abspath(self.path), 'wl_stained_paper' + '0000' + format(str(i), '0>3s') + '.jpg')#处理后的格式也为jpg格式的,当然这里可以改成png格式
#dst = os.path.join(os.path.abspath(self.path), '0000' + format(str(i), '0>3s') + '.jpg') 这种情况下的命名格式为0000000.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()
画框
import os
import xml.dom.minidom
import cv2 as cv
ImgPath = '/home/liuyuankai/datasets/myNewVOC/VOC2007/JPEGImages/' # 图片地址
AnnoPath = '/home/liuyuankai/datasets/myNewVOC/VOC2007/Annotations/' # xml文件地址
save_path = './problem'
def draw_anchor(ImgPath, AnnoPath, save_path):
imagelist = os.listdir(ImgPath)
for image in imagelist:
image_pre, ext = os.path.splitext(image)
imgfile = ImgPath + image
xmlfile = AnnoPath + image_pre + '.xml'
# print(image)
# 打开xml文档
DOMTree = xml.dom.minidom.parse(xmlfile)
# 得到文档元素对象
collection = DOMTree.documentElement
# 读取图片
img = cv.imread(imgfile, cv.IMREAD_COLOR + cv.IMREAD_IGNORE_ORIENTATION)
filenamelist = collection.getElementsByTagName("filename")
filename = filenamelist[0].childNodes[0].data
print(filename)
# 得到标签名为object的信息
objectlist = collection.getElementsByTagName("object")
for objects in objectlist:
# 每个object中得到子标签名为name的信息
namelist = objects.getElementsByTagName('name')
# 通过此语句得到具体的某个name的值
objectname = namelist[0].childNodes[0].data
# print(objectname)
bndbox = objects.getElementsByTagName('bndbox')
# print(bndbox)
for box in bndbox:
x1_list = box.getElementsByTagName('xmin')
x1 = int(x1_list[0].childNodes[0].data)
y1_list = box.getElementsByTagName('ymin')
y1 = int(y1_list[0].childNodes[0].data)
x2_list = box.getElementsByTagName('xmax') # 注意坐标,看是否需要转换
x2 = int(x2_list[0].childNodes[0].data)
y2_list = box.getElementsByTagName('ymax')
y2 = int(y2_list[0].childNodes[0].data)
cv.rectangle(img, (x1, y1), (x2, y2), (255, 255, 255), thickness=2)
cv.putText(img, objectname, (x1, y1), cv.FONT_HERSHEY_COMPLEX, 0.7, (0, 255, 0),
thickness=2)
# cv.imshow('head', img)
cv.imwrite(save_path + '/' + image, img) #
if __name__ == "__main__":
draw_anchor(ImgPath, AnnoPath, save_path)
制作coco数据集
# -*- coding=utf-8 -*-
# !/usr/bin/python
import os
import shutil
import numpy as np
import json
import xml.etree.ElementTree as ET
from tqdm.autonotebook import tqdm
# 检测框的ID起始值
START_BOUNDING_BOX_ID = 0
# 类别列表无必要预先创建,程序中会根据所有图像中包含的ID来创建并更新
PRE_DEFINE_CATEGORIES = {}
def get(root, name):
vars = root.findall(name)
return vars
def get_and_check(root, name, length):
vars = root.findall(name)
if len(vars) == 0:
raise NotImplementedError('Can not find %s in %s.' % (name, root.tag))
if length > 0 and len(vars) != length:
raise NotImplementedError('The size of %s is supposed to be %d, but is %d.' % (name, length, len(vars)))
if length == 1:
vars = vars[0]
return vars
# 得到图片唯一标识号
def get_filename_as_int(filename):
try:
filename = os.path.splitext(filename)[0]
return int(filename)
except:
raise NotImplementedError('Filename %s is supposed to be an integer.' % (filename))
def convert(xml_list, xml_dir, json_file):
'''
:param xml_list: 需要转换的XML文件列表
:param xml_dir: XML的存储文件夹
:param json_file: 导出json文件的路径
:return: None
'''
ID = 0
list_fp = xml_list
# 标注基本结构
json_dict = {"images": [],
"type": "instances",
"annotations": [],
"categories": []}
categories = PRE_DEFINE_CATEGORIES
bnd_id = START_BOUNDING_BOX_ID
xmlHandleBar = tqdm(list_fp)
for line in xmlHandleBar:
xmlHandleBar.set_description("Processing %s" % line)
line = line.strip()
# 解析XML
xml_f = os.path.join(xml_dir, line)
tree = ET.parse(xml_f)
root = tree.getroot()
path = get(root, 'path')
# 取出图片名字
filename = str(line).split('.')[0] + ".jpg"
# if len(path) == 1:
# filename = get_and_check(root, 'filename', 1).text#lyk修改 old code: os.path.basename(path[0].text)
# elif len(path) == 0:
# filename = get_and_check(root, 'filename', 1).text
# else:
# raise NotImplementedError('%d paths found in %s'%(len(path), line))
## The filename must be a number
ID = ID + 1
image_id = ID # get_filename_as_int(filename) # 图片ID
# print("===>{}".format(image_id))
size = get_and_check(root, 'size', 1)
# 图片的基本信息
width = int(get_and_check(size, 'width', 1).text)
height = int(get_and_check(size, 'height', 1).text)
image = {'file_name': filename,
'height': height,
'width': width,
'id': image_id}
json_dict['images'].append(image)
## Cruuently we do not support segmentation
# segmented = get_and_check(root, 'segmented', 1).text
# assert segmented == '0'
# 处理每个标注的检测框
for obj in get(root, 'object'):
# 取出检测框类别名称
category = get_and_check(obj, 'name', 1).text
# 更新类别ID字典
if category not in categories:
new_id = len(categories)
categories[category] = new_id
category_id = categories[category]
bndbox = get_and_check(obj, 'bndbox', 1)
xmin = int(get_and_check(bndbox, 'xmin', 1).text) - 1
ymin = int(get_and_check(bndbox, 'ymin', 1).text) - 1
xmax = int(get_and_check(bndbox, 'xmax', 1).text)
ymax = int(get_and_check(bndbox, 'ymax', 1).text)
assert (xmax > xmin)
assert (ymax > ymin)
o_width = abs(xmax - xmin)
o_height = abs(ymax - ymin)
annotation = dict()
annotation['area'] = o_width * o_height
annotation['iscrowd'] = 0
annotation['image_id'] = image_id
annotation['bbox'] = [xmin, ymin, o_width, o_height]
annotation['category_id'] = category_id
annotation['id'] = bnd_id
annotation['ignore'] = 0
# 设置分割数据,点的顺序为逆时针方向
annotation['segmentation'] = [[xmin, ymin, xmin, ymax, xmax, ymax, xmax, ymin]]
json_dict['annotations'].append(annotation)
bnd_id = bnd_id + 1
# 写入类别ID字典
for cate, cid in categories.items():
cat = {'supercategory': 'none', 'id': cid, 'name': cate}
json_dict['categories'].append(cat)
# 导出到json
json_fp = open(json_file, 'w')
json_str = json.dumps(json_dict, indent=4)
json_fp.write(json_str)
json_fp.close()
if __name__ == '__main__':
root_path = "/home/zhanglingyun/trainval/VOC2007/"
saveto_path = "/home/zhanglingyun/retinanet/data/coco/images/"
xml_dir = os.path.join(root_path, 'Annotations')
xml_labels = os.listdir(os.path.join(root_path, 'Annotations'))
np.random.shuffle(xml_labels)
split_point = int(len(xml_labels) / 10) # 用1/10的来做验证
# validation data
print("==========validation data===========")
xml_list = xml_labels[0:split_point]
json_file = '/home/zhanglingyun/retinanet/data/coco/annotations/instances_val2017.json'
convert(xml_list, xml_dir, json_file)
progress_bar_val = tqdm(xml_list)
for xml_file in progress_bar_val:
progress_bar_val.set_description("coping val data...")
img_name = xml_file[:-4] + '.jpg'
shutil.copy(os.path.join(root_path, 'JPEGImages', img_name),
os.path.join(saveto_path, 'val2017', img_name))
# train data
print("============train data=========")
xml_list = xml_labels[split_point:]
json_file = '/home/zhanglingyun/retinanet/data/coco/annotations/instances_train2017.json'
convert(xml_list, xml_dir, json_file)
progress_bar_train = tqdm(xml_list)
for xml_file in progress_bar_train:
progress_bar_train.set_description("coping train data...")
img_name = xml_file[:-4] + '.jpg'
shutil.copy(os.path.join(root_path, 'JPEGImages', img_name),
os.path.join(saveto_path, 'train2017', img_name))