解决方案:【目标检测】英雄联盟能用YOLOv5实时目标检测了 支持onnx推理
优采云 发布时间: 2022-11-30 10:53解决方案:【目标检测】英雄联盟能用YOLOv5实时目标检测了 支持onnx推理
目录
一、项目介绍
dcmyolo(梦想创造奇迹),中文:大智能物体检测工具包。该项目基于pytorch构建。构建的目的是提供一个性能更好的YOLO版本。同时拥有丰富的中文教程和详细的源码解读。提供了算法工具箱,给出了不同体积模型的实验数据,为算法的实现提供了指导。来的方便。为了方便开发者,项目开箱即用。推理阶段,直接把test dcmyolo目录放到项目中,实例化一个类,然后调用。
很多教程都是基于coco和voc数据集,我也会提供基于coco数据集的预训练模型。为了增加趣味性,我将以英雄联盟中英雄、小兵、塔的检测为例,详细介绍dcmyolo的使用。
项目链接:
资料链接: 提取码:faye
测试视频: 提取码:faye
预训练模型: 提取码:faye
标注工具: 提取码:faye
效果演示:英雄联盟可以使用YOLOv5实时目标检测_英雄联盟
2.项目结构
dcmyolo项目主目录
+数据存储训练和测试数据
- dcmyolo实现了项目的所有核心功能,移植时直接测试该目录即可
- 模型模型构建相关
+ backbone 各种backbone,目前只有CSPdarknet,未来会不断丰富
yolo_body.py构建模型的类,实例化后使用
+ model_data 存储模型文件
+ utils 工具类
labelme2voc.py 将labelme的json文件转为voc格式
voc2annotation_txt.py 将VOC格式转换成项目需要的格式
make_anchors.py 生成数据集的anchors文件
train_dcmyolo.py 执行训练
export.py 导出onnx等格式的文件
predict_dcmyolo.py 推理演示
predict_onnx.pypth 转换onnx,onnx进行推理demo
3.准备数据
我们需要制作三个文件train.txt、val.txt、test.txt,格式如下:
data/wangzhe/JPEGImages/1.jpg 910,504,1035,633,0 1759,113,1920,383,2
data/wangzhe/JPEGImages/10.jpg 805,189,1060,570,0 1,649,273,935,2 1636,70,1823,182,2
data/wangzhe/JPEGImages/100.jpg 896,258,1254,550,3
data/wangzhe/JPEGImages/101.jpg 869,416,1059,591,0 277,295,464,407,4 1024,311,1369,640,3
文件中一张图片为一行,一行中的每条信息以空格分隔。第一块是图片存放的路径。这里我们放在项目中的data/wangzhe/JPEGImages目录下;其余几块表示方框的位置和类别,每段用逗号分成5个部分,分别代表左上x、左上y、右下x、右下y,以及所属类别的索引他们属于哪个。
如果只有图片,没有标签,我们需要进行下面的数据标注和数据格式转换步骤。这个过程非常简单,而且是体力劳动。
如果使用开源数据集,我们需要自己将数据集的标注文件转换成上述格式,不需要下面的步骤。
如果你用的是我整理的英雄联盟手游数据,直接下载数据解压到项目的data目录下,就可以直接使用了,不需要下面的步骤。
1、数据标注
这一步是用来制作我们自己的数据集的。我们使用 labelme 作为标注工具。标注好后,我们使用脚本将标注文件转成voc格式,再从voc转成我们需要的格式。上面是labelme的下载链接,解压后使用方法如下:
(1)双击main.exe打开labelme
(2) 选择要标注的图片目录。这里我准备了100多张英雄联盟的截图,比如项目中的data/wangzhe_org/目录。
(3)右侧会列出该文件夹下的所有图片,选择一张图片,在图片区域右击选择矩形
(4)选择一个矩形框的目标(英雄),填写类别名称,点击确定完成一个目标的标注。注意:一定要选择从左上角到右下角的边框;在同一张图片中标记尽可能多的目标,不要错过它们;同一类别的名称必须相同,不同类别的名称不能相同;类别名称使用英文(区分大小写),无标点符号。
(5)标记一张图片后,选择下一张图片时,会提示保存json文件,保存到默认目录即可,不要更改目录。
2.数据转换格式
我们已经得到了labelme生成的json格式的标准文件,我们需要先将其转换成VOC格式,然后再转换成我们需要的格式。
(1) 转换成VOC格式
执行工程中的labelme2voc.py文件,示例如下:
'''
data/wangzhe_org/: 存放原图片和labelme生成的json文件的目录
data/wangzhe/: 目标目录
labels: 存放所有列表标签的文件,英雄联盟的数据集标签文件已经放在项目的dcmyolo/model_data/wangzhe_classes.txt文件中
'''
python labelme2voc.py data/wangzhe_org/ data/wangzhe/ --labels dcmyolo/model_data/wangzhe_classes.txt
其中,dcmyolo/model_data/wangzhe_classes.txt文件,共有3种标签文件如下:
Hero
Solider
Tower
VOC格式有以下4个文件,Annotations存放标签文件,AnnotationsVisualization存放用方框标注的图片,方便我们查看,JPEGImages存放图片,class_names.txt存放所有类别的标签。接下来我们将只使用 Annotations 和 JPEGImages:
(2)转换工程需要的格式
执行项目中的voc2annotation_txt.py文件,示例如下:
'''
classes_path: 存放标签种类的文件
data_dir: 存数据的目录,写到Annotations上一级
trainval_percent: 用于指定(训练集+验证集)与测试集的比例,默认情况下 9:1
train_percent: 用于指定(训练集+验证集)中训练集与验证集的比例,默认情况下 9:1
'''
python voc2annotation_txt.py --classes_path dcmyolo/model_data/wangzhe_classes.txt --data_dir data/wangzhe/ --trainval_percent 0.95 --train_percent 0.95
至此我们已经生成了项目需要的标签文件,可以进行训练了。
4.执行力训练
所有数据文件和配置文件的文件名和目录都是可以自定义的,下面我会按照自己的习惯存放这些文件。
" />
1.锚文件
文件放在dcmyolo/model_data/wangzhe_classes.txt
原来yolov5提到的改进之一就是不需要手动生成anchors。事实上,生成anchor的方法在训练之前就被丢弃了。我比较习惯手动生成anchor,也不麻烦。
anchors的作用下一篇讲原理的时候会提到,现在我们只需要生成即可,使用make_anchors.py生成:
'''
txt_path: 标注文件txt
anchors_path: anchors文件txt
clusters: 聚类的数目,一般情况下是9
input_size: 模型中图像的输入尺寸
'''
python make_anchors.py --txt_path data/wangzhe/train.txt --anchors_path dcmyolo/model_data/wangzhe_anchors.txt --clusters 9 --input_size 640
生成的文件 wangzhe_anchors.txt 如下所示:
25,44,30,58,37,64,50,68,42,91,55,104,71,113,62,141,91,256
2.标签文件
文件放在dcmyolo/model_data/wangzhe_classes.txt,内容是标注三类,每行一类:
Hero
Solider
Tower
3.预训练模型
下载好预训练模型后,解压放到dcmyolo/model_data/下。
预训练模型有两种,backbone和yolov5。Backbone只是在imagenet上预训练的分类模型,yolov5是在coco数据集上训练的yolov5模型。如果同时加载了backbone和yolov5预训练模型,backbone参数会被覆盖。yolov5预训练模型收录
了一些backbone没有的卷积层。如果fine-tuning推荐使用yolov5预训练模型,收敛会更快。
4.训练数据
将上述数据集解压,放到data目录下。
如果是自己标注的数据,将三个核心文件train.txt、val.txt、test.txt放在data/wangzhe/目录下,同时保证这三个文件中的图片路径正确. 结构如下,其中ImageSets目录为临时目录,不用于训练,可以省略。
5.修改配置
所有参数的定义和注释如下,为了节省篇幅,去掉了之前的parser.add_argument:
('--classes_path', type=str, default='dcmyolo/model_data/coco_classes.txt', help="类别标签文件路径")
('--anchors_path', type=str, default='dcmyolo/model_data/coco_anchors.txt', help="anchors文件路径")
('--train_annotation_path', type=str, default='data/coco/train.txt', help="存放训练集图片路径和标签的txt")
('--val_annotation_path', type=str, default='data/coco/val.txt', help="存放验证图片路径和标签的txt")
('--phi', type=str, default='s', help="所使用的YoloV5的版本。n、s、m、l、x")
# ---------------------------------------------------------------------#
# --backbone_model_dir参数
# 如果有backbone的预训练模型,可以backbone预训练模型目录,当model_path不存在的时候不加载整个模型的权值。
# 只写到模型文件的上一级目录即可,文件名会根据phi自动计算(前提是从百度网盘下载的模型文件名没改)
# ---------------------------------------------------------------------#
('--backbone_model_dir', type=str, default='dcmyolo/model_data/', help="backbone的预训练模型,写到上一级目录即可")
('--model_path', type=str, default='dcmyolo/model_data/pretrained.pth', help="yolov5预训练模型的路径")
('--save_period', type=int, default=10, help="多少个epoch保存一次权值")
('--save_dir', type=str, default='logs_wangzhe', help="权值与日志文件保存的文件夹")
('--input_shape', nargs='+', type=int, default=[640, 640], help="输入的shape大小,一定要是32的倍数")
('--use_fp16', action='store_true', help="是否使用混合精度训练")
#------------------------------------------------------------------#
# mosaic 马赛克数据增强。
# mosaic_prob 每个step有多少概率使用mosaic数据增强,默认50%。
#
# mixup 是否使用mixup数据增强,仅在mosaic=True时有效。
# 只会对mosaic增强后的图片进行mixup的处理。
# mixup_prob 有多少概率在mosaic后使用mixup数据增强,默认50%。
# 总的mixup概率为mosaic_prob * mixup_prob。
#
# special_aug_ratio 参考YoloX,由于Mosaic生成的训练图片,远远脱离自然图片的真实分布。
# 当mosaic=True时,本代码会在special_aug_ratio范围内开启mosaic。
# 默认为前70%个epoch,100个世代会开启70个世代。
#------------------------------------------------------------------#
('--use_mosaic', action='store_true', help="是否使用马赛克数据增强")
('--mosaic_prob', type=float, default=0.5, help="每个step有多少概率使用mosaic数据增强")
('--use_mixup', action='store_true', help="是否使用mixup数据增强,仅在mosaic=True时有效")
('--mixup_prob', type=float, default=0.5, help="有多少概率在mosaic后使用mixup数据增强")
('--special_aug_ratio', type=float, default=0.7, help="当mosaic=True时,会在该范围内开启mosaic")
('--epoch', type=int, default=100, help="总迭代次数")
('--batch_size', type=int, default=128, help="每批次取多少张图片")
('--label_smoothing', type=float, default=0, help="是否开启标签平滑")
('--init_lr', type=float, default=1e-2, help="初始学习率")
('--min_lr', type=float, default=1e-4, help="最小学习率")
('--optimizer_type', type=str, default="sgd", help="使用到的优化器种类,可选的有adam、sgd")
('--momentum', type=float, default=0.937, help="优化器内部使用到的momentum参数")
('--weight_decay', type=float, default=5e-4, help="权值衰减,可防止过拟合")
('--lr_decay_type', type=str, default="step", help="使用到的学习率下降方式,可选的有step、cos")
('--eval_flag', action='store_true', help="是否在训练时进行评估,评估对象为验证集")
('--eval_period', type=int, default=10, help="代表多少个epoch评估一次")
('--num_workers', type=int, default=4, help="多少个线程读取数据")
示例脚本 train_dcmyolo.sh:
for i in $(ps -ax |grep train_dcmyolo |awk '{print $1}')
do
id=`echo $i |awk -F"/" '{print $1}'`
<p>
kill -9 $id
done
nohup python -u train_dcmyolo.py \
--classes_path dcmyolo/model_data/wangzhe_classes.txt \
--anchors_path dcmyolo/model_data/coco_anchors.txt \
--train_annotation_path data/wangzhe/train.txt \
--val_annotation_path data/wangzhe/val.txt \
--save_dir logs_wangzhe \
--phi s \
--backbone_model_dir dcmyolo/model_data \
--model_path dcmyolo/model_data/yolov5_s.pth \
--input_shape 640 640 \
--batch_size 4 \
--epoch 1000 \
--save_period 100 \
> log_train_dcmyolo.log &
tail -f log_train_dcmyolo.log
</p>
6.执行力训练
执行以下脚本进行训练,训练结果会放在logs_wangzhe目录下。
./train_dcmyolo.sh
五、执行预测
推理和预测方法都在predict_dcmyolo.py中,可以检测图片、检测视频和热图。所有参数定义如下。同样为了节省空间,移除了parser.add_argument:
('--operation_type', type=str, default='', help="操作类型export_onnx / predict_image / predict_video")
('--model_path', type=str, default='', help="pth模型的路径")
('--classes_path', type=str, default='', help="分类标签文件")
('--anchors_path', type=str, default='', help="anchors文件")
('--onnx_path', type=str, default='', help="onnx保存路径")
('--video_path', type=str, default='', help="视频时才会用到,视频的路径")
('--video_save_path', type=str, default='', help="视频时才会用到,视频检测之后的保存路径")
('--phi', type=str, default='', help="所使用的YoloV5的版本。n、s、m、l、x")
('--no_simplify', action='store_false', help="不使用onnxsim简化模型")
('--input_shape', nargs='+', type=int, default=[640, 640], help="输入的shape大小,一定要是32的倍数")
('--append_nms', action='store_true', help="添加nms")
('--iou_threshold', type=float, default=0.3, help="两个bbox的iou超过这个值会被认为是同一物体")
('--score_threshold', type=float, default=0.5, help="检测物体的概率小于这个值将会被舍弃")
1.检测图片
检测图片,示例脚本如下:
python predict_dcmyolo.py --operation_type predict_image --model_path dcmyolo/model_data/wangzhe_best_weights.pth --classes_path dcmyolo/model_data/wangzhe_classes.txt --anchors_path dcmyolo/model_data/coco_anchors.txt
在控制台输入图片路径,会显示检测结果:
2.检测视频
测试视频可以从上面的链接下载。示例脚本如下,检测结果会放在指定的输出位置:
python predict_dcmyolo.py --operation_type predict_video --model_path dcmyolo/model_data/wangzhe_best_weights.pth --classes_path dcmyolo/model_data/wangzhe_classes.txt --anchors_path dcmyolo/model_data/coco_anchors.txt --video_path data/video/wangzhe1.mp4 --video_save_path_path data/video/wangzhe1_out.mp4
3.热图
示例脚本如下:
python predict_dcmyolo.py --operation_type heatmap --model_path dcmyolo/model_data/wangzhe_best_weights.pth --classes_path dcmyolo/model_data/wangzhe_classes.txt --anchors_path dcmyolo/model_data/coco_anchors.txt --heatmap_save_path data/heatmap.jpg
与检测图片类似,在控制台输入图片路径,即可显示热图。可以清楚地看到激活区域,证明模型确实很好地检测到了目标。
5.转换onnx
将模型导出为onnx格式,有利于模型加速,便于模型部署。所有onnx相关的方法都放在predict_onnx.py中。可以导出onnx文件,检测图片,检测视频。所有参数定义如下。同样为了节省空间,移除了parser.add_argument:
('--operation_type', type=str, default='', help="操作类型export_onnx / predict_image / predict_video")
('--model_path', type=str, default='', help="pth模型的路径")
('--classes_path', type=str, default='', help="分类标签文件")
('--anchors_path', type=str, default='', help="anchors文件")
('--onnx_path', type=str, default='', help="onnx保存路径")
('--video_path', type=str, default='', help="视频时才会用到,视频的路径")
('--video_save_path', type=str, default='', help="视频时才会用到,视频检测之后的保存路径")
('--phi', type=str, default='', help="所使用的YoloV5的版本。n、s、m、l、x")
('--no_simplify', action='store_false', help="不使用onnxsim简化模型")
('--input_shape', nargs='+', type=int, default=[640, 640], help="输入的shape大小,一定要是32的倍数")
('--append_nms', action='store_true', help="添加nms")
('--iou_threshold', type=float, default=0.3, help="两个bbox的iou超过这个值会被认为是同一物体")
('--score_threshold', type=float, default=0.5, help="检测物体的概率小于这个值将会被舍弃")
1.导出onnx文件
建议导出的onnx收录
nms,这样可以直接使用onnx输出的结果,不需要程序进行后期处理。加上--append_nms参数,可以让联通nms导出,onnx结果会报有指定的输出路径。示例脚本如下:
python predict_onnx.py --operation_type export_onnx --model_path dcmyolo/model_data/wangzhe_best_weights.pth --classes_path dcmyolo/model_data/wangzhe_classes.txt --anchors_path dcmyolo/model_data/coco_anchors.txt --onnx_path dcmyolo/model_data/wangzhe_best_weights.onnx --append_nms
2.检测图片
使用onnx模型检测图片,示例脚本如下:
python predict_onnx.py --operation_type predict_image --onnx_path dcmyolo/model_data/wangzhe_best_weights.onnx --classes_path dcmyolo/model_data/wangzhe_classes.txt
在控制台输入图片路径,即可显示检测结果。可以看到onnx和pytorch的结果是一致的。
3.检测视频
测试视频可以从上面的链接下载。示例脚本如下,检测结果会放在指定的输出位置:
python predict_onnx.py --operation_type predict_video --onnx_path dcmyolo/model_data/wangzhe_best_weights.onnx --classes_path dcmyolo/model_data/wangzhe_classes.txt --video_path data/video/wangzhe1.mp4 --video_save_path data/video/wangzhe1_out1.mp4
英雄联盟YOLOv5实时检测的功能这里简单介绍一下。下一篇我会介绍YOLOv5的实现原理。dcmyolo项目会持续维护,会增加越来越多的功能,敬请期待。
解决方案:基于web的文章管理系统(完整源码+论文全套+教学视频)
实现一个web文章管理系统,也就是说可以基于浏览器管理各种数据信息。也可以看作是一个B/S架构的文章管理系统。系统分为前后台,实现在线操作,实现文章管理系统的各项功能,实现用户管理、登录注册、权限管理等功能,管理与各种文章相关的实体管理系统。
文章管理系统是采用mvc设计模式开发的B/S架构项目,采用分层架构对项目进行架构,分为pojo+action+service,其中pojo表示文章的各个数据库表对应的实体系统,文章管理系统经过详细的需求分析和数据库设计,设计实现了以下模块,分别是登录模块,权限管理模块,用户管理模块,文章管理系统信息管理模块等。并通过java实现抽象类
开发环境系统需求分析及流程图
一般来说,这类项目的主要目的是掌握基本的web开发知识,所以在实施文章管理系统的课程设计时,需要先采集
其他文章管理系统的产品分析,进行深入的数据库web系统的设计,并基于mvc模式编写代码,使用layui搭建页面,进而完成文章管理系统各模块的开发
数据库课程设计
数据库设计是整个文章管理系统的关键。合理的数据库设计直接影响文章管理系统能否完美运行不报错。本系统采用mysql数据库作为数据存储,引擎采用innoddb。文章管理系统将按照数据库设计原则进行数据分表设计
系统演示视频运行截图
基于Web的文章管理系统-登录功能接口-网站实现
" />
基于Web的文章管理系统-前台首页-网页设计
基于Web的文章管理系统-后台信息管理页面-网页设计
文章管理系统系统架构图
预防措施
基于web的文章管理系统项目自带源码、试卷、sql数据库、答辩ppt、期中检查报告
" />
登录地址:8080/login.jsp
后台地址:8080/admin/login.jsp
测试用户cswork admin bishe 密码123456
测试管理员admin密码admin bishe
函数列表
文章管理系统系统登录模块,实现文章管理系统的登录注册功能
文章管理系统用户管理模块实现文章管理系统的信息管理和角色管理功能
前台信息管理模块,面向普通用户,实现普通用户对文章管理系统自定义查询的录入和修改
超级管理员管理,实现文章管理系统系统各模块后台管理员管理功能,同意核心数据最佳权限管理