Armadilloフォーラム

yolov5で作成した学習データをtfliteへ変換した際の検出モデルの精度低下について

yuki.shigefuji

2023年4月21日 9時22分

お世話になっております。

アルマジロで検知システムを作成する際にtflite型の学習データを使用しています。
この学習データを作成する手段として、yolov5で学習を行い作成したファイルをexport.pyを使用しtfliteへ変換しそれを使用しています。

しかし現在の方法では ttps://lab.mo-t.com/blog/object-detector-quantization こちらで記載されているように、10~15%程度認識率の低下が起こってしまい、
正確性がどうしても下がってしまう状況となっています。

過去にこのような状況に対処したケースがあれば教えていただきたく存じます。
また、そうでなくとも正確性の低下に対する対策など出来ることがあれば教えていただきたいです。

よろしくお願いいたします。

コメント

at_akihito.irie

2023年4月21日 11時21分

入江です。

推論モデルの量子化による精度の低下は避けようのないことですので、
量子化とは別な箇所で精度の向上を図るべきだと思います。

以下では精度の向上につながる方法をいくつか紹介しますが、大前提として
Armadillo-IoT ゲートウェイ G4に搭載しているNPUの処理能力には限りがあります。
推論速度と精度は基本的にトレードオフですので、色々試してお客様が納得できるラインを模索
して行く上で、精度を上げる=速度は下がることは念頭に置いておいてください。

1. 入力画像の解像度を上げる

学習時に使用するtrain.pyに渡す--imgパラメータを大きな数値にすることで、
入力する画像の解像度を高くすることです。

これによって入力する画像の情報量が増えて、精度の向上につながるはずです。

2. yolov5のベースモデルサイズを大きくする

一口にyolov5と言っても、ベースモデルのサイズ毎にyolov5s、yolov5m、yolov5l、yolov5x
という種類が用意されています。
大きいモデルであればあるほど、精度は向上します。

3. 学習データを見直す

学習データの内容に偏りがあったり、学習データの量自体が少ないと精度が落ちる場合
がありますので、こちらも考慮する必要があります。

4. yolov5以外の推論モデルを試してみる

yolov5は比較的処理量が大きく、かといって精度が他のどのモデルよりも高いというわけではない推論モデルです。

少しハードルは高いかもしれませんが、他のモデルでは量子化をしても満足のいく精度を維持できる
ものもあるかもしれません。

これについては、当方ではyolov5と、より精度の低いmobilenetしか試せておりませんので、具体的な
アドバイスができず申し訳ございません。

yuki.shigefuji

2023年4月25日 9時42分

返信が遅くなり申し訳ありません。

頂いた解法とは別となってしまう質問ですが。ResNetを用いた推論モデルをtflite型へ変換することは可能、もしくは行った事例はありますでしょうか。
手段の一つとして調査していましたが実施例が見つからなかったため一度お聞きしてみたく存じます。

お手数をおかけしますがご確認よろしくお願いいたします。

> 入江です。
>
> 推論モデルの量子化による精度の低下は避けようのないことですので、
> 量子化とは別な箇所で精度の向上を図るべきだと思います。
>
> 以下では精度の向上につながる方法をいくつか紹介しますが、大前提として
> Armadillo-IoT ゲートウェイ G4に搭載しているNPUの処理能力には限りがあります。
> 推論速度と精度は基本的にトレードオフですので、色々試してお客様が納得できるラインを模索
> して行く上で、精度を上げる=速度は下がることは念頭に置いておいてください。
>
> #### 1. 入力画像の解像度を上げる
>
> 学習時に使用するtrain.pyに渡す--imgパラメータを大きな数値にすることで、
> 入力する画像の解像度を高くすることです。
>
> これによって入力する画像の情報量が増えて、精度の向上につながるはずです。
>
> #### 2. yolov5のベースモデルサイズを大きくする
>
> 一口にyolov5と言っても、ベースモデルのサイズ毎にyolov5s、yolov5m、yolov5l、yolov5x
> という種類が用意されています。
> 大きいモデルであればあるほど、精度は向上します。
>
> #### 3. 学習データを見直す
>
> 学習データの内容に偏りがあったり、学習データの量自体が少ないと精度が落ちる場合
> がありますので、こちらも考慮する必要があります。
>
> #### 4. yolov5以外の推論モデルを試してみる
>
> yolov5は比較的処理量が大きく、かといって精度が他のどのモデルよりも高いというわけではない推論モデルです。
>
> 少しハードルは高いかもしれませんが、他のモデルでは量子化をしても満足のいく精度を維持できる
> ものもあるかもしれません。
>
> これについては、当方ではyolov5と、より精度の低いmobilenetしか試せておりませんので、具体的な
> アドバイスができず申し訳ございません。
>

at_akihito.irie

2023年4月25日 10時15分

入江です。

申し訳ございませんが、当方ではResNetの量子化tfliteの生成を試したことはありません。

多くの推論モデルの量子化の手順はどのモデルであってもほぼ同じです。

以下で紹介しているモデルは全て量子化した上で、Armadillo-IoT ゲートウェイ G4で動作確認をしています。
https://github.com/atmark-techno/armadillo-iot-g4_model_zoo
「量子化 Colab Note」があるモデルについては、そのモデルを量子化する際の手順をJupyter Notebook形式
でまとめていますので参考になさってください。

しかし、モデルによって量子化出来ないものや、量子化できても使い物にならない精度になってしまうものもあります。
これは実際に量子化した上で確かめてみる他ないと思います。

yuki.shigefuji

2023年4月26日 10時05分

承知いたしました。

重ねてお聞きする形かつ学習モデルについてになってしまうので申し訳ないのですが、現在検知対象を人物の顔部分の装着状況と手袋(色複数)の有無、
特定の物体(ゴミ箱のような)の計5つの検知を一つのモデルで行っております。
例えばこれをアルマジロでモデルを顔の状況と物体、手袋の着用状態を別々のモデルで行うような場合リアルタイム検知は性能的に可能なのでしょうか。
現在使用しているモデルは約7.3FPSあたりで動作していますが平均FPSも下がってしまいますでしょうか。

機械学習モデルを2つ(手の領域検出、手の骨格推定)使用したと拝見したのでこのような質問をさせていただきたいと思ったためお手数をおかけしますがご確認よろしくお願いいたします。

> 入江です。
>
> 申し訳ございませんが、当方ではResNetの量子化tfliteの生成を試したことはありません。
>
> 多くの推論モデルの量子化の手順はどのモデルであってもほぼ同じです。
>
> 以下で紹介しているモデルは全て量子化した上で、Armadillo-IoT ゲートウェイ G4で動作確認をしています。
> https://github.com/atmark-techno/armadillo-iot-g4_model_zoo
> 「量子化 Colab Note」があるモデルについては、そのモデルを量子化する際の手順をJupyter Notebook形式
> でまとめていますので参考になさってください。
>
> しかし、モデルによって量子化出来ないものや、量子化できても使い物にならない精度になってしまうものもあります。
> これは実際に量子化した上で確かめてみる他ないと思います。
>

at_akihito.irie

2023年4月26日 10時54分

入江です。

> 現在使用しているモデルは約7.3FPSあたりで動作していますが平均FPSも下がってしまいますでしょうか。

場合によりますが、基本的には遅くなると思います。

お客様のやりたいことは、全て「物体検出」で実現できるものと思います。
そうであれば、推論モデルをわけるメリットはあまりないです。

手指検出デモで2つのモデルに分けているのは、「物体(手)検出」と「骨格推定」で異なることを
それぞれしているために分けています。

「現在使用しているモデル」が例えばyolov5と仮定しますと、検出できる物体の種類が増えても減っても、
基本的に推論速度は変わりません。
そのため、検出できる物体を2つのyolov5モデルに分けると単純に2倍の時間がかかるはずです。

検出精度の観点からも、十分な量の学習データがあれば分けても分けなくても精度に影響は少ないはずです。

ちなみに、手指検出の推論速度は、以下の動画の左上の数値を参照してください。
https://www.youtube.com/watch?v=E9dYSni7pBc
物体検出と、骨格推定それぞれ推論する時間がかかっていることがわかります。
(とはいってもそこまで推論に時間はかかっておらず、実際手指検出デモで一番動作が遅いのは描画部分です)

yuki.shigefuji

2023年4月26日 11時17分

入江様

迅速なレスポンス感謝いたします。

学習モデルを分けることなく出来るとのお話から少しご相談になるのですが、
検出対象:1.帽子or白ヘルメットを被った人間が保護ゴーグルをしている
     2.帽子を被った人間が保護ゴーグルをしていない
     3.手袋(緑、袖長青)をしている
     4.手袋をしていないor白の手袋を着用している
     5.ドラム缶

以上の検出対象で学習モデルを作成する際に必要とされる一つのタグ毎の画像アノテーション数や背景、照度などの場所によって変わる条件などは
どの程度収集することが望ましいのでしょうか。

先ほどのご質問はこれらの認識率が著しく悪く誤検出や検出漏れが多大に見られたためあげたものとなっており知見が御座いましたらご意見いただければと存じます。
お手数をおかけしますがご確認よろしくお願いいたします

> 入江です。
>
> > 現在使用しているモデルは約7.3FPSあたりで動作していますが平均FPSも下がってしまいますでしょうか。
>
> 場合によりますが、基本的には遅くなると思います。
>
> お客様のやりたいことは、全て「物体検出」で実現できるものと思います。
> そうであれば、推論モデルをわけるメリットはあまりないです。
>
> 手指検出デモで2つのモデルに分けているのは、「物体(手)検出」と「骨格推定」で異なることを
> それぞれしているために分けています。
>
> 「現在使用しているモデル」が例えばyolov5と仮定しますと、検出できる物体の種類が増えても減っても、
> 基本的に推論速度は変わりません。
> そのため、検出できる物体を2つのyolov5モデルに分けると単純に2倍の時間がかかるはずです。
>
> 検出精度の観点からも、十分な量の学習データがあれば分けても分けなくても精度に影響は少ないはずです。
>
> ちなみに、手指検出の推論速度は、以下の動画の左上の数値を参照してください。
> https://www.youtube.com/watch?v=E9dYSni7pBc
> 物体検出と、骨格推定それぞれ推論する時間がかかっていることがわかります。
> (とはいってもそこまで推論に時間はかかっておらず、実際手指検出デモで一番動作が遅いのは描画部分です)
>

at_akihito.irie

2023年4月26日 14時27分

入江です。

> 以上の検出対象で学習モデルを作成する際に必要とされる一つのタグ毎の画像アノテーション数や背景、照度などの場所によって変わる条件などは
> どの程度収集することが望ましいのでしょうか。

YOLOv5公式のissueのコメントがよくまとまっているのでこちらを参照してください。
https://github.com/ultralytics/yolov5/issues/2313#issuecomment-787128847

上記コメントでは、YOLOv5開発者の方が高い精度を得るために学習時から注意することをまとめてくださっています。

学習データの内容についてですが、機械学習アプリケーションが組み込まれた最終製品の設置場所が固定で、そこから
見える背景などがある程度固まっている場合は、それに寄せたデータセットを用意すればいいと思います。
しかし、設置場所が未定であるような場合は、いかなる場合にも対応できるように、様々な背景、照度などをカバーした
データセットを用意する必要があります。