yolov5 を使用して kaggle で mnist 手書き数字認識を行う

序文

yolov5 が v6.2 にアップデートされ、分類モデルが追加されたので、気まぐれに yolov5 の分類性能を試してみたくなりました。今回は、yolov5s-cls モデルを使用して、古典的なデータセット mnist でどの程度の精度が達成できるかを確認するために 5 回だけトレーニングしました。同時に、正義のため、トレーニングには公式の指示のみを使用し、テスト精度を kaggle に提出します。

データセットの準備

ダウンロードが必要な場合は、自分でリンク
ここに画像の説明を挿入
を入力してください。ここでは、test.csv とsample_submission.csv を直接ダウンロードするだけです。
同じディレクトリに新しい py スクリプトを作成し、次の内容を入力して、その中の各データを 28x28 の画像に変換します。

#oom.py
import pandas as pd
import imageio
df = pd.read_csv('test.csv')
for index,row in df.iterrows():
    print(index) #打印序号方便看进度
    pixels = row.values.reshape((28, 28))
    imageio.imwrite('E:/image/'+str(index) + '.png', pixels)

保存ディレクトリを自分で変更します。ここでは E ディスクのイメージ フォルダーにいます。コマンド ラインで直接実行します。コンピューターのメモリが vs などの IDE で実行するのに十分でない場合、オーバーフローする可能性があります。
ここに画像の説明を挿入
ディレクトリを開くと、画像に変換されていることがわかります。

Yolov5 トレーニング

リンク
まず、yolov5 の最新のソース コードをダウンロードする必要があります, そして、リリース ページに移動します. 多くのモデルがあることがわかります: ここで、コンピューターのグラフィック カードがゴミの場合は、8 g メモリのない古いグラフィック カードを指しますが、私の 8 g ビデオ メモリのグラフィック カードは yolov5s-cls を実行し、正常に実行するには num_workers を 6 に設定する必要があるため、最小の yolov5n-cls モデルを選択することをお勧めし
ここに画像の説明を挿入
ます
モデルをソース コード ディレクトリに配置し、現在のディレクトリでコマンド ラインを開始し、次のトレーニングを入力します。

python classify/train.py --model yolov5s-cls.pt --data mnist --epochs 5 --img 224 --batch 128

その後、新しいバージョンでは、トレーニング プロセスを記録するために wandb ウェブページ ソフトウェアを使用することが強制されるようです。事前に登録し、トレーニング中に wandb から提供された API キーを入力して有効にすることをお勧めします (ここには貼り付けることができません。手動で入力することしかできません)
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

4 回のトレーニングの正解率が 0.994 に達していることがわかります。次のステップは、出力を予測して保存することです。

Yolov5 の予測

まず、トレーニング ディレクトリに移動し、最適なモデル (best.pt) を取り出し、ルート ディレクトリに置きます:
ここに画像の説明を挿入
次に、事前に準備したデータ セットの画像フォルダーをルート ディレクトリに置きます:
ここに画像の説明を挿入
読みやすいように、sample_submission.csv を分類フォルダーに
ここに画像の説明を挿入
置きます: 予測.py を次のように変更します。より明確に見るために、 vs を使用して元の py と変更された py を比較しました (左側が変更された py): 最初に参照を追加します
ここに画像の説明を挿入

ここに画像の説明を挿入
新しい list_save を作成して、予測結果を保存します。
ここに画像の説明を挿入
top5i[0] (公式の出力は、最も高い確率で上位 5 つのカテゴリを出力することですが、ここでは最初の 1 つだけを取り上げます) を list_save に置きます。
ここに画像の説明を挿入
Sample_submission.csv ファイル内の Label タグを読み取り、結果を上書きします。ここで注意が必要なのは、yolov5がソートのためにファイルパスを読み込む際、その前に文字列がある、つまり通常の数値順にソートされるのではなく、1、10、100というように1つずつソートされるため、順序がめちゃくちゃになり、後から処理する必要があるということです。
まず予測して、コマンド ラインに次のコマンドを入力し、最後に sub.csv ファイルを取得します。

python classify/predict.py --weights best.pt --source image/ --nosave 

–weights は重みを指定します。 –source の直後にフォルダーが続きます。その下にはすべての写真が表示されます。 –nosave は写真を保存しないことを意味します。
次に、classify フォルダーの下に生成された sub.csv ファイルを取り出し、読み取りと処理を続行します。一般的な考え方は、先頭に str を使用して並べ替えをシミュレートし、正規表現を使用して sub.csv のシリアル番号列をカバーする数値を取り出し、全体を並べ替えて、正しい結果を取得することです。

import re
import pandas as pd
unorder_df = pd.read_csv('sub.csv')
list_a=[]
for i in range(0,28000):
    list_a.append('image'+str(i)+'.png')
list_b = sorted(list_a) #模拟yolov5文件路径排序
list_c = []
for i in list_b:
    x = re.findall("\d+", i) #只匹配数字
    x = int(x[0]) #从str转换为数字
    list_c.append(x + 1) #加一是因为序号是从1开始的
unorder_df['ImageId']=list_c
df = unorder_df.sort_values(by=['ImageId']) #根据序号列排序
df.to_csv('sub2.csv',index=None)

アップロード結果

kaggle に戻って、sub2.csv を送信して、sub2.csv を送信すると、
ここに画像の説明を挿入
ここに画像の説明を挿入
精度が非常に高いことがわかります。もちろん、この実験はまだ厳密ではありません。つまり、kaggle が提供するトレーニング セットをトレーニングに使用するのではなく、yolov5 によって自動的にダウンロードされたトレーニング セットが使用されます。トレーニング セットとテスト セットが重複している可能性があります。

おすすめ

転載: blog.csdn.net/weixin_43945848/article/details/126864677