# 附加Model attributes
    # nl:这个属性代表模型中的检测层数量。它用于调整假设的规模。
    nl = de_parallel(model).model[-1].nl  # 检测层的数量(用于缩放hyps)
    # hyp['box']:该属性被缩放了3除以nl的因子。它用于调整边界框的大小。
    hyp['box'] *= 3 / nl  # # 缩放到层级
    # hyp['cls']:该属性被缩放了nc / 80乘以3除以nl的因子。它用于调整类别和层数的大小。
    hyp['cls'] *= nc / 80 * 3 / nl  # 缩放到类别和层级
    # hyp['obj']:该属性被缩放了(imgsz / 640) ** 2乘以3除以nl的因子。它用于根据图像大小和层数调整对象的大小。
    hyp['obj'] *= (imgsz / 640) ** 2 * 3 / nl  # 缩放到图像大小和层级
    # hyp['label_smoothing']:该属性被设置为opt.label_smoothing的值。它用于在训练过程中进行标签平滑处理。
    hyp['label_smoothing'] = opt.label_smoothing
    # model.nc:该属性代表模型中的类别数量。nc被附加到模型上。
    model.nc = nc  # 将类别数量附加到模型
    # model.hyp:该属性代表模型的超参数。hyp被附加到模型上。
    model.hyp = hyp  # 将超参数附加到模型
    # 从训练样本标签得到类别权重(和类别中的目标数即类别频率成反比)
    # model.class_weights:该属性代表模型的类别权重。它使用labels_to_class_weights函数和数据集的标签以及nc作为参数进行计算。然后乘以nc并附加到模型上。
    model.class_weights = labels_to_class_weights(dataset.labels, nc).to(device) * nc  # 附加类别权重
    # model.names:该属性代表模型中类别的名称。
    model.names = names  # 获取类别名
  1. nl:这个属性代表模型中的检测层数量。它用于调整假设的规模。
  2. hyp['box']:该属性被缩放了3除以nl的因子。它用于调整边界框的大小。
  3. hyp['cls']:该属性被缩放了nc / 80乘以3除以nl的因子。它用于调整类别和层数的大小。
  4. hyp['obj']:该属性被缩放了(imgsz / 640) ** 2乘以3除以nl的因子。它用于根据图像大小和层数调整对象的大小。
  5. hyp['label_smoothing']:该属性被设置为opt.label_smoothing的值。它用于在训练过程中进行标签平滑处理。
  6. model.nc:该属性代表模型中的类别数量。它被附加到模型上。
  7. model.hyp:该属性代表模型的超参数。它被附加到模型上。
  8. model.class_weights:该属性代表模型的类别权重。它使用labels_to_class_weights函数和数据集的标签以及nc作为参数进行计算。然后乘以nc并附加到模型上。
  9. model.names:该属性代表模型中类别的名称。