2018年10月15日

VRMのテスト

Twitterを見ていたらOpen Asset Import Library[1]でVRM読込対応をされた方がいらっしゃった[2]ので、UE4のためみたいですがC++用として使わせていただきました。Assimpっていつの間にかglTFにも対応していたんですね。

AssimpでVRM読込みで詰まったのは、テクスチャ情報の取り出しでした。VRMは基本的に1つのファイルにまとまっているので、画像情報もVRMの中に埋め込まれています。Assimpでテクスチャ情報を見ると、mWidthがバイト数?でmHeightに0が入っていて、画像のサイズが取得できませんでした。説明を見るとpngやjpgなど圧縮されたデータの場合はこういう取り扱いになるみたいです。対応として、stb[3]を使うと展開やサイズの取得ができました[4]。
  unsigned char *image_data = nullptr;

  if (texture->mHeight == 0)
  {
    image_data = stbi_load_from_memory(
      reinterpret_cast<unsigned char*>(texture->pcData),
      texture->mWidth, &width, &height, &components_per_pixel, 0);
  }
実行結果

vrm_test_001.png

VRoid[5]のデフォルト設定を表示してみました。白髪なのはマテリアルデータなどを取得・反映していないからみたいです。

[1] http://www.assimp.org/
[2] https://github.com/ruyo/assimp
[3] https://github.com/nothings/stb
[4] https://github.com/assimp/assimp/issues/408
[5] https://vroid.pixiv.net/
web拍手 by FC2
posted by シンドラー at 01:44 | Comment(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2018年09月30日

Movidiusのテスト

油断すると月一更新が止まりそうになりますね。今回は購入してそのままにしていたMovidiusのテストです。IntelR Movidius™ Neural Compute Stick[1]は、Deep Learningの計算を加速するためのUSBスティックです。Raspberry Pi 3に刺すとSSD(Single Shot Multibox Detector)などがそれなりの速度で動くようになるみたいです。

今回はRaspberry Pi 3+Raspberry Pi用カメラの環境でインストール・実行までテストしてみました。変に色々入っていると失敗するので、OSをクリーンインストールしてから試した方が早いと思います。OSはRaspbianを入れました。

基本的には[2]のサイトを参考にさせていただきました。違う点としては、何となくNCSDK 2.05の方でmakeしました。githubもありますが、なぜか一時停止しているみたいですね[3]。

make examplesで例題もインストールされますが、ncappzoo[4]にもたくさんサンプルはあります。今回2.05をインストールしましたので、githubからcloneするときはバージョンに注意する必要があります。
  git clone -b ncsdk2 https://github.com/movidius/ncappzoo.git
後は[2]のサイトで参考にしている[5]のコードは、version 1.12用のようでしたので、2.05用に書き換えました。書き換え方法は元のサンプルと比較するのが簡単ですが、詳しい説明が[6]にあります。一番の違いはFIFO queuesというものが増えた?点みたいです。

変更点
  mvnc.EnumerateDevices() ⇒ mvnc.enumerate_devices()
  device.OpenDevice() ⇒ device.open()

  graphfile ⇒ graphFileBuff
  graph = device.AllocateGraph(graphfile) ⇒ graph = mvnc.Graph('graph')
    ⇒ fifoIn, fifoOut = graph.allocate_with_fifos(device, graphFileBuff)
  graph.LoadTensor(img.astype(numpy.float16), 'user object')
    ⇒ graph.queue_inference_with_fifo_elem(fifoIn, fifoOut, img, 'user object')
  output, userobj = graph.GetResult() ⇒ output, userobj = fifoOut.read_elem()

  graph.DeallocateGraph()
  device.CloseDevice()
    ↓
  fifoIn.destroy()
  fifoOut.destroy()
  graph.destroy()
  device.close()
使用した場合と使用しない場合とでは全然違いますね。OpenVINO[7]というものもあるみたいなので、こちらも少し試してみたいですね。

[1] https://software.intel.com/en-us/neural-compute-stick
[2] https://karaage.hatenadiary.jp/entry/2018/05/23/073000
[3] https://github.com/movidius/ncsdk
[4] https://github.com/movidius/ncappzoo
[5] https://gist.github.com/PonDad/bc185bdf81735dfd018bda6ce0b37fea
[6] https://movidius.github.io/ncsdk/ncapi/python_api_migration.html
[7] https://software.intel.com/en-us/openvino-toolkit

web拍手 by FC2
posted by シンドラー at 23:38 | Comment(0) | Machine Learning | このブログの読者になる | 更新情報をチェックする

2018年08月21日

Schemeの勉強 その2

プログラミング言語SCHEME本はまだちょっと難しい気がしたので、[1]のRacket本を購入してみました。chapter2までで数あてゲームの実装です。

#lang racket

(define lower 1)
(define upper 100)

(define (guess)
(quotient (+ lower upper) 2))

(define (smaller)
(set! upper (max lower (sub1 (guess))))
(guess))

(define (bigger)
(set! lower (min upper (add1 (guess))))
(guess))

(define (start n m)
(set! lower (min n m))
(set! upper (max n m))
(guess))
基本defineとset!を使って定義しています。add1, sub1が1足す、1引くで、quotientが割り算で現在の最小値と最大値を足して2で割っているようです。

実行結果

自分が考えた数値より小さければsmaller関数、大きければbigger関数を呼び出します。例えば、1〜100の間で56を思い浮かべた場合は下記のようになります。

> (start 1 100)
50
> (bigger)
75
> (smaller)
62
> (smaller)
56

[1] Realm of Racket

web拍手 by FC2
posted by シンドラー at 01:57 | Comment(0) | 関数プログラミング | このブログの読者になる | 更新情報をチェックする

2018年08月15日

Schemeの勉強

夏休みということでプログラミング言語Schemeを勉強してみることにしました[1]。Schemeは関数プログラミング言語のひとつで、多くの対話型プログラミング環境が提供されています。今回はDr.Racket[2]を使って動作確認などをすることにしました。

以下は[1]の第2章の内容のメモです。

define: 変数のバインド。トップレベル定義を行えばどこからでも参照可能
lambda: プロシージャの生成
load: ロード

単純式: 文字列、数値、シンボル、リストといった定数データ・オブジェクト
算術演算、前置記法
  (+ 1/2 1/2)
(- 1.5 1/2) ⇒ 1
(* 3 1/2) ⇒ 1.5
(/ 1.5 3/4) ⇒ 2.0
(* 2 (* 2 (* 2 (* 2 2)))) ⇒ 32
(/ (* 6/7 7/2) (- 4.5 1.5)) ⇒ 1.0
リスト
  (1 2 3 4 5)
("this" "is" "a" "list")
carとcdr: リストを切り離す2つの基本的なプロシージャ
car: リストの最初の要素を返す
cdr: リストの残りの部分を返す
それぞれの引数は空でないリスト
  (car '(a b c)) ⇒ a
(cdr '(a b c)) ⇒ (b c)
(cdr '(a)) ⇒ ()
(car (cdr '(a b c))) ⇒ b
(cdr (cdr '(a b c))) ⇒ (c)
(car '((a b) (c d))) ⇒ (a b)
(cdr '((a b) (c d))) ⇒ ((c d))
quote: プロシージャではないことを明示。シングルクォート(')でも指定可能
  '(/ (* 2 -1) 3)
cons: リストを生成する
2つの引数を与える。
  (cons 'a '()) ⇒ (a)
(cons 'a '(b c)) ⇒ (a b c)
(cons 'a (cons 'b (cons 'c '()))) ⇒ (a b c)
(cons '(a b) '(c d)) ⇒ ((a b) c d)
ちゃんとしたリストでなくてもcons可能。その際はドット対記法を使う
  (cons 'a 'b) ⇒ (a . b)
(cdr '(a . b)) ⇒ b
(const 'a '(b . c)) ⇒ (a b . c)
'(a . (b . (c . ()))) ⇒ (a b c)
list: 常に行儀のよいリストを生成する
  (list 'a 'b 'c) ⇒ (a b c)
(list 'a) ⇒ (a)
(list) ⇒ ()
let: letの本体として参照される式exprの並びに変数varと値valを対にしたリストを含めたもの
  (let ((x 2))
(+ x 3)) ⇒ 5
(let ((y 3))
(+ 2 y)) ⇒ 5
(let ((x 2) (y 3))
(+ x y)) ⇒ 5
バインド:letによって変数に値を保持すること
共通化することができる複数の部分式をまとめて扱いたい場合にも使用される
  (+ (* 4 4) (* 4 4)) ⇒ 32
(let ((a (* 4 4)))
(+ a a)) ⇒ 32
(let ((list1 '(a b c)) (list2 '(d e f)))
(cons (cons (car list1)
(car list2))
(cons (car (cdr list1))
(car (cdr list2))))) ⇒ ((a . d) b . e)
lambda: 引数として渡すことができるプロシージャを生成
もっとも一般的な操作例:
  ((lambda (x) (+ x x)) (* 3 4)) ⇒ 24
プロシージャを値として変数にバインド可能:
  (let ((double (lambda (x) (+ x x))))
(list (double (* 3 4))
(double (/ 99 11))
(double (- 2 7)))) ⇒ (24 18 -10)
defineを使ったトップレベル定義を行えばどこからでも参照可能
  (define double-any
(lambda (f x)
(f x x)))
トップレベル定義はletやlambdaで隠蔽される
  (define xyz '(x y z))
(let ((xyz '(z y x)))
xyz) ⇒ (z y x)
carとcdrを組み合わせたcadrやcdrとcdrを組み合わせたcddrといった省略形が用意されている。defineで定義すると:
  (define cadr
(lambda (x)
(car (cdr x))))
(define cddr
(lambda (x)
(cdr (cdr x))))
if: 条件式(if test consequent alternative)
帰結部consequentは条件testが真であった場合に評価される式
代替部alternativeは条件testが儀であった場合に評価される式
  (define abs
(lambda (n)
(if (< n 0)
(- 0 n)
n)))
述語: 引数に関する質問に対して#tか#fを返す
大半の述語は疑問符(?)で終わっている
  (null? '()) ⇒ #t
(eqv? #f #f) ⇒ #t
オブジェクトの型を調べる型述語
  pair?, symbol?, number?, string?
errorプロシージャ
  (define reciprocal
(lambda (n)
(if (and (number? n) (not (= n 0)))
(/ 1 n)
(error 'reciprocal "improper argument ~s" n))))
cond: 複数の条件と代替式を定義可能
  (define abs
(lambda (n)
(cond
((= n 0) 0)
((< n 0) (- 0 n))
(else n))))
簡単な再帰
  (define length
(lambda (ls)
(if (null? ls)
0
(+ (length (cdr ls)) 1))))
map: 「最初の引数をプロシージャとして扱い、それに対して2番目の引数であるリストの
       各要素を引き渡して適用し、出力のリストにマップしていくプロシージャ」
  (map abs '(1 -2 3 -4 5 -6)) ⇒ (1 2 3 4 5 6)
set!: 代入
カウンタ作成
  (define make-counter
(lambda ()
(let ((next 0))
(lambda ()
(let ((v next))
(set! next (+ next 1))
v)))))
スタック作成
  (define make-stack
(lambda ()
(let ((ls '()))
(lambda (msg . args)
(cond
((eqv? msg 'empty?) (null? ls))
((eqv? msg 'push!)
(set! ls (cons (car args) ls)))
((eqv? msg 'top) (car ls))
((eqv? msg 'pop!)
(set! ls (cdr ls)))
((eqv? msg 'print!) ls)
(else "oops"))))))
参考文献
[1] ケント ディヴィグ著、村上 雅章訳、”プログラミング言語SCHEME”、株式会社ピアソン・エデュケーション、2000
[2] http://racket-lang.org/




web拍手 by FC2
posted by シンドラー at 17:19 | Comment(0) | 関数プログラミング | このブログの読者になる | 更新情報をチェックする

2018年07月31日

pbrtのテスト

いつの間にか7月も終わりですね。それにしても毎日暑いです。今月まだ更新してなかったので無理やり更新します。今回は物理ベースレンダラの一つであるPBRTの動作確認です。

ビルド・インストール方法は、GitHubのページに書いてある通りです。依存関係のライブラリのダウンロードなどもまとめて行いたいので、git cloneで取ってきます。

1. Gitのインストール
2. Git Bashの起動
3. インストールしたいディレクトリに移動
4. pbrt-v3のダウンロード

$ git clone --recursive https://github.com/mmp/pbrt-v3/
$ cd pbrt-v3
$ git submodule update --init --recursive

5. サンプルシーンのダウンロード(8GB程度あるので時間がかかります)
http://pbrt.org/scenes-v3.html

$ cd ..
$ git clone git://git.pbrt.org/pbrt-v3-senes

6. cmake-guiの起動

Configure -> Visual Studio 15 2017 Win64

CMAKE_INSTALL_PREFIX: インストール先に変更
他デフォルト

Configure -> Generate -> Open Project

7. ビルド

ALL_BUILDのビルド
INSTALLをスタートアッププロジェクトに設定してビルド→インストール

以上でCMAKE_INSTALL_PREFIXに指定したディレクトリにpbrtがインストールされます。

実行結果

とりあえずサンプルシーンのpbrt-v3-scenes/simple/teapot-metal.pbrtをレンダリングしてみました。

$ pbrt.exe ../pbrt-v3-scenes/simple/teapot-metal.pbrt

大体10分ぐらいかかりました。

teapot-material.png

次回はobjをpbrtに変換するobj2pbrt.exe辺りを試してみたいと思います。LayerLab[2]とかMitsuba physically based renderer[3]とか色々関連プロジェクトもあるようですので、試すかもしれません。

[1] https://github.com/mmp/pbrt-v3
[2] https://github.com/wjakob/layerlab
[3] http://www.mitsuba-renderer.org/

web拍手 by FC2
posted by シンドラー at 22:26 | Comment(0) | Rendering | このブログの読者になる | 更新情報をチェックする

2018年06月11日

glTFのテスト その2

とりあえず読込みできるようになったので、前から作っているGUIに組み込んでみました。
テクスチャがおかしかった問題ですが、モデルによっては頂点カラーのみで、テクスチャ座標を持たないメッシュがあり、こちらで使っている中間データは頂点数=テクスチャ座標数で考えていたので、テクスチャ座標を持たないメッシュがあるとインデックスがずれてしまっていたのが原因でした。

実行結果

いくつかsketchfabのデータを表示してみましたが、大体は問題なさそうです。今回は[1]のデータを表示させていただきました。

glTF_test_002.png

[1] https://sketchfab.com/models/011dc1e272be4245bfe2f7e72503f6ab#
web拍手 by FC2
posted by シンドラー at 22:19 | Comment(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2018年05月31日

glTFのテスト

いつの間にか5月が終わりましたね。何となくglTF[1]対応をしてみようと思いました。
Khronos Group提唱ですので、OpenGLとの親和性が高そうですね。

今回は[2]のライブラリを使用させていただいて、とりあえずファイルを読み込んで.objに変換してみました。
nodeにmatrixやquaternion等の情報が親子関係で定義されていて、そこにmeshが関連付けられています。
meshにはmaterialやaccessorが関連付けられていて、bufferやimagesから各種データを取り出すことができます。
positionはオブジェクト座標ですので、nodeに記述されている位置姿勢を掛けていく行列操作も必要です。

実行結果

sketchfabというサイトではモデルを全てglTFで保存できるようになっているようで、今回は[3]のモデルをテストとして使用させていただきました。行列掛ける順番間違えたり結構苦労して、まだテクスチャ座標がおかしそうですが、とりあえずMeshLabで表示できたので、おおよその読み込みはできたと思います。

glTF_test_001.png

[1] 次世代の3Dデータフォーマット決定版 glTF 2.0 の概要図を日本語訳してみた
[2] Header only C++ tiny glTF 2.0 library
[3] sketchfab - Oculus Rift CV1
web拍手 by FC2
posted by シンドラー at 22:27 | Comment(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2018年04月30日

SFMLのテスト その4

いつの間にか4月が終わりますね。5x5では狭いので15x15に広げてみました。後はCSVファイルを読み込めるようにしてみました。解き方も色々工夫できそうですが、なかなかアルゴリズム考えるのも難しいですね。

実行結果

参考として[1]の問題を使わせていただきました。簡単な問題しか解けませんね。

sfml_tgui_001.png
CSV読込み

sfml_tgui_002.png
1回目

sfml_tgui_003.png
2回目

[1] https://www.minicgi.net/logic/
web拍手 by FC2
posted by シンドラー at 18:35 | Comment(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2018年04月04日

SFMLのテスト その3

TGUIのテストです。お絵描きロジックを自動で解くプログラムでも作ってみようということで、GUIを作ってみました。数値を入力するためのEditBoxと、塗りつぶす所と除外する所の画像を切り分けたかったので、BitmapButtonを使うことにしました。

TGUIにはgui-builderというソフトウェアが付いていますので、基本的な配置はこれを使って行って、後はテキストを編集すると早いかもしれません。

TGUI_002.png

form.txtなどのテキストファイルに出力すると、プログラムから読み込むことができます。
    gui.loadWidgetsFromFile("form.txt");
後はconnect使ってコールバック関数を実装すれば良いかと思います。Gridというクラスがあったので、これを使えば今回のようなプログラムには有効そうでしたが、今のところ無理やりGUIのポインタ経由で操作しています。

後はExampleのMany different widgetsで使われていますが、Themeを使うと比較的楽に部品の設定ができる気がします。

実行結果

TGUI_003.png

とりあえず各行と各列をチェックして、5の時は全部埋めて、0の時は全部×を付ける処理だけ実装しました。ちゃんと解こうとすると大変そうですが、5x5だとあまりパターンもないので楽かもしれません。



web拍手 by FC2
posted by シンドラー at 00:34 | Comment(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2018年03月31日

SFMLのテスト その2

SFML対応のGUIの一つであるTGUI[1]を試してみました。スライダーやボタン、エディットボックスなど色々使えるみたいです。

CMake使ってソースからコンパイルしてもいいですが、バイナリもダウンロードできます。今回は手軽にバイナリから使いました。サイトにチュートリアルや例題があるので、それを見れば特に問題はないかと思います。

実行結果

例題のScalable login screenです。背景画像はLenna画像に差し替えました。

tgui_test_001.png

いつも使っているTweakBarは、どちらかというとメニュー優先っぽいので、ボタンやエディットボックスを含むGUIを手軽に使いたい場合は良いのではないでしょうか。

[1] TGUI: Texus' Graphical User Interface
web拍手 by FC2
posted by シンドラー at 22:03 | Comment(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする