黒塗りアプリのC++化をやってるよ!
一部のマニアに大好評のFF14黒塗りアプリ!
みなさん黒塗りしてますか??
これまでいろんな改善をしてきて、特に精度や処理速度は当初からは随分改善されたと思っているのですが、どうでしょう?
私的には結構いい感じじゃないか?と思っていますが、もしもうちょっと、というような内容があればフィードバックして欲しいです!
あんまりお話を聞かないので、実際使い勝手とかどうなのかなー?と気になってます。
で、処理速度なんですが、現在のPythonをベースとしたアプリ開発では処理速度の改善はそろそろ限界と感じています。
Nvidia Geforce CUDAでは、TensorRTというそれぞれの利用環境だけの検出モデルを各PCで作成してもらう案も検討したのですが、残念ながら現状よりも遅くなる結果となってしまいました。
またAMD RADEONユーザや、もしかしたらいるかもしれないIntel ARCユーザのレスポンス改善も行いたいところですが、今の仕組みの中ではなかなか難しいと感じていました。
そこで!表題の通り、"C++でつくり直したら早くなるかもしれない!"とC++での再実装に挑戦をしています!
使おうとしているライブラリなんかは次の通り。
- VisualStudio 2022 C++
- ONNX RUNTIME
- FFMPEG
- OPENCV
- WinUI3
Visual C++で開発することで、次のようなことの実現が期待されます!
- Windowsネイティブなアプリケーションで、処理速度の改善!
- NVIDIA Geforce CUDAだけでなく、DirectMLの利用でAMD RADEONでもGPUアクセラレーションが多少有効になる!
- Microsoftストアにリリースできれば、署名のない怪しいアプリではなくなる!(但し登録に2000円わたしが払う)
良いことづくめのようですが、私はC++やVisualStudioでの開発を、ほぼほぼやったことがなくて、いろんな方のサンプルコードをとっかえひっかえしながら、Windows copilotやgithub copilotに教えてもらいつつ、ヒーヒーいいつつ、作ってます!
特にUIとなるWinUI3というのが最近のWindowsアプリな感じで、今の黒塗りアプリのUIにも近いんですが、比較的最近に実装されたもので情報も少なそうで、今からかなり不安です・・・
とりあえず、スクリーンショット © SQUARE ENIX から、名前の部分を推論するところまでなんとなくできたので、お披露目です。
検出状況について
緑のところはユーザー名と認識したところです。基本的にはだいたい良い感じに検出できていると思います。
中央あたりにグレーのところは、たくさん文字が重なっていて、今のPythonのアプリでも認識できていないところ。これはまぁ良し(ほんとは認識して欲しいけど)。
中央あたりの赤いところは、今回なぜか検出できていないところ。Pythonのアプリでは検出できていて、今回なぜか検出できていないところになってます。
従来はpytorchというモデルで検出していて、今回はそのモデルを変換したONNXというモデルで検出しようとしています。
変換によるモデルの劣化で検出できなかった、という線も無くはないのですが、Pythonの検出スコア的には検出されてもおかしくなく、また他のスクリーンショットでも、アレ?と1つ検出が漏れることがあり、何かコード的に検出を1つお漏らししているのかなー??と思ってます。
ただちょっとコードの作りを十分に理解できていないので、またおいおい解決できたらいいな!と一旦保留にしようと思ってます。
処理速度について
コンソールの画面にはユーザー名検出の処理時間などが表示されています。
縮小しているので文字が潰れて見えないと思いますが、検出処理はCUDAで画像1枚あたりだいたい33ms前後となっています。1000/33=30FPSくらいで名前の検出はできる計算になります。
現在は浮動小数点32桁のFP32で処理していますが、FP16というモードもあり、これが正しく動けば25msくらいで検出できるようになります!1000/25=40FPSでの検出もできるかもしれない!と思っています。
ただ現状はなんかうまくいってないです。動くけど検出できない、みたいな。
DirectMLでは、たぶんもう少し遅い感じになると思います。(未着手)
あと実験では、検出精度と引き換えにして処理速度をあげることも可能でした。ただ検出漏れや不要な黒塗りが発生するので果たしてどうなのかなー?という気はしてます。
リアルタイム60FPSなら検出漏れても良い?うーん、どうだろう・・・
リリースについて
Nvidia Geforceと、AMD RADEONは、現在は1つのアプリで場合分けをしているのですが、ONNX RUNTIMEの仕様上、場合分けの実装が少し難しいので、Geforce CUDA版、DirectML版と分ける形になりそうです。
アプリケーションをリリースできるのはまだまだ先だとは思いますが、応援してくれるとうれしいです。
下記のAmazonリンクから別の商品でも買ってもらえると、わたしにチャリンとアフィリエイトのお金が入るので、何かAmazonでお買い物があればコチラから飛んでもらえると、うれしいです。
よろしくおねがいいしますー