2015

Intel RealSense 3Dカメラを JavaFX で動かしてみた。

JavaFX

この記事は、JavaFX Advent Calendar 2015 の14日目の記事です。

昨日は tomo_taka01 さんの 「Server Event Client Sample」 です。明日は  kimukou さんの「試用もふくめて basilisk-fw あたりの話を書こうかと」です。

今年は Windows 10 がリリースされ生体認証でログインできる Windows Hello が実装されました。

Windows OS にこのような機能が搭載されてしまったからにはこういった時代になるんだろうなってことで、

とりあえず WebCam でも買って試してみようかと思ったら特殊なカメラ機能が必要で量販家電店で売っているものでは駄目でした。

少し調べてみたら Intel RealSense 3Dカメラ(F200) が intel のサイトから購入可能だったので買ってしまいました。

このカメラで何ができるかはこちらをご覧ください。

インテル® RealSense™ テクノロジー

このカメラを購入した理由の一つに Intel® RealSense™ SDK が開発者登録さえすれば無償で入手可能であり、Java もサポートしているということでした。

購入はこちらからとなります。

Intel® RealSense™ Developer Kit

これは開発者向けのキットということで一般的に市販されている webCam のように便利なアプリケーションは付属してません。

ただし、一般的な WebCam には無い機能を搭載しているのでいろんなことができるようです。

私は新しい物好きな性格から Windows Hello を使いたかっただけなのですが、開発環境に Java 言語もサポートとあったのでちょっと試してみることにしました。

はじめに、Intel RealSense 3Dカメラ(F200) は次のような特徴をもっています。

Specifications

Shorter range (0.2 meters – 1.2 meters, indoors only)
Depth/IR: 640×480 resolution at 60fps
RGB: 1080p at 30fps
USB 3.0 required
Developer Kit Dimensions: 150mm x 30mm x 58mm

Targeted Usages

Full hand-skeletal tracking and gesture control
3D segmentation
Facial analysis
Depth-enhanced Augmented Reality
Speech
3D Capture for faces

SYSTEM REQUIREMENTS

Ports: USB 3.0
Supported CPUs: 4th generation (or later) Intel® Core™ processor
Supported Operating Systems: Microsoft Windows 8.1* (or later) (64-bit)

私はまさか CPU が第4世代の Haswell 以降を要求されるとは思ってなかったので Intel RealSense 3Dカメラ(F200) が届いて箱に書いてある Minimum System Requirements を見た瞬間、目が点になりました。

私の パソコンは Sandy Bridge なので・・・

大丈夫だろうとインストールを始めるも、Depth Camera Manager (DCM) のインストールでファームウェアがアップデートできないとかのエラーで撃沈しました。

しかたなく Skylake 環境にパソコンをアップグレートしてインストールを完了しました。(>_<。)

しかし、このファームウェアのアップデートさえ完了してしまえば Sandy Bridge でもインストールできてしまうんじゃないかと思い試してみたらあっけなくインストールは完了しました。

サポート外 CPU なので動作に一抹の不安を覚えます。

現状としては、Facial analysis 関係は問題無さそうです。(この発言に責任は持てません!)

さて、Intel RealSense 3Dカメラ(F200) についてはこのくらいにして私の大好きな Java で動かしてみましょう。

当然、今だと Swing なんて過去の技術なんか使わずにリッチな UI を提供してくれる JavaFX を使います。

JavaFX を使って WebCam を動かすにはどうすればいいのか?

早速、悩みます。

ここで Intel RealSense 3Dカメラ(F200) は置いといて、まず一般的に Java で WebCam を使うにはどうすればいいのか考えてみました。

まず、思いうかんだのは標準ライブラリに webCam やマイクなどハードウェアを扱う API が存在するかです。

記憶に無いです。ふと、Java Media Framework (JMF) が脳裏をよぎりました。(^_^;

それは無かったことにして他を調べてみました。(ヲヒ!

1. OpenCV を使う

2. sarxos Webcam-Capture API を使う

この二つが良さげでした。

これら二つの方法はどちらも顔検出が容易にできます。

OpenCV で顔検出のプログラムはビデオファイルを使った物は下記動画サイトにアップロードしてあります。

https://youtu.be/Zjc6-IF3rtM

WebCam を使って顔検出するプログラムを載せようと思ったけど長くなるので GitHub にアップしておきます。

1

https://github.com/Yucchi-1995/OpenCV_with_JavaFX_WebCam

sarxos Webcam-Capture API を使う方法は Example がたくさんあるし、JavaFX を利用する方法もあるので省略します。

たぶん、これが一番人気なんじゃないだろうか。

それでは、Intel RealSense SDK を使って JavaFX で Intel RealSense 3Dカメラ(F200) を動かしてみることにしましょう。

とりあえずカメラ画像を映すだけのプログラムを組むことにします。

Intel RealSense 3Dカメラ(F200) は、Color, Depth, IR と3種類のストリームを得ることができます。

なのでラジオボタンで切り替えられるようにします。

いちおう、開始、停止ボタンもつけておきます。

下図のようなプログラムがなんとかできあがりました。

動画はこちらになります。

https://youtu.be/jywwwYcwZA8

2

3

4

Intel RealSense SDK のドキュメントは英語で書かれていて日本語のものは現在ありません。

英語が解らない私は翻訳支援ソフトを頼りに悩みながらプログラムを組むことになりました。

それに残念なことに比較的新しい Windows OS 専用ということもあり、わざわざマルチプラットフォーム対応の Java 言語で開発するといった人もほとんど見られません。

Intel も本気で Java 言語をサポートする気は無いらしく Intel RealSense SDK のドキュメントは間違いだらけで唖然とします。

12月に入って新しく R5 バージョンがリリースされましたが既存のバグが直るどころか増えていたので今回は R4 を使ってます。

頼りのグーグル先生に聞いて教えてもらう情報は私と同じようにバグを踏んで困っている Java 開発者のどうしたらいいんだ?ってのが多いです。

こういう状況なので、いつものことですが間違いやおかしなことをしているかも知れませんのであしからず! (^_^;

ということで、次のようなコードでプログラムを組みました。

全部載せると長くなるので RealSenseController.java だけです。

プログラム全体は下記 GitHub でご覧ください。

https://github.com/Yucchi-1995/Intel_RealSense_First

このプログラムは START ボタンを押すとカメラ画像を ImageView にセットするためにバックグランドタスクを javafx.concurrent.Service<V> クラス を利用して処理するインスタンスを生成します。

Service<V> クラスはこのような繰り返し処理をおこなうバックグランドタスクを便利に安全に利用するには最適です。

Service<V> クラスはインタフェースWorker<V> を実装していてバックグラウンドタスクの状態を監視し、必要に応じて操作を取り消すことができます。

Service<V> クラスは再利用可能な Worker であり、リセットおよび再起動できます。

これらの機能を利用することにより Service<V> クラスによって得られた結果が STOP ボタンが押されるかプログラムを終了させるまで繰り返し ImageView にセットされます。

それでは ImageView にセットされるカメラから取得された画像はどのように処理されるのか見ていきましょう。

Intel RealSense SDK の機能を使うために SenseManager インスタンスを生成します。

        senseManager = PXCMSenseManager.CreateInstance();

使用するストリームを有効にする。

// カラーストリームを有効にする
senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR, WIDTH, HEIGHT);
// Depth ストリームを有効にする
senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_DEPTH, WIDTH, HEIGHT);
// IR ストリームを有効にする
senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_IR, WIDTH, HEIGHT);

Intel RealSense SDK の初期化

// PXCM_STATUS 初期化
pxcmStatus = senseManager.Init();

ミラーモードに設定

// ミラーモードにする
senseManager.QueryCaptureManager().QueryDevice().SetMirrorMode(PXCMCapture.Device.MirrorMode.MIRROR_MODE_HORIZONTAL);

ここまではカメラ関係の初期化処理といったところですね。

ここからは Service によるバックグランドタスクによる処理がはじまります。

if (!streamService.isRunning()) {
    streamService.reset();
    streamService.start();
}

Intel RealSense SDK の初期化処理が正常におこなわれたか判定します。

if (pxcmStatus == pxcmStatus.PXCM_STATUS_NO_ERROR) { …

フレームが正常に取得できたか判定します。

if (senseManager.AcquireFrame(true).isSuccessful()) { …

AcquireFrame(true) でフレームの更新を行います。

このメソッドは引数無し、引数一つ、引数二つの3種類あります。

今回は全てのモジュールの更新処理を待つように引数一つのもを true にして渡しています。

引数二つのものはさらにタイムアウトミリ秒 ( int )で設定できるようです。

判定に boolean isSuccessful() メソッドを使っています。

フレームデータを取得します。

PXCMCapture.Sample sample = senseManager.QuerySample();

QuerySample() メソッドで全ての(Color, Depth, IR) データを取得します。

QuerySample() メソッドには引数で取得するデータを選択できる QuerySample(int mid) もあります。

ラジオボタンによって選択されたストリームの画像データを処理します。カラーモードだけ抜粋し見ていきす。

if (sample.color != null) {
                                        // データ取得
                                        PXCMImage.ImageData cData = new PXCMImage.ImageData();
                                        // アクセス権を取得(アクセス権の種類、画像フォーマット、データ)
                                        pxcmStatus = sample.color.AcquireAccess(PXCMImage.Access.ACCESS_READ, PXCMImage.PixelFormat.PIXEL_FORMAT_RGB32, cData);

                                        if (pxcmStatus.compareTo(pxcmStatus.PXCM_STATUS_NO_ERROR) < 0) {
                                            errorContent.setValue(“Error!\n” + “Failed to AcquireAccess of ColorImage Data.”);
                                            throw new Exception();
                                        }

                                        // BufferedImage に変換 1ピクセルあたり4バイトに注意、PXCMImage.PixelFormat.PIXEL_FORMAT_RGB24 だと3バイト
                                        int cBuff[] = new int[cData.pitches[0] / 4 * HEIGHT];
                                        cData.ToIntArray(0, cBuff);
                                        BufferedImage bImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
                                        bImage.setRGB(0, 0, WIDTH, HEIGHT, cBuff, 0, cData.pitches[0] / 4);

                                        // ImageView にセットできるように Image に変換
                                        image = SwingFXUtils.toFXImage(bImage, null);

                                        // データを解放
                                        pxcmStatus = sample.color.ReleaseAccess(cData);

                                        if (pxcmStatus.compareTo(pxcmStatus.PXCM_STATUS_NO_ERROR) > 0) {
                                            errorContent.setValue(“Error!\n” + “Failed to ReleaseAccess of ColorImage Data.”);
                                            throw new Exception();
                                        }
                                    }

カラーストリームのフレームデータが null でないか判定してから処理をしています。

PXCMImage.ImageData インスタンスを生成

pxcmStatus AcquireAccess(Access access, PixelFormat format, ImageData data) メソッドでアクセス権を取得します。

このプログラムではアクセス権に読み取り、画像フォーマットは 32bit RGB を引数により指定しています。

三つ目の引数 PXCMImage.ImageData cData に出力されます。

アクセス権の種類や画像フォーマットに関してはドキュメントをご覧ください。

また、AcquireAccess メソッドは引数の数が違う物も用意されています。

こちらも詳しくはドキュメントをご覧ください。

このプログラムでは引数三つのこの pxcmStatus AcquireAccess(Access access, PixelFormat format, ImageData data) メソッドを利用しました。

これで 32bit RGB データ取得完了

そして処理が正常にできたか判定

BufferedImage に変換準備

1ピクセルあたり4バイト、cData.pitches[0] に1ラインあたりのバイト数が格納されているので4で割って WIDTH 値を算出

データコンバート用 int[] を生成

int cBuff[] = new int[cData.pitches[0] / 4 * HEIGHT];

32bit RGB データを int[] に変換

BufferedImage インスタンス生成

public void setRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize) メソッドで BufferedImage にデータをセット

BufferedImage のままでは ImageView にセットできないので public static WritableImage toFXImage(BufferedImage bimg, WritableImage wimg) メソッドを使う

 image = SwingFXUtils.toFXImage(bImage, null);

このメソッドは Swing/AWTとJavaFXのフォーマットの間でデータ型を変換するユーティリティクラスである SwingFXUtils の二つのうちの一つである。

もう一つは、public static BufferedImage fromFXImage(Image img, BufferedImage bimg) メソッドで、

指定されたJavaFX Imageオブジェクトのスナップショットを取得し、そのピクセルのコピーをBufferedImageオブジェクトに格納し、必要に応じて新しいオブジェクトを作成します。

ただし、Image.getPixelReader()メソッドの条件に従って読み取ることができるJavaFX Imageのみを変換します。(不可なら null を返す)

BufferedImage を扱う上で SwingFXUtils クラスのこの二つのメソッドを覚えておきましょう。

これで Image を返してバックグランドタスクは終了となるのですが、AcquireFrame(true) で取得したフレームを解放するの忘れてはいけません。

解放しないと次のフレームが取得できないからです。

pxcmStatus = sample.color.ReleaseAccess(cData);

Service よるバックグランドタスクが成功したら ImageView に ImageView に Image をセットして Service を再び開始します。

streamService.setOnSucceeded(wse -> {
    if (streamService.getValue() != null) {
        imageView.setImage(image);
        streamService.restart();
    }
});

STOP ボタンによる停止処理では

if (streamService.isRunning()) {
    streamService.cancel();
}

senseManager.Close();

cancel() メソッドにてバックグランドタスクを取り消します。

そして、PXCMSenseManager senseManager を Close() メソッドを使って解放します。

メソッド名の先頭が大文字なのに注意してください。

これで Intel RealSence SDK を使って WebCam によるストリーミング処理はできるようになりました。

思ったより簡単ですね。

これで終わりだとすると JavaFX 成分が少ないようなので超小ネタを・・・(^_^;

 

START ボタンと STOP ボタンの活性化状態を自動的にするには

プログラムが起動して STOP ボタンは非活性化状態、 START ボタンは活性化状態

そして START ボタンが押されると STOP ボタンが活性化状態に、 START ボタンは非活性化状態にしたい。

これって void bind(ObservableValue<? extends T> observable) メソッドを使えば簡単に実現できます。

startButton.disableProperty().bind(streamService.runningProperty());
stopButton.disableProperty().bind(streamService.runningProperty().not());

START ボタンは、Service の runningProperty() と一方向バインディングを設定してしまえばいいのです。

STOP ボタンは START ボタンと相反する動作にすればいいだけなので runningProperty() に not() メソッドをつけて否定計算させてしまえばいいだけです。

 

プログラム起動時にフェードインアニメーションをするには

JavaFX の FX は映画などの特殊撮影、トリック撮影効果、特殊効果などの英語の略称から付けられたらしいです。

なのでなるだけ少しでも FX 要素を含ませようと日々努力しています。(ヲヒ!

比較的簡単にできるのがプログラムの起動、終了時のアニメーションです。

起動時のアニメーション処理(フェードイン)をみてみます。

// オープニングアニメーション
DoubleProperty openOpacityProperty = new SimpleDoubleProperty(0.0);
stage.opacityProperty().bind(openOpacityProperty);
Timeline openTimeline = new Timeline(
        new KeyFrame(
                new Duration(100),
                new KeyValue(openOpacityProperty, 0.0)
        ), new KeyFrame(
                new Duration(2_500),
                new KeyValue(openOpacityProperty, 1.0)
        ));
openTimeline.setCycleCount(1);
openTimeline.play();

アニメーションを Timeline を使っておこないます。

Timeline は、API ドキュメントに次のように記載されています。

Timelineを使用すると、すべてのJavaFXプロパティなど、あらゆるWritableValueの自由形式アニメーションを定義できます。
 
Timelineは、1つ以上のKeyFrameで定義し、個々のKeyFrameをKeyFrame.timeで指定した順序で順番に処理するために使用します。

アニメーション化されるプロパティは、KeyFrame.valuesでキー値として定義し、Timelineの初期位置(Timelineの方向によって異なる)を基準にしてKeyFrameの指定時間にターゲット・キー値に(またはターゲット・キー値から)補間されます。

つまり、キーフレームと時間と値でアニメーションを制御しているだけです。

Stage stage の opacityProperty() を 初期値 0.0 に設定された DoubleProperty openOpacityProperty にバインドしておきます。

Timeline で new Duration(100) によって100 ミリ秒間かけて opacityProperty() の値を KeyValue(openOpacityProperty, 0.0) で設定された 0.0 にアニメーションしょりします。(この場合 0.0 から 0.0 変化無しです)

次のフレームでは new Duration(2_500) で 2500 ミリ秒かけて opacityProperty() の値を new KeyValue(openOpacityProperty, 1.0) で設定された 1.0 までアニメーション処理しています。

起動時処理なので複数回の実行は必要なく一度だけでいいので setCycleCount(1); を指定します。

あとは play() メソッドでアプリケーションの開始時に実行されるだけです。(start(Stage stage) メソッド内に記述)

プログラム終了の時は closeTimeline.setOnFinished(eh); を利用してハンドラにアニメーション終了時にプログラム終了処理を渡してあげればいいだけです。

以上、超小ネタでした。

特殊効果ではないですが JavaFX は CSS によってプログラムの見栄えを変えることができます。

デザインセンスのある方は強力な武器となるでしょう。

あいにく私はデザインセンスは無いので心優しい人が提供している CSS を使わせていただいてます。

このプログラムでは Pixel Duke さんの JMetro を使っています。

今時の Windows OS によく似合います。

さて、カメラ画像を映すだけのことはできたのですが顔検出や、顔認識、顔の傾き具合、心拍数、表情などのデータも取得して利用したくなりますよね。

で、先ほどのプログラムをベースにこの付加価値を実装できるようなのでやってみました。

顔のパーツ情報(LandMark データ)は以前からのバグが放置されているので取得できませんでした。

最新バージョンの R5 (SDK version 7.0) ではランドマークに加えて FacialExpression データも取れなくなりました。

なので R4 (SDK version 6.0) を使用しています。

本当は音声認識もできるはずなのですがハンドラクラスの OnRecognition(PXCMSpeechRecognition.RecognitionData data) メソッドが悲しいことに動きません。

OnAlert(PXCMSpeechRecognition.AlertData data) は音声の開始や終了、音量が低いとかちゃんと返してくれただけに残念です。

これは R5 で直っているか確認していません。(たぶんこれも放置でしょう。)

音声認識ができればリッチな UI の JavaFX を音声で操る未来的なプログラムも容易に可能になるかなって思っていただけに残念です。

とりあえずできる範囲でトライしてできあがったのが次のようなプログラムです。

プログラムは GitHub にアップロードしてあります。

https://github.com/Yucchi-1995/IntelRealSenseFacialExpression

私、残念ながらもの凄くシャイでコミュ障なので作り物の顔でプログラムを動かしてます。

このプログラムですがフェイストラッキングモードを Depth モードを使わないように設定すると一般的な WebCam でも動きます。

faceConfig.SetTrackingMode(PXCMFaceConfiguration.TrackingModeType.FACE_MODE_COLOR_PLUS_DEPTH); を

faceConfig.SetTrackingMode(PXCMFaceConfiguration.TrackingModeType.FACE_MODE_COLOR); に変更します。

ただし、全ての機能が正しく動くわけではありません。

ちなみに顔認識はでたらめになります。

プログラムの動作の説明は長くなるのでしません。

コード内のコメントを参考に推理(ヲヒ! してください。

あと、Intel RealSense SDK の面白いドキュメントを参考にしてください。

まだまだ JavaFX 慣れていないので雑いことをいろいろやっていると思います。

バックグランドタスクで Image 返して バックグランドタスク内で Platform.runLater() を使っていろいろ更新かけてます。

Task<Void> として密な関係にしたほうがよかったのかなとか思ったりもします。

なにかおかしなところがあったらご指摘いただけるとうれしいです。

最後にもう一つ超小ネタを!

JavaFX で Dialog が標準で使えるようになって便利に使っているとほんの些細なことが気になります。

TextInputDialog なんですが TextField にユーザーからの入力をもらう時に使いますよね。

なのに TextField が空の状態でも OK ボタンが押せるようにデフォルトではなっています。

このプログラムでは TextField が空でなく、顔検出されていれば押せるようにすると変更しています。

とりあえず、ネタとして TextField が空では OK ボタンを押せないようにしてみましょう。

TextInputDialog dialog = new TextInputDialog(“”);
dialog.getDialogPane().lookupButton(ButtonType.OK).disableProperty().bind(dialog.getEditor().textProperty().isEmpty());

簡単ですね!

OK ボタンの disableProperty() を textProperty().isEmpty() で返される値とバインドすればいいだけです。

これ簡単に使えるのに意外と使われてないんですよね。

ということでいろいろ楽しませてくれた Intel さんに Java が得意なサンタクロースがたくさんのプレゼントを届けることを祈って終わりにします。

Hatena タグ: ,

よく見かけるネタ IntegerCache 問題

Java

昔からよくある Java パズルでブログの更新を久しぶりにしておきます。

次のコードの結果はどうなるでしょう?

true
false
true
false

となります。

間違えてませんよね!

今さらですが、これらは Integer.valueOf() メソッドが使われて -128 から 127 までは IntegerCache クラスであらかじめ用意されているものが使われる。

小さな親切、大きなお世話というやつです!

でも、用意してある物は使わなくては損ですよね。

じゃあ、どうしてもっといっぱい作って用意しておいてくれないの?って言うあなたに

JVM の実行時引数による制御も可能です。

-Djava.lang.Integer.IntegerCache.high=<size>

それとも、

-XX:AutoBoxCacheMax=<size>

で OK です。

-Djava.lang.Integer.IntegerCache.high=128 と設定して実行すると先ほどのプログラムの結果は

true
true
true
false

となります。

ちなみに IntegerCache の最小値の設定方法は私は知りません。(;゜ロ゜)

以上、よくあるネタ終了です。

Hatena タグ:

 

 

 

 

 

 


Windows 10 アップグレード その後

Windows

Windows 10 にアップグレードして暫く経ちました。

公私ともに忙しい毎日が続いておりそんなに使ってないのですが経過報告です。

まず、アップグレードによって問題が発生したことを書いておきます。

1. Microsoft マウス キーボードセンターが立ち上がらなくなりました。

これはコントロールパネルよりアンインストールし、Windows 8.1 用のものを再びインストールすることにより解決しました。

2. あるプログラムを起動しようとしたところ「MSVCR110.dllから見つかりませんでした」というエラーがでるようになりました。

コントロールパネルより、Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージである

Microsoft Visual C++ 2012 Redisributable (x86),  Microsoft Visual C++ 2012 Redisributable (x64) を修復することによって解決しました。

3. ローカルネットワーク内の 一部の PC にログオンできなくなりました。

コントロールパネルから資格情報マネージャーを開き、Windows 資格情報の管理でログオンできない PC のユーザー名が適切でなかったので編集し直して解決しました。

今のところ不具合が発生したのはこの3件です。

Windows 8 から 8.1、8.1 update と何も不具合がでなかったので Windows 10 もアップグレードを選択したけどクリーンインストールしたほうが良かったかもしれない。

2番目と3番目の不具合は他にも何か悪さをしているかもと少し不安になります。

でも、クリーンインストールだとプログラムを入れ直して設定やらデータの移行なんかが非常に面倒なんですよね。(ヲヒ

そうそう、この前のエントリーで「Webとwindowsを検索」が邪魔で消したいと言っていたのですが方法が見つかりました。

タスクバーを右クリックで[ 検索 ] → [ 検索アイコンを表示 ] にすれば虫眼鏡のアイコンになります。

1

2

アイコンも表示させたくない場合は、[ 表示しない ] を選択すれば良いです。

ちなみに GodMode も健在ですね。

こちらはアップグレードじゃないのでアップグレードだとどうなるかは解りません。

3

Windows 10 今までとは変わったところが多くあるので久しぶりに使い方の本でも買っておこうかな?

Windows 95 が世に出て、パソコンブームのころ「サルでもわかる・・・」と言った感じの非常に解りやすい本があったけど、あれって買うの恥ずかしかったよね。

今だったら Amazon で簡単に買えるけど、まだシリーズ続いてるんだろうか?

今度本屋さんに言ったときに適当な本を買ってこよう。

Hatena タグ:

Windows 10 アップグレード 失敗ばかり

Windows

Windows 10 を予約していたんだけどいっこうにアップグレードの準備ができない。

調べてみたら Windows Update の履歴にエラーコード 80240020 で失敗していた。

これはどういうことだと思いながらググってみたら答えがあった。

C:\Windows\SoftwareDistribution\Download にあるディレクトリおよびファイルを全部削除し、

管理者権限でコマンドプロンプトを起動して下記コマンドを実行する。

wuauclt.exe /updatenow

そして、Windows Update を実行する。

すると Windows 10 のアップグレードをダウンロードして成功するとアップグレードの準備が調ったので今すぐか、スケジュールをくんでアップグレードするかってウィンドウがでる。

ただ、これがすんなりいかずに何回か繰り返すことがあった。

2,3回繰り返してやっとアップグレードの準備ができた。

ただ、一台だけこのエラーを回避しても今度は、エラーC1900208 が出てどうにもならなかった。

しかたないので下記サイトより ISO ファイルをダウンロードしてアップグレードした。

https://www.microsoft.com/ja-jp/software-download/windows10ISO

今までの苦労はなんだったのか?

4

ただ、予約から Windows Update によるアップグレードと ISO ファイルからのアップデートによる違いがあるかどうかは解りません。

で、使い勝ってはどうかというと Windows 8.1 とあまり変わらないようですが変わっています。

新しいブラウザ Edge は慣れてないので今のところ使いづらいです。(^_^;

そうそう、システム修復ディスクの作成が復活してました。

バックアップの機能も充実してます。

微妙に右下のデスクトップを表示させるのが使いづらくなってます。

あまり Windows 8.1 Update と変わらないような気もしますが仮想デスクトップはうれしいですね。

Solaris で便利だと思っていて、Windows もこんな機能があるといいのにって思っていた願いがやっとかないました。

今まで使っていたアプリケーションはほとんど動きました。

駄目だったのは驚きの Microsoft マウス キーボードセンターでした。(ヲヒ

これはコントロールパネルよりアンインストールし、Windows 8.1 用のものを再びインストールすることにより解決しました。

Windows 10 へのアップグレードによる問題はノート PC VAIO Prp 13 のタッチパッドと Bluetooth マウスだけ残ってます。

これ、Windows 8.1 のドライバとプログラムでちゃんと動くようになると思うんだけど・・・もう、疲れたから先送りにする。(^_^;

Windows 10 だからこんなことが可能となった!というような驚きの新機能はないようだけどスタートメニューの復活は多くの人が喜ぶんだろうなぁ。

6

スタートボタンの横にある「Wfbとwindowsを検索」ってのがもの凄く邪魔なので消えてもらいたい。

これも近いうちに調べてなんとかしよう。

Hatena タグ:

ASRock N3700-ITX 買っちゃいました。

Computer

Blog の更新さぼってます。

いつものことなのでお許しください。(^_^;

そんなこんなで ASRock N3700-ITX を買っちゃいました。(いきなり、すみません)

何故かというと・・・

パソコンって意外と電気を食うことがばれてしまったからです。

特に私の場合エンコード処理を速くすませたい。

同時に他の作業もしたいという理由でマルチコア CPU のパソコンを使っています。

もう、エンコード作業をすることはほとんど無くなったのでただの電気の大食いパソコンを無駄に使っているのが現状です。

しかし、低消費電力のパソコンを組むとしてもお金が要ります。

それに他にもパソコンは所有しているのでわざわざ新規に導入する必要もないのですが、それを置くスペースを考えてみると上手くいきません。

そこで省エネルギー、省スペースの Mini-ITX パソコンを組むことにしました。

なんて言い訳をして現在の事実上 ATOM の性能を試してみたいと思い購入しました。

初代 ATOM を購入して動くことは動くけど本当に軽い処理だけのもので泣いた悲しい記憶しか残っていないのでそれを払拭できることを期待します。

購入した ASRock N3700-ITX についてザックリ紹介すると Mini-ITX 規格のマザーボードです。

省電力向けSoC Bay Trail-Dの後継として Braswell と呼ばれています。

製造プロセスが22nmから14nmにが微細化され、ほぼ同等のCPU性能を維持したままTDPは10Wから6Wへと低下しました。

ストレージコントローラはSATA2.0(3Gbps)×2からSATA3.0(6Gbps)×2 となりました。

グラフィックスチップもEU数16基にアップグレードされ、ワットパフォーマンス、拡張性とも大幅に強化されている。

CPU は インテルPentiumプロセッサー N3700、4コア4スレッド、動作周波数:1.6GHz(バースト周波数:2.4GHz)、L2キャッシュ 2MB、TDP:6W となっています。

メモリは、DDR3/DDR3L SO-DIMM × 2 デュアルチャネル このマザーは 16GB (8GB X 2) まで載せられるようになっています。電圧も普通のタイプも使えるようです。

グラフィック機能は第8世代インテルHDグラフィックスで出力は DVI-D × 1(デジタル)HDMI × 1(デジタル)DisplayPort 1.2 × 1(デジタル)となっています。

DVI-D × 1(デジタル)はデュアルリンクではなくシングルなので 2K 出力はできないようです。

HDMI、DisplayPortは4K解像度出力(3840×2160@30Hz)に対応しているらしいです。トリプルモニターに対応と凄い環境を提供してくれます。

ストレージは SATA 6Gbps × 2(CPU), SATA 6Gbps × 2(ASMedia ASM1061)と 2 ポート追加され、合計 4 ポートもあります。

拡張スロットは、PCI Express 2.0(x1)×1、ハーフサイズ mini-PCI Express × 1 があります。後者は無線LANやBluetoothカードを使用するのに使われるようです。

オーディオは 7.1ch対応のRealtek ALC892 を搭載し、ELNA製オーディオコンデンサを使い高音質なサウンドを提供するという凝ったことをしています。

LAN は Realtek RTL8111GR なのでこだわりのある人や、これで不具合のでる人は PCI Express 2.0(x1) に intel の NIC を挿すことになるでしょう。

あとは USB3.0 X 4、USB2.0 X 2、音声入出力 X 5、光オーディオ端子 X 1、PS/2 X 1 その他・・・といったところです。

PS/2 が1つというのは中途半端ですが無いよりは良いのかな?

総合的に見て一通りの機能はそろえていて、省電力であるという印象です。

では、実際に組んで動かして確認することにしました。

今回、購入した物は次のようになります。

M/B :N3700-ITX
メモリ:Transcend TS1600KWSH-16GK
電源 :玄人志向 ACアダプタ 電源 120W KRPW-AC120W
ケース:LIANLI PC-Q33B
SSD :crucial CT250MX200SSD1

DSC00251

ASRock N3700-ITX には次のものが同梱されてます。

日本語のマニュアルがあるのはうれしいですね。

DSC00252

ここで面白いのはケースです。

こんなふうに作業しやすいように開くことができます。

DSC00253

ただし、このケースのファンは少し五月蠅いので次のものと換装しました。

DSC00254

これ、超静かで GOOD! です。

玄人志向 ACアダプタ 電源 120W KRPW-AC120W は次のようなものが同梱されています。

DSC00255

至れり尽くせりです。

基板の半田付けがちょっと荒いような気もしますが普通に動いてくれました。

この手の商品は随分前に試したことがありますが1年半くらいで壊れてしまったので壊れたら普通の電源に交換する予定です。

組み立てるとこんな感じになります。

DSC00256 

DSC00257

それぞれの部品と転がっていた SSD を一台付け足して組むとこうなりました。

DSC00258

DSC00259

この画像では SSD 2台ですが、現在はストレージケージには SSD 2台と HDD(2.5) 2台を積んでいます。

ケースには 2.5 インチならあと3台積むことが可能なので SATA カードを挿して大容量ファイルサーバーとすることも可能です。

DSC00260

コンパクトに一通りの機能を持ち合わせたパソコンがあっという間に組み上がりました。

試しに Windows 8.1 をいれて動かしてみました。

初代 ATOM のようなもっさり感はなく、ナチュラルに動いてくれます。

ちなみに、Transcendの1.35V(低電圧) – 1.5V 両対応メモリーは低電圧で認識され動いてます。

これだけ普通に動いてしまうとベンチマークをかけてみたくなります。

電気をよく食うとばれてしまって顰蹙をかっているメイン PC と今回組んだ N3700-ITX と初代 ATOM330 で性能を比べてみましょう。

それぞれのパソコンの環境は次のようになっています。

メイン PC

X9DAi_info

X9DAi_mem

N3700-ITX

n3700_info

ATOM330

ATOM330_info

それでは、CINEBENCH R15 とタイムリープベンチマークを走らせてみます。

タイムリープベンチマークの設定は次のようにしました。

set

メイン PC

cbr15_xeon

xeon

良好な結果ですね!

消費電力は、CINEBENCH R15 CPU マルチ実行時、約 445w、シングル実行時、約 185w、OpenGL 実行時、約 250w となります。

N3700-ITX

n3700_cb

n3700

意外と良好な結果がでてます。

もっと低い結果だろうと思っていただけにうれしい誤算です。

消費電力は、CINEBENCH R15 CPU マルチ実行時、約 23w、シングル実行時、約 19w、OpenGL 実行時、約 26w となります。

電気食わないですね~ (^_^)

ATOM330

atom330_cb15

atom_330

ATOM330 のベンチマークの結果が悲しいですね。

デュアルコア ハイパースレッディングで疑似クアッドコアとしても所詮こんなものです。

消費電力は、CINEBENCH R15 CPU マルチ実行時、約 37w、シングル実行時、約 32w、OpenGL 実行不可。

しかし、ATOM330 は何故か人気があって売れていました。

パソコンショップの店員さんもお勧めはできないといっていたのにね。

以上のベンチマークの結果から N3700-ITX の健闘がうかがえます。4コア4スレッドの実力の世界ですね。

メイン PC は、さすが XEON 二つといった当然の結果です。

さて、ASRock N3700-ITX は、UEFI で Intel Virtualization Technology を有効にして使うことができます。

これだけ普通に動くとこれも試したくなりますよね。

VMware をインストールしてゲスト OS として Windows 7 をいれて先ほどのベンチマークを走らせてみました。

7_2

まず、 Windows エクスペリエンスは次のような結果となりました。

7_1

7_3

7_4

2コア、8GB を分け与えた仮想マシンとしてはけっこう良い結果となってます。

ベンチマークも走らせたし、それでは実際にエンコード作業の時間を調べてみることにします。

次のような設定で作業してみました。

入力ファイルは、4K 動画です。

enc_1

出力設定は次のようにしました。

enc_2

メイン PC

x_enc

エンコード実行時の消費電力は、約 350w でした。

消費電力量は、約 16.5wh となります。

N3700-ITX

n3700_enc

エンコード実行時の消費電力は、約 26w でした。

処理時間はメイン PC の 4倍以上かかっていますが消費電力は、1 / 13 です。

消費電力量は、約 5.6wh となります。

ATOM330

atom330_enc

エンコード実行時の消費電力は、約 37w でした。

消費電力量は、約 25.6wh となります。

ATOM330 超遅い!N3700-ITX の 3倍以上の時間がかかった上に消費電力も 1.4倍なんて。

これがテクノロジーの進化というものなのか。

皮肉なことに初代省エネ PC の ATOM330 が一番消費電力量が多くなりエコでないとは・・・

エンコード作業もファンレス静音(ほぼ無音)PC で寝ている間にすませるのがエコな時代になったようだ。

私のようなせっかちな性格だと一気に速く終わらせたいという気持ちもあるけど消費電力量が3倍近くも違ってくると考え物ですね。

以上の結果から当初は、Linux をいれてファイルサーバー、そしてウェブ、メール、軽作業用と考えていたけど予定変更しようかな。

いずれにしても良い買い物になったと思う。

    

Hatena タグ:

« 古い記事