Orraryの天球儀を作ろう2

パーツの印刷が80時間ほどかけてだいたい終わったので

次に必要になる他の材料を調達する

書いてあるのが

688zzベアリング × 11個
683zzベアリング × 14個
684zzベアリング × 1個
624zzベアリング × 1個
M3×10mmネジ × 2個
真鍮パイプ2mm OD × 2本(305mm)
真鍮パイプ3mm OD × 4本(305mm)
真鍮パイプ4mm OD × 1本(305mm)
真鍮パイプ8mm OD × 1本(305mm)
12mm 5V ギアモーター(100rpm) × 1個
USBケーブル

オプション

Slip ring × 1個
5mm LED × 5個
100Ω レジスタ × 1個
電源ケーブル

多いなおい・・・。
真鍮パイプの「OD」て何やねんと思ったけど
外形の略かな?英語で「Outer diameter」だし

あっちの方ではebayで2000円~3000円程で
必要な部品が全て揃うみたいだけど
国内のサイトだと、一番安ところでMISMIで1万行くかなぁ
Amazonで全部買うと2万超えそうな雰囲気

そこで思いついたのが
中国はAlibabaが運営するAliExpress

工業製品に関しては
深センの工場直になるので
中華プライスで部品や変なものを買える

必要なものがあるか調べてみると
ほぼ全部あるけど、値段が安すぎてなんか怖い
ベアリング50個入11ドル送料無料とか
LED500個入りで約5ドル送料無料とか
どんなものが届くのか逆に興味が湧いてくる

ちょいちょいここで物買うけど
今回ほど中国すげぇーとなったのは初めてですわ

全部頼んで約2000円、フィラメント代を入れても
1台5000円以内で完成しそうかな

届くまで多分2週間か一月くらい
先にコンベアのベルト来そうだし丁度いいか

音声認識はボケの新しい扉を開ける

音声認識を使った家電の操作が流行っている
iPhoneのホームが付いたんで「Hey shiri」から電気つけたり
エアコン操作したり家の鍵あけたりと
考えつきそうなものはだいたい操作できる

そんな音声認識で常々作りたいと考えていたものがあり
機械学習は待ち時間が長いのと、コンベアの部品が届かないので
この時間を利用して野望を形にしてみる

用意するものは

Raspberry pi

USBマイク

スピーカー

これにJuliusという音声認識エンジンを設定し
カメラやらスピーカーの設定を済ませ
指定の単語を認識するように辞書を登録してやると

このようなものが完成する

ウルトラソールに違う言葉で反応するから
凄いテンションで「ハイ!!」て言ってる気がする

スピーカーは元々バッテリー駆動出来るタイプ
RaspberryPiを自動起動にしてバッテリーを繋げれば
持ち運んで使えるようになる

だからなんやねん

ネジ穴が無いなら、自力で作れば良いんだよ

コンベア2号機用のアルミフレームが到着し
4面撮り問題は解決先が思いつかないけど
筐体は作れるので、組み上げていく

事前に3Dプリンターで作っておいたコネクターが大活躍!

と思ったらば
アルミフレームの端っこの穴がねじ切りされていない。

気合でネジをねじ込むという選択肢もあったけども
今後も分解と構築を繰り返す事を予定している
ここはネジを自分で切らないとあかんでしょう

購入時のオプションでネジ切りを選べたみたいで
その場合は一本につき100円追加される
自力でネジを切った場合は
ネジ切り用のタップがだいたい1000円

購入した物は80本以上開けれるとか書いてるし
何より柔らかいアルミなら100本以上は行けると考えると
自力のほうが圧倒的に安い

というわけで、元々開いている4.2mmの穴に5mmタップを使い

ネジを切る

切削油が無いので556を代わりに使いガリガリ削っていく
一箇所ネジを切るのに大体40秒かな?
本来は少し削って戻しを繰り返し
削りカスを取り除きながら進んでいくんだけれども
アルミが柔らかいのでサクサク進む

フレームの側に使う10本分の穴あけが、5分程で完了
絶対オプション料払わなくていいわこれ

後は組み立てて
ベルトの駆動部分とかを1号機から移植していけば
とりあえず検証環境2の完成に近づく

4面撮影が一層解決を急がないと行けなくなってきたな。。。

3Dプリンターで何か作ってみよう1

せっかく3Dプリンターがあるので
世間一般の人が良くやるように
何かオブジェクトチックなものを作りたいと考えていて

ふと、あれがあるんじゃないかと調べてみたら
海外で作ってくれている人がおりました


Orreryの天球儀

パーツ点数と必要な物が凄いけど
なんとかなるだろ

とりあえずは、必要な部品を印刷しまくりですな

設定だけでも3Dプリンターの印刷品質は上がる

RepRapで色々出力しまくっていると
今の段階で問題はないけど、もう少し綺麗にならないかとか
印刷に要する時間がもう少し短くならないかとか
色々思ってくるようになる

スピードに関しては、「今欲しい」という場合を除いて
寝ている間か、会社行ってる間に大概終わってるんで
印刷品質のほうが気になる


印刷の設定スピードを変えて出力して見たサンプル
一番右はフィラメントの色が違うので物凄く分かりにくい

左から
積層:0.1mm スピード:40cm/s 充填率:20
積層:0.2mm スピード:20cm/s 充填率:30
積層:0.1mm スピード:20cm/s 充填率:40

という感じで出力
一番右だけ別格で汚く見えますな・・・・。

RepRapというか積層型3Dプリンターの印刷品質を決めるものは

■XYZ軸の正確性、特にXY軸のベルトの張り
■Z軸がベッドと水性になっていること
■ベッドとノズルの隙間
■ノズルの温度
■積層ピッチ
■印刷スピード
■クーリングファンの有無
等々結構色々ある

基本的にスピードを取れば
印刷が汚くなるのは間違いないけど
ゆっくり過ぎても一定ラインからは品質に差が無くなる
ちょうどいい所を適度に突き詰めるのがベストなんだろう

ここから本題

つい最近、ソフト側に「Advanced」なる設定項目があることを発見し

というかずっと見えてるのに気づけよ

そこのノズルピッチと
印刷スピードがRepRapの環境とあっていなかった
ここの設定を合わせて出力すると


奥側が設定変更前で
手前が設定変更後

この印刷物が一番分かりやすかったが
驚くほど印刷品質が向上
レイヤー間の微妙な隙間が無くなり
光沢が出るレベルまでピッタリ詰まっている


こっちは見た目分かりにくいけど
手触りとか、拡大してみると凄まじいレベルで違いが出ている

ここまで出来ると
後は、ベッドの軸受のベアリングにガタがあり往復する時に一瞬跳ねる
これを最適化して、ヘッドの運動の慣性で筐体がガタつくのを
アルミフレームとかで補強してやれば、さらに綺麗になるんかな?

3万のプリンターでここまで出たら
言うことありませんな

Tensorflowの畳み込み層のフィルター設定を色々変えてみる

前回の続きで
畳み込み層とプーリング層の設定を変えまくった結果が以下
全て1層目、数が多いので9枚と適当にピックアップ

1層目は必ず元の写真の原型に近い内容になっていくのかと思ったら
フィルターの数が元の5x5から16x16とかに増えた場合
1層目に近い感じに変化していっている
その分特徴の抽出がちゃんと出来ているのか
正答率は上昇し続け92%前後が出ている

それ以上は学習途中で1に収束してしまっているので
学習データの数が圧倒的に足りないっぽい

学習の階層をいくつか増やしてみると
3層目以降は畳み込みそうとプーリング層のフィルターの関係で縮小化されるので
物凄く変な感じになっている

これは3層目


これは4層目

写っている内容ではなく
あくまで特徴点のみを抽出し学習が進んでいくのが
この辺になると分かりやすいかな?

IBMのワトソンがレントゲン写真から病気の判別で威力を発揮してる
あれとかこの特徴点から判別するCNNの真骨頂な感じもする

とりあえず、パタメーターの調整でどういう傾向になるか
入力、出力層の不一致、テンソルと変数の不一致何かでエラーが出るのと
何を合わせればいいかは大体分かったので
100×100以下の画像で学習する分には
文字認識だろうが、人物判定だろうが何とかなりそう

次は試していく中で判明した大きな画像で学習を進める場合に
最適なパラメーターはどのへんになるのか?これを掘り進んで見る
学習を進めても収束せずに0になるので
計算量も含めて調整が面倒っぽい

みかん学習の最適化を進める

機械学習の数学的にどうなのかの部分はチンプンカンプン
そんな人でも扱えるように多くの人が頑張ってくれた結果生まれたTensorFlow
Ver1のリリースに合わせたGoogleのアナウンスにも感謝の言葉が載っていた
実際今の世の中見ていると素晴らしい成果だと思う

とりあえず動かすには問題ないけど
設定を突き詰めていくと数学的壁にぶち当たり必ず行き詰まる

わかりやす行く用意されている各種パラメーターも
調整可能な項目はかなり大量にあり
組み合わせや学習回数、学習対象まで加味すると
ほぼ無限の組み合わせ条件から探すことになる。

なので幾つかに分けてどんな変化があるのか見てみる

今回はとりあえずフィルター

今動かしている設定だと
みかんの写真を28×28に縮小後
1層目で32通りの5×5のサイズのフィルターを作成
2層目で1024通りの5×5のフィルターを作成
全結合層で1024通り、ソフトマックス層で4通りになっている

プールサイズは全て2x2

数が多いので一部抜粋すると下記のようになる


これが1層目で一番上が元のみかんの写真、左端が作成されたフィルター
並んでいるのが写真にフィルターが適応された状態となる

ほぼ真っ黒な奴もあるんで
ちゃんと特徴点取得出来ているか気になる
学習進めると減るか、内容に変化がでるんかいね

こっちが2層目、こちらも1024枚もあるので一部抜粋

とりあえずこれを標準として
今回はここからフィルターの数を変えた場合にどうなるのか?
少し試してみる

まず、フィルターの数を思いっきり減らす
8枚まで減らし他状態がこれ

1層目はとりあえずみかんの原型が綺麗に残る

次に第2層は16枚まで減らす

2層目はより抽象化した特徴点がきれいに出てる気はする
枚数に関わらずそれなりに出るのね

ちなみにこの時100回学習した結果
テストデータの正答率は52%
初期状態が100回実行で69%だったから結構減ってる

フィルターの枚数を減らした場合は
学習回数を上げないと最適化が進みにくいんかいね
ロス率上げてやると良いのかもだけど
そもそも枚数が少ないからそれはそれで問題なんかな?

次にフィルターの数を1階層を16枚
2階層が64枚に変更してやってみる

相変わらず1階層は黒率が高い・・・。
こういうものなんだろうか?
フィルターの数変えただけではあんまり意味ないのかな


第2階そうは16枚のときと同じく
バリエーションに富んだ見かけ上いい感じのラインナップになっている

この時の100回学習時の結果は69%なので
今回の条件では初期状態と似たような結果が得られている
フィルタの枚数が減少している関係で学習時間は大幅に減っている

フィルターの枚数に関わらず
階層ごとに出力されるフィルターの内容は結構似通っている
特徴店の抽出、と考えると1層目のフィルターは
今回のケースだと正答率に大きく影響しないのでは?と疑問に思ったり

階層の数、フィルターの枚数、サイズ、色々変えてみてどうなるか見てみるかいね

TensorFlow1.0環境に更新

MacでスタートしたTensorFlowの開発環境
後から確認したらバージョンが0.7でビビる
確認時点で最新の0.12にしたところ
同じコードで学習させたらテストデータの正答率が62%まで低下した。。。
検証がいるなぁ~と思っていた矢先に1がでたのでこっちを試す

1に変わってから、関数やらクラスやら引数やら色々変更箇所が出ており
Numpyと組み合わせた時に名称に差異があったのを吸収する目的等で
変わってるんだそうな

ここに詳細が書いてあるけど
一覧にするとそこそこの量が変わっている
移行スクリプトが出ているのと名称の変更ばかりなので
そこまで手間はあんまりないんかな?

とりあえず試している環境では
該当する箇所の書き換えだけで普通に動いた

https://www.tensorflow.org/install/migration

■Variables

tf.VARIABLES                            →  tf.GLOBAL_VARIABLES
tf.all_variables                        →  tf.global_variables
tf.initialize_all_variables             →  tf.global_variables_initializer
tf.initialize_local_variables           →  tf.local_variables_initializer
tf.initialize_variables                 →  tf.variables_initializer

■Summary functions

tf.audio_summary                        →  tf.summary.audio
tf.contrib.deprecated.histogram_summary →  tf.summary.histogram
tf.contrib.deprecated.scalar_summary    →  tf.summary.scalar
tf.histogram_summary                    →  tf.summary.histogram
tf.image_summary                        →  tf.summary.image
tf.merge_all_summaries                  →  tf.summary.merge_all
tf.merge_summary                        →  tf.summary.merge
tf.scalar_summary                       →  tf.summary.scalar
tf.train.SummaryWriter                  →  tf.summary.FileWriter


■NumPyと名前が一致するように

Numpyの関数名と同じになるようにしたそうな

tf.inv                                  →  tf.reciprocal
tf.list_diff                            →  tf.setdiff1d
tf.listdiff                             →  tf.setdiff1d
tf.mul                                  →  tf.multiply
tf.neg                                  →  tf.negative
tf.select                               →  tf.where
tf.sub                                  →  tf.subtract



■Math変数の簡略化

tf.batch_band_part                      →  tf.band_part
tf.batch_cholesky                       →  tf.cholesky
tf.batch_cholesky_solve                 →  tf.cholesky_solve
tf.batch_fft                            →  tf.fft
tf.batch_fft3d                          →  tf.fft3d
tf.batch_ifft                           →  tf.ifft
tf.batch_ifft2d                         →  tf.ifft2d
tf.batch_ifft3d                         →  tf.ifft3d
tf.batch_matmul                         →  tf.matmul
tf.batch_matrix_determinant             →  tf.matrix_determinant
tf.batch_matrix_diag                    →  tf.matrix_diag
tf.batch_matrix_inverse                 →  tf.matrix_inverse
tf.batch_matrix_solve                   →  tf.matrix_solve
tf.batch_matrix_solve_ls                →  tf.matrix_solve_ls
tf.batch_matrix_transpose               →  tf.matrix_transpose
tf.batch_matrix_triangular_solve        →  tf.matrix_triangular_solve
tf.batch_self_adjoint_eig               →  tf.self_adjoint_eig
tf.batch_self_adjoint_eigvals           →  tf.self_adjoint_eigvals
tf.batch_set_diag                       →  tf.set_diag
tf.batch_svd                            →  tf.svd
tf.complex_abs                          →  tf.abs


■その他の変更

tf.image.per_image_whitening            →  tf.image.per_image_standardization
tf.nn.sigmoid_cross_entropy_with_logits →  引数の並びが変更
tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None).

tf.nn.softmax_cross_entropy_with_logits →  引数の並びが変更
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None).

tf.nn.sparse_softmax_cross_entropy_with_logits →  引数の並びが変更
tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None).

tf.ones_initializer                     →  tf.ones_initializer()
tf.pack                                 →  tf.stack
tf.round                                →  Banker'sの四捨五入?丸めこみ?と一致するようになったらしい
tf.unpack                               →  tf.unstack
tf.zeros_initializer                    →  tf.zeros_initializer()


3Dプリンター失敗作品集

3Dプリンターを使っていると必ず遭遇する失敗作
ネット上にも様々な失敗作が上がっている。
せっかくなので3Dプリンターが生み出した謎作品を残しておく


作品No1「ツマ」
刺し身の下とか後ろに敷いてあるあれです
印刷途中から虚空にフィラメントを吐き出し始め
2時間ほどかけて出来上がったのがこれ

RepRap本体の下にも更にすごい量が固まっており
ノズルサイズ0.4mmから出力されたきめ細やかなプラ樹脂による
繊細なツマの表現が素晴らしい作品

作品No2「ひねくれた性格」
iPhoneスタンドを出力し始めたところ
5mmくらい積層が進むごとに何故か5mm手前に積層位置がズレていく

定められた道筋なんかクソ食らえ

データに記された道筋を無視しオノレが進みたい方向に進んでいく
そんなRepRapの強い意志を感じされる感情表現豊かな作品

作品No3「壁画」
印刷を開始した後、何故か上ではなく下に進み始めたRepRap
結果としてヒートベッドをえぐりながら消えない絵(キズ)を刻み込んだ

3Dプリンターは上に積み重ねていくもの
そんな既成概念を覆し、ドリルも何も付いていないのに
おのれの信念のみで鉄の板を削りぬいた魂の作品

作品No4「ドヤ顔」
出力したiPhoneスタンドが中々使いやすかったので
無駄に3台も手元にあるから追加で印刷してやろうと
出力した結果完成された作品

時間がかかるので夜中の間に、後は頼んだと言い残し
朝を迎えると「Complete」の文字とともにドヤ顔で提出された作品
何かが違っている気がする、どこかが間違っているのかもしれない
でもRepRapの8時間の苦労を責める訳にはいかない。