YOLOv5算法如此强大,是学习深度学习图像识别无法绕过去的一个门槛;在掌握了一些基本模型(CNN/UNet/ResNet等)以后;是时候向YOLOv5发起挑战了;通过一个月的学习,基本理解了YOLOv5的原理和并实现基础的部署、训练和测试
YOLOv5 王者荣耀目标检测羡慕是个非常好的实战项目,非常适合用来练手;本人硬件配置:I7 10870h+3070+16G内存 cuda 11.6 torch 1.13
最终结果如下方图片和视频:
WeChat_20221118204908
以下是在部署过程中遇到的坑 ,按照以下步骤一步步来即可:
yolov5版本:https://gitcode.net/mirrors/ultralytics/yolov5
最早用官方最新版本,结果有些地方不兼容,导致一直出BUG,此版本亲测好用;
新建文件夹:
mydata
├─ images
│ ├─ test # 下面放测试集图片
│ ├─ train # 下面放训练集图片
│ └─ val # 下面放验证集图片
└─ labels
├─ test # 下面放测试集标签
├─ train # 下面放训练集标签
├─ val # 下面放验证集标签
/
1.修改coco128.yaml
打开yolov5\data 文件夹,找到coco128.yaml文件,复制一份,重命名为mydata.yaml
我的路径为C:\Users\Administrator\yolov5\data
打开mydata.yaml,
修改:注释path行,
修改为train:mydata//images/train, 可以是相对于主程序train.py的位置
修改val: mydata/images/val,此项为验证集的相对位置
修改test: mydata/images/test,此项为测试集的相对位置
//也可以是绝对路径 我的是
//train: C:\mydate\yolov5-master-155\yolov5-master\mydata\images\train # train images (relative to 'path') 128 images
//val: C:\mydate\yolov5-master-155\yolov5-master\mydata\images\val # val images (relative to 'path') 128 images
//test: C:\mydate\yolov5-master-155\yolov5-master\mydata\images\test # test images (optional)
修改nc:10
修改names: ['scissors'],更改你的标签名称,有几种写几种
注释download ,此项为下载yolov5的默认脚本,对我们没用
/
2.修改yolov5s.yaml
打开yolov5\models,找到yolov5s.yaml,复制一份重命名为myyolov5s.yaml
我的路径为C:\Users\Administrator\yolov5\models\
打开myyolov5s.yaml
只需要修改一项将nc改为10,此项为我们的标签种类数
/
3、修改train.py
打开yolov5文件夹,找到 train.py文件,复制重命名为mytrain.py
我的文件路径为C:\Users\Administrator\yolov5\train.py
打开mytrain.py,下滑到473行
注意,必须要修改 --data --cfg --batch-size 这三行代码
parser.add_argument('--cfg', type=str, default='models/myyolov5s.yaml', help='model.yaml path')
#必要修改
#修改地址为models/myyolov5s.yaml,训练模型文件位置
parser.add_argument('--data', type=str, default='data/mydata.yaml', help='dataset.yaml path')
#必要修改
parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch')
#打包次数为16,越小越快,不能过小
/
运行bug:
///
bug1:
报错:AttributeError: ‘Upsample’ object has no attribute ‘recompute_scale_factor
D:\anaconda\envs\pytorch39\Lib\site-packages\torch\nn\modules\upsampling
将原代码(153-154行)修改为如下所示(155行):
def forward(self, input: Tensor) -> Tensor:
#return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners,
#recompute_scale_factor=self.recompute_scale_factor)
return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners)
///
bug2:
RuntimeError: result type Float can‘t be cast to the desired output type __int64报错解决方法
解决方法:找到5.0版报错的loss.py中最后那段for函数,将其整体替换为yolov5-master版中loss.py最后一段for函数即可正常运行
for i in range(self.nl):
anchors, shape = self.anchors[i], p[i].shape
gain[2:6] = torch.tensor(shape)[[3, 2, 3, 2]] # xyxy gain
# Match targets to anchors
t = targets * gain # shape(3,n,7)
if nt:
# Matches
r = t[..., 4:6] / anchors[:, None] # wh ratio
j = torch.max(r, 1 / r).max(2)[0] < self.hyp['anchor_t'] # compare
# j = wh_iou(anchors, t[:, 4:6]) > model.hyp['iou_t'] # iou(3,n)=wh_iou(anchors(3,2), gwh(n,2))
t = t[j] # filter
# Offsets
gxy = t[:, 2:4] # grid xy
gxi = gain[[2, 3]] - gxy # inverse
j, k = ((gxy % 1 < g) & (gxy > 1)).T
l, m = ((gxi % 1 < g) & (gxi > 1)).T
j = torch.stack((torch.ones_like(j), j, k, l, m))
t = t.repeat((5, 1, 1))[j]
offsets = (torch.zeros_like(gxy)[None] + off[:, None])[j]
else:
t = targets[0]
offsets = 0
# Define
bc, gxy, gwh, a = t.chunk(4, 1) # (image, class), grid xy, grid wh, anchors
a, (b, c) = a.long().view(-1), bc.long().T # anchors, image, class
gij = (gxy - offsets).long()
gi, gj = gij.T # grid indices
# Append
indices.append((b, a, gj.clamp_(0, shape[2] - 1), gi.clamp_(0, shape[3] - 1))) # image, anchor, grid
tbox.append(torch.cat((gxy - gij, gwh), 1)) # box
anch.append(anchors[a]) # anchors
tcls.append(c) # class
///
bug3:
YOLOV5训练模型报错:
OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\Anaconda\envs\...
为了图省事,按照参考的这个博客直接试了修改batch size,改小了,发现没有用,还是报错,然后就按照它的第一步改yolov5\utils\datasets.py中的num_workers:
将num_workers改为0
改系统软件虚拟内存 分页大小:500000M
到此就没再遇见新的Bug;
YOLOv5内容超级丰富,此次只是快速实现训练和测试,后续还需要进一步的学习,在此与君共勉,哈哈
训练所需数据集,失效的话邮箱发我站内私信,看见基本都会发,有赞更好:
https://aistudio.baidu.com/aistudio/datasetdetail/165546
主要流程参考了以下博主,遇到的坑上文全解决:
https://blog.csdn.net/m0_55317949/article/details/125268136
用来测试的原视频来自b站,博主 王者荣耀小二皮:
https://www.bilibili.com/video/BV1Q841187nm/?spm_id_from=333.337.search-card.all.click&vd_source=ae8859b77e04d60ad41551effea9b27c