読者です 読者をやめる 読者になる 読者になる

湯LOG

主に自分用のメモ

Pythonで開発パッケージのパスを通す

Pythonでモジュールをインポートする際に、

>>> import hogehoge

としたときに

Traceback (most recent call last):
…
ImportError: No module named hogehoge

とならないようにするためのメモ。

sys.path

モジュールをimportするときに、どのフォルダ・ファイルを参照するかはsysモジュールのsys.pathにリストとして格納されているモジュールの検索パスに基づいて決められます。
デフォルトでは、カレントディレクトリ、環境変数PYTHONPATH、インストール依存のデフォルト値、がモジュールの検索パスとして設定されています。
検索パスを新たに追加したい場合は以下のようにsys.pathにパスを追加します。

import sys
sys.path.append('/path/to/hogehoge')
import hogehoge

setuptools

setuptoolsのライブラリを使うとより便利になります。
以下のようなsetup.pyを追加したいモジュールのカレントディレクトリに作成します。

# setup.py
from setuptools import setup
setup(name='hogehoge', version='0.1.1')

そして、次のコマンドを実行

python setup.py develop

すると、開発用としてPythonのsite-packagesのフォルダの中にこのパッケージへのパスを持つリンクが作成され、パスが通ります。
(もちろん、setuptoolsを使わなくてもsite-packageに直接パスを指定したリンクを作成することも可能です)

意外と便利なstringクラスのassignメンバ関数

今回はC++標準ライブラリで、文字列を簡単に扱えるstd::stringクラスについて。

ディレクトリやファイル名など、各要素を分割して取得したいときなどはboost::filesystem::pathなどをよく使うのですが、文字列のここからここまでだけ抜き出したい!とか数字のとこだけ抜き出したいってときにはstringクラスのassignメンバ関数が便利です。

assignメンバ関数

一部の機能は、std::string::operator=と同じですが、assignのほうがコンストラクタと同様に機能が豊富です。

#include <iostream>
#include <string>

int main()
{
	std::string str1("abcde");
	std::string str2;

	str2.assign(str1);         // 他の std::string から代入
	std::cout << str2 << std::endl;

	str2.assign(str1, 1, 3);   // str1[1] から 3文字を代入
	std::cout << str2 << std::endl;

	str2.assign("xyz");        // const char*型から代入
	std::cout << str2 << std::endl;

	str2.assign("xyzxyz", 4);  // "xyzxyz" の先頭から 4文字を代入
	std::cout << str2 << std::endl;

	str2.assign(5, 'a');       // 5個の 'a' を代入
	std::cout << str2 << std::endl;

	str2.assign(&str1[0], &str1[3]);  // 指定範囲を代入
	std::cout << str2 << std::endl;
}

実行結果

abcde
bcd
xyz
xyzx
aaaaa
abc

ちなみに、似たようなことはsubstrメンバ関数でもできます。

[追記]
STLのコンテナのほとんどにassignメンバ関数があるんですね。知らなかった。
はずかちい。

boostでよく使うクラスまとめ[随時更新]

- boost::filesystem::path

パスに対する様々な操作が可能。
パスの分解や連結、問い合わせなども簡単にできます。
以下の記事を参考にさせて頂きました。
hwada.hatenablog.com

また、ファイルが存在するかやディレクトリ内のファイル数を調べる方法に関しては以下のサイトを参考にしました。
boostjp.github.io


- boost::program_options

コマンドライン引数(オプション)を容易に解析することができます。
オプションを使いたい時などは使わない手はないですね。
オプションで「-help」を指定(省略するなら「--h」)できたりするのは便利です。
以下の記事を参考にしました。
krustf.hateblo.jp


最終更新日:2016/01/18

numpyを使ったデータの標準化

各次元が平均0、分散1になるようにデータの標準化

def scale(X):
    """データ行列Xを属性ごとに標準化したデータを返す"""
    # 属性の数 (列の数)
    col = X.shape[1]

    # 属性ごとに平均値と標準偏差を計算
    mu = np.mean(X, axis=0)
    sigma = np.std(X, axis=0)

    # 属性ごとにデータを標準化
    for i in range(col):
        X[:,i] = (X[:,i] - mu[i]) / sigma[i]

    return X

各種ライブラリにおける処理時間計測方法(C++)

はじめに

画像処理やら点群処理などでいくつかのライブラリを使ったりしているのですが、処理時間を計測したいときに毎回やり方を忘れてしまうためメモ。

C++標準

C++で処理時間等を計測する際、clock()やtimeGetTime()、 GetTickCount()等があるが、clock()は精度が10msec程度(処理系依存)なため使い勝手があまり良くなく、GetTickCountは精度は良いもののwinmm.lib(windows系)で用意されている関数のためxcode等で使えないといった問題がある。
一方で、std::choronoはプラットフォームに依存せず、精度も1msecと良い。

std::chrono::system_clock::time_point  start, end;
start = std::chrono::system_clock::now();
// 計測したい処理
end = std::chrono::system_clock::now();
double elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();

std::chrono::duration_cast<変換型>(duration)の変換型には,ナノ秒(nanoseconds),マイクロ秒(microseconds),ミリ秒(microseconds),秒(seconds) を指定できる。

boost

"boost/timer.hpp"にあるboost::timerを使います。これはCの標準ライブラリのclock()を使って簡単に時間計測をしてくれる便利なクラスで、基本的な使い方は以下のようになります。

boost::timer t;

// 計測したい処理

std::cout << t.elapsed() << " sec" << std::endl;

t.restart()を使うと、0からリスタートします。
ちなみにdouble型なのでおそらくミリ秒単位でもいける?

また、CPUタイマーというのを使うとプログラム全体のCPU時間などを勝手に出力してくれます。

boost::timer::auto_cpu_timer t;

// 計測したい処理
// 特に出力しなくてOK

Qt

QElapsedTimerを使います。

QElapsedTimer et;
et.start();

// 計測したい処理

qint64 t = et.elapsed();
ui->label->setText( QString::number(t) ); // ラベルに表示

処理にかかる時間をミリ秒単位で出力できます。

OpenCV

定番なのは、cv::getTickCount()を使ったもので、以下のような記述になります。

int64 start = cv::getTickCount();

// 計測したい処理

int64 end = cv::getTickCount();
double elapsedMsec = (end - start) * 1000 / cv::getTickFrequency();
std::cout << elapsedMsec << "ms" << std::endl;


また、cv::TickMeterを使った計測も可能です。
恐らくこっちのほうが直観的でわかりやすいかと。

cv::TickMeter meter;
meter.start();

// 計測したい処理

meter.stop();
std::cout << meter.getTimeMilli() << "ms" << std::endl;

秒、ミリ秒、マイクロ秒が取れます。

PCL

"pcl/console/time.h"に記述されているpcl::console::TicTocを使います。

pcl::console::TicToc tt;
tt.tic();

// 計測したい処理

pcl::console::print_value("%g", tt.toc()); pcl::console::print_info(" ms");

pcl::consoleはカラーで出力してくれるから見やすい。

ITK

"itkTimeProbe.h"にあるitk::TimeProbeを使います。

itk::TimeProbe tp;
tp.Start();

// 計測したい処理

tp.stop();
std::cout << "Mean: " << tp.GetMean() << std::endl;
std::cout << "Total: " << tp.GetTotal() << std::endl;

Reset()やGetStandardDeviation ()などもうまく使えたら便利だと思います。

ITKとは

はじめに

ITK(Insight segmentation and registration Tool Kits)に関する日本語の記事が少なかったので、以後徐々に書き進めていきたいと考えています。
自分もまだまだ理解していないのでメモ程度に。

ITK概要

 - フィルタリング
 - セグメンテーション(領域抽出)
 - レジストレーション(位置合わせ)

  • ドキュメントが豊富で、よくテストされている

 - wikiチュートリアルメーリングリストがあります
  http://www.itk.org/ITK/help/tutorials.html

 - 任意の次元を取り扱える(2次元、3次元、n次元)
 - C++のテンプレートを用いた統一されたデータ保存の概念
 - 大規模データの効率的な処理

 - National Library of MedicineやNational Institute of Healthなどがスポンサー

  • For Image Processing only

 - UIや可視化の機能はありません
 - QtやVTK(Visualization Tool Kits)と組み合わせるのが一般的

主な機能

  • ガウシアンフィルタ
  • エッジ保存平滑化
  • 統計的領域分割
  • Region Growing
  • エッジ検出
  • Watershed
  • 動的輪郭(LevelSet)
  • Mesh
  • 剛体位置合わせ
  • 非剛体位置合わせ

おわりに

今回はさらっと概要だけ紹介しましたが、おいおい詳しく見ていこうと思います。
インストールについては、過去記事をご覧ください。
yuzatakujp1013.hatenablog.com

ちなみに有名な画像処理ライブラリにOpenCVがありますが、はっきり言って処理速度やアルゴリズムの充実さでいうとOpenCVのほうが上なので、2D画像処理をする際にはOpenCVを用いたほうがいいでしょう。

ただし、RAWデータやDICOMデータのように高ビット画像を圧縮せず扱いたい場合は、ITKなどを用いたほうが良いかもしれません。OpenCVの実装は基本的に8ビットがメインなので。(ただITKとOpenCVパイプラインとなるモジュールも存在します)

ITKはセグメンテーションやレジストレーション医用画像処理に特化したツールであり、OpenCVはカメラ系のコンピュータビジョンに特化したツールです。自分が行う対象をしっかり把握したうえで、適したツールを使うことをお勧めします。

Qt5.5 for VisualStudio2015 from Source

はじめに

VisualStudio2015でQtを使いたかったのですが、現在リリースされているやつはまだ対応してない?みたいで仕方なくソースからビルドすることにしました。
以下のサイトを参考に進めました。
Qt for Windows - Building from Source | Qt 5.5

ソースの取得

最初はgitからクローンしてやろうと思ってたのですが、ソースの初期化でエラーが発生したため、Qt - Downloadからソースをダウンロードしてきました。
自分はC:の直下に展開しました。

必要な環境変数の指定

ConfigureやBuildのための環境変数を設定します。

CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
set QTDIR=C:\qt5.5\qtbase
set PATH=%QT_DIR%\bin;%PATH%
set QMAKESPEC=win32-msvc2015

Configure

## dynamic link
configure -debug-and-release -opensource -platform win32-msvc2015 -opengl desktop -nomake examples -nomake tests
## static link
configure -debug-and-release -opensource -platform win32-msvc2015 -opengl desktop -static -nomake examples -nomake tests

exampleなしのリンク

Build

nmake
nmake install

jomが使える場合はjomのほうが早いらしいです。


これで終了。
時間はかかるが、簡単ですね。
あとでVisual Studio 2015用のAdd-inも追加します。