赞
踩
继Yolopose关键点检测:自己标注数据集,制作数据集(一)后,完成了labelme下的JSON转coco格式的JSON,接下来需要介绍如何将coco格式的JSON文件转换成 yolo的txt文件,以及coco_kpts文件夹的内容布局。
通过edgeai-yolov5-yolo-pose工程下的README.md可知,官方已经给了labels格式及coco_kpts文件夹的布局,下载labels文件后,随便找了一个txt查看,内容如下:
0代表的numclass,后面4个数代表bbox的四个值,有小数是因为通过图片的宽和高进行了归一化,后面就是关键点x,y,v为一组,x,y同样进行了归一化,v为2前一篇博文讲过,按照这个格式并修改出了以下的转换代码:
# COCO 格式的数据集转化为 YOLO 格式的数据集 # --json_path 输入的json文件路径 # --save_path 保存的文件夹名字,默认为当前目录下的labels。 import os import json from tqdm import tqdm import argparse parser = argparse.ArgumentParser() # 这里根据自己的json文件位置,换成自己的就行 parser.add_argument('--json_path', default=r'E:\val2017\annotations\val.json', type=str, help="input: coco format(json)") # 这里设置.txt文件保存位置 parser.add_argument('--save_path', default=r'E:\val2017\annotations', type=str, help="specify where to save the output dir of labels") arg = parser.parse_args() def convert(size, box): dw = 1. / (size[0]) dh = 1. / (size[1]) x = box[0] + box[2] / 2.0 y = box[1] + box[3] / 2.0 w = box[2] h = box[3] x = round(x * dw, 6) w = round(w * dw, 6) y = round(y * dh, 6) h = round(h * dh, 6) return (x, y, w, h) if __name__ == '__main__': json_file = arg.json_path # COCO Object Instance 类型的标注 ana_txt_save_path = arg.save_path # 保存的路径 data = json.load(open(json_file, 'r')) if not os.path.exists(ana_txt_save_path): os.makedirs(ana_txt_save_path) id_map = {} # coco数据集的id不连续!重新映射一下再输出! with open(os.path.join(ana_txt_save_path, 'classes.txt'), 'w') as f: # 写入classes.txt for i, category in enumerate(data['categories']): f.write(f"{category['name']}\n") id_map[category['id']] = i # print(id_map) # 这里需要根据自己的需要,更改写入图像相对路径的文件位置。 list_file = open(os.path.join(ana_txt_save_path, 'train2017.txt'), 'w') for img in tqdm(data['images']): filename = img["file_name"] img_width = img["width"] img_height = img["height"] img_id = img["id"] head, tail = os.path.splitext(filename) ana_txt_name = head + ".txt" # 对应的txt名字,与jpg一致 f_txt = open(os.path.join(ana_txt_save_path, ana_txt_name), 'w') for ann in data['annotations']: if ann['image_id'] == img_id: box = convert((img_width, img_height), ann["bbox"]) f_txt.write("%s %s %s %s %s" % (id_map[ann["category_id"]], box[0], box[1], box[2], box[3])) counter=0 for i in range(len(ann["keypoints"])): if ann["keypoints"][i] == 2 or ann["keypoints"][i] == 1 or ann["keypoints"][i] == 0: f_txt.write(" %s " % format(ann["keypoints"][i],'6f')) counter=0 else: if counter==0: f_txt.write(" %s " % round((ann["keypoints"][i] / img_width),6)) else: f_txt.write(" %s " % round((ann["keypoints"][i] / img_height),6)) counter+=1 f_txt.write("\n") f_txt.close() # 将图片的路径写入train2017或val2017的路径 list_file.write('E:/edgeai-yolov5-yolo-pose/coco_kpts/images/train2017/%s.jpg\n' % (head)) list_file.close()
执行后会在E:\val2017\annotations文件夹下得到以下几个txt文件
trian2017.txt 内容为原图片的绝对路径
classes.txt 内容为person
而000000000001.txt的内容如下,和官方给的labels的内容格式一模一样
这是之前提到的官方内容格式
至此,coco格式的JSON文件转换成yolo的txt文件就完成了。
README.md内容中给的格式如下图所示:
(.cache文件是训练的时候系统自动生成的,不用管)
1.images文件夹存放所有的图片:
2.labels文件夹存放trian2017、val2017、test2017,这些文件夹放已经转换好的txt文件如下图所示:
3.annotations文件夹存放3个coco格式的JSON文件,如下图所示,例如我这次案例train放了3张照片,val放了一张照片,test放了一张照片,那我train的coco格式JSON文件里面就应该包含3张图片的关键点及人物框的信息(个人尝试了一下这些JSON文件取其他文件名也不影响程序的运行,甚至可以没有!!!)。
4.train2017.txt、val2017.txt、test-dev2017.txt里面存放的是图片的绝对路径,这在转换代码里面是可以进行修改的,如下图所示:
coco_kpts文件夹的内容讲解就介绍完成了。
试着跑了一下,其他的报错提示在CSDN上都能找到解决方法,训练的时候记得改一下coco_kpts.yaml文件里面的内容,记得换成你自己的路径。
train: E:/edgeai-yolov5-yolo-pose/coco_kpts/train2017.txt
val: E:/edgeai-yolov5-yolo-pose/coco_kpts/val2017.txt
test: E:/edgeai-yolov5-yolo-pose/coco_kpts/test-dev2017.txt
最后在输出权值文件的文件夹下可以看到验证的图片如下图所示:
个人数据集的标注及制作到此结束,有疑问的同学欢迎留言,相互交流、学习,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。