CUDAで二次元配列の転置は高効率にできないと言ったな!あれは嘘だ!

寒くなってくるとお魚で鍋とかもしたくなってきますね.
海辺のお魚屋さんでは人々が行列を成してるんでしょうか.

行列といえばGPGPUが活躍する最も重要な分野の一つと言えますね.

んで,そんな行列でよく使われるタスクのひとつに「転置」があります.

  \bold{A}=  \begin{pmatrix}  1 & 2 & 3 \\  4 & 5 & 6 \\  7 & 8 & 9 \\  \end{pmatrix},  \bold{A}^{\mathrm{T}}=  \begin{pmatrix}  1 & 4 & 7 \\  2 & 5 & 8 \\  3 & 6 & 9 \\  \end{pmatrix}
  \bold{B}=  \begin{pmatrix}  1 & 2 & 3 \\  4 & 5 & 6 \\  \end{pmatrix},  \bold{B}^{\mathrm{T}}=  \begin{pmatrix}  1 & 4 \\  2 & 5 \\  3 & 6 \\  \end{pmatrix}

画像屋さんなら,線形なフィルタをかけるときには縦方向にフィルタして横方向にフィルタすればいいのですが,実装的には横方向にフィルタして画像全体を転置してまた横方向にフィルタして転置して戻す方法のほうが効率的なことが多いです.特にGPGPUなどでは.

ということでよく使う転置というタスクですが,CUDAでやるにはちょっと工夫しないとメモリアクセス効率が下がります.今日のお題はそれで.

Continue reading

第20回 名古屋CV・PRML勉強会を開催しました

だんだん寒くなってきて体調崩さないか少し怖いです.深海魚になれば温度は安定しているのになと思うと地上生活もラクじゃありませんね.

さて,先日2012/10/20に,第20回 名古屋CV・PRML勉強会を開催いたしました.

概要

内容

  • @sakanazensen(ぼくです):高専プロコンとComputer Vision

    • 今年の高専プロコン競技部門で出されたタスクがCVに関するものでした
    • いままでもそういうのあったので,非常に若い(10代中頃〜)のひとがCVに興味を持ってやってくれてることを紹介したくて発表しました
    • 資料は未許諾の画像の引用があるので,非公開です>< すみません・・・
  • @yasutomo57jpさん:背景モデリングに関する研究紹介

    • 発表資料資料
    • 定点カメラ映像から背景画像を推定する

      • 定点カメラ映像と言えども照明変動や木の揺れなどの変動を含むので,ロバストな背景推定は難しい問題だったりするわけです
    • 高専時代の卒論には背景差分を使ってて,背景画像の自動推定・更新をやってました

      • その時使った手法としては今回の話で分類すると「確率分布に基づく手法」になりますね
    • D論の関連研究紹介
    • 個人的で恐縮ですが,今回初めてお互い認識してお会いできたのが非常に嬉しかったです
  • @takminさん:Deep Learningに関する研究紹介

    • Building High-level Features Using Large Scale Unsupervised Learning
    • 大規模物体認識コンテストILSVRCで黒船のごとくやってきたDeep Learning,それに関する論文の紹介
    • 生の画素データを入力して,ニューラルネットで低次の特徴から徐々に高次の特徴に反応するネットワークを組む

      • 最上位でどのニューロンが生起したかでclassifyができるよ!という手法
    • とにかく規模がえげつない.
    • googleさんスゲー…
    • ただ,特徴抽出からの識別というオーソドックスな枠組みを一夜にして時代遅れにするものではなくて,DeepLearningの知見を生かしたHand-craftedな特徴量設計というアプローチが今後はでるはず
  • 高橋さん:ECCV2012報告

    • 今月開催されたばかりのトップ会議ECCV2012の参加報告
    • 採択率の話や,投稿数の話など
    • 面白そうだった研究など

      • 問題設定の新しさなどのアイデアでけっこう勝負できるということを再確認できましたね

懇親会

発表者4人(これ自体はたまたま)で懇親会(反省会ともいう?w)をしました.
ちょっと印象的だったのは, ちょっと印象的だったのは,機械学習の人が黒船が如くやってきて,CVをやっていた人たちが生き残るにはどうしたらいいんだろう?という話でした.機械学習の人が黒船が如くやってきて,CVをやっていた人たちが生き残るにはどうしたらいいんだろう?という話でした.
インタフェースの分野や制御の分野に進出することはひとつの生き方だし,機械学習の人がやってくるなら自分たちが機械学習の人になるというのもあるね,というかんじに.

(そもそも,たぶんこういうテリトリー思考すらも既に古い考えなのでしょうね.)

振り返って

今回は最先端なお話ばかりということで本当に楽しませていただきました.
僕個人としては発表内容の理解度がいつもよりよかったように思います.発表者の方の説明が大変わかりやすかったのもありますし,ここ最近けっこう勉強してきたのが生きたかな,とか思っておりますw

勉強会自体はいつの間にか20回を数えるまでになりましたね.ここまで来れたのもみなさんのご協力あってのことで大変感謝しております.

今回は発表者確保に手間取ってしまった故に告知が遅れてしまい,参加者は少なめ…かな?と思いきや,実際に開催してみるとけっこうな数の方に来ていただけました.
反省点は反省点として取っておくとして,それでも内容の濃さももちろん皆様からの質疑も結構活発でいいかんじだったんじゃないかなと思ってます.

あと,発表者の方の時間感覚が素晴らしくて,予定のタイムテーブルから3分とズレることなく最後までいけました.大変ありがたいことです.
僕自身は「これで時間使いきれるのかな?><」くらいの感覚でちょうどいいんだなと実感しましたw

無理を言って発表していただきました@yasutomo57jpさん,@takminさん,高橋さん本当にありがとうございます.
いつも場所をお貸しいただいてる中部大の藤吉先生(@hf149さん)やustしていただいた@fararrow9先輩にもこの場を借りて感謝いたします.

次回について

次回は2012/11/17(土)の予定です.
中部大・中京大の学生さん(配属前?)が多く来られるかもしれない,とのことです.
テーマは未定ですが,ここのところ最先端の研究紹介が続いたこともありますし,この際だからアプリケーションの紹介やCVの可能性の話などattractiveな内容にしてもいいかもな〜などと考えております.

実は次回の開催は,第1回勉強会開催から2周年ということになります.なにかそれに関しても考えてみようかな(・∀・)

OpenCVの二値画像からの画素値の取得でハマった

OpenCVの画像形式cv::Matはいろんな格納方式ができて,二値画像ももちろんいけるんですが,画素値を個別にアクセスするときのやり方でうっかりしたミスでハマってしまいました.

ということで自虐を兼ねてメモ.(逆では

//画像を読み込む
cv::Mat img = cv::imread("fugafuga.png", CV_LOAD_IMAGE_GRAYSCALE);

//大津の方法で二値化.こうすると二値画像のフォーマットでMatに格納してくれます
//srcとdstが一緒ですが一応問題ないです
cv::threshold(img, img, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

//全画素をPGMフォーマットで出してみる
std::cout << "P1" << std::endl;
std::cout << img.cols << " " << img.rows << std::endl;
for(int y = 0; y < img.rows; y++)
{
    for(int x = 0; x < img.cols; x++)
    {
        //std::cout << img.at<int>(y, x) << " ";    //まちがい!!
        std::cout << static_cast<int>(img.at<unsigned char>(y, x)) << " ";
    }
    std::cout << std::endl;
}

at<int>()はカラー画像のBGRAをごそっと取り出すとき用だったりするので,二値画像の画素値を出すときはat<unsigned char>()を使いましょうというお話でした.static_castはべつにせんでもええです.
ちなみにat<int>()でやると事実上のゴミが出てきます.
何をいまさらこんなところでつまづいてるのか小一時間問い詰めたい.

Tesseract OCRのUbuntuでのインストール手順

オープンソースOCRライブラリのTesseract OCRをUbuntu 11.10に入れる手順です.

最近ネタが無いのでずっと昔のメモを掘り起こして記事にしてみたw

インストール手順

http://code.google.com/p/tesseract-ocr/downloads/listから最新版(tesseract-3.01.tar.gz)をダウンロードしてから,

% sudo apt-get install m4 autoconf libtool libleptonica
% tar xf tesseract-3.01.tar.gz 
% cd tesseract-3.01
% ./autogen.sh
% ./configure
% make
% sudo make install
% tesseract --version
tesseract 3.01

他のLinuxディストロの場合も最初のapt-getの行を適切に置き換えるだけでよいと思います.

make時にエラーが出たら,viewer/svutil.cppの頭に

#include <unistd.h>

を追加してmakeしなおすといけます.

Tesseract OCRについて

Tesseract OCRについては@takminさんの資料
Tesseract OCRに触ってみた (2011/07/19 JapanCV発表資料)- takminの書きっぱなし備忘録
がおすすめです.

JapanCVは昨年2011年に開催されてて僕も行きましたが最高のイベントでした.
さかな前線 » 全日本CV勉強会に参加しました.ついでに少ししゃべりました.
という宣伝(を

OpenCV+IPP

Linux版OpenCVを,30日限定評価版のIPP付きでビルドする手順.
IPPとはマルチメディア処理ライブラリIntel Performance Primitivesのことで,intel製CPUを使ったマシンにおいてタスクによって2倍から10倍の性能向上があるとのこと.
事例をぐぐったかんじ,それほど誇張のある数字でもなさそう.

IPPのダウンロードとインストール
  1. http://software.intel.com/en-us/articles/intel-ipp/からダウンロード

    1. 登録が必要になります
    2. ライセンスファイルを添付したメールが届きます
    3. 僕はx86なので現在最新のl_ipp_7.0.7.319_ia32.tgzを落としました
  2. IPPのインストール

    1. 落としたアーカイブを展開
    2. % sudo ./install.sh
    3. あとは質問に答えるだけ

      1. ライセンスファイルのフルパスを入力するところがあります
      2. 正式サポート対象外のディストロの場合(Ubuntu等)では警告されますが無視で
OpenCVのインストール
  1. http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/からダウンロード
  2. 展開
  3. 展開した中に”release”ディレクトリを作成
  4. そこにcd
  5. % cmake -D WITH_IPP=ON -D IPP_H_PATH=/opt/intel/ipp/include -D BUILD_SHARED_LIBS=OFF ..

    1. IPP関連のオプションだけつけた例です

      1. 最後のオプションがないとリンクエラーでます(´・ω・`)
      2. http://stackoverflow.com/questions/10508926/opencv-fails-to-build-with-ipp-support-enabled
    2. 必要に応じて他のオプションもつけて
  6. % make -s -j8
  7. % sudo make install

ついでに,OpenCVビルドのときのオプション全体
% cmake -D WITH_TBB=ON -D WITH_IPP=ON -D IPP_H_PATH=/opt/intel/ipp/include -D BUILD_SHARED_LIBS=OFF -D WITH_FFMPEG=OFF ..

  • TBB使います(objdetectとかimageprocモジュールの中とかで使ってるみたい)
  • FFMPEGがあるとなんかエラーでるので><
  • OpenMPはもはや使われない,んだそうですね.haartrainingの中ではふつーに使ってるんですが
IPPのライセンスの話

IPPを展開した場所にあるlicenseファイルとかNon-Commercial Software Download – Intel® Software Networkにあるとおり,非商用利用においては無料でライセンスを提供して頂けるそうです.
(ライセンスは変更される場合があります.自分で利用される際に再確認をお願いいたします)