使用Super-gradients训练YOLO-NAS首次验证后遇编码错误求助
问题描述
环境版本
- torch: 1.13.1
- super-gradients: 3.1.2
训练参数
from super_gradients.training.losses import PPYoloELoss from super_gradients.training.metrics import DetectionMetrics_050 from super_gradients.training.metrics import DetectionMetrics_050_095 from super_gradients.training.models.detection_models.pp_yolo_e import PPYoloEPostPredictionCallback train_params = { 'silent_mode': False, "average_best_models":True, "warmup_mode": "linear_epoch_step", "warmup_initial_lr": 1e-6, "lr_warmup_epochs": 3, "initial_lr": 5e-4, "lr_mode": "cosine", "cosine_final_lr_ratio": 0.1, "optimizer": "Adam", "optimizer_params": {"weight_decay": 0.0001}, "zero_weight_decay_on_bias_and_bn": True, "ema": True, "ema_params": {"decay": 0.9, "decay_type": "threshold"}, "max_epochs": EPOCHS, "mixed_precision": True, "loss": PPYoloELoss( use_static_assigner=False, num_classes=len(dataset_params['classes']), reg_max=16 ), "valid_metrics_list": [ DetectionMetrics_050( score_thres=0.1, top_k_predictions=300, num_cls=len(dataset_params['classes']), normalize_targets=True, post_prediction_callback=PPYoloEPostPredictionCallback( score_threshold=0.01, nms_top_k=1000, max_predictions=300, nms_threshold=0.7 ) ), DetectionMetrics_050_095( score_thres=0.1, top_k_predictions=300, num_cls=len(dataset_params['classes']), normalize_targets=True, post_prediction_callback=PPYoloEPostPredictionCallback( score_threshold=0.01, nms_top_k=1000, max_predictions=300, nms_threshold=0.7 ) ) ], "metric_to_watch": 'mAP@0.50:0.95' }
训练流程
models_to_train = ['yolo_nas_s'] CHECKPOINT_DIR = 'checkpoints' trainer = Trainer( experiment_name='yolo_nas_s', ckpt_root_dir=CHECKPOINT_DIR ) model = models.get( 'yolo_nas_s', num_classes=len(dataset_params['classes']), pretrained_weights="coco" ) trainer.train( model, training_params=train_params, train_loader=train_data, valid_loader=val_data )
错误信息
"'charmap' codec can't encode characters in position 20-22: character maps to
"
解决方法
这个编码错误多出现于Windows环境,核心原因是程序默认使用系统编码(如GBK)读取含非ASCII字符的文件(标注文件、类别名等)时出现兼容问题,可尝试以下方案:
- 强制设置Python默认编码为UTF-8
在训练脚本开头添加代码,覆盖默认输出编码:
import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
- 显式指定数据集文件编码
如果自定义数据集的标注文件(XML/JSON/TXT等)含中文或特殊字符,读取时强制指定utf-8编码:
with open(label_file_path, 'r', encoding='utf-8') as f: content = f.read()
若使用SuperGradients内置数据集类,检查是否支持通过参数指定编码,或修改类内文件读取逻辑。
- 修改控制台编码
在Windows命令行执行以下命令切换编码为UTF-8,再运行训练脚本:
chcp 65001
- 清理路径与名称中的特殊字符
检查数据集的文件路径、文件名、类别名称是否包含中文、生僻字或特殊符号,若有则改为英文/数字命名。
内容的提问来源于stack exchange,提问作者nost99
相关产品推荐
相关产品推荐

