Blog
ブログ

2024年12月03日

技芸アドベント①:豆知識

こんにちは、AI/BI部のLです。

最近は忙しくて時間がないので、それに合わせてウォーミングアップをするために、今回の「豆知識」を作成するようになりました。

旨は「95%以上の精度の意見を出せと要求されても保証できない」なので、気軽に読んでください。

当期収録:「Windowsファイアウォールで特定のポートを許可する方法」、「町のAI屋さん→『一枚のイラストから3Dデータが完成』」、「EfficientADの正体」

Windowsファイアウォールで特定のポートを許可する方法

(Special thanks:部員i)

この前、テストのため、サーバー上に利用されていないポートにアクセスを試みたのですが、ファイアウォールルールがあってなかなか上手く行きませんでした。そこで、特定のポートを許可することによって、アクセスできるようになりました。その方法を今ここに共有します。

 

まずは管理者としてコマンドプロンプトまたはPowerShellを開きます。

外部からの接続を許可するには、このコマンドを実行します:

netsh advfirewall firewall add rule name="Allow Port 3001" dir=in action=allow protocol=TCP localport=3001

外部への接続を許可するには、以下のコマンドを実行します:

netsh advfirewall firewall add rule name="Allow Outbound Port 3001" dir=out action=allow protocol=TCP localport=3001

name: ルール名(例: “Allow Port 3001″)、dir=in: インバウンド通信を許可、action=allow: 許可ルールを設定、protocol=TCP: プロトコルをTCPに指定、localport=3001: 許可するポート番号。

 

設定したルールが正しく登録されているか確認します:

netsh advfirewall firewall show rule name="Allow Port 3001"

不要になった場合は、以下のコマンドで削除します:

netsh advfirewall firewall delete rule name="Allow Port 3001"

特定のIPアドレスを許可:

netsh advfirewall firewall add rule name="Allow Port 3001 from 192.168.1.100" dir=in action=allow protocol=TCP localport=3001 remoteip=192.168.1.100

以上です。今後も、この知識がどこかに役に立てばいいですね。

町のAI屋さん

最近ある記事を見ました:https://ascii.jp/elem/000/004/236/4236636/

その中に書いた手法によって、「1枚のイラストから3Dデータが完成」ができるらしいです。

 

簡単に説明すると、まずは生成AI(何言っても生成AIです!😋)を使って一枚の画像を生成します。

生成された画像をまた動画生成AIに入れてMVS(Multi-View Stereo)を取得します。MVSは何かというと、さまざまな角度から対象物への観測です。「写真」だと理解しても問題ありません。そのMVSは、記事が言う「回転動画」になります。

 

そこに、3D Gaussian Splatting(3DGS)を搭載した謎のSfM新技術で「回転動画」を使えば最後の3D点群を取得できるようになります。SfMは入力画像から直接「カメラ位置の推定」および「疎な点群の生成」を行う手法なので、カメラの姿勢がわからなくても使えてすごく便利です。

 

3D Gaussian Splattingをちょっと詳しく説明すると、まず観測空間内にゴム風船を均一に埋め尽くして、ゴム風船を写真がある平面に投げて、できた絵と写真の差分によって機械学習を行って、各ゴム風船内容物を調整するみたいな方法ですね。

 

さて、理論をどれだけ冗長に説明してもあまり意味がないから、その記事に記載されたソフトを紹介します。画像生成AIは「Stable Diffusion」で、動画生成AIは「Runway」です。そして3DGSを搭載したソフトウェアは「PostShot」です。

そして粗い3Dを生成しても大体使えないと思われているので、また精緻化したい部分をキャプチャーしてまた生成AIによって美化できればいいですね、と考えられます。そこに、「Polycam 3D」という動画から3Dモデルを作成するサービスがあって、Blenderでできた3Dモデル回転動画をそこに投入すれば高品質な3DGSモデルを取得できるらしいです。

 

「1枚のイラストから3Dデータが完成」の手法の紹介は以上です。いかがでしょうか?実は、ここに本当にアピールしたいことは「AIがすごい」ことではなく、人々がどうやって昔の電気屋さんみたいに市販のパーツで完成品を作ることです。

この記事CGをやっている知り合いに共有した際に、「これくらいだけでどのくらいの処理時間がかかったと思う?」、「可制御性があんまりなくて、ガチャみたいなことになる」(日本語じゃないので人間知能によって翻訳された)、と言われました。

確かに、仕事にはまだ適用できないし、手法上、「人がが書いた数枚の絵から直接高品質な3Dモデルやレンダリングを出力する」ももっと研究すべき課題かもしれません(例えば最近のダイナミックNeRFとか)。しかし、このような雑な使い方でも、AIが部品のソフトウェアとして使えることを示唆しました。それで、AIは社会の隅々に普及されるでしょう。AI開発者にとっても、決してこれは悪いことではないと思います。

EfficientADの正体😨

https://github.com/openvinotoolkit/anomalib/blob/bcc0b439f616b13a8629cb64d8bf0f88fc9083a8/src/anomalib/models/image/efficient_ad/torch_model.py

上記のリンクはEfficientADという教師なし異常検出モデルのソースコードです。下記はEfficientADの論文です。

http://chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://arxiv.org/pdf/2303.14535

この前、一日をかけてソースコードを研究してようやく大体のイメージができたので、ここに共有します。

# Student loss
distance_st = reduce_tensor_elems(distance_st)
d_hard = torch.quantile(distance_st, 0.999)
loss_hard = torch.mean(distance_st[distance_st >= d_hard])

上記のLossは「教師モデルから正常品の一番難しい特徴を学習する」ためのLossです。

ここのポイントは、なぜ毎回0.999より大きい差分を取っても結果的にトラバーサルにならないかです。これについて、機械学習には「局所最適解」という概念があります。最適化の中、これを「ボールが落ちったらもう登れるのはほぼ不可能な」として理解していいでしょう。

ゆえに、ほかの重要な特徴を多少漏れても、一旦「難しい特徴」を見つけたら、トレーニング中にそれをずっと学習することになります。全体的な特徴のほうは他のLossが補足するので、心配は要りません。

# Autoencoder and Student AE Loss
aug_img = self.choose_random_aug_image(batch)
ae_output_aug = self.ae(aug_img, image_size)

with torch.no_grad():
  teacher_output_aug = self.teacher(aug_img)
  if self.is_set(self.mean_std):
    teacher_output_aug = (teacher_output_aug - self.mean_std["mean"]) / self.mean_std["std"]

student_output_ae_aug = self.student(aug_img)[:, self.teacher_out_channels :, :, :]

distance_ae = torch.pow(teacher_output_aug - ae_output_aug, 2)
distance_stae = torch.pow(ae_output_aug - student_output_ae_aug, 2)

loss_ae = torch.mean(distance_ae)
loss_stae = torch.mean(distance_stae)

上記のLossは今回の主役です。ここのプロセスを見ると、「教師モデルとオートエンコーダのMSE」と「生徒モデルとオートエンコーダのMSE」を計算していることがわかる。

つまり、実は「オートエンコーダ」と称しているものの、その出力は「教師モデルが出力したもの全体の特徴」に再構築によって近似されるものです!

そして、生徒モデルの「学習したことがないゆえに異常品に差が出る」方針とオートエンコーダの「正常品しか再構築できないゆえに異常品に差が出る」方針を合わせて、EfficientADという手法の正体でした。

なぜ「教師モデルが出力したもの全体の特徴」を再構築トレーニングに適用するかというと、解像度の高い元画像まで再構築すると、 細部の特徴に敏感になって、結果的になんでも「差が高い」になりやすいので、GANs(Generative adversarial networks)の旨みたいにより「全体的な特徴」に着目しました。

ですが、実は理論上の説明がないらしいので、それに基づいて改善することも難しいでしょう……

 

以上、EfficientADの正体についての説明でした。

終わりに

今回の記事はやや長くなりましたね。週刊なのでまた来週読んでいただいたら嬉しいです。

このページの先頭へ