Nuro光のルーター(HG8045Q)でDMZからglobal側のIPアドレスを取得する(UPnP)

最近、自宅の回線をNuro光にしました。今までLinuxマシンにPPPoEルーターをやらせていたのですが、それと同等の環境を得るためにDMZへLinuxマシンを置いて処理をやらせるようにしました。 ここで一つ問題なのが、いかにして外部サービスに頼らすglobal IPのアドレスを調べるかです。ルーターはISPから貸与されたHG8045Qであり、管理画面は今どきのJavaScript必須なwebインターフェースです。httpで管理画面をたたいてアドレスを取得するのは面倒そうでした。できれば外部サービスには頼りたくありません。 UPnPのNAT越えについて調べてみた – いろいろな何か :こちらの記事を参考に、UPnPでアドレスを取得する方法を行いました。 まずは記事に習ってM-SEARCHを投げます。Python3用コードに書き直しました。 #!/usr/bin/python3import socketM_SEARCH = ‘M-SEARCH * HTTP/1.1\r\n’M_SEARCH += ‘MX: 3\r\n’M_SEARCH += ‘HOST: 239.255.255.250:1900\r\n’M_SEARCH += ‘MAN: “ssdp:discover”\r\n’M_SEARCH += ‘ST: upnp:rootdevice\r\n’M_SEARCH += ‘\r\n’M_SEARCH = bytes(M_SEARCH, ‘ascii’)s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)s.settimeout(5) # 5秒でタイムアウトs.bind((”, 1900))# M-SEARCHをマルチキャストするs.sendto(M_SEARCH, (‘239.255.255.250’, 1900))while True: try: response, address = s.recvfrom(8192) print(‘from’, address)        print(response.decode(‘ascii’)) print(‘=’ *… Continue reading Nuro光のルーター(HG8045Q)でDMZからglobal側のIPアドレスを取得する(UPnP)

Published
Categorized as 開発

“Adversarial Policies: Attacking Deep Reinforcement Learning”をざっと読んだ

機械学習で画像分類器をだますAdversarial Exampleは広く知られていますが、強化学習でも同じ問題があるそうです。observation対して摂動を与えることで意図しない挙動をさせることができるそうです。 observationは第三者が直接介在できるものではないのですが、環境を共有するゼロサムゲームにおいて、自身の挙動を介して相手のobservationに狙った摂動を与える、blackbox, model-freeな手法が提案されている( https://adversarialpolicies.github.io/ )とのことでちょっと論文を読んでみました。 さすがに状況は限定されているようで、環境が高次元であること、デプロイされたエージェントの重みが固定されているという状況で、無制限に相手のポリシーがサンプリングできることが条件のようです。 見た感じ、人間同士のゲームプレイにおけるフェイントに似ているなあという印象を受けました。生成されたadversarial policyに対してfine-tuningはできるものの、それに対してさらなるadvaersarial policyを生成することができるそうで、それを交互に繰り返すことでロバストなポリシーにできるとのことです。 adversarial policyの学習は相手agentのself-playによる学習にかかる時間の3%程度でできてしまうとのことで、adversarial exampleの世界でも攻撃者有利なのは相変わらずのようです。

Published
Categorized as その他

バーチャル背景を任意のサービスで利用する

webcamにアクセスして、人体を検出し背景画像と合成をするページ https://knok.github.io/virtbg/ を作りました。TensorFlow.js, BodyPixを使っています。 ページそのものは単にカメラへのアクセスと画像合成だけを行うので、これをオンラインミーティングサービス等で使うためには何かしらの手段で出力をカメラに見せる必要があります。Qiitaの記事として、OBS studioとプラグインを組み焦る方法を書きました。 Windows, Linux, Macそれぞれに対応するプラグインがあるので、それらのプラットフォームで利用できます。Linuxならv4l2loopbackを使います。 ブラウザ->OBS->プラグインという処理パイプラインになるので、これでも若干のオーバーヘッドがあります。Google Meetでカメラを差し替えるChrome拡張として実装した人がいるので、この方法ならオーバーヘッドはより少なく済んでいそうです。私は面倒だったのでOBSに機種依存部分を丸投げしてしまいましたが…その代わり任意のサービスに利用ができます。Jistiでも使えるので次のオンラインセミナーではこれを使うつもりです。