AIを使っての画像認識による物体検出をYOLOv5を使ってやってみた

前置き

AIを使っての画像認識による物体検出は、自動運転・セキュリティ対策・顧客分析・異常検知・画像診断など様々な分野で利用されています。

AIの基礎に触れてみるということで、YOLOv5を使ってAIを体験してみました。

ちょうど社内サーバーの更新時期と重なったので、新品のパソコンでの環境で作業することができましたので、学習モデルの作成も苦もなくこなせるのではないかと思います。

今回は、Nゲージの鉄道模型を使って車両の種類の学習をおこない、車両の種類を認識・検出させてみたいとおもいます。

作成した学習モデルにより、車両模型の種類を検出・認識します。

実は、Corei5-2400(グラボ無し)という骨董品みたいなマシンが転がっていたので、こいつにUbuntu環境を作成して実行したのですが、PyTourchでの学習を200Epoch(回)繰り返すと36時間もかかってしまいました。
今回用意した新環境では、約18分で終了しました。

実行環境

CPU : AMD Ryzen 7 5700X BOX
メモリー:64GB (32GB x 2)
グラフィックボード:MSI GeForce RTX 3060 12GB
マザーボード:MSI MAG B550 TOMAHAWK
SSD: ADATA M.2 2TB
OS: Ubuntu 22.04

現時点でコスパの優れているAMD Ryzen7 5700Xを中心に組んでいるので、程々の性能ですが業務使用サーバーとしては充分な性能です。

ケースが間に合わず仮組み状態です

YOLOv5について

YOLOv5は、YOLOv3のPyTorch版実装を作成したGlenn Jocher氏(Ultralytics社)が2020年6月に発表したバージョンです。
2023年1月には、後継バージョンにYOLOv8が発表されています。

ライセンスはAGPL-3.0 (GNU Affero General Public License v3.0)となっています。

GitHub https://github.com/ultralytics/yolov5

YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 d…
github.com

YOLOの系譜

  • YOLOv1 ※Joseph Redmon
    • YOLOv2
      • YOLOv3 ※Joseph Redmon, Ali Farhadi
        • YOLOv4 ※Alexey Bochkovskiy
          • YOLOv7
        • YOLOv5 ※Glenn Jocher(Ultralytics社)
          • YOLOv8
  • YOLOv6 ※Meituan Technical Team
作者バージョンバージョン
Alexey BochkovskiyYOLOv4 (2020年4月)
https://github.com/AlexeyAB/darknet
YOLOv7 (2022年7月)
https://github.com/WongKinYiu/yolov7
Glenn Jocher
(Ultralytics社)
YOLOv5 (2020年6月)
https://github.com/ultralytics/yolov5
YOLOv8 (2023年1月)
https://github.com/ultralytics/ultralytics
Meituan Technical TeamYOLOv6 (2022年6月)
https://github.com/meituan/YOLOv6
ライセンスは、YOLOv4はApache License 2.0、他はAGPL-3.0

サンプルコード

YOLOv5には以下のサンプルコードがあります。
これらの、サンプルコードを使うことにより、簡単にAIの技術に触れることができます。

  • train.py
    • 独自に用意したデータセットから、独自の学習モデルを作成することができます。
  • detect.py
    • 学習モデルを使って様々なソース(ウェブカメラ・静止画jpg・動画mp4・スクリーンショット・YouTube・ストリーム動画)から推論を実行し、物体検知を行い結果を保存します。

CUDA Toolkitのインストール

今回用意したPCには、グラフィックボードに GeForce RTX 3060 があるので、PyTorchによる機械学習時にGPUを使って処理能力をあげるために、NVIDIAが提供しているGPU向けの汎用並列コンピューティング環境であるCUDAをインストールしておきます。

CUDAのサイトにインストール条件を入力します。
https://developer.nvidia.com/cuda-downloads

Get the latest feature updates to NVIDIA's proprietary compute stack.
developer.nvidia.com

Operating System : Linux
Architecture : x86_64
Distribution : Ubuntu
Version : 22.04
Installer Type : deb(local)

Installation Instructions にインストール方法が生成されます。
今回の場合は以下のように生成されました。

ShellScript
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.3.1/local_installers/cuda-repo-ubuntu2204-12-3-local_12.3.1-545.23.08-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2204-12-3-local_12.3.1-545.23.08-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2204-12-3-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-3

インストール後 .bashrc に CUDA のパスを追加

.bashrc
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

PyTorchのインストール

PyTorchとは

Facebookが開発を主導したPython向けの機械学習ライブラリです。

インストール

PyTorchのサイトにインストール条件を入力します。
https://pytorch.org/get-started/locally/

Start Locally
pytorch.org

PyTorch Build : Stable (2.1.1)
Your OS : Linux
Package : Pip
Language : Python
Compute Platform : CUDA 12.1

Run this Command に、インストールコマンドが生成されます。

ShellScript
pip3 install torch torchvision torchaudio

画像処理ライブラリ(OpenCV)のインストール

ShellScript
pip3 install opencv-python

学習済みモデル YOLOv5 のインストール

YOLOv5は以下のページで公開されています。

YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 d…
github.com

GitHubのリポジトリをダウンロード

ShellScript
git clone https://github.com/ultralytics/yolov5

YOLOv5を使用するために必要なライブラリのリストをインストール

ShellScript
cd yolov5
pip3 install -r requirements.txt

サンプルコードからの動作確認

ShellScript
python3 detect.py

実行すると yolov5/runs/detect/exp フォルダに学習データから画像認識した結果が作成されます。

  • ホーム
    • yolov5
      • runs
        • detect
          • exp ※ 実行結果
      • data
        • images ※ 元データ

人物やバスが認識されています。
元データは yolov5/data/images にあります。

Nゲージ鉄道模型を学習して、車両の車種を認識させる

取り敢えず物体検出は動作したので、独自に学習データを作成して画像を認識させてみたいと思います。
こちらも参考にしてください。

学習用データを用意する

学習させるNゲージ鉄道模型は次の5種類です。

右上から時計回りで、EF210-100形・コキ107形フレイトライナー・コキ107形国際海上コンテナ・コキ104形ヤマト運輸コンテナ・タキ1000形(日本石油輸送・米タン)の5種類です。

色々な方向から各車両を撮影して学習用データを作成します。

学習結果で出力された画像です。
このように色々な方向から撮影しました。

今回用意した学習用データは262枚の画像を用意しました。
この枚数が多いのか少ないのかはわかりませんが、結果は良い検出率だったのでよしとします。

学習用データのアノテーション(ラベル付け)

用意した学習用データだけでは何を学習して良いのかわかりません。
そこで、学習用データの画像にアノテーション(ラベル付け)をして、画像の中にある検出する被写体を指定していきます。

labelimg

今回、アノテーションには labelImg というアプリケーションを使いました。
labelImgは画像に写っている特定の被写体の座標とラベルデータを作成して、学習モデル作成に必要なデータを作成します。

labelImgのインストール

今回は、GitHubのレポジトリをクローンしてインストールしました。

ShellScript
git clone https://github.com/heartexlabs/labelImg.git

必要なモジュールのインストール

ShellScript
cd labelImg
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3

labelImgの起動

ShellScript
python3 ./labelImg/labelImg.py

ラベルの定義

今回は、EF210-100形・コキ107形フレイトライナー・コキ107形国際海上コンテナ・コキ104形ヤマト運輸コンテナ・タキ1000形(日本石油輸送・米タン)の5種類の被写体にラベルをつけるので、あらかじめラベルをテキストデータで作成しておくとスムーズにラベル付けすることができます。

./labelImg/data/predefined_classes.txt に以下のようにラベルを記述しておきます。

predefined_classes.txt
EF210-100
KOKI107-FreightLiner
KOKI107-IntermodalContainer
KOKI104-YAMATO
TAKI1000-NihonSekiyu

指定されたラベルが選択することができ入力ミスを減らすことができます。

アノテーションデータを作成する。

「ディレクトリを開く」で、学習用データの入っているディレクトリを開きます。

ディレクトリ内のjpgファイルが表示されます。
「次の画像」・「前の画像」で画像を遷移することができます。

画像内に写っている被写体を「矩形を作成する」で矩形で囲んで、ラベルを指定します。

ラベルを付け終わったら保存するデータフォーマットを「YOLO」にして「保存する」をクリックします。

「画像のファイル名.txt」でアノテーションデータが作成されます。

  • 【例】
    • P1010387.jpg — 画像ファイル
    • P1010387.txt — アノテーションデータ
3 0.327344 0.258333 0.248438 0.500000
1 0.422656 0.473611 0.317188 0.347222
2 0.778906 0.372222 0.339062 0.272222
0 0.334375 0.811111 0.293750 0.316667
4 0.622656 0.643056 0.176563 0.352778

ラベルの番号(predefined_classes.txt に記述した順番号 ※1行目は0開始の3なので「KOKI104-YAMATO」を指す)と、矩形の画像上の座標位置を示します。

学習用データを使ってPyTorchでの学習

ラベル付の終わった学習用データを使って、PyTorchにより独自の学習モデルを作成します。

学習用データの配置

ラベル付の終わった学習用データを任意のディレクトリにコピーします。
検証用データは学習用データから2割程度をランダムに選択してコピーします。
今回は yolov5/data ディレクトリに作成しました。

  • ホーム
    • yolov5
      • data
        • train — 学習用データ
          • image — 学習用データ 画像ファイル (.jpg)
          • labels — 学習用データ アノテーションデータ (.txt)
        • valid — 検証用データ
          • image — 検証用データ 画像ファイル (.jpg)
          • labels — 検証用データ アノテーションデータ (.txt)
        • data.yaml — 学習パラメータファイル

学習用データは学習するための元データとなります。
検証用データは学習の習熟率を計るために使われます。

  1. 学習用データで学習し、学習モデルに反映させる
  2. 学習モデルを使って検証用データで物体検出をおこない、アノテーションデータとの差異で評価をおこない習熟率を計る

学習を反復して習熟率を高める。
学習を何回反復するかを決定するのが epochs オプションです。

学習パラメータファイルの作成

YOLOv5サンプルプログラムtrain.pyは、学習パラメータファイルから実行環境を指定します。

yolov5/data 下に学習パラメータファイルを data.yaml 作成しました。

data.yaml
train: data/train/images
val: data/valid/images
nc: 5
names: [ 'EF210-100','KOKI107-FL','KOKI107-ICon','KOKI104-YAMATO','TAKI1000-NiSeki']
パラメータファイルの内容説明
  • train — 学習用データディレクトリ
  • val — 検証用データディレクトリ
  • nc — 学習要素数
  • names — 学習要素名

事前トレーニング済モデルの選択

事前トレーニング済モデルには、YOLOv5n / YOLOv5s / YOLOv5m / YOLOv5l / YOLOv5x の5段階のモデルが用意されています。
YOLOv5n < YOLOv5s < YOLOv5m < YOLOv5l < YOLOv5x の順で検出精度が高くなりますが、実行速度が遅くなり必要メモリ・学習モデルも大きくなります。
他に学習モデルサイズが1280pxの YOLOv5n6 / YOLOv5s6 / YOLOv5m6 / YOLOv5l6 / YOLOv5x6 のモデルも用意されています。

事前トレーニング済モデルは、0から80までのクラスを学習しています。
もし、既存の学習モデルの追加で学習したい場合は yolov5/data/coco.yaml を参考にして、クラスをコピーして既存クラスの後に追加するクラスを入れます。アノテーション時からクラスを統一できるようにしておきます。

事前トレーニングモデルは以下からもダウンロードできます。

Before You Start
pytorch.org

GitHubにも詳しいデータが記載されています。

YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 d…
github.com

よくサンプルなどで目にするのは、YOLOv5sを選択するのを奨めることが多いですが、今回は速度が少々遅く学習モデルが大きくなっても検知精度をあげたいのでYOLOv5mを選択します。
YOLOv5のREADME.mdに学習結果の違いがグラフにて示されていました。

全体的にみてYOLOv5sとYOLOv5mの間には明確な差がありますが、YOLOv5mとYOLOv5l / YOLOv5xの間にはそれほどの差がないようです。

事前トレーニング済みモデルは以下のGitHubからダウンロードすることができます。

YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 d…
github.com

train.py 実行時のオプション –weights yolov5m.pt で指定することもできます。
他にも –weights ” –cfg models/yolov5m.yaml でも指定することができます。

各 yolov5◯.yml のパラメータの違いです。

パラメータyolov5syolov5myolov5lyolov5x
depth_multiple
(モデルの深さ)
0.330.671.01.33
width_multiple
(モデルのチャンネル数[幅])
0.500.751.01.25

学習の実行

いよいよ学習モデルの作成です。
今回は学習の反復回数(epochs)を200回に設定して実行しました。

ShellScript
python3 train.py --data data/data.yaml --weights yolov5m.pt --epochs 200

実行環境によっては、学習途中でメモリーリークなどで中断してしまうこともあります。
その時は –batch-size オプションを調整してみてください、既定値は16ですのでそれより小さな数字を入れると時間はかかりますが最後まで学習が続行される可能性があります。

ちなみに、Corei5-2400(グラボ無し)で実行したときは以下のオプションでなんとか最後まで実行できました。

ShellScript
python3 train.py --data data/data.yaml --weights yolov5m.pt --batch-size 4 --epochs 200
train.py の主なオプションの説明

https://github.com/ultralytics/yolov5/blob/fad57c29cd27c0fcbc0038b7b7312b9b6ef922a8/train.py#L428

YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 d…
github.com
オプション説明既定値
data学習パラメータファイルへのパス
weight事前トレーニング済モデルの指定yolov5s.pt
epochs学習の反復回数300
batchバッチサイズの指定
-1 を指定すると最適なバッチサイズ(AutoBatch)で実行されます
16
img学習画像のサイズを指定640
name学習結果の保存先ディレクトリexp
patience学習精度が指定回数改善されない場合、学習を早期停止します30

学習実行結果

学習が終了すると、学習モデルの評価のサマリが表示されます。

200 epochs completed in 0.310 hours.
Optimizer stripped from runs/train/exp/weights/last.pt, 42.2MB
Optimizer stripped from runs/train/exp/weights/best.pt, 42.2MB

Validating runs/train/exp/weights/best.pt...
Fusing layers... 
Model summary: 212 layers, 20869098 parameters, 0 gradients, 47.9 GFLOPs
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 2/2 [00:00<00:00,  3.94it/s]
                   all         52        119      0.992      0.994      0.995      0.958
             EF210-100         52         26      0.999          1      0.995      0.961
            KOKI107-FL         52         28          1      0.972      0.995      0.948
          KOKI107-ICon         52         19      0.994          1      0.995      0.962
        KOKI104-YAMATO         52         24          1          1      0.995      0.964
       TAKI1000-NiSeki         52         22      0.967          1      0.995      0.955
Results saved to runs/train/exp

論理的にはP , R , mAP50 , mAP50-95 が1に近ければ優秀な学習モデルといえますが、過学習による検出判断の硬直化や誤検知も発生するので、学習曲線や実際の検出精度などで Epochを調整する必要があります。

学習実行結果は yolov5/runs/train/exp ディレクトリに保存されます。
exp ディレクトリは存在すると exp2 exp3・・・ と作られていきます。

学習モデルは yolov5/runs/train/exp/weights ディレクトリに保存されます。
best.pt は学習で最も良い評価の学習モデルです。last.ptは最後の学習結果の学習モデルです。

  • ホーム
    • yolov5
      • runs
        • exp — 学習実行結果
          • results.png — 学習経過の評価グラフ
          • results.csv — 学習経過の評価データ
          • opt.yaml — 学習実行時のオプション一覧
          • train_batch0.jpg — 学習データからサンプリングされたミニバッチ
          • val_batch0_labels.jpg — 検証データからサンプリングされたミニバッチ
          • val_batch0_pred.jpg — 検証データのミニバッチに物体検出実行検証結果
          • weight — 学習モデル
            • best.pt — 最も良い評価の学習モデル
            • last.pt — 最後の学習モデル
学習の早期停止(Early Stopping)

過学習を防止するため、オプション –patience によって指定された回数学習に改善が見られない場合に、学習を早期停止します。

Stopping training early as no improvement observed in last 100 epochs. Best results observed at epoch 805, best model saved as best.pt.
To update EarlyStopping(patience=100) pass a new patience value, i.e. `python train.py --patience 300` or use `--patience 0` to disable EarlyStopping.

このメッセージは、早期停止(early stopping)が実行され、最後の100エポックで性能の改善が見られなかったため、トレーニングが早期に停止されたことを示しています。最も優れた結果がエポック805で得られ、その時点のモデルが best.pt として保存されました。

実行結果 exp ディレクトリのファイルの一部を紹介します

学習モデルの学習経過の評価を示すグラフ ( results.png )

過学習により検出精度が落ちていないか等がわかります。

学習データからサンプリングされたミニバッチ ( train_batch0.jpg )

検証データのミニバッチに対して物体検出を実行した検証結果 ( val_batch0_pred.jpg )

独自に作成した学習モデルを使って物体検出をおこなう。

Nゲージ鉄道模型の学習データを使って作成した学習モデルを使って、実際に物体検出をおこなってみましょう。

データを以下のように配置しています。
学習モデルは best.pt を使用します。

  • ホーム
    • yolov5
      • data
        • detect — 検出対象データ
      • runs
        • detect
          • exp — 検出結果
        • train
          • weights
            • best.pt — 学習モデル

yolov5/data/detect ディレクトリに検出(推論)対象となるデータをコピーします。
yolov5/runs/train/weights ディレクトリに学習モデルをコピーします。

検出対象データには、jpgファイルとmp4動画を数本入れています。

物体検出の実行

学習モデルを指定して物体検出を実行します。

ShellScript
python3 detect.py --source data/detect --img 1280 --weights runs/train/weights/best.pt
detect.py の主なオプションの説明

https://github.com/ultralytics/yolov5/blob/fad57c29cd27c0fcbc0038b7b7312b9b6ef922a8/detect.py#L248

YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 d…
github.com
オプション説明既定値
source検出(推論)対象画像が格納されたディレクトリdata/images
img検出(推論)対象画像のサイズ640
weights学習モデルyolov5s.pt
conf検出被写体(クラス)検出信頼度の閾値0.25
save-crop検出座標でトリミングしたものを保存false
device使用プロセッサ
物体検出の実行結果

検証結果は yolov5/runs/detect/exp に保存されます。
exp ディレクトリは存在すると exp2 exp3・・・ と作られていきます。

画像に関しては、ほぼ問題ないですが一部呉検出しています。

「KOKI107-FL」が半分だけしか検出されていません。

動画の物体検知してみました

誤検知がありますが、Nゲージ鉄道模型の車種を検知しています。

物体検知精度をあげるにはどうするかを検証してみます

物体検知の精度を上げるには、

  1. 事前トレーニングモデルを精度の高いモデルを使用する
  2. 学習回数を増やす
  3. 学習データのかさ増し

の方法があります。

1. 事前トレーニングモデルを精度の高いモデルを使用する

事前トレーニングモデルを精度の高いモデルを使用と物体検知精度は上がります。
ハードウェアのリソースや実行速度などを勘案の上、どの事前トレーニングモデルを使うかを決定します。
同じ学習回数でも yolov5m.pt と yolov5m6.pt では精度に違いが出ます。
以下は学習回数 200 Epochs で学習したモデルを使用しています。

yolov5m.pt
yolov5m6.pt
yolov5m6.pt

事前トレーニングモデルの精度を上げることにより精度を高めることができます。

2. 学習回数を増やす

学習回数増やせば物体検知精度を高めることができますが、闇雲に学習回数を増やしたからといって無限に精度が上がるわけではありません。

学習モデルが過学習してしまうと、学習データにはよく適合しますが、汎用化性能が低下してAIの得意とする学習データと似ているデータの検知判断が硬直化してしまい、検出できるはずができない事象が発生します。

精度の高いトレーニングモデル程過学習しやすくなります。
学習データをかさ増しすことで、汎用性を上げることもできます。

学習不足による誤検知

適正な学習で適正な検知判断

過学習で検知判断が硬直化

事前トレーニングモデルを yolov5m に設定して、学習回数を変えた学習モデルを使って、物体検知した結果です。

50 Epochs
200 Epochs
300 Epochs
400 Epochs
500 Epochs
600 epochs
700 Epochs
800 Epochs

事前トレーニングモデル( yplov5m )の検出精度に限界があるようで、600 Epochs 以上は物体検出の精度が下がっているようです。400 Epochsで信用度に閾値を設けて( –conf 0.55 とか )誤検知ノイズを除去するのが現実的であるのかもしれません。

事前トレーニングモデルを yolov5m6 に設定して 400 Epochs すると。

yolov5m6 400 Epochs

検出精度も上がり、誤検知によるノイズもなくなりました。

3. 学習データのかさ増し

学習データの枚数を増やすのもそうですが、学習データにノイズを入れたり背景を変えたりなどの、学習データにバリエーションを持たせることも検出精度をあげることになります。

参考データ

学習モデル作成結果 (train.py)

Class : All

Weights : yolov5m.pt

EpochPRmAP50mAP50-95hours
500.99410.9950.90.079
1000.99610.9950.9290.155
1500.9940.9990.9950.9510.232
2000.9920.9940.9950.9580.310
3000.99610.9950.9810.462
4000.99710.9950.9840.615
5000.99710.9950.9890.768
6000.99710.9950.9910.921
7000.99710.9950.9921.172(*1)
8000.99710.9950.9951.223
926(*2)0.99810.9950.9931.566
12000.99710.9950.9941.832

Weights : yolov5l.pt

EpochPRmAP50mAP50-95hours
2000.99710.9950.9730.505
3000.99710.9950.9860.754

Weights : yolov5x.pt

AutoBatch: Using batch-size 9 for CUDA:0 9.19G/11.75G (78%) (*3)

EpochPRmAP50mAP50-95hours
2000.99710.9950.9690.999

Weights : yolov5m6.pt

EpochPRmAP50mAP50-95hours
500.9960.9890.9950.8810.090
1000.9960.9940.9950.9350.175
1500.9930.9990.9950.9470.259
2000.9930.9940.9950.9630.344
3000.99610.9950.9770.512
4000.9960.9980.9950.980.682
5000.99510.9950.9870.850
6000.99610.9950.991.020
805(*2)0.99710.9950.991.530
12000.99610.9950.9932.032

Weights : yolov5l6.pt

EpochPRmAP50mAP50-95hours
2000.99610.9950.9720.560

Weights : yolov5x.pt

AutoBatch: Using batch-size 7 for CUDA:0 9.29G/11.75G (79%) (*3)

EpochPRmAP50mAP50-95hours
2000.99710.9950.9731.097

(*1) バックグラウンドで他の処理ありのため影響が出ている可能性があります。
(*2) EarlyStopping(patience=100)で早期停止。
(*3) オプション –batch -1 を使用して AutoBatch で実行しています。

物体検出実行結果 (detect.py)

Speed: 0.4ms pre-process, XX.Xms inference, 0.8ms NMS per image at shape (1, 3, 1280, 1280)

Weightinference対yolov5m比
yolov5m22.5ms1.00
yolov5l40.2ms1.79
yolov5x72.7ms3.23
yolov5m623.8ms1.05
yolov5l642.4ms1.88
yolov5x678.9ms3.50

学習モデルサイズ (best.pt)

Weight学習モデルサイズ対yolov5m比
yolov5m42.2 MB1.00
yolov5l92.8 MB2.18
yolov5x173.1 MB4.10
yolov5m671.1 MB1.68
yolov5l6153.0 MB3.63
yolov5x6280.9 MB6.66