これまでのあらすじ:
2016年3月、フェルト生地を手で裁断している際にレーザーカッターがあれば複雑なカットが容易にできるなあと思って、安価になってきたレーザーカッターを購入しようと思ったのがきっかけ。調べていくうちに、合板も切れたほうがいいと思うようになって、CNCルーター(CNCミリング)についても考えるようになった。
Arduinoは以前から使っており、CNCシールドがあると気付いて自作も可能と思うようになった。当初はShapeOkoやX-CARVEを参考にMakerSlide、OpenRail、V-Wheel、2GTタイミングベルトなどで5万円くらいで自作しようと思っていた。AliExpressでも部品が安く買えることが分かって、しばらくは部品探し。探せば探すほど安くて本格的な部品も見つかってくるので、そんなにケチらなくてもいいのではないかと徐々にスペックアップ。最終的には剛性や精度のことも考えてボールスクリューやリニアスライドを使うことになり、予想以上に重厚な3軸CNCマシンをつくることに(約7万円)。
構想から約5週間(制作約3週間)でルーターとレーザーともに使えるようになり、現在はgrbl1.1+Arduino CNCシールドV3.5+bCNCを使用中(Macで)。余っていたBluetoothモジュールをつけてワイヤレス化。bCNCのPendant機能でスマホやタブレット上のブラウザからもワイヤレス操作可能。


CNCマシン全般について:
国内レーザー加工機と中国製レーザー加工機の比較
中国製レーザーダイオードについて
CNCミリングマシンとCNCルーターマシンいろいろ
その他:
利用例や付加機能など:
CNCルーター関係:

*CNCマシンの制作記録は2016/04/10〜の投稿に書いてあります。

2017年10月20日金曜日

ESP32:SPIFFSファイルアップローダー

ようやくESP32のSPIFFファイルアップローダーが出来上がったようです。これでESP8266のように、Webサーバーをたてたときにindex.htmlなどの付属する外部ファイルをESP32内にアップロードできるようになりました。
ファイルアップローダーについてのページはこちら
リンク先のこのページから、ESP32FS_v0.1.zipをダウンロードし解凍。
Macの場合は、toolsディレクトリを以下のようにつくって、そこに入れろということです。

~/Documents/Arduino/tools

以前、ESP8266のときには、Arduino.app内にインストールしたので、Arduino.appを右クリックして「パッケージの内容を表示」してから、
Arduino.app>Contents>Java>tools>ESP32FS>tool>esp32fs.jar
となるようにインストールしても大丈夫そうです。
ただし、今回のアップローダーをインストールする前に、最新のArduino-esp32ライブラリをインストールし直したほうがいいかもしれません(ちなみに再度このページからインストールし直しました)。

インストール後、Arduino IDEでさっそく試してみました。
まずは、「スケッチの例>SPIFFS>SPIFFS_Test」のサンプルを開き、いくつか内容を書き換えて別名保存します。とりあえず、HTMLファイル(index.html)だけのアップロードをしてみました。

用意したindex.htmlを「スケッチ>ファイルを追加」で追加します。
追加されているかどうか、「スケッチ>スケッチのフォルダを表示」で確認。
そうすると、こんな感じで自動生成されたdataフォルダ内にindex.htmlが追加されています。
あとは、この状態でindex.htmlをESP32内へアップロードします。
ファイルアップローダがきちんと所定の場所へインストールされていれば、上のように「ESP32 Sketch Data Upload」が表示されているので、これでアップロードします。このへんはESP8266のときと同じ要領。

アップロードされた内容をチェックするために、以下のfileRead()のところを少し変更。file.readString()を使って読み込み、シリアル出力させてindex.htmlの中身をチェック。

void readFile(fs::FS &fs, const char * path){
    Serial.printf("Reading file: %s\n", path);

    File file = fs.open(path);
    if(!file || file.isDirectory()){
        Serial.println("Failed to open file for reading");
        return;
    }

    Serial.print("Read from file: ");
    while(file.available()){
        //Serial.print(file.read());
        Serial.print(file.readString());
    }
}

そして、loop()内にシリアル通信キー入力で内容確認できるようにしてみました。

int val;

void loop(){
  if(Serial.available()>0){
    val=Serial.read();
    if(val=='l'){
      listDir(SPIFFS, "/", 0);
    }else if(val=='r'){
      readFile(SPIFFS, "/index.html");
    }else if(val=='d'){
      deleteFile(SPIFFS, "/index.html");
    }
  }
}

このように元々のSPIFFS_Test.inoに多少内容を変更してアップロード。
シリアルモニターを開いて、'l'でルートディレクトリ内を表示、'r'でindex.htmlの読み込み、'd'でindex.htmlを消去。
そうすると、シリアルモニターの画面では、
ルート内ディレクトリの表示、
index.htmlの読み込みと内容表示、
index.htmlの消去、
再度ルート内ディレクトリの表示
という順番で出力されました。問題なく機能しているようです。
これで、やっとESP8266同様ファイルアップロードが使えるようになったわけですが、同時にMicropythonのバイナリデータもアップロードできるようになったので、もしかするとMicropythonを搭載したほうがいろいろと便利かもしれません。

最近はもっぱらDeep Learningばかりで、ESP32やRaspberry Pi Zero Wもあまりやっていませんが、ESP32もけっこう環境が整ってきたようなので、そのうち何かに使ってみようと思います。

AliExpress.com Product - Lolin ESP32 OLED Module For Arduino ESP32 OLED WiFi + Bluetooth Dual ESP-32 ESP-32S ESP8266 OLED Module Board1206円(送料無料)この液晶画面がついているESP32 Lolin(Wemos)が便利そうです。

2017年10月16日月曜日

モーションセンサー付きLED電球

いつものようにAliExpressを見ていたら、モーションセンサー付きLED電球を見かけたので購入してみました。LED電球は高価なイメージがありましたが、当たり前に普及してきたせいか、モーション付きLED電球でも数百円です。

AliExpress.com Product - YNL LED PIR Motion Sensor Lamp E27 220v Led Bulb 3w 5w 7w 9w 12w White Auto Smart PIR Infrared Body Sound + Motion Sensor Light5Wで309円、7Wで373円、9Wで409円(それぞれ送料無料)。モーションセンサー付きLED電球は画像左のものであり(電球上面にでっばりあり)、画像右のもの(でっぱりなし)はサウンドセンサー付きLED電球です。どうやら2種類あり、サウンドセンサー付きLED電球のほうがより安価で、3Wで169円、5Wで219円、7Wで255円(それぞれ送料無料)。
Amazonでも見てみると、安いもので1000円前後します。日本製のきちんとしたものだと1500円以上という感じでしょうか。


AliExpressの場合、問題はAC100Vに対応しているかどうかです。中国はAC220Vなので購入する際は事前にメールなどで確かめたほうがよさそうです。今回上のリンク先のショップで購入したわけではないのですが、購入したショップのページにはAC110Vが必要であればコメント欄に書いて下さいと、そうでなければ基本AC220Vの電球を送るという感じでした。ということで、サウンドセンサー付きLEDも気になるので、それぞれ一個ずつ(AC110V用希望と明記して)注文してみました。
サウンドセンサー付きLED電球はAC220V対応のみ:数週間後、到着。モーションセンサー付きLED電球はAC85〜265V対応なので大丈夫でしたが、サウンドセンサー付きLED電球のほうがAC220V対応のものでした。間違って送ってきたのかなと思い、さっそくショップへそのことをメールしました。そうすると、「サウンドセンサー付きLED電球はAC220Vのしかない」という返事がきました。どうやら、製品の仕様が違うらしく、サウンドセンサー付きLED電球はAC220Vのしか製造していないらしい。「AC110V希望と書いたのに、ないのなら発送前にメールできたんじゃ?それならサウンドセンサーのかわりにモーションセンサーのほうでいいから、代替品として送ってくれないか?」と、やや無理な注文をしてみました。そうすると、「わかった」という返事が来て、やっぱり言って見るものだなと思っていると、次の日「代替品を送るにも$2くらいかかるから、他に購入した商品といっしょに送るならいいけど、何か購入するものない?」と返事が来ました。
再度購入+代替品同封:サウンドセンサー付きLED電球は使えなかったため、たしかにもう一つモーションセンサー付きLED電球は必要かもしれないので(設置したい場所が2箇所ある)、「じゃ、もう一個モーションセンサー付きLED電球を注文するから、そのついでに代替品の一個も送ってくれないか?」と聞いてみたら、「それはいいアイデアだ」ということでそうすることにしました。また待つこと数週間、無事届きました。結果、モーションセンサー付きLED電球(5W)一つの注文で、代替品であるモーションセンサー付きLED電球(7W)も送られてきました。なぜか代替品のほうがW数が高い、しかも元々サウンドセンサー付きLED電球のほうが安いというのに。あいかわらず、300円程度の商品(送料無料あるいか送料込み)を購入して、一体いくら儲かっているのか疑問。たぶん、送料だけでも$2はかかるのに。以前、$0.19の部品(送料無料)を注文して、無事送られてきたこともあり、たった20円程度で中国から日本へ郵送できるという仕組みは一体どうなっているんでしょうか?
実際使ってみての感想:モーションセンサー付きLED電球はトイレ用の電球として使っています。ドアをあけただけで勝手につくのでかなり便利です。どうやら照度センサーも内蔵しているのか、昼間は人が近づいても反応しないです。つまり、暗い状態で人が近づくとスイッチオンになる仕組みのようです。スイッチオンになっても、動かないでいると1分前後で消えてしまうことがあります。そのときは手を挙げて動かすなどしたほうがいいかもしれません。以前、ESP8266で音声認識を使ってトイレの電源をオン/オフさせていましたが、やはりトイレに限っては突然行くことが多いので、いちいち音声認識させたり、スマホでスイッチ入れたりするのは面倒です。ということで、Iotならなんでも便利というわけでなく、場所によってはこのモーションセンサー付きLED電球のほうが単純で便利だと思います。
内部の画像:気になったので中を見てみました。
値段相応の安っぽいつくりなので、半球状のデヒューザーをかぽっと外すとすぐに中身がでてきます。右側に見えるモーションセンサー(焦電型人感センサー)の根元に光センサ(Cdsセル)がついています。やはり、明るさも計測しているようです。ちなみに、真ん中の垂直に見える基板にLEDが複数ついています。そして、左側に見える緑色の基板がAC-DC変換降圧回路だと思います。左側に見えている白い導線はそのままスクリュー型の電源端子へ直結しています。この回路はAC85〜265Vと幅広い入力を受け付けるようで、仮にAC220V用のLED電球であれば、この部分を取り替えてしまえば大丈夫そうです。AliExpressでさらに探すと以下のようなまさにLED照明用の降圧変換回路が売っています。LEDなのできっとDC12V程度だとは思うのですが。
AliExpress.com Product - Sumbulbs DC 7-17V 3W 4W 5W 300mA Constant Current Power Supply AC Convertr LED Driver 110V 220V Input for LED Strip Lights171円(送料無料)この回路に取り替えれば、AC220V仕様のサウンドセンサー付きLED電球も使えるかもしれないと思って、中を開けてみると、
こんな感じで、右側のLED基板とその中央にはCdsセルがついており、その裏側にはコンデンサーマイクが降圧変換回路と一体化してついていました。たしかにこの状態だと、降圧変換回路だけ取り替えるわけにはいかないようです。サウンドセンサー付きLED電球がAC220Vだけというのは、この理由からなのかもしれません。ということで、サウンドセンサーの感度を確かめたかったのですが、これを改造するのは面倒なので今回はここまで。

2017年10月13日金曜日

Udemy: GANs and Variational Autoencoderのコース

前回まではConvolutional Neural Networks(CNN)をやっていましたが、GANが気になるのでそちらのコースも受講してみました。CNNのほうはもう少し復習する必要があるのですが、このへんになるとどれも難しいので、とりあえず一番興味あるGANを先回りしてやってみようという感じです。


このUdemyのGANコースでは、前半にオートエンコーダーを学びます。前回のConvolutional Neural Networks(CNN)では元画像を畳み込んで圧縮したりフィルターをかけていましたが、畳み込みはせずにニューラルネットでエンコードすることを実験し、最終的にはエンコードされた画像を再現するようなデコード技術を学びます。画像補間処理のようなものですが、混合ガウス分布というまたもや数学的に難しい内容がでてきます。このあたりの処理になると、確率分布や乱数を使って複雑な方法で画像再現していくようです。一回見ただけではなかなか理解できないので、現在も復習中です。実際のところは、scikit-leranなどのライブラリにはGaussian Mixture modelsの関数が用意されているので、複雑な計算をせずに済みます。ただし、パラメータやどのような特性があるかはある程度理解しておく必要があります。

今回のコースはかなり複雑なことをしているせいか、数学的な説明も多いという感じです。しかも画像メインなので、簡単なサンプルコードであっても出力が終わるまでかなり時間がかかります。
これは最初のオートエンコーダーのサンプルで、一層の隠れ層でReLU、シグモイドで出力という簡単なものです。元画像を参照して再現出力するのでほぼ同じ結果。そのため面白くないけれども、簡単なオートエンコーダーをコーディングする練習になるのでいいかもしれません。

次はVariational Autoencoder(VAE) です。エンコードした後に確率分布を使ってデコードするという技術のようです。KLダイバージェンスという二つの確率分布の違いを測る式を用いて、その差を縮めるような計算をしていくようです。仕組み的には段々抽象的になってきているので、もう少し勉強しなおしたほうがよさそうです。ただ、収束させにくい式をこういった収束可能な式に置き換えて何とか計算可能にしている数学的な工夫が面白いです。当然、数学に詳しくないとこのような発想すら思い浮かびません。
理屈で考えるとかなり難しいのですが、どうやって少ない情報から大きな情報へと再現していくのかというのは徐々に分かってきました。しかしながら、この辺のレベルになると一つ一つがかなり難しい。

そして、いよいよ二つのニューラルネットを切磋琢磨させるかのように使うGANsです。今回は最初にMNIST(手書き数字)で試したあと、画像生成のサンプルでよく見かけるCeleb顔画像を使ってGANを試してみました。このCeleb顔のデータセットがでかすぎる。元画像は一枚178x218pxあり、それがなんと202600枚もあります。

こんな感じで解凍すると、このナンバリングが202600まで続きます。合計で1.78GB。

この178x218pxの画像を64x64pxに切り取って、それをサンプルにします。202600枚あるので、もちろんすべてプログラミング上で自動処理です。

そして、いざGANのサンプルコードをランさせると、50イテレーションごとに一枚生成し約15〜18秒かかります。出力中にYoutubeなど見ていると演算が遅くなったりします。ミニバッチ学習をさせているので、合計で1epoch3165回。これで終わりなのかと思ったら、2epochあるので合計6330回です。計算中も次々画像が出てきます。途中でやめようかと思いましたが、ためしに最後までやってみようと、そのままつけっぱなしで次の日をむかえてもまだまだやっていました。
結局、ここにあるように104804秒(約29時間)かかりました。せいぜい数時間かと思っていたら、1日以上かかったということです。強力なGPUマシンが欲しくなる気持ちが分かります。10〜20倍くらい早くなるそうです。

50回目:まだ始まったばかりなのではっきりしていません。50回ごとに、このような画像が一枚出力されます。

200回目、少し色が濃くなってきました。メリハリがでてきた感じ。

1100回目、それっぽくなってきました。

3000回目、かなり良くなってきたものと、まだ変なものもいくつかあります。特に気になるのが赤い顔の人たち。おそらく約20万枚あるうち何枚かが赤い画像だったのかもしれません。

4500回目、よくみると変なのもありますが、それぞれ固有の色味がでてきたような感じです。人種も様々。

6300回目(最後:127枚目)、もうそれほど完成度があがると言う感じではなさそうですが、平均的な顔というよりはきちんと個性が見て取れるような気もします。合成しているうちに全部似てくるときもあるようですが、今回の場合はそんなことはなさそうです。しかし、よく見ると変なのもまだあります。特に左端の下から3番目は、右向きと左向きの顔が合成されたためか、中央だけ細く存在しています。

見比べると確かに向上しているような気もしますが、やや絵画っぽい作風にも見えます。この出力結果が面白いかどうかというよりも、GANの特長である二つのニューラルネットが互いに競い合うことで生成されるアルゴリズムの仕組みが面白いです。この手の画像生成の技術は次々と新しいのがでているので日々見逃せないという感じです(The GAN Zoo)。

ということで、目標としていた画像生成であるGANのサンプルを試すことができたのですが、単にサンプルを動かしただけなので、これで終わりというわけではありません。ここから、自力でコーディングできるようになるために、かなり難しい理論なども乗り越えながら勉強していく感じです。それにしても、それぞれいろんなアルゴリズムがあって、かなり面白い世界だと思います。ものの考え方もけっこう変わりそうです。

2017年10月9日月曜日

Convolutional Neural Networksのコース

Deep Learningのなかでも、特にGANなどの画像生成の技術に興味があるのですが、その一歩手前としてConvolutional Neural Networks(CNN)も勉強してみようかと、いろいろ探していました。CourseraのDeep Learningのコース4であるConvolutional Neural Networksはまだ開講していないため、もうしばらく待たないといけません(以下)。

Courseraと同様に、UdacityのDeep Learningコースもまだwaiting listのようです(かなり人気あるのかも)。
ほかにも、fast.aiでも無料でCNNの授業はあるようです。一見よさそうなのですが、AWS(有料)を使うようで登録やセッティングがめんどくさそうです。


あとは、前から気になっていたUdemyのDeep Learning: GANs and Variational Autoencodersと同じシリーズのDeep Learning: Convolutional Neural Networks in Pythonというコースです。

GANのコースはあまりないので(fast.aiにはある)、この↑のGANのコースをいずれは受講したいと思っているので、割引価格で1200円(書籍を買うよりも安い)だし、試しにどんなものかということも含めてCNNコースを受講してみることにしました。

Udemy: Deep Learning: Convolutional Neural Networks in Python
このコースでは、TheanoTensorflowの二種類異なる方法でコーディングするようです。Theanoは使ったことはないですがそれぞれメリット/デメリットがあるようで、この他のライブラリも含めどれがいいのかはほとんど好みという感じかもしれません。ただし、Theanoは次の1.0(現在0.9.0)をもって開発終了らしいです(原文)。


このコースの特長としては、試験や課題というものはありません。当然期限もありません。専用の質疑応答のフォーラムはあるので、有料の動画コンテンツ(英語)と質問応答の権利を購入するという感じです。授業で使うサンプルコードに関しては、このコースを受講していなくてもgithubからすぐに手に入ります。
授業内のアルゴリズムや数学的な説明は非常に端的で分かりやすいと思います。数分〜10分程度の動画が合計4時間分あります。ただ動画を眺めているだけではだめで、ノートをこまめにとるとか、コピペなど使わないでコードを書き、実際手を動かすことを強く勧めてきます。たしかにプログラミングの場合はそうしたほうが覚えが早くなります。
数学に関しては、他のコースでも言っていましたが、それほど深く理解しようとする必要はなくて、ライブラリの関数をどう使うのかということに慣れたほうがいいようです。このコースは理論の理解というよりも、コーディングに重点をおいているという感じです。しかし、いきなり本題に入るまえに、簡単なサンプルコードを試したり、いくつかの段階を経て、最後にはまとまったコードを書くということになります。このCNNのコースは上級者向けのようで、基本的なPythonプログラミング、機械学習の基礎は学んでおかなければいけません。たしかに、少し敷居が高そうです。このコース以外にも段階やジャンルに応じていくつかコースがあるので、内容に追いつけない場合は他のコースも同時にやったほうがいいのかもしれませんが、それだけお金がかかってしまいます。

最初のほうのCNNの説明は以下ようなステップになっています。

初心者にとっては、どのような手順で理解していけばいいのか分かりにくいので、このような段階的な説明があると理解しやすくなります。
Convolutionに関しては、まずはフィルターという概念で、Hello worldをしゃべる音源にエコーフィルターを加えるアルゴリズムを書いて実験するところから始まります。次に画像にぼかしフィルターを加えたサンプルで実験します。このへんは最初のエクササイズという感じです。このエクササイズを通して、変換された元データからConvolutionということを感覚的につかんでいきます。その後はこのフィルタリングされた画像をニューラルネットワークに入力して、CNNへと発展させていく感じです。
コーディングはTheanoとTensorflowの2種類用意してあり、もし普段からTensorflowを使っているのであれば、Theanoのコードは使わなくもいいと思います。
できるだけコピペしないで一通り書いてみました。コーディングすると、一行ずつ何をしているのかが分かるので、その分理解も深まります。Theanoのほうでもコーディングしてみると、二つの方法で書くので、さらに理解が深まる感じです。
CNNの大体のパターンはわかったのですが、まだ自力でコーディングはできないので、もう少し繰り返す必要がありそうです。もう少し慣れてくれば、コースに頼らなくても自力で他のサイトなど見ながら勉強していけそうです。

あとで気づいたのですが、CNNは上級者向けで、最も興味あるGANのコースは中級者向けなので、こちらのコースのほうを先にやってみてもよさそうです。

2017年10月4日水曜日

スタンフォード大:CNN for Computer Visionのレクチャー動画

CourseraのDeep Learningコース(コース1〜3)も終わってしまったので、次を探しているところです。興味あるのはConvolutional Neural Network(CNN)、そしてGenerative Adversarial Network(GAN)などのコンピュータービジョンや画像生成に関するアルゴリズムです。

いろいろ調べていると、スタンフォード大のCNNのシリーズレクチャーがありました(以下)。
この動画は今年(2017年)のもので、もうすでに第1回から16回まであります(1動画/約1時間:合計約16時間)。
CS231n: Convolutional Neural Networks for Visual Recognition
というスタンフォード大の授業の動画らしいです。
シラバスのページにはコースマテリアル(資料)のリンクもあり、これに従って一通りCNNについては勉強できそうです。今年の授業なので情報も最新だと思うし。
どうやらこの授業は、今年4/4から開始され、週2回のペース、途中に課題提出などもあり、6/12まで続いていたらしいです。週2回なので、かなりハイペースでやっていると思います。それにしても授業計画ならびにその内容がすごい。いまのアメリカの優れた大学はこんな感じなんですね。
このCNNコースを受講する前に、予備知識としてCS229:Machine Learning(Andrew Ng)を受講しておくといいと言ってますが、これはCourseraのMachine Learningコースの元となっている授業だと思います。
スタンフォード大学コンピューターサイエンス講義リストを見ると、CS230: Deep Learning(Andrew Ng)という授業があり、受講者はCourseraのDeep Learningコースを受けるようと書いてあります。どうやら、CS230の授業とCourseraの授業は同じようです。実際のCS230の授業では、トピックに合わせたさらなるレクチャー、ゲストレクチャーなどがあるようです。シラバスによると、CNNの授業は7週目の11/6からのようなので、それまでにはCourseraのConvolutional Neural Networksも開講するのではないでしょうか。ということであと一ヶ月くらい先という感じ。

追記:
このスタンフォード大学のCNNの動画をしばらく見てみましたが、初回だけFei-Fei Li先生の講義があって、その後はドクターの学生がスライドを見せながらCNNについて講義というか説明しています。教科書の内容をそのまま解説しているだけの授業という感じで、あまり頭に入ってきません。やはり、Andrew NG先生の教え方がいかに上手かというのが分かります。

人気の投稿