前一阵子美团发布了自己的目标检测网络,并命名为Yolov6,看来底气很足,效果上据说精度和速度比yolov5好了不少,但是可能由于是刚发布,所以还需要很多优化,不过社区建立起来之后应该会越来越好,先体验一下吧。

下载源码配置环境

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

非常顺利:

下载预训练模型测试推理

wget https://github.com/meituan/YOLOv6/releases/download/0.1.0/yolov6s.pt
# 下边推理命令source源和yolov5一样支持图片和图片文件夹路径
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 如下:

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import random
from shutil import copyfileclasses = ['invalid', 'positive', 'negative']
# classes=["ball"]TRAIN_RATIO = 80def clear_hidden_files(path):dir_list = os.listdir(path)for i in dir_list:abspath = os.path.join(os.path.abspath(path), i)if os.path.isfile(abspath):if i.startswith("._"):os.remove(abspath)else:clear_hidden_files(abspath)def convert(size, box):dw = 1. / size[0]dh = 1. / size[1]x = (box[0] + box[1]) / 2.0y = (box[2] + box[3]) / 2.0w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn (x, y, w, h)def convert_annotation(image_id):in_file = open('VOCdevkit/VOC2007/Annotations/%s.xml' % image_id)out_file = open('VOCdevkit/VOC2007/YOLOLabels/%s.txt' % image_id, 'w')tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')in_file.close()out_file.close()wd = os.getcwd()
wd = os.getcwd()
data_base_dir = os.path.join(wd, "VOCdevkit/")
if not os.path.isdir(data_base_dir):os.mkdir(data_base_dir)
work_sapce_dir = os.path.join(data_base_dir, "VOC2007/")
if not os.path.isdir(work_sapce_dir):os.mkdir(work_sapce_dir)
annotation_dir = os.path.join(work_sapce_dir, "Annotations/")
if not os.path.isdir(annotation_dir):os.mkdir(annotation_dir)
clear_hidden_files(annotation_dir)
image_dir = os.path.join(work_sapce_dir, "JPEGImages/")
if not os.path.isdir(image_dir):os.mkdir(image_dir)
clear_hidden_files(image_dir)
yolo_labels_dir = os.path.join(work_sapce_dir, "YOLOLabels/")
if not os.path.isdir(yolo_labels_dir):os.mkdir(yolo_labels_dir)
clear_hidden_files(yolo_labels_dir)
yolov5_images_dir = os.path.join(data_base_dir, "images/")
if not os.path.isdir(yolov5_images_dir):os.mkdir(yolov5_images_dir)
clear_hidden_files(yolov5_images_dir)
yolov5_labels_dir = os.path.join(data_base_dir, "labels/")
if not os.path.isdir(yolov5_labels_dir):os.mkdir(yolov5_labels_dir)
clear_hidden_files(yolov5_labels_dir)
yolov5_images_train_dir = os.path.join(yolov5_images_dir, "train/")
if not os.path.isdir(yolov5_images_train_dir):os.mkdir(yolov5_images_train_dir)
clear_hidden_files(yolov5_images_train_dir)
yolov5_images_test_dir = os.path.join(yolov5_images_dir, "val/")
if not os.path.isdir(yolov5_images_test_dir):os.mkdir(yolov5_images_test_dir)
clear_hidden_files(yolov5_images_test_dir)
yolov5_labels_train_dir = os.path.join(yolov5_labels_dir, "train/")
if not os.path.isdir(yolov5_labels_train_dir):os.mkdir(yolov5_labels_train_dir)
clear_hidden_files(yolov5_labels_train_dir)
yolov5_labels_test_dir = os.path.join(yolov5_labels_dir, "val/")
if not os.path.isdir(yolov5_labels_test_dir):os.mkdir(yolov5_labels_test_dir)
clear_hidden_files(yolov5_labels_test_dir)train_file = open(os.path.join(wd, "yolov5_train.txt"), 'w')
test_file = open(os.path.join(wd, "yolov5_val.txt"), 'w')
train_file.close()
test_file.close()
train_file = open(os.path.join(wd, "yolov5_train.txt"), 'a')
test_file = open(os.path.join(wd, "yolov5_val.txt"), 'a')
list_imgs = os.listdir(image_dir)  # list image files
prob = random.randint(1, 100)
print("Probability: %d" % prob)
for i in range(0, len(list_imgs)):path = os.path.join(image_dir, list_imgs[i])if os.path.isfile(path):image_path = image_dir + list_imgs[i]voc_path = list_imgs[i](nameWithoutExtention, extention) = os.path.splitext(os.path.basename(image_path))(voc_nameWithoutExtention, voc_extention) = os.path.splitext(os.path.basename(voc_path))annotation_name = nameWithoutExtention + '.xml'annotation_path = os.path.join(annotation_dir, annotation_name)label_name = nameWithoutExtention + '.txt'label_path = os.path.join(yolo_labels_dir, label_name)prob = random.randint(1, 100)print("Probability: %d" % prob)if (prob < TRAIN_RATIO):  # train datasetif os.path.exists(annotation_path):train_file.write(image_path + '\n')convert_annotation(nameWithoutExtention)  # convert labelcopyfile(image_path, yolov5_images_train_dir + voc_path)copyfile(label_path, yolov5_labels_train_dir + label_name)else:  # test datasetif os.path.exists(annotation_path):test_file.write(image_path + '\n')convert_annotation(nameWithoutExtention)  # convert labelcopyfile(image_path, yolov5_images_test_dir + voc_path)copyfile(label_path, yolov5_labels_test_dir + label_name)
train_file.close()
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服务,然后本地远程服务器,映射出来服务端口,就可以在本地访问了:

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

 我第一次训练yolov6,map几乎为0,原因是我batch-size设置的比较小设置的4,后来设置成32重新训练后正常了:

测试:

python tools/infer.py --weights ./runs/train/exp2/weights/best_ckpt.pt   --yaml data/mydata.yaml --source test_images  --device 0

关于数据集的准备

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

美团yolov6初体验相关推荐

  1. 苹果电脑安装python3密码_mac系统安装Python3初体验

    前沿 对于iOS开发不要随便拆卸系统自带的Python,因为有很多 library 还是使用 Python2.7. 1 安装Xcode 1.1 App Store 搜索Xcode 并安装 1.2 安装 ...

  2. MapReduce编程初体验

    需求:在给定的文本文件中统计输出每一个单词出现的总次数 第一步: 准备一个aaa.txt文本文档 第二步: 在文本文档中随便写入一些测试数据,这里我写入的是 hello,world,hadoop he ...

  3. 小程序 缩放_缩放流星应用程序的初体验

    小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...

  4. wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言 2 下载.安装wxWidgets 3 wxWidgets应用程序初体验 4 wxWidgets学习资料及利用方法指导 5 ...

  5. 用鸿蒙跑了个 “hello world”!鸿蒙开发初体验

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源 | https://my.oschina.net/u ...

  6. Windows Embedded Standard开发初体验(二)

    支持Silverlight的Windows Embedded Standard 好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了.在开始菜单中 ...

  7. 深度探索Hyperledger技术与应用之超级账本初体验(附部署代码)

    2019独角兽企业重金招聘Python工程师标准>>> 本章零基础地介绍了如何快速体验超级账本搭建的区块链网络,我们先绕过了比较复杂的初始化配置,用官方提供的fabric-sampl ...

  8. Spring环境搭建,IoC容器初体验~

    由于最近的任务是关于IoC配置文件格式的转换,所以需要从Spring的IoC容器开始学起,今天根据网上的介绍搭建了Spring环境,并对其IoC容器进行了初体验.文章中涉及到的软件以及推荐的一本关于S ...

  9. 来自新手Banana Pi香蕉派初体验

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 一段时间来对有强大的技术支持和完善的社区的Raspberry Pi很感兴趣,本想入一片学习学习,但转念一想Raspb ...

最新文章

  1. 学会python编程容易吗-学习武汉Python编程培训容易吗?别人都是怎么学习的?
  2. MPLS ×××-IPv4地址结构
  3. sharepoint的入门知识
  4. C# —— 序列化与反序列化
  5. path r'c test.html',robot framework - robot命令参数解析
  6. C#中泛型类型约束条件
  7. java中的页面:JSP(已过时)
  8. 结合二维码打造安全的手机远程运维管理平台
  9. pythonclass的使用详情_python 类class基础简明笔记
  10. Java 中的array数组总结之一
  11. plsqldev1105_x64与instantclient_11_2配置使用
  12. 中国数据开放共享的“道”与“术”
  13. 由浅入深学习Flash制作赛车游戏教程
  14. Docker容器下mysql数据库权限Access denied for user ‘‘@‘172.17.0.1‘ (using password: YES)
  15. 抛开元宇宙,我们来聊聊音视频技术的未来
  16. 边缘设备、系统及计算杂谈(13)——k8s学习之三
  17. MultipleOutputFormat和MultipleOutputs
  18. swf怎么和php实现交互,用ActionScript与JavaScript实现Flash与网页的交互
  19. vue2 使用 highlight.js 高亮代码
  20. Android自定义时钟控件

热门文章

  1. markdown向上取整和向下取整
  2. MySQL 意向共享锁、意向排他锁、死锁
  3. MpCmdRun恶意文件下载
  4. 逻辑函数表达式的形式
  5. 【华为OD机试2023】字符串解密 java python c++
  6. win10远程桌面连接凭据怎么设置_Win10远程桌面提示你的凭据不工作该怎么办?...
  7. makefile之.PHONY
  8. 华硕ASUS F81 se win7 声卡(RealTek HDAudio) 杂音 解决办法
  9. mysql splunk_Splunk初识
  10. cocos2d-x 坐标研究