微调YOLOv8时遇TypeError: code()参数13需str而非int的解决办法
YOLOv8训练首个epoch后保存模型触发cloudpickle TypeError解决思路
自定义数据集微调YOLOv8n模型时,首个epoch训练完成后触发保存模型的错误,错误类型为TypeError: code() argument 13 must be str, not int,相关代码、配置及错误日志如下:
训练代码
model = YOLO("YOLOv8n.pt",task="detect") model.train(data="config.yaml", epochs=5,optimizer="Adam")
config.yaml配置
train: /Users/nuntea/Computer Vision/Football Field Detection/aug_data/Train/images val: /Users/nuntea/Computer Vision/Football Field Detection/aug_data/Validation/images names: 0 : Referee 1 : Player 2 : GoalKeeper 3 : Ball
截断后的错误日志
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 1/5 0G 2.409 2.63 2.16 44 640: 1 Class Images Instances Box(P R mAP50 m all 900 4527 4.44e-05 0.0032 2.42e-05 7.84e-06 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[54], line 2 1 model = YOLO("YOLOv8n.pt",task="detect") ----> 2 model.train(data="config.yaml", epochs=5,optimizer="Adam") File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/ultralytics/engine/model.py:338, in Model.train(self, trainer, **kwargs) 336 self.model = self.trainer.model 337 self.trainer.hub_session = self.session # attach optional HUB session --> 338 self.trainer.train() 339 # Update model and cfg after training 340 if RANK in (-1, 0): File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/ultralytics/engine/trainer.py:385, in BaseTrainer._do_train(self, world_size) 383 # Save model 384 if self.args.save or (epoch + 1 == self.epochs): --> 385 self.save_model() 386 self.run_callbacks('on_model_save') 388 tnow = time.time() File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/cloudpickle/__init__.py:7 3 import sys 4 import pickle ----> 7 from cloudpickle.cloudpickle import * 8 if sys.version_info[:2] >= (3, 8): 9 from cloudpickle.cloudpickle_fast import CloudPickler, dumps, dump File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/cloudpickle/cloudpickle.py:361 342 else: 343 return types.CodeType( 344 co.co_argcount, 345 co.co_kwonlyargcount, (...) 358 (), 359 ) --> 361 _cell_set_template_code = _make_cell_set_template_code() 364 def cell_set(cell, value): 365 """Set the value of a closure cell. 366 """ File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/cloudpickle/cloudpickle.py:324, in _make_cell_set_template_code() 322 else: 323 if hasattr(types.CodeType, "co_posonlyargcount"): # pragma: no branch --> 324 return types.CodeType( 325 co.co_argcount, 326 co.co_posonlyargcount, # Python3.8 with PEP570 327 co.co_kwonlyargcount, 328 co.co_nlocals, 329 co.co_stacksize, 330 co.co_flags, 331 co.co_code, 332 co.co_consts, 333 co.co_names, 334 co.co_varnames, 335 co.co_filename, 336 co.co_name, 337 co.co_firstlineno, 338 co.co_lnotab, 339 co.co_cellvars, # this is the trickery 340 (), 341 ) 342 else: 343 return types.CodeType( 344 co.co_argcount, 345 co.co_kwonlyargcount, (...) 358 (), 359 ) TypeError: code() argument 13 must be str, not int
解决思路
升级/降级cloudpickle版本:这个错误是cloudpickle与Python3.11的兼容性问题导致的,Python3.11对
types.CodeType的参数格式要求有变化,旧版cloudpickle未适配。执行以下命令升级到最新稳定版:pip install --upgrade cloudpickle如果升级后仍有问题,尝试指定适配Python3.11的版本:
pip install cloudpickle==2.2.1临时跳过模型保存验证问题:在训练时添加
save=False参数,跳过自动保存环节,验证后续训练是否正常:model.train(data="config.yaml", epochs=5, optimizer="Adam", save=False)如果能跑完所有epoch,说明问题确实出在模型保存的pickle环节,进一步确认是cloudpickle的问题。
更换模型保存方式:如果cloudpickle的问题无法解决,可以训练完成后手动导出模型,比如:
# 训练完成后执行 model.export(format='pt')或者在训练回调中使用
torch.save()直接保存模型权重。降级Python版本:如果上述方法都无效,暂时降级到Python3.10,YOLOv8的依赖库在3.10环境下兼容性更稳定。
内容的提问来源于stack exchange,提问作者Nuntea7
相关产品推荐
相关产品推荐

