はじめに
コンピュータビジョンにおける重要なタスクの一つに、Image Inpainting(日本語では「画像修復」などと呼ばれます)があります。
「Inpainting」という言葉は、あまり聞き馴染みがない方もいらっしゃるかもしれませんが、Google Pixel の「消しゴムマジック」と言えばピンとくる方も多いのではないでしょうか?(消しゴムマジックは技術詳細公開されていませんが、類似の技術のはず。。。)
Image Inpainting は、近年AIによる精度向上が著しい分野の一つですが、Image Inpainting 自体の歴史は古く、AIが登場する以前から、以下のようなアルゴリズムが提案されており、OpenCVにも実装されています。
- An Image Inpainting Technique Based on the Fast Marching Method(2004年)
- Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting(2001年)
以下は実行例です。
(1枚目は修復対象画像、2枚目は修復対象箇所のマスク、3枚目は1つ目のアルゴリズムでの修復結果、4枚目は2つ目のアルゴリズムでの修復結果)
OpenCV Docs Image Inpainting から画像引用
今回は、このOpenCVのInpainting処理を活用して、オクルージョン画像の物体検出精度を向上させたケースのお話をします🦔
Inpaintingでの物体検出精度向上アイデア
物体検出やってると「この手前の物体邪魔だな、、、( ´ー`)y-~~」て思うケースにちょいちょい遭遇します。 ※例だと車の前にあるポール
(もちろん、カメラ設置時の前提条件とか撮影位置とかの条件を色々縛って、そもそも手前に邪魔な物体がこないようにすることが大事ですが)
そして、こんな感じの検出結果を、上長と一緒に眺めていた時に、以下のようなやりとりがありました🦔
高橋「邪魔な物体が映らないようにしてほしいですが、実運用的には難しいですかねー(現実的には設置可能な位置が限られているケースも多いし)」
上長「そうですよね。ちなみにこれ消しゴムマジックみたいに消せないんですか?」
高橋「、、、(゚Д゚)!」
高橋「意外といけるか。。。?」
と言うわけで、この当時有名だったTransformerベースの Inpainting AIの「ProPainter」で試してみた結果がこちら↓
※結果が分かりやすいようにcarクラスのみ描画しています
何個かフレームを抜き出して確認した結果↓
お、良いんじゃないコレ👀?
Inpaintingで邪魔な物体(静止物)を消すのは効果がありそうです。
ただ、バカでかい問題が、、、ProPainterが超重い、、、😇!!
ローカルPCで動かせなかったので、Colaboratory上でInpaintingした後に、その修復動画を持ってきて物体検出を試す。なんてことも当時していました。
約24秒の動画(800x464)をA100のGPUで処理して4分9秒。。。
ユースケースにもよりますが、物体検出の前処理として運用するには、これはちょっと重いと思いますね。
Inpainting結果は流石に綺麗なのですが。。。
ProPainterを用いたInpainting動画の生成は、Colaboratoryで試しました。ノートブックはこちら↓
もっと軽量なInpaintingを求めてOpenCVへ
ProPainterでは重すぎるので、当時はOSSのAIの他モデルをせっせと探していました。
が、
ある日「そもそもAIじゃなくてOpenCV実装の軽いInpaintingでもいけるんじゃね👀?」と思い試してみた結果がこちら↓
もちろん画像修復自体の綺麗さはProPainterの足元にもおよびませんが、CPUでもそれなりの速度が出せて、そこそこ画像修復出来て、隠れた物体の検出精度も上がっている。ならOpenCVのInpaintingも全然現役で使えるケースありますね🦔
この投稿では、そんな一例の紹介でした。
上記を試したソースコードは以下にコミットしています。
ちなみに、ProPainterとOpenCVのInpainting(アルゴリズムはcv2.INPAINT_TELEA)を並べた動画はこちら↓