なんだかんだで、OpenCV触ってました。

過去
OpenCVの結果を点数化するアプリを作った。
計算式に悩んだ。(まだ改良の余地多い)
とりあえず、完全にマッチが10点・かすると1点・見逃すと-5点に・不用だと-1点とした。
すると、今作っている鼻検出器は、OpenCV付属のものより、3割ほど劣っていることが判明

現在
OpenCVの背景画像数について、考えた。
もし絶対的な比率を定義する必要であれば、Pos:Neg比は1:2だと思う。
といっても、背景画像なんて、内容はまちまちなんだから、時間かかりすぎたり、Posが過程で減りすぎるなら減らして、誤検出しまくりならば、増やすとしか言えない。
もちろん、監視カメラなどで、背景が予想できるなら、そういうの増やしたらいいけど
あらゆる可能性から、顔とか認識する場合、背景をいくら増やしてもキリがないと思った。

未来
OpenCVの検出結果の評価計算方法を改良したい。いまだと、惜しいかすり方の点が低すぎる
評価方法ができたので、既存の画像の角度を返えて、枚数ふやした場合の結果とか調査したい。
あと、パブリックドメインの画像集めて、公開できるテストを作ってみたい。

今日もまたOpenCVで鼻の検出

過去
OpenCVで遊んでいた。
元は手に持ったマイクを認識させようとしたが、難しいのでやめた。
対象の角度が多すぎるのと、手に隠れる割合がバラバラすぎるのが原因

今は、人間の鼻を解析することにした。どうにか付属のサンプルdetectorと同等認識できるようになった。

現在
4行日記から、インスパイアされて、過去・現在・未来日記を書くことにした。(人のアイデア使うとアプリ化した時に面倒だし。)

OpenCV、面白いけど、いろいろな作業で、やたら時間掛かるな。
サンプルが少なくて、作成がすぐ終わる時は、numStages を30ぐらいにして、minHitRate を 0.999とかに上げると品質がよくなる。

あと、誤認識を避けるのは不可能な気がしてきた。(無限にある服の模様とかに簡単に反応する) 他の箇所も認識して、統合的に判断する方法がよさそう。
検出はある程度まで、サンプル増やせばどうにかなりそう。

未来
OpenCVのテスト結果を検証するツールを作りたい。
OpenCVの切り抜きをツールを向上させたい。
OpenCVのコマンド入力を補助するツール作りたい。

Windowsを復元で以前の状態に

2014年8月の月例Windows Updateで面倒なことになるみたいなので、復元でインストール前に戻す。
まあ、Chromeブラウザーしか使わないので、MSのアップデートってあまり影響ない気もするが

Windowsは数年に一度はこういう壊す系のアップデートあるよね。買い替え促してるのかもしれんけど

あとは、一日 OpenCVで遊んでいました。

そこで学んだのは、画像のサイズを大きくすると、計算時間も触れるということ
なので、最後に精度を少しあげたいという時以外は、OpenCVで画像のサイズを変更する必要はないと思いました。

あと64bit版なのに、最大メモリが2GBというのは謎、VC10使ってるのが原因かもしれないが、画像数が増えると使うメモリは増えていきます。
それと、OpenCVで画像が5000が目安というのは、普通の人のパソコンで計算できる限界量じゃないかと想像しました。検証したいです。

自作の画像切り抜きツールが、初期の設計の悪さも有り、1000枚前後が限界のようだ。
効率的に使うには、OpenCV向けのツールをもう少し自作しないといけなさそう。

今日は、回転などして画像を水ましツールの作成と、それの検証をしてみたいです。

OpenCV 2.4.9 for Javaをやりました。

昨日は、まる1日
http://docs.opencv.org/doc/tutorials/introduction/desktop_java/java_dev_intro.html
公式のOpenCV 2.4.9 with Javaで遊んでいました。

事前の予想では、C言語コンパイルとか面倒なこと発生しそうな気がしました。
しかし、.dllファイルをEclipseのProjectに放り込むだけで、簡単にサンプルが動きました。

正確には、リソース取得のコードに難ありで、ファイルを読み込む方式に変更しましたが
getClass().getResource("/lbpcascade_frontalface.xml").getPath()

ただ、実際に動かす所で苦労しました。
データーを、cifar-10 というデーターセットから流用したのですが(これExtractするコード書くのに多少時間かかった。)
http://www.cs.toronto.edu/~kriz/cifar.html

学習データーのサイズと、検証データーのサイズが同じだと、うまく認識させれませんでした。
detectMultiScaleの所で調整が必要な気がしましたが、内部はさっぱりわかりませんでした。

あと学習データーが500ぐらいだと、ステージ10ぐらいしか進みませんでした。
次は、自分でデーターを5000件ぐらい集めて、再度検証したいです。

ただ、今後はJavaScriptのみで動くのに挑戦したいです。
ConvNetJS が物凄く面白そうです。(画像処理の所、自分で作りこむ必要ありますが)

JavaScritp以外にも、コンパイル環境作らないといけないので、大変そうなのですが
気力があれば、以下も検証したい。

CCV.js
http://liuliu.me/ccv/js/nss/
ただOpenCVでいうcascade.xmlはCで書かれたExeで行う。openCVの物を変換はできない?

OpenCV for Chrome
http://opencv.org/opencv-ported-to-google-chrome-nacl-and-pnacl.html
自分でNativeClient化が大変そう

今日もGoogleJavaライブラリーのGuavaで遊んでました。といっても大抵の時間は、Total war というゲームで遊んでましたが。

その中で。FunctionIterableというクラスが書けました。これは、AbstractIteratorのデモを考えているうちに思いついたのですが

ファンクションって原則1つしか変換できないじゃないですか。でも中には複数返したい場合もある。そういうIterableに対応

//これ、FluentIterableのtransformAndConcat使えば必要ないことにあとで、気づいた。
FunctionIterable fc=new FunctionIterable(new Function>(){
@Override
public Iterable apply(String input) {
checkNotNull(input);
return Splitter.on("\n").split(input);
}
},Lists.newArrayList("hello","world\nline2\nline3"));

LogUtils.log(Joiner.on("\n").join(fc));

public static class FunctionIterable extends AbstractIterator{
private Function> function;
private Iterator iterator;
private Iterator retiterable;

public FunctionIterable(Function> function,Iterable iterable){
this.function=function;
this.iterator=iterable.iterator();
}

@Override
protected T computeNext() {
if(retiterable==null || !retiterable.hasNext()){
while(iterator.hasNext()){
retiterable=function.apply(iterator.next()).iterator();
if(retiterable.hasNext()){
T object=retiterable.next();
return object;
}
}
}else{
T object= retiterable.next();
return object;
}

return endOfData();
}

}

そういえば、Dart言語をGoogle App Engineがサポートというニュースがあったな。

そろそろDartに移るか悩みどころ。ただ愛用しているGuavaライブラリーがGWTと違って、更新されてないぽいんだよな。

まあ、そういうGuavaもようやく、自分のBaseパッケージのまとめが終わった。

Guava Baseパッケージの一欄
http://www.akjava.com/jp/guava/base/index.html

結構使ってこなかったクラスも多かったので、使いこなしたい。
でも、Guavaになれると、Oracle Javaには戻れそうもないな。まあ戻る必要な事態が起きるとは思えないけど

xucker2014-06-23

今日は、GWTで作成している画像出力系HTML5アプリ
http://android.akjava.com/html5apps/exportimage_help.html

に数字を書き出す機能を追加していた。

Canvasで文字を中央に描くの悩んでいたが、baseLineをmiddleにするだけで簡単にできるようになった。

これで、少しは解説記事書きやすくなるかな。