为了更好的学习,最近给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注释版”