当前位置:   article > 正文

用labelme标注矩形框和关键点得到的json文件转txt格式用于yolov5-face训练_txt 转json labelme

txt 转json labelme

目录

我用labelme标注完的json文件长这样:标注了两种:矩形框和点

我要转换的txt格式长这样:

json格式转txt如下:

从txt查看标注结果


参考的这位博主并在此基础上做了改动。(484条消息) LabelMe 标注的json转txt的格式转换教程_无损检测小白白的博客-CSDN博客

我用labelme标注完的json文件长这样:标注了两种:矩形框和点

我要转换的txt格式长这样:

分别代表你的目标类别序号(从0开始)、矩形框中心点x坐标归一化、矩形框中心点y坐标归一化、矩形框宽度w归一化、矩形框高度h归一化点1的x坐标归一化点1的y坐标归一化 ...点2 3 4 依次类推。。。

【点1,2,3,4依次是(左上,右上,右下,左下) ,矩形框坐标和关键点坐标都要归一化

归一化怎么实现??中心点x坐标/图片宽,y坐标/图片高,矩形框的宽/图片宽,高/图片高,关键点横/除以图片宽,关键点纵坐标/图片高----下面的转化代码中有体现建议不理解的仔细瞅瞅哦~】

json格式转txt如下:

  1. # -*- coding: UTF-8 -*-
  2. import json
  3. import os
  4. import cv2
  5. img_folder_path = 'datasets/500' # 图片存放文件夹
  6. folder_path = 'datasets/picbiaozhu' # 标注数据的文件地址
  7. txt_folder_path = 'datasets/txtresults' # 转换后的txt标签文件存放的文件夹
  8. # 保存为相对坐标形式 :label x_center y_center w h
  9. def relative_coordinate_txt(img_name, json_d, img_path):
  10. src_img = cv2.imread(img_path)
  11. # h, w = src_img.shape[:2]
  12. h, w, c = src_img.shape
  13. txt_name = img_name.split(".")[0] + ".txt"
  14. txt_path = os.path.join(txt_folder_path, txt_name)
  15. print(txt_path)
  16. with open(txt_path, 'w') as f:
  17. for item in json_d["shapes"]:
  18. if item['shape_type'] == 'rectangle' and item['label'] == 'nameplate':
  19. point = item['points']
  20. x_center = (point[0][0] + point[1][0]) / 2
  21. y_center = (point[0][1] + point[1][1]) / 2
  22. width = point[1][0] - point[0][0]
  23. height = point[1][1] - point[0][1]
  24. # print(x_center)
  25. f.write(" {} ".format(0))
  26. f.write(" {} ".format(x_center / w))
  27. f.write(" {} ".format(y_center / h))
  28. f.write(" {} ".format(width / w))
  29. f.write(" {} ".format(height / h))
  30. continue
  31. keypoint = item['points']
  32. x = keypoint[0][0]
  33. y = keypoint[0][1]
  34. f.write(" {} ".format(x / w))
  35. f.write(" {} ".format(y / h))
  36. f.write(" \n")
  37. print('finish!')
  38. for jsonfile in os.listdir(folder_path):
  39. # os.listdir用来返回指定文件夹包含的文件或文件夹的名字的列表
  40. temp_path = os.path.join(folder_path, jsonfile)
  41. print("json_path:\t", temp_path)
  42. jsonfile_path = temp_path
  43. with open(jsonfile_path, "r", encoding='utf-8') as fff:
  44. json_d = json.load(fff, strict=False)
  45. img_name = json_d['imagePath'].split("\\")[-1].split(".")[0] + ".jpg"
  46. img_path = os.path.join(img_folder_path, img_name)
  47. print("img_path:\t", img_path)
  48. retname = img_name.replace(".jpg", ".txt")
  49. retpath = os.path.join(txt_folder_path, retname)
  50. if os.path.exists(retpath):
  51. continue
  52. else:
  53. relative_coordinate_txt(img_name, json_d, img_path)

从txt查看标注结果

  1. # -*- coding: UTF-8 -*-
  2. import json
  3. import os
  4. import cv2
  5. from cv2 import FONT_HERSHEY_SIMPLEX
  6. img_folder_path = 'testimgandjson' # 图片存放文件夹
  7. folder_path = 'testimgandjson\img002.json' # 存放标注数据的文件地址
  8. txt_folder_path = "TXTfiles" # 转换后的txt标签文件存放的文件夹
  9. # 相对坐标格式
  10. def show_label_from_txt(img_path, txt_path):
  11. window_name = ('src')
  12. cv2.namedWindow(window_name, cv2.WINDOW_FREERATIO)
  13. src_img = cv2.imread(img_path)
  14. h, w = src_img.shape[:2]
  15. font = cv2.FONT_HERSHEY_SIMPLEX
  16. with open(txt_path, "r", encoding='UTF-8') as f:
  17. line = f.readline()
  18. # 该函数返回的是字符串
  19. newline = line[1: ]
  20. data = newline.split(' ')
  21. # 返回值是字符串列表
  22. label = data[0]
  23. cx = float(data[1])
  24. cy = float(data[2])
  25. ww = float(data[3])
  26. hh = float(data[4])
  27. x1 = int(cx * w - 0.5 * ww * w)
  28. x2 = int(cx * w + 0.5 * ww * w)
  29. y1 = int(cy * h - 0.5 * hh * h)
  30. y2 = int(cy * h + 0.5 * hh * h)
  31. p1 = (x1, y1)
  32. p2 = (x2, y2)
  33. cv2.rectangle(src_img, p1, p2, (0, 255, 0), 5)
  34. # 图片,顶点1,顶点2,矩形颜色,组成矩形的线粗细若为负值如-1表示绘制一个填充矩形
  35. cv2.putText(src_img, label, p1, FONT_HERSHEY_SIMPLEX, 200, (255, 0, 0), 5)
  36. # 图片,要绘制的文本字符串,文本字符串左下角的坐标,字体类型,字体大小,文本颜色,线宽
  37. x00 = float(data[5])*w
  38. y00 = float(data[6])*h
  39. x01 = float(data[7])*w
  40. y01 = float(data[8])*h
  41. x11 = float(data[9])*w
  42. y11 = float(data[10])*h
  43. x10 = float(data[11])*w
  44. y10 = float(data[12])*h
  45. coordinates = [[x00,y00],[x01,y01],[x11,y11],[x10,y10]]
  46. for coo in coordinates:
  47. cv2.circle(src_img,(int(coo[0]),int(coo[1])),25,(0,255,0),-5)
  48. #图像,圆心坐标,半径,圆边框颜色,正值表示线宽负值表示填充一个圆形
  49. cv2.imshow(window_name, src_img)
  50. cv2.waitKey(0)
  51. cv2.destroyAllWindows()
  52. return
  53. i = 0
  54. for txtfile in os.listdir(txt_folder_path):
  55. txt_path = os.path.join(txt_folder_path, txtfile)
  56. # 一直报错utf-8,原因是我txt文件没有放对位置,地址没有写对,导致
  57. # for循环第一次循环没找到txt文件解码失败。
  58. i += 1
  59. if i > 15:
  60. break
  61. # 如果是一个子目录就继续
  62. if os.path.isdir(txt_path):
  63. continue
  64. print("txt_path:\t", txt_path)
  65. img_name = txtfile.split("\\")[-1].split(".")[0] + ".jpg"
  66. img_path = os.path.join(img_folder_path, img_name)
  67. show_label_from_txt(img_path, txt_path)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/213402
推荐阅读
相关标签
  

闽ICP备14008679号