YoLoV5学习(4)--detect.py程序(预测图片、视频、网络流)逐段讲解~

本章博客主要分析YoloV5代码中的detect程序代码,按照程序运行步骤顺序主要分为3大部分。

1、包与库的导入

1.1 导入安装好的python库、torch库等等

库的导入
其中:argparse模块、os模块、sys模块都是Python内置模块。
argparse模块:它是一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息;
os模块:它提供了多种操作系统的接口。通过os模块提供的操作系统接口,我们可以对操作系统里文件、终端、进程等进行操作;
sys模块:它是与python解释器交互的一个接口,该模块提供对解释器使用或维护的一些变量的访问和获取,它提供了许多函数和变量来处理 Python 运行时环境的不同部分。

from pathlib import Path

该段代码意思是指从External Libraries->pathlib->path 导入Path库,具体说明如下:
Path表示文件系统路径,但与PurePath不同,它还提供方法对路径对象进行系统调用。根据您的系统,实例化路径将返回PosixPath或WindowsPath对象也可以直接实例化PosixPath或WindowsPath,但不能在POSIX系统上实例化WindowsPath,反之亦然。

import torch
import torch.backends.cudnn as cudnn

添加torch库,CUDNN 是英伟达专门为深度神经网络所开发出来的 GPU 加速库,针对卷积、池化等常见操作做了非常多的底层优化,比一般的 GPU 程序要快很多。在使用 GPU 的时候,PyTorch 会默认使用 CUDNN 加速。

1.2 导入相对路径下的库

相对路径下的库
导入、添加项目文件下相对应的文件夹中的库文件。

1.3 定义一些文件路径

文件路径
_ _ file _ _表示当前detect.py的文件路径,第一行代码获取其绝对路径,第二行代码获取其根目录,sys.path表示模块的查询路径列表。

2、执行函数

执行函数
if name == ‘main’:的作用,一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此 if name == ‘main’: 的作用就是控制这两种情况执行代码的过程,在 if name == ‘main’: 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。
(1)解析命令行传进的参数;opt = parse_opt()
该段代码分为三部分,第一部分定义了一些可以传导的参数类型,第二部分对于imgsize部分进行了额外的判断(640*640),第三部分打印所有参数信息,opt变量存储所有的参数信息,并返回。
(2)执行命令行参数; main(opt)
该段代码分为两部分,第一部分首先完成对于requirements.txt的检查,检测这些依赖包有没有安装;第二部分,将opt变量参数传入,执行run函数。

3、Run函数

run函数
run函数的整体运行部分可以概括为6个部分。

3.1 对source传入的东西进行额外判断

source判断
此处的source对应run函数中的source,代表图片路径;第三行代码判断是否传入为文件地址,IMG_FORMATS表示各种图片类型,VID_FORMATS表示各种视频类型;第四行代码判断是否为网络流传入;第五行代码source.isnumeric判断是否传入为数字,–source 0,数字0表示打开电脑的第一个摄像头;如果是一个网络流且是一个文件,就会进行下载操作。

3.2 新建了一个保存结果的文件夹

文件夹
代码中的 project 指 run 函数中的 project,对应的是 runs/detect 的目录,name 对应 run 函数中的“name=exp”,然后进行拼接操作;increment_path 表示增量路径;判断 save_txt 是否为 true,save_txt 在 run 函数以及 parse_opt() 函数中都有相应操作,如果传入save_txt,新建 “labels” 文件夹存储结果。

3.3 加载模型权重

加载模型
首先根据代码环境选择加载设备,GPU/CPU。选择多后端框架,判断你的深度学习框架,本次是pytorch,加载模型,
读取模型参数,判断 imgsz,步长 stride 一般是32。

3.4 DataLoad模块,加载待预测的图片

DataLoad模块
首先是判断 webcam 是否为 true,前面已经定义,不为True,因此执行 datasets.py下的LoadImages函数,完成输入数据的加载过程。

3.5 模型的推理过程

模型推理过程
执行模型推理过程,把图片或者视频输入模型,产生一个预测结果,并用检测框标记出来。
首先,让模型进行一个预热,然后定义 dt,seen 两个变量,遍历 dataset ,整理图片信息;进行预测,根据 run 函数里面的置信度以及IOU参数,进行信息过滤;对检测框进行后续处理,画框选择,坐标映射(640*640坐标映射为原图坐标),是否保存绘画结果。

3.6 打印出一些输出信息信息打印

打印结果,记录了一些总共的耗时,以及信息保存。

本次进行了一些简短的分析,如果有帮助的话,点赞支持一下,后续有需要在进行其他文件程序。交流学习,互相进步~

  • 19
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
要将未识别出来的图片保存到新文件夹,需要在yolov5-7.0中detect.py源码中添加一些代码。具体步骤如下: 1. 在detect.py源码中找到以下代码段: ``` # Inference t1 = time_synchronized() pred = model(imgs, augment=opt.augment)[0] # Apply NMS pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms) t2 = time_synchronized() ``` 这是模型推理的部分,我们需要在这里添加保存未识别出来的图片的代码。 2. 在这段代码下面添加以下代码段: ``` # Save images that are not detected for i, det in enumerate(pred): if len(det): det[:, :4] = scale_coords(imgs[i].shape[1:], det[:, :4], im0s[i].shape).round() # Write results for *xyxy, conf, cls in reversed(det): c = int(cls) label = f'{names[c]} {conf:.2f}' plot_one_box(xyxy, im0s[i], label=label, color=colors(c, True), line_thickness=3) else: cv2.imwrite(f"undetected_images/{os.path.basename(img_files[i])}", im0s[i]) ``` 这段代码会遍历所有的预测结果,如果没有检测到目标,则将对应的图片保存到一个名为“undetected_images”的文件夹中。 3. 在detect.py的开头添加以下代码: ``` import os import cv2 ``` 这是为了导入cv2和os模块,以便在代码中使用。 4. 创建一个名为“undetected_images”的文件夹,用来保存未检测出的图片。 完成以上步骤后,重新运行detect.py,未检测出的图片将会被保存到“undetected_images”文件夹中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

城市里的牧羊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值