当前位置:   article > 正文

乱糟糟的YOLOv8-detect和pose训练自己的数据集_yolopose训练数据集

yolopose训练数据集

       时代在进步,yolo在进步,我还在踏步,v8我浅搞了一下detect和pose,记录一下,我还是要吐槽一下,为啥子这个模型就放在了这个文件深处,如图。

以下教程只应用于直接应用yolov8,不修改。我之前搞v7的环境,直接

 pip install ultralytics

1. detect

       在detect文件夹下新建一个dataset放图片(jpg)和yolo格式的标签(txt)训练集和测试集直接分好,再新建一个data.yaml,如图,放你自己的路径,类别。

放一个检测框的json转yolo的代码,改类别和文件夹路径

  1. import os
  2. import json
  3. import numpy as np
  4. # 类和索引
  5. CLASSES=["fish"]
  6. def convert(size,box):
  7. '''''
  8. input:
  9. size:(width,height);
  10. box:(x1,x2,y1,y2)
  11. output:
  12. (x,y,w,h)
  13. '''
  14. dw=1./size[0]
  15. dh=1./size[1]
  16. x=(box[0]+box[1])/2.0
  17. y=(box[2]+box[3])/2.0
  18. w=box[1]-box[0]
  19. h=box[3]-box[2]
  20. x=x*dw
  21. w=w*dw
  22. y=y*dh
  23. h=h*dh
  24. return (x,y,w,h)
  25. # json -> txt
  26. def json2txt(path_json,path_txt):
  27. # print(path_json,"r")
  28. with open(path_json,"r") as path_json:
  29. jsonx=json.load(path_json)
  30. width=int(jsonx["imageWidth"]) # 原图的宽
  31. height=int(jsonx["imageHeight"]) # 原图的高
  32. with open(path_txt,"w+") as ftxt:
  33. # 遍历每一个bbox对象
  34. for shape in jsonx["shapes"]:
  35. obj_cls=str(shape["label"]) # 获取类别
  36. cls_id=CLASSES.index(obj_cls) # 获取类别索引
  37. points=np.array(shape["points"]) # 获取(x1,y1,x2,y2)
  38. x1=int(points[0][0])
  39. y1=int(points[0][1])
  40. x2=int(points[1][0])
  41. y2=int(points[1][1])
  42. # (左上角,右下角) -> (中心点,宽高) 归一化
  43. bb=convert((width,height),(x1,x2,y1,y2))
  44. ftxt.write(str(cls_id)+" "+" ".join([str(a) for a in bb])+"\n")
  45. if __name__=="__main__":
  46. # json文件夹
  47. dir_json="C:\\Users\\ASUS\\Desktop\\111\\"
  48. # txt文件夹
  49. dir_txt="C:\\Users\\ASUS\\Desktop\\222\\"
  50. if not os.path.exists(dir_txt):
  51. os.makedirs(dir_txt)
  52. # 得到所有json文件
  53. list_json=os.listdir(dir_json)
  54. # 遍历每一个json文件,转成txt文件
  55. for cnt,json_name in enumerate(list_json):
  56. print("cnt=%d,name=%s"%(cnt,json_name))
  57. path_txt=dir_txt+json_name.replace(".json",".txt")
  58. path_json = dir_json + json_name
  59. print("path_json\t",path_json)
  60. print("path_txt\t",path_txt)
  61. # (x1,y1,x2,y2)->(x,y,w,h)
  62. json2txt(path_json,path_txt)

         准备好了,直接terminal里输入就行,但是如果想改点啥比如说希望预测的时候不输出的类别,就输出框,他就改不了,因为这个ultra这个包都给整好了,封装的忒严重,想在这个模型上进行改进就得给他卸了,然后再搞。

  1. #训练的代码
  2. yolo task=detect mode=train model=yolov8s.yaml data=D:/DATA/ultralytics-main/ultralytics/models/yolo/detect/data.yaml epochs=200 batch=128
  3. # 预测的代码
  4. yolo task=detect mode=predict model=D:/DATA/ultralytics-main/weights/best.pt source=D:/DATA/ultralytics-main/ultralytics/models/yolo/detect/dataset/images/val device=cpu

2. pose

       pose的数据集跟之前的有一点区别,首先标注关键点时,要先使用矩形框(rectangle)框出目标,然后在这个矩形框里面打关键点,必须保证每一张照片当中点的数量是相同的,就是说1234得对应上,每个点按顺序进行标注,总数需要是一样多的。3可以被遮挡,但是也得标,然后把这个点变成不可见就可以了。最终得到了 .json 文件,然后我们需要将其转化为 .txt 文件,2代表可见,0代表不可见。转的代码在下面,我用是好使的。

       然后跟上面差不多的命令就可以了。

  1. # 关键点检测json转txt
  2. import os
  3. import json
  4. import shutil
  5. import time
  6. import numpy as np
  7. from tqdm import tqdm
  8. Dataset_root = 'C:/Users/ASUS/Desktop/strong121/labels/' # 转化的json文件地址
  9. # 框的类别
  10. bbox_class =["fish"]
  11. # 关键点的类别,有多少类就写多少
  12. keypoint_class = ['1', '2', '3','4', '5', '6', '7', '8', '9', '10', '11', '12',
  13. '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23',
  14. '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34',
  15. '35', '36', '37', '38', '39', '40', '41', '42', '43', '44']
  16. os.chdir(Dataset_root)
  17. def process_single_json(labelme_path, save_folder='C:/Users/ASUS/Desktop/no/'):
  18. with open(labelme_path, 'r', encoding='utf-8') as f:
  19. labelme = json.load(f)
  20. img_width = labelme['imageWidth'] # 图像宽度
  21. img_height = labelme['imageHeight'] # 图像高度
  22. # 生成 YOLO 格式的 txt 文件
  23. suffix = labelme_path.split('.')[-2]
  24. yolo_txt_path = suffix + '.txt'
  25. with open(yolo_txt_path, 'w', encoding='utf-8') as f:
  26. for each_ann in labelme['shapes']: # 遍历每个标注
  27. if each_ann['shape_type'] == 'rectangle': # 每个框,在 txt 里写一行
  28. yolo_str = ''
  29. ## 框的信息
  30. # 框的类别 ID
  31. bbox_class_id = bbox_class.index(each_ann['label'])
  32. # print(bbox_class_id)
  33. yolo_str += '{} '.format(bbox_class_id)
  34. # 左上角和右下角的 XY 像素坐标
  35. bbox_top_left_x = int(min(each_ann['points'][0][0], each_ann['points'][1][0]))
  36. bbox_bottom_right_x = int(max(each_ann['points'][0][0], each_ann['points'][1][0]))
  37. bbox_top_left_y = int(min(each_ann['points'][0][1], each_ann['points'][1][1]))
  38. bbox_bottom_right_y = int(max(each_ann['points'][0][1], each_ann['points'][1][1]))
  39. # 框中心点的 XY 像素坐标
  40. bbox_center_x = int((bbox_top_left_x + bbox_bottom_right_x) / 2)
  41. bbox_center_y = int((bbox_top_left_y + bbox_bottom_right_y) / 2)
  42. # 框宽度
  43. bbox_width = bbox_bottom_right_x - bbox_top_left_x
  44. # 框高度
  45. bbox_height = bbox_bottom_right_y - bbox_top_left_y
  46. # 框中心点归一化坐标
  47. bbox_center_x_norm = bbox_center_x / img_width
  48. bbox_center_y_norm = bbox_center_y / img_height
  49. # 框归一化宽度
  50. bbox_width_norm = bbox_width / img_width
  51. # 框归一化高度
  52. bbox_height_norm = bbox_height / img_height
  53. yolo_str += '{:.5f} {:.5f} {:.5f} {:.5f} '.format(bbox_center_x_norm, bbox_center_y_norm,
  54. bbox_width_norm, bbox_height_norm)
  55. # print(yolo_str)
  56. # print("**********************")
  57. # time.sleep(90000)
  58. ## 找到该框中所有关键点,存在字典 bbox_keypoints_dict 中
  59. bbox_keypoints_dict = {}
  60. for each_ann in labelme['shapes']: # 遍历所有标注
  61. if each_ann['shape_type'] == 'point': # 筛选出关键点标注
  62. # 关键点XY坐标、类别
  63. x = int(each_ann['points'][0][0])
  64. y = int(each_ann['points'][0][1])
  65. label = each_ann['label']
  66. if (x > bbox_top_left_x) & (x < bbox_bottom_right_x) & (y < bbox_bottom_right_y) & (
  67. y > bbox_top_left_y): # 筛选出在该个体框中的关键点
  68. bbox_keypoints_dict[label] = [x, y]
  69. ## 把关键点按顺序排好
  70. for each_class in keypoint_class: # 遍历每一类关键点
  71. if each_class in bbox_keypoints_dict:
  72. keypoint_x_norm = bbox_keypoints_dict[each_class][0] / img_width
  73. keypoint_y_norm = bbox_keypoints_dict[each_class][1] / img_height
  74. yolo_str += '{:.5f} {:.5f} {} '.format(keypoint_x_norm, keypoint_y_norm,
  75. 2) # 2-可见不遮挡 1-遮挡 0-没有点
  76. else: # 不存在的点,一律为0
  77. yolo_str += '0 0 0 '
  78. # 写入 txt 文件中
  79. f.write(yolo_str + '\n')
  80. shutil.move(yolo_txt_path, save_folder)
  81. print('{} --> {} 转换完成'.format(labelme_path, yolo_txt_path))
  82. save_folder = 'C:/Users/ASUS/Desktop/no' # 转换后的训练集标注文件至目录
  83. for labelme_path in os.listdir(Dataset_root):
  84. # try:
  85. process_single_json(Dataset_root + labelme_path, save_folder=save_folder)
  86. # except:
  87. # print('******有误******', labelme_path)
  88. print('YOLO格式的txt标注文件已保存至 ', save_folder)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/724022
推荐阅读
相关标签
  

闽ICP备14008679号