文件组织格式如下:
|-- 上级目录
| |--images
| |--labels
| |--outputs
|-- images
| |--001.jpg
| |--002.jpg
| |--003.jpg
|-- labels
| |--001.txt
| |--002.txt
| |--003.txt
本文代码读取的标签格式是yolo格式的
txt标签内容格式例如:
2 0.079167 0.675926 0.090625 0.116667
每一行(代表一个目标框)共有5个数据,其中
第1个数据2
表示物体的类别信息。
第2个数据0.079167
表示归一化后的中心点x坐标,即中心点的x坐标除以图片宽度。
第3个数据0.675926
表示归一化后的中心点y坐标,即中心点的y坐标除以图片高度。
第4个数据0.090625
表示归一化后的目标框宽度w,即目标框宽度除以图片宽度。
第5个数据0.116667
表示归一化后的目标框高度h,即目标框高度除以图片高度。
ncolors(num)主要用来生成num个区分度较大的RGB颜色值。参考如下:
链接
import cv2 as cv
import os
import colorsys
import random
def get_n_hls_colors(num):
hls_colors = []
i = 0
step = 360.0 / num
while i < 360:
h = i
s = 90 + random.random() * 10
l = 50 + random.random() * 10
_hlsc = [h / 360.0, l / 100.0, s / 100.0]
hls_colors.append(_hlsc)
i += step
return hls_colors
def ncolors(num):
rgb_colors = []
if num < 1:
return rgb_colors
hls_colors = get_n_hls_colors(num)
for hlsc in hls_colors:
_r, _g, _b = colorsys.hls_to_rgb(hlsc[0], hlsc[1], hlsc[2])
r, g, b = [int(x * 255.0) for x in (_r, _g, _b)]
rgb_colors.append([r, g, b])
return rgb_colors
def convert(bbox,shape):
x1 = int((bbox[0] - bbox[2] / 2.0) * shape[1])
y1 = int((bbox[1] - bbox[3] / 2.0) * shape[0])
x2 = int((bbox[0] + bbox[2] / 2.0) * shape[1])
y2 = int((bbox[1] + bbox[3] / 2.0) * shape[0])
return (x1,y1,x2,y2)
n = 6 # 类别数
# 获取n种区分度较大的rgb值
colors = ncolors(n)
images_list = os.listdir('images') # 获取图片名列表
images_dir = 'images/' # 图片目录
labels_dir = 'labels/' # label目录
output_dir = 'output/' # 输出图片目录
for img_id in images_list:
img = cv.imread(images_dir + img_id)
# 判断后缀是为了排除隐藏文件.ipynb_checkpoints
if img_id[-3:] != 'jpg':
continue
shape = img.shape[0:2]
txt_id = img_id.replace('jpg', 'txt')
with open(labels_dir + txt_id) as r:
lines = r.readlines()
for line in lines:
line = [float(i) for i in line.split(' ')] # 按空格划分并转换float类型
label = int(line[0]) #获取类别信息
bbox = line[1:] # 获取box信息
(x1,y1,x2,y2) = convert(bbox,shape)
cv.rectangle(img, (x1, y1), (x2, y2), (colors[label][2], colors[label][1], colors[label][0]), 3)
cv.waitKey(0)
cv.imwrite(output_dir + img_id,img)
注意:OpenCV对RGB图像数据的存储顺序是BGR,rectangle函数中Scalar的顺序也是B,G,R。
如Scalar( 0, 0, 255)代表的是红色。