旧版本2021.08.03
新版本https://blog.csdn.net/m0_53392188/article/details/119334634
以作备份
目录
一、前言
二、学习内容
编辑
二、版本与配置声明
三、Yolov5的准备
1.下载Yolov5
2.安装依赖库
3.运行检测
四、训练集
五、制作标签
1.下载labelme
2.安装依赖库
3.labelme操作
4.json转txt
五、修改配置文件
1.coco128.yaml
2.yolov5配置
六、训练train
七、识别detect
八、debug
九、百度网盘资源
十、结语
1.集成的资源我放在了文末,包括我自己做成的成品,可以直接train与detect。我发在百度网盘上。
2.我本人没有学过深度学习,我只是在做视觉项目的时候记录了过程,主要是能够让读者复现,直接使用,而且我不讲原理。如果深入想了解yolov5的原理,可以去看热度比较高的博主做的
3.如果有问题可以在评论区里讨论,或者私信我都行,提问前请先点赞支持一下博主^_^。
2020年6月25日,Ultralytics发布了YOLOV5 的第一个正式版本,其性能与YOLO V4不相伯仲,同样也是现今最先进的对象检测技术,并在推理速度上是目前最强,yolov5按大小分为四个模型yolov5s、yolov5m、yolov5l、yolov5x。
今天我们来学习一下如何简单使用这个算法
文章特点:一个完整的流程,从头教到尾,不讲冗长的理论,实操,看完本篇文章,训练与识别都是没有问题的,我以王者荣耀作为训练集,可以先看看效果
Yolov5展示视频(b站),可以直接戳这个也可以看下面俩
Yolov5识别效果
原视频
以下是操作的流程图
官方要求python>=3.7,Pytorch>=1.5
我的:python 3.7.1
----------------------------------------------------------Yolov5需要
# base --------------------------------------
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.2
Pillow
PyYAML>=5.3.1
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.41.0# logging --------------------------------------
tensorboard>=2.4.1
# wandb# plotting --------------------------------------
seaborn>=0.11.0
pandas# export --------------------------------------
# coremltools>=4.1
# onnx>=1.9.0
# scikit-learn==0.19.2 # for coreml quantization# extras --------------------------------------
# Cython # for pycocotools https://github.com/cocodataset/cocoapi/issues/172
# pycocotools>=2.0 # COCO mAP
# albumentations>=1.0.2
thop # FLOPs computation
-----------------------------------------------------------labelme需要
PyQt5 5.15.4
labelme 4.5.9
----------------------------------------------------------
联想小新Air 15
https://github.com/ultralytics/yolov5,放在合理的位置,如果这个下的慢的话见文末资源
“版本声明”中的库需要安装的,主要的是这几个
requests
pandas
pyyaml
matplotlib
seaborn
cython
numpy
tensorboard
大部分都能pip install 。重点说两个
(1)对于Pytorch,在Anaconda Prompt里输入
pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio===0.7.0 -f https://download.pytorch.org/whl/torch_stable.html
(2)对于wandb,wandb安装方法,这个好像不是必须的,但我还是下了,版本为0.10.11,刚好能兼容,作用就是对训练分析,如图所示
下载完yolov5后,点detect,运行
这个是帮你检测能不能正常运行的
若正常:
D:\Anaconda\python.exe C:/Users/86189/Desktop/yolov5-master/yolov5-master/detect.py
detect: weights=yolov5s.pt, source=data/images, imgsz=640, conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs/detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False
YOLOv5 2021-7-17 torch 1.7.0+cu101 CUDA:0 (GeForce MX350, 2048.0MB)
Downloading https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt to yolov5s.pt...
100%|██████████| 14.1M/14.1M [01:32<00:00, 160kB/s]
Fusing layers...
Model Summary: 224 layers, 7266973 parameters, 0 gradients
image 1/2 C:\Users\86189\Desktop\yolov5-master\yolov5-master\data\images\bus.jpg: 640x480 4 persons, 1 bus, 1 fire hydrant, Done. (0.055s)
image 2/2 C:\Users\86189\Desktop\yolov5-master\yolov5-master\data\images\zidane.jpg: 384x640 2 persons, 2 ties, Done. (0.024s)
Results saved to runs\detect\exp
Done. (0.197s)
Process finished with exit code 0
在runs中能发现被处理过的标签,说明成功了!
若程序报错,大概率是因为有的库版本不正确或者还未安装,这个自己调试一下即可,应该没有太大难度
训练集至少50张起步才有效果
训练集就是你需要train并用于detect的东西,我以王者荣耀作为例子,你可以跟着我来一遍,资源在文末。要做自己的训练集的话再看第五步。跟着我的话可以不用做标签,因为资源中已经做好了
如下图所示创建文件夹,让操作更清晰方便
images就是训练集的图片,labels就是训练集的标签,train的话是用于训练的,test就是用于测试的
https://github.com/wkentaro/labelme,如果下载得慢的话见文末资源
点Download Zip,下载后找到该文件,解压,无需配置环境变量
在Anaconda Prompt里pip install pyqt5和pip install labelme
然后在Anaconda Prompt里输入labelme,打开界面如下
可以选择打开一个文件或者文件夹,如果是打开文件夹的话就会是下面那样子
右击,点击rectangle,即画矩形框,框选你要识别训练的东西,举王者荣耀的例子
框选之后输入标签的名字,注意,可以框选多个作为标签。框选完一张图后保存,然后接着下一张图。保存的文件格式是.json
由于yolov5只认txt而不认json,因此还要有一个转换的过程
在yolov5-master中创建一个.py文件,代码如下
import json
import os
name2id = {'hero':0,'sodier':1,'tower':2}#标签名称
def convert(img_size, box):
dw = 1. / (img_size[0])
dh = 1. / (img_size[1])
x = (box[0] + box[2]) / 2.0 - 1
y = (box[1] + box[3]) / 2.0 - 1
w = box[2] - box[0]
h = box[3] - box[1]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return (x, y, w, h)
def decode_json(json_floder_path, json_name):
txt_name = 'C:\\Users\\86189\\Desktop\\' + json_name[0:-5] + '.txt'
#存放txt的绝对路径
txt_file = open(txt_name, 'w')
json_path = os.path.join(json_floder_path, json_name)
data = json.load(open(json_path, 'r', encoding='gb2312',errors='ignore'))
img_w = data['imageWidth']
img_h = data['imageHeight']
for i in data['shapes']:
label_name = i['label']
if (i['shape_type'] == 'rectangle'):
x1 = int(i['points'][0][0])
y1 = int(i['points'][0][1])
x2 = int(i['points'][1][0])
y2 = int(i['points'][1][1])
bb = (x1, y1, x2, y2)
bbox = convert((img_w, img_h), bb)
txt_file.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\n')
if __name__ == "__main__":
json_floder_path = 'C:\\Users\\86189\\Desktop\\哈哈哈\\'
#存放json的文件夹的绝对路径
json_names = os.listdir(json_floder_path)
for json_name in json_names:
decode_json(json_floder_path, json_name)
标注地方是需要修改的,有几个标签名就写几个标签名,而且这是一个文件夹里所有的json一起转化,存放txt的路径改为labels的train中(还记得下面这张图吗)
转化完后大概会是这样子,如果一张图有多个标签的话,这个数据就会变多
先复制一份,可以粘贴到my_dates中,改名为mydata(当然你想改啥名字,想放哪里都行,但是要记住路径记住名字,2.也一样)
注意这个mydata的路径,不要放错了;此外,mydata1_yaml应该是训练后自动生成的,不用管。
mydata.yaml文件需要修改的参数是nc与names。nc是标签名个数,names就是标签的名字,王者荣耀的例子中有10个标签,标签名字都如下。同时要把path注释掉
(注意path那里要注释掉,评论区 Hariod 兄弟说原先是没有被注释的)
还需要修改一个路径,注意这里是存放训练集图片的相对路径,斜杠别搞反了,相对路径就是对于yolov5-master的路径,我的如下(这就是我为什么建议创建文件夹的原因)
yolov5有4种配置,不同配置的特性如下,我这里选择yolov5s,速度最快,但是效果最拉胯
先复制一份yolov5s
可以粘贴到my_dates中,改名为mydata_1,需要修改的参数是nc,nc就是标签的数量,王者荣耀的例子是10个,故改成10
1.train.py
打开这个文件,需要修改的参数比较多
第一个是with open,参数要加上encoding='utf-8',不然的话很可能会出现编码报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position 577
以下修改的都是default处
第二个是484行的配置,用的是yolov5s
第三个是486行和488行的路径
第四个是491行,因为我的电脑拉胯,所以不能按照原配置搞(这就是我为什么在一开始就声明配置的原因)
第五个是495行,原来长宽都是640,不行的话减32直至可以run
第六个是513行
这一大串参数都是根据我的低配联想小新来的,我按照这样是能run的,游戏本的话配置还能再调高些
这个时间很长!我当时试过如果是5张图片,要花5分钟左右,如果是王者荣耀这个例子106张图,大概要1个小时
(train效果如上图所示)在runs\train\exp\weights中能看到有一个best和last,意思是最好的和最近的
如下图所示是需要修改的参数,也是best和测试图片的相对路径,不要搞错了。结果在runs\detect\exp中看
我的测试是个视频(视频也可图片也可),出来的结果就是文章开头放的视频
效果不是很好,但是还是能分辨个大概,原因有两个
一是因为用了最拉的yolov5s,二是训练的文件还不够多
detect效果如图所示,画红线的地方为识别出来的物体我猜测大多数问题为:
1.wandb报错。安装方法的链接已经在文中了。如果要使用wandb的话需要注册那个网站,然后他会给个码给你,复制后你在控制台里粘贴,然后才能用(大概是这样)。
2.文件路径没写对。有点惭愧,文件路径我搞的比较乱(自我吐槽),大家要注意。正因如此我做了个框架图。
3.显卡爆了,那就调低train中我列出来的那几行default
4.有朋友说他在训练时,box obj cls labels的值为0或nan。正常情况下是正常的数(我发了训练的时候的图片),我猜测可能是训练集标签没做好 或者 路径没写对 或者 default没调好
5.建议路径为全英文,不要带中文,否则可能会出现意料之外的错误
链接:https://pan.baidu.com/s/1YmZOPzcVaA0TuupMDW93SQ
提取码:vhw1
你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿