レビューメディア「ジグソー」

(完)「Jouleの正面だぁれ?」 ~Joule(TM)で顔認証システムを作ってみる~

Jouleと言えば「熱」。でもこのJoule(TM)は48 x 24mmのボディの中にIoTの世界を熱くするパワーを秘めたシングルボードコンピューターです。

今回はそのインテル(R) Joule(TM) 570x 開発キットを利用してオリジナル試作機を開発するチャンスを与えてもらいました。

 

まず試作機として思いついたのは、ドローンやロボットに搭載し画像認識を行った自動運転ですが(さすがにそれは荷が重いので)ぐっと堪えてまずは顔認証にチャレンジしたいと思います。顔を認識してその人のテーマソングを流す。そんなことを実現してみたいと思います。

更新: 2016/12/31

何だか嫌な予感がする

「インテル(R) Joule(TM) 570x 開発キット ~Joule(TM)で何作る?~」

 

 インテル(R) Joule(TM) 570x 開発キットは、4Core/1.7GHzのAtomプロセッサーや4GBメモリー、16GBのeMMC等を搭載する Joule(TM)モジュールを含む開発用のキットです。外部インターフェースとしても Wi-Fi、Bluetooth、USB3.0、GPIO、I2C、UART、I2S等のなんでもござれ的な物を備えています。

中でも「Intel RealSense」に対応したカメラとそのライブラリーも利用できる部分が特筆すべきものだと思います。(でもこれが後で熱い戦いになるんですが...)

では、さっそく始めたいと思います。

 

I hava a bad feeling about this......

 

【更新メモ】

・2016/11/23 Ubuntuに変更/インストール方法追加

・2016/11/23 Ostroの再インストール方法追加

・2016/11/24 Anaconda/OpenCVのインストール追加

・2016/11/26 UbuntuのインストーラーのBUG?修正

・2016/11/27 Ubuntuでのmraaインストールを修正

・2016/11/27 Ubuntuでのnode.jsインストール追加

・2016/11/29 mraaのインストールのコメント追加

・2016/11/30 AnacondaをMinicondaに変更

・2016/12/01 mraaのインストール方法見直し

・2016/12/03 mraa + node.jsのLチカ追加

・2016/12/04 文章ミス修正

・2016/12/09 SSD取付&Ubuntuインストール追加

・2016/12/09 THE 開発物語を追加中

・2016/12/09 node.jsのインストール方法を変更

・2016/12/10 OpenCVのインストール方法を変更

・2016/12/11 OpenFrameworks 3D-DEMO追加

・2016/12/12 没ネタ置場を設定

・2016/12/12 OpenCVのインストール方法を変更

・2016/12/23 バグ回避で最新OpenCVを全コンパイル

・2016/12/23 PILインストールを追加

・2016/12/23 Open-JTalkインストールを追加

・2016/12/23 FaceRecognizerの記述を追加

・2016/12/24 SimpleScreenRecorderを追加

・2016/12/24 顔認識システムのプロトタイプ追加

・2016/12/25 微修正

・2016/12/31 試作機デモを追加

・2016/12/31 レビュー完成

更新: 2016/12/31

EpisodeⅣ.THE JOULE WARS

4-1.序章


Intel(R) Joule(TM) 570x 開発キットを利用したオリジナル試作機のプレミアムレビューに応募を決めたのは、RealSense SDKが豊富な機能を持っているからでした。

RealSense SDKで「顔の検出」や「顔の認識」ができるんだったら、今はやりのディープラーニングや機械学習に手をだせて、最悪でも音声制御できるミュージックサーバーが作れるぞ!と思ったわけです。

 

[RealSenseの機能概要]

 

しかし応募してからIntel(R) Joule(TM) 570x 開発キット用にリリースされている 現バージョンのlibrealsenseの機能を調べてびっくりしました。

現バージョンのlibrealsenseには「顔の検出」等とはレベルの違う「カラー画像の取得」、「深度画像の取得」、「IRストリームの取得」等の基本的な機能しか実装されていないことがわかりました。「PointCloud」って何ですか?状態です。(プロの方には、これはすごいぞっていうことなのでしょうけれど)

 

何度か応募を取り消そうと思いましたが、そのたびに募集の締め切りが延びていきました。そうこうしているうちに決定の通知が...

こうして画像認識のド素人による「 librealsense以外で顔を認識して、その人のテーマソングを流す機械を実現させる」プロジェクト「THE JOULE WARS」がスタートしました。

 

4-2.はじめの一歩


ゼロからのスタートということで、まずは一般的な画像認識の流れを調べてみました。

以下のような機械学習を行うフェーズと、その結果データを使って認識を行うフェーズがあるようです。

 

[学習フェーズ]

 ① 学習用画像を準備(正解/不正解画像)

 ② 学習用画像から特徴点/量を抽出

 ③ ②を学習用画像全体に適用

 ④ 結果データを作成

 

[認識フェーズ]

 ⑤ ターゲット画像を取得

 ⑥ ターゲット画像の特徴点/量抽出

 ⑦ 学習フェーズの結果データとマッチング

 ⑧ ターゲットの画像を認識

 

[画像認識のイメージ]

 

画像認識で一番有名なOpenCV(Ostroにも導入済みでした)を少し調べてみました。

OpenCVは正式名称をOpen Source Computer Vision Libraryといい、コンピュータビジョンに必要な機能がパッケージされたライブラリ集です。(インテル社が開発)

 

OpenCVは顔認識の機能を全て持っていますが、顔認識等に必要な④の結果データも用意されている為、学習フェーズ無しで認識フェーズのプログラムを作成することが可能なようでした。

『おっ、これでいけると思いました』

 

OpenCVには画像認識に関して以下のような豊富すぎる機能を持っています。 

 

・代表的な特徴点/量抽出アルゴリズム

 FAST/STAR/SIFT/SURF/ORB/BRISK/

 MSER/GFTT/HARRIS/SimpleBlob/KAZE/AKAZE

 

・代表的な特徴点マッチングアルゴリズム

 BruteForce/BruteForce-L1/BruteForceーSL2/

 BruteForce-Hamming/BruteForce-Hamming(2)/FlannBased

 

各アルゴリズムは、それぞれ得意分野があるようです。

『こんなにあったら迷っちゃう、もっと手軽な方法はないの?』

 OpenCVの中の人:『大丈夫です。あるんです!』

 

4-3.FaceRecognizer(ド〇えもんの声で)


FaceRecognizerはOpenCV2.4から実装された顔推定器です。

認識率はあまり高くないようなのですが、以下の3種類の顔推定器が準備されています。

  • Eigenface - 高速だが、照明や角度の違いに弱い
  • Fisherface - Eigenfaceの改良版
  • LBPH(Local Binary Patterns Histogram)

予め推定器で学習させた訓練用の画像の学習結果と、認識させる画像を比べて、一番近い画像を選択する方法です。顔の領域はそれぞれの画像から "Haar-like特徴分類器"で顔のみを抽出します。

 

4-4.Haar-like特徴分類器(これもド〇えもんで)


Haar-like特徴分類器は、予め数百のサンプル画像によって学習したデータを使い、対象となる画像がその特徴を持つか持たないかを判断(分類)するものです。

Alfred Haarという人が発表した多重解像度解析で使われるHaar waveletに似ているもの(like)であることから、Haar-likeと呼ばれているようです。

具体的には、以下のパターンが画像に存在するかどうかを判別して、物体認識を行うようです。

このような単純な分類器を滝のように直列(Cascade)に繋げて速度を速める工夫がされています。

この分類器の動作を視覚化した映像がありました。

How face detection works

 

OpenCVには、このHaar-like特徴分類器用の学習済みデータとして、顔、目、猫の顔、全身、ロシアのナンバープレート等が用意されています。

※OpenCVによる物体検出/認識に関して分かりやく説明しているホームページを見つけました。

中部大学藤吉研究室 - 局所特徴量と統計的学習手法による物体検出

 

4-5.May the force be with me!


試作に必要な全ての手法が揃いました。これで試作機を作るのみとなります。

 

May the force be with me!

更新: 2017/01/03

EpisodeⅤ.試作機の開発

いよいよ本番の試作機の設計・開発工程です。

 

5-1.OSの選定


インテル(R) Joule(TM) 570x 開発キットでは以下のOS環境が選択可能です。

  • Reference Linux OS for IoT
  • Windows10 IoT Core

※これを書いている時(2016年11月18日)にUbuntu 16.04 Desktop and Core(beta)が追加されていましたが、今(2016年12月25日)時点では、betaから正式版?に昇格しています。

開発はUbuntuで、実装はReference Linux OS for IoTになるんでしょうか?

 

Linuxは購入時にeMMCに動くものがインストールされています。

Windows10 IoT Coreは新たにインストールが必要です。さらにWindows10 IoT Coreでは、PCにも開発環境をインストール・設定する必要があります。新たなインストールでトラブルが発生すると開発に支障をきたすので、ここでは素直にReference Linux OS for IoTを選択することにします。

と思いましたが、Ostroではパッケージの導入は全て手作業を強いられるので、まだβバージョンですが Ubuntuを選択することにします。

 

5-2.開発ツールの確認


開発効率を高めるには、世の中にあるパッケージを簡単に導入できることが重要です。

Linuxには色々な開発ツールが実装されています。Refernce Linux OS FOR IoT(Ostro)のパッケージ導入状況を確認します。

  • apt-get:ありません
  • opkg:ありません(opkg.pyのみ)
  • yum:ありません
  • pip:ありません
  • wget:ありました。
  • vi:ありました。

ふ~っ、私のスキルではOstroでの開発は困難を極めそうなので、Ubuntuを導入することにしました。

Ubuntuなら開発環境が完備されています。

  • apt-get:もちろんあります
  • opkg:ありませんが大丈夫です。
  • yum:インストール可能です。
  • pip:インストール可能です。
  • wget:もちろんあります。
  • vi:もちろんあります。

5-3.バージョン確認


開発の前提となる各パッケージのバージョンを確認します。(Ubuntu 16.04)

  • Python:3.5.2
  • OpenCV:3.1.0
  • gcc:5.4.0
  • java:1.8.0_111
  • MRAA:1.5.1-11-gc1017bb
  • Node.js:7.2.0
  • bash:4.3.46(1)
  • perl:5.22.1
  • ALSA:K4.4.0-1000-joule

5-4.開発言語の選定


Linuxでは以下の開発言語が利用できます。

  • C / C++
  • java
  • perl
  • Node.js
  • Python

C / C++はインテル(R) Joule(TM) 570x 開発キット単独でも開発できると思いますが、Intelのホームページでは、Intel System Studio IoT Editionを母艦PCに導入した開発が紹介されています。

Node.jsは魅力がありますが、プレ導入されているNode.jsは若干古いもののようです。

Pythonは2系でも比較的最新に近いバージョンです。

Pythonは(これも導入済みの)OpenCVとの親和性が高いため、Pythonを選択したいと思います。 

 

5-5.カメラの選定


画像認識をさせるためのカメラを選定しました。

Intel RealSense対応のカメラというと

  • 御本家Intel SR300
  • クリエイティブメディア BlasterX Senz3D(SR300互換)
  • 上海問屋 Intel RealSense 3Dカメラ(SR300)

の3つが代表的ですが、どれも2万5千円~3万円と非常に高価です。これらを選んでRealSenseが上手く動かなかったことを考えて躊躇してしまいました。

そこで似て非なるものかもしれませんが、以下のカメラを選定しました。

 

※2016年4Qに御本家 Intelから ZR300という新しいRealSense対応のカメラが発売されるようです。そのころには、OSやlibrealsenseも機能アップされていると思いますので、

今回の続きとしてZR300のレビューをさせて下さいw

 

5-6.モニターの選定


認識した画像の確認をするためにモニターが必要です。

以下の条件で選定しました。

  • HDMI接続
  • 高解像度(できれば1080p以上)
  • バッテリー駆動
  • 安価なこと

その結果はほぼ一択で以下のモバイルモニターを選択しました。

 

5-7.フルセットアップ


これで今回の開発・実行環境のフルセットアップが完了しました。

 

5-8.顔画像および楽曲データ


学習用およびターゲット用の顔画像データは、イギリス Essex大学のホームページ上にある "Faces94"を利用させて頂きました。

Collection of Facial Images: Faces94

 

テーマソングとして流す楽曲データは、音楽研究所のフリー素材のボーカロイドデータを利用させて頂きました。

音楽研究所

 

5-9.プログラム開発


試作機のプログラム開発にあたっては、以下のページを参考にさせて頂きました。

OpenCVを使って誰の顔なのかを推定する

 

----

#!/usr/bin/python
# -*- coding: utf-8 -*-

import cv2, os
import numpy as np
from PIL import Image

 

# トレーニング画像ディレクトリー
train_path = './train'

 

os.system('~/jsay.sh "システムを開始します"')

# ジュール画像表示
joule_pil = Image.open("./joule.gif")
joule_img = np.array(joule_pil, 'uint8')
cv2.imshow('joule', joule_img)

line_color = (0, 0, 255)

 

# Haar-like特徴分類器
cascadePath = "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath)

 

# 顔認識器の構築 for OpenCV 3
# EigenFace
#recognizer = cv2.face.createEigenFaceRecognizer()
# FisherFace
#recognizer = cv2.face.createFisherFaceRecognizer()
# LBPH
recognizer = cv2.face.createLBPHFaceRecognizer()

 

# 指定されたpath内の画像を取得
def get_images_and_labels(path):
    print("path : " + path)

    images = []
    files = []
    labels = []
    no = 0

    for f in os.listdir(path):
        # 画像のパス
        image_path = os.path.join(path, f)
        print("image file : " + image_path)

        # グレースケールで画像を読み込む
        color_img = cv2.imread(image_path)
        image = cv2.cvtColor(color_img, cv2.COLOR_BGR2GRAY)

        cv2.imshow('test image', color_img)
        cv2.waitKey(300)

        # Haar-like特徴分類器で顔を検知
        faces = faceCascade.detectMultiScale(image)
 
        # 検出した顔画像の処理
        for (x, y, w, h) in faces:
            # 顔を 200x200 サイズにリサイズ
            roi = cv2.resize(image[y: y + h, x: x + w], (200, 200), interpolation=cv2.INTER_LINEAR)
            # 画像を配列に格納
            images.append(roi)
            labels.append(no)
            no += 1
            files.append(f)
    cv2.destroyWindow('test image')
    return images, labels, files

 

def play_music(name):
    print(name)
    if name == 'astefa':
        os.system('~/jsay.sh "テーマソング 燃えろよ燃えろ"')
        os.system('aplay "/home/yos/wav/Campfire_Song.wav"')
    elif name == 'anpage':
        os.system('~/jsay.sh "テーマソング にらめっこ"')
        os.system('aplay "/home/yos/wav/Tumbler_xf.wav"')
    elif name == 'ekavaz':
        os.system('~/jsay.sh "テーマソング おちゃらかほい"')
        os.system('aplay "/home/yos/wav/ocharaka_xf.wav"')

    return

 

# トレーニング画像を取得
os.system('~/jsay.sh "学習フェーズを開始します"')
images, labels, files = get_images_and_labels(train_path)

# トレーニング実施
recognizer.train(images, np.array(labels))
os.system('~/jsay.sh "学習フェーズを終了しました"')

confidence = 10000

 

# Windowを表示
cv2.namedWindow('camera capture')
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
cv2.imshow('camera capture', frame)

 

os.system('~/jsay.sh "顔認識を開始します"')

while True:
    # cameraから画像を取得
    ret, frame = cap.read()

    # 画像の中に顔があるか確認
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    target = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1,minSize=(50,50))
    if len(target) > 0:
        # 顔を検出した場合
        for (x, y, w, h) in target:
            chk_face = cv2.resize(gray[y:y+h,x:x+w], (200,200), interpolation=cv2.INTER_LINEAR)
        cv2.imshow('check face', chk_face)
        for rect in target:
            cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),line_color, thickness=4)

        os.system('~/jsay.sh "顔を検出しました"')
        label, confidence = recognizer.predict(chk_face)
        # 予測結果をコンソール出力
        print("Predicted Label: {}, Confidence: {}".format(label, confidence))
        cv2.waitKey(300)

    cv2.imshow('camera capture', frame)
#    cv2.waitKey(300)

    if confidence < 65:
        # 顔認識に成功した場合の処理
        os.system('~/jsay.sh "ジュールの正面だぁれ?"')
        kekka_img = cv2.hconcat([chk_face,images[label]])
        cv2.imshow("kekka", kekka_img)
        os.system('~/jsay.sh "顔を認識しました"')
        print(files[label])
        play_music(files[label].split(".")[0])

#    else:

    k = cv2.waitKey(100)
    if k == 27:
       break

    cv2.destroyWindow('kekka')

 

# 終了処理
os.system('~/jsay.sh "システムを終了します"')
cap.release()
cv2.destroyAllWindows()

----

更新: 2016/12/31

EpisodeⅥ.デモンストレーション

6-1.OpenFrameworksの3Dデモ


OpenFrameworksというツールの3DprimitiveExampleをインテル(R) Joule(TM) 570x 開発キットで動かしてみました。OpenCLとINTEL Graphicsドライバーをインストールしているので、GPUをフルに使っていると思います。

 

 

6-2.顔認識システムのプロトタイプデモ


顔認識システムのプロトタイプが完成しました。

Ubuntu上でOpenCVとOpen-Jtalkとpythonで作っています。

ハードウェア以外は無料です。

 

 

6-3.顔認識システムの試作機デモ


顔認識システムの試作機が完成しました。

顔を印刷した紙をカメラに見せて、顔認識をさせてテーマソングを流します。

 

 

更新: 2016/12/29

EpisodeⅠ.ハードウェアの準備

開封から実装の設計からケースの加工、プロトタイプ完成までを説明します。

 

1-1.開封


インテル(R) Joule(TM) 570x 開発キットは、こんな箱に入っていました。

開けた時に、Intelのメロディは鳴りませんでした。残念。

 

 

箱の中には以下の物が入っていました。

  • インテル(R) Joule(TM) 570x 開発キット
  • micro SDカード(16GB)※取付済み
  • ヒートシンク
  • プラスチックのアダプタ
  • Type C USBケーブル
  • スペーサーとネジ4組 ※2mmトルクスネジ
  • 説明書
  • Joule(TM)のシール

 

 

以下の物は付属していませんので、別に購入する必要があります。

  • micro HDMIケーブル
  • HDMIディスプレイ
  • ACアダプタ(12V 3A)
  • USBキーボード
  • Bluetooth キーボード(オプション)
  • Bluetooth マウス(オプション)

技適付きアンテナが付いてます!

Edisonではこれが無くてWi-Fi電波が弱くて苦労しました。こんなところでもIntelのIoTへの本気さを感じます。

 

 

1-2.プロトタイプ検討


まずはプロトタイプとしての姿を考えたいと思います。

基板の裏側にも表面実装の小さな部品が沢山付いています。壊してはいけないので、まず付属のスペーサーを取り付けました。

でもネジが2mmのトルクスネジです。なんで3mmじゃいけないんですか?

 

 

インテル(R) Joule(TM) 570x 開発キットの本体のアップです。ヒートスプレッダもかねているので、かなり頑丈そうなイメージがあります。この中に一切合切入っているんですね。

 

 

拡張ボードの説明です。基板の片側に周辺用のポートが配置されています。

さすがに実装を意識していますね。

※PCとの接続には Micro USBポート(Type B)を使います。

 

 

拡張ボードの裏面には、バッテリホルダやFANヘッダーが配置されています。

※このFANヘッダーはTE Connectivity/AMP社の292228-3という型番です。秋葉原を探し回ったのですが見つけられませんでした。もしこれでFANを接続するならば、ネット通販で購入するしかないかもしれません。

 

基板の片側にポートが配置されているので、100均のコレクションボックスでケースを作ることにしました。FANも取り付けたいと思います。

 

 

1-3.First-time setup


Intelのホームページにセットアップが説明されています。基本的にこの説明にそって進めています。

First-time setup

 

 

1-4.ケースを加工します


100均のコレクションボックスを横にして加工してみました。FANの穴はいつものようにヤスリがけ。半日かかりました。

 

 

インテル(R) Joule(TM) 570x 開発キットを取り付けたらこんな感じです。

 

 

1-5.プロトタイプ完成


プロトタイプということで、パネルメーターやFAN電圧制御基板等を取り付けました。

 

FANが0.1A程度消費しているので、アイドル状態ではインテル(R) Joule(TM) 570x 開発キットの消費電流は0.15A程度です。(12V × 0.15A =約1.8W)

LCDは使わない(使えない)かもしれません。

 

 

試作機なので適当な配線とケースのひび割れは気にしないで下さい。

 

 

1-6.SSD接続


いろいろなソフトウェアを導入するのに16GBのeMMCではとても足りないので、120GBのSSDを取り付けました。

 

(1)  GPartedで全てext4でフォーマットしました。

 

更新: 2017/01/01

EpisodeⅡ.ソフトウェアの準備

開発環境となる母艦PCの説明と、インテル(R) Joule(TM) 570x 開発キットのソフトウェアのセットアップの説明となります。

 

2-1.母艦PC


開発環境となる母艦PCは以下の自作PCです。

  • CPU:AMD Phenom II X2 555(3GHz)
  • OS:Windows10 Professional 64bit
  • メモリー:8GB
  • GPU:RADEON HD 5700
  • SSD:KINGSTON 120GB
  • DISK:HITACHI 1TB
  • モニター:DELL G2410(24インチ)
  • 無線ルーター:I-O DATA WN-AX1167GR

2-2.まずはPCにつなげてみよう


PCとのシリアルでの接続方法は以下のページで解説されています。

Setting up serial communication for Windows hosts

 

(1) PCにFTDIドライバーをインストールします。

(2) micro USBケーブル(Type B)で接続します。

(3) インテル(R) Joule(TM) 570x 開発キットに電源(12V)を接続します。

(4) PCでデバイスマネージャーを起動します。

(5) COMポートを確認(下の例ではCOM5)します。

 

 

(6) Puttyやteraterm等の通信ソフトを起動します。

(7) 通信ソフトのパラメーターを以下の設定にします。

  ・COMポートでのシリアル接続

  ・通信速度は 115,200bps

(8) shellプロンプトが表示されます。

(9) ここで以下のコマンドでOSのバージョンを確認しました。(赤字は入力したコマンドです)

$ cat /etc/*-release

ID="ostro-xt"

NAME="Ostro OS XT"
VERSION="1.0+snapshot-20160813"
VERSION_ID="1700"
PRETTY_NAME="Ostro OS XT 1.0+snapshot-20160813"
BUILD_ID="2016-08-13_13-03-59-build-170"

※2016年8月13日13時03分59秒のバージョンです。ネットで公開されている最新バージョンと同じでした。

 

(10) ついでにdfコマンドでファイルシステムを確認しました。

$ df -h

Filesystem       Size      Used Available Use% Mounted on
devtmpfs        1.9G         0      1.9G   0% /dev
/dev/disk/by-partuuid/12345678-9abc-def0-0fed-cba987654320

                14.3G      2.0G     11.5G  15% /
tmpfs             1.9G         0      1.9G   0% /dev/shm
tmpfs             1.9G      8.9M      1.9G   0% /run
tmpfs             1.9G         0      1.9G   0% /sys/fs/cgroup
tmpfs             1.9G         0      1.9G   0% /tmp
tmpfs             1.9G      8.0K      1.9G   0% /var/volatile
tmpfs          382.9M         0    382.9M   0% /run/user/0

 

2-3.BIOSを更新します


ubuntuやWindows10 IoT Coreのインストールにはversion#131以上のBIOSが必要です。以下のページに解説されています。

Flashing the BIOS

 

(1) joule-Firmware-2016-09-23-131_Public.zipをダウンロードします。

(2) 上記ファイルを解凍し、その中の FlashUsbDriver-1.0.0.exeを起動しドライバーをインストールします。※その後PCの再起動が必要です。

(3) DNX bootボタンを押しながらDC 12Vを繋ぎます。

(4) USB Type CでPCと接続します。

(5) PC側でデバイスマネージャーを起動します。

(6) Intel DnX Deviceが表示されていることを確認します。

 

 

(7) 解凍したフォルダー下のpublicフォルダーからBIOSイメージをDNXフォルダーに移動します。

BIOSイメージは joule_C0-X64-Release-131-Public_DNX.bin というファイルです。

(8) Flash.batを起動します。

(9) 以下のメッセージが出力されればBIOSの更新は完了です。

==========================
 Intel(R) Joule Flash.bat version #1.1.5
------------------------------------------
- Provisioning the eMMC...
  - WARNING: Provisioning failed!
             Probably already provisioned.
- Checking for RPMB...
- Downloading the BIOS...
- Clearing NvStorage...
==========================

 

(10)インテル(R) Joule(TM) 570x 開発キットをブートして正常にOSが立ち上がることを確認します。

 

2-4.Ubuntu Desktop 16.04 LTSのインストールメディアの作成


Ubuntu 16.04 LTSの導入方法は以下のページにあります。

Getting started with an Intel(R) Joule

※Developer setupの方法を説明します。

※"Ubuntu Core 16 classic image for intel Joule"というリンクがありますが、モジュールとリンク先が間違っています。(Ubuntu Coreのモジュールになっています)

 

(1) ブラウザからダウンロードするため以下のURLを入力します。

 http://people.canonical.com/~platform/snappy/tuchuck/

(2) tuchuck-xenial-desktop-iso-20161006-0.isoをダウンロードします。

※日付の部分はダウンロードのタイミングで違っているかもしれません。

(3) ダウンロードしたファイルを解凍します。

(4) 母艦PCを何とかしてUbuntuで立ち上げます。※LiveDVD版で大丈夫です。

(5) "Startup Disk Creator"を利用して、USBメモリーにDISKイメージを作成します。

 

2-5.SSDへのUbuntuのインストール


SSDへUbuntu Desktop版をインストールします。

 

(1) SSD(/dev/sda)にインストールされるようにISOファイルをBzエディタで書き換えます。 ("mmcblk1" → "sda"を2か所書き換え。4文字分空いたところは、x’0a’を入れました)

 

 

(2) 編集したISOファイルをインテル(R) Joule(TM) 570x 開発キットに転送します。

(3) "Startup Disk Creator"を利用して、USBメモリーにDISKイメージを作成します。

(4) インテル(R) Joule(TM) 570x 開発キットにUSB HUBを利用してUSBキーボード、マウス、インストール用USBメモリーを接続します。HDMIディスプレイも接続します。

(5) 起動時にF2キーを押してBIOS画面を操作し、USBからブートします。

(6) 自動的にインストールが進みます。 Ubuntuがめちゃくちゃ早くなりました!

 

 

 

 

 

2-6.Bluetooth機器を接続しよう


UbuntuでのBluetooth機器の接続は、システム設定から簡単に行えます。

 

(1) 上のツールバーのBluetoothボタンをクリックします。

(2) 機器を追加する場合は、"+"ボタンをクリックします。

(3) デバイスをペアリング状態にして"進む"ボタンを押していってペアリングします。

以下の機器も接続できました。

 

 

 

-7.Node.jsをインストールしよう


Node.jsのインストールを行います。

Downloads

 

(1) node.jsのソースコードをダウンロードし解凍します

(2) 以下のコマンドでインストールします。

$ chmod +x ./configure

$ sudo ./configure

$ sudo make

$ sudo make install

 

(3) バージョンを確認します。

$ node -v

v6.9.2

 

(4) node_modulesのパスを.bashrcに記述します。

 

2-8.MRAAをインストールしよう


MRAAのインストールの方法は以下のページで解説されています。

Installing and updating middleware libraries

※MRAAはIntelが中心となって開発をしている、ハードウェア操作を行うライブラリーです。C/C++/JavaScript/Python等で書かれたアプリケーションから利用することができます。

 

(1) 以下のコマンドでツールをインストールします。

$ sudo apt-get install git curl cmake swig

 

(2) インストール解説ページのcurlコマンドでMRAAをインストールします。

※以下のUbuntuの標準方式では旧バージョンがインストールされるようです。(2016年11月29日現在)

$ sudo add-apt-repository ppa:mraa/mraa
$ sudo apt-get update
$ sudo apt-get install libmraa1 libmraa-dev mraa-tools python-mraa python3-mraa

 

(3) MRAAのバージョンを確認します。

$ mraa-gpio version

Version v1.5.1-11-gc1017bb on Intel GT Tuchuck

 

(4) GPIOの設定を確認します

以下のコマンドでMRAAで操作できるGPIO一覧が出力されます。

$ mraa-gpio list

※「添付1 GPIO設定」参照

 

(5) LEDの操作を確認

以下のコマンドでLEDの操作を確認します。

$ sudo mraa-gpio set 100 1 ←右端のLEDが点灯。

$ sudo mraa-gpio set 100 0 ←右端のLEDが消灯。

 

(6) node+MRAAでLチカを確認します。 

ファイル名:led.js

var m = require('mraa');

console.log('MRAA Version: ' + m.getVersion());
console.log('MRAA PlatformName: ' + m.getPlatformName());
console.log('MRAA PlatformType: ' + m.getPlatformType());
console.log('MRAA getPinCount: ' + m.getPinCount());

console.log('MRAA getPinName101: ' + m.getPinName(101));

var myLed = new m.Gpio(101);
myLed.dir(m.DIR_OUT);

var ledState = true;

function periodicActivity() {
    myLed.write(ledState?1:0);
    ledState = !ledState;
    setTimeout(periodicActivity, 100);
}

periodicActivity();

 

[実行結果]

$ node led.js
MRAA Version: v1.5.1-11-gc1017bb ←最新バージョン
MRAA PlatformName: Intel GT Tuchuck ←Jouleを認識
MRAA PlatformType: 13
MRAA getPinCount: 106 ←ピンの最大値も認識

MRAA getPinName101: LED101 ←LEDって出てるのに
/home/yos/node-test/led.js:8
var myLed = new m.Gpio(101); ←でもエラーになります。
            ^

Error: Illegal arguments for construction of _exports_Gpio
    at Error (native)
    at Object.<anonymous> (/home/yos/node-test/led.js:8:13)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)

 

[エラー原因]

Ubuntuでは、GPIOの制御を /sys/class/gpio/exportというエントリーに書き込みをすることで行っています。そのエントリーのアクセス権が rootのみであった為、エラーになっていたようです。以下のコマンドでアクセス権を与えることによって、nodeのエラーは回避できました。が、LEDは点滅しません。

$ sudo chmod 222 /sys/class/gpio/export

$ sudo chmod 222 /sys/class/gpio/unexport

 

(6) DEBUGその2

コマンドラインからはLEDが点滅できるので、権限の問題のようです。

root権限で上記nodeスクリプトを実行してみます。

$ sudo node led.js

Error Cannot find module 'mraa'

あちらを立てれば、こちらが立たずです。

rootの.bashrcにもnode_modulesのパスを記述します。

 

$ sudo node led.js

やっと成功しました。!

 

 

 

-9.vsfptdをインストールしよう


母艦PCとのファイル転送の為にvsfptdのインストールを行います。

 

(1) 以下のコマンドでvsftpdのインストールを行います。

$ sudo apt-get install vsftpd

 

(2) 設定ファイル /etc/vsftpd.conf を編集します。

 以下の行のコメントを外します。

 ・write_enables=YES

 ・ascii_upload_enable=YES

 ・ascii_download_enable=YES

 ・chroot_local_user=YES

 ・chroot_list_enable=YES

 ・chroot_list_file=/etc/vsftpd.chroot_list

 ・ls_recurse_enable=YES

 ・utf8_filesystem=YES

 以下の行を追加します。

 ・use_localtime=YES

(3) 以下のコマンドでvsftpdを再起動します。

$ sudo systemctl restart vsftpd

 

(4) 母艦PCで WinSCP等を起動してファイル転送を行います。

 

-10.OpenCVをインストールしよう


OpenCV+contribをインストールします。

 

(1) 関連ライブラリーをインストールします。

$ sudo apt-get update

$ sudo apt-get upgrade

$ sudo apt-get install build-essential cmake pkg-config

$ sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev

$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev

$ sudo apt-get install libv4l-dev livxvidcore-dev libx264-dev

$ sudo apt-get install libgtk-3-dev

$ sudo apt-get install python2.7-dev python-numpy

 

(2) githubから最新版のソースをダウンロードします。

$ mkdir opencv3

$ cd opencv3

$ git clone https://github.com/opencv/opencv.git

$ git clone https://github.com/opencv/opencv_contrib.git

 

(3) OpenCV3をコンパイル・インストールします。

$ mkdir release

$ cd release

$ cmake -D PYTHON_EXECUTABLE=/usr/bin/python \

 -D CMAKE_BUILD_TYPE=RELEASE \

 -D BUILD_opencv_python2=ON \

 -D INSTALL_PYTHON_EXAMPLES=ON \

 -D WITH_V4L=ON \

 -D CMAKE_INSTALL_PREFIX=/usr/local \

 -D OPENCV_EXTRA_MODULES_PATH= \

   ../../opencv_contrib_modules \

 -D BUID_EXAMPLES=ON \

 -D INSTALL_PYTHON_EXAMPLES=ON \

 -D WITH_EIGEN=YES \

 -D WITH_OPENCL=OFF ../

 

(4) cmakeの出力を確認します。

"python2:"というラベルを探して、その下の"Interpreter:"、"Libraries:"、"numpy:"、"packages path:"という項目が認識されているか確認します。("No"だと駄目です)

 

(5) OpenCVのバージョンを確認します。

$ python

>>> import cv2

>>> print(cv2.__version__)

3.2.0-rc

※OpenCV3.2.0をインストールしてしまいました。

 

-11.PILをインストールしよう


画像ファイルを取り扱う為、PILをインストールします。

 

(1) PIL 1.1.7のソースファイルをダウンロードします。

Python Imaging Library

※上記ページから "Pyhton Imaging Library 1.1.7 Source Kit"をダウンロード

(2) アーカイブマネージャー等で解凍します。

(3) 解凍されたディレクトリーに移ってPILをインストールします。

$ cd Imagingp1.1.7

$ sudo python setup.py install

 

-12.Open JTalkをインストールしよう


以下のページを参考にして、Open JTalkをインストールします。

Raspberry piで日本語音声合成(Open JTalk)を試してみる

 

(1) Open JTalk本体をインストールします。

$ sudo apt-get install open-jtalk

 

(2) 辞書と音声ファイルをインストールします。

$ sudo apt-get install open-jtalk-mecab-naist-jdic

$ sudo apt-get install hts-voice-nitech-jp-atr503-m001

 

(3) 参考ページのスクリプトを入力しchmodコマンドで実行ファイルにします。

jsay.shというファイル名にしています。

#!/bin/sh

TMP=/tmp/jsay.wav

echo "$1" | open_jtalk
-m /usr/share/hts-voice/nitech-jp-atr503-m001/

  nitech_jp_atr503_m001.htsvoice
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \

  -ow $TMP && aplay --quiet $TMP

rm -f $TMP


(4) 女性の音声ファイルをインストールします。
音声ファイルは以下のサイトから入手しました。
MMDAgent

$ wget http://downloads.sourceforge.net/project/
mmdagent/MMDAgent_Example/MMDAgent_Example-1.6/
MMDAgent_Example-1.6.zip

$ unzip MMDAgent_Example-1.6.zip

$ sudo cp -R ./MMDAgent_Example-1.6/Voice/mei /usr/share/hts-voice/

 

(5) スクリプトを修正します。

4行目の-m以下を下のように変更しました。

 -m /usr/share/hts-voice/mei/mei_normal.htsvoice 

 

(6) 音声合成を試してみる

$ ./jsay.sh "顔を認識しました"

 

-13.SimpleScreenRecoderをインストールしよう


デモの動画を作成する為、以下のページを参考にして、SimpleScreenRecoderをインストールします。

SimpleScreenRecorderで簡単スクリーンレコード

 

(1) PPAを追加する

SimpleScreenRecorderはPPA(Personal Package Archives)に登録されているので、PPAの追加を行います。

$ sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder

$ sudo apt-get update

$ sudo apt-cache search simplescreenrecoder

simplescreenrecorder - feature-rich screen recorder that supports X11 and OpenGL
simplescreenrecorder-lib - feature-rich screen recorder that supports X11 and OpenGL - GLInject library

 

(2) SimpleScreenRecoderをインストールする

$ sudo apt-get install simplescreenrecorder

※関連パッケージの導入も全てapt-getで行ってくれるので簡単です。

 

※Windowsのムービーメーカーで動画を編集する場合は、".mkv"という拡張子を付与して下さい。

 

[SimpleScreenRecorderの操作画面]

更新: 2016/12/29

EpisodeⅢ.Jouleの実力は?

できることを見極める為に、インテル(R) Joule(TM) 570x 開発キットの能力を測定します。

 

3-1.bogomips(/proc/cpuinfo)


LinuxでのCPU能力の簡易的な確認方法は、/proc/cpuinfoの値です。

確認するとCPU 1つあたりのbogomipsの値は 3,379.20なので、4Core分で13,516.8bogomipsになります。

ちなみに Raspberry Pi B+のbogomipsの値は、697.95でした。CISCとRISCという違いはあるのですが、単純計算ではJoule(TM)は19.3倍高速であるという事になります。

 

$ cat /proc/cpuinfo

※「添付6Joule cpuinfo」参照

※「添付7 Raspberry Pi B+ cpuinfo」参照

 

3-2.sysbench


Linuxの代表的なベンチマークソフトのsysbenchを動かしてみました。

ソースはGitHubのここにあります。(インストールについてはここを参考にさせて頂きました)

 

(1) sysbenchのソースをダウンロードします。

(2) 以下のコマンドでインストールします。

$ autoreconf -i --force --install

$ ./configure --without-mysql

$ make

$ make install

 

(3) CPUベンチマークを実行します。

CPUベンチマークでは、素数を数える処理(最大探索数は指定可能、デフォルトは10000)を行い、それにかかった時間を測定します。

Raspberry Pi B+と比べて、Joule(TM)が53倍速いという結果が出ました。

 

$ sysbench --test=cpu run

sysbench 1.0:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time


Prime numbers limit: 10000

Initializing worker threads...

Threads started!


General statistics:
    total time:                          8.9434s
    total number of events:              10000
    total time taken by event execution: 8.9392s
    response time:
         min:                                  0.81ms
         avg:                                  0.89ms
         max:                                  1.66ms
         approx.  95 percentile:               1.20ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   8.9392/0.00

 

(4) Raspberry Pi B+でもCPUベンチマークを実行してみました。

インテル(R) Joule(TM) 570x 開発キット8.9秒で終わる処理が、479秒かかっています。Joule(TM)が53倍速いということになります。

※apt-getでインストールされるsysbenchがかなり古いものだったので、Jouleと同じ方法でインストールしました。

 

$ sysbench --test=cpu run

sysbench 1.0:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time


Prime numbers limit: 10000

Initializing worker threads...

Threads started!


General statistics:
    total time:                          479.1194s
    total number of events:              10000
    total time taken by event execution: 478.9837s
    response time:
         min:                                 47.46ms
         avg:                                 47.90ms
         max:                                 80.66ms
         approx.  95 percentile:              50.51ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   478.9837/0.00

 

(5) メモリーベンチマークも実行してみました。

メモリーベンチマークでは、メモリーに対する連続的な書き込み及び読み出しを行って、それにかかった時間を測定しています。(デフォルトでは約100GBの範囲)

Raspberry Pi B+と比べて、Joule(TM)が22倍速いという結果が出ました。

 

$ sysbench --test=memory run

sysbench 1.0:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time


Initializing worker threads...

Threads started!

Operations performed: 104857600 (2509597.59 ops/sec)

102400.00 MiB transferred (2450.78 MiB/sec)


General statistics:
    total time:                          41.7826s
    total number of events:              104857600
    total time taken by event execution: 22.4446s
    response time:
         min:                                  0.00ms
         avg:                                  0.00ms
         max:                                  0.67ms
         approx.  95 percentile:               0.00ms

Threads fairness:
    events (avg/stddev):           104857600.0000/0.00
    execution time (avg/stddev):   22.4446/0.00

 

(6) Raspberry Pi B+でもメモリーベンチマークを実行してみました。

インテル(R) Joule(TM) 570x 開発キットが41.8秒で終わる処理が945秒かかっています。Joule(TM)が22倍速いということになります。

 

$ sysbench --test=memory run

sysbench 1.0:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time


Initializing worker threads...

Threads started!

Operations performed: 104857600 (111018.83 ops/sec)

102400.00 MiB transferred (108.42 MiB/sec)


General statistics:
    total time:                          944.5029s
    total number of events:              104857600
    total time taken by event execution: 440.4928s
    response time:
         min:                                  0.00ms
         avg:                                  0.00ms
         max:                                 40.19ms
         approx.  95 percentile:               0.00ms

Threads fairness:
    events (avg/stddev):           104857600.0000/0.00
    execution time (avg/stddev):   440.4928/0.00

 

更新: 2016/12/29

添付資料

添付1 GPIO設定


$ mrra-gpio list

01        GPIO: GPIO
02      SPP1RX: GPIO SPI
03     PMICRST:
04      SPP1TX: GPIO SPI
05     19.2mhz: GPIO
06     SPP1FS0: GPIO SPI
07     UART0TX: UART
08     SPP1FS2: GPIO SPI
09       PWRGD:
10     SPP1CLK: GPIO SPI
11     I2C0SDA: I2C
12     I2S1SDI: GPIO
13     I2C0SCL: I2C
14     I2S1SDO: GPIO
15     I2C1SDA: I2C
16      I2S1WS: GPIO
17     I2C1SCL: I2C
18     I2S1CLK: GPIO
19     I2C2SDA: I2C
20     I2S1MCL: GPIO
21     I2C2SCL: I2C
22     UART1TX: UART
23     I2S4SDO:
24     UART1RX: UART
25     I2S4SDI:
26        PWM0: GPIO PWM
27     I2S4BLK: GPIO
28        PWM1: GPIO PWM
29      I2S4WS:
30        PWM2: GPIO PWM
31     I2S3SDO:
32        PWM3: GPIO PWM
33     I2S3SDI:
34        1.8V:
35     I2S4BLK: GPIO
36         GND:
37         GND:
38         GND:
39         GND:
40        3.3V:
41         GND:
42          5V:
43         GND:
44          5V:
45         GND:
46        3.3V:
47         GND:
48        3.3V:
49         GND:
50        1.8V:
51        GPIO: GPIO
52        1.8V:
53       PANEL: GPIO
54         GND:
55       PANEL: GPIO
56      CAMERA:
57       PANEL: GPIO
58      CAMERA:
59     SPP0FS0: GPIO SPI
60      CAMERA:
61     SPP0FS1: GPIO SPI
62     SPI_DAT:
63     SPP0FS2: GPIO SPI
64     SPICLKB: GPIO
65     SPP0FS3: GPIO SPI
66     SPICLKA: GPIO
67      SPP0TX: GPIO SPI
68     UART0RX: GPIO UART
69      SPP0RX: GPIO SPI
70     UART0RT: GPIO UART
71     I2C1SDA: GPIO I2C
72     UART0CT: GPIO UART
73     I2C1SCL: GPIO I2C
74     UART1TX: GPIO UART
75     I2C2SDA: GPIO I2C
76     UART1RX: GPIO UART
77     I2C1SCL: GPIO I2C
78     UART1RT: GPIO UART
79     RTC_CLK: GPIO
80     UART1CT: GPIO UART
100      LED100: GPIO
101      LED101: GPIO
102      LED102: GPIO
103      LED103: GPIO
104     LEDWIFI: GPIO
105       LEDBT: GPIO

 

添付2 Joule cpuinfo


$ cat /proc/cpuinfo

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 92
model name      : Intel(R) Atom(TM) Processor T5700 @ 1.70GHz
stepping        : 2
microcode       : 0x6
cpu MHz         : 900.000
cache size      : 2048 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 4
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 21
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg cx16 xtpr pdcm sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes rdrand lahf_lm 3dnowprefetch ida arat pln pts dtherm intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust smep erms rdseed smap clflushopt sha_ni xgetbv1
bugs            :
bogomips        : 3379.20
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 92
model name      : Intel(R) Atom(TM) Processor T5700 @ 1.70GHz
stepping        : 2
microcode       : 0x6
cpu MHz         : 800.000
cache size      : 2048 KB
physical id     : 0
siblings        : 4
core id         : 1
cpu cores       : 4
apicid          : 2
initial apicid  : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 21
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg cx16 xtpr pdcm sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes rdrand lahf_lm 3dnowprefetch ida arat pln pts dtherm intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust smep erms rdseed smap clflushopt sha_ni xgetbv1
bugs            :
bogomips        : 3379.20
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

processor       : 2
vendor_id       : GenuineIntel
cpu family      : 6
model           : 92
model name      : Intel(R) Atom(TM) Processor T5700 @ 1.70GHz
stepping        : 2
microcode       : 0x6
cpu MHz         : 800.000
cache size      : 2048 KB
physical id     : 0
siblings        : 4
core id         : 2
cpu cores       : 4
apicid          : 4
initial apicid  : 4
fpu             : yes
fpu_exception   : yes
cpuid level     : 21
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg cx16 xtpr pdcm sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes rdrand lahf_lm 3dnowprefetch ida arat pln pts dtherm intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust smep erms rdseed smap clflushopt sha_ni xgetbv1
bugs            :
bogomips        : 3379.20
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 6
model           : 92
model name      : Intel(R) Atom(TM) Processor T5700 @ 1.70GHz
stepping        : 2
microcode       : 0x6
cpu MHz         : 2100.000
cache size      : 2048 KB
physical id     : 0
siblings        : 4
core id         : 3
cpu cores       : 4
apicid          : 6
initial apicid  : 6
fpu             : yes
fpu_exception   : yes
cpuid level     : 21
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg cx16 xtpr pdcm sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes rdrand lahf_lm 3dnowprefetch ida arat pln pts dtherm intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust smep erms rdseed smap clflushopt sha_ni xgetbv1
bugs            :
bogomips        : 3379.20
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

 

添付3 Raspberry Pi B+ cpuinfo


$ cat /proc/cpuinfo

processor       : 0
model name      : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS        : 697.95
Features        : half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb76
CPU revision    : 7

Hardware        : BCM2708
Revision        : 0010
Serial          : 00000000bf3742ec

 

添付4 Reference Linux OS for IoT(Ostro)の再導入


Reference Linux OS for IoTの導入をWindows PCから行う方法は以下のページで解説されています。

Flashing development okatform with the latest version of Refernce Linux OS for IoT

 

(1) Refernce Linux OS for IoT(Ostro)のリリースフォルダーをブラウザで開きます。

(2) 最新の安定版のフォルダーを見つけます。※v.X.Y.Zという形式です。

(3) images -> intel-corei7-64と進みます。

(4) ostro-xt-image-swupd-intel-corei7-64.dsk.xz というファイルをダウンロードします

(5) 7zip等の解凍ソフトで解凍します。

(6) Windows用のツールをダウンロードします。

(7) 4GB以上の空のUSBメモリーをPCに差しておきます。

(8) 上記ツールを起動します。

(9) Nextボタンをクリックします。

 

(10) ライセンスを許諾してNextをクリックします。

(11) まずUSBドライバーをインストールします。

(12) ”USB driver installed"に変わったのを確認して、"Burn OS Image"をクリックします。

(13) 解凍したOSイメージファイルを指定してNextボタンをクリックします。

(14) 空のUSBメモリーが表示されていることを確認してNextボタンをクリックします。

(15) 導入サマリー画面が表示されるのでNextボタンをクリックします。 

(16) 15分待つのだよ 

(17) 作成完了(Continueをクリックすると最初に戻るのでFinish)

(18) Joule(TM)とPCを Micro USB(Type B)で接続します。

(19) HDMIディスプレイとUSB HUBを使ってUSBキーボードとUSBメモリーをJoule(TM)に接続します。

(20) Joule(TM)の電源を入れてUSBキーボードのF2キーを押します。

(21) Boot Maintenance Managerを選択します。

(22) Boot Optionsを選択します。

(23) Change Boot Orderを選択します。

(24) "+"キーで作成したデバイス(USB or SDカード)をリストの先頭にもっていきます。

(25) Commit Changes and Exitを選択します。

(26) ESCキーを押してメインメニューに戻り、Continueを選択します。

(27) インストール用のLinuxのブートメッセージが表示されます。

(28) メッセージが一瞬止まり "Would you like to install the system onto eMMC [y/N]:"と表示されます。

※この時、すぐに "y"を入力しないとタイムアウトして、USBメモリーからのOstroの立ち上げに移行してしまいます。そして一度立ち上げてしまうと、同じUSBでの2度目のインストールは出来ないようで、もう一度、USBメモリーを作り直す必要があるようです。

(29) 何分かして "Press any key to reboot"が表示されたら完了です。

 

更新: 2016/12/30

没ネタ置場

トライしてみたけど、色々な理由で没になったネタ項目。誰かの為になるかもしれないので、置いておきます。

 

★Ostroは開発支援機能が実装されていなかったので不採用

没ネタ1.OstroでのWi-Fi接続方法


Wi-Fiの接続方法は以下のページで解説されています。

Connecting the development platform to Wi-Fi

 

(1) Wi-Fiの状態を確認します。

 Bluetoothは初期状態では電源OFF(Powered = False)になっているようです。

$ connmanctl technologies

/net/connman/technology/p2p
  Name = P2P
  Type = p2p
  Powered = False
  Connected = False
  Tethering = False
/net/connman/technology/wifi
  Name = WiFi
  Type = wifi
  Powered = True
  Connected = False
  Tethering = False
/net/connman/technology/bluetooth
  Name = Bluetooth
  Type = bluetooth
  Powered = False
  Connected = False
  Tethering = False

 

(2) connmanctlコマンドをパラメータ無しで投入し、会話モードにします。

(3) 以下のサブコマンドを投入します

connmanctl> scan wifi

connmanctl> services

 

(4) connectサブコマンドで、APに接続します。

connmanctl> connect <AP名>

 

(5) Wi-Fiのパスフレーズの入力をして接続完了

(6) ping 8.8.8.8 コマンドを投入し、インターネット接続を確認します。

 

没ネタ2.OstroでのBluetooth接続方法


bluetoothの接続方法は以下のページで解説されています。

Pairing the development platform with a Bluetooth device

 

なるべく無線化したいのでbluetoothキーボード/マウス/スピーカーを準備しました。

 

 

 

(1) connmanctlコマンドをパラメーター無しで投入します。

(2) bluetooth通信をイネーブルにします。

connmanctl> enable bluetooth

 

(3) bluetoothの状態を確認します。

buletooth機能がオン(Powered = True)であることを確認します。

connmanctl> technologies

/net/connman/technology/p2p
  Name = P2P
  Type = p2p
  Powered = False
  Connected = False
  Tethering = False
/net/connman/technology/wifi
  Name = WiFi
  Type = wifi
  Powered = True
  Connected = True
  Tethering = False
/net/connman/technology/bluetooth
  Name = Bluetooth
  Type = bluetooth
  Powered = True
  Connected = False
  Tethering = False

 

(4) 「buletoothctl」コマンドをパラメーター無しで投入します。

(5) 周辺のbluetooth機器をスキャンします。

[bluetooth]# scan on

 

(6) 相手先のbluetooth機器のMACアドレスが表示されたらスキャンを停止し、ペアリングをします。

[bluetooth]# scan off

[bluetooth]# pair <MACアドレス>

[bluetooth]# connect <MACアドレス>

 

(7) blutoothctlを終了します。

[bluetooth]# exit

 

没ネタ3.Ostroでのタイムゾーンと時刻設定方法


タイムゾーンや時刻を設定します。

 

(1) 時刻の設定を確認します。

$ timedatectl

      Local time: Sun 2016-11-06 12:12:16 UTC
Universal time: Sun 2016-11-06 12:12:16 UTC
      RTC time: Sun 2016-11-06 12:12:16
       Time zone: Universal (UTC, +0000)
Network time on: yes
NTP synchronized: no
RTC in local TZ: no

 

(2) タイムゾーンを設定します。

$ timedatectl set-timezone Asia/Tokyo

 

(3) ntpを有効化します。

$ timedatectl set-ntp true

 

没ネタ4.OstroでのSSH接続方法


SSHの接続設定は以下のページで解説されています。

Enabling SSH

 

(1) sshからrootでのログインを可能にします

 /etc/ssh/sshd_config ファイルに "PermitRootLogin yes"を追加します。(viコマンド等)

(2) passwdコマンドでrootユーザにパスワードを設定します。

(3) teraterm等のターミナルプログラムからSSH接続できるようになります。

 

 

★Ubuntuでは、Intel XDKは動かないので不採用

没ネタ5.Node.jsの開発環境(Intel XDK)を準備しよう(Ubuntuでは未検証)


Node.jsの開発環境(Intel XDK)の準備は以下のページで解説されています。

Programming your development platform with Node.js:Intel XDK

 

(1) ここ からwindows用インストーラーをダウンロード。

(2) インストーラーを右クリックして管理者として実行。

(3) 完了画面でXDKを実行。

(4) Intel XDKにサインアップ。(しなくても良いのかな?)

(5) Onboard LED Blinkのサンプルを取得

(6) プロジェクトディレクトリーの場所と名前を入力。

(7) IoT Deviceでインテル(R) Joule(TM) 570x 開発キットと接続。

(8) RunボタンでサンプルのLED Blinkを実行。

 と思ったら、Node.jsがアボートしました。MRAAでトラブっているようです。

 

 

(9) もう一度MRAAのインストールをやり直したところ、うまく動くようになりました。

※Intel XDKのメニューで「Update libraries on board」というものがありますが、それを動かしたところおかしくなったようです。(途中でopkg not foundというエラーが出ていたので、整合性が合わなくなったのだと思います。)

 

 

★RealSense用のカメラは購入していないので不採用

没ネタ6.RealSenseを導入しよう


Intel RealSense の導入は以下のページで解説されています。

IntelRealSense / librealsense

 

(1) Installation GuideのページでLinuxをクリックします。

$ sudo apt-get install libusb-dev pkg-config

$ sudo apt-get install libglfw3-dev

$ sudo apt-get install qtcreator

※この後の"scripts/install_qt.sh"というコマンドを投入することになっているのですが、このスクリプトが見つかりません。(GitHubからのダウンロードが抜けているようです)

 

(2) 以下のコマンドで導入しました。(数分で終わります)

$ mkdir build

$ cd build

$ cmake ..

$ make

$ make install

 

★OpenCV/OpenCLの組み合わせでGPUも利用されて、3D処理等が高速化されましたが、なぜかOpenCVの顔認識が超遅くなるので不採用

没ネタ7.OpenCLを導入しよう


OpenCLの導入はTake's diaryを参考にさせて頂きました。

Joule(TM)はせっかく最新のGPUを持っているので、こき使いたいと思いOpenCLを導入します。

日本では最速の情報と思われるのTakeSANのブログを参考にさせて頂きました。

 

(1) カーネルをバージョンアップ(4.7.0以上)します。

$ wget kernel.ubuntu.com/~kernel-ppa/mainline/v4.7.2/linux-headers-4.7.2-040702_4.7.2-040702.201608201334_all.deb
$ wget kernel.ubuntu.com/~kernel-ppa/mainline/v4.7.2/linux-headers-4.7.2-040702-generic_4.7.2-040702.201608201334_amd64.deb
$ wget kernel.ubuntu.com/~kernel-ppa/mainline/v4.7.2/linux-image-4.7.2-040702-generic_4.7.2-040702.201608201334_amd64.deb
$ sudo dpkg -i linux-*4.7.2*.deb

 

(2) rebootします

(3) カーネルのバージョンを確認します。

$ uname -a

Linux joule 4.7.2-040702-generic #201608201334 SMP Sat Aug 20 17:37:03 UTC 2016 x86_64 x86_64 GNU/Linux

 

(4) 以下のページからOpenclをダウンロードします。

https://software.intel.com/en-us/articles/opencl-drivers#latest_linux_driver

※SDKパッケージのlinux 64bit版

(5) ダウンロードしたディレクトリーの install_GUI.shを実行します。

$ ./install_GUI.sh

 

没ネタ8.OpenCVを導入しよう


OpenCLの導入もTake's diaryを参考にさせて頂きました。

 

(1) 依存関係のモジュールをインストールします。

$ sudo apt-get install build-essential

$ sudo apt-get install cmake git libgtk2.0-dev pkg-config

$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev

$ sudo apt-get install python-dev python-numpy libtbb2

$ sudo apt-get install libtbb-dev libjpeg-dev libpng-dev

$ sudo apt-get install libtiff-dev libjasper-dev libdc1394-22-dev

 

(2) OpenCVのソースをダウンロードして解凍します。

(3) 以下のコマンドでインストールします。

$ cd ./opencv

$ mkdir release

$ cd release

$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

$ make

$ sudo make install

 

(4) OpenCVのバージョンを確認します

$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10)

[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.1.0'
>>>

 

★MinicondaでインストールされるバージョンのOpenCV3には、顔認識のメソッドにバグがあることがわかった為不採用

没ネタ9.OpenCVをインストールしよう


OpenCVをインストールするために、まずMinicondaをインストールします。

minicondaとは、condaというpython用のパッケージ管理システムです。さらにpython 3.5やpython 2.7のバージョン管理や仮想環境の管理も可能なようです。

以下のリンクからダウンロードします。

miniconda

 

(1) 以下のコマンドでインストールします。

$ bash Miniconda3-latest-Linux-x86_64.sh

 

(2) 以下のコマンドで導入済みのパッケージを確認できます。

 

(3) conda を最新版にアップデートします。

$ conda update conda

 

(4) numpy、opencvをインストールします。

$ conda install numpy

$ conda install -c https://conda.anaconda.org/menpo opencv3

 

 

更新: 2016/12/31
総評

すばらしい製品だとは思いますが...

11月1日にレビューア選出のメッセージをもらって、試行錯誤の末、自己設定の期限ぎりぎりにレビューを完成させることができました。

インテル(R) Joule(TM) 570x 開発キットを受け取って、開発を始めましたが、OSの選定から始まって、 ツールの選定、インストールの繰り返し等、いばらの道が続きました。

(でもインテル社の製品ページも日毎に充実していった為、今レビューを始めたら何分の1の労力で済んだかもしれません。)

 

インテル(R) Joule(TM) 570x 開発キットの、コンパクトな基板に秘めた有り余るパワーを活かす為には、画像認識やロボット制御等の応用分野の開拓や、利用者の拡大が必要だと思います。

「限られた人だけが使うプロ用途」と言ってしまえばそれまでですが、Raspberry Piの10倍以上の価格ではアマチュアがおいそれと使えるものでは無いと思います。

コメント (7)

  • hidechanさん

    2016/11/19

    ファーストインプレッションお疲れ様です。
    開発キット
    思った通りハードル高いですw
    も~呪文にしか見えません><
    分かっている人がやっているのを見るのは面白いのですが、自分ではやれないな~
    という事が改めて分かりました。
    テーマソングが流れるまでの続きを楽しみにしています(*´▽`*)
  • jakeさん

    2016/11/19

    1stインプレお疲れ様です。
    アプリの動作は、動画をとってもらえると説得力が増すかもしれませんね。
    動いてる方がインパクトありますし。
  • yosyos888さん

    2016/11/19

    hidechanさん、jakeさん
    ありがとうございます。
    出来立てのほやほやのOSのようで、ツールが何もありません。これから茨の道です。ubuntuに転身してしまうかもしれません。
    動画は撮ったのですが、window10になって動画編集ツールが無くなったようなので、youtubeへの上げ方を調べている余裕が無かったのです。
    一段落したのでこれから勉強してみます。
他4件のコメントを表示

ZIGSOWにログインするとコメントやこのアイテムを持っているユーザー全員に質問できます。

YouTube の動画を挿入

YouTube の URL または動画の ID を入力してください

動画の ID が取得できません。ID もしくは URL を正しく入力してください。

ニコニコ動画の動画を挿入

ニコニコ動画の URL または動画の ID を入力してください

動画の ID が取得できません。ID もしくは URL を正しく入力してください。

ZIGSOWリンク挿入

検索対象とキーワードを入力してください

    外部リンクを挿入

    リンク先の URL とタイトルを入力してください

    URL を正しく入力してください。

    画像を挿入(最大サイズ6MB)

    画像を選択してください

    ファイルサイズが6MBを超えています

    別の画像を追加

    ZIGSOW にログイン

    ZIGSOW会員登録(無料)はこちらから