pythonでのcsvファイル読み込み
python初心者の私、csvファイル、テキストファイルの読み込みの方法がいろいろあって、ごちゃごちゃしてきたのでまとめてみました。
基本的に私が扱うことが多い下図のような1行目ヘッダー、2行目以降数字列のデータを主な対象として考え、どれも最終的にnumpy行列にすることを考えました。
調べて出てきた方法は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使ってみた
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
こういうAIを学習させるためのデータセットってどこから持ってきてるのだろうと気になる僕ですが、これについてはDanboroo databaseのイラストを使っているみたいです。
2019年2月現在では、最新版はオンライン版v4なのですが資金不足でサーバー元が停止していて現状使えない状態になっています。今、お金集めしているみたいなので、そのうち復活するかもです。
代わりにv3がgithubで配布されていて、ダウンロードして環境構築すれば自分のPC内でオフラインで使うことができます。
環境構築としては、python, tensorflowや各種pythonライブラリを入れて、githubからデータ、google driveからモデルをダウンロードします。中のserver.pyのパス部分を少し編集して実行すれば使用できます。分かりやすい↓のリンク先の通りやればできました。
Style2PaintsをWindowsローカル環境で動かす : 三毛猫様の部屋
AI作成用にpython, tensorflowの環境は出来ていたので、10分ぐらいで環境を作る作業は終わりました。
ということで、
起動して線画選択、
矢印マーク>を押すだけでフルオートで自動着色されます。
おお~~~~( ゚Д゚)
スケッチブックに書いたものをiphoneカメラで撮ったアナログ絵でもフルオートでもきれいに塗ってくれました。
さらに、手動で色の制御ができます。GUIの下のほうにあるカラーロケータ、ポイントで塗りたい色に点やゾーンを設定すると、その色を参考に塗ってくれます。
好みの髪の色になりました(*´ω`*)
せっかくなので、他の色も、
思ったよりも自動着色きれいに塗れますね♪
目だけハイライトが欲しかったので、AIが塗ってくれたものを自分でお絵かきソフトでハイライト、目の明かり追加。
(○´ω`○)
自分が塗ったのよりきれいです。
自分で線画描いたものをAIに着色してもらって、、、
AIが塗ったものを自分で修正する!って使い方もありですね。
PaintsChainer
せっかくなので、同種のアプリPaintsChainerもお試し。
こちらはオンライン上で何も設定しなくても、絵をアップロードすれば勝手に塗ってくれました。
3つのデフォルト設定があってその中で一番良かったやつ↓
こちらも色の制御できます。
十分すごいのだけれど、色がはみ出したり、にじみ的にstyle2paintsのほうがよかったです。
お絵かきソフトのクリスタの新Versionにもテスト版自動着色があったのですが、何もマニュアル類読まず線画設定だけしてフルオートで実行したら、アナログ絵は全然うまくいかず、デジタル絵は下の通り、デフォルトのままではよろしくない感じになりました。ネット上の情報を見てると設定してキレイに塗れている人もいるみたいです。
こちらについては、まだ使い方が分からない状態で適当にやったので塗られた結果や精度はおいておいて、有名どころのお絵かきソフトに自動着色が導入されたのは大きい気がしますね。
いろいろ試してみて、少なくともstyle2paintsはまだ絵が下手な僕にとっては自分の絵を塗る時の参考になりそうです。
自分の絵に色が上手に塗ってあるの見るとうれしいものですね♪
お絵かきの練習もして、AIよりも自分の好みな感じに描けるようになりたいところです(`・ω・´)ゞ
パターン認識のお勉強(はじパタ第3章メモ~ベイズの識別規則~)
にゃんぱすー\(๑^Δ^๑)
前回に引き続き、
「はじめてのパターン認識、 平井 有川 著」
の続きをところどころ
- イメージ化
- 自分の身近なものへの置き換え、意訳・自分の解釈、関連内容引用
- 箇条書き化
して、自分用お勉強メモとして記録。
間違いがあったらすみません、では、はじパタ第3章~ベイズの識別規則~へ!
メモ
○同じ入力Xであっても、毎度出力がYなわけではない。入出力に相関関係はあるが、確率的に結果Yが決まる問題をこの節では扱う。
ベイズの定理関連のイメージを↓に示す。p,Pは確率とする。
↑最終的には観測データ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)] ←ベイズで間違える確率
↓にベイズの識別規則、誤り率関連のイメージを記す。
○損失L_ijを導入することで誤った時の危険性を考慮(重みづけ)して、クラス識別することが可能。
○損失L_ij・・・本当はクラスCjであるものをCiと識別してしまった時の損失。行列。
○クラスCiと識別した時の損失r(Ci|x) =sum [L_ik × P(Ck|x)] ← 各損失×確率の和
○損失rが最小になるクラスに識別。
○ベイズ誤り率で識別性能評価可能⇔事前確率、尤度、識別境界情報必要。
○ROC曲線・・・偽陽性率[ε2](本当は陰性なのに陽性と識別する確率)と
真陽性率[1-ε1](本当は陽性で陽性と識別する確率)を
横軸、縦軸に取ったグラフ。ROC曲線を使って性能評価可能。
↓にROC曲線関連のイメージを示す。
はじパタ勉強のメモ書きとして書いてましたが、本について細かく書きすぎな気がしてきたので、章ごとに書くのは一旦中止します。
パターン認識のお勉強(はじパタ第2章メモ~識別,学習法概要~)
にゃんぱす\(๑^Δ^๑)
前回に引き続き、
「はじめてのパターン認識、 平井 有川 著」
の続きをところどころ
- イメージ化
- 自分の身近なものへの置き換え、意訳
- 箇条書き化
して、自分用メモとして記録。
間違いがあったらすみません、では、はじパタ第2章~識別規則と学習法の概要~へ!
メモ
○汎化能力・・・識別規則が学習データにないデータを正しく識別できる能力。
代表的な識別規則の構成4つのイメージを↓に示す。
○識別・・・入力⇒クラスに変換する写像ともいえる。
○学習・・・場合によっては重み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(x)=Z+ax+bx^2+cx^3+…の形に変換する方法。一定回数微分してxにゼロを入れれば各係数a,b,c,…が一つづつ求まることを利用して変換する手法。ブートストラップ説明部でこれを(1+x)^nに適用したものを使用している。
○モデル選択・・・テストデータに対する精度が最高になるようにパラメータ数を選択すること。
↓にモデル選択関連のイメージを示す。
パターン認識のお勉強(はじパタ第1章メモ)
にゃんぱす\(๑^Δ^๑)
これまでに深層学習プログラム実装系の入門書でkerasを使っていくつかプログラム実装したのですが、もう少し理論的なことも知りたくなったので、有名どころで、見た感じ良さそうだった
「はじめてのパターン認識、 平井 有川 著」
を読んでみることにしました。読んでもすぐ忘れそうなので、ところどころ
- イメージ化
- 自分の知っているものへの置き換え
- 箇条書き化
メモ
パターン認識・・・対象から特徴を抽出し、その対象が何かを判断するなど物事の類型を知ること。対象は模様などの画像だけでなく、音や匂いなど様々なものがある。
識別規則・・・特徴と何か(タグ)を結びつける規則。
以下、識別のイメージ。
○特徴には
定性的なもの(名義尺度[名前など]、順序尺度[大中小など])と
定量的なもの(間隔尺度[原点が無でないもの、℃など]、比例尺度[原点が無であるもの、ケルビン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
となる。そのほかの特性について、下記事が分かりやすかった。
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で環境作って愛車動かしてみた
3Dゲームってどうやって作っているんだろうか?ということで試しにUnityで環境作成から物体移動までやってみました。そのメモ書き。Unityは個人使用は無料です。
こちらの本、
「24時間で学ぶUnity5 基本操作と開発のコツ」
を現在、読んでる最中です。この本24時間と謳っていることもあり、本にどこまでが1時間目、2時間目とか書いてあります。翻訳版であるため、日本語はところどころおかしいところもありますが、問題ない程度です。まだ11時間目までしか読んでませんがここまでのところ内容的には割と分かりやすいです。
まず、次のような流れで環境作成します。
○3Dオブジェクトとして平らな地形(terrain)を設置。サイズ調整。
↓
○高さの設定。本に載ってたのは2つの方法。
①グレーのモノクロ画像を先ほどの平らな地形の高さマップとしてインポートする方法。グレーの画像はデータ的に0から255(8bitの場合)で表せるマップなので、それを高さと読み替えています。
②マウスで筆のように高さ変更していく方法。(マウスでクリックすると、触っている部分の高さが変わります。変更量や筆サイズ、スムージングなど各種設定があります)
手動でマウスでやるとモコモコしてテンション上がります(; ・`д・´)
↓
○テクスチャ(絵)をインポートして貼る。複数テクスチャを貼って、透明度を部分的にマウスでドラッグしながら変えられ、各テクスチャの影響度を変更することができます。
↓
○木モデルの設置。木のモデルを選んでインポートし、マウス(筆)でドラッグして設置していきます。下写真のように筆(青い部分)の広さ内にランダムに木が配置されます。高さなども最大、最小、密度など各種設定できます。
わさわさしてます
↓
○草(ビルボード)の設置。草も木と同じように設置します。木は設定距離以内であれば3Dモデル扱いみたいですが、草はビルボードと言ってカメラ方向を見ている2D画像だそうです。風でどの程度しなるかなど設定します。
↓
○ライト、スカイボックス(空の映像)、フォグ(霧)、レンズフレア(カメラが明るい光源を見た時の現象)など設定。
環境完成\(๑^Δ^๑)ノ
なんか異世界ですね(; ・`д・´)
せっかくなので、今まで作った3Dモデル
Blenderで3Dキャラモデル作ってみた - ふぎのモノづくりにっき、
3DF Zephyr Freeを使って愛車を3Dモデル化してみた - ふぎのモノづくりにっき
を配置。
①blenderから3Dモデルを導入
.blendファイルとテクスチャファイル(.png, .jpgなど)をunityフォルダにインポート。詳細は Unity - マニュアル: Blender からオブジェクトをインポート にあります。
↓
.blendファイルをprojectビューからドラッグ&ドロップして設置。
この状態ではテクスチャは貼られていません。
↓
先ほどインポートしたテクスチャファイルを一つづつ上写真の3Dモデル該当部にドラッグ&ドロップしていきます。(例:目をモデル上でクリックして選択→目のpngファイルをドラッグして目の部分まで持ってく→ドロップ→他のパーツも一つづつ・・・)
高木さん完成(*´ω`*)
②.objファイルの3Dモデルを導入
.objとテクスチャファイルを一緒にUnityフォルダにドラッグ&ドロップしたら最初から自動でテクスチャ貼られてる状態になっていました。上の高木さんでは、blenderでobj化して同じことをしても自動でならなかったので、原因はわかりませんが、取りあえず、一緒にファイル突っ込んでみて、テクスチャ貼られてなかったら、後からドラッグ&ドロップすればよいと思います。
せっかくなので、愛車を動かしてみました!
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ゲームのように環境内を動けるようにし、実行。
おおーーーー(; ・`д・´)
動いた(*´ω`*)