研究

CNNについて

こんにちは。1年のhirotです。KCSでは主にAI班で活動しています。
と言っても、4月から12月にいたるまでに身に着けた知識はゼロに近く四捨五入したら初心者になるレベルですが…
しかし、今回はそんな僕が三田祭期間中に多少勉強したCNNの仕組みについて簡単に書いていきたいと思います。

★CNNとは

画像処理や音声認識など様々なところで使われるニューラルネットワークの一つです。主に「全結合層」「出力層」「畳み込み層」「プーリング層」の4層で構成されていて、これらを組み合わせることで処理を行えるという仕組みです。
例えば、「今持ってるたくさんの写真の動物が犬か猫か調べたい」という時に使用します。

★全結合層とは

1つの写真が持っている様々なデータをすべてまとめて扱いやすいように変換し、それにより得られたデータを活性化関数というもので差別化を行う層です。
例えれば、「この写真の動物の目と鼻と口は犬っぽい。だけど耳は猫っぽいなぁ」と識別します。

★出力層とは

全結合層で得られた結果を分析して、最終的な結果を出す層です。
例えれば、「犬成分の方が多い。だからこの動物は犬率75%だ」と出力します。

★畳み込み層とは

従来のニューラルネットワークは上の「全結合層」と「出力層」で構成されていました。しかし、ここで使われている「全結合層」にはデータをまとめる際に必要なデータを無くしてしまうという欠点があり、処理精度が高くありませんでした。
そこであらかじめ必要な情報を出しておくように改善され、その際用いられたのが「畳み込み層」です。

例えば、
ao
と表される画像があった時、
ak
畳み込みフィルタ-(特徴を浮かばせるもの)を通すと、
kk3.PNG

となり、出てきた緑色が特徴付けられた画像になります。
例えれば、「この動物は口が長くて、耳はピンと立っているな」と特徴を見つけます。

★プーリング層とは

取り扱っているデータの詳細情報を消去して、認識の幅を持たせる層です。
poo.PNG
このように1つの画像のある程度の範囲の最大値をとったり、平均化を行ったりします。
例えれば、「この動物の鼻に水滴がついてるけど、これは情報の一つにいれなくても平気だな」と考慮しなくていい情報を無くします。

★そして全部合わせてCNN

初めに述べたようにCNNはこれらの層を合わせて機能します。
順番は「畳み込み層→プーリング層」を何回か行った後、得たデータで「全結合層→出力層」となります。
とても大雑把な仕組みはこのような感じです。

★最後に

かなり雑になりましたが、CNNの仕組みについて書かせて頂きました。
Deeplearningに触れたことが無い人にも分かって頂けたら幸いです。
何か間違いがあったらすいません_(。。;)_

力学を使わないでハミルトニアン・モンテカルロ法を説明する

こんにちは。KCSアドベントカレンダー2018の12月9日の記事です。

https://adventar.org/calendars/3325

投稿者は数理科学科3年の鴨井です。僕のことを知らない人もいると思うので自己紹介をしておきます。僕は機械学習の勉強をしていて、2017年度のKCS副代表・AI班の代表でした。今は派遣留学で1年間カーネギー・メロン大学に留学をしています。主に自然言語処理、ベイズ学習、音声処理の勉強をしています。

記事は数式が書きやすいことと、単純にこのサイトの存在を忘れていたので自分のサイトに書きました。

https://ryokamoi.github.io/blog/tech/2018/12/09/hmc

記事の内容はハミルトニアン・モンテカルロ法というサンプリングの手法についてです。他の本などとは少し異なる方向性からの説明になっています。

ちなみに2018年12月9日は声優・水瀬いのりさんのファンクラブイベントの開催日でした。僕はアメリカにいるので参加できませんでした。とても悲しいです。水瀬いのりさんは1月23日に7thシングルを発売するので、よろしくお願いします。

https://www.inoriminase.com/

RadeonRaysを使ってみた

どうも,チョコです.

最近レイトレーシングをちょっとやってるんですけど,流石に自分でメモリ構造体を作るのが不効率すぎて辛い.昨日Siggraph Asia行った時に見たRenderMan22が速すぎて衝撃を受けました.

そこで,AMDが開発したRadeonRays(以下RR)というオープンソースなライブラリを見つけました.しかもopencl1.2なのでいろんな環境で動きますね.

(ここでレイトレプロのみなさんへの忠告です.この記事を書いた僕はくそレイトレ―シング初心者です.画像を見て吐き気がしたら見るのをやめましょう.)

さて,RRのサンプルを動かしてみよう.ここではVisualStudioを使ってCornellBoxサンプルをコンパイルして見ましょう.

DmqIdRdUwAA2Wmt.jpg large

おう.すごい.

しかし,これだとレイトレっぽくないので,とりあえず反射を入れましょう.

反射とは要するに,レイをdとしたら,表面の法線nに対して

d’=d2(dn)n

を計算すればいいですね.また,この時,最終の色は元の色と乗算します.

DmqWF7MV4AEb7vS.jpg large

レイトレっぽくなりましたね.

次に,反射をDiffuseにしましょう.ここではLambertを使います.Lambertは簡単にいうと,入射角と法線の内積で明るさが決まりますね.まずは単純に,表面から半球の法線をランダムに決めて内積を取って乗算します.ただし,ここでは光源を円に変え,円に当たらなかったレイは黒にします.

cwe

ノイズ高いですね(適当).

Diffuseの次は当然Specularですね.ここではBeckmannを使います.説明が面倒なのでググって.ただし,普通にランダムに取ると収束まで結構時間がかかりますので,ここではImportance Samplingを行います.

BeckmannのImportance Samplingはここを見てください.

LambertのImportance Samplingはここを見てください.

Specularだけだとこうなります(Beckmann coefficient = 0.2).

s

ピカピカですね.

DiffuseとSpecularの組み合わせはShlick’s Fresnelを使います.とりあえず単純に,このFresnelの値を確率のカットオフとして,ランダム値がこの値より小さかったらSpecular反射を解散して,そうでなかったらDiffuseということにします.こういうことです.

すると結果はこうなります(Specular = 0.4).

wv

ノイズ高いですね(これしかコメント言えん).

箱は見飽きたので,サルを入れてみましょう.サルは金属にしましょう.

Screenshot (381)

ふむ....

サルは可愛くないので,シャロちゃんを入れましょう().CornellBoxも消して,Skyboxを入れましょう.

レイが表面にぶつからなかった時,方向を使ってSkyboxから色をこのように取ります.ただし,レイがまだ反射していないものなら黒にします.

するとこのようになります(適当).

Screenshot (385)

かわいい...


まだまだダメですが満足したのでやめます.最後にコメントです.

RRのGeneratePerspectiveRaysは視野を気にしないので,表示の縦横比を帰ると変になります.そのため,GLMの行列を使って書き換えます.

Importance Samplingが入っているLambertとBeckmannのコードです.ただし,乱数生成器はXorshiftを使います.

では.

Rinju史上最速の作曲法

こんにちは、Rinjuです。KCS音楽班に所属する1年生です。今日担当なのに、今日の17時から書き始めるという不手際。そしてうまく書けずに内容変更と相成ってしまいまして、時間のない状況であります。

ん? 今、時間がないって言いました!?

言ってないし! 計画通りだし!! と言いたいところですが今回は「時間がない」と言って話を始めます。というのも、締め切り間際で時間がないときとか、とりあえず形にしてから考えたいときとかに、さっと楽曲を作ってしまう方法を僕なりに考えて実行してきたので、それを今回の記事では紹介しようと思うからです!

僕はTwitter上にて週2回程度のペースで開催されるイベント「深夜の2時間DTM」に何度か参加してきました。その過程で、2時間じゃぜんぜん曲作れないよー…と悩まされてきました。それでも参加をやめなかったのは、速く曲を作るメソッドを、実践を通して自分なりに作りたいと思ったからです。

とりあえずその現状を「Rinju史上最速の作曲法」と題してまとめたいと思います。そんなことわかってるという人もいるかもしれませんが、ご容赦ください。

1.環境を整える

最速の作曲は、音符を入力する以前に始まっているということです。

パソコンが快適に動作するようにしておいたり、MIDIキーボードなどの入力を楽にする機材を導入しておくことはもちろんのことですが、その他にできることはまだまだあります。

①トラックの整理

曲がふつうに曲として聞こえるために適切なトラック数の下限は「4」であると僕は考えます。4という数字にするとミスタに怒られそうですね。でも4です。

1.メロディ

2.コード

3.ベース

4.パーカッション

内訳は以上です。ベースはコードに含めればよいのでは? なんて思われる方もいらっしゃるかもしれませんが、メロディ:高音域、コード:中音域、ベース:低音域の配置を意識しているのと、コードトラックにベースが含まれているとごちゃごちゃした譜面になるという理由でベースは分けます。

これを基本にしておけば、急いでたらベースの入力忘れてたなんてことはなくせますし、今入力してる部分のコードは何だっけかと思ったとき、調べるのが容易です。お使いのソフトによるかもしれませんが、例えばStudio OneというDAWにはフォルダトラックを作る機能が付いていますので、上の4分類でフォルダを作ってトラックを分類しておけば、見た目にもきれいになります。

見た目がスッキリしていると、モチベーションの低下を食い止める効果があります。これはがちです。

なおフォルダは上に上げた順番にしましょう。というのもこうしておけば音の高低とおおむね対応するし、パーカッションを巻き込まず移調できるからです。

僕の曲「欠けた「私」、動き出した心」だと、これが、

 

バラバラなトラック

 

こうなります。

スクリーンショット (4)

段違いにわかりやすくないですか?

あとはトップダウン式に、編集したいトラックを表示すればいいわけです。

「サブメロディ」フォルダは、この曲ではボーカル的なメロディと楽器的なメロディを分けたかったので作りました。

②プリセットの作成

曲を作っていれば、自分で音作りをすることがあると思います。

「ふう~、曲ができた。寝よ」

ちょっと待ってください!

このままだと、この曲を作るのに使った音作りの設定、別曲やるときにやり直しになっちゃいますよ!

曲を読み込むのにはたいそう時間がかかります。だから、自分の曲に使った設定は全部プリセットとして保存しておきましょう。

スクリーンショット (5)

こんなふうにです。

「サイン・オブリガート」、「Rinju SuperSAW」~「電話」は僕が作ったプリセットです。この他、曲のエッセンスといえるものは保存しています。作った音色は自分好みであることが多いわけで、となれば後でまた欲しくなります。従って、プリセットとして保存しておけばすぐに曲作りに入れます。

②作曲をする前に考える。作曲中は感じる。

これはまだ実践しきれていませんが、そういうことなのかなと思っています。

作曲中に考えてしまうと、そのときそのときで考えたことが反映されるのでアイデアに富んだ曲になるというメリットがあるものの、大体は曲調が右往左往して、曲作りに時間がかかる結果になります。

そこで、曲を作る前にコンセプトを決めます。

エレキギターのリフをマイナーで不穏に聴かせる、とか、ジャズでウォーキングベースを使って小気味よく聴かせる、とかです。また、この曲は〇〇を表現するものである、というのもよいです。つまり、楽曲の方向性を定めて、あとは即興的に好き勝手に作ってしまえばいいということです。

そうしたら後は、その即興の中でどういう選択をするとよい曲になるのかを経験的に探っていけばよいのです。

 

③自分が気にならないところは作りこまない

これは手抜きではないか、という誹りを受ける可能性がかなりありますが、曲が作れないよりはマシなので主張の中に入れておきます。

例えば僕は、ドラムにフィルインがあるかないかは結構気になるので作りますが、シンセパッドがロングトーンか切ってあるかはあんまり気にならないので最初は白玉で入力します。最後まで白玉で終わるのもありだと思っています。メロディはどう考えたって聴くので、できるだけこだわって作ります。気にしまくります。ベースのフィルインはあまり気にならないので、時間があったらやるくらいです。結果、ベースは同音連打が多いです。

このように、自分にとって重要な箇所を心得て、そこに力を入れるようにすると、ひとまず要件は満たした楽曲を作ることができます。

スクリーンショット (6)

現在制作中の楽曲「Close the Tragedy, Build the Light」のベース(チェロ&コントラバス)。ベースの役割を果たしているのは下2行分の音ですが、完全に同じ形ですね。これは同じ形でも気にならないし、音が違くても印象がそこまで変わらないと判断したためです。上1行の音は②「感じて」作りました(つまるところテキトーです)が、このフレーズかどうかで全然違う印象になると思ったのでここは絶対キープです。

おわりに

作曲は限りなく凝ることができ、そのせいで難しく思ってしまう人は多いだろうと思います。また、せっかくモチベーションが上がっても、作曲に時間がかかりすぎてそれを維持するのが大変ということもあるでしょう。そこで、試しに僕の主張する、①環境を整えること、②作曲前に考えて作曲中は感じること、③自分が気にならないことは作りこまないことをやってみてくださったら、何か変わるのは間違いありません。

最後に、深夜の2時間DTMと、今日扱った曲のリンクを貼っておきます。

深夜の2時間DTM

欠けた「私」、動き出した心

深夜の2時間DTMは、お題に沿った曲を2時間くらいで作るので、自分でコンセプトを考えられなくても②が実行できます。あと、短いながらも曲数が増えるので、作曲の自信にもつながると思います。参加してみるといいと思います。

 

作曲がめんどくさいDTMerさん、作曲してみたいけどめんどくさそうでやる気でない方、今回の方法を、ぜひ実践してみてください!

 

←7日目 9日目→

女の子を描いてみた。

こんにちは、しゃちです。

一年生でこのような記事をかくことに慣れていないので温かい目で見てくれれば幸いです。

今回は春学期に私が個人で練習したデジタルイラストに関する記事を書こうと思います。

描くものは今話題のバーチャルユーチューバーで私が推しているヤマトイオリを描こうと思います。

設定、下描き、線画をする。

まず、イラストの新規ファイルを作成します。このときに作成するイラストのファイル名、解像度などを設定します。今回は750dpiとして描いて行こうと思います。

ファイルを開いたらキャンパスが出てきますので、まず薄い鉛筆で下描きしたあと、Gペンで線画しました。このとき、線画、下描き、各部位の塗り、背景など種類によってレイヤーをわけておきます。今回はした図のように、肌、目、髪、服、背景などレイヤーを作ります。こうすることであとの塗りの作業で特定のパーツだけ塗れるようになります。

スクリーンショット (108)

 

下塗りをする。

レイヤーをわけて各パーツに色を塗ります。

 

スクリーンショット (110)

目、肌の影を塗る。

基本、影を塗る場合は下塗りした色より少しくらい色をおいていきます。肌の影を塗ります。肌の下塗りしたレイヤーの上に新規レイヤーを作成し、クリッピングという作業をします。こうすることでクリッピングしたレイヤーに置かれている色の領域でしかそのレイヤーにおいて色がおけなくなります。はっきりした影はGペンで、ぼんやりとした形はエアブラシでおいていきます。

スクリーンショット (111)

目においては何枚もレイヤーを重ねて塗っていきます。

スクリーンショット (113)

スクリーンショット (114)

スクリーンショット (117)

髪の毛を塗る。

髪の毛においても同様に何枚もレイヤーをかさなて影を置いていきます。私が塗った順番としては、

大まかな影→髪の毛のグラデーション→髪の毛の一本一本の流れ→光の反射

です。

ここで影を塗るレイヤーの設定を「乗算」とすることで下のレイヤーに塗られている色より濃い色を塗れるようになります。

スクリーンショット (120)

スクリーンショット (122)

スクリーンショット (123)

服を塗る。

服も同様に塗ります。ここで花柄はCLIP STUDIO PAINT で配布されているユーザーが作ったものを使用しています。

服を塗るにあたって、服の素材を引きだたせたいとおもいます。一度Gペンではっきり塗った後、「ぼかし」ツールで上の部分をやんわりとさせます。

スクリーンショット (128)

スクリーンショット (129)

背景、仕上げ

最後に背景や全体的な質感を醸し出すための調整をして完成です。

スクリーンショット (127)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三田祭に向けたゲーム制作

こんにちは。Nokinokiです。

私は大学に入るまでは全くPCをいじってきませんでした。そのためunityでゲーム制作などもってのほかです。

”大学入って、KCS入って、unityやりまくる!!”

と4月は意気込んでいたものの、色々あって10月までに作ったゲームゼロ、unityに関する知識も身に付かず、やっちまった感が溢れんばかりでした。

そんな中、三田祭に向けて、Oculus Riftを使ったVRゲームを作る話があったので、これはチャンスと思い人生初のゲーム作りをすることになりました。

作ったゲーム

「横一列に並んだお客の前に寿司を置いていく」というものです。

何を血迷ってか寿司を仮想空間で配りたくなりました。なぜこんなゲームになったかというと、プレーヤーの移動に直感的操作を使いたかったからです。Wii fitのボードは皆さん使われたことがあると思います。これをVRで使ったらなかなか面白いのではないかと考えたのです。実現できそうな操作が体重をかけた方向に対しての直線的な移動だったため、左右に直線的に移動するだけのゲームを考えました。

スクリーンショット 2018-12-05 18.32.49

 

 

ゲーム内容

パシリ感が味わえる、横移動して寿司を呼ばれた所に置くゲーム」

この説明で十分な気もするぐらい単調なゲームですが、説明させていただきます。

「寿司!」の文字が五人の中からランダムで一人の頭の上に出るようになっています。その人の前まで体重移動で移動し、手を突き出しボタンを押すと手に握った寿司を客の前に置くことができ、スコアが加算されます。時間内にどれだけ置けるかという感じになっています。

 

スクリーンショット 2018-12-05 18.31.03

↑プレイヤー視点(※VRでプレイした時のものではありません。)

 

作ってみて

制作を三田祭一週間前までサボってしまっていたため、かなりお粗末なものとなってしまいました。自分でWii fitを使いたいと言ったにも関わらず、ボードで拾ったデータをどうやったら使えるのかわからず、先輩にその部分は丸投げしてしまい、初めて一からゲームを作ったためコードの書き方や整理?の仕方もわからず、デバッグ時には多大な負担を先輩におかけしてしまいました…。せめてハイスコアが記録されるくらいのことはしたかったのですが、締め切り1日前の時点で一度もVRで動かせていないという状況の中、私にそれをする気力も技術も皆無でした。三田祭では、皆さんVRが珍しいためか多くの方にプレイしていただけました。ゲーム内容は至極単純ではありますが楽しくプレイしていただけた方が多かった?と思われ、嬉しかったです。(自分は最終日しかシフト入らなかったので全体通してどうだったかは知らん。)今後このゲームがもう少しゲームらしくなるよう、またコードの書き方など改善していきたいと思います。

最後になりますが手伝ってくださった先輩方、モデルを作ってくれた我が友人、プレイしてくださった方、ありがとうございました。

 

 

 

 

Vocaloid5でポルタメントのタイミング調整をする裏技

こんにちは、音楽班のGMAです。

本当はKCS OBなんですが、折角の機会なので、KCSアドベントカレンダーに参加することにしました。

さて、今年の7月にVocaloid5が発表され、これまでよりもずっと歌声を手軽にかつ思い通りに調整できるようになりました。ただ、その一方でUIや仕様が大きく変わったのでVocaloid4以前から乗り換えた方は戸惑うことも多かったのではないでしょうか?

作曲をしているときに特に困ったのはポルタメントのタイミング調整。Vocaloid4以前であれば、ノートを右クリックしてプロパティを表示し、そこからタイミング調整を行うことができたのですが、それがVocaloid5には見当たらない…。5から新しく追加されたアタックエフェクトやリリースエフェクトを使うという方法もありますが、結構エフェクトのかかり方にクセがあるので、単純にタイミング調整だけしたい場合には不向きなんですよね…。

ですが、実はタイミング調整を比較的直感的に行う裏技がありまして。それは、

これを

vocaloid5

こうするだけです。

vocaloid5-2

お判りいただけましょうか?

どうやら、ポルタメントのタイミング計算にノートの長さを利用しているようで、ノートを次のノートに被せるように伸ばすことで、ポルタメントのタイミングを遅らせることができます。スクリーンショットのピッチラインを見ると、後者のほうがわずかにポルタメントのタイミングが遅れていることがわかると思います。

ちなみにこの方法では基本的にポルタメントのタイミングを早めることはできないので、その場合は従来どおり、母音分割して音を繋いであげるとか、コントロールパラメータのPortamento Timingをいじるとかしましょう。

あくまで裏技的なやり方だと思われますので、今後のアップデートで使えなくなる可能性はありますが、割と手軽にタイミング調整するのにはうってつけだと思います。ぜひ制作のお役に立てればと思います。

それでは!

←4日目 6日目→

Unity ML-Agentsの導入と自作ゲーム適応時の体験談

こんにちは、何時も元気に這いよる混沌に飲み込まれたk0buです。

いつもはコミケと技術書典でProcedural Generation系を書かせていただいていますが、地味にサイトの方で記事を投稿するのは初めてですね。

さてKCSアドベントカレンダーの4日目を飾らせていただく私の記事の内容は、Unityが提供してくださっているML-Agentsの導入、また自分のゲームに適用する際の考慮点について話させていただきます。

 

Unity ML-Agentsの準備

 

今回説明するUnity ML-Agentsのバージョンはv0.5.0となっております。また自分はWindows 10を使用しておりますので他OSでも同様の操作で使用できる保証はできません。また、Unity2017.4以降を使用しろと公式が書いているためそれ以前のUnityでは動く保証はないです。

また新たにバージョンが更新された場合は公式のドキュメントがあるGithubの方を確認していただいた方が安全です。

 

Unity ML-Agents関係のインストール

 

まず、Unity ML-AgentsではPythonを使用するため、そのインストールが必要です。今の所Python3.6であれば大丈夫そうです。個人的には脳死でAnacondaを通してインストールをしても良いと思います。とりあえずPythonで機械学習を学ぶ際に必要なモノは入っているため、分からない時はAnaconda一択ですね。

自分はPythonをそこまで使わないのでAnacondaしか使用したことなく、仮想環境もそちらの方で用意しました。使い分けをすることは無いと思った場合は仮想環境はなくても良いと思います。

今回は途中でpipを使うためAnacondaはもしかしたらあまりよろしくないかもしれません。元々Anacondaを使っている人は仮想環境を今回のために分け、pipをcondaでインストールし、rootのpipを使わず仮想環境上のpipを用いましょう(これが対策になるかわかっていない)。

Anacondaでの仮想環境の作り方を簡単に説明させていただくと、

conda create -n 仮想環境の名前 python=3.6

という風にCommand PromptかPowerShellで打っていただくと作ることができ、”activate 仮想環境の名前“と”deactivate 仮想環境の名前“で仮想環境に入っている状態と入っていない状態の間を遷移できます。

それではML-Agentsをインストールしていきますが、まずインストールするファイル/ディレクトリを作成(mkdir)し、CommandPromptかPowershell上でそのディレクトリ上に移動(cd)しておいてください。そこで

git clone https://github.com/Unity-Technologies/ml-agents.git

 

と打っていただき、GitHubにあるML-Agentsのディレクトリをダウンロードしてきます。gitに生き恥を曝され恨んでいる人はUnityのGitHubページからzipファイルをダウンロードし、解凍してください。

AdventCalenderUnityML12/04MLdirectory

ダウンロード(clone)終了後、ml-agents\ml-agentsのディレクトリに移動し、そこで

pip install .

をしてください。これで今回用いるUnityが作ったPythonのパッケージであるmlagentsと、他に必要なパッケージがインストールされます。初めてPythonを入れた方の場合はコンソル上に文字がびっしり出てきて、ある程度の時間はかかると思いますので珈琲でもお茶でも飲みながら優雅に待ちましょう。ちなみに私はアールグレイが好きです。

用意されている環境をテストしてみる

まずUnityでGitHubよりインストールしたディレクトリよりml-agents\UnitySDKというファイルを開きます。次にAssets\ML-Agents\Examples\3DBall\Scenes下にある3DBallシーンをUnity上で開きます。

AdventCalenderUnityML12/03scene

ここでUnity上のEdit\Project Settings\Player内のOther Settings以下にあるScripting Runtime Version.Net 4.x Equivalentにします。またScripting Defined SymbolsENABLE_TENSORFLOWになっている事を確認します。そして、Resolution and Presentation以下にあるRun In Background欄がチェックに、Display Resolution Dialog欄がDisableになるようにしてください。またProduct Nameの方も3DBallにしておきます。

AdventCalenderUnityML12/04playerSettingsAdventCalenderUnityML12/03playerSettingNameBG

AdventCalenderUnityML12/03playerSettingEnableTensorflow

また、TensorFlowSharpをUnityに対応させたプラグインのインポートもする必要があるためこのリンクをクリックし、パッケージをUnity上でインポートしてください。

元々学習したモデルが用意されていますので、今回はそちらを利用しUnity ML-Agentsの体験をしてみようと思います。Hierarchy上のBall3DAcademyの子オブジェクトであるBall3DBrain内のインスタンスにBrain Typeを弄るパラメータがありますので、そちらをInternalにします。

AdventCalenderUnityML12/04finidingBrainAdventCalenderUnityML12/03ball3DBrainType

そうすると、モデルを入れるGraph Modelというパラメータが出てきますので、そちらに\Example\3DBall\TFModelsに存在する拡張子がbytesである3DBall.bytesファイルを入れてください。

そしてプレイボタンを押していただくと、ボールを落とさないように各板が動いているのが観察できます。凄いです(小並感)。

AdventCalenderUnityML12/03gameSceneTest

今度は自分で3DBall用のモデルを学習させてみます。まず先ほどのBrain TypeをExternalに直します。

次にビルドをします、ファイルはml-agents\envs下に保存します。

これから学習をさせていくためCommandPromptまたはPowerShellを用います。インストールしたプロジェクトの一番親であるml-agentsディレクトリに移動します。そこで

mlagents-learn config/trainer_config.yaml –env=envs/3DBall.exe –run-id=firstRun –train

と打っていただくと、以下のような画面になりUnityのゲームが起動し学習中の画面を表示してくれます。

AdventCalenderUnityML12/03trainingScene

AdventCalenderUnityML12/03training

学習したモデルはml-agents\models\firstRun-0\3DBall_firstRun-0.bytesとなりますのでこれをUnity上に分かる所に保存しましょう。

後はBrain TypeをInternalに戻し、Graph Modelに学習したモデルを入れゲームを再生すると、先ほど学習させた結果を見る事ができます。

もし学習時のconfigを弄りたい時は、ml-agents/config/trainer_config.yamlでハイパーパラメータ等の値を調整できるのでそちらを見てみてください。また、mlagents-learnを実行する時の引数によっても調整できるモノもあるのでこちらを参照してください。

ML-Agentsの概要

 

まず強化学習を簡単に説明すると、トライアンドエラーによる学習です。学習者であるAgentが存在し、Agentが何らかのアクションを決めて行いそれが環境に影響を与えます、その影響された環境という結果から状態および報酬を受け取り、またアクションを判断し起こすというサイクルでモデルは学習します。ML-Agentsでは端的にその出力するアクションの定義、どのような環境の時に正や負の報酬を出すのかを設定するだけでゲームのAIを作れるという風になっております。

まとめるとML-Agentsを使用する際に把握しておくべき重要な要素として

  • Observations(環境を見るための変数)
  • Actions(環境から決定されたアクション)
  • Rewards(環境から決定された報酬)

の3つとなっています。

ML-Agentsでの強化学習、模範学習のモデルとしてはOpen AI Gymを中では用いているようですが、これにまたラッパー(wrapper)としてUnityが作成したPython API(mlagents)が存在し、そちらを弄る方が簡単に学習を行うことができるようになりました。Open AI Gymを用いたり自身でTensorflow/Kerasでモデルを書いたりし、それを学習させることもできますが、機械学習を何も知らずにできるという利点においてはML-Agentsはそれを成し遂げていると感じました(現に私は強化学習に全く明るくありませんでした)。

またUnity上でTensorflowで学習したモデルを読みこめるようにするため、上でインポートしたTensorFlowSharpをUnityに対応させたパッケージがありました。TensorFlowSharp自身はTensorflowの学習モデルを.Net APIにおいて使用できるようにしたという感じです。

新しいゲームに適応させてみた際の触感

 

のちのち投稿するかもしれない動画のネタとして活用したい為、コード類は省かせていただきますが、それだと寂しいので考慮しないといけない点を書いていきます。

今回適応させたゲームでは画像を入力(環境を表す変数)として試してみましたが、この時の得られた知見を書きます。

  • 1つ目は環境を表すパラメータの数をなるべく少なくする事です。これは機械学習の点で考えた際、単純に入力数が多くなると計算量が多くなるためそれだけ1つ1つの学習に時間がかかるためオススメはできません。また、短期間の間隔でアクションを決定しないといけないとき程、遅延が発生しないように計算量を減らす事が重要です。
  • 2つ目はバグを取り除く作業が通常以上に難しくなる可能性です。大体のエラーはML-Agents内のスクリプト内で現れるのでゲームのコードをML-Agents様に実装している間にどのようなミスが起きたかが分かりにくくなっています。偶に自分が最終的に頼りにしているprintでのデバッギングも予想以上に動かず、バグを取り除くのに1日以上かかる時もありました(分からなくて単にサボタージュしていたとも言える)。
  • 3つ目はドキュメントやGitHubのIssueが潤っていないため、上で生じたバグやエラーは自分で解決しないといけません。そのため通常検索して終わる程度の見落としでも長い時間苦しまないといけないこともあります。しかし、皆さんが使用し始めIssueが潤えば、この問題は解消されますので是非使用してみてください!

 

完走した感想

 

Unity ML-Agentsをワークフローに取り入れれば確かにゲームAIの作成時間が早まる可能性はあります。しかし、学習時の細かい調整(ハイパーパラメータや環境を表すパラメータの取り方)をしなければならないため結果的に現状どちらとも言えないですね。模倣学習の方もあるのでそちらの方も試してみて、出来ればまた記事か動画を投稿したいと思います。

明日はKCSの音楽系の神の一柱であるGMAさんの記事です、どのような記事を書かれるか期待が高まりますね!

私は音楽といえばAtlusの世界樹の迷宮、メガテン、ペルソナが大好きですね。世界樹の迷宮に至っては目を閉じればそのゲームの一つ一つの階層が見え、またボウケンシャー達の活躍や失敗、苦難が見えてきて、現実を忘れるには持ってこいの曲が一杯です!

皆さんはどのような音楽が好きでしょうか、それではまた次の 12月30日(日曜日)にあるc95の東ト59b にてお会いしましょう。

ではでは~

 

←3日目 5日目→

 

2018年、Vの年

サークルメンバーで作ったVTuber配信ツール”KCSTuber”のHPをchoko君と作成しました.
https://kcs1959.github.io/kcstuber

記事を投稿しました.
https://kcs1959.jp/archives/4064/research/rust_image-crate_example

動画を投稿しました(VTuber活動).
https://youtu.be/oqtV6uOIpeU
https://youtu.be/dff4qQsI-XU

少し前に投稿したサークル製作のゲーム紹介
https://youtu.be/jHxQcV7AeV8
https://youtu.be/XK3xnx-_oQw


あらゆるすべてがアツ過ぎた2018年12月01日は過ぎ去りました.
あの滾るような1分1秒は過去のものとなり,人々の記憶からもいずれはなくなることでしょう.
我々は書物に残された記録から過去を復元しようとしますが,決して実感として体験することはできません.
一人の人間が経験し覚えていられることなど,所詮長い時間の中の一瞬に過ぎず,そういった意味では未来も過去も等しく未知といえます.

世界中の死んでいないみなさん,こんにちは.
Lait-au-Cafeです.
みなさんいかがお過ごしでしょうか.

今年はバーチャルユーチューバー(以下VTuber)が話題となった年かと思います.
世間一般の健常なみなさんがどう受け止めているかは想像もつきませんが,私にとってはかなりインパクトが大きいコンテンツでした.

理想的な作業環境
理想的な作業環境の図

アニメーションや漫画のキャラクターにも魂はありますが,アニメーションや漫画のキャラクターの魂は物語の文脈の中で描き出されるのに対し,VTuberというコンテンツではキャラクターが自発的に動き回るという特性のためか,VTuberには魂の存在を強く感じます.
アニメーションや漫画は作者→視聴者・読者という方向性が強く,基本的には作者の用意した文脈の中にキャラクターの魂を見出していく形になりますが,VTuberはそのインタラクティブ性質上,受け手側から堀り下げられる余地があり,魂の奥行きを実感することが出来るように思います.

そうした奥行きゆえか,一見して似たようなカテゴリに属するライバーたちでも,ライブを見ていると思わぬところで決定的な違いを感じ,驚かされることがしばしばあります.
そういった個別性・多様性がVTuberというコンテンツの魅力の一つだと考えます.

特に意味はないです.

←ふつかめ よっかめ→

Rustで画像入出力

みなさん,Rust使ってますか?
新元号がRustに決まったことは記憶に新しいですね.
まだ使っていないよ!という方もこれを機に始めてみてはいかがでしょうか.

さて今回はRustで画像処理を行うために画像入出力用のcrateであるimageを使ってみたいと思います.
https://docs.rs/image/0.20.1/image/

GolangではC++実装のOpenCVを直接呼出しました( GolangでもOpenCVしたい!!! ).
RustでもOpenCVのラッパであるcv-rsを使ってもよいのですが,どのみち処理はすべて自分で書くので入出力だけできればよく,今回はimageを選びました.(imshowが出来ないのはちょっと不便かも).

今回はサンプルとしてグレースケール化を実装します.
もちろん画像読み込み時に直接グレースケールとして解釈すればよいのですが,一連の処理フローを確認するという意味でいくつかの方法でべた書きで実装します.

コードは以下.

使い勝手はそれなりにいいですが,いくつかうーんと思う仕様もあります.
たとえばget_pixelは範囲外にアクセスした際にpanicしてしまいますが,RustなのだからOptionで返すなどしてほしいです.
またget_pixel時のオプションとして範囲外アクセス時の挙動(clamp, wrapなど,CUDAでいうところのアドレッシングモード)の指定ができるとよいですね.
他にもimage::Rgbで各要素に.r()/.g()/.b()でアクセスできるようにしたり,まだまだ開発途上感はありますが,PNGやJPEGを自前でエンコード/デコードしなくてよいのはそれだけで非常にありがたい事です.

FnMutを画像として読み込むことが出来るのも極めて興味深い点です.
テスト用の合成画像を作りたい場合や簡単なフィルタを適用したいときに便利かと思います.

最後に,image crateに限らず,もしライブラリのビルドに失敗する場合はrustup updateを適用してみてください.rustcのバージョン違いでビルドできていない可能性があります(一敗).

それではみなさん,Rustで楽しい画像処理ライフを.