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を学習させるとエラーにはならないっぽくて謎。
このあたりの修正による物っぽい?
【追記】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'」となるらしい。適切ではないハイパーパラメータのファイルが指定されていたことが根本原因のようです。