いかたけの備忘録

忘れっぽい

CPUのみでYOLOv7-tinyを学習(train)させるとエラーになる。←解決しました。

github.com

python train.py --device cpu --data ./data/dataset.yaml --cfg ./cfg/training/yolov7-tiny.yaml --weights ./weights/yolov7-tiny.pt

みたいな感じでyolov7の学習をさせると

File "C:\Users\ikatake\yolov7\utils\loss.py", line 786, in build_targets

あたりが原因で止まってしまう。どうもyolov7/utils/loss.pyの786行目に

matching_bs[i] = torch.tensor([], device='cuda:0', dtype=torch.int64)

って書いてあるんだけど、deviceをcpuのみにしているので、cuda:0が無くて異常終了しているっぽい。

loss,pyの他処理を読むと、だいたい

device = targets.device

で引数targetsからデータをもらって、

関数を呼び出すところでは

device=device

って書くようにしているので、device='cuda:0'になっている箇所を同じ書き方に直していく。device='cuda:0'になっている箇所はutils/loss.pyの中で786~791、1113~1118、1431~1436、1584~1589行目が該当する。

そこを修正すると、エラーで終了することはなくなった。精度がどうなっているかとかの検証はしていません。ちなみに、yolov7_training.ptを学習させるとエラーにはならないっぽくて謎。

github.com

このあたりの修正による物っぽい?

 

【追記】2022年12月18日

python train.py --device cpu --data ./data/dataset.yaml --cfg ./cfg/training/yolov7-tiny.yaml --weights ./weights/yolov7-tiny.pt

は間違いで、ハイパーパラメータのyamlファイルが指定できていない。git cloneしたときから入っているファイルでは

python train.py --device cpu --data ./data/dataset.yaml --cfg ./cfg/training/yolov7-tiny.yaml --weights ./weights/yolov7-tiny.pt --hyp ./data/hyp.scratch.tiny.yaml

と指定してやるのが良いっぽい。train.pyによると、--hyp引数を指定しないとデフォルトで「'data/hyp.scratch.p5.yaml'」となるらしい。適切ではないハイパーパラメータのファイルが指定されていたことが根本原因のようです。