So-net無料ブログ作成
検索選択

torch7で白黒画像をカラーにする [人工知能(ディープラーニング)]

人工知能torch7で、ちょっと白黒画像をカラー化する人工知能を自作してみました。

IMG_0623.JPG
このネコと山々の写っている画像ですが、これは人工知能を使ってカラー化したものです。

元画像はこれです。
IMG_0622.JPG
カラー化した画像と元画像を比べると、かなり色は薄いですし、ネコの額には緑色がついてますし…解決すべき課題は多いのですが、せっかくカラー化人工知能を自作したのでちょっとだけ報告します。
(1)torch7を動かしているのは、NVIDIAの評価用ワンボードPC「JETSON TK1」
 ※とにかく安くGPU(CUDA)を使ってみたかったため。
(2)使った人工知能フレームワークはtorch7、人工知能モデルはまったくのオリジナル。
 ※特別なライブラリは全く使っていません
(3)人工知能の学習に要した時間は2時間
(4)学習に使った静止画は自宅の近所にある公園でデジカメで撮影した20枚を加工して出来た40枚

 機材もデータも、たいしたものではないのですが、意外と何とかそれっぽく出来て、実は自分自身がいちばん驚いていたりします。

 ちなみに、最初にテストした結果はこんな感じです。
IMG_0624.JPG
 ネコが緑です。

 今後も改良していきますので、見捨てないでください…
 (人工知能モデルを改良中です)

 念のため繰り返しますが、どこかの大学とかで公開した学習済みデータなどは全く、これっぽちも使っていません。
 すべて私のオリジナルです。
 torchは個人レベルでもこんなことが出来るんです。

(改良後のお話へ続く)

 
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)


torch7で小さくディープラーニング(3)学習済みデータを使う [人工知能(ディープラーニング)]

前回のプログラムでは、学習済みデータをセーブしました。

今度はそれを使ったプログラムです。

ファイル名は便宜的にT3handan.luaとします。

====T3handan.lua========ここから

require 'nn'
-- 引数をaとbに代入、引数がない場合は0と1にする
a=arg[1] or 0
b=arg[2] or 1

model=torch.load('TEST.t7')
x=torch.Tensor(2)
x[1]=a
x[2]=b
as=model:forward(x)
print("INPUT :",x[1],",",x[2])
print("ANSWER:",as[1])
print("------")

=================ここまで

torchの引数として、ファイル名と引数を二つ与えて実行させます。

th T3handan.lua 2 1
という感じです。

t3handan.png

するとこんな感じで結果が返ってきます。
学習済みデータを利用するのはとても簡単です。

早稲田大学のカラー化人工知能は、実はこのプログラムのように、学習済み人工知能モデルで処理をしています。
便利です。
すごく便利です。
でも、なんか物足りない気がする人もいるでしょう。
やはり、人工知能モデルの学習も醍醐味の一つですし。

(人工知能について話を聞けた人の中には「人工知能モデルの学習ノウハウを持っている事は大きなアドバンテージなので、学習済みデータは公開しても、学習ノウハウの公開は考えていない」という方も居たくらいです)

 そこまでいかなくとも、人工知能モデルの構築はどんなパズルよりもエキサイティングだと思います…難しいけど面白いです。

 そんな訳でこれからは、人工知能モデルの構築と、そこに潜む落とし穴について見ていきましょう!

 いゃぁ、人工知能は魔物です…
 時には柔順に振る舞いますが、ある時は牙を剥いて飛び掛かってきます…
 怖いけど、魅力もあります。


ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)



torch7で小さくディープラーニング(2) [人工知能(ディープラーニング)]

さて、前回はふたつの数値を入力すると、答えとしてふたつの数値が出力されるというものでした。
今度は、ふたつの数値を入力して、出力されるのはひとつの数値、というように変えてみます。
これもテキストファイルに保存して、thorchを起動、dofile '保存したファイル名'で実行させます。


------------------ここから
require 'nn'

dataset={}

function dataset:size() return 200 end

for i=1,dataset:size() do
input=torch.randn(2)
input[1]=torch.random(0,10)
input[2]=torch.random(0,10)
output=torch.Tensor(1):zero()
if (input[1] > input[2]) then
output[1]=-1
end
if (input[1] < input[2]) then
output[1]=1
end
-- データセットは入力2、出力1
dataset[i]={input,output}

end


-- 人工知能モデルも入力2、出力1、データセットと合わせます。
model=nn.Sequential();
model:add(nn.Linear(2,5))
model:add(nn.Tanh())
model:add(nn.Linear(5,1))
model:add(nn.Tanh())

criterion = nn.MSECriterion()
trainer=nn.StochasticGradient(model,criterion)
trainer.learningRate=0.01
trainer.maxIteration=200
trainer:train(dataset)
-- 学習済みデータの単独利用のために保存しておく
torch.save('TEST.t7',model)

x=torch.Tensor(2)
for i=1,10 do
x[1]=torch.random(1,10)
x[2]=torch.random(1,10)
a=model:forward(x)
print("INPUT :",x[1],",",x[2])
print("ANSWER:",a[1])
print("------")
end

------------------ここまで

プログラム中に
trainer.maxIteration=200
とありますが、これを
trainer.maxIteration=10000
とかに設定すれば学習を200回から10000回にすることができます。

さて結果ですが…
右側の数値が大きいときには答えはほぼ「1」、
左側の数値が大きいときには答えはほぼ「-1」、
両方が同じときには、「0」に近い答えが返ってきます。
これはこれで面白いですよね!
TEST3kekka.png
ちなみに、今回の人工知能モデルのニューラルネットワークは、なぜ2層でノードが5個なのかというと…最初は適当に20個ぐらいのノードで、3層くらいでやってみたのですが、扱う数値も大きくないし、複雑な処理でもないので減らしていったら、これぐらいでも大丈夫だったため…というのが真相です。
「なんだよ、もっと数学的に計算してノードや層の数を割り出すんじゃないのかよ」と思った人もいるでしょう。
 たしかに理由が「いきあたりばったり」だと言われるとモヤモヤしてなんかきもちわるいですよね。
 実は私なりに、いろいろと詳しい人とか、実際に研究している人にそれを尋ねたのですが…
 ノードや層の数の決定は「正直、やってみないと判らない」そうです。
 扱うデータの数や、その数値の大きさ、使われている関数など様々な影響を受けるので、一概にこれだとは言えないそうです。

 それでも自分なりにテストして判った事は、ノードや層の数が少な過ぎると学習はまったく進みませんし、やたら増やしても時間がかかるだけで効率が悪いので、よく使うデータセットの規模に合わせて、自分なりの目安を探しておくのが良いようです。

あと、このプログラムの中に、
torch.save('TEST.t7',model)
と、学習済みデータの保存をしている部分があるんですが…これは学習済みデータを使ったプログラムの利用を想定しています。
次回はいよいよ、学習済みデータを使ったプログラムの作成です。



ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)


torch7で小さくディープラーニング(1) [人工知能(ディープラーニング)]

まずは自力でディープラーニングをやってみます。

プログラムは以下のとおりです。

エディタなどで、打ち込んで、ファイルを保存、
torchを起動してから、dofile 'ファイル名'で実行させます。

Torch7start.png
【torch7の起動画面】

はじめに、学習用のデータを200個ほど作り、
そのあとでニューラル・ネットワークを定義、
学習用のパラメーターを設定して学習開始、
最後に学習できたか、検証します。

======================ここから


require 'nn'
dataset={}
-- ここでイレギュラーな設定しています(ここでデータを200個使うようにしています)
function dataset:size() return 200 end

for i=1,200 do
input=torch.randn(2)
input[1]=torch.random(0,10)
input[2]=torch.random(0,10)
output=torch.Tensor(2):zero()
if (input[1] > input[2]) then
output[1]=1
end
if (input[1] < input[2]) then
output[2]=1
end
dataset[i]={input,output}
end

-- 人工知能モデルの定義
model=nn.Sequential();
model:add(nn.Linear(2,5))
model:add(nn.Tanh())
model:add(nn.Linear(5,2))
model:add(nn.Tanh())

-- パラメーター
criterion = nn.MSECriterion()
trainer=nn.StochasticGradient(model,criterion)
trainer.learningRate=0.01
trainer.maxIteration=200
-- 学習開始(200回)
trainer:train(dataset)

-- 学習結果の検証
x=torch.Tensor(2)
for i=1,10 do
x[1]=torch.random(1,10)
x[2]=torch.random(1,10)
a=model:forward(x)
print("INPUT :",x[1],",",x[2])
print("ANSWER:",a[1],"|",a[2])
print("------")
end
======================ここまで

このプログラムで、数字をふたつtorch.Tensorで与えると大きな数字の方に1に近い数値を表示します。


test2kekka.png

学習用のデータセット作成をこのプログラム内で行っているため、そこにはif文がありますが、データセット作成以降は、直接ふたつの数字を比較してそれに反応するプログラムがないのが判ると思います。
人工知能モデルが、与えられたデータから(input)と(output)の関係を学習をしたのです。
このプログラムの中心部はここです。

-- 人工知能モデルの定義
model=nn.Sequential();
model:add(nn.Linear(2,5))
model:add(nn.Tanh())
model:add(nn.Linear(5,2))
model:add(nn.Tanh())

-- パラメーター
criterion = nn.MSECriterion()
trainer=nn.StochasticGradient(model,criterion)
trainer.learningRate=0.01
trainer.maxIteration=200
-- 学習開始(200回)
trainer:train(dataset)

これで人工知能モデルを作り、学習方法や学習用パラメーターを決めて学習を開始しています。

他にも、別の「入力データ2個と、出てくる答え2個のサンプル」を与えて学習させれば、それに応じた反応を返してくれます。
(望む内容によっては人工知能モデルの変更は必要になりますが)

…プログラム組んでないのに…答えが出てくる…
あれ? 俺、いらなくない? とか思いました…
(数日後そんなに簡単な事ではないと気がつくのですが…)

とはいえ、はじめてこの結果を見たときは、なんというか物凄い不気味さを感じました。
プログラムを組んでいないのに望んだ答えが出てくる…頭ではなんとか理解しようと思うのですが、自分の足下に妖怪というか、スライムが生まれた、というかそんな変な感覚に襲われました。
感情はないし、複雑な事は出来ないけど、データから答えを出す方法を学びやがった存在がいる。
これは衝撃でした。
この違和感は数日間抜けませんでした。

ぜひともこの感覚を味わって欲しいです!

いろいろな大学が公開している実験セットでは完璧過ぎて味わえない、不思議な感覚です…

次回は、このプログラムを変更してみます!


torch7と直接関係はないのですが、基本的なことがとても判りやすく解説されているのでお勧めの本です。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)



人工知能もはじめます [人工知能(ディープラーニング)]

ずいぶん長いこと更新が遅れてしまいました。

この間、何をしていたかというと、今流行りの人工知能を使ってみたくてもがいていました。

しかも…最初の数カ月間はろくな成果もなく、ネットの記事を読んでもチンプンカンプンでした。

いきなりテンソルとかベクトルとか、内積とか言われたってこちとらチンプンカンプンです。
むしろ、わざとイジワルして難しく表現しているのではないか、と思ったほどです。
そうじゃなくとも、ある解説書とかでは、難しいところは端折って説明しやすいところだけ説明しているんじゃないのか?とか思いました…。
 
 やっとやさしい表現で解説しているサイトを見つけたと思ったら、結局は文字認識の実験プログラムを紹介して終わっているとか…
 あとは人工知能を使ったビジネスモデルの話ばっかりで…
 なんだこの状況は…と混乱するばっかりです。

 じゃあ、基礎から入るかと気持ちを切り替えて、解説書を手にしてみたら…
 いきなり線形代数の話をされたって判りません…
 確かに線形代数の話も大切だけど…そうじゃない、そうじゃないんだよ…
 
 まずは、どんなものなのかを感覚的に判るようにしよう、と。
 得意気に線形代数の話をする人はこのさい脇に置いといて、もう少しだけ判るようにしようと思います。

 それと、せっかくなんで、自分でも体験してみましょうよ!
 どっかの大学が公開している実験セットを動かして、「ああ、俺にはこんなの作れないよ」と内心でしょぼくれて終わらないようにしましょう。

 なので、(行列とかは高校でしか習っていない)私が、自分自身で、よく判らないながらも人工知能を作れるようになるまでを報告していこうと思います。

 目標は、「画像処理が出来る人工知能を作る」です。
IMG_0617.JPG
【この画像は雰囲気です。これを作るわけではありません】
 テキスト処理とかしません。
 あとどこかの大学が公開しているような実験セットは、よっぽどの事がない限り使いません。
 実験セットを動かしたところで、おもちゃのブロックを買ってもらったのに、そのおもちゃでかっこいい家を組み立てたのは親戚のおじさんで、「へー、こんなのも出来るんだ」で終わるのはもったいないです。
 なのでなんとか簡単なプログラム(人工知能?)を作ってみて、どんな動きをするのか、やってみたいと思います。

 また、使う人工知能フレームワークは「torch7」です。
 caffeとかchainerとかじゃありません。
 はっきりいって、日本国内ではいろいろな情報がろくに集まらない人工知能フレームワークですが、ちょっとガンバって英語で検索していくと、意外にもなんとか答えが見つかります。
 それと何でtorch7か…早稲田大学の石川研究室が白黒画像をカラー化できる人工知能を作ったのがtorch7です。それで、カラー化プログラムは物凄い複雑な処理をしていると思って見てみたら…たった数十行で動いていたんです。
 なんなのこれ? 物凄い複雑な処理をしてると思ったら、関数を呼び出してポン、みたいな感じで処理してます。このtorch7って絶対にすごいと思って、選びました…
 使ってみると、人工知能モデルの構築や変更がとても簡単で、試行錯誤を繰り返しても手間が最小限で済みます。

 ただ…MACかlinuxでないとtorch7は動きません。
 windowsに仮想環境を構築しても、学習済み人工知能モデルを使った処理は出来ますが、ちょっと複雑なディープラーニングは処理速度が遅くてすぐに限界が来ます。ここはまぁおいおいなんとかしていきましょう。

 また、環境構築に関することは基本的に触れません。
 何でかというと、とにかくあちこちに落とし穴があって、ネットの情報がろくに信用できないのです。
 人工知能フレームワークのインストール、pathの設定、CUDAの導入、ひとつふたつ解説したところであっという間に情報が古くなります。
 なので、なんとか自力でtorch7のインストールまでは行ってください。(まずはCPUだけで動けばいいので)
 悩んでこのtorch7が動くようにした経験は、必ず後で役に立ちますので!

 では、はじめます。


ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)


この本は画像処理に付いて詳しく説明しています。
特にプログラムを組めるけど、人工知能フレームワークはいまいち判らないという人にお勧めします。
「青い解説書」よりも説明に使う数式は最小限、python3を使っての解説も判りやすくなっています。



稚内〜サハリンの定期航路再開 [サハリン・バイクツーリング]

いきなりですが、稚内〜サハリン間の定期航路がロシアの会社の運行で再開することが決まりました。
2016年8月1日〜9月16日の運行です。
(当初は7月25日からの予定でしたが、台風の発生により船の到着が遅れたため8月からの就航になりました)
船は小さくなりますが、4時間半で航行するのでこれまでよりも1時間早くなる予定。
ただバイクなどは載せられるかどうかは不明(多分無理みたい)です。

運行はSASCO(Sakhalin Shipping Company)で、週2往復便、船の名前は「ペンギン33」だそうです。
image.jpeg
定員は80名(設計では200名)、双胴船なんだそうです。

とりあえず、船でサハリンに行けることになってひと安心です。

スープは食べるもの! [ロシア文化・日本文化]

Я пил суп мисо.
私はみそ汁を飲みました。

この文章決定的な間違いがあります。
日本語ではスープは「飲む」ものですが、ロシア語ではスープは「食べるもの」であるため、この表現だとダメなんです。
理由としては、ロシアのスープは野菜などの具がたくさん入っている事が多いので「飲む」ではなくて「食べる」の表現がしっくりくるとのことでした。
なので、判りやすい形にすると…こんな感じです。
Я ел суп мисо.


ちなみに、この判りやすい説明をしてくれた先生から、「味噌汁の赤みそと白みその違いが判らないんです。色なんですか? でも私にはみんな同じに見えるんです。味も違うんですか? 違いが判るなら教えてください」と聞かれてうまく答えられませんでした。
なんとなく色くらいしかで判らないので…なんとも説明が出来なくて…


「そしてテレビは“戦争”を煽(あお)った~ロシアvsウクライナ2年の記録~ [その他思う事]

NHKスペシャル「そしてテレビは“戦争”を煽(あお)った~ロシアvsウクライナ2年の記録~」を見ました。

最初は淡々と、ロシアとウクライナがどういう状況で戦争を取り上げていたかを説明していましたが、後半からはかなりの新事実を叩きつけてくる展開でした。
当初は自制しつつ客観的であろうとしたメディアが、しばらくすると愛国心とのせめぎ合いで自国のプロパガンダっぽく傾いていく様子とか。
ネットの画像が感情的なコメントが重なって拡散され、都合の良いように利用されたり。
ロシアのトーク番組のスタジオの裏側では出演者のウクライナ人をもっと司会者が責め立てるように指示してたりする様子とか(よくロケ出来たと思います)。
ネットの危うさ(第三者のコメントが拡散するうちに事実としてすり替わる)もありましたし。
個人が自分で価値判断したと思っていても実はそこには巧妙な仕掛けがあるんだぞ、と受け取れる部分もあるし。

ひょっとしてこれが今の「情報戦」じゃないの、とか思ってしまいました。
圧倒的な情報で「雰囲気を作った方が主導権を握れる」ってところとか…

この番組、実はメディアに関わっている人に対しての様々なメッセージが込められているような気がします。

事実を淡々と描いて、わざと盛り上げたりしないのは演出なのか、派手さはないけど凄く玄人好み(?)の番組だったと思います。
安っぽい感情論とか出てきません。その分、番組への感情移入は難しいです。
でも良質のドキュメンタリー番組だと思います。
面白いから絶対見たほうが良い!と勧めることは出来ないかもしれません。だって興味ない人は本当に興味ないだろうし。でも心あれば見て欲しい!

あと今のネットって危ういよな、いまのメディアって信用できないよな、でもじゃあほんとにそれだけなのか。
パンドラの箱が開いた時最期に残った「希望」は、今の私たちにはないのか?とも考えるんですが、この番組の最期の方には、ちゃんとその要素も見せてくれるんです。
ウクライナのオデッサでロシア系住民とウクライナ住民が衝突して火事が起き何人も亡くなる悲惨な事件がありました。
その時ロシアのメディアは悲惨な出来事を利用して敵対している勢力はひどい連中だと盛んに伝えました。
火炎瓶が投げられたりする一方で、火災から逃げ遅れたロシア系住民をウクライナの住民が助けようとしている様子とかも実際は記録されているんです。
でもそれはまったく注目はされない。(多くの人にとって興味がなかったり、都合が悪いものだから)
でも、きちんと撮影しているジャーナリスト(地元ウクライナ)がいる、そしてその人は映像の価値も判っている。
それを見たときに、凄く安心したというか希望を感じたんですね。
そんなに人間は馬鹿じゃない。

たぶん、たぶんですよ、この番組はロシアにもウクライナにも作ることは出来なくて、日本だから作れたんだと思います。
どっちよりというスタンスじゃないんです。どちらにも等距離でいて、しかも見下した視点がないんです。
だから最後の最後で「希望はまだあるよ」という要素が入った気がします。

さらには「日本はこの距離感でとらえるべき」という絶妙な距離感でした。
ひょっとして、日本はこの関係仲裁出来るんじゃないのか? とも思えるほど。

再放送は5月28日午前2:05だそうです(実際は27日の夜遅くですね)
見逃した人はぜひチェックして見てください。
安易にドラマ仕立てにしてない分、凄く示唆に富んだ番組です。
特にメディア関係者は見てほしい番組です!
(特に番組始まってから20分以降はおもしろいです)

メディアは誰のためのものなのか? [その他思う事]

明日5月21日のNHKスペシャルが「そしてテレビは“戦争”を煽(あお)った~ロシアvsウクライナ2年の記録~」です。
この番組実はかなり気になってます。
戦争が起きたときメディアは戦争を肯定するのか否定するのか、
メディアは誰のためにニュースや番組を作るのか、
インターネットは本当に正しく戦争を伝えられるのか、
自分たちに都合が良い情報を連ねるだけの「個人が国の代理戦争みたいな情報戦」に加わったりするだけになったりしないのか、
インターネットが普及してみんな一次情報に触れていると思っているかもしれないけど本当にそれが正しい一次情報なのか、
誰かがそれを意図的に歪めた情報だったりしないのか、
こんなにノイズのような情報が溢れかえるインターネットでどれだけ正確な情報にたどり着けるのか、
実はいま現在私たちはとても危うい情報媒体しか持っていないのではないか、
…ということをずっと考えていたりします。

ひょっとしてひょっとすると、このNHKスペシャルは何かそれに関係する事を示唆しているんじゃないかと思ったりしています。
明日21時からとりあえず録画しておかないと…


サハリンへのバイクツーリングが出来ないとか… [サハリン・バイクツーリング]

稚内市のホームページに「現在、2016年のサハリン定期航路の運航予定はございません。」とあるように、少なくとも今年は、サハリンにバイクツーリングで行くことは出来ないんですね…
定期航路で使われていたアインス宗谷も春には海外へ売られてしまうようです…
image.jpg
一時期は第三セクターでの運行も模索されていたようですが、どうもダメだったようです。

サハリンのバイク愛好家と「また一緒に走りたいね」とか話していただけに、残念です。
IMG_1496.JPG

2013年と2015年の2回行っていて、気がつくとちょっとした恒例行事のようになっていただけにがっかりでした。日本から一番近い外国を味わえるツーリングだっただけに、行けなくなると「これからどうしようか…」と思ったりもします。
サハリン・バイクツーリングのために入手した国際ナンバープレートももう活躍することはないのかな、と考えたりもします…

※2016年6月に、7月〜9月で定期航路が復活することがいきなり発表されました。