教育者,研究者としての立場

ポスドク的な立場で,出身研究室に未だお世話になっている私が,教育者や研究者の立場を語るのはおこがましいとは思うが,ふといろいろと考えてしまい,もやもやするのでアウトプットしてみる.

背景(設定)

もやもやの発端

一応,指導者側として日々学部生や院生の指導・支援に関わる中で,機能・サービスの開発の優先順位について一貫した考えを述べることに難しさを感じた.

もっとザックリ言ってしまえば,考えが変わってしまう.別に学生を困惑させたいわけではないのに,何故か.

考えが変わる原因

教育者,研究者それぞれの立場,さらに卒業まで残された時間によって変わっているのではないか.

ここでいう各立場の思惑をざっくり述べる.別に立場の呼称はどうでも良い.

教育者
よりよい経験を積んで,社会に巣立っていって欲しい.テーマ決めが大変で立ち上がりが遅くなるので(それが仕事と言えば仕事なんですが),後輩に引き継いで欲しい.
何もかもが未完成で,卒論が書けず,卒業できない事態は避けたい.

研究者
できうる限り,研究成果(論文)に繋げたい.そのためにも,1年では短いことが多いので,後輩に引き継いで欲しい.

引き継ぎに関しては私の環境がだいぶ偏っている気がする(反対意見も多くありそう)のですが,今回のところ,共通事項として考えから除く,という意味であえて書いた.

シナリオ(と言っても具体的でないですが)

ある既存システムAがあるとする.

  • 既存システムの機能
    • a機能(国際会議に出した)
    • b機能
  • 学生の提案
    • a機能はa'に改良しましょう
    • b機能はb’に改良しましょう
    • c機能を足しましょう
    • d機能を足しましょう

上記提案でボリューム的には卒研に十分相当し,かつ実現困難な技術的問題はないものとする.
また,頓珍漢な(無意味だったりマイナスだったりする)提案はないものとする.

卒業までの時間によって各立場で考えること

6月から10月あたりは微妙なラインなので,今回は省く.

まだ卒業まで時間がある時期(4月〜6月)

研究者として取り組み内容に期待する気持ちが強い.

研究者 ≧ 教育者,な心のバランス状況.

  • 教育者
    • 考え:
      • システム開発の経験的に全部やった方が良いでしょうし,やれると思う.何故その機能が必要か? を語れるようにしましょう
      • 改良はシステムの理解にも繋がるので先にやった方が良い
    • 結論:a', b', c, d全部やりましょう.a'とb'を優先的に着手しましょう
  • 研究者
    • 考え:
      • この取り組みでPaperにできそうなところはないか?
      • a機能は既にPaperにしているので,できれば変更は避けたい
      • c機能はPaperになりそうだ
    • 結論:a'やらない方がいい.cは是非チャレンジしてください.

教育者的には全部やりましょう.しかし,研究者的考えではa機能は弄りたくない.
ので,学生へのコメントとしては「a'はやらないで欲しい(し,そんなに重要ではない).b機能の改良とc,d機能の開発を卒研テーマにしましょう」

優先順位は,b' > c > d,a'はカット(まずはシステム理解に繋がるb'改良,その後はPaperに繋がりそうなc機能,最後にd)

卒業が迫ってきた時期(10月以降)

既にシステムができあがって,後は卒論,というのは除き,まだ開発に着手できるかできないかぐらいの状況を想定する.

当初の予定通りの機能はできそうにない.研究ではなく,学生が卒業できることを最優先.

教育者>研究者,な心のバランス状況.

  • 教育者
    • 考え:
      • なんとか卒論を仕上げられないか.評価実験も必要だ
      • 既存の改良ではインパクトに欠け,改良だけで卒研とするのは難しい
      • 評価実験を考えると動いているものを弄るのは避けたい
      • 技術的にはc機能よりd機能の方が簡単だ
    • 結論:d機能優先で,なんとかc機能までやりましょう
  • 研究者
    • 考え:この状況では論文になりそうとか言っている場合ではない.来年に期待.

優先順位は,d > c, a'とb'はカット

考えの違い

前期はb'改良を優先に,d機能は一番優先順位が低かった.

しかし,後期になったらd機能が最優先に.改良は原則やらないことに.

うーん.これは学生側は混乱してしまうよね……さらに,省いた6月から10月の間が,その時の気分によって朝令暮改になってしまっているのかもしれない.

学生に優先順位を語る時には,理由もセットで語るように心がけてはいるのだけど,理由そのものが教育者的立場なのか研究者的立場なのかによって変わってしまうので,難しい.

ってごちゃごちゃ書いたけど

要するに,最初は長期的視点,〆切りが近くなったら短期的視点で物事を考えているっていう単純な話なのかな.

Error: undefined method `factory' for Formula:Class

今日,brew updateとしたら,以下のようなエラーが.

$ brew update
Error: undefined method `factory' for Formula:Class
Please report this bug:
    https://github.com/mxcl/homebrew/wiki/troubleshooting
/usr/local/Library/Homebrew/cmd/update.rb:61:in `update'
/usr/local/Library/Homebrew/cmd/update.rb:60:in `each'
/usr/local/Library/Homebrew/cmd/update.rb:60:in `update'
/usr/local/Library/brew.rb:95:in `send'
/usr/local/Library/brew.rb:95

基本的には,brew doctorで問題点を発見するのだが,つい先日いろいろと直したばかりなので,問題なし.

$ brew doctor
Your system is ready to brew.

さらに,git statusで何か自分で弄ってしまった部分がないか調べたが,それもなし.

$ cd /usr/local
$ git status
# On branch master
nothing to commit, working directory clean

困ったところで,masterにHEADを戻してみる(変えた覚えはないのだが)

$ git pull origin master
From https://github.com/mxcl/homebrew
 * branch            master     -> FETCH_HEAD
Already up-to-date.
$ brew update
Already up-to-date.

解決!

Ubuntu12.04+OpenCV+NetBeans

Ubuntu 12.04 DesktopにOpenCVNetBeansを入れて,サンプルプログラムを作り,コンパイルし,実行するまでの流れ.

Ubuntuインストール直後にやっておいたこと

$ sudo apt-get install build-essential

OpenCVのインストール

$ sudo apt-get install libcv-dev libcv2.3 libcvaux-dev libcvaux2.3 libhighgui-dev libhighgui2.3 opencv-doc

NetBeansのインストール

まずは,Java

$ sudo apt-get install openjdk-6-jdk

その後,https://netbeans.org/downloads/ から,C/C++がバンドルされたものをダウンロード.
ここでは,netbeans-7.4-cpp-linux.sh をダウンロードする.
実行権限を付与して,インストールする.インストールはsudoでないことに留意.

$ chmod +x netbeans-7.4-cpp-linux.sh
$ ./netbeans-7.4-cpp-linux.sh

NetBeansの起動とC++プロジェクトの作成

新規プロジェクトから,「C/C++アプリケーション」を選んでプロジェクトを作成する

OpenCV関係の設定

プロジェクトのプロパティから以下の設定を追加する

  1. ビルド
    1. C++コンパイラ
      1. インクルード・ディレクトリ:/usr/local/include/opencv2
    2. リンカー
      1. ランタイム検索ディレクトリ:/usr/local/include/opencv2
      2. ライブラリ -> オプションの追加 -> その他のオプション:`pkg-config --libs --cflags opencv`*1

参考:http://thefreecoder.wordpress.com/2012/09/10/use-netbeans-to-work-with-opencv-on-ubuntuand-linux-mint-and-other-distros-too/

サンプルコードをmain.cppに書いて実行

http://ser1zw.hatenablog.com/entry/20101030/1288441129 をベースに,http://ninetynine.be/blog/2011/11/setting-up-opencv-2-3-and-netbeans-7-0-on-ubuntu-oneiric-11-10/ を参考にしてinclude部分を少し書き換えました.

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;

int main (int argc, char *argv[]) {
  IplImage *src, *result;
  char *original = "Original";
  char *canny = "Canny";

  if (argc < 2) {
    printf("Usage: opencvtest imagename\n");
    return -1;
  }
  if((src = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE)) == 0) {
    printf("Error: Failed to load %s\n", argv[1]);
    return -1;
  }

  result = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
  cvCanny(src, result, 50.0, 200.0, 3);

  cvNamedWindow(original, CV_WINDOW_AUTOSIZE);
  cvNamedWindow(canny, CV_WINDOW_AUTOSIZE);
  cvShowImage(original, src);
  cvShowImage(canny, result);
  cvWaitKey(0);
   
  cvDestroyWindow(original);
  cvDestroyWindow(canny);
  cvReleaseImage(&src);
  cvReleaseImage(&result);
  
  return 0;
}

(using namespaceとか分かっていないので,たぶん間違っているか,無駄な記述……iostreamも今回は動画ではなく画像なのでいらないと思われる)

実行

$ cd dist/Release/GNU-Linux-x86
$ ./cppapplication_1 ~/sample.jpg

~/sample.jpgは適当な画像.オリジナルのグレースケール画像と,輪郭出力画像が表示されればOK*2

*1:バッククオートも入力する

*2:ウィンドウがピッタリ重なっているので,ウィンドウを動かして確認

Ubuntu de OpenCV

Ubuntu12.04 Desktop 64bitにrtspで動画を取り込めるOpenCV環境を構築する方法.
と言ってもapt-getするだけですが.

$ sudo apt-get install build-essential
$ sudo apt-get install python-opencv
$ sudo apt-get install python-numpy
$ sudo apt-get install python-scipy

顔面認識に使うデータ

haarcascade_frontalface_alt.xml を使ってサンプルを動かしてみたい.

いろいろと検索すると,opencv/data/haarcascades/にあるよ,と書いてあるのだが,まったく見当たらない.
ファイル名で検索すると,Magic Vision PortalというSourceForgeプロジェクトが見つかった.

http://sourceforge.net/projects/magicvisionport/

このプロジェクトの/mvp/cascades/に目の認識も含めていろいろとある.

http://sourceforge.net/projects/magicvisionport/files/mvp/cascades/

Mountain LionにOpenCVをインストール

OpenCVを弄ってみようと思ったのだが,Windows 7 64bit環境にうまく導入できず(Visual Studioを入れれば解決はしたと思うのだが),Macで挑戦してみた.

が,「Homebrewで簡単に入るよ!」という記事は見つけども,手元のHomebrewでは

$ brew search opencv
No formula found for "opencv". Searching open pull requests...

となってしまう.portsに切り替えるのも大変だし……といろいろと探した結果,解決したので,手順をここに記録する.

Homebrewを使ったOpenCVのインストール

$ brew tap homebrew/science
$ brew install opencv

知りさえすれば,1行で済んだ.

Pythonで使いたかったので,画面の指示に従って,以下を.bashrc*1に追記

export PYTHONPATH="/usr/local/lib/python2.7/site-packages:$PYTHONPATH"

NumPyとSciPy,PILをインストール

dmgもあるようだが,コマンドで.

$ sudo eays_install pip
$ sudo pip install numpy
$ brew install gfortran
$ sudo pip install scipy
$ sudo pip install PIL

scipyのインストールには,warningが大量に出力され,数十分かかった.*2

PILはなくてもシンプルなサンプルコードは動いた気がするが,グレースケール変換やサイズ変更をしようとした時に必要になった気がする.

動作テスト

カメラがあるマシンを使うか,動画を予め用意しないといけないが,

http://d.hatena.ne.jp/rebelwidow/20100911/1284146941

などを参考に,動かしてみる.

今困っていること

このインストール方法では,rtspに非対応.
ffmpegを入れれば解決するのだろうか……

*1:昔,Terminal.appは.bashrcを読み込まなかったので,.bash_profileに書いた方が良いかも

*2:Mac Book Pro Retina環境でした.2010年モデルのMac Book Airだとどうなるのかは…

Randomを使ったHello World

 ネットサーフィンをしていたら,stackoverflowに面白質問が投稿されていた.
 どこか日本語のサイトで扱われていたと思うのだが,元記事を見つけられなかったので,自前で投稿してみる.

 http://stackoverflow.com/questions/15182496/why-does-this-code-print-hello-world

HelloWorld.java

import java.util.Random;

public class HelloWorld {
	public static void main (String[] args){
		System.out.println(randomString(-229985452) + " " + randomString(-147909649));
	}
	
	private static String randomString(int i){
	    Random ran = new Random(i);
	    StringBuilder sb = new StringBuilder();
	    while (true){
	        int k = ran.nextInt(27);
	        if (k == 0){ break; }
	        sb.append((char)('`' + k));
	    }
	    return sb.toString();
	}
}

コンパイル&実行

$ javac HelloWorld.java
$ java HelloWorld
hello world