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

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



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


2017年11月12日日曜日

Deep Learning用GPUノートパソコン

Deep Learningで学習する際に、現在使用しているMacbook Pro(2014年製)だとCPU計算のため数十時間とか普通にかかってしまいます。あまりにも効率が悪いので、GPU搭載のパソコンの必要性が高くなってきました。GPUパソコンを新規購入せずにクラウド(有料)で計算させる方法もありますが、外付けGPUという手段もあるようです。性能的な面から言えばデスクトップ型のGPUパソコンが一番効率良さそうですが、個人的には持ち歩きをするために、幾分スペックが落ちてもGPUノート型(ゲーミングノートパソコン)がいいかなと。

外付けGPU:
最近は、MacBookでも外付けできるGPUがあるらしい。

こちらはグラフィックボードは別売り。

GIGABYTE ビデオカード GTX1070搭載 外付けVGA BOX GV-N1070IXEB-8GD
Posted with Amakuri at 2017.11.10
日本ギガバイト
販売価格 ¥84,812
こちらはGeForce GTX1070も含まれた値段。Macで確実に動くかどうかは分からないけれども、10万円以下で高速になるのであればかなり助かります。

GPU比較:
ということで次はGPUの比較。最近のNVIDEAのGPUだと、
GeForce GTX 1080Ti : 約10万円(922)
GeForce GTX 1080 :約7万円(725)
GeForce GTX 1070 :約5万円(602)
GeForce GTX 1060 :約3万円(440)
当然数字が大きいほどパワフル。()内の数字はドスパラによるベンチマーク値。主にグラフィック処理に関する数値だと思うので、Deep Learningにおける並列計算でのベンチマークとは少し違うと思いますが一応目安として。
一番下のGTX 1060は比較的安価ですが、それでも現在のMacBookよりは遥かに速いはずです。個人的にはGTX1070が無難かなと思うので、外付けなら合計で8万円前後となりそうです。しかしながら外付けの場合は、ThunderBolt経由となるのでスピードがワンランク落ちるらしい。
ということから、GPUを外付けするよりも新たにGPU付きパソコンを購入したほうがよさそう(現在のMacBookも古くなってきたし)。

デスクトップかノートか:
新規購入となるとデスクトップ型かノート型かということになります。当然デスクトップ型のほうがコストパフォーマンスは高くなりますが、現在のMacBookのかわりに使うことにもなるので、ノートのほうが個人的には好ましい。ということで、GPU付きノートパソコンを探すことに。

GPU付きノートパソコン:
GeForce GTX 1070搭載ノートPCとなると20〜25万円のゲーミングノート。値段的には新しいMacBook Proとあまりかわらないけれども画面サイズが15型になってしまう。現在のMacBook Proは13.3型で非常にコンパクトなのですが、15型になると持ち運びするには大きすぎるし重量もあります。

14型以下のGPUノートパソコン:
ゲーミングノートパソコンのほとんどが15型以上となる中で、数少ないながらも14型以下もあるようです。しかし、そのほとんどがGeForce GTX 1060以下となってしまいます。とはいっても普通のMacBook Proよりは断然速い。一つ前もMacBook Proを使っており、現在もMacBook Pro、次もMacBook Proを購入することになると思っていましたが、せっかくなのでGPU付きに方向を変えてみようかと。そうすると以下の3つが候補。

Dell Alienware 13(194,378円/税込み)、画面13.3インチ、330x269x24mm、2.6kg
MSI GS43VR (195,000円/税込み)、画面14インチ、345x245x22.8mm、1.8kg
Razer Blade 14(234,144円/税込み)、画面14インチ、345x235x17.9mm、1.86kg

追記:
上記は2017年製の型番であり、2018年製であれば
MSI GS65 Stealth Thin 8RE-005JP(Arkで233,800円)、357.7×247.7×17.9mm、1.88kg
がいいかもしれません。


それぞれ以下のようなスペックでの比較にしてみました。
画面サイズ:14型未満
RAM:16GB
HD:SSD256GB
GPU:GeForce GTX 1060
*GeForce GTX 1060未満のゲーミングノートもあるのですが、候補外にしてしまいました。

Alienware 13は、Dellとは言え独立したブランドらしく、ほとんどDellらしさはありません。見た目的にはかっこいいゲーミングノートという感じ。タッチパッド部分が光るというのは珍しいけれども、左右クリックボタンがついているのが、個人的には邪魔という感じ。画面が13.3インチで一番コンパクトなのですが、なぜか重い。ゴツい排気口もあって頼もしそう。そのため少し縦長ですが、元々コンパクトなのでそれほど大きさは気にならないかもしれません。41,400円上乗せすれば、MacBook ProのRetinaディスプレイと同等の2560x1440の高解像度+タッチパネルに変更できるようです。ゲーム目的ではないのでそこまでは必要ないと思います。秋葉原にショールームもありサポート窓口になってくれるらしく、国内でもサービス面ではなんとか大丈夫そうです。
MSI GS43は、見た目はいかにもゲーミングという感じですが、中身的にはバランスがとれていそうです。排気もけっこうこだわっているようです。故障やサービス面については秋葉原のArkが窓口になるようです。通常ノートパソコンでは後からメモリ増設ができないものが多いのですが、MSIの場合Arkに持っていけば対応してくれるようです。重量も1.8kgなので、ゲーミングノートのなかでも軽量な方です。アメリカでも人気あるようです。それと保険が最初から2年ついています。

Razer Blade 14は、MacBook Proを真っ黒にしたようなシンプルでスタイリッシュな外観ですが、完全に外国製品という感じで取り扱っているところも少なく、故障の際も部品取り寄せなど面倒らしい。値段もやや高価。厚さも薄くスペック的にも悪くはないのですが、日本に窓口ができれば値段を引き下げることも可能だろうし、もう少し安心して購入できそうです。付属のACアダプターも小型化の工夫がされているようです。

まとめ:
おそらく現在使用しているパソコンと比較した場合に、それぞれの印象が異なると思います。個人的には、Alienware 13はサイズはいいのですが重いというのがひっかかります(現在13.3インチMacBook Proが重量1.57kgなので)。
外観においてはMSI GS43が一番かっこわるいのですが、2年保証付きで、後からメモリ増設可能であったり、サービス/サポート面や機能面においては一番優れていそう。
Razer Blade 14は確かに魅力的ですが、国内サポート面での不安定さとやや高価であるという部分がひっかかります。数万円高価になるなら、他の機種においてメモリを16GBから32GBに取り替えたほうがよさそうとも考えてしまいます。
ゲームをするわけではないので、やはり総合的に見るとMSI GS43がよさげです。見た目さえ我慢すればいいという感じです。

通常、デスクトップ型にGTX 1070を積むのがコストパフォーマンスに優れるのだと思いますが、現在使用しているMacBook Pro(13.3型)の代わりにもなるものとしてポータブルなものを選ぶと14型のGTX 1060ゲーミングノートパソコンとなってしまいます。そのため性能的な意味においては妥協しなければならないのですが、それでもMacBook Proよりは遥かに速いので不満は残らないでしょう。

AnacondaでPythonを管理してPytorchを使おうと考えているので、そうするとWindowsだとやや不都合があるため、OSはLinux/Ubuntuにしたほうがよさそうです。

追記:
最近はGoogle Colab(無料GPU/TPUクラウド)を使えば高速演算が可能なので、必ずしもGPU付きコンピュータが必要ではなくなったかもしれません。

関連:
GPU:GTX1060で再度DCGAN(CelebA)を試してみる
Google Colabの無料GPUで強化学習(Keras-RL)を試す


2017年11月10日金曜日

Google AIY Voice Kit(Pimoroni)到着

一ヶ月ほど前にPimoroniに注文していたGoogle AIY Voice Kitが到着(26.33ポンド/約4000円:送料込み)。いわゆる音声認識キットで、元々は雑誌MagPi(57号/2017年5月)の付録です。当初はあっという間に売り切れてしまい、その後Ebayなどでも1万円くらいの高値がついていました。以前、ESP8266とWeb Speech APIで音声認識スイッチをつくっていたときも入手困難となっており諦めていましたが、ちょっと前に再販したようで一ヶ月ほど待たなければいけない予約販売でしたがついつい買ってしまいました。
現在Pimoroniではもうすでに売り切れのようですが、日本のKSYでは11月末以降に入荷されるようです(3000円/税抜き)。

中身はこんな感じ。75ページもあるカラー小冊子マニュアル。Web上ではAIYのサイトであるここにマニュアルがあります。
1時間もあれば一通り試すことができそうですが、個人的には音声認識に対する興味はやや失せてしまっており、まだやる気が起こりません。あと、Googleを使わなければいけないというのも、やや面倒。

この丁寧に説明されているマニュアル(冊子)を見ると面白そうですが、最近ではGoogle Home mini(6480円)、Amazon Echo Dot(5980円)、Anker Eufy(4980円)という小型で安価なスマートスピーカーも登場してきたので、このAIY Voice Kitを買うまでもないかも。たしかに微妙なところ。しかし、いろいろ試したりするにはいいのかもしれません。製品よりはHackしやすいはず。

AIY Voice Kitの紹介動画。

基本的にはGoogle Cloudのアカウントをつくり、Google Assistant SDKを通して、ラズパイに書いたPythonスクリプトで動かすようです。以下のサイトにはサンプルなどがあるので、Pythonで任意のプログラムを書き換えればいろいろ応用はできそうです。
Googleにとっては、Google Cloudを使ってもらう切っ掛け(宣伝)としてはいいのかもしれません。
そのうち気が向いたら組み立ててみようと思います。

2017年11月8日水曜日

Wifiカメラ付きLED電球/AliExpress

以前AliExpressから購入した人感センサ付きLED電球の延長で、またいろいろと物色していたら今度はカメラ付きのLED電球というものがありました。以下。

AliExpress.com Product - light bulb Wireless camera 960P bulb Panoramic 360 degree camera with fisheye lens use E27 Port 1.3MP LED Bulb wifi camera3283円(送料無料)
どうやらスマホを通して、照明をON/OFFしたりカメラで監視できるようです。カメラがついているため少々高価ですが、マイクやスピーカも内蔵されているようで、スマホからの呼びかけで音もでるようです。カメラやWifi技術が安価になったため、このような装置は簡単に製品化できるのでしょう。既存の電球のソケットに差し込むだけでいいのでインフラを変える必要もないし設置場所もとらずに済みます。Iotや人工知能で複雑なことをしなくても、こういった既存の安価な技術の組み合わせだけでも、まだまだ便利なものをつくることはできそうです。スマホやパソコンだけではなく、そのうちすべての電化製品にカメラとWifiが標準装備されていくのでしょう。ただ、このような装置を配置することで、人工知能に必要なデータを収集していくには便利かもしれません。オフィスや普通の家庭内の各部屋にこのようなカメラ付き照明が取り付けられるのだとは思いますが、プライベートが筒抜けになるので、その辺は気をつけたほうがいいのかもしれません。店舗などに設置すれば、セキュリティだけでなく客層や客の行動パターンなどのマーケティングに有効なデータが簡単に集められそうです。ついつい、人工知能の技術を用いて何ができるかというアウトプット側のインテリジェントデバイスばかり想像してしまいますが、このような人工知能に必要なデータ収集するインプット側のデバイスを安価につくるのもこれからは必要だと思います。アウトプット側のデバイスについては、やはり既にデータセットを持っている大企業にはかなわないので、中小企業はインプット側(データ収集側)のデバイス開発をしたほうがいいのかもしれません。そうすれば、人工知能のノウハウを持たない中小企業であっても、人工知能に便乗した製品をつくることができ存続していけるのかもしれません。まだ購入はしていないのですが、そのうち購入してみようかと。

2017年11月1日水曜日

Coursera: Convolutional Neural Networksコース開講

ようやくCouseraのDeep Learningシリーズのコース4であるCNN(Convolutional Neural Networks)が開講したようです。

以前コース1〜3までは受講してしまい、その続きとなります。UdemyのCNNコースで一通り学びましたが、復習も兼ねてやってみようかと。再登録というかたちになるのですが、料金($49)を支払ってのenrollというよりは、単なる聴講というかたちで覗いてみることにしました。聴講(無料)でも、講義の動画やプログラミング課題まではアクセスできるようです。ただし、字幕はまだ英語のみ。

CNNコースは:
Week1: Foundations of Convolutional Neural Networks/動画106分
Week2: Deep convolutional models: case studies/動画99分
Week3: Object detection/動画84分
Week4: Face recognition & Neural style transfer/動画79分

という構成になっており、各Weekでクイズやプログラミング課題があるようです。
後半の物体検知/顔検知/スタイル変換は面白そうです。

早速Week1の動画から見てみました。最初はConvolutionの基本原理となる、フィルター、パディング、ストライド、valid/sameなどの説明です。スタンフォード大のCS231n授業動画でも学べますが、やはり定評あるAndrew Ng先生の場合は丁寧に教えてくれます。抜け落としていた知識を補うためにもちょうどいい感じです。
実際コーディングする場合は、conv2d()などの関数を使えばすぐに実装できるのですが、Week1の最初の課題では、numpyを使ってフルスクラッチでConvolutionレイヤーを実装するようです。一旦仕組みを理解するにはよさそうです。2個目の課題からはTensorflowの関数を使っているので、より現実的な実装の仕方を学んでいくのだと思います。
Week2からのプログラミング課題はkerasを使うようです。

今後開講されるコース5:Sequece Modelでは、RNNやLSTMを学ぶようです。スタンフォード大学のCS230という授業がこのCourseraのコースと連携しているので、CS230のシラバスをみると、コース5は11/27以降というスケジュールになっています。

2017年10月28日土曜日

データセット:CIFAR-100の読み込み/tflearn DCGAN

引き続きDeep Learningの画像生成GAN(Generative Adversarial Network)について、いろいろ試しています。最近では3DデータのGANもあるようです。このThe GAN ZooというところにはいろんなGANがのっていますが、とりあえずは、鮮明な合成画像をつくりだすことが可能なDCGAN、そして一方の属性を他の属性へ合成するDisco GANなどを試そうと思っています。

GANの前にVAEの学習:
GANを勉強するためには、その前にVAE(Variational Autoencoder)を理解したほうがいいということで、ここしばらくはVAEを勉強していました。VAEを学ぶ前には、Autoencoderというアルゴリズムがあり、それは簡単な仕組みなのですが、VAEになるとかなり難しい概念が登場してきます。

・Autoencoder:簡単なエンコード/デコードのアルゴリズム
・VAE:正規分布、ベイズ推定、変分ベイズ、KLダイバージェンスなどの知識が必要

VAEの場合、途中で確率分布に置き換えるという手法が特に難解だったのですが、そういう手法をとることで、デコード(生成や再現)が可能となるというのは、なかなかの発見でした。その他の生成モデルにおいても確率分布を使うことがあるので、このあたりの手法はある程度理解しておいたほうが後々役に立ちそうです。

ということでVAEも面白いのですが、そろそろGANに移行しようということで、いろいろサンプルを物色していました。主にはTensorflowを使っていますが、最近のGANのソースはPytorchで書かれているものも多く、Kerasなども含め比較的シンプルに書けるライブラリが増えてきたようです。tflearnというTensorflowをシンプルにしたライブラリもあり、かなり短いコードで書くことができます。

tflearnでDCGANを試す:
tflearnのexamplesにあるdcganのサンプルはたった138行しかないので試してみました。しかし、このサンプルはこのままだとエラーがでるようで、この訂正のページ(dcganの欄)にあるように102、103、110行目の最後に「,2」を追加する必要があります。訂正すれば動くのですが、このdcganのサンプルも相変わらずMNIST(手書き文字)であり結果はあまり面白くはないです。せっかく画像生成のアルゴリズムなので、もう少し面白い画像を使ったほうがいいのですが、気の利いたデータセットがないというのが現状でしょうか。前回Udemyのコースで試したCelebA(セレブ顔画像) ならまだましかもしれません。

データセットについて:
他にデータセットはないかと探してみましたが、こちらに詳しく書かれています。
MNIST:手書き数字、70000(Tr:55000/Vl:5000/Te10000)、白黒、28x28px、
CelebA:セレブ顔、202600、カラー、178x218px
CIFAR-10:10クラス、60000(10x6000)、カラー、32x32px
CIFAR-100:100クラス、60000(100x600)、カラー、32x32px
Fashion MNIST:洋服/靴/鞄など10クラス、60000+10000、グレー、28x28px
ImageNet:未登録のため画像ダウンロードはまだ使えない(そのうち)
Google/Open Images:膨大すぎてつかいにくそう(そのうち)

すぐにダウンロードして使えそうなのは、それほどない。プログラムを書いてWebからスクレイピングする方法もあるかもしれないけれども、数万単位でのイメージが必要そうなので、個人で集めるには面倒。いまのうちからコツコツ集めておけば、かなりの価値になるにかもしれないけれども。
以下はCIFAR-10(10種類のクラス)。


CIFAR-100をダウンロード:
ということから、今回はなんとなく無難なCIFAR-100を試してみることに。こちらの記事を参考にスクリプトを書いてみました。データはCIFARのサイトにあるCIFAR-100 Python versionをダウンロードしました。解凍すると、そのまま画像が出てくるわけではなく、各画像はすでに1次元のデータになっているようです。ニューラルネットに画像データをインプットするならそのまま1次元がいいとは思いますが、必要に応じて2次元(3チャンネルカラー)に変換したり、あるいはグレースケールに落としたりすることもあります。

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import os

def unpickle(file):
    import cPickle
    with open(file, 'rb') as fo:
        dict = cPickle.load(fo)
    return dict

def get_cifar100(folder):
    train_fname = os.path.join(folder,'train')
    test_fname  = os.path.join(folder,'test')
    data_dict = unpickle(train_fname)
    train_data = data_dict['data']
    train_fine_labels = data_dict['fine_labels']
    train_coarse_labels = data_dict['coarse_labels']

    data_dict = unpickle(test_fname)
    test_data = data_dict['data']
    test_fine_labels = data_dict['fine_labels']
    test_coarse_labels = data_dict['coarse_labels']

    bm = unpickle(os.path.join(folder, 'meta'))
    clabel_names = bm['coarse_label_names']
    flabel_names = bm['fine_label_names']

    return train_data, np.array(train_coarse_labels), np.array(train_fine_labels), test_data, np.array(test_coarse_labels), np.array(test_fine_labels), clabel_names, flabel_names

def get_images(name):
    tr_data100, tr_clabels100, tr_flabels100, te_data100, te_clabels100, te_flabels100, clabel_names100, flabel_names100 = get_cifar100("../large_files/cifar-100-python")
    #print(clabel_names100)
    images = []
    for i in range(len(tr_flabels100)):
        if tr_flabels100[i] == flabel_names100.index(name):
            #im = tr_data100[i].reshape(3,32,32).transpose(1, 2, 0) #(32,32,3)
            im = tr_data100[i].reshape(3,32,32)
            im = im[0]/3.0 + im[1]/3.0 + im[2]/3.0
            images.append(im)
    return images

これをutil.pyなどと保存して、先程のtflearnのdcganサンプルで使ってみました。ある特定のジャンルを学習できるように、ラベル名に対応した番号のみを読み込むということにしています。元画像はカラーですがグレースケールに変換しています。
get_images('bicycle')
とすれば、自転車の画像だけ合計500個読み込むということです。
ちなみにCIFAR-100の場合、clabel_names100という20種類の大きなクラスとflabel_names100というさらに細かい100種類のクラスに分かれているようです。
flabel_names100[9] = 'bicycle'
という関係なので、
tr_data100[9]
が、ある自転車の画像となります。画像はランダムに配置されているようで、forループである特定の種類の画像を抜き出すようにしています。
以下が、CIFAR-100のクラス。

clabel_names100 = [
'aquatic_mammals', 'fish',
'flowers', 'food_containers',
'fruit_and_vegetables', 'household_electrical_devices',
'household_furniture', 'insects',
'large_carnivores', 'large_man-made_outdoor_things',
'large_natural_outdoor_scenes', 'large_omnivores_and_herbivores',
'medium_mammals', 'non-insect_invertebrates',
'people', 'reptiles',
'small_mammals', 'trees',
'vehicles_1', 'vehicles_2']

flabel_names100 = [
'apple', 'aquarium_fish', 'baby', 'bear', 'beaver', 'bed', 'bee', 'beetle', 'bicycle', 'bottle',
'bowl', 'boy', 'bridge', 'bus', 'butterfly', 'camel', 'can', 'castle', 'caterpillar', 'cattle',
'chair', 'chimpanzee', 'clock', 'cloud', 'cockroach', 'couch', 'crab', 'crocodile', 'cup', 'dinosaur',
'dolphin', 'elephant', 'flatfish', 'forest', 'fox', 'girl', 'hamster', 'house', 'kangaroo', 'keyboard',
'lamp', 'lawn_mower', 'leopard', 'lion', 'lizard', 'lobster', 'man', 'maple_tree', 'motorcycle', 'mountain',
'mouse', 'mushroom', 'oak_tree', 'orange', 'orchid', 'otter', 'palm_tree', 'pear', 'pickup_truck','pine_tree',
'plain', 'plate', 'poppy', 'porcupine', 'possum', 'rabbit', 'raccoon', 'ray', 'road', 'rocket',
'rose', 'sea', 'seal', 'shark', 'shrew', 'skunk', 'skyscraper', 'snail', 'snake', 'spider',
'squirrel', 'streetcar', 'sunflower', 'sweet_pepper', 'table', 'tank', 'telephone', 'television','tiger',
'tractor',
'train', 'trout', 'tulip', 'turtle', 'wardrobe', 'whale', 'willow_tree', 'wolf', 'woman', 'worm']

全体では60000イメージあるのですが、一つのクラス(種類)は500個のイメージしかなく、Disco GANのように何か特定のジャンルを学習させようとすると画像数が足りなさすぎというのを後から気づきました。CIFAR-100はいろんな種類の画像があるかわりに画像数が少ない。CIFAR-10なら一つの種類で画像が6000あるので、まだましかもしれませんが、10種類しかジャンルがない(選びたいジャンルがない)。というわけで、思い描いているようなものを学習させて、それらを合成させたいということがなかなかできません。あくまで、すでに用意されている範囲でのジャンルを使って、試すということくらいしかできないというのが現状。

Deep Learningを実験していくには、数学を含めたアルゴリズムの勉強だけでなく(特にベイズ推定をつかった確率論的モデルなどが面白そう/今後より重要になっていくらしい)、データセットについても揃えなければいけないという難問があり、さらにはこのような画像生成をするなら、GPUマシンも必要という感じで、やはり先に進めば進むほど敷居が高くなってきます。段々面白くはなってきたけれども、色々面倒なことも増えてきました。

ベイズ推定については、この動画も面白い。今までの固定的な考え方が変わりそうな感じです。

変分ベイズ学習 (機械学習プロフェッショナルシリーズ)
Posted with Amakuri at 2017.10.29
中島 伸一
講談社
販売価格 ¥3,024

人気の投稿