在做模型训练的时候,会用到数据集,分为图像和标注信息,我们在网上直接下载的数据集,想看它的标注框,但是只有原图像和标注的txt文件,这个时候可以写程序直接看效果:
已有的数据示例:
想要看到的效果:
如果我们有安装过labelImg,并且标注文件txt的格式刚好是规范的五列yolo格式,可以直接打开labelImg选择图像目录以及保存的标注文件目录就能看到想要的效果。
但这里我们下载的数据集中标注文件里是八列数据并不规范,所以不能用labelImg直接打开看,要想用labelImg的话需要写程序先把标注文件转化成yolo格式(我的其他博文有写,参照:无人机拍摄图像数据集下载与处理),这样就绕远了,复杂了,我们的目的仅仅是看下标注情况
当然,如果我们的标注文件txt就是规范的yolo格式,但不想用labelImg看标注信息,也可以参照以下代码写程序(需要注意的是,必须清楚标注文件里每列是什么含义)
所以用到以下方法:
完整代码:
import cv2
import os
basePath = "D:/python/VisDrone2019-DET-val-test/VisDrone2019-DET-val/"
imagePath = basePath + "images/"
annoPath = basePath + "annotations/"
category = {
"0": "regions",
"1": "pedestrian",
"2": "people",
"3": "bicycle",
"4": "car",
"5": "van",
"6": "truck",
"7": "tricycle",
"8": "awning-tricycle",
"9": "awning-tricycle",
"10": "awning-tricycle",
"11": "others",
}
files = os.listdir(imagePath)
images = []
for file in files:
if file.endswith(".jpg") or file.endswith(".png"):
images.append(file)
def showAnno(index):
file_name, file_extension = os.path.splitext(images[index])
annoFile = annoPath + file_name + ".txt"
image = cv2.imread(imagePath + images[index])
lines = []
with open(annoFile, "r") as file:
for line in file:
line = line.strip()
rects = line.split(",")
cv2.rectangle(
image,
(int(rects[0]), int(rects[1])),
(int(rects[0]) + int(rects[2]), int(rects[1]) + int(rects[3])),
(0, 255, 0),
2,
)
cv2.putText(
image,
category.get(rects[5], rects[5]),
(int(rects[0]), int(rects[1]) - 10),
cv2.FONT_HERSHEY_SIMPLEX,
0.5,
(0, 255, 0),
1,
)
return image
index = 0
while index < len(images):
image = showAnno(index)
cv2.imshow("anno", image)
c = cv2.waitKey(0) # 接收键盘上的值
print(c)
if c == 27: # ESC退出键
break
elif c == 97: # A展示上一张
index -= 1
elif c == 100: # D展示下一张
index += 1
cv2.destroyAllWindows()