文章目录
1、前言
文本主要详细讲解运行参数含义
2、train.py-文件解读
train.py里面有一个parse_opt()函数,该函数用于读取命令行
- action='store_true' 当用到该参数时,则为true,默认为false。如果是store_false,则默认值是true
- default 默认值
- nargs='?' 表示可设置零个或一个
- nargs='*' 表示可设置零个或多个
- nargs='+' 表示可设置一个或多个
python
def parse_opt(known=False):
parser = argparse.ArgumentParser()
# weights: 训练的权重路径,可以使用自己训练的权重,也可以使用官网提供的权重
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
# cfg:模型参数配置文件路径
parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
# data: 配置数据集路径, 包括image/label/classes等信息。
# 如果设置了只显示个别类别即使用了--classes = 0 或二者1, 2, 3等, 则需要设置该文件,数字和类别相对应才能只检测某一个类
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')
# hyp: 超参数的设置
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch.yaml', help='hyperparameters path')
# epochs:训练总轮次
parser.add_argument('--epochs', type=int, default=300)
# batch-size:批次大小
parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')
# imgsz: 网络输入图片大小, 默认的大小是640
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
# rect: 是否采用Rectangular training/inference,一张图片为长方形,我们在将其送入模型前需要将其resize到要求的尺寸,所以我们需要通过补灰padding来变为正方形的图。
# 但是这个操作会生成过多的冗余信息影响训练效果。Rectangular training/inference就是去除这些冗余信息。
parser.add_argument('--rect', action='store_true', help='rectangular training')
# resume: 接着上次打断的的结果开始训练
parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
# nosave: 只保存最后一次 pt 文件。,默认False
parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
# noval: 只在最后一次进行测试,默认False
parser.add_argument('--noval', action='store_true', help='only validate final epoch')
# noautoanchor: 不自动调整anchor,默认False
parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')
# evolve: 是否进行超参数优化,利用遗传算法自动搜索超参数,默认False
parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')
# bucket: 谷歌云盘bucket,一般不会用到
parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
# cache:是否提前缓存图片到内存,以加快训练速度
parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')
# image-weights: 对于那些训练不好的图片,会在下一轮中增加一些权重
parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
# device: 训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu)
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
# multi-scale: 是否进行多尺度训练,一般设置几种不同尺度的图片,训练时每隔一定iterations随机选取一种尺度训练
# 这样训练出来的模型鲁棒性强,可以接受任意大小的图片作为输入,使用尺度小的图片测试速度会快些,但准确度低,用尺度大的图片测试速度慢,但是准确度高
parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
# single-cls: 数据集是否只有一个类别,默认False
parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
# adam: 是否使用adam优化器
parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')
# sync-bn: 是否进行多 GPU 进行分布式训练
parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
# dataloader的最大worker数量
parser.add_argument('--workers', type=int, default=8, help='maximum number of dataloader workers')
# project:保存测试日志的文件夹路径
parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')
# name:保存测试日志文件夹的名字, 所以最终是保存在project/name中
parser.add_argument('--name', default='exp', help='save to project/name')
# exist_ok: 是否重新创建日志文件, False时重新创建文件
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
# quad: 四元数据加载器
parser.add_argument('--quad', action='store_true', help='quad dataloader')
# linear-lr:用于对学习速率进行调整,默认为 False,(通过余弦函数来降低学习率)
parser.add_argument('--linear-lr', action='store_true', help='linear LR')
# label-smoothing: 对标签进行平滑处理,防止过拟合
parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')
# freeze: 使用预训练模型的规定固定权重不进行调整 --freeze 10 :意思从第0层到到第10层不训练
parser.add_argument('--freeze', type=int, default=0, help='Number of layers to freeze. backbone=10, all=24')
parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')
# gpu编号
parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')
# Weights & Biases arguments
parser.add_argument('--entity', default=None, help='W&B: Entity')
parser.add_argument('--upload_dataset', action='store_true', help='W&B: Upload dataset as artifact table')
parser.add_argument('--bbox_interval', type=int, default=-1, help='W&B: Set bounding-box image logging interval')
parser.add_argument('--artifact_alias', type=str, default='latest', help='W&B: Version of dataset artifact to use')
opt = parser.parse_known_args()[0] if known else parser.parse_args()
return opt
2.1、常用的参数
- weights
- cfg
- data
- epochs
- batch-size
- imgsz
- device
- resume
- hyp
- adam
2.1.1、weights
python
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
这个就是指定网络权重的路径,默认是yolov5s.pt
,官方提供了很多的版本,我们要更换的时候直接按照模型的名字更换就可以了(当然,使用自己的也是完全没问题的);例如yolov5m.pt
,yolov5l.pt
,他会自动的下载对应的权重,不需要我们去Github手动下载。(如果下载太慢或者失败只能去官网下载了,下载好了直接放到根目录下就可以)
2.1.2、cfg
python
# 模型参数配置文件路径,即你自己的网络模型,比方models/yolov5s.yaml
parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
2.1.3、data
python
# 配置数据集路径, 包括image/label/classes等信息。
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')
2.1.4、epochs
python
# 训练总轮次
parser.add_argument('--epochs', type=int, default=300)
2.1.5、batch-size
python
# 批次大小
parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')
2.1.6、imgsz
python
# 输入图片大小
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
2.1.7、device
python
# 训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu)
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
2.1.8、resume
python
# 接着上次打断的的结果开始训练
parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
2.1.9、hyp
python
# 超参数的设置
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch.yaml', help='hyperparameters path')
2.1.10、adam
python
# adam: 是否使用adam优化器
parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')
3、detect.py-文件解读
python
"""
weights: 训练的权重路径,可以使用自己训练的权重,也可以使用官网提供的权重
source: 这个参数就是指定网络输入的路径,默认指定的是文件夹,也可以指定具体的文件或者扩展名等。
imgsz: 输入图片的大小,默认640,即模型在检测图片前会把图片resize成640 × 640的尺寸,然后检测。
conf-thres: 置信度的阈值,调节检测框的置信度,要大于等于该阈值,该检测框才会保留下来
iou-thres: 调节IoU的阈值
max-det: 设置一张图像中的最大检测数量,默认是最多检测 1000 个目标
device: 如果有GPU则默认用第0块GPU,如果没有则会选择cpu,如果想要使用多个 GPU 并行训练时设置 0, 1 等。
view-img: 实时的把检测结果显示出来,即每检测出一张就会显示出一张,直到所有图片检测完成。
save-txt: 把检测结果保存成一个.txt的格式,txt文件里面保存了一些类别信息和边框的坐标信息。
save-conf: 以.txt的格式保存目标的置信度,一般配合--save-txt一起使用。
save-crop: 是否把模型检测的物体裁剪下来。裁剪的物体图片会保存在crops目录下。
nosave: 不保存预测的结果。
classes: 检测的类别,可以设置一个或者多个类别,根据自己的类别名去设置。比如coco数据集里面0,代表person。
agnostic-nms: 跨类别nms,比如待检测图像中有一个长得很像篮球的足球,pt文件的分类中有足球和篮球两种,那在识别时这个足球可能会被同时框上2个框:一个是足球,一个是篮球。开启agnostic-nms后,那只会框出一个框。
augment: 增强推理
visualize: 特征图可视化,开启后,.npy格式的文件就是保存的模型文件,可以使用numpy读写,.png就是图片文件。
update: 在模型训练的最后阶段去除优化器信息,以减小模型文件的大小,并将模型准备好用于推断或其他目的。
project: 预测结果保存的路径。
name: 预测结果保存的文件夹名字。
exist-ok: 每次预测模型的结果是否保存在原来的文件夹,如果指定了这个参数的话,那么本次预测的结果还是保存在上一次保存的文件夹里;如果不指定就是每次预测结果保存一个新的文件夹下。
line-thickness: 调节预测框线条粗细的,因为有的时候目标重叠太多会产生遮挡;
hide-labels: 隐藏标签,显示类别之类的信息,只保存检测框。
hide-conf: 隐藏标签的置信度。
half: 是否使用FP16半精度推理
dnn: 使用 OpenCV DNN 进行 ONNX 推理。DNN --> Deep Neural Networks
ONNX(Open Neural Network Exchange)是一种多框架共用的,开放协议的神经网络交换格式。 ONNX 定义了一组与环境和平台无关的标准格式,为 AI 模型的互操作性提供了基础,使 AI 模型可以在不同框架和环境下交互使用。
"""
def parse_opt():
parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'weights/yolov5s-320.pt', help='model path(s)')
parser.add_argument('--source', type=str, default=ROOT / 'data/data-txt', 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.25, 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
3.1、常用的参数
- weights
- source
- imgsz
- conf-thres
- iou-thres
- device
- view-img
- save-txt
- save-conf
- visualize
3.1.1、weights
python
# weights: 训练的权重路径,可以使用自己训练的权重,也可以使用官网提供的权重
parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'weights/yolov5s-320.pt', help='model path(s)')
3.1.2、source
python
# source: 这个参数就是指定网络输入的路径,默认指定的是文件夹,也可以指定具体的文件或者扩展名等。
parser.add_argument('--source', type=str, default=ROOT / 'data/data-txt', help='file/dir/URL/glob, 0 for webcam')
3.1.3、imgsz
python
# imgsz: 输入图片的大小,默认640,即模型在检测图片前会把图片resize成640 × 640的尺寸,然后检测。
parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
3.1.4、conf-thres
python
# conf-thres: 置信度的阈值,调节检测框的置信度,要大于等于该阈值,该检测框才会保留下来
parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold')
3.1.5、iou-thres
python
# iou-thres: 调节IoU的阈值
parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold')
3.1.6、device
python
# device: 如果有GPU则默认用第0块GPU,如果没有则会选择cpu,如果想要使用多个 GPU 并行训练时设置 0, 1 等。
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
3.1.6、view-img
python
# view-img: 实时的把检测结果显示出来,即每检测出一张就会显示出一张,直到所有图片检测完成。
parser.add_argument('--view-img', action='store_true', help='show results')
3.1.7、save-txt
python
# save-txt: 把检测结果保存成一个.txt的格式,txt文件里面保存了一些类别信息和边框的坐标信息。
parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
3.1.8、save-conf
python
# save-conf: 以.txt的格式保存目标的置信度,一般配合--save-txt一起使用。
parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
3.1.9、visualize
python
# 特征图可视化,开启后,.npy格式的文件就是保存的模型文件,可以使用numpy读写,.png就是图片文件。
parser.add_argument('--visualize', action='store_true', help='visualize features')