贡献者: 刘煜彬
首先导入 python 的包。
import argparse # 解析命令行参数的库
import os # 与操作系统进行交互的文件库 包含文件路径操作与解析
import sys # sys模块包含了与python解释器和它的环境有关的函数。
from pathlib import Path # Path能够更加方便得对字符串路径进行处理
import cv2 # sys模块包含了与python解释器和它的环境有关的函数。
import torch #pytorch 深度学习库
import torch.backends.cudnn as cudnn #让内置的cudnn的 auto-tuner 自动寻找最
#适合当前配置的高效算法,来达到优化运行效率的问题
因为有第一个库,我们可以直接在命令行里输入相关参数,而不用进 py 文件里一个个去修改,具体后面来介绍。接着获取当前文件的绝对路径。
FILE = Path(__file__).resolve()
# __file__指的是当前文件(即detect.py),FILE
#最终保存着当前文件的绝对路径,比如D://yolov5/detect.py
ROOT = FILE.parents[0]
# YOLOv5 root directory ROOT保存着当前项目的父目录,#比如 D://yolov5
if str(ROOT) not in sys.path: # sys.path即当前python环境可以运行的路径,
#假如当前项目不在该路径中,就无法运行其中的模块,所以就需要加载路径
sys.path.append(str(ROOT))
# add ROOT to PATH 把ROOT添加到运行路径上
ROOT = Path(os.path.relpath(ROOT, Path.cwd()))
# relative ROOT设置为相对路径
这个 resolve()方法是 Path 类的一个方法,它返回当前路径的绝对路径。如果路径是相对的,resolve()会将其转换为绝对路径。此外,它还会解析路径中的任何符号链接(在支持符号链接的操作系统上。
对于 ROOT = FILE.parents[0],这一行
FILE:这是一个变量,代表了一个文件的路径。这个路径可以是绝对路径(从根目录开始的完整路径),也可以是相对路径(相对于当前工作目录的路径)。
.parents:这是 pathlib.Path 对象的一个属性,它返回一个包含当前路径所有父目录的迭代器。例如,如果 FILE 是'/home/user/documents/file.txt',那么 FILE
.parents 将会是一个迭代器,包含'/home/user/documents'
、'/home/user'、'/home'
等目录路径。
[0]:通过对 parents 迭代器使用索引[0],我们获取了 FILE 路径的第一个父目录,也就是最直接的父目录。在上面的例子中,就是'/home/user/documents'。
ROOT =:这是将获取到的父目录路径赋值给变量 ROOT 的操作。之后,ROOT 就可以用来引用这个父目录路径了。
from models.common import DetectMultiBackend
from utils.datasets import IMG_FORMATS,
VID_FORMATS, LoadImages, LoadStreams
from utils.general
import (LOGGER, check_file, check_img_size,
check_imshow, check_requirements, colorstr,
increment_path,
non_max_suppression,
print_args, scale_coords,
strip_optimizer, xyxy2xywh)
from utils.plots import Annotator, colors, save_one_box
from utils.torch_utils import select_device, time_sync
这些都是用户自定义的库,不用太管。主要是降低代码复杂度的。
'''=======================二、设置main函数==================================='''
def main(opt):
# 检查环境/打印参数,主要是requrement.txt的包是否安装,#
#用彩色显示设置的参数
check_requirements(exclude=('tensorboard', 'thop'))
# 执行run()函数
run(**vars(opt))
# 命令使用
# python detect.py --weights
#runs/train/exp_yolov5s/weights/best.pt
#--source data/images/fishman.jpg # webcam
if __name__ == "__main__":
opt = parse_opt() # 解析参数
main(opt) # 执行主函数
命令使用是这样的: python detect.py --weights runs/train/exp_yolov5s/weights/best.pt --source data/images/fishman.jpg
这里调用了 check_requirements()和 run()函数。把命令行参数 opt 转化为字典传输给 run()函数。 check requirements(exclthop')):检查程序所需的依赖项是否已安装。 run(**vars(opt)): 将 opt 变量的属性和属性值作为关键字参数传递给 run() 函数。
if name =='main’:的作用: 一个 python 文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此,ifname ='main’:的作用就是控制这两种情况执行代码的过程,在 if name = 'main':下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 impon 到其他脚本中是不会被执行的。
opt= parse opt0: 解析命令行传进的参数。该段代码分为三部分,第一部分定义了一些可以传导的参数类型,第二部分对于 imgsize 部分进行了额外的判断(640*640),第三部分打印所有参数信息,opt 变量存储所有的参数信息,并返回。main(opt): 执行命令行参数。该段代码分为两部分,第一部分首先完成对于 requirements.txt 的检查,检测这些依赖包有没有安装;第二部分,将 opt 变量参数传入,执行 run 函数。
接着设置参数。
def parse_opt():
parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+',
type=str, default=ROOT / 'yolov5s.pt',
help='model path(s)')
parser.add_argument('--source', type=str,
default=ROOT / 'data/images', help=
'file/dir/URL/glob,
0 for webcam')
parser.add_argument('--imgsz', '--img',
'--img-size', nargs='+', type=int, default=[640],
help='inference size h,w')
parser.add_argument('--conf-thres', type=float,
default=0.5, help='confidence threshold')
parser.add_argument('--iou-thres', type=float,
default=0.45, help='NMS IoU threshold')
parser.add_argument('--max-det', type=int,
default=1000, help='maximum detections per image')
parser.add_argument('--device', default='',
help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--view-img',
action='store_true', help='show results')
parser.add_argument('--save-txt',
action='store_true', help='save results to *.txt')
parser.add_argument('--save-conf',
action='store_true', help='save confidences
in --save-txt labels')
parser.add_argument('--save-crop',
action='store_true', help='save cropped
prediction boxes')
parser.add_argument('--nosave',
action='store_true', help='do not save
images/videos')
parser.add_argument('--classes',
nargs='+', type=int, help='filter by class:
--classes 0, or --classes 0 2 3')
parser.add_argument('--agnostic-nms',
action='store_true', help='class-agnostic NMS')
parser.add_argument('--augment',
action='store_true', help='augmented
inference')
parser.add_argument('--visualize',
action='store_true', help='visualize features')
parser.add_argument('--update',
action='store_true', help='update all models')
parser.add_argument('--project',
default=ROOT / 'runs/detect',
help='save results to project/name')
parser.add_argument('--name',
default='exp', help='save results to project/name')
parser.add_argument('--exist-ok',
action='store_true', help=
'existing project/name ok, do not increment')
parser.add_argument('--line-thickness',
default=3, type=int, help=
'bounding box thickness (pixels)')
parser.add_argument('--hide-labels',
default=False, action='store_true',
help='hide labels')
parser.add_argument('--hide-conf',
default=False, action='store_true',
help='hide confidences')
parser.add_argument('--half',
action='store_true', help=
'use FP16 half-precision inference')
parser.add_argument('--dnn',
action='store_true', help=
'use OpenCV DNN for ONNX inference')
opt = parser.parse_args() # 扩充维度
opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1 # expand
print_args(FILE.stem, opt) # 打印所有参数信息
return opt
这里代码过长有点变形了,看 github 上的源文件吧。
这个都是描述的参数信息。
详细如下 weights:模型权重文件的路径,默认为 YOLOv5s 的权重文件路径。 source:输入图像或视频的路径或 URL,或者使用数字 0 指代摄像头,默认为 YOLOv5 自带的测试图像文件夹。 data:数据集文件的路径,默认为 COCO128 数据集的配置文件路径。 imgsz:输入图像的大小,默认为 640x640。 iou thres:非极大值抑制的 IoU 阈值,默认为 0.45.。 conf thres:置信度阈值,默认为 0.25。 max det:每张图像的最大检测框数,默认为 1000. device:使用的设备类型,默认为空,表示自动选择最合适的设备. view img:是否在屏幕上显示检测结果,默认为 False. save_txt:是否将检测结果保存为文本文件,一般默认为 False. save_conf:是否在保存的检测文件里包含置信度信息,一般默认为 False. save_crop:是否将检测出的目标位置保存为图片,一般默认为 False。 nosave:是否不保存检测结果的图片或视频,默认为 False。 classes:指定要检测的目标类别,默认为 None,表示检测所有类别。 agnostic_nms:是否使用类别无关的非极大值抑制,默认为 False。 augment:是否可视化模型中的特征图,默认为 False。 是否可视化模型中的特征图,默认为 False。 visualize: 是否可视化模型中的特征图,默认为 False。 update:是否自动更新模型权重文件,默认为 False。 project:结果保存的项目文件夹路径,默认为 “runs/detect “ name:结果保存的文件名,默认为” exp “ exist_ok:如果保存的文件已经存在就覆盖,一般默认为 False。