Pytorch-YOLOv4梳理——原理和复现

2023-09-15 12:04:41

yolov1到yolov3的梳理:YOLO总结,从YOLOv1到YOLOv3_追忆苔上雪的博客-CSDN博客

首先说一点,就是yolov4的分支有点多,先梳理一下出现的顺序。

Alexey Bochkovskiy提出了YOLOv4

然后针对YOLOv4的模型缩放(model scale),提出了Scaled-YOLOv4

Scaled-YOLOv4针对低端、一般、高端GPU分别设计了3个模型,

分别是:YOLOv4-CSP 、 YOLOV4 -tiny、YOLOv4-large

再说一点,论文给的网站,要拖到下面才能找到pytorch版本的代码

yolov4论文:https://arxiv.org/abs/2004.10934

scale-yolov4论文:https://arxiv.org/abs/2011.08036

后续用下面这个版本的做例子:GitHub - WongKinYiu/PyTorch_YOLOv4: PyTorch implementation of YOLOv4这就是论文的二作复现的

yolov4-csp:GitHub - WongKinYiu/ScaledYOLOv4 at yolov4-csp

yolov4-large:GitHub - WongKinYiu/ScaledYOLOv4: Scaled-YOLOv4: Scaling Cross Stage Partial Network

yolov4-tiny:GitHub - WongKinYiu/ScaledYOLOv4 at yolov4-tiny

(1)yolov4相比yolov3的改善

YOLOv4是YOLOv3的加强版,其主要在YOLOv3的基础上添加了一系列的小改进。因此YOLOV4与YOLOV3整体的预测思路是没有差别的!解码的过程甚至一模一样。

YOLOv4的小改进遍布方方面面,主要有以下几点:

(1)主干特征提取网络的改进

由Darknet53改成了CSPDarknet53

(2)加强特征提取网络的改进

使用了SPP和PANet结构

(3)数据增强方面的改进

使用了Mosaic数据增强

(4)LOSS方面的改进

使用了CIOU作为回归LOSS

(5)使用了MISH激活函数

(2)利用coco128复现pytorch版本yolov4

yolov4-pytorch下载:GitHub - WongKinYiu/PyTorch_YOLOv4: PyTorch implementation of YOLOv4这就是论文的二作复现的

关于环境的配置这里省去

(1)权重文件的下载

权重文件网上有资源

(2)数据集处理

这里使用coco128数据集复现,该数据集小,对电脑或者服务器处理压力比较友善

打开train.py文件,注意到这里使用了yaml文件对数据集的信息进行处理

打开coco.yaml文件,可以看到数据集信息都放这里面了,根据注释,我们将coco128的图片路径放进去,这个路径自己改,我是用的绝对路径,由于coco128只有train2017,训练集验证集测试集我们就用这一个

(3)train.py训练报错

如果出现相关报错,可以参考一下下面的,下面没有就自己查一下。

1.BrokenPipeError:[Errno 32] Broken pipe

将works数值改成0

2.RuntimeError: indices should be either on cpu or on the same device as the indexed tensor (cpu)

这个错误的意思就是部分在GPU上运行,部分在CPU上运行;

定位到loss.py的报错之处

在上图的红框处加一行代码

3.RuntimeError: result type Float can‘t be cast to the desired output type long int

这个版本的torch不支持float直接转换为long int 型数据,所以这需要我们手动转换数据类

定位到错的地方

打开还是loss.py里的错,但不是改上面那一行

找到下面这一行

改成这样

4.torch.cuda.OutofMemoryError:CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0; 15.77 GiB total capacity; 14.44 GiBalready allocated; 10.69 MiB free; 14.69 6iB reserved in total by PyTorch) If reserved memory is >> allocated memory trysetting max_split_size_mb to avoid fragmentation.See documentation for Memory Management and PYTORCH CUDA ALLOC CONF

显存爆了,换个小点的batch_size=1,还是报错

于是注意到了报错中的这一句

If reserved memory is >> allocated memory trysetting max_split_size_mb to avoid fragmentation

代表目前可分配的显存足够,但是因为碎片化无法分配,需要整理碎片化显存,释放出能够用于运行的容量。

咱们代码的开头加这么一行代码,将小于128Mb大小的空闲显存block重新分配

开始训练的地方也加这么两行,清理缓存

5.TypeError: list indices must be integers or slices, not float

定位到报错位置

改成下面这个

6.RuntimeError: Trying to create tensor with negative dimension -1919062876: [-1919062876)

找到test.py置信度阈值

改成0.01,见下图

7.AttributeError: 'list' object has no attribute 'items'

定位到错误之处,又是这个地方,人都麻了

 改成下列代码

# W&B logging
if plots and len(wandb_images) < log_imgs:
    box_data = [{"position": {"minX": xyxy[0], "minY": xyxy[1], "maxX": xyxy[2], "maxY": xyxy[3]},
                    "class_id": int(cls),
                    "box_caption": "%s %.3f" % (names[int(cls)], conf),
                    "scores": {"class_score": conf},
                    "domain": "pixel"} for *xyxy, conf, cls in pred.tolist()]
    # if necessary, create a dict using list indices as keys, so it can be queried almost exactly like a list 
    if type(names) == type([]):
        names_dict = {idx:val for idx, val in enumerate(names)}
        boxes = {"predictions": {"box_data": box_data, "class_labels": names_dict}}
    else:
        boxes = {"predictions": {"box_data": box_data, "class_labels": names}}
wandb_images.append(wandb.Image(img[si], boxes=boxes, caption=path.name))

8.TypeError: can’t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

定位到plots.py找到下图红框中的位置

加一行代码

(4)train.py跑通

解决了上述问题后,用五个epochs实验代码能否跑通,发现能完整跑通了

然后我把batch_size改成4,然后epoch改成300,完整跑完了代码

(5)test.py报错

把上面训练得到的权重放进路径,然后注意一些参数的路径和设置

1.IsADirectoryError: [Errno 21] Is a directory: '/'

定位到报错处

改成下面这样

2.Error: You must call wandb.init() before wandb.log()

定位到报错处

加一行代码

3.IndexError: list index out of range

定位到错误的地方,发现代码用的原coco数据集的标签

而我们用的是coco128数据集测试效果的,coco128没有json文件而且只有train2017部分数据于是我把下列代码注释了,然后跑完了测试代码

(6)test.py跑通

解决了上述问题就能跑通了

(7)detect.py报错

1.FileNotFoundError: [Errno 2] No such file or directory:'w'

定位到错误的地方

改成下面这样

(8)detect.py跑通

改改路径就能跑通

更多推荐

【Python】PySpark 数据计算 ① ( RDD#map 方法 | RDD#map 语法 | 传入普通函数 | 传入 lambda 匿名函数 | 链式调用 )

文章目录一、RDD#map方法1、RDD#map方法引入2、RDD#map语法3、RDD#map用法4、代码示例-RDD#map数值计算(传入普通函数)5、代码示例-RDD#map数值计算(传入lambda匿名函数)6、代码示例-RDD#map数值计算(链式调用)一、RDD#map方法1、RDD#map方法引入在PyS

API网关是如何提升API接口安全管控能力的

API安全的重要性近几年,越来越多的企业开始数字化转型之路。数字化转型的核心是将企业的服务、资产和能力打包成服务(服务的形式通常为API,API又称接口,下文中提到的API和接口意思相同),从而让资源之间形成更强的连接和互动关系,释放原有资产的价值,提升企业的服务能力。企业数字化转型使得基于API的业务系统剧增,随之而

RK3568笔记分享之“如何挂载SPI FRAM铁电存储芯片”——飞凌嵌入式

对于做快速存储采集数据类产品的用户来说,在处理突发掉电情况时需要保存现有数据并避免数据丢失,这种情况下有很多种解决方案,铁电存储器(FRAM)就是个很好的选择。FRAM是一种具有快速写入速度的非易失性存储器,既可以进行非易失性数据存储,又可以像RAM一样操作。本文将借助飞凌嵌入式OK3568-C开发板来为大家介绍一种采

周界警戒AI算法+视频智能分析在安全生产场景中的应用

长期以来,周界防范安防系统在大型园区、工厂、社区、机场、火车站站台、重点单位等领域应用较为广泛和常见。随着AI人工智能等新兴技术的快速发展与落地应用,通过AI智能检测与视频智能分析技术,现代化的周界安防系统可以做到全天候快速、准确地发现入侵等异常事件,并及时报警遏制。今天我们来介绍下旭帆科技安全生产周界警戒AI算法的具

[2023.09.18]: Rust中类型转换在错误处理中的应用解析

随着项目的进展,关于Rust的故事又翻开了新的一页,今天来到了服务器端的开发场景,发现错误处理中的错误类型转换有必要分享一下。Rust抽象出来了Result<T,E>,T是返回值的类型,E是错误类型。只要函数的返回值的类型被定义为Resut<T,E>,那么作为开发人员就有责任来处理调用这个函数可能发生的错误。通过Res

CIIS 2023丨聚焦文档图像处理前沿领域,合合信息AI助力图像处理与内容安全保障

近日,2023第十二届中国智能产业高峰论坛(CIIS2023)在江西南昌顺利举行。大会由中国人工智能学会、江西省科学技术厅、南昌市人民政府主办,南昌市科学技术局、中国工程科技发展战略江西研究院承办。本次大会重点关注AI大模型、生成式AI、无人系统、智能制造、数字安全等领域,汇集了来自中国工程院、国际欧亚科学院、国际核能

聚观早报|高德发布安全出行大模型;小鹏G9焕新上市

【聚观365】9月21日消息高德发布安全出行大模型小鹏G9焕新上市妙鸭相机上线免费版RedmiNote13Pro+支持IP68Neuralink将进行首次人体临床试验高德发布安全出行大模型高德发布了安全出行大模型。据介绍,安全出行大模型基于高德的地图大数据、位置大数据、导航大数据、智能决策系统等能力,从风险识别、风险预

悬崖边:企业如何应对网络安全漏洞趋势

在本文中,我们将讨论企业在处理漏洞时面临的挑战,解释安全漏洞是如何引发网络攻击的,以及为什么它会导致不可接受的事件。我们还将分享我们在识别趋势性漏洞方面的经验。现代信息安全方法正在成为企业的工作流程。例如,不久前,整个IT行业都在向容器化发展,而对云环境的安全和保护机制的研究还是个新鲜事物。现在,几乎每家公司在产品架构

研究报告:周界警戒AI算法+视频智能分析在安全生产场景中的应用

长期以来,周界防范安防系统在大型园区、工厂、社区、机场、火车站站台、重点单位等领域应用较为广泛和常见。随着AI人工智能等新兴技术的快速发展与落地应用,通过AI智能检测与视频智能分析技术,现代化的周界安防系统可以做到全天候快速、准确地发现入侵等异常事件,并及时报警遏制。今天我们来介绍下旭帆科技安全生产周界警戒AI算法的具

Qt使用I.MX6U开发板上的按键(原理:将电脑键盘方向键↓在Qt中的枚举值与开发板中按键定义的枚举值一致,这样电脑端测试效果就与开发板的一致)

在上篇介绍了Qt点亮I.MX6U开发板的一个LED,对于Qt控制I.MX6U开发板的一个蜂鸣器原理也是一样的,就不做详细介绍,具体可参考Qt控制I.MX6U开发板的一个蜂鸣器,本篇介绍Qt使用I.MX6U开发板上的按键的相关内容。文章目录1.开发板硬件图及板卡按键在电脑键盘中的对应原理2.出厂内核设备树中注册的按键3.

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(一)

目录前言总体设计系统整体结构图系统流程图运行环境Python环境TensorFlow环境方法一方法二后端服务器Django环境配置微信小程序环境相关其它博客工程源代码下载其它资料下载前言本项目专注于MovieLens数据集,并采用TensorFlow中的2D文本卷积网络模型。它结合了协同过滤算法来计算电影之间的余弦相似

热文推荐