没有按照我出现问题的顺序记录,这篇文章如果能帮到你,我就很开心
1.问题: UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xb9 in position 37: illegal multibyte sequence
解答:open(xxx,xxxx, encoding=‘UTF-8’)(增加指定编码方式 utf-8)
- 我自己已有voc数据集:
我想做的是将其转换为yolov5可以训练的数据集,参考文章:YOLOv5 实现目标检测(训练自己的数据集实现猫猫识别
在yolov5项目下创建了一个转换文件:voc_label.py,如下所示(结果:转换后训练时train.py找不到我的数据集路径)
# xml解析包
import xml.etree.ElementTree as ET
import pickle
import os
# os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表
from os import listdir, getcwd
from os.path import join
sets = ['train', 'test', 'val']
classes = ['ore carrier', 'bulk cargo carrier', 'general cargo ship',
'container ship', 'fishing boat', 'passenger ship']
# 进行归一化操作
def convert(size, box):
# size:(原图w,原图h) , box:(xmin,xmax,ymin,ymax)
dw = 1. / size[0] # 1/w
dh = 1. / size[1] # 1/h
x = (box[0] + box[1]) / 2.0 # 物体在图中的中心点x坐标
y = (box[2] + box[3]) / 2.0 # 物体在图中的中心点y坐标
w = box[1] - box[0] # 物体实际像素宽度
h = box[3] - box[2] # 物体实际像素高度
x = x * dw # 物体中心点x的坐标比(相当于 x/原图w)
w = w * dw # 物体宽度的宽度比(相当于 w/原图w)
y = y * dh # 物体中心点y的坐标比(相当于 y/原图h)
h = h * dh # 物体宽度的宽度比(相当于 h/原图h)
return x, y, w, h # 返回 相对于原图的物体中心点的x坐标比,y坐标比,宽度比,高度比,取值范围[0-1]
# year ='2012', 对应图片的id(文件名)
def convert_annotation(image_id):
''' 将对应文件名的xml文件转化为label文件,xml文件包含了对应的bunding框以及图片长款大小等信息,
通过对其解析,然后进行归一化最终读到label文件中去,也就是说
一张图片文件对应一个xml文件,然后通过解析和归一化,能够将对应的信息保存到唯一一个label文件中去
labal文件中的格式:calss x y w h 同时,一张图片对应的类别有多个,所以对应的bunding的信息也有多个'''
# 对应的通过year 找到相应的文件夹,并且打开相应image_id的xml文件,其对应bund文件
in_file = open('data/Annotations/%s.xml' % image_id, encoding='utf-8')
# 准备在对应的image_id 中写入对应的label,分别为<object-class> <x> <y> <width> <height>
out_file = open('data/labels/%s.txt' % image_id, 'w', encoding='utf-8')
# 解析xml文件
tree = ET.parse(in_file)
# 获得对应的键值对
root = tree.getroot()
# 获得图片的尺寸大小
size = root.find('size')
# 如果xml内的标记为空,增加判断条件
if size != None:
# 获得宽
w = int(size.find('width').text)
# 获得高
h = int(size.find('height').text)
# 遍历目标obj
for obj in root.iter('object'):
if obj.find('difficult'):
difficult = int(obj.find('difficult').text)
else:
difficult = 0
# # 获得difficult ??
# difficult = obj.find('difficult').text
# 获得类别 =string 类型
cls = obj.find('name').text
# 如果类别不是对应在我们预定好的class文件中,或difficult==1则跳过
if cls not in classes or int