赞
踩
首先贴出官方Github地址:https://github.com/ultralytics/yolov5
YOLOv5算法开发公司的名字是ultralytics (膜拜一下大神~~)
据说u大佬本来是基于YOLOv3算法基础上开发的该算法,计划起名YOLOv4,但是AB大佬抢先“注册”并发布了YOLOv4这个名字,所以u大佬就顺延改名为YOLOv5了。截止到撰写本文时该公司还没有发布正式的论文陈述自己的算法细节和思路。实际上AB大佬的YOLOv4算法是集大家之所长,选取最优的trick和模型架构组合在一起,虽然没有开创其他新颖的算法,但是梳理了YOLO系列常用算法和挑出了较优YOLOv4 trick的组合,也作出了较大的贡献。
平台:Windows10
首先进入YOLOv5仓库 ,手动下载zip或是git clone 上述远程仓库。
然后观察git仓库中的requirements.txt文件内容,里面涉及到的库比较多,所以为了防止本机环境因为包之间出现版本冲突,导致原本开发环境被破坏,因此这里使用Anaconda新建一个虚拟环境:
conda create -n yolov5 python=3.7
安装所需python库:
pip install -r requirments.txt
如果个别库安装不上,清华镜像源不行就换豆瓣。pytorch安装具体过程此处不做详谈。如有问题,可以留言一起讨论。
等待所有的库安装成功后,我们的开发环境就搭建好了。
此时可以提前下载好weights权重文件,为了避免访问外网的龟速,这里给大家准备好了。
可以使用LabelImg图像标注工具直接标注YOLO格式的后缀为txt形式的标签。但是不巧的是,博主前段时间刚好标注好Pascal VOC标签,也就是xml格式的label标签。因此voc不适用数据的输入,需要转化为coco数据集形式的txt标签文件。(xml->txt)
那么问题就来了,怎样转化呢?
通过查看其他大佬的博客得知,可以使用darknet的工具以指令形式转化label格式。但是操作过于洋气,无奈没有看懂,只能苦逼地手动进行格式转化。
图像数据集:
整理出一份以上图像文件清单:
1、在包含训练图片的文件夹中新建TXT文件。
2、在TXT文件中输入 DIR *.*/B>train.txt
(DIR命令后须有一空格)
3、保存后将后缀名改为BAT。
4、双击该文件即可生成一个train.txt。
5、打开再根据自己要求修改即可。
删掉每个图像文件的后缀名,可以在train.txt中同时按下Ctrl+H打开内容查找替换:用空白替换.jpg即可。
生成的train.txt清单:
事先标注好的pascal VOC格式的label数据文件(与上述图像文件名称一一对应):
# 导包 import copy from lxml.etree import Element, SubElement, tostring, ElementTree import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join # 类别列表(根据自己的开发需求的实际情况填写) classes = ['yellow_vest', 'reflective_sticker', 'person', 'driving_cab', 'cliver1', ' cliver2', 'arm', 'telegraph_pole'] #类别 # label中锚框坐标归一化 def convert(size, box): # size:(原图w,原图h) , box:(xmin,xmax,ymin,ymax) dw = 1./size[0] # 1./w dh = 1./size[1] # 1./h x = (box[0] + box[1])/2.0 # 物体在图中的中心点x坐标 y = (box[2] + box[3])/2.0 # 物体在图中的中心点y坐标 w = box[1] - box[0] # 物体实际像素宽度 h = box[3] - box[2] # 物体实际像素高度 x = x*dw # 物体中心点x的坐标比(相当于 x/原图w) w = w*dw # 物体宽度的宽度比(相当于 w/原图w) y = y*dh # 物体中心点y的坐标比(相当于 y/原图h) h = h*dh # 物体高度的高度比(相当于 h/原图h) return (x,y,w,h) # 返回相对于原图的物体中心的(x坐标比,y坐标比,宽度比, 高度比),取值范围[0-1] # Label格式转化 def convert_annotation(image_id): in_file = open(r'E:\Crane_Project\fu0722_label\2019_0918_112336_028A1_label\%s.xml'%(image_id)) # 需要转化的标签路径 out_file = open(r'E:\Crane_Project\fu0722\2019_0918_112336_028A1/txt_form/%s.txt'%(image_id),'w') # 生成txt格式的标签文件(label)的保存路径 tree=ET.parse(in_file) # 解析xml文件 root = tree.getroot() # 获取xml文件的根节点 size = root.find('size') # 获取指定节点的图像尺寸 w = int(size.find('width').text) # 获取图像的宽 h = int(size.find('height').text) # 获取图像的高 for obj in root.iter('object'): cls = obj.find('name').text # xml里的name参数(类别名称) if cls not in classes : continue cls_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') image_ids_train = open(r'E:\Crane_Project\fu0722\2019_0918_112336_028A1/train.txt').read().strip().split() # 汇总所有.jpg图像文件名称的txt清单(上述生成的) for image_id in image_ids_train: convert_annotation(image_id) # 转化标注文件格式
转化后生成的txt标签:
形式比较多样化,博主是按原始coco结构组织的,如下:
官方coco数据集结构:
我的结构神似:
总的来说,就是把image和label分开,把训练集train和验证集val分开,分别进行存放。这里要注意的是labels中的标注名称需要与images中的图像名称一一对应。
基本上修改三个文件即可
1.修改data中的coco.yaml
2.修改models中的yolov5l.yaml
改下分类数目即可:
3.修改根目录中的train.py
一般需要修改的有以下几种常见参数:
if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--cfg', type=str, default='models/yolov5l.yaml', help='model.yaml path') parser.add_argument('--data', type=str, default='data/coco.yaml', help='data.yaml path') parser.add_argument('--hyp', type=str, default='', help='hyp.yaml path (optional)') parser.add_argument('--epochs', type=int, default=200) # 训练的epoch parser.add_argument('--batch-size', type=int, default=2, help="Total batch size for all gpus.") # batchsize大小 parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='train,test sizes') parser.add_argument('--rect', action='store_true', help='rectangular training') # 矩形训练 parser.add_argument('--resume', nargs='?', const='get_last', default=False, help='resume from given path/to/last.pt, or most recent run if blank.') # 恢复最近保存的模型开始训练 parser.add_argument('--nosave', action='store_true', help='only save final checkpoint') parser.add_argument('--notest', action='store_true', help='only test final epoch') parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check') parser.add_argument('--evolve', action='store_true', help='evolve hyperparameters') parser.add_argument('--bucket', type=str, default='', help='gsutil bucket') parser.add_argument('--cache-images', action='store_true', help='cache images for faster training') parser.add_argument('--weights', type=str, default='weights/yolov5l.pt', help='initial weights path') # 初始化权重 parser.add_argument('--name', default='', help='renames results.txt to results_name.txt if supplied') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%') # 多尺度训练 parser.add_argument('--single-cls', action='store_true', help='train as single-class dataset') # 单类别的训练集 parser.add_argument("--sync-bn", action="store_true", help="Use sync-bn, only avaible in DDP mode.") # Parameter For DDP. parser.add_argument('--local_rank', type=int, default=-1, help="Extra parameter for DDP implementation. Don't use it manually.") opt = parser.parse_args()
选择一种想要使用的权重文件即可:
python train.py --data coco.yaml --cfg yolov5s.yaml --weights weights/yolov5s.pt --batch-size 4
训练完后,会生成一个runs文件夹和result.png文件,打开runs文件夹:
进入exp11,都是训练生成的一些结果:
图中的weights文件夹保存的就是训练好的模型:
我们可以用图中best.pt来进行推理预测了~
python detect.py --weights weights/best.pt --source 0 # 开启本机默认摄像头
python detect.py --weights weights/best.pt --source inference/image/test.jpg # 预测图像
python detect.py --weights weights/best.pt --source inference/image/test.mp4 # 渲染视频
终端视频实时渲染输出数据流:
打开inference/output文件夹(预测时自动生成),就可以看到可视化结果了。
我们可以根据最终模型的效果调整我们训练过程中的参数或数据集,使其更上一层楼。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。