yolov5代码解读之​detect.py文件【超详细的好吗!点进来看阿很用心的!】

yolov5的代码一直在更新,所以你们代码有些部分可能不太一样,但大差不差。

先给大家看一下项目结构:(最好有这个项目,且跑通过)

detect.py文件:它可以预测视频、图片文件夹、网络流等等。

如何执行这个项目前面已经讲过了:从零开始yolov5模型训练【绝对能学会】

执行这个代码首先就是运行前面的这一部分:

对于第三部分的话,看一下这个就很明了:

对于第二部分:

什么是模块的查询路径列表:(sys.path)

就比如我们刚刚导入的models.common的那一行,我们执行的是detect.py文件,那么这个文件是如何知道这个模块在哪呢?其实就是因为我们在sys.path路径中存在了yolov5-master这个文件夹的路径,所以导包的时候,它就能知道要在yolov5-master这个文件夹里面去找models文件夹里面的common。如果sys.path里面没有yolov5-master这个文件夹里面的路径的话,导包就会出现错误。第三行的代码也是为了确保ROOT路径是存在于yolov5-master这个文件夹下的。

当把包导完之后,它就会跳到文件的最下面去执行if __name__当中的代码:

先聊聊命令行参数的意思:

再聊聊if __name__中的第一行代码的内容:(来到parse_opt函数)

参数信息打印出来大概就是这样:

然后来看看run函数吧:

run函数第一部分代码:

第三行is_file = Path(source).suffix[1:] in (IMG_FORMATS + VID_FORMATS)的意思:

is_file呢就是表示我们传入的地址是不是一个文件地址;

suffix表示的就是后缀的意思,就是“.jpg”;[1:]表示从“j”开头,所以Path(source).suffix[1:]表示的就是“jpg"。

然后判断jpg是不是在IMG_FORMATS +和VID_FORMATS这两个格式中。

那么这两个格式又是啥呢,点进来看(按住crtl,然后鼠标点击这两个美丽的单词):

所以我们可以看到jpg是位于这两个格式中的,因此is_file也是表示的true。

(webcam是false哦,这个能推出来吧,不能推出来建议了解一下or和and)

然后到我们的run函数中的第二部分代码(94和95行)

第94行的含义:

save_dir就是新建一个保存结果的文件夹;

project代表:ROOT / 'runs/detect', name代表'exp', 用“/”把他们两个拼接起来;

increment代表增量,increment_path表示增量路径,啥叫增量路径呢:

95行:

run函数的第三部分(模型加载部分):

这一部分的话,先看一下多后端:

具体就是第99句的参数含义:model = DetectMultiBackend(weights, device=device, dnn=dnn, data=data, fp16=half)

weights是run函数开头参数定义的:(可以看到他用的是yolov5的s这个模型,yolov5还有其他的比如m、x、n、l等,这里默认用的s):

weights=ROOT / 'yolov5s.pt',  # model path or triton URL

device就是使用gpu还是cpu;

dnn默认的false(run函数开头定义,点进多后端可以k看到dnn代表的就是onnx opencv dnn模型);

data是“ROOT / 'data/coco128.yaml'”这个文件,点进去看一下:

half表示半精度推理过程,默认为false,也就是没用到,不管他~

多后端点进去(模型选择):

再看看多后端是如何创建的:

然后这是第三部分的其他代码:

run函数的第四部分(dataloader部分):

(batch_size=1,每次输入一张图片)

(vid_path,vid_writer列表长度都是1,后面有用)

LoadImages点进去看看是个啥:

run函数的第五部分(推理部分):

(先看dataloders.py下面几段代码)

这里再具体讲一下letterbox是如何把一张图片转换过来的:(314行)

im = letterbox(im0, self.img_size, stride=self.stride, auto=self.auto)[0]  # padded resize

im0:就是指原图片大小810×1080,然后三通道的图片;

img_size就是一直提到的640×640的这样一个尺寸大小;

stride表示模型的步长,32;auto是true。

我们点进这个函数(letterbox)看:

上面的介绍完了,

然后看detect.py的第五部分代码解读:

首先是第116行:

    model.warmup(imgsz=(1 if pt or model.triton else bs, 3, *imgsz))  # warmup

warmup就是一个热身环节,它内部就是初始化了一张空白的图片传入到模型中,让模型执行了一次前馈传播,相当于随便给了gpu一张图片,让gpu跑了一遍,让gpu有一个“热身”环节哈哈,完了之后再把自己的数据集给它让他预测。

再具体一下这行代码:

pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)

通过这一步处理之后会得到torch.Size([1,5,6])。

5表示从18900个检测框降低到了5个;(18900是通过权重文件算出来的)

6:前四个值表示坐标点的信息,就是一个框框它的左上角和右下角xy坐标;以及它判断这个框的置信度信息;最后一个是这个框的类别信息。

这里展示一下预测结果显示:

继续往后面看代码(139行):

具体看一下Annotator是如何实现的:

ok,再往下看第五部分的剩余代码:

第六部分的代码(打印结果部分):

结果图展示:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/79051.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4 Cesium for unreal 离线加载应用全流程

参考配置:Win10、请保证是在局域网环境下配置 配置IP 右键选择:打开“网络和Internet” 设置 选择更改适配器选项 请保证以太网是处于启用状态并连接线缆,点击右键选择属性 双击选择Internet协议版本4(TCP/IPv4) 将IP地…

Mir 2.14 正式发布,Ubuntu 使用的 Linux 显示服务器

导读Canonical 公司最近发布了 Mir 2.14,这是该项目的最新版本。 Mir 2.14 在 Wayland 方面通过 ext-session-lock-v1 协议增加了对屏幕锁定器 (screen lockers) 的支持,并最终支持 Wayland 拖放。此外还整合了渲染平台的实现,放弃了之前在 R…

【UE】AI导航,多个导航物体无法走到同一终点问题

如不需要开启导航物体的碰撞,则需要关闭Use RVOAvoidance 不然会导致多个导航物体无法到达同一个目标点,都在附近晃。无法结束寻路。 ue小白,判定导航终点的半径,没有找到。如果有大佬知道怎么设置请在评论区指出,谢…

【开源项目--稻草】Day04

【开源项目--稻草】Day04 1. 续 VUE1.1 完善VUEAJAX完成注册功能 Spring验证框架什么是Spring验证框架使用Spring-Validation 稻草问答-学生首页显示首页制作首页的流程开发标签列表标签列表显示原理 从业务逻辑层开始编写控制层代码开发问题列表开发业务逻辑层开发页面和JS代码…

docker search 镜像报错: connect: no route to host (桥接模式配置静态IP)

如下 原因 可能有多种: ① 没有开放防火墙端口 ② ip地址配置有误 解决 我是因为虚拟机采用了桥接模式,配置静态ip地址有问题。 先确认虚拟机采用的是 桥接模式,然后启动虚拟机。 1、打开命令行,输入下面指令,打开…

远程访问桌面软件 OpenText Exceed TurboX(ETX)如何提高企业生产力

远程访问桌面软件 OpenText Exceed TurboX(ETX)如何提高企业生产力 几乎所有规模和行业的企业,员工的工作方式、时间和地点方面发生重大变化,这主要得益于新技术和全球商业与协作。业务领导者正在推动其 IT 部门提出解决方案&…

算法基础简介

目录 1、递归 2、二分查找 3、排序算法 分类 3.1、冒泡排序 3.2、选择排序 3.3、插入排序 3.4、希尔排序(高级插入排序) 3.5、归并排序 3.6、快速排序 核心思想 具体步骤 代码实现 3.7、堆排序 3.8、计数排序 3.9、桶排序 3.10、基数排序 4、字符串匹…

QT自带PDF库的使用

QT自带PDF库可以方便的打开PDF文件,并将文件解析为QImage,相比网上提供的开源库,QT自带PDF库使用更方便,也更加可靠,然而,QT自带PDF库的使用却不同于其他通用库的使用,具备一定的技巧。 1. 安装…

【深度学习】Transformer,Self-Attention,Multi-Head Attention

必读文章: https://blog.csdn.net/qq_37541097/article/details/117691873 论文名:Attention Is All You Need 文章目录 1、Self-Attention 自注意力机制2、Multi-Head Attention 1、Self-Attention 自注意力机制 Query(Q)表示当…

Docker Compose构建lnmp

目录 Compose的优点 编排和部署 Compose原理 Compose应用案例 安装docker-ce 阿里云镜像加速器 安装docker-compose docker-compose用法 Yaml简介 验证LNMP环境 Compose的优点 先来了解一下我们平时是怎么样使用docker的?把它进行拆分一下: 1…

全志F1C200S嵌入式驱动开发(soc系统集成)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 任何一个嵌入式设备都是由很多的子系统组成的。这里面有硬件、有软件,还可能有机械,并不一定就是大家看到的消费电子那样,即一个soc构成了所有的系统。现实情况是,要构建一个系…

网关 GateWay 的使用详解、路由、过滤器、跨域配置

一、网关的基本概念 SpringCloudGateway网关是所有微服务的统一入口。 1.1 它的主要作用是: 反向代理(请求的转发) 路由和负载均衡 身份认证和权限控制 对请求限流 1.2 相比于Zuul的优势: SpringCloudGateway基于Spring5中…

【JavaSE】面向对象编程思想之继承

【本节目标】 1. 继承 2. 组合 目录 1. 为什么需要继承 2. 继承概念 3. 继承的语法 4. 父类成员访问 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. 子类构造方法 7. super和this 8. 再谈初始化 9. protected 关键字 10. 继承方式…

【C++基础(六)】类和对象(下)--初始化列表,友元,匿名对象

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 类和对象 1. 前言2. 初始化列表2.1初始化列表的作用…

岩土工程监测仪器多通道振弦传感器信号转换器应用于铁路监测

岩土工程监测仪器多通道振弦传感器信号转换器应用于铁路监测 岩土工程监测是工程建设和运营过程中必不可少的环节,它主要是通过对地下水位、土体应力、变形、固结沉降等参数进行实时监测,以保证工程施工和运营的安全性和稳定性。而多通道振弦传感器信号…

【Segment Anything Model】四:预处理自己的数据集接入SAM

文章目录 1️⃣预备知识2️⃣实现思路🔸脚本预处理得到包含embedd和GT的npz🔸编写Dataset类3️⃣代码🔸实现脚本预处理得到包含embedd和GT的npz代码🔸实现Dataset的代码 1️⃣预备知识 欢迎订阅本专栏(为爱发电&#…

Idea添加mybatis的mapper文件模版

针对Java开发人员,各种框架的配置模版的确是需要随时保留一份,在使用的时候,方便复制粘贴,但是也依然不方便,我们可以给开发工具(IDE)中添加配置模版,这里我介绍下使用idea开发工具&…

ad+硬件每日学习十个知识点(18)23.7.29 (LDO原理、LDO的补偿引脚)

文章目录 1.LDO名字介绍2.LDO的应用范围3.LDO的原理4.LDO输出端和输入端的差值至少满足多少V?怎么计算的?5.输出的误差和输出电流👆(右下角图像)6.LDO一般会有个引脚是做补偿之用,datasheet会说明一个器件的…

Packet Tracer - 检验 IPv4 和 IPv6 编址

Packet Tracer - 检验 IPv4 和 IPv6 编址 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 IPv6 地址/前缀 R1 G0/0 10.10.1.97 255.255.255.224 N/A 2001:DB8:1:1::1/64 N/A S0/0/1 10.10.1.6 255.255.255.252 N/A 2001:DB8:1:2::2/64 N/A 本地链路 F…

Linux 信号signal处理机制

Signal机制在Linux中是一个非常常用的进程间通信机制,很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断,因此,在实时性方面还是相对比较高的。Linux中signal机制的模型可以采用下图进行描述。 每个进程…