DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

ディープラーニングの「モデル構築ってどーすんの?」

f:id:DreamerDream:20180426120852j:plain

前回はディープラーニングにおける「問題」に対する「答え」の作り方を記述しました。

dreamerdream.hateblo.jp

 

今回は用意したデータに従って構築する「学習モデル」について述べてみたいと思いますが、僕はど素人なので違っていることも多々あると思います。

間違った記述があれば是非、やんわりご指摘いただければ幸いです。(ガラスのハートです)

というかはっきり言ってよく解らないまま書いています!

けどkerasを使うとこんな程度の認識で構築できちゃいますよーってことです。

 

モデルの構築とは

ディープラーニングに用いる「人工神経」に対してどういった振る舞いをする神経ネットワークにするか?

という内容であり、ハッキリ言って「決まりはありません!」というかおそらく世界中誰もが「この関数の組み合わせで何でもOK!!」という最適な構築方法を解明していません!

神経の数をいくつにするのか?何段のネットワークを形成するのか?という問題は、実際にモデルを構築して実働実験してみて結果が良ければ良し!という状態ではないでしょうか?

神経数が多ければ多いほど結果が良いとも限らないというのも面白いところ。

人工神経細胞へ刺激が入ると、細胞がどのように適切に処理して活性化するか?否か?を決める「活性化関数」という関数が多種多様に存在し、

シグモイド、ソフトサイン、ソフトプラス、ReLU、切断冪関数、多項式、絶対値、動径基底関数、ウェーブレット、maxout

などがWikipediaに載っているけど、グラフでは表せないような関数もあり素人にはよく解らないのです。

とにかく深く考えずに「中間層」にはこれらの活性化関数の数やら層数などを組み合わせて「考える」神経を構築していく。というのがよく用いられる手法なのです。

 

最終的に決定した出力を統括するのが「出力層」で

回帰、二値分類、多クラス分類

という活性化関数が利用され、「答え」として割合が出力されます

例)0〜4番までの選択肢の場合

[ 0.001 , 0.3 , 0.983 , 0.12 ]

この場合、2番が最有力候補となり「答えは2」と出力されます。

 

 

神経細胞が「活性化」するかしないかを決める「計算方法」が上記中間層の「活性化関数」 

ということだが、よく解らない!

素人がKerasで扱う程度ではあまり気にすることなく中間層にはReLU関数を使っていればいいんじゃないの?って感じでOK(だと思う)。

kerasでこの神経モデルを構築するのはすごく簡単だ。この辺でkerasの「人に易しく」の理念が伺えるところです。

 

hidden_units_first = 300 #入力層の神経数

hidden_units = 100 #中間層の神経数

n_classes = 3 #出力層の神経数(答えの数)

dropout = 0.3 #ドロップアウト割合

model = Sequential()

model.add(Dense(hidden_units_first, activation='relu', input_shape=(【入力次元数】,)))  #入力層
model.add(Dropout(dropout))

model.add(Dense(units=hidden_units, activation='relu')) #中間層
model.add(Dropout(dropout))

model.add(Dense(units=n_classes, activation='softmax')) #出力層

と、予め用意されていある関数をaddで追加していくだけなのです。

ドロップアウトは、ある一定の学習結論に達した神経の繋がりを部分的にカットして考えの「まんねり」を防ぐという役割があるそうな。

 

ここで簡単な図を元に脳神経細胞の話になるが、

活性化」とは、神経細胞の「樹状突起(じゅじょうとっき)」へ刺激が加わったら神経細胞体(しんけいさいぼうたい)」が受け取った刺激に対して反応して「③軸索(じくさく)へインパルス(電気刺激)を発生させる状態のことを言うのです。

発生されたインパルスで軸索終末部(軸索の先)から次の神経の樹状突起へ向けて「神経伝達物質」が放出されることで次の神経が刺激を受け取る。

f:id:DreamerDream:20180507104119p:plain

上記を複雑な繋がりで繰り返すことで脳は情報を処理をしているのです。

※実際の脳では「コネクトーム」と言われる脳神経マップが確認できます。

logmi.jp

上図の青矢印は、機械学習で用いられている「重み(wait)」と言われている部分で、1つの神経細胞からは一定の刺激を次の神経細胞へと流しているが、受け取る側の神経細胞はどこからの神経の刺激をどの程度の容量(重要度)として受け取るか?ということを決定しています。この重要度(重み)こそが「学習」なのです。

(実際の脳神経細胞の場合は神経細胞同士を繋ぐ「間隙」という隙間や伝達物質や受容体といったもっともっと複雑な構造をしている。※最近の研究では伝達コードと考えられていた③軸索自体も何かしらの伝達処理をしているのでは?と考えられているのでもっと複雑。)

 

 

人の脳の少しややこしい話になりましたが機械学習の話でこれは避けて通れない話なので、漠然とでも頭に入れておくしかないのです。

 

Kerasの使い方としては結局 

何個の「神経細胞」をどの「活性化関数」として「何層」用意するか

ということになります。 

 

人間の脳は、神経細胞だけで約140億個とされています。

「え?じゃあ140億の脳神経モデルを作ればスゴイAIができるんじゃないの?」と思うかもしれませんが、そう単純な話ではありません。

そんな数の神経細胞を定義するのはパソコンではメモリー不足でまず無理ですし、人間の脳細胞は実はもっと複雑です。

↓下記リンク先の資料ではスーパーコンピュータで脳神経シミュレートに成功しています。(kerasではありませんが、規模的にはこういうことです)

gigazine.net

スパコンで17億の脳神経細胞と10超のシナプス(神経接合部)を再現しています。

 

 

まあそういうわけでパソコンで扱えるデータなんて高々知れているもので、出来るだけお膳立てして単純なデータを入力してあげる必用があります

白か黒で10×10ピクセル程度で文字として認識できるという手書き文字あたりがやはり扱いやすい最適な課題だと思います。

特に画像入力の場合、入力されたデータをそのまま中間層に持って行くのではなく、「畳み込み層」や「プーリング層」といったできるだけ単純なデータ、特徴を保ったまま圧縮して入力するという方法が用いられています。

↓のサイトが簡単でわかりやすいです。

hokuts.com

 

この一見ややこしい「畳み込み層」「プーリング層」もkerasでは複雑な構造を理解する必用もなく扱う関数が用意されています。 

Conv2D

MaxPooling2D

などという関数がそれにあたります。

例)2D画像の場合

model.add(Conv2D(filters=filters, kernel_size=(10, 10), activation='relu', input_shape=input_shape)) 
model.add(Conv2D(filters=filters, kernel_size=(10, 10), activation='relu')) 
model.add(MaxPooling2D(pool_size=(5, 5)))
model.add(Dropout(dropout))
model.add(Flatten())

これも中間層と同じようにaddで追加するだけです。

それから中間層を構築します。

 

そして、個人的にこれは便利だなーと思ったのが1D用の畳み込みやプーリング層。

これだとグラフ等のデータを特徴を保った状態で入力することが出来るのです!

例)グラフの場合

model.add(Conv1D(filters=filters, kernel_size=(10), activation='relu', input_shape=input_shape)) 
model.add(Conv1D(filters=filters, kernel_size=(10), activation='relu')) 
model.add(MaxPooling1D(pool_size=(5)))
model.add(Dropout(dropout))
model.add(Flatten())

 

テストが足りてなくてあまり具体的コードが書けなかったけど、サンプルコードはWebでも色々出回っているので「kerasでのニューラルネット構築ってこういう感じなのか〜」と感覚的に掴めていただけたら幸いです。

ディープラーニングの「ターゲット?trainってなんなのさ?」

f:id:DreamerDream:20180426115210j:plain

前回はディープラーニングにおける「次元」について述べました。

 

dreamerdream.hateblo.jp

 

今回はディープラーニングで用いられる「ターゲット」「クラス」「データ」「X」「y」「train」「test」などのWebでの参考資料で説明無くよく使われている見慣れない用語のお話です。

 

こういう用語はあまりに普通にサンプルコードで使われている用語なのでほとんどのページには特に説明がありません。

けど初心者の僕には「train?列車?なんで??配列を列車に例えてるとか???」とチンプンカンプンになるわけですよ。

 

ということで解説です。

(教師ありの)機械学習において、機械に学習させるための「問題」とそれに対する「答え」があるわけですね。上記の用語は全てこれらのことを指しています。

まず、「問題」に対する用語

「データ」「サンプル」「X(x)」という用語がよく当てはめられているようです。

次に、「答え」に対する用語

「ターゲット」「クラス」「y(Y)」という用語がよく当てはめられているようです。

 

サンプルソース等では「X-train」「y-train」「X-test」「y-test」という変数がよく割り振られていますね。

この「train」は列車ではなく、「training」(トレーニング)の略だそうです!!(←ややこしいとこで切んじゃねーよっ!!と盛大にツッコミました。)

つまり

X-train」←トレーニング用データの問題

「y-train」←トレーニング用データの答え

「X-test」←テスト用データの問題

「y-test」←テスト用データの答え

という意味です。ハァ、スッキリ解決ですね!!(笑)QとかAにしてほしかった。

 

 

さて、意味が解ったところでXとyを準備することにしましょう。(さっそく使うヤツ・・・いや慣れが必用ですから)

kerasのサンプルに予め用意されている手書き文字などのデータセットにはXとyはセットで入っていますが、自前のデータを用意する場合、Xだけでなく当然yも作らないといけません。

 

例えば

X[[100,0],[100,15]]に対するyを0

X[[10,103],[10,150]に対するyを1

X[[10,10],[10,15]に対するyを2

と用意する場合、

データセットとしてXは3次元配列の

[

[[100,0],[100,15]],

[[10,103],[10,150],

[[10,10],[10,15]

]

それに対応するyは1次元配列の

[

0,

1,

2

]

として用意することが思い浮かぶと思います。

 

実はXはこの状態で機能しますが(前回記述の「正規化」の処理は必用です)、yは

各データごとの割合として配列にして入力する必用があるようです。

[

[1,0,0],

[0,1,0],

[0,0,1]

]

↑(左から0に対する割合、1に対する割合、2に対する割合のように)

例えば、選択肢が5つであれば

[[1,0,0,0,0],[0,1,0,0,0],[0,0,1,0,0]]

↑(0,1,2)ってこと

という具合に選択肢の数だけ配列を用意することになります

 

そして、学習後に問題を出して導き出される「答え」も同じ「割合の配列」なのです!

[0.993, 0.002, 0.017] のような感じ

機械学習ではこの一番大きい数を「答え」としているのです!

 

けど、この配列を答えの数だけ用意してしかも01を間違えずに打ち込むのって大変すぎるんです!

なのでkerasには便利なツールが予め用意してあります!

keras.utils.to_categorical(「答えの配列データ」,「答えとして用意する配列の数」)

で一発変換してくれます!

 

import numpy as np

import keras

y=np.array([0,3,1,2,0,1,2,3,3,2,3,2]) #numpy配列でyを用意

classes = len(np.unique(y)) #変数classesに答えの数を格納

y = keras.utils.to_categorical(y,classes) #yに配列として保存

print y

出力結果

Using TensorFlow backend.
[[ 1. 0. 0. 0.]
[ 0. 0. 0. 1.]
[ 0. 1. 0. 0.]
[ 0. 0. 1. 0.]
[ 1. 0. 0. 0.]
[ 0. 1. 0. 0.]
[ 0. 0. 1. 0.]
[ 0. 0. 0. 1.]
[ 0. 0. 0. 1.]
[ 0. 0. 1. 0.]
[ 0. 0. 0. 1.]
[ 0. 0. 1. 0.]]

 見事に変換してくれますね!

 

では、どうやって数百個もの訓練データの答えを準備するのか?という疑問が残りますね。

方法は幾通りもありそうですが、

例えば、訓練用のデータを「答え0の問題」「答え1の問題」と分けて手動でドンドン回答別のディレクトリに放り込んで行って訓練データの数だけ同じ答えをnumpy配列で放り込むという方法があります。

numpy形式で全配列に同じ値を入れるには

例)

import numpy as np

cls0 = np.full(10,0)

cls1 = np.full(20,1)

とすることでcls0に10個0が格納され、cls1には20個1が格納されます。

統合するには

y = np.append( cls0, cls1 )

とすることでyに統合出来ます。

そして、上記のkerasのcategoricalを利用すると配列を割合に再構築できます。

例)

import keras

classes = len(y.unique(y)) #変数classesに答えの数を格納

y = keras.utils.to_categorical(y,classes) #yに配列として保存

yの配列は各配列順に「割合の配列」として保存されます。

 

問題Xはnumpy配列として準備する必用がありますが、数値データにしろ画像データにしろ予めnumpy配列として1つのファイルとして保存しておくと便利です。

numpy配列の保存はsave()を使います。

例)

import numpy as np

np.save('data0',data0)

np.save('data1',data1)

 

で保存出来ます。

読み出しはload()を使い、統合はappendで統合できます。

import numpy as np

data0 = np.load('data0')
data1 = np.load('data1')

X = np.append(data0,data1,axis = 0)

 

これでXとyの準備がやっと整いました!

しかし、そのままではXもyも「答え0の集合」+「答え1の集合」という順番になってしまうので問題と答えの順番を維持したままランダムに入れ替え必用があります。

ランダム関数を利用すると

例)

import numy as np

indices = np.random.permutation(len(X))
X_train = X[indices[:]]
y_train = y[indices[:]]

 X、yの順番を維持したまま全てランダムに置き換えられます。

これでデータセットの準備が完了です!

 

 

次に、トレーニング用のデータとテスト用のデータを分ける方法について。

先に配列から分けておく方法とkerasの学習時に自動で分ける方法があります。

明確にテストしたいデータがある場合は先に割り振りますが、面倒なので多くのサンプルコード場合はkerasで自動的にテストデータを割り振っていますね。先に分けるのは特殊なケースだと思います。

 

今回は先に分けておく方法を記載します。

例)

X_train = X[:-10]

y_train = y[:-10]

X_test = X[-10:]

y_test = y[-10:]

 

Pythonでは配列の範囲を指定して抜き取る場合、[:]で指定することが出来ます。

X_train=X[0:10]とした場合、X[0]からX[9]の値がX_trainに格納されます。

X_train=X[:]と範囲を無指定にした場合には、全ての値がX_trainに格納されます。

X_train=X[0:-10]というふうに-を付けて指定した場合には、配列最後から10個目までが格納されます。

従って例)の場合、X_trainにはXの先頭から最後から10個を除いた値が格納され、X_testには最後から10個の値が格納される。というワケです。

 

 

ということで、無事にXとyの準備が出来ましたら、次回は学習モデル設定のお話です。

 

dreamerdream.hateblo.jp

 

 

ディープラーニングの「次元ってなに?」

f:id:DreamerDream:20180426114939j:plain

巷では一時期流行になっていた(今はあまり騒がれなくなった?)ディープラーニングとやらに挑戦してみました。

 

一度システムを構成できてしまえればいろいろ改造して「ああなるほど!」となるのだけど、IT系無関係の僕にはディープラーニングニューラルネットワーク? なにそれ?おいしいの?」状態だったので見るもの全てが新鮮で構築が難しい世界・・・。

Webでの情報もあるんだけど、やはり一般的に普及しているものではないのでJavaの使い方とかpythonの使い方のようにさっさとググれないし、ググる用語が解らない!ググっても筆者の書いている用語がまたサッパリ理解できないというループに陥った。

 

てぇことで、同じように困っている人がいると思うので用語とかわかりにくかった事を記録として残しておくことにしました。ありがたく思ってー!(笑笑)

 

まず初めにディープラーニングを手軽に扱うためのパッケージ情報

0からディープラーニングライブラリを作る変態様もいるが(理系の人が適切な書籍を読んで理解すれば3〜6ヶ月くらいで0から完成出来るレベルだそう・・・)、初心者にはまず無理!

↓中でもこの本が大人気でこれさえ理解できれば0から作れるそうな。

 

初めて手軽に扱えるパッケージを探すと、まあ情報錯綜で迷う迷う。

そのなかでも、

有志の研究科たちが共同開発したというTheano(テアノ)、日本での利用者が多く、情報が集めやすいと聞くChainer(チェイナー)、天下の大企業Google様が開発したTensorFlowテンソルフロー)というパッケージがとにかく有名で情報も多いらしい。

 

けど上記のパッケージも初心者には扱いにくい!ということでさらに「人に易しく」をモットーに開発されたラッパーライブラリが提供されている。

それがKeras。Kerasは現在TensorFlowとTheanoに対応している(将来的にはもっと増やす予定らしい)。

現時点ではデフォルトでTenserFlow対応になっているようだけど、少し前まではTheanoだけだったらしい。このへんがWebの情報でややこしいところ。

で、Kerasが使っているパッケージ(TensorFlowとかTheanoとか)のことを「バックエンド」と呼ぶそうな。

けど、Kerasもまだまだ開発途上だそうで設定項目がバージョンによって変わっていたりする(ぜんぜん人に易しく無い感が・・・

 

さて、僕はバックエンドにTensorFlowを選ぶことにした。

理由は単純に、両方動かしてみてTensorFlowの方が初回起動が速かったから。

 

実際のKerasのインストールやらサンプロコードの扱いは他のサイトに委ねるとする。

(バージョンが違えばインストール方法が違うから、だいたいのパッケージはpipでインストールできるらしい。「keras インストール pip」←検索)

 

kerasのサンプルコードによく「MNIST」というのが出てくる。

これは、手書き文字を機械学習できますよーっていうサンプルデータが大体どのパッケージにも入っているので、それの分類するためのコードやサンプルのこと。

「keras MNIST」で検索すると大量のサンプルコードが出て来るので書き方も割愛。

※サンプルコード動かせなかったら本でも買ってとりあえずサンプルだけは動かせるようにしてください。

↓この本の人気が高いがkerasのバックエンドはTheanoのようだ。(違いはよく解らない)

 

で、サンプルコードが無事に動いたら

へー!すっご!で!?結局どーやって自分の作りたいデータを入力するのさ????情報無さすぎ」ってなると思う。

僕もここからなかなか良い情報を見つけられずにいた。適当なリストを作って突っ込んでみて理解不能なエラーいっぱい吐かれて心が折れかけた。

(やっぱり人に易しくない・・・)

 

結論から言うとkerasへのデータ入力は、numpy配列という配列に入れたデータを扱うことになるらしい。

(僕はリスト形式だと思い込んでいて失敗した。)

numpy配列」で検索すると機械学習に関するページが沢山見つかると思う。それだけ機械学習にはnumpy配列が重要ってこと。

(なんならnumpyだけで人工知能の構築が出来ちゃうらしい)

 

numpy配列はPyhonのリストとは扱いが違うが、例えば

p_list = [1,2,3,4,5]

ってーリスト形式なら

n = numpy.array(p_list)

 

で簡単にnumpy配列に変換できる。

 

そして、numpyで便利なのが物理的な「次元」という概念の多次元配列が簡単に作り替えられること!(機械学習では10次元とか100次元とかサラッと出て来るけど、ここで述べている物理(空間図形)的な時間とか立体とかの「次元」や「多次元配列」としての次元と、後で述べる「機械学習での次元」は意味合いが違うことに注意

  

例えば1次元配列は
[ 0 1 2 3 4 5 6 7 8 9 10 11]

2次元
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]

3次元
[[[ 0 1 2]
[ 3 4 5]]

[[ 6 7 8]
[ 9 10 11]]]

4次元
[[[[ 0]
[ 1]]

[[ 2]
[ 3]]]
[[[ 4]
[ 5]]

[[ 6]
[ 7]]]
[[[ 8]
[ 9]]

[[10]
[11]]]]

これは「物理空間図形)的な次元」の意味を込めた多次元配列ですね、けどこれを頭で考えてて入力するのって大変!

まあ、こういうことがnumpyなら[何列,何列]と書いていくだけで一発で変換出来るんです。

 

上記の次元を出すコード

import numpy as np #numpyをnpとして扱いますよー!宣言

p_list = range(0,12) #0〜11までリストに格納

n = np.array(p_list) #ここでnumpy配列に変換っ!

print('1次元')
print n
print('2次元')
print n.reshape([2,6])
print('3次元')
print n.reshape([2,2,3])
print('4次元')
print n.reshape([3,2,2,1])

 

というように多次元配列が簡単に使えるというのです。

これをkerasに入力する時にサラッと扱うので下記の機械学習での「入力次元」と混同しちゃうのです。 

 

えと、先に結論を言っちゃえば、機械学習での「次元」ってのは「ベクトル」のことです!

この説明で理解できちゃう人は以下を読む必用は無いと思われます。

 

 

さて、機械学習で言う入力次元ってのは、少し違っていて画像でいうなら縦横のピクセルを言うそうです。

例)100×100pxの2次元画像を扱うなら「100次元×100次元=10000次元のデータ」と言うような感じ。

 

どういうことかというと、 

機械学習の基本型サンプルデータ(チャート等の単純な数値のデータ)は物理的な多次元のデータでも、一旦フラットな状態、1つのまとまったデータを1次元配列にして入力するのです。

[1.0, 4.9, 3.2, 6.4, 2.0]

↑のような数列型(1次元配列で5個の数値)のことです

 

実際の入力は1次元配列なんだけど、これらの数値を一纏めにしたものを「ベクトル」と呼び、この一纏めの数値を機械学習で扱うので、上記例の数列は5次元のベクトルデータとして扱われるそうです。

ベクトルは、中学?の物理の授業で出て来ますよね。

2次元のベクトルはこんな感じ

f:id:DreamerDream:20180426095719p:plain

3次元空間のベクトルならこんな感じ

f:id:DreamerDream:20180426095758p:plain

 

しかし、ここでは単純に「xに多数の数字を当てはめたもの」と見ておきましょう。

 

 

人間には3次元以上のベクトルデータは理解困難ですけれど、機械学習でのベクトルは3次元以上のデータも2次元のベクトルも同じベクトルデータとして扱います。

 

なので先述例の、100×100pxの2次元画像は「100次元×100次元=10000次元のベクトルデータ(10000個の数値を一纏めにしたもの)」なのです。

(このあたりがなかなか理解出来なかった・・・ずーっと配列の次元のことだと思って混乱してました)

 

さらに!

Kerasに入力するデータは「0〜1の数値に正規化」といって、0~1の間の値で表現するそうで、

例えば上記の

[1.0, 4.9, 3.2, 6.4, 2.0]

という配列ならば1.0を0.0、6.4を1.0としてその間の数値は1.0以下で表現します

[0.0, 0.7222222222222222, 0.40740740740740744, 1.0, 0.18518518518518517]

このような数値を手入力するのは大変なので便利なライブラリの機能を使ったり、簡単な自作関数を用意したりします。

(scikit-learnの機能を使った例)

from sklearn.preprocessing import MinMaxScaler

ms = MinMaxScaler()
X = ms.fit_transform(X)

 

(自作コードの例)

def minmax(data):
  lst = []
  x = max(data)
  n = min(data)
  mx = x - n
  for d in data:
    d = d - n
    d = d / mx
lst.append(d)
return lst

 

X = minmax(X)

 

このように、機械学習にはいろいろと入力データのお膳立てが必用なのでまだまだ一般に普及しないんだろーなーと思いました。

 

次回は、kerasに入力するデータとターゲットのお話です。

dreamerdream.hateblo.jp

 

3Dプリンターで実際に出力されているフィラメントの直径を知ろう

3Dプリンターを長く使っていくとノズルの交換は必須になります。

専用品ではなく汎用品に交換することもあるでしょう。

その際にはキッチリと実際に出力されている材料の直径を測ることをオススメします。

 

直径0.4mmのノズルでも実際に0.4mmでは出力されていません!

実際には0.38mmとかですが、3Dプリンターは0.4mm精度で動いていますからこれが積み重なると表面がスカスカになったり壁の間に隙間が出来たりします。

 

イメージ図を作ってみました 

青枠がノズルが移動する位置(左が上から見た図、右が横から見た積層の図)

f:id:DreamerDream:20180118152159p:plain

ノズルの移動距離と吐出量が適切だと↓のようにまんべんなく出力されます。

f:id:DreamerDream:20180118152206p:plain

ノズルの移動量に比べて吐出量が少ないと↓のようにスカスカになります。

f:id:DreamerDream:20180118152211p:plain

 

ですので移動量を適切に設定しましょう!というお話です。

 

0.01mm単位の高精度で直径を計るにはデジタルノギス必用です。

お値段は1000円ぐらいからあります。

 

100均のは論外、安すぎるデジタルノギスだと0.1単位でしか表示してくれません!

Amazonで検索すると一見0.01mm表示のように見えるけど実はインチ表示してるのもありますから!間違えないようにしましょう!↓

 

f:id:DreamerDream:20180117155947p:plain

mm表示だと0.1mm精度です↓

f:id:DreamerDream:20180117155958p:plain

 

 

そしてオススメなのがノギスの指掛けの部分にダイヤルの付いたヤツ。「サムローラー」と呼ぶのだそうですが、これが親指で高精度に開いたり閉じたり出来るので地味に便利です。

 

f:id:DreamerDream:20180117160612p:plain

↓上記のダイヤルが付いた0.01mm表示のもの

 

これを使って実際に計ってみることにします。

僕の3Dプリンターの0.4mmのノズルから排出された実際のフィラメント径は0.37mm

誤差がありますので何度か計って平均を出すのが良いでしょう。

計る時は無理無くノズルから出て来る量を計りましょう。

f:id:DreamerDream:20180117221543j:plain

つまりこの場合スライサーではノズル0.4mmではなく0.37mmで設定しないといけないということです。

 

加えて、フィラメント径は吐出量が大きく関係しています。

フィラメント交換の為にギュッと早く押し出した時の直径は0.60mm。

f:id:DreamerDream:20180117221551j:plain

 

つまり、吐出し量を多めに調整することで0.4mmを狙うということも可能です。

 

元々3Dプリンターではデフォルトではフィラメントが溢れないようにどちらかというと少なめに吐出するよう設定されているそうです。

吐出量を増やすという方法では

送り出し量が多過ぎると送りモーターへの負担が増えそうです。

加えて多めに押し込んだ場合にはダレるので出力を止める時のキレが悪くなります。

ということで僕はフィラメント径の設定を変える方法を取りました。

 

どちらの方法にせよ、精度を求めるならしっかりと実際のフィラメント径を把握して調整する必用があります

 

精度を求めるならスムーズなフィラメント排出のためスプールホルダーが必用になります↓

dreamerdream.hateblo.jp

 

 

 3Dプリンターの購入でお悩みならコチラを参考にどうぞ

dreamerdream.hateblo.jp

 

3Dプリンター用データをBlenderで作る⑥.stlや.objデータを変換するソフトMeshLabの使い方

 前回記事

dreamerdream.hateblo.jp

 

通常はBlenderで作ったオブジェクトを.stlへエクスポートして3Dプリンター用のスライサーソフトへ移動させるのですが、

f:id:DreamerDream:20180116090654p:plain

 

僕の環境の場合ではBlenderが吐き出す.stlデータに不具合があってうまく吐き出せない場合があります。処理能力の問題なのか何なのかは不明。無料で使えるソフトなのでそこは文句言いません。

データが壊れちゃってるよー!ってヤツね。

f:id:DreamerDream:20180116092506p:plain

 

この場合.obj形式でエクスポートした後変換ソフトを使って.stl形式へ変換することでうまくいく場合があるのでその方法をご紹介。

 

ソフトは「MeshLab」という無料のオープンソースの3Dデータ編集ソフトを使う。

MeshLab

このソフトは編集をサポートするもので、ポリゴンデータの頂点を消したり辺を加えたり回転させたりと不具合のあるデータの穴埋めをしてくれるツールで型変換以外にもインストールしておくと何かと便利。

 

まずは.objへエクスポート

f:id:DreamerDream:20180116090733p:plain

 

MeshLabに読み込まれると回転させて見られるようになる。

f:id:DreamerDream:20180116091210p:plain

 

変換は簡単。

FileメニューのExport Mesh As...を選択

f:id:DreamerDream:20180116091324p:plain

エクスポートの形式を*.stlに変更。その他にも様々なエクスポートへ対応している。

f:id:DreamerDream:20180116091432p:plain

特に何を弄るでもなく、そのままOKで変換完了!

f:id:DreamerDream:20180116091526p:plain

 

ただ、スライサーに読み込むと方向が違うよー!

ってことがあります。

f:id:DreamerDream:20180116091718p:plain

 

この場合はMeshLabで回転させます。

Filters → Normals... → Transform:Rotateを選択して

f:id:DreamerDream:20180116091922p:plain

ウィンドウの回転軸をX設定、角度を90度指定、Previewにチェックを入れることで反映されたものが表示されるので問題なさそうであればApplyをクリックして先述のように保存します。

f:id:DreamerDream:20180116092052p:plain

 

スライサーソフトで読み込んでみて思った方向に回転出来ていればOK!

配置がおかしければ軸や角度等を弄ってみてください。

f:id:DreamerDream:20180116092256p:plain

 

次回、簡易変形でオブジェクトをねじります。

dreamerdream.hateblo.jp

 

 

Blender用の書籍も沢山ありますので参考にしてみてください↓

 

 

 

無料のスライサーソフト、Slic3rの使い方は↓をご参照ください。

dreamerdream.hateblo.jp

 

 

 3Dプリンターの購入にお悩みならコチラを参考にどうぞ。↓

dreamerdream.hateblo.jp

 

dreamerdream.hateblo.jp

 

 

3Dプリンター用データをBlenderで作る⑤オブジェクトを回転させる

 前回は変形でした。

dreamerdream.hateblo.jp

 

今回のテーマはオブジェクトの回転です。

 

回転ですから、回転が解りやすいよう、単純でない適当なオブジェクトを用意しました。

f:id:DreamerDream:20180115155108p:plain

オブジェクトモードで選択して、下の「回転」メニューを選び、XYZの各軸をマウスカーソルで動かすことでオブジェクトの回転は出来ます。

f:id:DreamerDream:20180115155111p:plain

また、右メニューにはXYZの回転角度が表示されています。

(無ければNキーで呼び出します。)

f:id:DreamerDream:20180115155114p:plain

この回転角を任意に設定することで厳密な回転をさせることも出来ます。

f:id:DreamerDream:20180115155116p:plain

 

回転軸を変えるには、中心点を変える必用があります。

その場合、まず3Dカーソルを明確な位置に設定します。

f:id:DreamerDream:20180115155119p:plain

その後、原点を3Dカーソルへ移動すると、

f:id:DreamerDream:20180115155122p:plain

3Dカーソルがオブジェクトの原点となります。

f:id:DreamerDream:20180115155125p:plain

任意に回転させることが出来るようになりました。

f:id:DreamerDream:20180115155128p:plain

3Dカーソルはオブジェクト上でなくても大丈夫です。

このように回転させてはコピー&ペーストを繰り返すと羽根やギアのようなものも作成できます。

ただ、ギアの歯ような沢山のものになると面倒ですよね。

f:id:DreamerDream:20180115155130p:plain

 

沢山コピペしたい場合は「編集モード」に入り、「Aキー」で全選択

f:id:DreamerDream:20180115155133p:plain

ツールの「スピン」を選択します。

f:id:DreamerDream:20180115155137p:plain

メニュー下のスピン設定で細かく設定します。

f:id:DreamerDream:20180115155139p:plain

必ず「複製」にチェックをしましょう。

角度は計算式でも大丈夫です。実際には選択したオブジェクトを省いた回転角と数なので、今回の場合は12個。つまりステップ11、360°から1個分のオブジェクトを引いた角度を求めます。

f:id:DreamerDream:20180115155143p:plain

回転軸の中心、座標軸を任意に設定出来ます。

f:id:DreamerDream:20180115155147p:plain

座標軸は単純にX軸に対して回転させる場合はXを1.0、その他を0に設定します。

Z軸に対して回転の場合はZを1.0、その他を0にという感じで任意に回転方向を選択できます。

f:id:DreamerDream:20180115155151p:plain

オブジェクトモードにすると確定され1つのオブジェクトとなります。

f:id:DreamerDream:20180115155154p:plain

 

同じ要領でギアを作ってみましょう。

まず、ベースとなる円柱とギアの歯となる立方体を用意します。

f:id:DreamerDream:20180115155159p:plain

立方体をギアの歯の型に整えて

f:id:DreamerDream:20180115155202p:plain

編集でスピンさせると、ほら!

f:id:DreamerDream:20180115155206p:plain

ギアの出来上がり!

f:id:DreamerDream:20180115155209p:plain

実際使えるギアを作ろうとすると歯の噛み合わせやらなにやら計算が大変だったりします。

そんな場合には簡単にギアが作れるWebアプリがありますのでこちらが便利!

Gear Model For 3D Printer

任意の型と比率のギアを作って.stlでダウンロード出来ます。

 

 

次回は.stlや.objファイルの変換ソフトのご紹介です。

dreamerdream.hateblo.jp

 

 

3Dプリンターの購入にお悩みならコチラを参考にどうぞ 

dreamerdream.hateblo.jp

 

 

dreamerdream.hateblo.jp

 

3Dプリンター用データをBlenderで作る④オブジェクトを変形させる

Blenderで3Dプリンター用のデータを作る時に使う色々な変形方法を纏めてみた。

 

前回は部品を組み合わせたり削ったりしながらオブジェクトを形成したが、今回は伸ばしたり縮めたりして変形していく。 

dreamerdream.hateblo.jp

 

まずは簡単なICO球をつくって

一番オーソドックスな変形方法である「編集モード」での変形。

f:id:DreamerDream:20180115115028p:plain

 

こでれ右クリックで選択した面(予め下メニューの「面」を選択しておく)

をXYZ軸に対して自由に操作できる。

f:id:DreamerDream:20180115115032p:plain

面の向きを軸として操作したければ、座業系をデフォルトの「グローバル」から「ノーマル」へ変更することで面に対した各軸方向へ移動することができる。

f:id:DreamerDream:20180115115043p:plain

以上が基礎の「編集モード」での変形。

 

 

次に、「スカルプモード」での変形

f:id:DreamerDream:20180115115050p:plain

スカルプモードにはいろいろなコテが用意されていて、粘土細工のように直感的な変形が出来るようになっている。

f:id:DreamerDream:20180115115053p:plain

しかし、このままオブジェクトの表面をなぞると、このようにビミョーな変形が・・・イメージと違いますよね

f:id:DreamerDream:20180115115056p:plain

そこで右メニューの「ツール」タブの「Dyntopo」を有効にしてみましょう。

f:id:DreamerDream:20180115115059p:plain

同じようにオブジェクトの表面をなぞると、凸凹と細かく変形してくれます

これは面を適宜最適なポリゴンで細分化してくれる機能です。

で、デフォルトでは左右対称になります。

※最初のオブジェクトが細かければもっと綺麗な線になります。

f:id:DreamerDream:20180115115102p:plain

これはツールタブの対象/ロックの項目がデフォルトでX軸有効になっている為です。

f:id:DreamerDream:20180115115106p:plain

選択されているボタンをもう一度押すと解除されます。

f:id:DreamerDream:20180115115109p:plain

スカルプモードでは、このように直感的な操作でオブジェクトを生成していくことが可能です。

その反面、他の方法でメッシュの変形を加えるとエラーが出やすいらしいので要注意です。

 

 

次は編集とスカルプモードの中間的な感じの変形方法、ラティスで変形してみます。

f:id:DreamerDream:20180115115112p:plain

オブジェクトモードのまま「生成」からラティスを選択します。

f:id:DreamerDream:20180115115116p:plain

ラティスはデフォルトで立方体ですので変形させたいオブジェクトを囲う、あるいは変形させたい場所だけ入るように生成配置します。

f:id:DreamerDream:20180115115119p:plain

右メニューにはるラティスを選択するとU,V,Wの値を設定します、これはラティス変形のメッシュの数です。

f:id:DreamerDream:20180115115121p:plain

例えば、5、5、5とすれば

f:id:DreamerDream:20180115115131p:plain

ラティスメッシュがXYZ各軸に対して5本入ります。

f:id:DreamerDream:20180115115138p:plain

変形させたいオブジェクトを選択して、

f:id:DreamerDream:20180115115142p:plain

右メニューの「モディファイやー」からラティスを選択します。

f:id:DreamerDream:20180115115146p:plain

オブジェクトで先ほど生成した「ラティス」を選択します。

f:id:DreamerDream:20180115115150p:plain

オブジェクトの選択をラティスに戻し、編集モードにするとラティスを変形させることが出来ます。

f:id:DreamerDream:20180115115153p:plain

ラティスの点を選択してXYZ方向に動かすとオブジェクトがそれに付随して変形します。

f:id:DreamerDream:20180115115157p:plain

 

いかがでしたでしょうか?

「変形」といっても色々な変形方法があります。

Blenderは実に奥が深いです。

 

行き詰まったら書物を利用しましょう。


 

 

次は回転について
dreamerdream.hateblo.jp

 

3Dプリンターの購入にお悩みならコチラを参考にどうぞ 

dreamerdream.hateblo.jp

 

dreamerdream.hateblo.jp

 

 

kampa.me