yolo训练自己的数据集——voc_label代码解释,txt转换为coco格式

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

classes = [“aeroplane”, “bicycle”, “bird”, “boat”, “bottle”, “bus”, “car”, “cat”, “chair”, “cow”, “diningtable”, “dog”, “horse”, “motorbike”, “person”, “pottedplant”, “sheep”, “sofa”, “train”, “tvmonitor”] # 要检测的目标类别

def convert(size, box): # 归一化
dw = 1. / size[0] # 对应txt里的 weight height
dh = 1. / size[1] # 归一化的时候就是使用宽度除以整个image_size的高度
x = (box[0] + box[1]) / 2.0 # box[]对应txt里的 xmin xmax ymin ymax
y = (box[2] + box[3]) / 2.0 # 使用(ymin+ymax)/2得到y的中心点
w = box[1] - box[0]
h = box[3] - box[2]
x = x * dw # 归一化中心坐标x
w = w * dw # 归一化bbox宽度
y = y * dh
h = h * dh
return x, y, w, h

def convert_annotation(image_id): # 转换这一张图片的坐标表示方式(格式),即读取xml文件的内容,计算后存放在txt文件中。
in_file = open(’/root/darknet-master/data/Annotations/%s.xml’%(image_id)) # 自己的xml文件的路径
out_file = open(’/root/darknet-master/data/obj/%s.txt’%(image_id),‘w’) # 自己的txt文件要保存的路径
tree = ET.parse(in_file) # 直接解析xml文件
root = tree.getroot() # 获取xml文件的根节点
size = root.find(‘size’) # 获取指定节点“图像尺寸”
w = int(size.find(‘width’).text)在这里插入代码片
h = int(size.find(‘height’).text)

for obj in root.iter('object'):              # 有目标中心落在格子里则Pr object=1
    difficult = obj.find('difficult').text   # xml里的difficult参数
    cls = obj.find('name').text              # 要检测的类别名称name
    if cls not in classes or int(difficult) == 1:
        continue
    cls_id = classes.index(cls)              # 获得这个类别名,在上面的classes中的位置序号
    xmlbox = obj.find('bndbox')              # 检测框节点
    b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
    bb = convert((w, h), b)
    out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')  # 向标注文件中写入:类别序号 框中心坐标x 框中心坐标y 框宽 框高
    # [fun(a) for a in [...]]
    # >>> [a+1 for a in [2,3,4,5,6]]
    # [3, 4, 5, 6, 7]
    # '内容'.join([string array])
    # >>> '.'.join(['2','3','4','5','6'])
    # '2.3.4.5.6'

‘’'yolov3 源码
wd = getcwd()

for year, image_set in sets:
if not os.path.exists(‘VOCdevkit/VOC%s/labels/’ % (year)):
os.makedirs(‘VOCdevkit/VOC%s/labels/’ % (year)) # 新建一个 label 文件夹,用于存放yolo格式的标签文件:000001.txt
image_ids = open(‘VOCdevkit/VOC%s/ImageSets/Main/%s.txt’ % (year, image_set)).read().strip().split() # 读取txt文件中 存放的图片的 id:000001
#.read() 每次读取整个文件,它通常将读取文件内容放到一个字符串变量中,也就是说 .read() 生成文件内容是一个字符串类型
#.readline()每只读取文件的一行,通常也是读取到的一行内容放到一个字符串变量中,返回str类型
#.readlines()每次按行读取整个文件内容,将读取到的内容放到一个列表中,返回list类型
#strip(‘a’)会把前后两端的字符a删除,而不会删除中间的a。括号没东西时,删除转义字符和空白字符
#split(‘a’)就是将字符串中包含a的部分,将a删除,并从此处分割字符串为多个字符串。无参数时,以空格分
list_file = open(’%s_%s.txt’ % (year, image_set),‘w’) # 新建一个 txt文件,用于存放 图片的绝对路径:/media/common/yzn_file/DataSetsH/VOC/VOCdevkit/VOC2007/JPEGImages/000001.jpg
for image_id in image_ids:
list_file.write(’%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n’ % (wd, year, image_id)) # 向 txt 文件中写入 一张图片的绝对路径
convert_annotation(year, image_id) # 转换这一张图片的坐标表示方式(格式)
list_file.close()
‘’’
#使用自己的数据集
#读入所有待训练图像的路径
image_paths = open(’/root/darknet-master/data/obj/list.txt’).read().strip().split() # txt路径
#list_file = open(‘train.txt’, ‘w’)
for image_path in image_paths:
#list_file.write(’/root/darknet-master/data/obj/%s.jpg\n’%(image_id))
image_id = os.path.split(image_path)[1] # image_id内容类似’0001.jpg’
image_id2 = os.path.splitext(image_id)[0] # image_id2内容类似’0001’
convert_annotation(image_id2)

你可能感兴趣的:(yolo训练自己的数据集——voc_label代码解释,txt转换为coco格式)