• 美团yolov6初体验


    前几天美团发布了自己的目标检测网络,并命名为Yolov6,看来底气很足,效果上据说精度和速度比yolov5好了不少,但是可能由于是刚发布,所以很多问题和BUG存在,主要在漏检问题上吐槽的比较多,我想应该社区建立起来之后,维护团队会解决这些问题,先体验一下吧。

    下载源码配置环境

    1. conda create --name yolov6 python=3.7
    2. conda activate yolov6
    3. git clone https://github.com/meituan/YOLOv6
    4. cd YOLOv6
    5. pip install -r requirements.txt

    非常顺利:

    下载预训练模型测试推理 

    1. wget https://github.com/meituan/YOLOv6/releases/download/0.1.0/yolov6s.pt
    2. # 下边推理命令source源和yolov5一样支持图片和图片文件夹路径
    3. python tools/infer.py --weights yolov6s.pt --source images --device cpu

    可以看到我用cpu执行的推理,用显卡推理报了一个错:

    RuntimeError: CUDA error: no kernel image is available for execution on the device
    CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.
    For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

    【故障诊断】【Ubuntu服务器】NVIDIA GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the curre_鲤鱼王的成长之路的博客-CSDN博客这个博文说的和我的情况一样,cuda和torch版本不对,因此到torch管网  Start Locally | PyTorch 

    找了下载命令,重新调整了torch版本:

    效果:

    训练自己的模型

    第一步准备数据集 

    准备自己的训练集,依旧是labelimg标注,标注完的目录如下:

    然后用这个脚本将voc(xml) 这种格式的数据转为yolo所需要的格式,并一块切分了数据集,脚本voc_to_yolo.py 如下:

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

    转换完后的目录:

    第二步创建自己的yaml文件 

    注意匹配自己标注类别,确定训练集和验证集的比例:

     然后data目录下创建自己的yaml文件,依然要匹配自己的nc类别数,类别名称集合,和数据集位置:

    第三步准备预训练模型开始训练 

     然后下载一个预训练模型,我用yolov6s.pt,然后开始训练:

    python train.py --img 640 --batch 32 --epoch 300 --data ./data/myvoc.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --workers 0

    使用tensorboard可视化训练

    由于服务器并没有可视化界面,因此需要服务器先启动tensorboard服务,然后本地远程服务器,映射出来服务端口,就可以在本地访问了:

    1. #本地终端登陆远程服务器
    2. # -p 端口一般不用写,默认是22,但是有时候被修改成其他端口了需要加上-p
    3. ssh -L 10086:127.0.0.1:8080 username@192.168.6.55 -p 31196
    4. #远程服务器中找到tensorboard所在目录并运行
    5. tensorboard --logdir ./runs --port 8080
    6. #在本地浏览器中输入如下地址即可查看tensorboard结果
    7. http://127.0.0.1:10086

     我第一次训练yolov6,map几乎为0,原因待续

    关于数据集的准备

    第一步准备数据集的方式yolov5也适用,另一种方式:labelimg制作VOC数据集并用yolov5训练目标检测模型_RayChiu_Labloy的博客-CSDN博客_labelimg yolov5

  • 相关阅读:
    Hadoop(3.3.1): Capacity Scheduler:通过设置资源队列来满足不同业务之间的资源隔离、队列的弹性以及队列权限
    NHS-Con A,活性酯修饰刀豆球蛋白A,NHS ester-Concanavalin A
    c++语言核心及进阶
    8条非常实用的python代码案例,初学者必备知识点
    接口自动化测试方案
    AIE聚甲基丙烯酸甲酯PMMA微球/聚苯乙烯包覆聚AIE微球/AIE聚四苯基乙烯自由基溶液聚合微球研究
    不懂单链表? 这篇文章就帮你搞明白
    Linux基础学习笔记(十)——正则表达式
    企业安全—DevSecOps概述详情
    【嵌入式开发】UART
  • 原文地址:https://blog.csdn.net/RayChiu757374816/article/details/125614183