2014/12/13

メインPC入れ替え

年末なので、各PCメーカーがオンラインストアで年末セールを行っています。
そろそろメインPC入れ替え時かな~と思っていたので、新しくデスクトップを購入しました。

今回購入したのはHPのPavilion 500 440jpというミニタワーのデスクトップ。

届いてからメモリを増設しようと側面カバーを開けてびっくり。
  • メモリスロットが2本しかない
  • 3.5インチベイがなく、HDDが増設できない
コストダウンや省スペース化・軽量化のためにいろいろと削っているのでしょう。
4GB x 4本の16GBにしようと思いましたが、仕方なく4GB x 2本の8GBに。
増設用のSSDもとりあえず内部にテープで固定しました。回転部品がないSSDだからこそできる芸当ですね。


新メインPCのスペックは以下の通りです。手持ちの部品があったとはいえ、10万円でここまで組めるとは驚きです。 Core i7-4790 は単体で買うと4万円ぐらいするようですし。
  • CPU: Core i7-4790 
  • メモリー: 8GB
  • HDD:500GB (Windows8.1)
  • SSD:240GB (Ubuntu 14.04)
  • グラフィック:内蔵
さっそくubuntuのほうに開発環境を整え、Intel edisonのカーネルをビルドしてみました。
マニュアルには4時間ぐらいかかると書かれていましたが、2時間ぐらいで終わったようなので速度は申し分ないかと思います。

Core i7-4790には Intel HD graphics 4600がついているので、OpenCLの実行スピードのほうも気になるところです。
そのうち、外部給電が不要なGeforceかRadeonを積んで比較してみたいです。

ではまた。

2014/10/13

OpenCLについて理解する

OpenCLの書籍(OpenCL Programming Guide)とOpenCLの仕様書を読んで少しはOpenCLについてわかったので、メモを残しておきます。
詳しくは書籍または仕様書にて確認ください。

  • OpenCLはCPUとGPU,さらにはDSPなどをも並列計算のリソースとして活用できるようにするプラットフォーム
  • OpenCLはISO C99をベースにしたOpenCL C言語を使用
  • OpenCLはベンダーに依存しないオープンな規格
  • データ単位またはタスク単位での並列プログラミングモデルをサポート
  • 組み込みデバイス用のプラットフォームも提供

OpenCL プラットフォーム
OpenCLプラットフォームは一つ以上のOpenCLデバイスから構成されます。
OpenCLデバイスはひとつ以上のCompute Unitに分けられ、さらにCompute Unitは複数のProcessing Elementに分けられます。
実際の計算はProcessing Elementが行います。


OpenCLのプラットフォーム(OpenCL 仕様書より)
ホストPC上には複数のプラットフォーム(AMDのOpenCLランタイム、nVidiaのOpenCLランタイムなど)が同居できます。

OpenCLカーネルとOpenCLプログラム
OpenCLカーネルは、Processing Element上で実行可能なコードを持つオブジェクトです。
OpenCLプログラムは、OpenCLカーネルの集まりです。

ワークグループとワークアイテム
画像データなどを並列処理する場合、計算元のデータはいくつかのグループに分けられます。
一つのワークグループには一つ以上のワークアイテムが所属します。
ワークアイテム=Processing element、ワークグループ=Compute Unitとなります。

メモリの管理
ホスト(デスクトップPC,ノートPC、その他)にメモリが積まれているように、OpenCLデバイスにもメモリが積まれています。OpenCLデバイス上のメモリは、4つの使われ方をします。

  • グローバルメモリ  すべてのワークアイテムから読み書き可能なメモリ領域です。同期コマンドを使用しない限りは、メモリの一貫性は保証されません。
  • コンスタントメモリ グローバルメモリに置かれる読み取り専用の領域です。ここにはカーネルが実行するコードが置かれます。

  • ローカルメモリ 各ワークグループに割り当てられたメモリ領域です。同一ワークグループに所属するワークアイテムからは自由に読み書きできますが、他のワークグループからはアクセスすることができません。
  • プライベートメモリ 各ワークアイテムに割り当てられたメモリです。他のワークアイテムからはアクセスできません。
メモリ(OpenCL 仕様書より)

コマンドキュー
OpenCLはメモリの転送、プログラムの実行などのコマンドをキューに貯めこんで処理していくコマンドキュー方式で動作しています。プログラマが明示的に同期コマンドを発行しない場合は、前のコマンドが完了していなくても次のコマンドの実行が開始されます。


プログラムの実行方法(かなり大雑把)
  1. ホストプログラム上でOpenCLデバイスを検索します。
  2. OpenCLデバイスを選び、コンテキストを作成します。
  3. コンテキストを使ってOpenCL コマンドキュー、OpenCLカーネル、OpenCLプログラム、OpenCLメモリオブジェクトを作成します。
  4. コマンドキューにカーネル、メモリ、プログラムを放り込んでOpenCLデバイスに転送し、処理を実行させます。
  5. 終わったらホストプログラムから結果を読み込みます。

以上、OpenCLの簡単なメモでした。

OpenCLの環境を整える(Win7 64bit)

OpenCV 3.0 alphaをインストールし、サンプルプログラムを実行しようとしたところ、"opencl runtimeがありません"と言ったメッセージが出て実行できませんでした。

OpenCLは並列計算用のライブラリで、CPUやGPUを計算リソースとして使うことができます。
OpenCLはベンダーに依存しない言語仕様なので、AMDやInterl、nVidiaがそれぞれの製品用のOpenCLランタイムを提供しています。

私のPCにはPhenom II x6とRadeon HD 5450が積まれているので、AMDからOpenCL用のランタイム(AMD-APP-SDK-v2.9-1.599.381-GA-Full-windows-64.exe)をダウンロードしてインストールしました。
AMD App SDK

インストール後はOpenCVのサンプルプログラムも無事動くようになりました。

OpenCLについて調べてみると、Pythonからも使えるようになるpyopenclというライブラリがあることが分かりました。

というわけで早速インストールしてみます。

参考ページ:PyOpenCL

(インストール前に、各ベンダーから提供されているOpenCLのランタイムが動作することを確認してください。たいていはsampleフォルダなどにビルド済みのものがあると思います。)
  1. まずはpython 3.3の32bit版をインストールします。
  2. http://www.lfd.uci.edu/~gohlke/pythonlibs/ から以下のパッケージをダウンロードしてインストールします。pytonの各バージョン・各プラットフォーム用のパッケージがあるので、pythonのものとバージョンをあわせます(今回はpy3.3、32bit用)。
      • pillow
      • pytools
      • mako
      • numpy-MKL
      • pytools
      • pyopencl
インストール作業は以上で完了です。

pythonを起動し、pyopenclが動くか見てみましょう。

import pyopencl as cl
cl.create_some_context()


コンピュータに複数のOpenCLデバイスがある場合は、複数デバイスが表示され、どれかを選ぶようメッセージが出ます。

>>> cl.create_some_context()
Choose device(s):
[0]
[1]
Choice, comma-separated [0]:

エラーメッセージがでなければpythonからOpenCLを扱う準備が整ったことになります。


2014/08/13

書籍紹介 「Computer Vision Metrics」

Computer Visionの書籍をAmazonで検索していたら、2014/5に発売されたComputer Vision Metricsという本を見つけました。

なんとKindle版が0円! さっそくKindleに入れてみました。

本の内容は以下の通りです。

Chapter 1. Image Capture and Representation
Chapter 2. Image Pre-Processing
Chapter 3. Global and Regional Features
Chapter 4. Local Feature Design Concepts, Classification, and Learning
Chapter 5. Taxonomy Of Feature Description Attributes
Chapter 6. Interest Point Detector and Feature Descriptor Survey
Chapter 7. Ground Truth Data, Data, Metrics, and Analysis
Chapter 8. Vision Pipelines and Optimizations
Appendix A. Synthetic Feature Analysis
Appendix B. Survey of Ground Truth Datasets
Appendix C. Imaging and Computer Vision Resources
Appendix D. Extended SDM Metrics

まだ少ししか読めてはいないのですが、アルゴリズムの詳細&難しい数式が出てくるのではなく、

  • "距離を測るカメラはTOF型とライトフィールド型のものがあります"
  • "FASTやSIFTはこんな感じの特徴量です"

といった感じのリファレンス本となっています。
特徴量はSURFやSIFTぐらいしか知らなかったのですが、今はもっとたくさんの特徴量アルゴリズムがあるようで。
Kindle版で物足りなくなったら書籍版を買おうと思います。洋書ですがオンデマンドプリント書籍のため、日本で印刷してすぐ届くので。

ではまた。


Solidoodleからデュアルエクストルーダモデル登場!

solidoodleから、「Solidoodleユーザ限定で、Solidoodle Workbenchを100ドル引きにするよ!」というダイレクトメールが来ました。お得だけどそんなにポンポン3Dプリンタ買えませんがな。


ホームページに確認しに行くと、なんとエクストルーダが2つになっているではありませんか。
Solidoodle Workbench
お値段は$1299と、エクストルーダ2つ付いてる3Dプリンタにしては安めの価格設定です。
印刷サイズが小さくなりますが、Solidoodle workbench Apprenticeは$799です。

それとは別に、エントリーモデルとしてSolidoodle Pressというのも販売されています。


Solidoodle press
こちらは$399とお買い得。さらにケースに入っているので安定して印刷できそうです。
印刷サイズは8x8x8インチなのでまぁ十分なサイズ。カートに入れてみたら送料が$95でした。

納期はどのモデルも2~3カ月程度かかるとのこと。


Solidoodle3を買う時に印刷サイズとかに若干こだわってましたが、
大きいオブジェクトは印刷するのに時間が非常にかかるのと、冬場は反って印刷失敗することが多いので、あまり印刷サイズにこだわらなくてもよい気がします。

どちらかというとパーツを分割して、2台で並行稼働させたほうが効率が良いかと思います。

ではまた。

2014/04/29

ペン型3Dプリンタ 3doodler

以前から気にはなっていたのですが、ペン型3Dプリンタ 3doodlerが日本でも発売されました。



直径3mmのABSフィラメントまたはPLAフィラメントを使用してフリーハンドでぐりぐり書いていきます。

絵心のある人が使えばこんな感じにできます。

本体の価格が17,000円ぐらい、フィラメントが60gで1,500円。
本体の値段は納得するとして、フィラメントが高いなぁ。。。
Amazonで売っている直径3mmのリールフィラメントが使えるといいんだけれど。




2014/01/24

インテル ガリレオ到着

本屋に行ったら日経Linuxの2014年2月号にガリレオの特集が載っていました。
他にもカーネルの特集などもあったので買って読んでみました。

ガリレオの特集は6ページほどで、ガリレオとガリレオ用のCPUの生い立ちや、スケッチの転送方法が載っていました。Linuxを使って入出力する場合はGPIOが必要になりますが、GPIOの使い方へのリンクも載っていました。

リンクのほうはブログに書いても大丈夫だと思うので書いておきます。
Intel Galileo - Configuring the Serial Port in Linux



それはさておき、スイッチサイエンスに注文していたガリレオが届きました。
さっそく開封します。

ガリレオ・ガリレイ風な人がサングラスをかけたパッケージです

箱の底には接続方法が書いてあります。

内容物は以下の通りです。
  • ボード本体
  • 各国用にコンセント部分の切り替えができるACアダプタ
  • 安全上の注意(30ヶ国語)の冊子

基盤の四隅に取り付ける足と、PCと接続するためのマイクロUSBケーブルは自分で用意する必要があります。

電源を入れて遊びたいのを抑え、あらかじめ3Dプリンタで印刷しておいたケースが使えるかを試してみました。ボード背面のM-PCIeソケットが予想よりも背が高く、3mm程浮いてしまいました。ケースは再設計が必要なので、ひとまず足で浮かせるようにしておきました。


ケースの高さが足りない・・・・

ひとまず足をつけた

ケースがきちんと出来上がってから電源を入れたいと思います。

また、自分でケースをデザインする人のために、ひとまずメモを残しておきます。
  • 基盤の厚み:1.75mm
  • M-PCIeソケットの高さ:基盤上から9mm
  • 基盤からはみ出しているもの
    • マイクロUSBポート2か所 約1.5mm
    • ステレオミニプラグ 約2mm
    • RJ45ポート(LANポート) 約2mm
    • 電源プラグ 約1mm
OpenSCADでガリレオのモデルを作っているので、出来上がったらgithubにでもアップしようかと思います。

ではまた。

2014/01/18

インテル製Arduino互換ボード ガリレオ 日本でも発売!

今週からArduino互換ボード Galileoが日本でも発売されました。
価格は約7,500円とArduinoから比べれば3倍高い値段となりますが、下記のような機能を備えているため、Arduino用の各種シールドを積み重ねていくよりかはお得です。

  • CPU:400MHz.(Arduinoは16MHz)
  • SRAM:512KB(Arduinoは2KB)
  • DRAM:256MB
  • EEPROM:11KB(Arduinoは1KB)
  • 有線LANポート
  • 3.5mmジャック形式シリアルポート
  • USBホスト
  • USBクライアント
  • mini-PCI expressポート
  • マイクロSDカードソケット
スイッチサイエンスで予約販売されているので、先週末に予約しておきました。
来月には届いていることでしょう。

買ってからガリレオについて調べ始めたのですが、ガリレオには映像出力はついていません。
マイクロSDからlinuxも動作させることができますが、多機能・高速Arduinoととらえたほうが良いようです。


入手された方のページを見た限りでは、箱の中には基板用の足がありません。

基盤の裏にはmini-PCI expressポートが出っ張っているので、足をつけて保護してやる必要があります。

ただ単に足をつけるのもよいのですが、自宅に3Dプリンタがあるので土台を作ってみようかと思います。

Intelのサイトに、PCB基盤のデータ(Allegroというソフト用)があったので、そのデータを元に穴の位置などを調べました。

穴位置。穴の直径は約4mmとのこと

枠のサイズ
上記のデータをもとに、OpenSCADでGalileo用の土台データを作ってみました。


Intelのロゴは、以前作った2値画像の輪郭をOpenSCADのポリゴンに変換するpythonスクリプトで作りました。ThingiverseにもIntelロゴが含まれているのが多数見つかるので、個人で使う分には大丈夫でしょう。

青いフィラメントで印刷するといい感じになりそうですね。
ではまた。

2014/01/14

OpenSCAD用の日本語テキストデータを作る

OpenSCADにはテキスト出力の関数がありますが、アルファベットのみで日本語テキストは使えません。OpenSCADにdxfファイルをインポートする機能があるので、
  1. CADソフトで日本語テキスト作成
  2. dxfで保存
  3. OpenSCADで読み込み、linear_extrudeで引き出し
という手順をやってみましたが、作成が面倒なのと処理時間が長いので別の方法を考えることにしました。

OpenSCADはポリゴンが扱えるので、力技で日本語テキストデータをポリゴン化してみました。必要なものは以下のとおりです。
  • OpenCV
  • Python
  • Numpy
  • PIL
  • TrueTypeフォントファイル(IPAゴシックなど)
処理の概要は以下のとおりです。
  1. PILを使用してフォントを読み込む
  2. PILで画像ファイルを作成し、文字を書き込む(大きめのサイズで)
  3. 一旦ディスクにPNG形式で保存
  4. OpenCVのimreadで保存したPNGファイルを読み込む
  5. 輪郭情報を抽出。
  6. 外側の輪郭と内側の輪郭で分けて、外側-内側 になるようにポリゴンデータ(点の配列)を作成
  7. OpenSCADのpolygonフォーマットで出力
  8. テキストなどに保存。OpenSCADで読み込んでlinear_extrudeで引き出し

そんなこんなで日本語フォントの文字出力ができました。



TrueTypeのフォントファイル(フォントファイルコレクションは不可)を用意すれば、
好きなフォントで立体データを作ることができます。

ポリゴンデータに変換できているので、2色刷り時のはめあい調整もできそうなかんじです。

ではまた。


2014/01/10

OpenSCADで3dプリンタ用データをつくる

3Dプリンタで小さめの部品を作成するときは必要な個数の部品を自動配置して印刷しますが、
小さめの部品なので印刷時にはがれることがあり、エクストルーダに引っかかり他の部品に接触し、全部がダメになってしまいます。
この問題の対策として、部品間を焼肉の網みたいなものでつなげば設置面積が稼げるため部品のはがれがなくなりそうなのですが、毎回これをCADで作るのは面倒です。

3Dプリンタ用のデータ生成ソフトを調べていると、OpenSCADというものがあることがわかりました。
このOpenSCADというソフトは、スクリプトをゴリゴリ書いてモデルを作成するCADです。
たとえば、1辺の大きさが10mmの立方体を作る時は、

 cube(10);

とやればモデルが出来上がります。

10mmの立方体
STLへの書き出しができるので、ちょっとした機械部品を作るのに向いており、ギアやねじを生成するライブラリもあるようです。


試しにOpenSCADを使って、小さな星を作ってみました。
//星の基礎部品。矢じりのような形
module arrowHead(r=10)
{
 basesize=r*0.2;
 polygon(
 points=[
  [0,r],
  [basesize,basesize],
  [0,0],
  [-1*basesize,basesize]
 ]);
}

//星。
//Kを2にするとクナイ、3,4にすると手裏剣風、6以上だと歯車風になる
module star(radius=10,height=5)
{
 k=5;
 
 linear_extrude(height)
 {
  //kの値が3以下の場合は中心に隙間ができる場合があるので円で埋めとく
  circle(radius*0.1);
  for(i=[0:k-1])
  {
   rotate((360/k)*(i))
   {
    arrowHead();
   }
  }
 }
}

module raft(x=3,y=3,step=10,height=1)
{
 
 translate([-1*x/2*step,-1*y/2*step])
 {
  for(rx=[0:x-1],ry=[0:y-1])
   { 
   translate([rx*step,ry*step]) 
   difference()
   {
    cube([step,step,height]);
    translate([0.5,0.5])
    cube([step-1,step-1,height]);    
   }
  }
 }
}

sz=10;

for(i=[0:3])
{
 translate([i*sz*2,0])
 {
  star(sz);
  raft(4,4,sz);
 }
}





実際に印刷してみた結果が以下の通りです。
部品がメッシュで接続されているので、安定して印刷できました。

これは最初のバージョンで、メッシュの一番外側がつながっていないためほつれた布の端っこみたいになっています。上のコードは枠をつなげるように改良したバージョンとなります。




まだよく調べてはいないのですが、テキストも付けれるようなので
名札などのシンプルな形状のものはOpenSCADで作ったほうが便利そうです。

これでまきびしのモデルでも作ってみようかな?

ではまた。