はじめに
PyTorch / YOLOv5 を使ったプログラムを久しぶりに実行すると、以下のようなエラーが出ました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
WARNING DetectMultiBackend failed: Weights only load failed. This file can still be loaded, to do so you have two options, do those steps only if you trust the source of the checkpoint. (1) In PyTorch 2.6, we changed the default value of the `weights_only` argument in `torch.load` from `False` to `True`. Re-running `torch.load` with `weights_only` set to `False` will likely succeed, but it can result in arbitrary code execution. Do it only if you got the file from a trusted source. (2) Alternatively, to load with `weights_only=True` please check the recommended steps in the following error message. WeightsUnpickler error: Unsupported global: GLOBAL models.yolo.Model was not an allowed global by default. Please use `torch.serialization.add_safe_globals([models.yolo.Model])` or the `torch.serialization.safe_globals([models.yolo.Model])` context manager to allowlist this global if you trust this class/function. Check the documentation of torch.load to learn more about types accepted by default with weights_only https://pytorch.org/docs/stable/generated/torch.load.html. Traceback (most recent call last): File "C:\Users\sanachan\Desktop\main.py", line 144, in <module> main() File "C:\Users\sanachan\Desktop\main.py", line 79, in main yolo = YOLOv5('yolov5s.pt') ^^^^^^^^^^^^^^^^^^^^ File "C:\Users\sanachan\miniconda3\envs\PY311_PyTorch\Lib\site-packages\yolov5\helpers.py", line 76, in __init__ self.model = load_model( ^^^^^^^^^^^ File "C:\Users\sanachan\miniconda3\envs\PY311_PyTorch\Lib\site-packages\yolov5\helpers.py", line 60, in load_model model = attempt_load(model_path, device=device, fuse=False) # arbitrary model ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\sanachan\miniconda3\envs\PY311_PyTorch\Lib\site-packages\yolov5\models\experimental.py", line 79, in attempt_load ckpt = torch.load(attempt_download(w), map_location='cpu') # load ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\sanachan\miniconda3\envs\PY311_PyTorch\Lib\site-packages\torch\serialization.py", line 1524, in load raise pickle.UnpicklingError(_get_wo_message(str(e))) from None _pickle.UnpicklingError: Weights only load failed. This file can still be loaded, to do so you have two options, do those steps only if you trust the source of the checkpoint. (1) In PyTorch 2.6, we changed the default value of the `weights_only` argument in `torch.load` from `False` to `True`. Re-running `torch.load` with `weights_only` set to `False` will likely succeed, but it can result in arbitrary code execution. Do it only if you got the file from a trusted source. (2) Alternatively, to load with `weights_only=True` please check the recommended steps in the following error message. WeightsUnpickler error: Unsupported global: GLOBAL models.yolo.Model was not an allowed global by default. Please use `torch.serialization.add_safe_globals([models.yolo.Model])` or the `torch.serialization.safe_globals([models.yolo.Model])` context manager to allowlist this global if you trust this class/function. Check the documentation of torch.load to learn more about types accepted by default with weights_only https://pytorch.org/docs/stable/generated/torch.load.html. |
関連
環境は作り直しましたが、こちら「PyTorch GPU/CUDA 環境構築」で動いていたプログラムです。
エラーの原因
PyTorch v2.6.0 以降、モデルのデフォルトフォーマットが変更になったようです。
エラーの対処法
対象ファイル
C:\Users\sanachan\miniconda3\envs\PY311_PyTorch\Lib\site-packages\yolov5\models\experimental.py
|
1 2 3 4 5 6 7 8 9 10 |
def attempt_load(weights, device=None, inplace=True, fuse=True): # Loads an ensemble of models weights=[a,b,c] or a single model weights=[a] or weights=a from models.yolo import Detect, Model model = Ensemble() for w in weights if isinstance(weights, list) else [weights]: # ckpt = torch.load(attempt_download(w), map_location='cpu') # load ckpt = torch.load(attempt_download(w), map_location='cpu', weights_only=False) # load ckpt = (ckpt.get('ema') or ckpt['model']).to(device).float() # FP32 model |
7行目をコピーして、8行目のように「weights_only=False」を設定して呼び出すように変更します。