裏技公開！ AI映像解析で物体検出精度をあげる簡単テクニック



YOLOなどのAI（ディープラーニング・機械学習）の物体検出アルゴリズムは毎年のように進化します。しかしどんなに高い精度を誇るアルゴリズムでも、映像側の問題で正しく物体検出やトラッキングができない場合があります。ここでは検出元となる映像に簡単な工夫をすることで、今までの誤検出やトラッキングミスがうまくいった方法と事例について解説します。

# サマリー
**・	物体検出がうまくいかない映像とは？
・	物体検出がうまくいかない原因と対策（失敗）
・	意外な解決策（裏技公開）
・	参考：物体検出ミスと誤カウントの防止
・	参考：流入・流出の集計結果
・	まとめ
・	関連記事**

# 物体検出がうまくいかない映像とは？
交差点の映像から自動車の流入・流出を機械学習を使って自動検出することになりました。使用するライブラリはPytorchベースのYoloXで、トラッキングにはmotpyを使った自社の「Pedes BladeX」です。映像から車両を物体検知＆トラッキングし、交差点のどこから車両が出てきて、どこに向かうかを自動でカウントするシステムです。撮影時のカメラは固定で、以下のような映像です。[実際の解析前の素材映像（約5分）はこちら。](https://www.youtube.com/watch?v=0zMz8cyQndA)
![vlcsnap-2023-04-19-11h11m04s425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/37fd3aae-f710-8942-1ce1-f18f1c9bca0a.png)

映像は[株式会社サーベイリサーチセンター様](https://www.surece.co.jp/)からご提供いただいたもので、記事執筆にあたり弊社（株式会社コンピュータビジョン）で通行人の顔や車両のナンバープレートにマスキングを行いました。
映像はカメラアングル的には全く問題ありません。高所で撮影しているため車両の重なりが少なく、解像度も十分で（FHD）日中撮影のため明るさも問題ありません。道路はすべて双方向で、車がどこから来てどこへ向かうのか、合計12通りの組み合わせが発生します。
参考までに映像解析中のカウント画面は以下になります。
![参考：実際の検出映像黄マーカーなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/0bdf58f5-5928-6f2c-671a-c25fee6358ce.png)
※四叉路の4つの出入り口にあらかじめ4本のラインを置いて、車両が各々のラインと交差したときにカウントしています。

この映像なら楽勝だな・・・と思ってテストしてみたところ、ある部分の物体検出やトラッキング成績が悪いことが分かりました。ここです（画像の赤枠部分）。
![赤枠_検出に問題がある部分.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/81b62b68-27c8-e152-5c83-d384d599c51a.png)

建物の日陰部分に街路樹があり、通過する車が一瞬街路樹に隠れます。しかし車の全体が隠れるわけではないため、人間の眼的にはそれほど問題があるようには見えませんでした。
しかし実際に確認したところ、ここを車両が通過する際に物体検出がゴチャゴチャしてしまい、正しくトラッキングできなくなる場合がありました。例えば以下のように右折してきた黒いタクシーは当初ID=14で検出されていますが、赤枠部分を通過すると通過後にはID=17になります。[実際の映像はこちら（開始後約40秒くらい）](https://www.youtube.com/watch?v=7lL3DL8qYkg)。ほかにも映像の冒頭でもトラッキングミスが発生しています。

| (1) ID=14で検出 | (2) ID=14と17に分裂 | (3) 最終的にID=17で通過 |
| :---: | :---: | :---: |
|![ID=14の誤認識-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/f13139ae-f884-c998-7f10-40e228ab0138.jpeg)|![ID=14の誤認識-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/22d37867-4398-0a42-9834-be8df235da3f.jpeg)|![ID=14の誤認識-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/d04e4357-a54d-5115-66a5-80b9764a3360.jpeg)|

この部分だけで、5分間で13台も通過するので物体検出の失敗は看過できません。特に今回は車両が交差点のどこからどこへ移動したかをカウントする要件のため（詳細については後述）、誤検出や正しくトラッキングできない場合は調査の意味がなくなります。

# 物体検出がうまくいかない原因と対策（失敗）
調べたところ、物体検出が失敗する（通過時に当初のIDから別IDに変わってしまう）のは、車体の色が黒い車両であることが分かりました。5分間の映像で黒い車両が6台、それ以外の色の車が7台通過しますが、黒い車は6台中2台でトラッキングミスが発生します。黒い車両に限って言えば約33%の誤検出率なので、無視できません。この問題個所を通過する車両のトラッキング成績は、車両の色で分けると表１のようになります。

**・表1：mモデルを使った場合の問題個所通過時のトラッキング成績**
|車両の色|トラッキング完璧|トラッキング成功|トラッキング失敗|合計|
| :--- | :--- | :--- | :--- | :--- |
|黒|1|3|2|6|
|黒以外|5|2|0|7
|トータル|6|5|2|13|

※「トラッキング完璧」は問題個所通過前後で当初IDが変更されないもの
※「トラッキング成功」は問題個所通過前後に重複IDが一部発生するが当初IDが変更されないもの
※この物体検出では映像は1080p、モデルはyolox_m.pthを使いました。

また誤検出が発生する理由ですが、どうやら街路樹の影が、黒い車両の一部と判断されてしまうようです。
これに対処するため、最初に思いついたのはモデル（pthファイル）のグレードをあげてみることでした。
YOLOXには処理速度重視のnanoから検知率重視のXまで6種類のモデルがあり、当初はyolox_m.pthを使っていましたが、これを2段階上のyolox_x.pthに変更しました。
yolox_x.pthにすると処理速度が余計にかかりますが物体検出の精度は上がるはず。
しかし結果的には表2の通りイマイチでした。[問題個所の比較映像はこちら](https://www.youtube.com/watch?v=rzqSLoughQQ)。


**・表2：xモデルを使った場合の問題個所通過時のトラッキング成績**
|車両の色|トラッキング完璧|トラッキング成功|トラッキング失敗|合計|
| :--- | :--- | :--- | :--- | :--- |
|黒|0 (-1)|2 (-1)|4 (+2)|6|
|黒以外|7 (+2)|0 (-2)|0|7|
|トータル|7 (+1)|2 (-3)|4 (+2)|13|

※この物体検出では映像は1080p、モデルはyolox_ｘ.pthを使いました。
※カッコ内の±は表1との比較。

黒い車両が6台中4台でトラッキングミスを起こしており、悪化しています（逆に黒以外の車両では完璧にトラッキングできたものがyolox_m.pthの7台中4台から7台中7台に増えています）。比較映像(1)を作成しましたが、肝心の黒い車両で成績が悪化しているので使えません。

この後、YOLOXの物体検知閾値を下げてみたり、トラッキングの設定を変更してみましたが効果が見られなかったり、他に悪影響が出たりと問題解決に至りません。
いろいろ試した中で唯一効果があったのは、映像の解像度を1080pから720pに落とした場合でした。なんと720pに落とすと表3の通り、黒い車両が6台中5台トラッキングできるようになりました（モデルはyolox_m.pthを使用）。しかし0にはできません。

**・表3：720P映像を使った場合の問題個所通過時のトラッキング成績**
|車両の色|トラッキング完璧|トラッキング成功|トラッキング失敗|合計|
| :--- | :--- | :--- | :--- | :--- |
|黒|4 (+3)|1 (-2)|1 (-1)|6|
|黒以外|5 (+0)|2 (+0)|0 (+0)|7|
|トータル|9 (+3)|3 (-2)|1 (-1)|13|

※この物体検出では映像は720p、モデルはyolox_m.pthを使いました。
※カッコ内の±は表1との比較。

ここまで頑張りましたが、どうやらYOLOXだけで何とかするのは難しいようです。

# 意外な解決策（裏技公開）
ふと思いついたのが、「街路樹の影が車に混ざって誤検知されるなら、街路樹を別の色にしてみてはどうだろう？」というアイデアです。

そこで街路樹に黄色のペイントを置いてみました。街路樹は動くわけではないため、映像編集で図のように黄色く塗ったPNG画像をオーバーラップさせただけです。
![マーカー置いた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/7fe222fc-dfbc-2e7f-8bcc-312178258e10.png)

非常に単純な思い付きですが、実はこれが効果てきめん。
これまで誤検出されていた黒い車両が6台すべてトラッキングできるようになりました（表4参照）。完璧にトラッキングできるようになったのも6台中1台から2台に増えています（表2との比較）。[問題個所の比較映像（マーカーのなし・あり）はこちら。](https://www.youtube.com/watch?v=4lCGYK2XCXI)

元映像の状態でトラッキングに失敗した右折の黒いタクシーはこんな感じでトラッキングできるようになりました。一時的に別IDが割り振られても、最終的に当初のID（ここではID=12）でトラッキングできた場合、「トラッキング成功」としてカウントしています。

| (1) ID=12で検出 | (2) ID=12と15に分裂 | (3) 最終的にID=12で通過 |
| :---: | :---: | :---: |
|![ID=12の認識-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/ea8059e8-4a94-d803-d579-dcab8202a458.jpeg)|![ID=12の認識-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/d23388ca-36b6-161b-246b-e7dcaa93d4bc.jpeg)|![ID=12の認識-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/d0a30798-a7d9-56f9-5041-7634f40c92f5.jpeg)|

**・表4：マーカーありの場合の問題個所通過時のトラッキング成績**
|車両の色|トラッキング完璧|トラッキング成功|トラッキング失敗|合計|
| :--- | :--- | :--- | :--- | :--- |
|黒|2 (+1)|4 (+1)|0 (-2)|6|
|黒以外|6 (+1)|1 (-1)|0 (+0)|7|
|トータル|8 (+2)|5 (+0)|0 (-2)|13|

※この物体検出では映像は1080p(マーカー付き)、モデルはyolox_m.pthを使いました。
※カッコ内の±は表1との比較。

なお「いちいち映像を編集するのも面倒だな」と思い、YOLOXに検出させる画像1コマずつにPNGを合成することにしました。この処理の追加により5分間30fpsの映像を処理するのに約2分30秒かかっていたのが、3分20秒かかるようになりました。1.34倍です。8時間の映像だと2.67時間余分にかかることになります。時間投資という意味では微妙ですが、手軽にテスト・変更できるのでヨシとしましょう。8時間の映像をレンダリングするのにも時間はかかるし。
なお今回は5分間の映像なので太陽の位置は変わりませんが、長時間の映像になると似たような検出ミスが別の個所でも発生する可能性があります。

また今回はあまり深く考えず黄の単色マーカーを置きましたが、黄色い車両で誤検出を起こす可能性があります（今回の映像では出現していませんが）。よってマーカーは赤と黄色のストライプなど、車両ではありえない色と模様にした方が良いかもしれません。

# 参考：物体検出ミスと誤カウントの防止
ところで映像では、車両を最初から最後まで一つのバウンディングボックスでトラッキングできるのが、マーカーありでも13台中8台です。それ以外はバウンディングボックスが部分的に2重に現れることがあります。
例えばこんな感じです。
![物体検出ミス？.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/150f6100-f7e7-d488-dc30-7e356a43d989.png)

ID=55で検出されたミキサー車がID=56で2重検知され、しかもブルーのラインを超えてID=56がB0でカウントされています。
「これだと車両のカウントも信頼できないのでは？」と思われるかもしれません。しかしこれはPedes BladeXでは問題ありません。なぜならばPedesBladeXでは「あるIDが2個のラインを超えた場合のみをカウント対象とする」からです。ID=56はブルーのラインではカウントされていますが、他のラインを超えていないためカウント対象にはなっていません。もう少し詳しく説明すると、4本のラインそれぞれに2つの方向性を持たせ、指定した12通りの組み合わせのいずれかに含まれていないとカウントしません。これにより誤カウントを除去しています。

具体的には例えば赤いラインを下から上に超えた時は「R0」、逆に上から下へ超えた時は「R1」が記録されます（これを交差記録と呼びます）。画面下側から来た車が右折すると、RO⇒P1の交差記録を持ちます。直進して青のラインを超えるとR0⇒B0の交差記録を持ちます。逆のB0⇒R0の組み合わせはあり得ないため、12通りの組み合わせには含みません。今回自動カウント用に登録した組み合わせは「R0⇒G0,R0⇒B0,R0⇒P1,G1⇒R1,G1⇒B0,G1⇒P1,B1⇒R1,B1⇒G0,B1⇒P1,P0⇒R1,P0⇒G0,P0⇒B0」の12通りです。これがこの交差点で発生しうる流入・流出の全ての組み合わせとなります。

よって一瞬だけ表示されるような誤検出は最終的には誤カウントにはならないわけです。逆に言うと黄色のマーカーを置く前のように「ラインを通過したのにIDが変わる」場合は、正しいカウントにはなりません。また大型な車両の陰に完全に隠れてしまってトラッキングが外れてしまうと、カウントできなくなります。この映像では合計2台で正しくカウントできませんでした。これはトラッキング機能をもう少し工夫する必要がありそうです。
なお映像内のR0やR1の横にはカウンターが付いていますが、これは単純に「ラインを（この方向に）通過したか？」を映像的に確認するのが目的のため、実際の流入・流出の集計では利用しません。

参考：流入・流出の集計結果
参考までに5分間の交差点映像から流入・流出を算出した結果は次の通りです。流入（どこへ行ったか）と流出（どこから来たか）の2通りで表しましたが、集計のグルーピングを変えるだけなので1度の処理で流入・流出の両方を出すことができます。

**・表5：流入のカウント結果**
![流入表.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/9488c3f8-979b-13b5-f759-b418a942e0ba.jpeg)

**・表6：流出のカウント結果**
![流出表.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140663/351b28fb-b88e-6219-b146-e6e3d9720908.jpeg)


今回は車線数も少ない小さな交差点でしたが、何車線もある巨大な交差点でも基本的なカウント原理（あらかじめ指定された2個の組み合わせの交差記録を持つ同一IDをカウントする）は同じです。
人力でカウントすると1つの交差点を4人で担当する必要があったり、流出か流入のどちらか一方しかカウントできません。今回のように映像のクオリティが良い場合は、映像解析の効果は高いと言えるでしょう。

# まとめ
・アングルや解像度に問題がない映像でも、部分的に物体検知やトラッキングが失敗することがある。
・今回は樹木の影と、黒い車両の組み合わせで物体検知できなかった。
・モデルをアップグレードしても解決しなかった⇒YOLOXだけで解決するのは困難と判断。
・樹木の陰の部分を黄色で塗りつぶすと、トラッキングエラーがなくなった（裏技部分）。
・映像編集が面倒ならリアルタイムで合成した画像を検出対象としてもいいが、処理時間が1.34倍になった。
・Pedes BladeXでは2つの交差記録を持つIDのみカウントしているので、一時的な2重検知のノイズに強い

**（ちょっと宣伝）株式会社コンピュータビジョンは、AI（機械学習）による映像解析に関するノウハウが豊富です。お気軽にご相談ください。**

# 関連記事
・[2023年：24時間以上ストリーミングさせるとトラブルばかりで苦労した](https://qiita.com/ComputerVision/items/26a72a3f83fcf6c5d0d1)
・[2022年：AI映像解析で車両の速度を自動算出すると異常値ばっかりで苦労した](https://qiita.com/ComputerVision/items/fcd39dcb272edf37518c)
・[2022年：YOLOXの映像解析で車両の速度をAIで算出して渋滞を判定するのに苦労した～その１：リアルタイム処理編](https://qiita.com/ComputerVision/items/5283a0ebbb59d5a4cb8f)
・[2022年：YOLOXの映像解析で車両の速度をAIで算出して渋滞を判定するのに苦労した～その２：速度算出手法編](https://qiita.com/ComputerVision/items/a86f20673df6b6536345)