• Windows下Labelimg标注自己的数据集使用(Ubuntu18.04)Jetson AGX Orin进行YOLO5训练测试完整版教程


    一、环境配置介绍

    整个实现过程所涉及的文件目录,其中,自备表示自己需要准备的,生成表示无需自己准备。

     使用yolov5时出现“assertionerror:no labels found in */*/*/JPEGImages.cache can not train without labels”问题

    很多朋友都会遇到的一个问题,yolo5-6.1已经不能使用之前的方法了了,是下载源码后的coco示例。

    1. nvidia@nvidia-desktop:~/works/yolov5-6.1$ cat data/coco128.yaml
    2. # YOLOv5 🚀 by Ultralytics, GPL-3.0 license
    3. # COCO128 dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
    4. # Example usage: python train.py --data coco128.yaml
    5. # parent
    6. # ├── yolov5
    7. # └── datasets
    8. # └── coco128 ← downloads here
    9. # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
    10. path: ../datasets/coco128 # dataset root dir
    11. train: images/train2017 # train images (relative to 'path') 128 images
    12. val: images/train2017 # val images (relative to 'path') 128 images
    13. test: # test images (optional)
    14. # Classes
    15. nc: 80 # number of classes
    16. names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
    17. 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
    18. 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
    19. 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
    20. 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
    21. 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
    22. 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
    23. 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
    24. 'hair drier', 'toothbrush'] # class names
    25. # Download script/URL (optional)
    Jetson-yolo5
    检测目标类型标注工具标注格式训练工具
    "open"labelimgpascalVOCYOLO5

    二、目录结构

    整个实现过程所涉及的文件目录,其中,自备表示自己需要准备的,生成表示无需自己准备。

    首先录取视频获取图片,在d盘下创建目录dataSet,然后再dataSet内分别创建目录images、和video目录,如下:

    1. import cv2
    2. import os.path
    3. import random
    4. # 检查已有图片的数量,确定本次图片抽取开始的下标
    5. cnt = len(os.listdir('D:/dataSet/images')) + 1
    6. # 视频存放路径
    7. videoDir = os.listdir('D:/dataSet/video')
    8. # 提示使用者抽取开始
    9. print("Start!")
    10. # 每30帧随机抽取一帧
    11. start, ran = 0, random.randrange(0, 30)
    12. try:
    13. temp = 0
    14. for video in videoDir:
    15. # 拼接视频路径
    16. videoPath = r'D:/dataSet/video/' + video
    17. # 打开视频流
    18. vc = cv2.VideoCapture(videoPath)
    19. # 判断是否打开成功
    20. if vc.isOpened():
    21. while True:
    22. # activity: 读取成功标签,frame: 读取的画面
    23. activity, frame = vc.read()
    24. # 如果读取不成功(没有下一帧),就退出
    25. if not activity:
    26. break
    27. if temp == start + ran:
    28. cv2.imwrite(f"D:/VOCdevkit/VOC2007/PEGImages/{cnt}.jpg", frame)#这里的路径是提前建好的
    29. cnt, start, ran = cnt + 1, start + 30, random.randrange(0, 30)
    30. temp = temp + 1
    31. vc.release()
    32. # 提示抽取完成
    33. print("Finish!")
    34. except:
    35. vc.release()
    36. # 提示抽取出现错误
    37. print("Error!")

    内容为空 。

    从视频素材中抽取画面

    在cmd窗口进入d盘,输入命令:

    python manage.py

     出现“Finish!”即为抽取完成,效果如下:

    使用labelimg

    完成前面的工作后,在控制台输入labelimg:

     最终目录架构,test的目录不是必须的,现在的版本是没用到

    1. D:\VOCdevkit>tree
    2. DATA1 的文件夹 PATH 列表
    3. 卷序列号为 141F-A5EC
    4. D:.
    5. ├─images
    6. │ ├─test
    7. │ ├─train
    8. │ └─val
    9. ├─labels
    10. │ ├─test
    11. │ ├─train
    12. │ └─val
    13. └─VOC2007
    14. ├─Annotations
    15. ├─PEGImages
    16. └─YOLOLabels

    三、操作步骤

     使用图如下代码即可将标注的文件.xml格式文件转为.txt格式

    1. import xml.etree.ElementTree as ET
    2. import pickle
    3. import os
    4. from os import listdir, getcwd
    5. from os.path import join
    6. import random
    7. from shutil import copyfile
    8. # 根据自己的数据标签修改
    9. classes=["pen", "pen"]
    10. def clear_hidden_files(path):
    11. dir_list = os.listdir(path)
    12. for i in dir_list:
    13. abspath = os.path.join(os.path.abspath(path), i)
    14. if os.path.isfile(abspath):
    15. if i.startswith("._"):
    16. os.remove(abspath)
    17. else:
    18. clear_hidden_files(abspath)
    19. def convert(size, box):
    20. dw = 1./size[0]
    21. dh = 1./size[1]
    22. x = (box[0] + box[1])/2.0
    23. y = (box[2] + box[3])/2.0
    24. w = box[1] - box[0]
    25. h = box[3] - box[2]
    26. x = x*dw
    27. w = w*dw
    28. y = y*dh
    29. h = h*dh
    30. return (x,y,w,h)
    31. def convert_annotation(image_id):
    32. in_file = open('D:/VOCdevkit/VOC2007/Annotations/%s.xml' % image_id, encoding='UTF-8' )
    33. out_file = open('D:/VOCdevkit/VOC2007/YOLOLabels/%s.txt' % image_id, 'w')
    34. tree=ET.parse(in_file)
    35. root = tree.getroot()
    36. size = root.find('size')
    37. w = int(size.find('width').text)
    38. h = int(size.find('height').text)
    39. for obj in root.iter('object'):
    40. difficult = obj.find('difficult').text
    41. cls = obj.find('name').text
    42. if cls not in classes or int(difficult) == 1:
    43. continue
    44. cls_id = classes.index(cls)
    45. xmlbox = obj.find('bndbox')
    46. b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
    47. bb = convert((w,h), b)
    48. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
    49. in_file.close()
    50. out_file.close()
    51. wd = os.getcwd()
    52. wd = os.getcwd()
    53. data_base_dir = os.path.join(wd, 'D:/VOCdevkit/')
    54. if not os.path.isdir(data_base_dir):
    55. os.mkdir(data_base_dir)
    56. work_sapce_dir = os.path.join(data_base_dir, 'D:/VOCdevkit/VOC2007/')
    57. if not os.path.isdir(work_sapce_dir):
    58. os.mkdir(work_sapce_dir)
    59. annotation_dir = os.path.join(work_sapce_dir, 'D:/VOCdevkit/VOC2007/Annotations/')
    60. if not os.path.isdir(annotation_dir):
    61. os.mkdir(annotation_dir)
    62. clear_hidden_files(annotation_dir)
    63. image_dir = os.path.join(work_sapce_dir, 'D:/VOCdevkit/VOC2007/PEGImages/')
    64. if not os.path.isdir(image_dir):
    65. os.mkdir(image_dir)
    66. clear_hidden_files(image_dir)
    67. yolo_labels_dir = os.path.join(work_sapce_dir, 'D:/VOCdevkit/VOC2007/YOLOLabels/')
    68. if not os.path.isdir(yolo_labels_dir):
    69. os.mkdir(yolo_labels_dir)
    70. clear_hidden_files(yolo_labels_dir)
    71. yolov5_images_dir = os.path.join(data_base_dir, 'images/')
    72. if not os.path.isdir(yolov5_images_dir):
    73. os.mkdir(yolov5_images_dir)
    74. clear_hidden_files(yolov5_images_dir)
    75. yolov5_labels_dir = os.path.join(data_base_dir, 'labels/')
    76. if not os.path.isdir(yolov5_labels_dir):
    77. os.mkdir(yolov5_labels_dir)
    78. clear_hidden_files(yolov5_labels_dir)
    79. yolov5_images_train_dir = os.path.join(yolov5_images_dir, 'train/')
    80. if not os.path.isdir(yolov5_images_train_dir):
    81. os.mkdir(yolov5_images_train_dir)
    82. clear_hidden_files(yolov5_images_train_dir)
    83. yolov5_images_test_dir = os.path.join(yolov5_images_dir, 'val/')
    84. if not os.path.isdir(yolov5_images_test_dir):
    85. os.mkdir(yolov5_images_test_dir)
    86. clear_hidden_files(yolov5_images_test_dir)
    87. yolov5_images_val_dir = os.path.join(yolov5_images_dir, 'test/')
    88. if not os.path.isdir(yolov5_images_val_dir):
    89. os.mkdir(yolov5_images_val_dir)
    90. clear_hidden_files(yolov5_images_val_dir)
    91. yolov5_labels_train_dir = os.path.join(yolov5_labels_dir, 'train/')
    92. if not os.path.isdir(yolov5_labels_train_dir):
    93. os.mkdir(yolov5_labels_train_dir)
    94. clear_hidden_files(yolov5_labels_train_dir)
    95. yolov5_labels_test_dir = os.path.join(yolov5_labels_dir, 'val/')
    96. if not os.path.isdir(yolov5_labels_test_dir):
    97. os.mkdir(yolov5_labels_test_dir)
    98. clear_hidden_files(yolov5_labels_test_dir)
    99. yolov5_labels_val_dir = os.path.join(yolov5_labels_dir, 'test/')
    100. if not os.path.isdir(yolov5_labels_val_dir):
    101. os.mkdir(yolov5_labels_val_dir)
    102. clear_hidden_files(yolov5_labels_val_dir)
    103. train_file = open(os.path.join(wd, 'yolov5_train.txt'), 'w')
    104. test_file = open(os.path.join(wd, 'yolov5_val.txt'), 'w')
    105. val_file = open(os.path.join(wd, 'yolov5_tes.txt'), 'w')
    106. train_file.close()
    107. test_file.close()
    108. val_file.close()
    109. train_file = open(os.path.join(wd, 'yolov5_train.txt'), 'a')
    110. test_file = open(os.path.join(wd, 'yolov5_val.txt'), 'a')
    111. val_file = open(os.path.join(wd, 'yolov5_test.txt'), 'a')
    112. list_imgs = os.listdir(image_dir) # list image files
    113. probo = random.randint(1, 100)
    114. print("Probobility: %d" % probo)
    115. for i in range(0,len(list_imgs)):
    116. path = os.path.join(image_dir,list_imgs[i])
    117. if os.path.isfile(path):
    118. image_path = image_dir + list_imgs[i]
    119. voc_path = list_imgs[i]
    120. (nameWithoutExtention, extention) = os.path.splitext(os.path.basename(image_path))
    121. (voc_nameWithoutExtention, voc_extention) = os.path.splitext(os.path.basename(voc_path))
    122. annotation_name = nameWithoutExtention + '.xml'
    123. annotation_path = os.path.join(annotation_dir, annotation_name)
    124. label_name = nameWithoutExtention + '.txt'
    125. label_path = os.path.join(yolo_labels_dir, label_name)
    126. probo = random.randint(1, 100)
    127. print("Probobility: %d" % probo)
    128. if(probo < 80): # train dataset
    129. if os.path.exists(annotation_path):
    130. train_file.write(image_path + '\n')
    131. convert_annotation(nameWithoutExtention) # convert label
    132. copyfile(image_path, yolov5_images_train_dir + voc_path)
    133. copyfile(label_path, yolov5_labels_train_dir + label_name)
    134. elif(80 <=probo < 90): # test dataset
    135. if os.path.exists(annotation_path):
    136. test_file.write(image_path + '\n')
    137. convert_annotation(nameWithoutExtention) # convert label
    138. copyfile(image_path, yolov5_images_test_dir + voc_path)
    139. copyfile(label_path, yolov5_labels_test_dir + label_name)
    140. else: # val dataset
    141. if os.path.exists(annotation_path):
    142. val_file.write(image_path + '\n')
    143. convert_annotation(nameWithoutExtention) # convert label
    144. copyfile(image_path, yolov5_images_val_dir + voc_path)
    145. copyfile(label_path, yolov5_labels_val_dir + label_name)
    146. train_file.close()
    147. test_file.close()
    148. val_file.close()

    然后将整个文档上传到Jetson下的yolo5同级路径下的文件夹内。 

     在yolov5-6.1/data/.yaml中先复制一份,改名为ljx.yaml(意义为自己的参数配置)ljx.yaml文件需要修改的参数是nc与names以及你的训练测试路径。nc是标签名个数,names就是标签的名字。

    训练集测试集验证集关系如下s

    yolov5-6.1/models先复制一份yolov5s.yaml至ljxs.yaml,更名ljxs.yaml(意为模型),只将如下的nc修改为训练集种类即可 

    四、开始训练

    python3 train.py --img 640 --batch 8 --epochs 300 --data ../../yolov5-6.1/data/ljx.yaml --cfg ../../yolov5-6.1/models/ljxs.yaml --weights weights/yolov5s.pt --device '0'

    如果出现无法wandb可视化毕业设计记录-yolov5的wandb报错,原因和解决方法(非屏蔽wandb)_芃芃です的博客-CSDN博客 

    Weights & Biases

     GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite

    五、开始测试

    测试pen

    估计使用的数据量太小导致精度太低,小白一个刚开始学习没几天欢迎大佬提点一二

  • 相关阅读:
    拿来就能用的前端酷炫登录注册模板
    python多线程返回值问题重写Thread类的run方法
    第七章 卷积神经网络——整体结构&卷积层&池化层&卷积层和池化层的实现&CNN的实现
    【数据结构】对称二叉树 && 另一颗树的子树(六)
    005:vue2使用vue-type-writer实现打字机效果
    (四)linux文件内容查看
    1Nginx基础及编译安装
    详谈Spring
    在unity中给游戏物体一个标记
    架构师之路八分布式系统下大流量限流与消峰的方案
  • 原文地址:https://blog.csdn.net/weixin_46151178/article/details/127957751