MATLAB vs. ...

「DeepNude」が登場

やってくれますなあ。エロパワー炸裂のOpenCV(?)+CNNかな?

優良版は$50とか、絶妙な価格設定だ事。後はこれで稼いだ金で、VR用の眼鏡に実装して、価格$500で売り出せば、大金持ちになる事間違い無し。オイラーにも一口参加させておくれよ。

まて、その為には、行列をしっかり勉強しておかんかい。で、参考書を開いてみるものの、こんな定義何の役に立つんやってのが、永遠と出てきてうんざりですよ。

実用と結び付く所で解説して貰えんかのう! >参考書の著者の方々。

signal

4KデュアルモニタサポートのRaspberry Pi 4が登場,Raspbian OSもアップデート

こんな化け物ラズパイが出てきたら、ちゃんとMATLABも動くのかな? と、淡い期待。

MATLABによると、この行列研究所は由緒あるものだ。そして、それを真似してpythonの科学系ライブラリィーが作られている。matplotlibみたいにね。octaveも同様だ。

金の有る大学では、matlabを普通に使ってる。前回見つけた、畳み込みの解説もそうだ。 あの中で、xcorrが出て来る。ocaveでやろうとすると、pkg install signalすれば良い。 controlってのに依存してるんで、先にそれを入れろと言われる。

なんかfortranを駆使してるようだったけど、オイラーそんなの入れた覚えがないぞ。探ってみたら、こんなのが出てきた。

[ham@cent ~]$ locate fortran.so
/home/ham/.local/share/flatpak/runtime/org.kde.Sdk/x86_64/5.12/0099b34a45a1e4189e25cbfaedc9fd36f25a7f9f765955c802db489f0106c27b/files/lib/x86_64-linux-gnu/libgfortran.so
/home/ham/.local/share/flatpak/runtime/org.kde.Sdk/x86_64/5.12/0099b34a45a1e4189e25cbfaedc9fd36f25a7f9f765955c802db489f0106c27b/files/lib/x86_64-linux-gnu/libgfortran.so.5
/home/ham/.local/share/flatpak/runtime/org.kde.Sdk/x86_64/5.12/0099b34a45a1e4189e25cbfaedc9fd36f25a7f9f765955c802db489f0106c27b/files/lib/x86_64-linux-gnu/libgfortran.so.5.0.0
/usr/lib64/libgfortran.so.3
/usr/lib64/libgfortran.so.3.0.0
/usr/lib64/libhdf5_fortran.so.8
/usr/lib64/libhdf5_fortran.so.8.0.1
/usr/lib64/libhdf5hl_fortran.so.8
/usr/lib64/libhdf5hl_fortran.so.8.0.1

flatpakの中に居るのは分かるけど、/usr/lib64の下にあるやつは何よ?

[ham@cent ~]$ yum provides /usr/lib64/libgfortran.so.3.0.0
libgfortran-4.8.5-36.el7.x86_64 : Fortran runtime
リポジトリー        : base
一致          :
ファイル名    : /usr/lib64/libgfortran.so.3.0.0

or

[ham@cent ~]$ rpm -qf /usr/lib64/libgfortran.so.3.0.0
libgfortran-4.8.5-36.el7_6.2.x86_64

こんな風に調べると良いらしい。

で、早速試してみた。血圧データの自己相関。

pkg load signal
close all;

bld = csvread('current.csv');
am  = bld( rem(bld(:,1),100)<12, : );

x = am(end-99:end, 2);
y = x(1:50);
cr =  xcorr(x,y)/sqrt(sum(x.*x))/sqrt(sum(y.*y));

subplot(2,1,1); plot(x);
subplot(2,1,2); plot(cr);

正規化させてみた。出て来たものの意味がよく理解出来なかったので、既存のデータで検証してみる。

t = [0:0.1:4*pi]; t1 = t;
x = sin(t);
y = cos(t);
z = xcorr(x,y,'coeff');

subplot(211); plotyy(t,x, t1,y)
subplot(212); plot(z)

比べるものが同一サイズだと、少し簡単に出来る。尚、plotyyで2つのデータを書かせる時、それぞれのX軸とY軸データを与えるんだけど、X軸は共通って事で、同一なものを指定すると、シンタックスエラーになってしまう。そこで、t1=tなんて事をして、逃げたよ。

また、pngにしようとしたらエラー。espファイルが出来上がっていた。しょうがないんで、ImageMagick付属のconvert コマンドで変換した。苦労したんで、記念品をあげておく。

result picture

error pkg install on OpenBSD

OpenBSDにpkgを入れようとして、エラーになった図。

octave:4> pkg install '-forge' control
warning: creating installation directory /home/sakae/octave
warning: called from
    install at line 30 column 5
    pkg at line 437 column 9
sh: gfortran: not found
gmake: *** [Makefile:35: slicotlibrary.a] Error 127
gmake: *** Waiting for unfinished jobs....
gmake: Entering directory '/tmp/oct-YpRKZM/control-3.2.0/src'
tar -xzf slicot.tar.gz
/usr/local/bin/mkoctfile-4.4.1 -Wall -Wno-deprecated-declarations  __control_hel
per_functions__.cc
mkdir sltmp
mv slicot/src/*.f ./sltmp
mv slicot/src_aux/*.f ./sltmp
cp TG04BX.fortran ./sltmp/TG04BX.f
cp TB01ZD.fortran ./sltmp/TB01ZD.f
cd sltmp; /usr/local/bin/mkoctfile-4.4.1 -c *.f
gmake: Leaving directory '/tmp/oct-YpRKZM/control-3.2.0/src'

pkg: error running `make' for the control package.
error: called from
    configure_make at line 99 column 9
    install at line 184 column 7
    pkg at line 437 column 9

フォートランが入っていないから、駄目だってさ。出目を晒してくれたな。知らず々のうちに、余計な物が突っ込まれているリナ系が良いか、指示しない限り余計な事をしないOpenBSDみたいのが良いか、思案のしどころだな。

symbolic

調子にのって、もう少し別のパッケージを入れてみたい。名前からして面白そうな symbolic

octave:1> pkg list
Package Name  | Version | Installation directory
--------------+---------+-----------------------
     control  |   3.2.0 | /home/ham/octave/control-3.2.0
      signal  |   1.4.1 | /home/ham/octave/signal-1.4.1
    symbolic  |   2.7.1 | /home/ham/octave/symbolic-2.7.1
octave:2> pkg load symbolic
octave:3> syms x
Symbolic pkg v2.7.1: Python communication link active, SymPy v1.3.
octave:4> f = sin(5*x)
f = (sym) sin(5⋅x)
octave:5> diff(f)
ans = (sym) 5⋅cos(5⋅x)
octave:6> diff(x^3 + 2*x^2 + 8*x)
ans = (sym)

     2
  3⋅x  + 4⋅x + 8

使う記号をsymsで宣言してから、記号微分をやってみた。本体は、pythonから移植されてるっぽい。

octave:7> f=x^3+13*x^2-105*x+171;
octave:8> factor(f)
ans = (sym)

         2
  (x - 3) ⋅(x + 19)

因数分解

octave:9> int(f)
ans = (sym)

   4       3        2
  x    13⋅x    105⋅x
  ── + ───── - ────── + 171⋅x
  4      3       2

不定積分

なんか、maximaがやって来たようだな。

octave:8> unix("find /app -name '*.???'")
  :
/app/lib/python2.7/site-packages/sympy-1.3-py2.7.egg/sympy/__init__.pyc
/app/lib/python2.7/site-packages/sympy-1.3-py2.7.egg/sympy/abc.pyc
/app/lib/python2.7/site-packages/sympy-1.3-py2.7.egg/sympy/conftest.pyc
  :

この時代にpython2.7とは、いかがなものかな? 次回のリリースでは、python 3.7.3 ぐらいになるのかなあ。

OpenBSDにもmaximaもどきがやって来るかな?

octave:4> pkg install '-forge' symbolic
/tmp/octave-help-IaqsQP:114: Unknown command `codequoteundirected'.
warning: doc_cache_create: unusable help text found in file 'assume'
 :
For information about changes from previous versions of the symbolic package, run 'news symbolic'.

警告が出つつも、入った。早速使ってみる。

octave:8> syms x
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named sympy
Symbolic pkg v2.8.0: error: Python cannot import SymPy: have you installed SymPy?
    Try "sympref diagnose" for more information.
error: called from
    assert_have_python_and_sympy at line 123 column 7
    python_ipc_popen2 at line 79 column 5
    python_ipc_driver at line 59 column 13
    python_cmd at line 163 column 9
    valid_sym_assumptions at line 38 column 10
    assumptions at line 82 column 7
    syms at line 97 column 13

pythonに丸投げしてて、そんなモジュール入ってないぞエラーが出て来た。

octave:9> pkg uninstall symbolic
octave:10> pkg list
no packages installed.

無駄な物は消しておきましょ。symbolicしたかったら、老舗のmaximaを入れとけ。おまけでeclって言うlispが付いてくるぞ。

matlab vs. octave vs. python

と、思わぬ隠れpythonが見つかった所で、上記タイトルの3巨匠を誌的に比べてみるか。

歴史が一番古いのはmatlabだな。fortranのライブラリーを手軽に使うために大学で開発された。その可能性を見出して商用化したとな。そして、octaveも大学で化学反応器の設計のための ツールとして開発された。

このあたり、統計ソフトで一時有名になったRと。その元になった高価な商用ソフトのSと同じ関係かな。

matlabが高価で使えない人は、自由に使えるoctaveを使え。それには、matlabのソフトがそのまま動く必要がある。だから、こんな歴史遺産をoctaveは受け継いでいる。

A.2 Mex-Files
=============

Octave includes an interface to allow legacy mex-files to be compiled
and used with Octave.  This interface can also be used to share compiled
code between Octave and MATLAB users.  However, as mex-files expose
MATLAB’s internal API, and the internal structure of Octave is
different, a mex-file can never have the same performance in Octave as
the equivalent oct-file.  In particular, to support the manner in which
variables are passed to mex functions there are a significant number of
additional copies of memory blocks when invoking or returning from a
mex-file function.  For this reason, it is recommended that any new code
be written with the oct-file interface previously discussed.

FAQによれば、matlabと同じ挙動をしなかったら、それはoctaveのバグなんで、迷わず通報してくれと書かれている。 だから、貧乏人は安心してoctaveを使ってくれ。

MSのEXCELなんかを買えない貧乏人は、安心してOpenOfficeあたりを使ってくれってのと、同じ構図だな。

そなら、python系はどうよ。Rはpythonの何でも出来ますによって、人気が性っているように思える。その秘密の一端を、 matplotlibで、探ってみる。と、ここでも御大のmatlabを手本にしたって出てたぞ。更に、 NumPyも見て桶と言われたので、飛んで行って見ると、ここでもmatlabが元祖だぞと出てきた。

このmatplotlibとnumpyを下敷きにして、matlabのpython版が出てきた。それはね、 SciPyだ。更に、これらに機械学習のパッケージを追加して現代風になったのがanacondaさんだ。

全ての元は、matlabだったのね。

matは行列。数字をひと固まりにして扱いましょって発想。EXCELの表だわな。表の集合をEXCEL言葉では、ブックって言うだっけ? 表が積み重なってるから、(x,y,z)のイメージになるか。

まてまて、これを一般化すれば、4次元とか10次元とかの任意の次元になるじゃん。それを数学言葉でテンソルって言うのかな。ググルが機械学習でこれを基盤にしてるね。

行列ってのは、表と言うイメージでどこにも出て来るな。それに引き換え、列方向に着目して、 区切りをカッコで表したのを扱うのが得意なのは、Lisp系。みんなリストの中に閉じ込めちゃうものだから、余り人気が無くなってきたように思えるのは、オイラーだけ?

行を幾つも並べて得意がってるのは、unixの根底の思想だな。手軽に扱えるように、awk,perlとかが有ったな。rubyも有ったが、numpyの底力でpythonが一躍有名になり、ほそぼそと某分野で活躍中だ。あっ、石投げないでね。オイラーの短観予想ですから。(某所の発表みたいに、信用出来んと思ってください)

上で苦労した、一つのグラフに、2本の線を書く方法。patplotlib方面では、どうやっているか、偵察しておく。

matplotlib入門

ふむ、2本と言わず何本も重ね書き出来るようにしてるのね。便利ちゃ便利なんだけど、調子こいて重ね書きしてると、うっとうしい図になる事請け合い。

鬱陶しいと言うと、pythonはimportしないと駄目。モジュール名を前置しないと駄目ってのが、オイラーにとっちゃ非常に煩わしい。octaveぐらいに節度佳くまとまっている小ぶりのやつは、名前衝突回避の為の面倒さがなくて、楽でいいわ。

filter

そもそもoctaveを引っ張り出してきたのは、OpenCVをやってる友人に触発されたからだった。 図の加工で、空間フィルターと称するやつに出会ったし。カーネルなんで言う語句も知ったし。 知見が拡がっていいわ。

で、フィルターってのはどうよって、調べてみたら、ごまんと出て来た。

やる夫で学ぶディジタル信号処理

数学の勉強にうってつけ。

A.デジタルフィルタ編

octaveでの音フィルターの実例。

Signal Processing/Filter Design

そして、設計方法とな。じっくり読みたい。

octave/IIRフィルタの伝達関数設計

ディジタルフィルタの概要

OpenCV

けど、interfase誌のOpenCV特集号(カメラで測る画像センシング)が有るので、少し手を出してみる。(気分転換)

重要な機能を紹介したサンプルが有ったので、Debian機で試してみる。

#include <iostream>
#include <opencv2/opencv.hpp>
int thresh = 100;
int max_thresh = 255;
cv::Mat img = cv::imread("lena.jpg");
cv::Mat gray, bwImg;

void thresh_callback(int pos, void*);

int main(){
        cv::cvtColor(img,gray,cv::COLOR_BGR2GRAY);
        cv::namedWindow("Original");
        cv::imshow("Original", img);
        cv::createTrackbar("thresh", "Original", &thresh, max_thresh, thresh_callback);
        thresh_callback(thresh, 0);
        cv::waitKey(0);
        return 0;
}

void thresh_callback(int pos, void*){
        cv::threshold(gray, bwImg, pos, 255, cv::THRESH_TRUNC);
        cv::namedWindow("BWImg");
        cv::imshow("BWImg", bwImg);
}

OpenCVのライブラリィーはどうするの? それは、ずる賢こく、anaconda3にopencvを突っ込み、それを流用させて貰う算段。インターフェース誌に、リンクすべきやつが紹介されてたから、それを取り込んで、下記のようなMakefileを書いた。

build:
        c++ ${SRC} -I/home/sakae/anaconda3/include \
                   -L/home/sakae/anaconda3/lib \
                   -lopencv_core -lopencv_highgui -lopencv_imgproc \
                   -lopencv_imgcodecs

Cフラフラ語なので、コンパイルにたっぷり時間がかかる。OpenCVはインテル主導で開発が続く プロジェクトだから、遅いパソコンは棄てて、パワーのある石を使ってねって戦略がありありですよ。早く i386 なんて言う時代がかったパソコン棄てろだな。

sakae@debian:~/CQIF$ ./a.out
./a.out: error while loading shared libraries: libopencv_core.so.3.4: cannot ope
n shared object file: No such file or directory

無事にコンパイル出来たんで、早速実行。そして、早速いつもの見つからないエラーが発現。 そりゃそうだわな。アナコンダの腹の中なんて知る訳ないでしょ。

sakae@debian:~/CQIF$ export LD_LIBRARY_PATH=/home/sakae/anaconda3/lib
sakae@debian:~/CQIF$ ./a.out
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.2) /opt/conda/conda-bld/opencv-suite_1535678557175/work/mo
dules/highgui/src/window.cpp:615: error: (-2:Unspecified error) The function is
not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. I
f you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run
 cmake or configure script in function 'cvNamedWindow'

今度は、cvNamedWindowsなんて、知らんから作り直せとな。全くもう、、、、。

ひょっとしてC語からは使えない? 清く正しく、pythonから使ってみようってんで、下記のものを借りてきた。

debian:CQIF$ cat cktrack.py
# -*- coding: utf-8 -*-
import cv2

# トラックバーの値を変更する度にRGBを出力する
def changeColor(val):
    r = cv2.getTrackbarPos("R", "img")
    g = cv2.getTrackbarPos("G", "img")
    b = cv2.getTrackbarPos("B", "img")
    print [r, g, b]

# 画像の読み込み
img = cv2.imread("lena.jpg", 1)
# ウィンドウのサイズを変更可能にする
cv2.namedWindow("img", cv2.WINDOW_NORMAL)

# トラックバーの生成
cv2.createTrackbar("R", "img", 0, 255, changeColor)
cv2.createTrackbar("G", "img", 0, 255, changeColor)
cv2.createTrackbar("B", "img", 0, 255, changeColor)

# 「Q」が押されるまで画像を表示する
while (True):
    cv2.imshow("img", img)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cv2.destroyAllWindows()

そして走らせてみる。

sakae@debian:~/CQIF$ python cktrack.py
Traceback (most recent call last):
  File "cktrack.py", line 14, in <module>
    cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.error: OpenCV(3.4.2) /opt/conda/conda-bld/opencv-suite_1535678557175/work/modules/highgui/src/window.cpp:615: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'

やはり同じエラーだ。アナコンダは毒を持ってて、使用者を喰い殺しているのか。

opencv                    3.4.2            py36h6fd60c2_1

これが毒? 苦労して自前で用意しろとな。それはいいんだけど、どんなライブラリィーを指定すればいいの? 何処にも書いてないぞ。

と思ったら、cmakeを上手く使えって流儀らしい。

OpenCV3をOSXにインストールしてcmakeで優勝

そろそろDebianは新しいのが出るはずだから、そしたら考えてみよう。

それまで、行列関係を見ておくか。

Python, OpenCVで幾何変換(アフィン変換・射影変換など)