grbl1.1+Arduino CNCシールドV3.5+bCNCを使用中。
BluetoothモジュールおよびbCNCのPendant機能でスマホからもワイヤレス操作可能。
その他、電子工作・プログラミング、機械学習などもやっています。
MacとUbuntuを使用。

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



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


2017年10月20日金曜日

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

ようやくESP32のSPIFFファイルアップローダーが出来上がったようです。これでESP8266のように、Webサーバーをたてたときにindex.htmlなどの付属する外部ファイルを、Arduino IDEを使ってESP32内にアップロードできるようになりました。
ファイルアップローダーについてのページはこちら

インストール方法:
リンク先のこのページから、ESP32FS_v0.1.zipをダウンロードし解凍。
Macの場合は、toolsディレクトリを以下のようにつくって、そこに入れろということです。

~/Documents/Arduino/tools/ESP32FS>tool>esp32fs.jar

以前、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のときと同じ要領

アップロードされた内容のチェック:
アップロードされた内容をチェックするために、以下のreadFile()のところを少し変更。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());
    }
}

あらかじめ、String contentsなどと文字列型変数を用意しておいて、Serial.print(file.readString());の代わりに、contents=file.readString();とすれば変数contentsへ文字列として渡すことができるかと思います。
そして、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を多少内容変更して別名保存後ESP32へアップロード。
シリアルモニターを開いて、'l'でルートディレクトリ内を表示、'r'でindex.htmlの読み込み、'd'でindex.htmlを消去。
そうすると、シリアルモニターの画面では、

ルート内ディレクトリの表示(1〜2行目)、
index.htmlの読み込みと内容表示(3〜18行目)、
index.htmlの消去(20〜21行目)、
再度ルート内ディレクトリの表示(22行目)
という順番で出力され、問題なく機能しているようです。
これで、やっと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月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先生の教え方がいかに上手かというのが分かります。

2017年10月3日火曜日

Coursera: Deep Learning/ コース2、コース3終了

引き続きCourseraのDeep Learningコースのコース2と3を受講しました。

・コース2(3週間):Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
・コース3(2週間):Structuring Machine Learning Projects

コース2においてはRegularization、Dropout、Normalization、ハイパーパラメータの調整、Batch Normなど、けっこう細かなテクニックを学びました。ニューラルネットというよりも、メインのモデルをより効率的に計算していくスキルといった感じです。これもまた実践的な場面ではよく用いられているテクニックのようで、すべてを完璧に習得したというわけではないのですが、それぞれがどんなものなのかということがわかったし、ディープラーニングの世界で用いられているボキャブラリーが増えてよかったと思います。
コース2の後半では、いよいよTensorFlowを用いたプログラミング課題が登場してきました。このままTensorFlowでどんどんプログラミングしていくのかと思ったら、そうでもありませんでした。いままではNumpyだけを使いフルスクラッチでプログラミングしていたけれども、TensorFlowのようなライブラリを使えば一行で済みますよという程度の内容でした。そうこうしているうちにコース2も終わり最後のコース3に突入してしまいました。

コース3ではもうプログラミング課題はなくて、1週ずつ最後に15問のクイズがあるだけです。しかしそのクイズが実際の現場でのケーススタディという設定で、ディープラーニングをつかったシステムを構築している際のデータセットの扱い方や様々なエラーの対処法などに関する問題です。
たしかにこのコースは理論的というよりも実践的スキルと知識を身につけて、すぐにでもこの業界に就職できるかのような教え方をしています。
当初は、ディープラーニングを使った様々なアルゴリズムを習得できると想像していましたが、中心となるアルゴリズム(モデル)に対する細かなテクニック(コース2で学んだ内容)のほうがどちらかというと重要という感じです。あるモデルをつくっても、それが機能するようにするにはデータの扱い方や様々な調整/最適化が必要で、この辺はなかなか独学だと身につけにくい部分かと思います。そんな感じでコース3もあっという間に終わってしまいました。

 コース2の修了書。

コース3の修了書。

結局、現在開講されているDeep Learningコースの1~3を1週間の無料期間内に終わらせてしまいました。前回、受講したMachine Learningコースと重なっている部分もあったので、1〜2週間分を1日で終わらせたというペースです。特にコース1の前半とコース3はすぐに終わってしまうので(動画を見てクイズに答えるだけ)、実質コース1の後半とコース2を数日かけて勉強すればいいという感じです。個人的にはコース2が一番勉強になりました。
1週分約2時間の動画を手書きのノートでメモをとりながら見続けるという感じです。動画を見ているだけだと覚えが悪いので、ノートをとったほうがその後動画を見直す回数もかなり減って効率が上がります。ただ問題は、日本語字幕はまだ準備されていない部分がほとんどなので、英語で覚えないといけないというところでしょうか。
前回、約1ヶ月ほどかけて受講したMachine Leaningコース(11週)のほうが内容が濃かったような気もします。Deep Learningコースは1〜3まで合わせても9週しかないし、そもそも初心者向きでもあるため、それほど大変な内容になっているというわけでもないような気がします。Machine Leaningコースは次から次へと面白いアルゴリズムがでてきてその都度わくわくしましたが、Deep Learningコースはより実践的というか、普段データサイエンティストの人たちがどのようなこと(地味な作業も含めて)やっているのかというのがわかりました。
やはりおすすめは、Machine Learningコース(11週:無料)を受講して、従来の機械学習で基礎を学んでから、その延長というか最近の動向にあわせたDeep Learningコースを受講する順番がいいかと思います。Deep Learningコースも初心者向けなので、このコースから受講してもいいとは思いますが、細かい部分まではあまり丁寧に教えてくれないという感じです。

Deep Learningコース4は一番興味あるCNNなのですが、まだ開講していないので、しばらくは他のコースでもまたのぞいてみようかなと思ってします。

人気の投稿