物体検知AIモデルの軽量化
突然ですが、「AIモデルの軽量化」に興味はありませんか?昨年末にご紹介した『AIモデル軽量化技術「PCAS」使ってやってみた!』では、実際の事例を交えながら、この技術がどんな可能性を広げるかを掘り下げてみました。実際、自分自身で試行錯誤しながらやってみたので、やってみたいアイデアが次々に湧き出てきたので、新しい挑戦に踏み出すことにしました!
「前回見逃しちゃった…」という方もご安心ください。以下にリンクを貼っておきますので、ぜひチェックしてみてくださいね。
では、本編スタート!
小野くん、突然ですが、今回でブログは終了となります。
え?!?!今回が最終回なんですか?!なんでですか?こんなに頑張ってるのに・・・
いや、実はね、AIモデル軽量化に何度もトライしていたのを見ていたけど…。奥深すぎて時間がかかりすぎて永遠に終わらないと思いました。だから、もうどこかで区切りをつけたほうがいいかなと思ってね。
いやいやいや、むしろ「終わらない」からこそ、このブログの存在意義があるんじゃないですか!これを楽しんでくれてる読者もいるんですから続けるべきです!
ハッキリ言わせてもらうが、この先のブログが続くかどうかは…君にかかっているのだよ。
そ、そんな大役を!?いやでも、僕ならやれますよ、絶対に!だって、もう、今回のネタもしっかり仕込んできましたから!期待してください!
チャンスは最大限に活かす、それがボクの主義だ!
なるほど、それを聞いて少し安心しました。それじゃあ、今回のできで判断しようじゃないか。期待しています。
僕が本気を出せば、このブログはまだまだ進化できる!心配ありません、いざ新しい挑戦、スタートです!
というわけで、渉さん、今回がブログの最終回とならないようにお願いしますね!!。
読者の皆さんも同じくショックですよね…。でも大丈夫です。
ブログが続くかどうかのカギはボクたち次第!特に今回は、「PCAS」を活用したAIモデル軽量化の新たな可能性を深掘りしてみようと思っているんです。
いいね!それなら納得だ!
検証したいことがあるって言ってたもんな。任せてくれ!
で、どんなことを試したいんだい?
前回までは、画像分類のモデルを軽量化しましたよね。今回は、実際の現場でもよく使われている物体検出モデル「YOLO」を、「PCAS」を使って軽量化してみたいと思います。
というのも、物体検出のデータセットである「COCO」を使ったAIモデルを軽量化してみたい、というご相談をいくつかいただいているんです。ミッションとしても挑みがいがあります。なので、これを実際に軽量化してみて、精度やモデルサイズへの影響を確認したいと思います。
YOLOか!それは本格的でいいね!確か、CIFAR10よりもモデルが大きくなる分、軽量化の効果が出やすいかもしれないな。でも実際にやってみないと結果はわからないからね…。
ですよね!そういう未知の部分が面白いんです!早速やってみましょう!
「YOLO」とは
物体検出のAIと言えば「YOLO」ですよね。一口に「YOLO」と言っても、いろいろなバージョンがあると聞いてるんですが・・・。
そうだね。ところで、「YOLO」が何の略か知ってる?「YOLO」は「You Only Look Once」の略で、その言葉の通り一度の画像処理で物体検出を行うアルゴリズムだ。そのリアルタイム性が最大の特徴で、進化を重ねて多くのバージョンが開発されてきたんだよ。
そんな技術が進化を続けているなんて、めちゃくちゃ面白そうです!最近では、「YOLOX」と「YOLOv8」が注目されていると聞いてますが、詳しく教えてもらえますか?
「YOLOX」は、「Anchor-Free」という技術を採用しているのが大きな特長だね。「Ancho」っていうのは、物体を探す際に基準になる枠のことで、従来のモデルでは重要だった。でも「YOLOX」はこの「Anchor」を省いて計算負荷を軽減しているんだ。そのおかげで、柔軟性が高く、監視カメラやドローンの障害物回避といったリアルタイム性が重要な用途に最適だと言われているんだ。
へぇー。リアルタイム性が求められる場面は非常に多いですから、幅広い用途で使えそうですね!
じゃあ「YOLO v8」はどうなんですか?
「YOLO v8」はさらに高い精度と汎用性を向上させているんだよ。「転移学習」の機能を搭載していて、少ないデータでもニーズに合わせて再学習が可能なんだ。たとえば、医療分野での異常検知や、自動運転での標識認識などに活かされているよ。
なるほど、状況によって使い分けられているんですね。
他にもユニークなバージョンってあるんですか?
あるよ。「Tiny-YOLO」っていう軽量版があるんだ。これは性能はちょっと抑えられているけど、その分小さなコンピューターやリソースが限られているデバイスでも使いやすいようにできているんだ。たとえば、ラズパイみたいな小型デバイスにも対応できるんだ。現場での即時利用が求められる場面では、重宝されているんじゃないかな。
じゃあ、これからもどんどん広がっていく感じですね。
いろいろ迷いますが、今回は柔軟性が高く、省リソース向けとしても注目されている「YOLOX」のモデルを、『PCAS』を使って軽量化してみましょう!
いざ、軽量化!
今回はCIFAR10よりも規模が大きいから、かなり時間がかかりそうだな。前回はグラフィックカード1枚でやったけど、今回は4枚に増やしたぞ。環境を確認してみてくれ。

ホントだ!今回はTesla V100-SXM2-32GのGPUが4つも!4つのGPUを使って軽量化を行えるなら、前回よりも学習スピードはかなり速くなりそうです。ちなみに、PCASツールから、直接GPUの数を指定することなんてきるのでしょうか?
もちろんできるさ。「devices」という引数を指定すれば、使用するGPUの数を簡単に指定できるんだ。
データセットは「COCO」を使用します。ちゃんと学習用の画像データTrain2017、評価用の画像データval2017、そして、アノテーションデータannotationsファイルが揃ってます。準備完了です!
それじゃあいよいよ軽量化を実行しよう。
データセットがサーバーに保存されていることを確認しておいてね。
はい、データセットもバッチリ保存されています。
それじゃあ、実行してみますね。
ポチっとな。
python examples/detection/train_meg.py \
--outdir /path/to/output \
--data_dir /path/to/coco \
--dataset coco_meg \
--model yoloxm_meg \
--pl_module detector_meg \
--mode train \
--pcas_max_iters 6 \
--max_epochs 300 \
--learning_rate 0.01 \
--finetune_lr_ratio 0.3 \
--batch_size 8 \
--devices 4 \
数時間後…
結果が出ま…せん。出ていない?!どうなっているんだ!?全然計算が完了していない…。1エポック完了するのに、20分弱かかっています。
えーっと、300エポックを6回繰り返すので、1800エポック…。1エポック完了するのに20分かかるなら、36000分。てことは…約25日、つまり1ヶ月近くかかる計算だ。。。
約1ヶ月?!評価のためだけに1ヶ月もかかるんじゃ、やってられないですよ…
うーん、考えてみれば、「COCO」の学習データは画が約118,000枚もあるし、データ全体で20GBにもなるから…。
さすがにこれは大規模すぎたようだ。
まさに「スケールが違う」挑戦だわな・・・
冗談言ってる場合じゃないですよ!
データを減らさないと現実的な時間で評価結果が得られませんね・・・ここは精度は多少低くなると思いますが、データセットを減らさないとですかね。
調べてみたら、「COCO128」という画像を厳選した小規模のデータセットがあるな。これはAI実装開発のデバッグ用に使われるものだけど、次はこれで試してみようか。これなら、だいぶ軽くなるはずだよ。
「COCO」のミニ版みたいな感じですね。
アノテーションと評価用のデータも準備完了!
もう一度ポチっとな!
3日後…
ポチっとしてから、3日が経ちました。長い時間がかかりましたが、ようやくPCASのスクラッチ学習と軽量化処理が完了しました。
よし、まずは精度を確認しよう。物体検知における精度の指標として「AP50(Average Precision at IoU 0.5)」という数値が使われるんだ。これをチェックしていこう。
ふむふむ…。あれ?
AP50がところどころ「iteration」において「0」になっていますね…。
軽量化実施回数 |
val/AP@0.5 |
損失(Loss) |
モデルサイズ(MB) |
学習 |
0 |
17.00109482 |
96.9 |
1回目 |
1.953125*10^-3 |
13.58625031 |
74.3 |
2回目 |
1.725501*10^-310 |
16.02896500 |
59.0 |
3回目 |
0 |
13.87439728 |
44.3 |
4回目 |
0 |
13.93522644 |
35.7 |
なるほど・・・これは学習データ不足が原因だろうな。今回使った「COCO128」はあくまでもデバッグ用につくられたデータセットだから、学習に必要な情報が圧倒的に足りなかったんだなぁ。それに評価用の画像データもたった5枚しか用意してなかったから、精度の面でも限界が出た感じだな・・・
逆に言うと、最初のスクラッチ学習の段階で精度を出すには、やっぱり「COCO」のような118,000枚以上大規模な画像データが必要になるということですね…。80クラスに分類しようとしているから、1クラスあたり約1500枚が最低限必要になる計算になりますか。
そうだね。それに加え「COCO」の評価用画像データもそれなりに数が必要だ。「COCO」の評価用画像データは5000枚もあるからね。でも、損失は計算できているよ。これを見ると学習のプロセス自体は進んでいて、損失が減少傾向っぽいから収束に向かっていたのかもしれないな。
それに気づいたのですが、PCASのループ毎にチェックポイントファイルのサイズが削減されているのが確認できますね。たとえば、最初は96.9MBだったのに、4回目には35.7MBまで減少してます!
モデルサイズは確実に軽量化されています。
確かに。元が96.9MBだったのに対して、4回軽量化で35.7MBまで削減。割合で計算すると、63.2%削減できていることになる。これは効果をしっかり見て取れるデータだよ。
ということは、前回のような画像分類AIモデルと同じようにに『PCAS』による軽量化は、物体検出モデルに対しても効果があることはわかりましたね!
最後に…
「YOLO」のような物体検知でも『PCAS』による軽量化はしっかり効果を発揮することがわかりましたね。精度に関してはまだまだ検証が必要ですけど。ただ、最初に検証したときのように、学習と軽量化に「1ヶ月かかる」というのは正直ありえないですよ!時間短縮の工夫は必須です!
時間短縮の手としては、たとえば、分類するクラス数を減らすのはどうかな?学習に必要な画像データの数自体も減らせるから、効果が出そうだよね。
それ確かに良さそうです!
あとは、スクラッチ学習時のバッチサイズをもう少し大きくするのも手かもしれません。開発環境のGPUスペックには依存するんですけど、計算効率の観点から検証する価値はあると思います。
それと、前回「圧縮率」を変えたのを覚えてるよね。「圧縮率」を大きく設定して、PCASループの回数を減らすのも一つの手だね。
その手もありましたね!モデルサイズを小さくできれば、デモでよく使っていた「Kria™」や「Alveo™」のようなデバイスに搭載したとき、さらに快適に動作しそうです。エッジコンピューティングの分野では、このような取り組みはますます求められるはずです!
だな!他にも「セグメンテーション」や「姿勢検知」みたいなモデルを軽量化した結果も気になるよな。試してみて、このブログで紹介するのも面白そうだと思うんだけどね。
でも・・・冒頭で話があったように、「でき次第で最終回」なんですよね。正直、ちょっと中途半端な結果になっちゃったのが悔しいです。改善案も出てきたのに・・・
それだけじゃなくて、まだまだ紹介しきれていない技術や、これから登場するサービスも紹介したかったのに。。。
あ、ボス。
どうです?この結果なら、続ける価値があると思いませんか?
それが言いたくて来たんですが、結論から言うと・・・
いや。逆だよ。ブログの継続を認める!
次の展開が本当に気になります。
君たちの努力を認めましょう!
ただし・・・今回最終回だという話は誤解のないように説明しておくが。これは、今年度の締めの記事、つまり「今年度の最終回」という意味です。
来年度4月からも、いつも通り更新を頼みます。
これからも、読者が楽しめる内容を期待しています。
だ、騙された。。。エイプリールフールには早いですよ!
ちゃんと言ってくださいよ!!でも、続けられるならやる気がまた湧いてきました。
よーし!来年度もさらに面白い記事をお届けしていきます!。
やれやれ、そういうことだったのか・・・
いいオチがついたな(笑)
そもそも、終わってしまったら、私のファンが黙っていないですよ(笑)。
まだまだ当社のテックブログは続きます!
今後をお楽しみに!!
次回のブログ更新は4月を予定しています。
お楽しみに!
- ※記載されている会社名、製品名は、各社の商標または登録商標です。
- ※ここに記載されている仕様、デザインなどは予告なしに変更する場合があります。