yolov5 7.0中文注释版train.py和detect.py

发布时间:2024年01月12日

为了更好的学习,最近给yolov5 7.0版本的train和detect.py增加了中文注释,注释的部分内容如下,仅展示部分注释
detect.py的部分代码展示

# 版本说明:该版本是yolov5-7.0,由微智启软件工作室添加中文注释,给train.py和detect.py添加了中文注释,方便大家学习。
def parse_opt():
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='预训练模型的路径')
    parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='数据源路径,也就是要测试的资源。如果是检测摄像头改成对应的序号,一般是0')
    parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='指定数据集的YAML文件路径')
    parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='指定推断图像的大小,程序会自动缩放')
    parser.add_argument('--conf-thres', type=float, default=0.25, help='置信度阈值')
    parser.add_argument('--iou-thres', type=float, default=0.45, help='用于指定非极大值抑制(NMS)的IoU阈值')
    parser.add_argument('--max-det', type=int, default=1000, help='指定每张图像的最大检测次数')
    parser.add_argument('--device', default='', help='指定检测的CUDA设备,用0、1、2、3数字表示。如果是CPU可以填写CPU。可以保留空自动选择')
    parser.add_argument('--view-img', action='store_true', help='是否显示结果')
    parser.add_argument('--save-txt', action='store_true', help='是否将结果保存为文本文件')
    parser.add_argument('--save-conf', action='store_true', help='是否在保存的文本文件中包含置信度信息')
    parser.add_argument('--save-crop', action='store_true', help='是否保存裁剪后的预测框')
    parser.add_argument('--nosave', action='store_true', help='是否不保存图像或视频')
    parser.add_argument('--classes', nargs='+', type=int, help='用于指定要过滤的类别,如果填写对应的类别序号如0,那么显示对应的标签')
    parser.add_argument('--agnostic-nms', action='store_true', help='是否进行类无关的NMS')
    parser.add_argument('--augment', action='store_true', help='是否进行增强推理')
    parser.add_argument('--visualize', action='store_true', help='是否可视化特征')
    parser.add_argument('--update', action='store_true', help='是否更新所有模型')
    parser.add_argument('--project', default=ROOT / 'runs/detect', help='保存结果的项目名称')
    parser.add_argument('--name', default='exp', help='指定保存结果的名称')
    parser.add_argument('--exist-ok', action='store_true', help='指定现有的项目名称是否允许覆盖')
    parser.add_argument('--line-thickness', default=3, type=int, help='指定边界框的线条粗细')
    parser.add_argument('--hide-labels', default=False, action='store_true', help='是否隐藏标签')
    parser.add_argument('--hide-conf', default=False, action='store_true', help='是否隐藏置信度')
    parser.add_argument('--half', action='store_true', help='是否使用半精度浮点数进行推理')
    parser.add_argument('--dnn', action='store_true', help='是否使用OpenCV的DNN模块进行ONNX推理')
    parser.add_argument('--vid-stride', type=int, default=1, help='指定视频帧率的步长')
    opt = parser.parse_args() #解析命令行参数并将结果存储在变量opt中
    opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1  #  如果opt.imgsz的长度为1,则将其乘以2,否则保持不变
    print_args(vars(opt)) #打印解析后的命令行参数
    return opt

train.py部分展示

  #更新图像权重(可选,仅适用于单GPU)
        if opt.image_weights:
            cw = model.class_weights.cpu().numpy() * (1 - maps) ** 2 / nc  # class weights
            iw = labels_to_image_weights(dataset.labels, nc=nc, class_weights=cw)  # image weights
            dataset.indices = random.choices(range(dataset.n), weights=iw, k=dataset.n)  # rand weighted idx

        # 更新马赛克边界(可选)
        # b = int(random.uniform(0.25 * imgsz, 0.75 * imgsz + gs) // gs * gs)
        # dataset.mosaic_border = [b - imgsz, -b]  # 高度、宽度边界

        mloss = torch.zeros(3, device=device)  #平均损失
        if RANK != -1:
            train_loader.sampler.set_epoch(epoch)
        pbar = enumerate(train_loader)
        LOGGER.info(('\n' + '%11s' * 7) % ('Epoch', 'GPU_mem', 'box_loss', 'obj_loss', 'cls_loss', 'Instances', 'Size'))
        if RANK in {-1, 0}:
            pbar = tqdm(pbar, total=nb, bar_format=TQDM_BAR_FORMAT)  ## 进度条
        optimizer.zero_grad()
        for i, (imgs, targets, paths, _) in pbar:  #遍历训练数据集中的每个批次。pbar是一个进度条对象,用于显示训练进度。
            callbacks.run('on_train_batch_start') #每个批次开始时运行回调函数,可以在这里执行一些自定义操作,例如记录日志、更新学习率等
            ni = i + nb * epoch  #自训练开始以来的积分批次数。计算当前批次在整个训练过程中的索引值。ni表示自训练开始以来的积分批次数
            imgs = imgs.to(device, non_blocking=True).float() / 255  #将输入图像数据转换为张量,并将其移动到指定的设备(如GPU)上。然后将图像数据归一化到0-1之间。

            #判断当前批次是否在warmup阶段
            if ni <= nw:
                xi = [0, nw]  #定义一个列表,表示warmup阶段的边界
                #根据当前批次的索引值,计算累积梯度的数量。这里使用了numpy的interp函数进行插值计算。
                accumulate = max(1, np.interp(ni, xi, [1, nbs / batch_size]).round())
                for j, x in enumerate(optimizer.param_groups): #遍历优化器的参数组
                    # 根据当前批次的索引值,计算学习率。这里使用了numpy的interp函数进行插值计算。
                    x['lr'] = np.interp(ni, xi, [hyp['warmup_bias_lr'] if j == 0 else 0.0, x['initial_lr'] * lf(epoch)])
                    if 'momentum' in x: #判断当前参数组是否包含动量项
                        x['momentum'] = np.interp(ni, xi, [hyp['warmup_momentum'], hyp['momentum']]) #根据当前批次的索引值,计算动量值。这里使用了numpy的interp函数进行插值计算。

需要全部内容的网友,可以关注博主,然后在后台私信回复“yolov5注释版

文章来源:https://blog.csdn.net/weixin_41717861/article/details/135553806
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。