以阿里天池比赛为例,手把手教你玩转yolov5,妈妈再也不用担心用yolov5训练自己的数据集啦。
下面提供两种下载代码的方式:
提示:
1. 如果是win系统的话,建议安装一个git,可以直接像linux那样丝滑,安装起来也很简单,在官网找到和电脑自己电脑配置相同的文件,一直下一步直到结束,就安装好了。
2. 如果使用一下代码出现连接失败的话,可以使用git clone http://github.com/ultralytics/yolov5.git
3. 如果出现超时的话。可以在后面加一个时间--timeout 5000
git clone https://github.com/ultralytics/yolov5.git
我提供的连接包含了数据和注释,非常详细,适合新手,当然自己也是新手哈。
百度云链接:https://pan.baidu.com/s/1xN44KpPPxdUoEdIM9Vkvhw
提取码:fasf
pytorch、python
和cuda
没有特别的要求,我建议的话安装pytorch1.9、python3.8
.这里默认你已经安装好了这些基础环境,没有安装的也很简单,百度一搜就出来了pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
yolov5s.pt,yolov5m.pt,yolov5l.pt,yolov5x.pt
权重文件,自己新建一个文件夹放置这些权重,我新建的文件夹为weights
。提示后面s、m、l、x
表示网络的宽度和深度,最小的是s,速度最快、精度最低,其余你们自己类比哈!pytorch、tensorflow、openvino、tensorrt
,注意下载对应的类别哈,用我的代码的话,后面已经下载好了哈。如果上面步骤的实现了的话,我们来测试一下,看看能否正常运行吧。
需要注意的是,yolov5提供了测试2张图片位于
./data/images/
,下面的代码。我放到了./data/test_images/
,其次这里用的权重是yolo5.pt
。
python detect.py --source ./data/test_images/ --weights weights/yolov5s.pt
注意核对自己的下面几个信息,可以找到你输出的文件夹,查看结果,至于如何详细了解如何运行
detect.py
更多的信息,大家可以查看我之前写的博客,有详细的介绍https://blog.csdn.net/CharmsLUO/article/details/123422822
3. 查看输出结果的位置yolov5\runs\detect\exp13
,这是我的位置哈,你的位置,你的运行结果上面可以看到
如果上面的步骤都准备好了的话,我下面就来开始准备数据吧。
我们这里以阿里天池比赛的数据集为例,数据连接和数据描述,可以查看下面连接https://blog.csdn.net/CharmsLUO/article/details/124313955
top 左上角坐标Y
height 字符高度
left 左上角坐标X
width 字符宽度
label 字符编码
,我们需要转化成yolov5的数据格式,中心点 + 长宽
import json
import tqdm
import cv2
import os
# 文件路径
# json文件路径
json_dir = './dataset/mchar_train.json'
# 图片所在路径
img_dir='./yolov5/data/images/mchar_train/'
# 输出的 txt 文件路径
out_dir = './yolov5/data/labels/mchar_train/'
# 不存在就新建文件路径
if not os.path.exists(out_dir):
os.makedirs(out_dir)
def main():
# 读取 json 文件数据
with open(json_dir, 'r') as load_f:
content = json.load(load_f)
# 循环处理
for key, value in tqdm.tqdm(content.items()):
tmp = key.split('.')
# 文件名前缀
filename = out_dir + tmp[0] + '.txt'
# 左上角x 例如:left = [243, 121]
left=value['left']
# 左上角y
top=value['top']
# 字符高度
height=value['height']
# 字符宽度
width=value['width']
# 字符值(字符标签)
label=value['label']
# 读入标签对应的图片
image_cv = cv2.imread(img_dir+tmp[0]+'.png')
# 获取图片宽和高
image_height=image_cv.shape[0]
image_width=image_cv.shape[1]
# 获取标注框的四个角的坐标,原点在左上
for index in range(len(left)):
# 左上横坐标
bbox0=left[index]
# 左上纵坐标
bbox1 = top[index]
# 右下横坐标
bbox2=bbox0+width[index]
# 右下纵坐标
bbox3=bbox1+height[index]
# 标签
theLabel=label[index]
# 计算yolo数据格式所需要的中心点的相对 x, y 坐标, w,h 的值
# yolo格式是以标签中心点来求相对位置的
x = (bbox0 + bbox2) / 2 / image_width
y = (bbox1 + bbox3) / 2 / image_height
# 相对于图片的相对长宽
w = (bbox2 - bbox0) / image_width
h = (bbox3 - bbox1) / image_height
# 创建一个新文件,模式是a+, 可读可写,文件存在在后面追加
fp = open(filename, mode="a+", encoding="utf-8")
# 保留6为有效数字
file_str = str(theLabel) + ' ' + str(round(x, 6)) + ' ' + str(round(y, 6)) + ' ' + str(round(w, 6)) + ' ' + str(round(h, 6))
# 注意换行符
fp.write(file_str+'\n')
# 写入完毕关闭
fp.close()
if __name__ == '__main__':
main()
注意:由于我使用的是阿里天池比赛数据集,其中
images
下的mchar_train
文件夹中放训练用的3万张图片,mchar_val
文件夹中放验证用的1万张图片。labels
下的mchar_train
文件夹中放mchar_train.json
解析后的json
文件,mchar_val
文件夹中放mchar_val.json
解析后的json
文件。
创建一个数据配置文件,数据加载的时候需要用到。格式为.yaml
,可以自己新建一个文件夹装这个文件,可以像我直接在yolov5/data/
文件下创建。里面有很多现成的数据配置文件,比如说VOC.yaml、coco.yaml
,可以参照这种格式依葫芦画瓢。我创建文件如下:
train: ./data/images/mchar_train/
val: ./data/images/mchar_val/
# number of classes
nc: 10
# class names
names: ['0','1','2','3','4','5','6','7','8','9']
创建模型配置文件,可以直接从yolov5s.yaml,yolov5m.yaml,yolov5l.yaml,yolov5x.yaml
选择你想用的模型。复制粘贴就可以,记住改名字哈,模型配置文件你可以创建在models
,也可以新建文件夹。我直接创建在yolov5
下,提示注意修改类别数nc
。
我这里以yolov5s.yaml
为例,创建yolov5s_mchar.yaml
# YOLOv5 by Ultralytics, GPL-3.0 license
# Parameters
nc: 10 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
以上步骤都完成之后,我们开始训练自己的数据集啦
python train.py --data ./data/mchar.yaml --cfg yolov5l_mchar.yaml --epochs 80 --batch-size 8 --weights ./weights/yolov5s.pt
输出的位置,如果没有设置位置的话,会自动创建,创建一般在
./run/train/exp*
注意了解更多训练相关的细节可以查看连接:https://blog.csdn.net/CharmsLUO/article/details/123542598
python detect.py --weights ./runs/train/exp5/weights/best.pt --source ./data/images/mchar_val/
输出的位置,如果没有设置位置的话,会自动创建,创建一般在
./run/detect/exp*
想了解更多预测相关的细节可以查看连接:https://blog.csdn.net/CharmsLUO/article/details/123422822
以上就是今天的内容了,yolov5系列,下次再出一个用tensorrt加速的教程。