「AIプログラミング」という言葉を聞くと、どうしても難しいイメージがつきまといますが、Processingとモデルを使うと、簡単に実現できます。ここではその方法とそれによって広がる世界について紹介します。

これまでの【やらずに死ねないプログラミング】はこちら

「AIを使うプログラミング=難しい」は過去のもの

ロボット、ゲーム、アプリなど、プログラミングを学ぶ目的は人それぞれですが、学びたいけれどちょっとハードルが高そうと感じてしまう方も少なくないでしょう。本連載では、そのような方へのひとつのきっかけとして、「プログラムで絵を描く」という話題を取り上げてきました。絵、すなわち視覚的な表現は単純に見えて、数式や手続きなど他のプログラミングでも有用なプログラミング的思考を必要とする要素がたくさん含まれているからです。

連載第3回で紹介した「Processing(プロセッシング)」は、まさにこのような目的にぴったりの学習ツールです。マサチューセッツ工科大学のメディアラボで開発されたこの無償のツールは、2001年の登場以来、世界各地の大学でプログラミングの入門的なプログラミング環境として広く学ばれています。筆者も2008年から現在まで、東京芸術大学、多摩美術大学、慶應義塾大学での授業を通じて多くの学生に教えてきました。

Processingはそれ自体がツールとして優れているだけでなく、多くの利用者が作品のコードを共有したり、世界の第一線のクリエーター達が、教材、サンプルコード、関連書籍、機能拡張ライブライを提供するなど、コミュニティの広さと質が他の学習環境よりも優れていると言えます。

さて、AIやディープラーニングと聞くとどんな印象をもちますか? 自動運転など革新的なサービスには、必須の技術でありながらもその応用範囲は広く、アートやエンターテインメントなどクリエイティブな領域にも広く取り入れられています。

たとえば最近では、カメラに映った物体の自動認識技術で演出されたミュージックビデオ画家のタッチや画風を真似た動画驚くほどの歌唱力の楽曲などが挙げられます。これらの多くは、写真や絵や音声からなる膨大なデータをディープラーニングという方法で学習させた「モデル」利用して作られています。モデルを自分で開発するのは非常に難しいですが、実は、既存のモデルを使っておもしろい表現をプログラミングすることはそれほど難しくなく、初心者でも「絵を描くプログラミング」のコツを掴めばこうした表現へのステップも見えてきます。

少し前置きが長くなりましたが、今回は、Processingと「モデル」を使ってどのようなことができるかを紹介したいと思います。

※今回の記事は、できることの多様さを伝えることを目的に置いているため、具体的な利用方法については大幅に簡略化しています。もし自身の環境で実践したい場合は、記事末尾の資料を参考にしてください。また、紹介する内容は記事執筆時点で筆者が実際に動作を確認したのものであり、今後変更となる場合があります。実施にあたっては、読者ご自身の責任においてお試しください。

ProcessingでAIを使ってプログラミングしてみよう

ディープラーニングのアーミーナイフ「RunwayML」

RunwayMLはさまざまなタイプの学習済みモデルと、自分のプログラミング環境を仲介してくれるソフトウェアです。現在100以上のモデルが利用可能です。RumwayMLのサイトではこれらのモデルを使用して作られたアイデアが多数公開されています。

ダウンロードして使用すること自体は無償ですが、モデルの中には無償で使えるものとそうでないものがあります(理由は後述します)。今回は、RumwayMLを起動し、Processingで行うクリエイティブなAIプログラミングのサンプル紹介します。

画像: 「機械学習のスイスアーミーナイフ」というキャッチコピーのとおり、幅広いモデルが利用できる。プログラミング環境は、OSC、HTTP、WebSocketのいずれかのプロトコルが利用できれば何であれアクセスできる

「機械学習のスイスアーミーナイフ」というキャッチコピーのとおり、幅広いモデルが利用できる。プログラミング環境は、OSC、HTTP、WebSocketのいずれかのプロトコルが利用できれば何であれアクセスできる

画像: RunwayMLをインストールしてモデルをブラウズした画面。現在100以上のモデルが利用できる

RunwayMLをインストールしてモデルをブラウズした画面。現在100以上のモデルが利用できる

RunwayMLの準備

Processingがインストール済みであれば、今回必要となる準備の大まかな手順は次のとおりです。

  • RunwayMLをインストールしサインアップ
  • ProcessingにRunwayMLライブラリを追加
画像: Runwayをインストールし、起動したらサインアップ

Runwayをインストールし、起動したらサインアップ

画像: ProcessingにRunwayMLライブラリを追加する

ProcessingにRunwayMLライブラリを追加する

カメラからの映像をリアルタイムに「葛飾北斎」のタッチに変換

準備が整ったら、いよいよモデルを使ってプログラミングしてみましょう。とはいえ、各モデルに対応したProcessingのサンプルコードが充実しているので、今回はすべてこのサンプルを使っています。流れは下記のように、いたってシンプルです。

  • RunwayMLで使用したいモデルを選んで実行
  • Processingでサンプルプログラムを実行

ただし、注意してほしいことがあります。モデルにはサーバのGPUを使用するものと、PCのCPU使用するものがあるということ。前者の場合は、なるべく安定したネットワークに接続した状況で実行することをオススメします。またその際、1分あたり$0.05のクレジットを消費するので、プログラムを実行していないときはモデルも停止させることも忘れないようにしましょう。

執筆時点では、サインアップすると$10分の無料クレジットが提供されていました。単純計算ですが、実質200分は無料で使えるため、お試しには十分な長さです。

それではさっそく、画像を著名な画家のタッチに変換する「Fast-Style-Transfer」というモデルをRunwayMLのブラウズ画面で検索し、自分のワークスペースに追加します。

画像: 「Fast-Style-Transfer」の詳細画面。モデルの詳細画面では、モデルの出自を示す論文やGitHubへのリンクなども表示され、詳しい情報が得られる

「Fast-Style-Transfer」の詳細画面。モデルの詳細画面では、モデルの出自を示す論文やGitHubへのリンクなども表示され、詳しい情報が得られる

次にModel Setupのメニューで「Hokusai.Pth」を選択し「Run Remotely」をクリックするとモデルが起動します。

画像: 「Fast-Style-Transfer」をワークスペースで選択し、「Run Remotely」をクリック

「Fast-Style-Transfer」をワークスペースで選択し、「Run Remotely」をクリック

続いてProcessingを起動しサンプルから、RunwayML用のサンプルコードを開きます。「Contributed Library」>「RunwayML Processing Library」>「HTTP」>「FastStyleTransfer」を開き、実行します。

画像: Processing用に用意されたRunwayMLのサンプルコード。今回は、そのうちのHTTPフォルダにある各種サンプルを試した

Processing用に用意されたRunwayMLのサンプルコード。今回は、そのうちのHTTPフォルダにある各種サンプルを試した

実行すると、このようにカメラからの映像がリアルタイムに北斎タッチの映像に変換されました。

画像: (左)カメラの映像(右)北斎タッチ

(左)カメラの映像(右)北斎タッチ

Model Setupメニューで他の画家を選択してモデルを実行すると、絵のタッチを変えることもできます。ピカソやキュビズム風の映像にするには「Cubist.Pth」を選びます。

画像: キュビズムに変換された映像

キュビズムに変換された映像

充実した学習モデルを試すだけでも十分楽しめる

上記の要領で、モデルとProcessingのサンプルコードを差し替えていくだけで十分楽しく、また、モデルについて深く知ることができます。以下では、筆者が半日ほど遊んでおもしろかったいくつかのモデルを紹介します。とても全部のモデルは試せなかったので、まだまだおもしろいものがあると思います。

ちなみに、以下ではモデル名とサンプルコードの名前が一致しないものについては、( )内に対応するサンプルコードのファイル名を記述します。

PhotoSketch

画像: PhotoSketch

映像のエッジを抽出して、手書き風のタッチに変更します。

SPADE_Landscapes(SPADE_Landscapes_Paint)

画像: SPADE_Landscapes(SPADE_Landscapes_Paint)

左側は筆者がマウスで30秒くらいで描いた雑な絵ですが、このモデルに入力すると右側のような写実的でリアルな風景に変換されます。

DeepLabV3(DeepLab)

画像: DeepLabV3(DeepLab)

セグメンテーションという画像解析手法で、画面上にある物体を認識しその領域を特定します。このスクリーンショットでは、person(紫色)とbottle(薄桃色)が認識されています。人の領域だけを切り取って画像と合成できそうです。(このサンプルコードは一箇所修正が必要でした。詳しくは記事末尾をご覧ください。)

PoseNet(PoseNetWebcam)

画像: PoseNet(PoseNetWebcam)

人間の姿勢を推定するモデルです。骨格や顔の主要なパーツの位置を画像から特定できます。このスクリーンショットでは著者の目と鼻、肩の位置が正確に特定されていることがわかります。(このモデルはローカルで使用でき、クレジットを消費しません。)

COCO_SSD

画像: COCO_SSD

カメラに写っている物体を認識し矩形と物体のラベルを返します。上で紹介したDeepLabのセグメンテーションとは異なり、映っているものの画面上の位置情報が扱いやすく、また、ローカルで使用できクレジットを消費しないため、応用の幅も広そうです。

AIプログラミングは難しくない

クリエイティブなAIプログラミングを加速させる

多くの人にとってAIやディープラーニングと聞くと非常に取り扱いが難しく、プログラミングをちょっと練習しただけではまったく手の届かない存在のようなイメージではないかと思います。たしかにRunwayMLのようなツールの登場以前は、多くのプログラミングビギナーにとってはその道のりは果てしなく遠いものでしたが、筆者が体験した率直な感想では、RunwayMLそのものの使い勝手やサンプルコードはとても扱いやすく考慮されており、ビギナーにとっても軽い気持ちではじめられます。

またビギナーだけでなく、AIについて本格的に取り組んでみたいエンジニアにも、どのようなモデルがあり使い勝手はどうなのかについて試したい場合に多くの恩恵をもたらしてくれるでしょう。

遊びから芽生える「探究心」

本文ではあまり触れませんでしたが、RumwayMLが安易にモデルを使いやすく提供するだけでなく、モデルの生成過程や学習したデータを示す重要な論文や、研究者のウェブサイトへダイレクトなリンクを提供していることも特筆に値します。その理由は、ディープラーニングによるAI技術は応用範囲が広い一方で、学習データの偏りによるバイアスが生みだす差別や偏見、「ブラックボックス化」というセンシティブな問題と表裏一体の関係にあるからです。

モデルを使ったプログラミングで遊ぶことは、こうした問題にも敏感になる貴重な入口になり得ます。そして、疑問を感じたらオリジナルの論文にアクセスしてみるなど、より深い探求への道も開かれているのです。

この記事が気に入ったら「フォロー」&「いいね!」をクリック!バレッドプレス(VALED PRESS)の最新情報をお届けします!

毎週最新情報が届くメールマガジンの登録はこちらから!

【参考情報】RunwayMLのセットアップや、チュートリアルを詳しく知りたい

下記の4つの動画は、インストールからProcessingやp5.jsのサンプルを動かすまでの手順が詳しく紹介されています。このうちの3つは(連載第4回:隙間時間を大活用!大人プログラミング学習に最適な教材の見つけかた)で紹介した、ニューヨーク大学ITPで教鞭を執るDaniel Shiffman氏によるものです。

ちなみに、RumwayMLそのものも、ニューヨーク大学ITPのメンバーからスタートしたものです。最後の一つは、RumwayMLの公式チャンネルの動画です。公式チャンネルではさらにディープなRunwayMLの使い方についても詳しい動画があります。興味のある方はぜひご覧ください。

画像: Introduction to Runway: Machine Learning for Creators (Part 1) youtu.be

Introduction to Runway: Machine Learning for Creators (Part 1)

youtu.be
画像: Introduction to Runway: Machine Learning for Creators (Part 2) youtu.be

Introduction to Runway: Machine Learning for Creators (Part 2)

youtu.be
画像: Coding Challenge #150: AI Rainbows with Runway and p5.js youtu.be

Coding Challenge #150: AI Rainbows with Runway and p5.js

youtu.be
画像: Using RunwayML with Processing youtu.be

Using RunwayML with Processing

youtu.be

【参考情報】DeepLabのサンプルコードの修正箇所

DeepLabのサンプルコードは、101行目、runwayDataEvent関数の中にある
String base64ImageString = runwayData.getString("image"); を
String base64ImageString = runwayData.getString("segmentation"); に修正すると動作しました。

コメントを読む・書く

This article is a sponsored article by
''.