YOLO-v9 の訓練がエラーメッセージを吐かずに止まる (2024/10/3)
以前に書いた記事に従って yolo-v9 の環境構築をしたところ,訓練プログラムが回らないというエラーに遭遇しました.解決に結構な時間を取られてしまったので,奮闘のログを残しておきます.
1. エラーの内容
yolo-v9 の 訓練プログラム (train.py) を動かそうとしたところ,画像の読み込みに入った段階から先に進まず,プログラムが止まってしまいました.
エラーメッセージを出力してくれれば,検索するなり chat GPT に聞くなり,GitHub の Issue を漁るなりすると解決の手掛かりがつかめることが多いのですが,今回は何も吐かずに止まっています.
2. 試したこと
(忙しい人は 3 に飛んでください)
まず疑ったのは,GPU メモリの不足です.モデルのサイズ,バッチサイズ,オプションの workers の数字などをどんどん下げていったのですが,一向に直りません.
次に考えたのは,Nvidia driver - CUDA Toolkit - cuDNN のバージョン不一致です.そこで,以下のプログラムを試しました.
# check_cuda.py
import torch
print(torch.__version__)
print(torch.cuda.is_available())
pytorch のバージョンは 2.3.1, cuda_is_available には True と出力されました.
CUDA が認識されないという記事はよく見るのですが,その場合は cuda_is_available が False と出るようです.True と出たのに認識されないという記事は見当たりませんでした.
python train_dual.py (中略) --device cpu
続いて,cpu でも訓練を回してみました.yolo-v9 には cpu で訓練を回すというオプションがあります.正直誰が使うのかなと思っていたのですが,こんな時に役に立つのですね.
結果は,cpu でも同じエラーが出ました.なので,メモリや CUDA の認識等の GPU 周りのエラーではないことが分かりました.
3. 原因らしきもの
前回の記事は 2024 年の 3 月に書いたもので,当時構築した環境は今も問題なく動いています.となると,ライブラリ間の依存関係が容疑者候補に挙がります.環境構築の際にやった変なことといえば,,,
GitHub の Issue には,Pillow は 9.5.0 をバージョン指定して入れるように書いてありましたが,これが悪さをしている可能性があります.さらに調べると,以下のような Issue がありました.
これが原因かは分かりませんが,Pillow の 9.5.0 は新しい torchvision とあまり相性が良くない可能性はありそうです.
(自分の torchvision のバージョンは 0.18.1 でした)
4. 解決策
プログラムが動きさえすればいい場合
そもそも Pillow のバージョンを落としたのは以下のエラーログが何度も出たからだったのですが,エラーメッセージが出るだけでプログラムは回ります.なので,Pillow のバージョンを最新版に戻してあげれば,大量の AttributeError は出ますがプログラムは実行されます.
# 2024 年 10 月時点の最新版
pip install pillow==10.4.0
これで実行すると一応プログラムは動きます.
もう少し出力にもこだわりたい場合
自分は基本は動けばいい派なのですが,ログに「Error」の文字が出てしまうのはさすがに避けたいです.
そこでもう一度 Issue に戻ってみると,今年の 5/1 に書き込みが追加されています.Pillow の バージョンは新しい (例えば 10.4.0) まま,utils/plots.py の 86 行目を以下のように書き換えれば良いとのことです.
# w, h = self.font.getsize(label) # 書き換え前
_, _, w, h = self.font.getbbox(label) # 書き換え後
これで訓練コードを回すと,Attribution Error を吐くことなく正常に訓練が終了しました.
この記事が皆様の物体検出ライフの参考になれば幸いです.
【CM】こんな記事も書いています.