なるように、なる

徒然なつぶやき、備忘録です。

Flyng Tokyo #21

Kyleさんのワークショップに参加してきました。
特に印象に残ったことをメモに残しておきます。


What is art?
  • 関係性を問い直すこと、問い直す機会を与えるもの
  • コンセプトが一番大事
  • artと他のもの(デザイン、広告など)との違いを意識しておくとよい
    (ただし、"違い"は0/1ではない)
Machine Learning
  • 機械化(自動化)により淘汰され、残るものは人と人との関係性があるもの
  • AIが判断や推定をしたりすることや、AIか人間か見分けがつかなくなっていくことに、驚きとともに不安などの否定的な気持ちを感じる人がいる。
  • AIと人間との関係性について「問い」を発信し、(説明的ではなく)人に考えてもらえるような作品により、理解に繋げていきたい。

 

あと、広告代理店などへ作品を提案する過程や見積書など、普通じゃ絶対見れないものを見せてもらえて、ぬぉ!っていう感じでしたん。

あとあと、Kyleさんはめちゃめちゃ優しくてフレンドリーな人でした。
日頃ライブラリ使わせてもらっている感謝を伝えられて感無量。

FFTとちょっとだけ仲良くなる夏

今年の夏はFFTの気持ちを理解することに費やした夏でした。
まだまだ片思いのままなので、これからもアプローチをつづけます。。

Box

youtu.be

「タイムベンド」@かずち (カズチ)様

https://github.com/thinpedelica/FFTTS/tree/master/FftBox/FftBox/src

Triangle

youtu.be

「Floor_Monster」@MFP【Marron Fields Production】様

https://github.com/thinpedelica/FFTTS/tree/master/FftTriangle/FftTriangle/src

GPUCircle

youtu.be

「Homework」@MFP【Marron Fields Production】様

https://github.com/thinpedelica/FFTTS/tree/master/FftGpuCircle/FftGpuCircle

Grid

youtu.be

「Wave_Domination」@MFP【Marron Fields Production】様

https://github.com/thinpedelica/FFTTS/tree/master/FftGrid/FftGrid/src

ofxFaceTrackerハマリ記録

FaceTrackerは画像から顔を検出し、顔のパーツ(特徴点)の座標を取得できるライブラリです。C++OpenCVで実装されていますが、Pythonのラッパーもあるようです。

今回私はopenFrameworksのアドオンとして提供されているofxFaceTrackerを利用しました。毎度のことですが、利用するまでにいくつか(いくつも?)ハマったので、記録として残しておきます。

 

開発環境
  • Windows10
  • VisualStudio2015
  • openFramewowks (nightly builds)
ハマり1 インストールするものたちのバージョン

openFrameworksの安定バージョンが0.9.8から0.10.0に移行しようとしている真只中の現在、ofxFaceTrackerとofxCvをgithubのmasterからそれぞれ落としてくると、ビルドエラーになります。これらのmasterは0.10.0向けとなっているためです。
もし、openFrameworksを0.9.8のstable版で使用している場合、ofxFaceTrackerとofxCvは、masterではなくstableブランチから落としてくる必要があります。


ハマり2.1 プロジェクト設定(ofxCvの追加のインクルードパス)

新規プロジェクトを作成してofxCvを利用しようとすると、追加のインクルードパスが以下のように設定されていました。このままだとインクルードファイルが見つからないので、それぞれフルパスに修正する必要があります。

  • libs/ofxCv/include
  • libs/CLD/include/CLD
  • src

 

ハマり2.2 プロジェクト設定(追加の依存ファイル)

つづいて追加の依存ファイルを見ると、依存ファイルの行頭に「%3b」という文字が付与されていました。このままだとリンクエラーになるので、「%3b」を削除します。

 

ハマり2.3 プロジェクト設定(出力ファイル/オブジェクトファイル)

ここまで実施しても、まだリンクエラーが出ます。ぐぬぅ。
最後はエラーメッセージをググってみたら、こちらの記事にあたりました。
出力ファイル名を「$(IntDir)」から「$(IntDir)/%(RelativeDir)」に変更しました。

 

ここまでで、無事にofxFaceTrackerをビルド出来るようになってるはずです。
もしまだ別のエラーに困っているようであれば、それは新規の案件かもしれないので、解決したらぜひ周知してください♪

 

おまけ

f:id:Shampagne:20180502001200p:plain

多摩美の田所先生が公開しているサンプルを使わせて頂いて、歌舞伎Faceをやりました。かなりしっかり顔にフィットしてますね。

mastodonインスタンスを立てた(@さくらVPS)

mastodonが流行り出してからほぼ1年が経ちました。僕自身は2017年のニコニコ超会議に相撲と歌舞伎を観にいった際にfriends.nicoに登録してからズブズブです。

mastodonとは


 

建てたインスタンス(mastodosukoi)

 

はじめてのことだらけで、稽古つけてもらった感じです。いい勉強になりました。
ごっつぁんです。

C++にPythonを組み込むメモ(Boost.python)

C++からPythonを呼びたいのです。
逆に比べると大分ニーズが少ない。
以下を参考にさせて頂きました。
Embedded Python in C++ / C++からPythonスクリプトを呼び出す - Qiita
Boost.PythonでC++からPythonの関数を呼び出す
C++からPythonを叩きつつ、boost.numpyを使ってC++とPython間でndarrayをやりとりする - verilog書く人

初期化
Py_Initialize();
auto main_mod = boost::python::::import("__main__");
auto main_ns = main_mod.attr("__dict__");
スクリプトの読み込み
std::string script((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
boost::python::::exec(script.c_str(), main_ns);
関数の実行
auto func = main_ns["func"];
auto result = func(1.0);
Pythonからの値のパース
boost::python::::extract<double>(result)
例外処理
try {
//
} catch (boost::python::error_already_set) {
    PyErr_Print();
}
リスト/タプルで引数渡し
boost::python::list list_val;
list_val.append(1.0);
list_val.append(2.0);
auto result = main_mod.attr("func")(list_val);
タプルを受け取る
using input_iterator = boost::python::stl_input_iterator<double>;
input_iterator begin(result), end;

std::vector<double> vals(begin, end);
for (auto val : vals) {
    std::cout << val << std::endl;
}

Boost.python/Boost.numpyを使いたい

openFrameworksを使い始めました。
そうしたらC++からPythonを呼び出したくなってきた。
以下の記事を参考に、Boost.pythonをインストールしたのでその記録。

PythonからC++を呼び出してnumpyを使う - TadaoYamaokaの日記
Boost.PythonおよびBoost.NumpyをWindowsで使うまで | tatsyblog

環境
  • Windows10
  • VisualStudio2015
  • Python 3.5.3 (c:\python35)
  • Boost 1.66 (c:\boost_1_66_0)
Boostのインストール

TadaoYamaokaさんの記事の手順のとおり。完全に同じ。ビリーブ。

  1. ダウンロードしたBoostを解凍して適当に配置。
  2. Boost.pythonのビルドを有効にする。
  3. Boostをビルド。
C++からBoost.pythonを使う

今度はtatsyさんのコードを参考にした。

#include "stdafx.h"
#define BOOST_PYTHON_STATIC_LIB
#define BOOST_NUMPY_STATIC_LIB
#include <Python.h>
#include <boost/python.hpp>
#include <boost/python/numpy.hpp>
#include <iostream>

namespace py = boost::python;
namespace np = boost::python::numpy;

int main()
{
    Py_Initialize();
    np::initialize();

    // Matrix A
    py::tuple shapeA = py::make_tuple(2, 2);
    np::ndarray A = np::zeros(shapeA, np::dtype::get_builtin<double>());
    A[0][0] = 1.0;
    A[0][1] = 2.0;
    A[1][0] = 3.0;
    A[1][1] = 4.0;

    // Vector b
    py::tuple shapeB = py::make_tuple(2);
    np::ndarray b = np::zeros(shapeB, np::dtype::get_builtin<double>());
    b[0] = 3.0;
    b[1] = 7.0;

    // Prepare numpy.linalg.solve
    py::object solve = py::import("numpy").attr("linalg").attr("solve");

    // Solve
    np::ndarray x = py::extract<np::ndarray>(solve(A, b));
    int dims = x.shape(0);
    for (int i = 0; i < dims; i++) {
        std::cout << py::extract<double>(x[i]) << std::endl;
    }

    return 0;
}

無事に動きました。
先輩ありがとうございます。