Tech

GTSportのデカール画像で類似画像検索やってみた

デカール画像の類似画像検索やりたいなーと思って、ここ数日、色々弄っておりました。結論としては、Webのサービスとしてやることは諦めたものの、成果というか、こんなことは出来た、という記録は残しておこうかと。

やったこと(読み飛ばしてOK)

1月25日12:00くらい時点での全デカール画像(約72万画像)から特徴量を取得。モデルはVGG16で、重みはImageNetのものをそのまま使用。検索したい画像の特徴量を算出し、デカール画像の特徴量との距離を1個1個計算していって、近いものが類似画像だ!とする超絶力業。距離の計算は、とりあえずコサイン類似度を使用した。

デカールの画像は480×360で、それを224×224に変えて特徴量を取っているので、検索する画像もそれに倣う必要がある。やる前は、縦横比が違っても何とかならないかなーと期待していたんだが、そこまで甘くなかった模様。ある程度で構わないので、縦横比は合わせる必要がある。合わせないと全然類似度が上がらない。。。

ともかく、こんな力業で、かつ実行環境は手元の貧弱なGPU環境(GeForce GTX1650)のため、1回の検索で1時間半くらいかかる(もう少し最適化は出来そうだけど)。また、各デカール画像の特徴量をnpy形式で保存しているため、保管にも70GBくらいかかる。もしかするとAWSの超凄い環境借りることが出来れば実用に乗せることも出来るのかもしれんが、流石に、月何万何十万も出す気にはならんわ……そういうのは潤沢にお金のある公式にお任せしよう。

ということで類似画像検索してみる

①マツダの100周年ロゴ(?)

デカール検索で、少なくともGTSport上に1つあるのは分かっている。
https://www.gran-turismo.com/jp/gtsport/user/discover/search/decal/decal/1470613/7422020157576315400

色味も異なり、いきなり不得意なものをチョイスしたかも……

結果がこちら
http://gtswiki.gt-beginners.net/decal/similar/20200126225050_CsCEb.htm

素晴らしい!最上位に、欲しい画像が来た。類似度は約0.68。
全体的に、円を描いて中心に文字を書くようなロゴが、類似度の高い画像として上がってきている。ケロリンとか笑える。

②血小板ちゃん

類似画像検索をやり始める前に、画像の分類を試していたときに見つけた画像をチョイス。ネットで検索してみたところ、このデカール画像がネットに転がっている画像をベースにして作られていることが一目で分かったので、元画像を検索にかければ引っかかるだろうと踏んだ。

結果がこちら。

http://gtswiki.gt-beginners.net/decal/similar/20200126225050_7Aiuw.htm

まぁ、そりゃ引っかかるよね。類似度は0.66と0.63
アニメキャラの全身が見える立ち絵が、類似の画像として上がってきている模様。最近のアニメキャラよりも、ネロのほうが類似度が高いとかどうなってるんだろう。

③Shellのロゴ

次はShellのロゴ。黄色背景とか、デカールにはないだろうが、どうか。

結果がこちら。

http://gtswiki.gt-beginners.net/decal/similar/20200126225050_VOOQE.htm

Hellが最上位に来ちゃったよw
しかも類似度が0.688と高い。ただまぁ正しいShellの画像も類似度0.677と上位に来ているので、まぁ良しとしよう。

にしてもShellのロゴ多すぎない? Hellも多いけどw

④イカ娘

次は、目に付いた「イカ娘」。デカール画像を検索に使っても仕方ないので、ネットから拾ってきた画像を使う。全く同じものは無さそうだが、どこまで引っ掛けられるか。

http://gtswiki.gt-beginners.net/decal/similar/20200126225050_dJrJW.htm

うーん、類似度トップにイカ娘がきたが、それ以外は全く関係無いな……
類似度は0.34。なんとなくこう、斜めに構えている感じの画像が上がってきている模様。多分似た構図で、更に色味が似ているから偶然上位に来たんじゃないかと思う。

⑤DAINICHIロゴ

最後はダメ元。あの車に付いているデカールが知りたい!だけどなんの情報もねぇ!というときに使えるかどうか。そもそもそういうケースって、元々の画像もそんなに画質が良くないので、十中八九無理だろうなぁとは思うんだけど。今回検索に使った画像も、ネットに落ちてた画像から、このロゴの部分だけをくりぬいたもの。

結果がこちら。

http://gtswiki.gt-beginners.net/decal/similar/20200126225050_pv2i8.htm

いや、結果見たときにちょっと興奮した。マジで。凄くない?
正直言って引っかかるとは思わなかったよ……

感想

機械学習というのもおこがましく、単純にVGG16の重みを使って類似画像検索に転用できるか試してみただけだが、なかなか面白かった。

今回は使った画像がたまたま良かっただけかも知れないが、使えないことも無さそう。専門家がもっとマシなモデルと実装をしてくれれば、実用に乗るんじゃないかなぁ?

GTSportにおけるデカールグラデーション(後半)

※前半の記事はこちら

前半は、偉大なる先達の五番煎じくらい(しかも劣化版)みたいな記事になってしまって悔しいので、突っ込んで何かしてみよう。

修正方法・対策について

取り急ぎの対策としては、先達の記事やtwitterにある通り、同一色のグラデーションを避ければ、xlink:hrefでグラデの設定を共通化されることがなくなるので、GTSport内でも正しく表示可能なSVGが出来上がる。

たださぁ……なんでそんな訳分からん制約に制作側が引っ張られなきゃいかんの?……そうだ、xlink:hrefを使わない形に書き換えてしまえば良いんじゃね?

ということでSVG修正プログラムを作ってみた。

https://gts.gt-beginners.net/decal/fix-gradation.php

手抜きも手抜き。ベータ版どころかアルファ版くらい。すみません、複雑なデカールの場合、正しく動くかわからんので、上書き保存せずに別名保存してください。変な動きをしたときに動作報告してくれると助かります。

とりあえずやったこと。SVGファイルを開くと「defs」要素があって、ここにグラデーションの設定とかが記載されている。ここでxlink:hrefを使うとグラデーションに反映されなくなる。なので、xlink:href属性が使われている要素をみつけ、hrefで指定されている要素の子要素をコピーしてきてからxlink:href属性を削除してやれば良いはず。

xlink修正前後

円形グラデーション

xlink:hrefだけだと面白くないなぁということで、円形グラデーションの補正にも挑戦。

色々見てみると、GTSportではgradientTransformが使えない模様。だから楕円形のグラデーションは使えないし、回転も出来ない。真円のグラデーションの場合はgradientTransformを使わずに表現できるために、GTSportでも使用できる。真円のグラデはこんな感じで記述される。

<radialGradient id="radialGradient1499" cx="105.08" cy="126.24" r="55.185" gradientUnits="userSpaceOnUse">

gradientTransformが使われていないことが分かる。

ただ、一度作成した真円のグラデーションの位置を変えただけでも使えなくなる。これはInkscapeの仕様なのかも知れないが、位置を変えると、

<radialGradient id="radialGradient1499" cx="105.08" cy="126.24" r="55.185" gradientTransform="translate(-27.214 -27.97)" gradientUnits="userSpaceOnUse">

みたいな感じで、gradientTransformのtranslateを使って補正しようとするので、GTSportでは使用できなくなってしまう。いやいや、cx/cyの値を補正して欲しいんですが……

ということで、gradientTransform内でtranslateを使っている要素を見つけ、cx/cyへ適用する機能を付けました。

なお、拡大縮小をすると、matrixで調整し出すので修正できなくなります。Inkscape、matrix好きすぎじゃない?

translate修正前後

やる気のある方へ

今回はお手軽に構築しましたけど、多分望ましいのは、SVGOMGの1機能としてくっつけてしまうか、InkscapeのExtensionとして実装することが最善なような気がします。自分はExtensionなんて書けんので見送りましたけど、なんでもPythonにも対応しているらしいので、やる気と技術のある方がやってください(乞食)

補足

修正するプログラム作っている途中に気付いたんだけど、GTSportのSVGレンダリングエンジンは、xlink:hrefを処理できないというか、正しくはxlink:hrefがそもそも読めていないっぽい。名前空間違うと読めないのかな?
まぁ細かい話ですけど。

補足2

線形グラデーションにしても円形グラデーションにしても、このプログラムが有効となるケースなんてほとんどない気がします。グラデが真っ黒になった!円形グラデずらしちゃった!みたいなレアケースにぶち当たったときに、ダメ元で使うくらいかなぁ。

愚痴

今回初めてSimpleXML使ったけど、使いにくくない?

GTSportにおけるデカールグラデーション(前半)

正月休みの帰省先で暇にかまけて普段やらんことをやる。ということで、今回のネタはコレ。

GTSportではSVGファイルをデカールとして取り扱える機能があるものの、コイツがなかなかに曲者で、SVG仕様に完全に準拠しているわけではない。公式サイト(オンラインマニュアル)には「SVGのバージョンが1.0、ないしは1.1であること」とあるが、あれは嘘……というか、正しくない。

こんな感じで、特にグラデーション周りで問題が起こることが多く、デカール制作者の頭を悩ます種になっているらしい。何故こんなことが起こるのか不思議で、ちょっと自分でもやってみた。

再現したのがこんな感じのSVG。

なんの変哲も無い、同一のグラデーションのかかった2つの長方形があるだけであるが、これをGTSport側で表示すると……

このように、グラデーションが死んで、真っ黒になる。何故???

実は当初、上記のような状況が全く再現せず。頭を悩ませていた。その時のものがこちら。

さっきのと全く変わらない。(よく見るとフィルの設定が先ほどとは違うのだが、これが再現しなかった理由だった)

ただこれをGTSportで表示すると正しく表示される。これの違いは何だろうか?ということで中身を比較してみる。

見づらいが……言葉にすると、問題の無いSVGファイルは、長方形とグラデーションの設定が1対1であるのに対して、問題のある方は2対2対1になっている。

と、ここでお詫びです。この事象を調べていたら、偉大なる先達が既に、しかも詳しく分析・解析されていることが分かりました。

GTSportのユーザーデカール機能でグラデーションが表示されない問題と対処法(追記あり)

なるほど、分かりやすーい! 睨んでいたとおり、「xlink:href」が問題だったんだね!

と、これで終わりだと何なので、後半に続く。正月休み明ける前に何とか公開したい……

GTSportのロビーでスタートできない事象について

※去年の8月くらいにtwitterに載せたものを再掲

ロビーはP2PかつUDPで通信しているので、パケットをポロポロ取りこぼしているからだろうという推測。公式戦はP2Pではなく、AWSサーバと通信をしている。

月額費用なり1回あたり費用なりとってもいいから、ユーザがロビーでAWSサーバ使えるようにしてくれると嬉しい、という意見をSIEに送ったら「お前の意見など聞いていない(意訳)」との冷たい回答が戻ってきた。

GTSportの撮影モードを使った動画作成

先日冨林さんからお勧め頂いた「LITTL3CHAMP SUPER GT 2008 SERIES Round1 SUZUKA GT 150km RACE」の動画を見ました。そのクオリティだとか、参加メンバーとかにもビックリしたんですけど、ちょっとばかし気になったのが、実際の配信映像のようにコースを俯瞰したり、パンしたりする部分だったんですね。

鈴鹿のヘアピンコーナー
スターティンググリッド

スターティンググリッドはともかく、コースの俯瞰については見たことなかったので、最初別ゲームから引っ張ってきたのかー……と思ったんですが、動画見てる途中で、撮影モードを使ったんだと気付いたので、やってみた……という記事です。すみません、大したことないです。

ガチャ会場

こんな感じで、撮影モードで移動してきます。ホームストレートから移動してきたんですけど、距離あるとかったるいなと。後になって、リプレイ進めてこの近所まで来てから撮影モードにすれば良かったんだと気付きました。

静止画の場合、画面下部の操作パネルが映らないようにトリミングすればOKですね。 撮影しちゃっても良いでしょうけど。

縦横比は変えずにトリミング

動画も同じですね。撮影モードで移動している様子をHDMIキャプチャで撮影し、画面下部が見えないようにクロップすればいいわけです。

クロップ作業中
出来上がったモノ

やってみたけど、品質はご覧の通り。実際の画面だとこんなカクカクしてないんですけどね。HDMIキャプチャの性能が足らないのか、もっとゆっくり撮影して再生速度を落とさなきゃいけないのか……ゆっくり撮影するの難しいわー。まぁ、動画作りたい!って方は色々試してみる必要がありますね。

psn-phpに関するメモ

大した話じゃないけど、ネット上にまったく情報が無かったのでメモ。

PHPでPSNにログインしたりメッセージ送ったり出来る「psn-php」だが、PHP7.xじゃないと動かない。VPSサーバにPHP7入れられないから、Hyper-V使って仮想マシン用意して確認する羽目になったわ。

作者もそれくらい書いといてくれないかな。。。

保護中: GTSデカールの取得方法

このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。

GTSportゲーム配信に関するメモ【OBS Studio】①

ギブソンさん(@gibuson_50s)の配信を見ていて感銘を受け、技術的に興味を持ったのでやってみた。なお、配信する気は無い。

【前提】

HDMIキャプチャボード「GV-USB3/HD」は既に持っている(ゲーム画面録画用に購入済)。配信用ソフトには、とりあえず「OBS Studio」(オープンソースなので無償)をチョイス。
その他、画像や動画の作成に「Photoshop CC」や「AviUtl」を使用しているが、作れれば何でも良いので、他のツールでも問題ない。

【トライ①:ゲーム画面を映してみる】

映像キャプチャデバイスを追加。

「映像キャプチャデバイス」を追加
ゲーム画面は出たが、音が出ていない

音が出ない……ということでカスタム音声デバイスの設定を行う。

カスタム音声デバイスを有効にして、音声デバイスにもキャプチャボードを選択する

音も出た。完了。

ミキサーを見れば分かるとおり、音が出るようになった

【トライ②:画像を貼り付ける】

これは簡単。映像が 1920 x 1080 なので、それに合わせて画像を作る。

photoshopで作成。オーバーキル気味
OBS Studioで、ソースとして画像を追加
ソース欄の目玉みたいなマークを押すと非表示になる

全画面の画像ではなく、ワンポイントでもこんな感じ。

全画面だけではなく、当然ワンポイントの画像も貼り付けられる

完了。

【トライ③:クロマキーを使う】

透過画像(トライ④)を使えば済む話なんだけど、クロマキーを使うのも一般的な方法みたいなのでやってみる。クロマキー色が白だと上手くいかないっぽいんで、背景色を緑にした画像を用意する。

クロマキーと言えばガチャピン色

画像としてOBSに追加した後、フィルタでクロマキーの設定を追加。

フィルタ「クロマキー」を追加。色キーは緑(ガチャピン色)
クロマキー色が透過された状態で合成された

完了。

【トライ④:透過する画像を貼り付ける】

クロマキーは動画を撮影して合成するようなときに使うもので、静止画だったら透過画像を使った方がスマート。ということで透過画像を作る。作るというか、YouTubeのロゴを使う。

白とグレーの市松模様が、透明であることを示す

ペタッとそのまま貼り付け。

特にクロマキーを設定する必要も無く透過できる

これの良いところは、不透明度も反映できるところ。つまり、半透明に出来る。

キャラの不透明度を60%、目隠しの不透明度は100%
Happy Holiday!! キャラ自身も半透明になっているのが分かる。

完了。

【トライ⑤:動画を貼り付けてみる】

お次は静止画ではなく、動画を貼り付け。適当なリプレイを貼り付け。

画面右下に、スワイプみたいな感じで動画を流してみた

【トライ⑥:透過する動画を貼り付けてみる】

トライ④と似てるけど、透過する動画を貼り付ける。これは準備する方が大変だなぁ。動画の制作環境がないので、とりあえず著名ツール「AviUtl」をダウンロードしてきて、適当に作ってみる。

文字列を流すだけの動画。分かりにくいが、背景は透明。

そして貼り付け。

背景が透明な動画が合成できた。やってないけど半透明なものも作れるはず。

完了。どうでもいいけど、透過出来る動画(アルファチャネルを含んだ動画)が作れることを初めて知ったかも。

【トライ⑦:動的に情報を表示してみる】

トライ②~⑥は、事前に準備された画像なり動画なりを表示する方法だったけど、動的にコロコロ変わる情報を映したい場合はどうすれば良いんだろう?
「OBS Studio」で使用可能なソースを見てたところ、「ウィンドウキャプチャ」があった。ってことは、ウィンドウに動的に情報を描画してやれば色々出来そう。「Visual Studio Community 2017」を使い、ちょっとしたプログラムを作る。具体的には、入力したテキストを別ウィンドウにクロマキー付きで表示する、というもの。

ちょいプロ作るならC#便利だよC#
テキストボックスに文字を入れ「Submit」ボタンを押下すると、別ウィンドウに表示される
ソース「ウィンドウキャプチャ」で、ウィンドウを指定
クロマキーを指定して背景透明化
テキストボックスの内容を変えれば、動画にも反映される

【トライ⑧:クロマキーを使わずに動的に情報を表示してみる】

トライ⑦は結局、クロマキーを使わないと透過処理できないので、綺麗に合成するには色々と手間がかかるし(というか汚い)、半透過みたいなことが出来ない。じゃあどうすりゃ良いかと色々調べてみたけど、「OBS Studio」のプラグインを作るしかないのかなぁ。C/C++も使えないことはないので、また今度やってみよう。

-to be continued-