ふぎのモノづくりにっき

痛車乗りのモノづくり日記。いろいろ試したり、作ったりするのを載せる予定だぞいッ

kerasコード基礎メモ

AI作成で使うKerasのコードの基礎をまとめました。

昨年からAI関連のコードを書くことがあるのですが、たまにしかKeras、pytorchのコードを書かず、忘れてしまうので、

・データ読み込み、前処理(generator)
・モデル構築(Functional型)
・モデルコンパイル
・学習(fit, fit_generator, train_on_batchの使い分け)

についてまとめました。そのメモを↓に残します。


pythonでのcsvファイル読み込み

 python初心者の私、csvファイル、テキストファイルの読み込みの方法がいろいろあって、ごちゃごちゃしてきたのでまとめてみました。

 基本的に私が扱うことが多い下図のような1行目ヘッダー、2行目以降数字列のデータを主な対象として考え、どれも最終的にnumpy行列にすることを考えました。
f:id:nyanpasuAxela:20190218200715p:plain


 調べて出てきた方法は5つ
                           
csvモジュールを使用する方法 ⇒ 1回で1行読み込み。出力はカンマで区切ったlist型、list内はstr型['0', ' 0.0074', ' 0.0083', ' 0.0826', ' 0.0823']
②for line in file:で読み込む方法 ⇒ 1回で1行読み込み。出力はstr型"0, 0.0074, 0.0083, 0.0826, 0.0823\n"
③.readlines()を使用する方法 ⇒ 1回で全文読み込み。出力はlist型,list内は1行1要素のstr型['0, 0.0074, 0.0083, 0.0826, 0.0823\n', '1, 0.0118,...']
④numpy関数np.loadtxtを使用する方法 ⇒ 1回で全文読み込み。出力はnumpy行列
⑤pandasを使用する方法 ⇒ 1回で全文読み込み。出力はpd.DataFrame型


csvモジュールを使用する方法

import csv
import numpy as np
listcsv=[]
with open(file_path, "r") as f1:
    csvreader=csv.reader(f1)#反復できるreaderオブジェクト 
    next(csvreader)#1行目のヘッダーを飛ばす

    for line in csvreader:  #line:カンマで区切ったlist型, list内はstr型['0', ' 0.0074', ' 0.0083', ' 0.0826', ' 0.0823']
        line = [float(i.strip()) for i in line]  #空白を削除、数値型へ変換['0', '0.0074', '0.0083', '0.0826', '0.0823']
        listcsv.append(line)

npcsv=np.array(listcsv)  #numpy型化。shape(600,5)

csv.reader(filename)で反復オブジェクトを生成し、for文で1行ずつ読み込んでいます。読み込んだデータはデフォルトでは”,”で区切られた文字列になっています。

数字列で扱いたい場合はfloat型に変換して、その後appendで各行積み上げていっています。今回のcsvファイルは、','以外に空白が入っていたため、空白、タブ、段落を除去するstrip()を使用しています。
最後にlistをnumpy配列化しています。


②for line in file:で読み込む方法

listcsv=[]
with open(file_path, "r") as f1:
    next(f1)
    
    for line in f1:  #line:str型 "0, 0.0074, 0.0083, 0.0826, 0.0823\n"
        line=line.split(',')   #","で分割してリスト化。リスト内はstr型['0', ' 0.0074', ' 0.0083', ' 0.0826', ' 0.0823\n']
        line = [float(i.strip()) for i in line]  #空白・改行削除、数値型へ変換(※この1行を消してもnumpy型化できた)[0.0, 0.0074, 0.0083, 0.0826, 0.0823]
        listcsv.append(line)

npcsv=np.array(listcsv)  #numpy型化。shape(600,5)

 開いたファイルをそのままfor文で1行づつ読み込む方法。読み込まれるデータは文字列なので.split(',')で自分で指定した文字でリストに分割します。後は、「①csvモジュールを使用した場合」と同様に空白・段落除去してfloat化してnumpy配列化しています。

1行づつ文字列で読み込むので、csv以外でも、その後にif文で処理を入れれば自由度がとても高そうです。


③.readlines()を使用する方法

with open(file_path, "r") as f1:
    next(f1)
    listcsv=f1.readlines()#listcsv:list型,list内はstr型print(listcsv)['0, 0.0074, 0.0083, 0.0826, 0.0823\n', '1, 0.0118,...']
    for index in range(len(listcsv)):
        listcsv[index] = listcsv[index].split(',')  #リスト内それぞれ','で区切る。
        listcsv[index] = [float(i.strip()) for i in listcsv[index]]  #空白・改行削除、数値型へ変換

npcsv=np.array(listcsv)  #numpy型化。shape(600,5)

 readlinesを使えば、全文を1行1要素とした文字列リストとしてファイルを読むことができます。上の例ではリストとして読み込んだ後に、各要素を方法②と同じく区切って、空白・改行除去・数値型へ変換しnumpy配列にしています。

 readlinesに似た関数があるので下に2つ示します。
#readーーーファイル内全てを改行コード含めた1つの文字列にする⇒出力:str(すごく長い)
#readlineーーーファイル内の1行を文字列として読み込む⇒出力:str(1行分)
#readlinesーーーファイル内全てリストとして読み込み、1行1要素の文字列⇒出力:list[str, str, str, ...]


④numpy関数np.loadtxtを使用する方法

npcsv = np.loadtxt(file_path, skiprows=1, delimiter=',', usecols=(1,3), dtype='float')   #skiprowsは飛ばしたい行数、delimiterは区切る文字、usecolsは読み込みたい列(未指定時は全列使用)

 numpy配列としてファイル全文を直接読み込むことができます。飛ばしたい行数や、区切り文字、読み込みたい列の指定などもできます。


⑤pandasを使用する方法

pdcsv = pd.read_csv(file_path,header=0)
#オプションの一部
#delimiter:区切り文字指定可能
#header:ヘッダー行指定
#index_col:行のインデックスに使う列指定

npcsv=pdcsv.values

 pandas.DataFrameとしてファイル全文を直接読み込むことができます。
 オプションでヘッダー行指定、区切り文字設定などもできます。





 それぞれ特徴があるので、場合によって何が良いかはわかりませんが、私的には覚えることが少なくて汎用性の高そうな”②for line in file:で読み込む方法”が好みで、使用目的が決まってるなら④、⑤のnumpy, pandasの読み込みも使っていきたいなぁと思いました。

自動着色style2paints使ってみた

f:id:nyanpasuAxela:20190216194411p:plain

 AIを使った自動着色アプリstyle2paints v3をWindowsローカル環境下でアナログ絵に試してみました!
 せっかくなので、PaintsChainerも少しだけ試してます。

style2paints

 style2paintsはGUI形式で視覚的に自動着色できるアプリです。
 ”まずはざっくり塗って、次により詳細に塗る”という2ステップで着色することで精度良く色を塗っているそうです。元論文(Two-stage Sketch Colorization, LVMIN ZHANG et al.)はこちら⇒
http://www.cse.cuhk.edu.hk/~ttwong/papers/colorize/colorize.pdf
f:id:nyanpasuAxela:20190216191245p:plain
 こういうAIを学習させるためのデータセットってどこから持ってきてるのだろうと気になる僕ですが、これについてはDanboroo databaseのイラストを使っているみたいです。


 2019年2月現在では、最新版はオンライン版v4なのですが資金不足でサーバー元が停止していて現状使えない状態になっています。今、お金集めしているみたいなので、そのうち復活するかもです。

 代わりにv3がgithubで配布されていて、ダウンロードして環境構築すれば自分のPC内でオフラインで使うことができます。
 環境構築としては、python, tensorflowや各種pythonライブラリを入れて、githubからデータ、google driveからモデルをダウンロードします。中のserver.pyのパス部分を少し編集して実行すれば使用できます。分かりやすい↓のリンク先の通りやればできました。
Style2PaintsをWindowsローカル環境で動かす : 三毛猫様の部屋

 AI作成用にpython, tensorflowの環境は出来ていたので、10分ぐらいで環境を作る作業は終わりました。

ということで、

 起動して線画選択、
 f:id:nyanpasuAxela:20190216193549p:plain

 矢印マーク>を押すだけでフルオートで自動着色されます。
f:id:nyanpasuAxela:20190216193804p:plain

 おお~~~~( ゚Д゚)
 スケッチブックに書いたものをiphoneカメラで撮ったアナログ絵でもフルオートでもきれいに塗ってくれました。
 
 さらに、手動で色の制御ができます。GUIの下のほうにあるカラーロケータ、ポイントで塗りたい色に点やゾーンを設定すると、その色を参考に塗ってくれます。
 
 f:id:nyanpasuAxela:20190216194411p:plain
 好みの髪の色になりました(*´ω`*)
 せっかくなので、他の色も、

 f:id:nyanpasuAxela:20190216194414p:plain

 
 思ったよりも自動着色きれいに塗れますね♪

 目だけハイライトが欲しかったので、AIが塗ってくれたものを自分でお絵かきソフトでハイライト、目の明かり追加。
 f:id:nyanpasuAxela:20190216195602p:plain

 (○´ω`○)

 自分が塗ったのよりきれいです。

 自分で線画描いたものをAIに着色してもらって、、、

 AIが塗ったものを自分で修正する!って使い方もありですね。

PaintsChainer

 せっかくなので、同種のアプリPaintsChainerもお試し。
 こちらはオンライン上で何も設定しなくても、絵をアップロードすれば勝手に塗ってくれました。
 3つのデフォルト設定があってその中で一番良かったやつ↓
 f:id:nyanpasuAxela:20190216195000j:plain
 

 こちらも色の制御できます。
 f:id:nyanpasuAxela:20190216195134j:plain
 十分すごいのだけれど、色がはみ出したり、にじみ的にstyle2paintsのほうがよかったです。

 

 お絵かきソフトのクリスタの新Versionにもテスト版自動着色があったのですが、何もマニュアル類読まず線画設定だけしてフルオートで実行したら、アナログ絵は全然うまくいかず、デジタル絵は下の通り、デフォルトのままではよろしくない感じになりました。ネット上の情報を見てると設定してキレイに塗れている人もいるみたいです。
 f:id:nyanpasuAxela:20190216200105p:plain
 こちらについては、まだ使い方が分からない状態で適当にやったので塗られた結果や精度はおいておいて、有名どころのお絵かきソフトに自動着色が導入されたのは大きい気がしますね。


 いろいろ試してみて、少なくともstyle2paintsはまだ絵が下手な僕にとっては自分の絵を塗る時の参考になりそうです。
 自分の絵に色が上手に塗ってあるの見るとうれしいものですね♪

 お絵かきの練習もして、AIよりも自分の好みな感じに描けるようになりたいところです(`・ω・´)ゞ

パターン認識のお勉強(はじパタ第3章メモ~ベイズの識別規則~)

にゃんぱすー\(^Δ^)
前回に引き続き、

「はじめてのパターン認識、 平井 有川 著」

の続きをところどころ

  • イメージ化
  • 自分の身近なものへの置き換え、意訳・自分の解釈、関連内容引用
  • 箇条書き化

して、自分用お勉強メモとして記録。
 間違いがあったらすみません、では、はじパタ第3章~ベイズの識別規則~へ!

メモ

○同じ入力Xであっても、毎度出力がYなわけではない。入出力に相関関係はあるが、確率的に結果Yが決まる問題をこの節では扱う。


 ベイズの定理関連のイメージを↓に示す。p,Pは確率とする。

f:id:nyanpasuAxela:20181016194106p:plain

↑最終的には観測データxがクラスCiである確率(事後確率)が最大となるクラスCiが求めたい。
 事後確率P(Ci|x)を直接出せないから、尤度P(x|Ci)から間接的に求める。

 

 本文中の例では、クラスが分かったデータを用いて下記の手順で事後確率を求めている。事前確率P(Ci)と各要素の尤度P(xk|Ci)はデータから直接算出しているが、その他はこの2種データを元に計算している。

 

①事前確率P(Ci)の計算
 ↓
②尤度P(x|Ci)の計算(入力xはベクトルだが、各要素独立としてP(x|Ci)=P(x1|Ci)×P(x2|Ci)としている)
 ↓
③同時確率p(Ci,x) = P(x|Ci)×P(Ci)の計算
 ↓
④周辺確率p(x)=sum[p(Ci,x)]の計算
 ↓
⑤事後確率P(Ci|x)=p(x|Ci)×P(Ci)/p(x)の計算
 ↓
⑥事後確率が最大となるクラスCiに入力xを分類。


尤度比p(x|Ci) / p(x|Cj)閾値より大きいか小さいかでクラス識別するようにもベイズの識別規則は書き変えられる。

条件付きベイズ誤り率・・・2クラス分類にてε(x) = min[P(C1|x), P(C2|x)] ←ベイズで間違える確率

ベイズ誤り率・・・条件付きベイズ誤り率の期待値

↓にベイズの識別規則、誤り率関連のイメージを記す。

 

f:id:nyanpasuAxela:20181016194255p:plain

 

損失L_ijを導入することで誤った時の危険性を考慮(重みづけ)して、クラス識別することが可能。

損失L_ij・・・本当はクラスCjであるものをCiと識別してしまった時の損失。行列。

クラスCiと識別した時の損失r(Ci|x) =sum [L_ik × P(Ck|x)] 各損失×確率の和

損失rが最小になるクラスに識別

ベイズ誤り率で識別性能評価可能⇔事前確率、尤度、識別境界情報必要。

ROC曲線・・・偽陽性率[ε2](本当は陰性なのに陽性と識別する確率)と
        真陽性率[1-ε1](本当は陽性で陽性と識別する確率)を
        横軸、縦軸に取ったグラフ。ROC曲線を使って性能評価可能


↓にROC曲線関連のイメージを示す。   

f:id:nyanpasuAxela:20181016194417p:plain



 

 

 

はじパタ勉強のメモ書きとして書いてましたが、本について細かく書きすぎな気がしてきたので、章ごとに書くのは一旦中止します。

パターン認識のお勉強(はじパタ第2章メモ~識別,学習法概要~)

にゃんぱす\(๑^Δ^๑)


前回に引き続き、

「はじめてのパターン認識、 平井 有川 著」

の続きをところどころ

  • イメージ化
  • 自分の身近なものへの置き換え、意訳
  • 箇条書き化

して、自分用メモとして記録。
 間違いがあったらすみません、では、はじパタ第2章~識別規則と学習法の概要~へ!

メモ

汎化能力・・・識別規則が学習データにないデータを正しく識別できる能力。

代表的な識別規則の構成4つのイメージを↓に示す。

f:id:nyanpasuAxela:20181006140300p:plain

 

 

○識別・・・入力⇒クラスに変換する写像ともいえる。

○学習・・・場合によっては重みwの調整ともいえる。(fx=w1x1+w2x2+・・)

○アフィン関数・・・例:f=b+w1x

○教師データ・・・クラスを持った学習データ
    クラス表示例)
    2クラス分類の場合・・・ {1,-1}
    3クラス以上の分類時・・・t = (0,1,0,0,0,0,0)---K対1符号化(1 hot表現)

○回帰・・・教師のクラスが2値ではない場合、入力xに対し関数を出力するよう学習。
    --被説明化変数・・・回帰の出力
    --説明変数・・・・・回帰の入力

教師なし学習・・・クラスが分かっているデータがない学習。入力データ間の距離、類似度など統計的情報でグループ分けするのが主目的。
          
          
○汎化能力評価・・・入力-クラス対データを学習データセットDLとテストデータセットDTに分ける。学習データで学習した識別規則をテストデータに適用することで測る。
         
汎化能力評価のための学習-テストデータの代表的な分け方を4つ↓にイメージで示す。

f:id:nyanpasuAxela:20181006140451p:plain

 本文中ブートストラップ法の所にマクローリン(テイラー)展開が使われている。

マクローリン(テイラー)展開・・・f(x)=Z+ax+bx^2+cx^3+…の形に変換する方法。一定回数微分してxにゼロを入れれば各係数a,b,c,…が一つづつ求まることを利用して変換する手法。ブートストラップ説明部でこれを(1+x)^nに適用したものを使用している。

 

モデル選択・・・テストデータに対する精度が最高になるようにパラメータ数を選択すること。

↓にモデル選択関連のイメージを示す。

f:id:nyanpasuAxela:20181006141219p:plain

パターン認識のお勉強(はじパタ第1章メモ)

にゃんぱす\(๑^Δ^๑)

これまでに深層学習プログラム実装系の入門書でkerasを使っていくつかプログラム実装したのですが、もう少し理論的なことも知りたくなったので、有名どころで、見た感じ良さそうだった

「はじめてのパターン認識、 平井 有川 著」

を読んでみることにしました。読んでもすぐ忘れそうなので、ところどころ

  • イメージ化
  • 自分の知っているものへの置き換え
  • 箇条書き化
して自分用メモに記録する予定。
 間違いがあったらすみません。では、はじパタ第1章。

 

 メモ

パターン認識・・・対象から特徴を抽出し、その対象が何かを判断するなど物事の類型を知ること。対象は模様などの画像だけでなく、音や匂いなど様々なものがある。

識別規則・・・特徴と何か(タグ)を結びつける規則。

以下、識別のイメージ。

f:id:nyanpasuAxela:20181002202321p:plain

 

特徴には

  定性的なもの(名義尺度[名前など]、順序尺度[大中小など])と

  定量的なもの(間隔尺度[原点が無でないもの、℃など]、比例尺度[原点が無であるもの、ケルビンKなど]

がある。

 

○以降の節で出てくるd次元単位超立方体について第1章で導入。

d次元単位超立方体=[±1/2, ±1/2, …, ±1/2]

と考えると、

中心から、各頂点までの距離は

D(d) = (Σ(1/2)^2)^(1/2) = (d/4)^(1/2)=d^(1/2)/2

となる。そのほかの特性について、下記事が分かりやすかった。


f:id:nyanpasuAxela:20181002210926j:plain

d次元単位超立方体の頂点、辺、面の数は0次元から次元dが上がるにつれて、

  • 頂点の数a[d]・・・1⇒2⇒4⇒8⇒16    ーーーa[d] = 2d
  • 辺の数b[d]・・・・0⇒1⇒4⇒12⇒32  ーーーb[d] = 2b[d-1] + a[d-1]
  • 面の数c[d]・・・・0⇒0⇒1⇒6 ⇒24      ーーーc[d] = 2c[d-1] + b[d-1]

 となる。

 

 

Unityで環境作って愛車動かしてみた

f:id:nyanpasuAxela:20180617113356j:plain

3Dゲームってどうやって作っているんだろうか?ということで試しにUnityで環境作成から物体移動までやってみました。そのメモ書き。Unityは個人使用は無料です。

 

こちらの本、

f:id:nyanpasuAxela:20180617112030p:plain

「24時間で学ぶUnity5 基本操作と開発のコツ」

を現在、読んでる最中です。この本24時間と謳っていることもあり、本にどこまでが1時間目、2時間目とか書いてあります。翻訳版であるため、日本語はところどころおかしいところもありますが、問題ない程度です。まだ11時間目までしか読んでませんがここまでのところ内容的には割と分かりやすいです。

 

まず、次のような流れで環境作成します。

○3Dオブジェクトとして平らな地形(terrain)を設置。サイズ調整。

        ↓

高さの設定。本に載ってたのは2つの方法。

 ①グレーのモノクロ画像を先ほどの平らな地形の高さマップとしてインポートする方法。グレーの画像はデータ的に0から255(8bitの場合)で表せるマップなので、それを高さと読み替えています。

 ②マウスで筆のように高さ変更していく方法。(マウスでクリックすると、触っている部分の高さが変わります。変更量や筆サイズ、スムージングなど各種設定があります)

f:id:nyanpasuAxela:20180617114428j:plain

手動でマウスでやるとモコモコしてテンション上がります(; ・`д・´)

       ↓

テクスチャ(絵)をインポートして貼る。複数テクスチャを貼って、透明度を部分的にマウスでドラッグしながら変えられ、各テクスチャの影響度を変更することができます。

f:id:nyanpasuAxela:20180617115024j:plain

      ↓

○木モデルの設置。木のモデルを選んでインポートし、マウス(筆)でドラッグして設置していきます。下写真のように筆(青い部分)の広さ内にランダムに木が配置されます。高さなども最大、最小、密度など各種設定できます。

f:id:nyanpasuAxela:20180617115402j:plain

f:id:nyanpasuAxela:20180617115519j:plain

わさわさしてます

     ↓

草(ビルボード)の設置。草も木と同じように設置します。木は設定距離以内であれば3Dモデル扱いみたいですが、草はビルボードと言ってカメラ方向を見ている2D画像だそうです。風でどの程度しなるかなど設定します。

     ↓

ライト、スカイボックス(空の映像)、フォグ(霧)、レンズフレア(カメラが明るい光源を見た時の現象)など設定

 

 

環境完成\(๑^Δ^๑)ノ

f:id:nyanpasuAxela:20180617115630j:plain

 

なんか異世界ですね(; ・`д・´)

 

 

 

 

せっかくなので、今まで作った3Dモデル

Blenderで3Dキャラモデル作ってみた - ふぎのモノづくりにっき

3DF Zephyr Freeを使って愛車を3Dモデル化してみた - ふぎのモノづくりにっき

を配置。

 

blenderから3Dモデルを導入

 .blendファイルとテクスチャファイル(.png, .jpgなど)をunityフォルダにインポート。詳細は Unity - マニュアル: Blender からオブジェクトをインポート にあります。

   ↓

 .blendファイルをprojectビューからドラッグ&ドロップして設置。

 この状態ではテクスチャは貼られていません。

f:id:nyanpasuAxela:20180617121427j:plain

  ↓

 先ほどインポートしたテクスチャファイルを一つづつ上写真の3Dモデル該当部にドラッグ&ドロップしていきます。(例:目をモデル上でクリックして選択→目のpngファイルをドラッグして目の部分まで持ってく→ドロップ→他のパーツも一つづつ・・・)

f:id:nyanpasuAxela:20180617121931j:plain

 

 高木さん完成(*´ω`*)

 

②.objファイルの3Dモデルを導入

 .objとテクスチャファイルを一緒にUnityフォルダにドラッグ&ドロップしたら最初から自動でテクスチャ貼られてる状態になっていました。上の高木さんでは、blenderでobj化して同じことをしても自動でならなかったので、原因はわかりませんが、取りあえず、一緒にファイル突っ込んでみて、テクスチャ貼られてなかったら、後からドラッグ&ドロップすればよいと思います。

f:id:nyanpasuAxela:20180617122154j:plain

 

 

 

せっかくなので、愛車を動かしてみました!

UnityではC#もしくはJavaScriptスクリプトをオブジェクトに設定することができます。

下のコードをアクセラオブジェクトに設置。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
transform.Translate(0f, -0.2f, 0f);
transform.Rotate(0f, 0f, 2f);
}
}

 

実際、追記したのは、毎フレーム更新される部分を表すUpdate()部の中に回転運動の2行だけですw

 

この本を見ている限り、Unityでは各オブジェクトに設定が変えられるものが大量にあるのですが、C#上で変更可能なものがかなりたくさんあるみたいですね。

 

キャラクターコントローラーをインポートして、その中のFPSContollerでFPSゲームのように環境内を動けるようにし、実行。

 


unity1nyanpasuAxela

 

おおーーーー(; ・`д・´)

動いた(*´ω`*)