しゅみは人間の分析です

いらんことばかり考えます

「人工知能は人間を超えるか」という本を読んだ

www.amazon.co.jp

 

現役の研究者が、人工知能技術の現状と今後の展望について地に足の着いた視点で論じている本だった。
過去の人工知能ブームが何故収束し冬の時代を迎えたのか、そして今の人工知能ブームが何故もてはやされており、巨額の投資が行われているかを技術的な観点から語っている。

1~5章

ここを読めば、何故今の人工知能ブームとビッグデータ(付随してIoT?)が喧伝されているか理解できるはずだ。人工知能研究の黎明期から現代への流れと、要所要所の技術について、そしてそれを踏まえて何故ディープラーニングが優れているかを述べている。特に、ディープラーニングの要素技術である、特徴表現学習とロバスト性を獲得する手法についての解説がわかりやすかった。(オートエンコーダ, ドロップアウト

6章〜終わり

研究スライドでの今後の展望にあたるので、眉唾ぎみで読むと良いと思う。ディープラーニングを使って一発当てたい人は、参考にしつつ自分で頭を捻れば良いのではないだろうか。そもそもそれには大量のデータと計算資源が必要ということは終章で指摘されているが。
また、シンギュラリティによって人工知能が人類を支配するのか、という問は明確に否定されており、計算機の上で動作する人工知能が自己生産を行うのはコスト的・技術的に困難であることがよくわかる。
現在のブームの空回りしている点については明確に釘を刺しており、web上の適当なメディアの記事を鵜呑みにするよりはこの本を読むほうが良い。

ゆゆ式を無限に楽しみたかった話 〜 ゆゆ式 Advent Calendar 2014 20日目 〜

ある日のこと、後輩たちがこんなことを言いました。

ゆゆ式のコマをランダムに並びかえたら無限にゆゆ式が楽しめるのでは?」

真面目に計算してみると、10の15乗くらいの組み合わせができることがわかりました。
この記事ゆゆ式アドベントカレンダー20日目は、そんな無限にゆゆ式をたのしむためのシステムを真面目に作ってみた話をします。

コマの切り出し

漫画のコマを並び替えるためには、コマがバラバラな画像として存在していなければなりません。
なので、まずは自炊で電子化された書籍をコマの線にそって切り出していく処理を自動化することにしました。

f:id:non_117:20141220172013p:plain

上の図がふつうの4コマの1ページですね。これの枠線を識別して、1ページから8枚のコマを取り出してくる方法を考えます。

ハフ変換で直線検出

OpenCVという画像処理のライブラリに直線を検出するツールがあったので、まずこれを試してみました。

f:id:non_117:20141220172041p:plain

が、結果はこのとおり。

漫画には直線がたくさん含まれており、ノイズだらけでなかなか上手くいきませんでした。確かに枠の直線も検知されていますが、複数の線が検出されたりして微妙ですね。パラメータ調整をがんばったらそのうち上手くいきそうですが、あまりに面倒です。
よって、この方法はボツ。

ヒューリスティック導入

さて困ってしまい手も足も出ず放置することn日、天啓がひらめきました。

f:id:non_117:20141220173536p:plain

f:id:non_117:20141220173552g:plain

4コマの枠というのは、ページに対して水平に引かれています*1。なので、2次元の画像を縦(あるいは横)から眺めると、4コマの枠線は必ず同じ直線上に並びます。
そして、この直線上に並ぶ枠線は濃い黒色で、コマの内側は灰色、コマの外側は白色になります。つまり、行列の縦ベクトルのように画像を一方向から見て画素値を足しあわせていき、画素値の平均値が255付近から急激に変化する箇所がコマの枠線になります。

 

抽象的な話でわけがわからないかもしれないので、実際にグラフを見てみましょう。

まずは縦方向から画素を足しあわせて平均値を求めます。

f:id:non_117:20141220172257p:plain

このグラフは横軸が画像の横方向のピクセル(座標)で、縦軸が画素値です。ちゃんと枠線の数だけ4つのピークが見つかるのがわかりますね?

同様に横方向も見てみます。

f:id:non_117:20141220172313p:plain

枠線の数、8つのピークがちゃんとありますね。

このように、画素を足し合わせるだけの簡単な処理で枠線の位置を見つけられることがわかりました。実際には、ピーク値をもっと急峻にするために微分や画像のフィルタ処理をしています。
そして、このピークの値で切り出すべき線を引いてみたのが次の画像です。

f:id:non_117:20141220172409p:plain

以上のように、画像を縦横から見て画素値が急激に変化する座標を見つければコマの枠線を見つけ、全てのコマを切り出せるようになりました。
実際には、ゆゆ式の凶悪なフォントによってノイズが発生したこともありましたが、数が少なかったので閾値の調整でなんとかなりました。

ゆゆ式ガチャの完成

さて、これでゆゆ式全6巻すべてのコマをひとつの画像として切り出してくることに成功しました。あとはそれらを並び替えるだけです。この処理は単純にゆゆ式DBからランダムに4つのコマを取り出してくるだけでした。@tyage, @pastakくんが実装してくれたのが次のようなシステムになります。

 

f:id:non_117:20141220174522g:plain

ページを開くと、ランダムなゆゆ式画像が4つ表示されます。また、リロードするたびに4コマ?を生成するため、同じコマと出会うことはできません。一期一会です。

また、コマをクリックするとランダムでそこだけ入れ替わります。頑張ってガチャを回しまくればそれっぽいものもできます。

f:id:non_117:20141220172835p:plain f:id:non_117:20141220172843p:plain

 

これを作ってみた当初は皆頻繁にガチャを回していたのですが、なかなかおもしろい組み合わせは出てこなくてブームも下火になってしまいました。やっぱり原作が一番という結論でしょうかね。

 

以上がゆゆ式を無限に楽しもうとしたシステムの紹介です。

おまけ

話は脱線するのですが、このゆゆ式DBを作るさいに副産物的にゆゆ式の全台詞を書き起こしてIRC botにする計画が立ち上がりました。こちらの計画は、次のようなアノテーションツールを作るところからスタートしました。

f:id:non_117:20141220173024p:plain

1ページに切り抜かれた1コマが表示され、テキストボックスにその台詞や擬音語・擬態語を入力します。ショートカットキーを押すと次のコマに移動するものです。
また、キャラのタグ付けもすることになり、これもアノテーションツールになりました。

f:id:non_117:20141220173041p:plain

各キャラにショートカットキーが対応しており、キーを押すと選択されます。

このアノテーションを引き受けてくれたpossumさんですが、この作業に大いにハマってしまい、
ゆゆ式アノテーション無限に時間をつぶせる。レポート出すまで封印しないと……」

「短時間に過剰なゆゆ式を摂取すると体調を崩す恐れが」

「この前今日はここまでにしておこうって思ったけど結局その後も入力してたし吸引力強い」

などと言いながら3週間で全巻のコマの書き起こしとタグ付けをしてくれました。
このデータは今ゆゆ式のコマを文字列検索するシステムとして運用されています。

 

以上、ゆゆ式をきっかけに作ってみたシステムの紹介でした。当然の事ながらここで紹介したデータ・システムはインターネットで共有することはできません。もし作りたいという方がいらっしゃるなら協力しますので、そのさいはご連絡下さい。

 

*1:理想的には. 実際には傾いてしまうため、eTilTranを使って修正しました

Kinect v2で人間の3Dスキャンとポイントクラウドでの描画をする 〜KMC/OUCCアドベントカレンダー2014 13日目〜

皆さん進捗どうですか? KMC2回生の non117 です。私はダメです。

こちらはKMCアドベントカレンダー2014およびOUCC Advent Calendar 2014の13日目の記事となります。

はじめに

元々は古巣であるOUCCのアドベントカレンダーKMCのアドベントカレンダーを同じ日に同じ記事で寄稿し、記事を節約することを目論んでいました。
しかし、気がついたらカレンダーが埋まってたため泣く泣く別々の記事を書くことにしました。 

新しくネタを用意するのも面倒なので、OUCCアドベントカレンダーで書いたKinect v2すごいよ!という記事の続きを書きます。

 

※追記

なんとOUCCアドベントカレンダーの13日目が空いてたので、目標が達成されてしまいました。

関連研究 

OUCCアドベントカレンダーではKinect v2がいかにモーションキャプチャとして優れているかという内容でした。また、具体的に人間の骨格座標を取得する方法を紹介しました。

f:id:non_117:20141213171108p:plain

他にもKinectはカラー画像, 深度画像, 音などをAPI経由で取得できます。これらのデータを取得し画面に表示するコードはSDK付属のサンプルで網羅されていますが、このサイトの解説記事がよりわかりやすいでしょう。

ところで話は変わりますが、近年ポイントクラウドと呼ばれる技術がもてはやされています。ポイントクラウドとは、(色付きの)3次元の点を大量に使って物体を表現する試みです。現代の3DCGでは多面体のモデルにテクスチャを貼り付けて物体を表現していますが、ポイントクラウドは計算資源の暴力によりきめ細かな表現が可能になるのかもしれません? 知らんけど。

Kinect v2は照射した赤外線がセンサに返ってくるまでの時間の遅れ(Time of Flight! )で物体までの距離を測るので、3次元物体のスキャンが可能です。つまり、Kinectで取得できる空間の3次元座標情報からポイントクラウドを作成することができます。

UnityとKinect v2を使ってポイントクラウド風の描画をしたのが以下の記事です。

しかし、UnityはMono上で動作するため制約が多い上にリアルタイムに描画すると大変重くなります。リンク先の記事でも10fps程度しか出ないようです。また、真のポイントクラウドとして描画するためには、3次元座標での色情報も取ってくる必要があるため、もっと処理は重くなります。

目標

そこで、私はC# で直接KinectAPIを叩き、ポイントクラウドの情報をバイナリファイルとして保存してから、後でUnity上で描画する手法をとります。

ついでにただのポイントクラウドだけではなく、Kinectが得意な人領域抽出も組み合わせて人間のポイントクラウドを作ってみます。

アプローチ 

Kinectでは1種類のセンサに対して1つのFrameReaderが対応し、FrameReaderにイベントハンドラを登録することで、センサからのデータを処理します。
しかし、深度センサ、カラー画像など複数のデータを扱う場合にはひとつひとつFrameReaderをメンバとして保持し、それぞれにイベントハンドラを登録する必要があり非常に面倒なコードになってしまいます。
そんな時には 

gista66e54a0aad21d13dd6f

のように書くことで、複数のデータソースをひとつの関数で処理することができます。
FrameSourceTypeではDepth, Color, Bodyがそのまま深度、カラー、骨格に対応し、最後のBodyIndexが深度情報( 512 x 424 )のうち、どこが人の領域かという情報を与えてくれます。

毎フレームごとの処理の概略は以下のコードのようになります。

giste7073853191278fc1de6

それぞれのフレームからデータを読んで配列なりに格納するだけです。
そして次に深度画像を走査して人領域の座標と色を見つけます。

gist54b128d930b1e554b956

上のように, 深度画像を人領域画像でフィルタリングすることで、リアルワールドでの座標とその色を習得できます。
以上の処理で得られた点群を配列などに適当に格納し、シリアライズするとUnityでも扱えるデータになるでしょう。
ただしこの際には.net 3.5以前で使える基本的なデータ型としてシリアライズしないとMono環境でのデシリアライズに失敗しやすいことに注意しましょう。
Unityで描画するさいはこちらの記事のようにParticleSystemを使うか、愚直にSphereを作って色を塗るのが良さそうです。

実験

できたのがこんなポイントクラウドです。

f:id:non_117:20141213172709p:plain

しっかり服の皺まで再現されていることがわかりますね。 

f:id:non_117:20141213172741p:plain

裏から見るとハリボテになっていることがわかります。

近づいてみます。

f:id:non_117:20141213172805p:plain

 

きもちわるい。。。

結果・今後の展望

Kinect v2を使って人間の3次元スキャンをし、それをポイントクラウドとして表現することができました。
Kinect 1台だとハリボテが限界ですが、複数台使うか、あるいは人間が回転して数フレーム分記録することで、背中側のモデルも構築できそうです。
また、毎フレーム異なるポイントクラウドを描画することでアニメーションにもできますが、全身で数万個の点群になるためフレームレートを落とすか点群を適当に間引きする必要がありそうです。 

まとめ

以上、KMCアドベントカレンダー2014 13日目の記事でした。
明日はohaiさんによる"京大周辺のランチ"だそうです。生協の食堂は飽きたけど野菜をちゃんと採りつつ美味しいものを食べたいという怠惰な私にも嬉しい記事になりそうですね?

KMCM

KMCこと京大マイコンクラブでは「KMCアドベントカレンダーに参加したい!!」方を募集しています。KMCには入部制限はありません。年齢や学歴、人種、宗教、信条、性別、社会的身分、門地、国籍、経験などは不問です。また活動に関する制約もありません。IRCのチャット越しに会話に参加することだけでも大丈夫です。詳細は下記Webページを御覧ください。 

OUCCM

OUCCでは優秀なラボ畜候補生を募集しております. まいにち進捗たのしい研究!

 

9/9

ここ3, 4週間くらい食欲が減衰している。

ぜんぜんお腹が減らないし、食べても吐き気がする程度に胃腸の調子が悪い。気分が悪くなるのは嫌なので、身体が必要とする以上のものは食べないようにしている。また、脂の多い食事を摂ると高確率で胃が崩壊するため、さっぱりした食事を中心にするよう心がけている。

こんな生活を続けているもんだから、だんだんと贅肉が減ってきている。贅肉が減るのは喜ばしいことではあるが、学部時代四年間かけて貯めこんできた資産を質入れするのに一抹の悲しみを覚えなくもない。

食欲が無くなるまでは、大盛りに値する量も食べられるくらいだったが、今では小ライスで満腹になる程度である。こんな修行僧のような生活を送っていると、どうしても無理が出てくる。精神的な食欲と肉体的な食欲の間で乖離が激しく、たまにジャンクフードを摂取しては胃腸を壊す日々である。

脳科学だか何だかの領域で、心身二元論が最早支持されてないのは承知しているが、どうしても食欲というのは精神的なものと肉体的なものがあるのではと考えてしまう。精神的な食欲は、あれ食べたいこれ食べたい、美味なものを食べてみたいなどのもの。肉体的な食欲は、お腹すいた、何か食べたいというものである。実際には相互に作用をしあって全体としての食欲を無しており、離散的に分割できる欲求では無いと思う。ただ、係数に重みはありそうで、だいたいの文化的な人間は精神的な食欲の方にパラメータが振ってあるのではなかろうか。

とまれ贅肉が減るのは構わないが、美味なものを腹いっぱいに食べられないのには少なからぬ苦しみがある。私はもともと人間に備わっている欲求が薄いほうではあるが、それでも美味しいものを食べたくなる時があるのである。今のところは胃腸薬を飲みながら様子を見ているが、長続きしていくようであれば内科に診てもらうのも考えている。もし代謝が落ちているのが原因であるならば、諦めて蕎麦でも食べまくる生活を送ろうと思う。

8/29

インターン8日目。

グループワークも佳境に入り、いよいよ忙しく労働もつらくなってきた。作業内容が楽しくとも、締切が近づくとキリキリと胃が痛む。

午前中はSQLを書きながらパートナーと相談し、午後はExcelと格闘しながら計算をしていた。

結局いつもどおりに20時まで残業し、それでも時間が足りなかった。明日にどれだけ効率よくこなせるか、無理だな。

 

ところで、インターンは渋谷でしているわけだが、どういうことか、業務終了後ほぼ毎日カレーを食べている。1日目に渋谷駅西口近くのカレー屋に入り、2日目に帰り際に見つけたインドカレー屋に行ったのが間違いだった。連れ立って夕食を食べに行く3人は皆理系で、少し頭がおかしい。というわけで、1,2と来たら帰納法、業務後は毎日カレー屋へ行こうという話になった。

実際にはバラバラに食事を取ったりしたが、3人で食事を取るときは必ずカレー屋を探すことになった。いくら渋谷に飯屋が多いといっても、地理に疎い人間ばかりでは、そう簡単に見つかるはずもない。何回かは富士そばでカレーを食べるといった当初のルールから外れた方法も使った。それでも、貴重な時間をつかって、会社から渋谷駅まで毎日ランダムウォークすることにより、なんとか7日目までコンプリートすることができた。

しかし、8日目、今日ははじめから行く場所を決めていたのである。私が人から聞いたとあるステーキハウスで、てっきりカレーが食べられるものと勘違いしていた。店の前でメニューを確認し、カレーが無さそうであることに気づいたが、時は既に21時前、これ以上探しまわる時間も勿体無いということで、そのままステーキハウスで食事を摂ることになった。帰納法成立せず、公理は否定された、と思いきやハンバーグを注文して料理が出てくるのを待っていると、店員がカレーをテーブルに持ってくるではないか。ハンバーグにかけて食べるためのカレーであった。

完全に誤算だったが、なんとかカレーを食べ続けることに成功した。なんのためにそんなことを、と思わなくもないが、こういうノリは大事にすべきだと思う。食事場所を決定するのが面倒だったという本音は忘れたことにしておこう。

8/27

東京にインターンで来ている。

宿は東武東上線沿いで、池袋から渋谷まで会社へ通う。

しばらく学生生活を満喫していたのもあり、8時過ぎに起きて19時まで働くということが辛すぎる。

社会人はこうも大変な生活を送っていたとは。

 

お仕事は守秘義務であんまり詳しく語れないけど、大雑把に言うとソーシャルゲームのデータ解析をしている。

期間は2週間で、はじめは座学、今はグループワークの演習をやっている。

座学はつまらなかったが、演習内容は面白くて、本気で取り組んでいるのだけども、如何せん時間が足りなくて残業をしてしまっている。

人事に怒られまくり。

残業とか時給を貶める行為はほんとうによくない。

 

残業して宿に帰ると、22時になっており、気力を回復してから何か生産的な活動をするには全然時間が足りない。

そんな生活と、東京にも飽きており、京都へ帰りたくなってきた。

東京という場所は、人がたくさん居るというそれだけの場所だ。住むのには向いてないと思う。

7/31

前日からの勢いで徹夜して朝8時にレポートを2つ書き上げた.

そのまま大学へ行って提出しに行くも, 経営管理大学院の方は表紙ダウンロードして来い言われて退散.

らぼで修論の追い込みで死にかけのM4を尻目に表紙作ってた.

 

9時過ぎにレポートを両方submitして家に帰る.

10時くらいに寝た.

 

17時に起きて焼きそばを作る. キャベツを富豪的に使うのは広島出身だからか.

RSS消化しながら食事をとり, ベッドでIRCを眺めていたら寝落ち.

気がつくと日付が変わり8月になっていた.

 

IRC眺めていたら無限に時間が過ぎていく.

Skypeで雑談しながら柔軟体操をしてラーメン食べに行った.

ちょっとレポートの準備をして29時くらいに寝た.