ysku's blog

ウェブ・無線通信・組み込みとか

ローディング画面の実装【CakePHP, jQuery BlockUI Plugin】

f:id:yusuke1581:20141112005253j:plain
CakePHPで実装しているシステムにおいて、画面遷移の際の処理に時間がどうしてもかかってしまうため、ローディング画面を実装しました(ボタンをクリックして画面遷移をする際に、ローディング画面を表示させました)
今回は、jQuery BlockUI Pluginを使用しました
jQuery BlockUI Plugin

【環境】
CakePHP 2.5

【手順】
1)
jQuery BlockUI Pluginを手に入れてきます
ここからダウンロードしてきます
http://malsup.com/jquery/block/#download
ファイル名:jquery.BlockUI.js

2)
以下のディレクトリに移動させます
~/app/webroot/js

3)
基本的には他のページでも使用することを考えているので、次のファイルに以下を追加します
ファイル名:~/app/View/Layouts/default.ctp
(bootstrapを使用している場合は、default.ctpではなくbootstrap.ctp)

<?php echo $this->Html->script('jquery.blockUI.js'); ?>

4)
ローディング画面をElementとして作成します
Elementは再利用可能なパーツです
以下を参考にしてください
ビュー - 2.x

以下のディレクトリに移動します
~/app/View/Elements
ここでctpファイルを作成し、以下を書き込みます
ファイル名:blockUI.ctp

<script>
$(function(){
    $('#check').click(function(){
        $.blockUI();
    });
});
</script>

5)
表示させたい画面のctpファイルに以下を追加します

<?php echo $this->element('blockUI'); ?>

これだけで完了です
以上が、jQuery blockUI PluginのCakePHP上での実装の仕方になります

Haar-likeによる人物検出【OpenCV + Python】

次はHaar-likeによる人物検出を行いたいと思います
以下のサイトを参考にさせて頂きました
http://python-gazo.blog.jp/opencv/%E4%BA%BA%E6%A4%9C%E5%87%BA
http://python-gazo.blog.jp/opencv/%E4%BA%BA%E6%A4%9C%E5%87%BA

プログラム

# -*- coding: utf-8 -*-
import cv2
import sys

dataset_dir = u"/path/to/dataset/"
 
def haarlike():
    argv = sys.argv
    argc = len(argv)
    if (argc != 2):
        #引数がちゃんとあるかチェック
        #正しくなければメッセージを出力して終了
        print 'Usage: python %s arg1' %argv[0]
        quit()
    # 画像の読み込み
    img_name = dataset_dir + argv[1]
    im = cv2.imread(img_name)
    # 探索用の機械学習ファイルを取得
    cascade = cv2.CascadeClassifier("haarcascade_fullbody.xml")
    # 探索(画像,縮小スケール,最低矩形数)
    eye = cascade.detectMultiScale(im, 1.1, 3)
    
    # 検出した部分を長方形で囲う
    for (x, y, w, h) in eye:
        cv2.rectangle(im, (x, y),(x+w, y+h),(0, 50, 255), 3)
 
    # 画像表示
    cv2.imshow("Show Image",im)
    # キー入力待機
    cv2.waitKey(0)
    # 画像保存
    out_file_name = "after" + argv[1]
    cv2.imwrite(out_file_name,im)

    print u"saved"
    cv2.destroyAllWindows()

    #プログラムの終了
    quit()

if __name__ == '__main__':
    haarlike()

プログラムの説明
■実行方法
$ python [上記のプログラム名] [人物検出したい画像名]

■関数の説明
・CascadeClassifier:ファイルから分類器を読み込む
・detectMultiScale:入力画像中から異なるサイズのオブジェクトを検出する
検出されたオブジェクトは、矩形のリストとして返される

以上が、OpenCV + Pythonでの、簡単なHaar-likeによる人物検出の説明になります

HOG + SVMで人物検出【OpenCV & Python】

OpenCVで人物検出を行ってみました。
以下のサイトを参考にさせて頂きました
http://python-gazo.blog.jp/opencv/%E4%BA%BA%E6%A4%9C%E5%87%BA
http://python-gazo.blog.jp/opencv/%E4%BA%BA%E6%A4%9C%E5%87%BA

用語の確認
HOG
Histogram of Oriented Gradientsの略で、局所領域の輝度の勾配方向をヒストグラム化した特徴量
SVM
教師あり学習を用いる識別手法の1つであり、線形分離可能なN次元のデータを2クラスに分類する分類器

検出プログラム
以下のプログラムがHOGSVMを利用したプログラムです

$ python [以下のプログラム] [人物検出をしたい画像名]

とすることで実行出来ます

# -*- coding: utf-8 -*-
import cv2
import sys

dataset_dir = u"/path/to/dataset/"
 
def hog_func():
    argv = sys.argv
    argc = len(argv)
    if (argc != 2):
        #引数がちゃんとあるかチェック
        #正しくなければメッセージを出力して終了
        print 'Usage: python %s arg1' %argv[0]
        quit()
    # 画像の読み込み
    img_name = dataset_dir + argv[1]
    im = cv2.imread(img_name)
    # HoG特徴量の計算
    hog = cv2.HOGDescriptor()
    # SVMによる人検出
    hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
    hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05}
    # 人を検出した座標
    human, r = hog.detectMultiScale(im, **hogParams)
    # 長方形で人を囲う
    for (x, y, w, h) in human:
        cv2.rectangle(im, (x, y),(x+w, y+h),(0,50,255), 3)
    # 人を検出した座標
    cv2.imshow("Human detection",im)
    cv2.waitKey(0)
    # 画像保存
    out_file_name = "after" + argv[1]
    cv2.imwrite(out_file_name,im)
    print u"saved"

if __name__ == '__main__':
    hog_func()

プログラムの説明
以下のサイトから引用しています
Object Detection — OpenCV 2.4.13.7 documentation

・HOGDescriptor:HOGディスクリプタおよび検出器を作成
・setSVMDetector:線形SVM分類器に,係数をセットします
・detectMultiScale:検出窓サイズ可変で,物体検出を行います

以上が簡単なOpenCV + Pythonにおいての、HOG + SVMの人物検出の説明になります

OpenCV2.4.8の導入【Ubuntu14.04】

f:id:yusuke1581:20141119000801p:plain

Ubuntu環境で開発をすることになり、新しく環境を整える必要になったのでメモ
c言語開発だと時間もかかってしまいがちなので、今回はpythonを使用
pythonのバージョンは2.7

今回はOpenCVのバージョンに関しては特に気にしてはいなかったので以下の方法で

これだけ

$ sudo apt-get install -y python-opencv


公式サイトからダウンロードしてきて
Releases - OpenCV

以下のサイトの手順に従う
Installation in Linux — OpenCV 2.4.13.7 documentation

という方法もあったが、時間がかかり、面倒な部分があったので今回は使用しなかった

起案してみて【web サービス】

f:id:yusuke1581:20141117042157j:plain
来年からweb系の会社で働くわけで、それもありビジネスプランを考え、投資家の前で発表させてもらう機会がありました
1ヶ月以上にわたり社会人含む4人のメンバーで創案しましたが、結果的には受け入れてもらえませんでした
その過程や結果を得て、思ったところを4点ほど、次回の為にまとめておきました


f:id:yusuke1581:20141117042223j:plain
【サービス自体について】
次の2つのパターンである必要があると思いました
1)既存の市場に対して、比較的、技術面で優れたアプローチを持っている
2)その市場に精通している人だからこそ気づけるニーズに対する深い考察がある

1)に関しては最近話題になっているピーター・ティールの「ゼロ・トゥ・ワン―君はゼロから何を生み出せるか」
http://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%83%BB%E3%83%88%E3%82%A5%E3%83%BB%E3%83%AF%E3%83%B3%E2%80%95%E5%90%9B%E3%81%AF%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%95%E3%82%92%E7%94%9F%E3%81%BF%E5%87%BA%E3%81%9B%E3%82%8B%E3%81%8B-%E3%83%94%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%BB%E3%83%86%E3%82%A3%E3%83%BC%E3%83%AB/dp/4140816589
でも「プロプライエタリ・テクノロジー」として「2番手よりも10倍優れていなければならない」と言及されている
本書で紹介されている具体例でいうと、
・グーグルのアルゴリズム
・ペイパルの決済スピード
などである

2)に関しては、起案にあたってユーザの不便・不満(以下、「不」)などを解決するという形が主になるが、正直、現在世の中にある不は既存のサービスでほとんど解決されている
そのなかで新たに見つけるとするならば、普通の人が気づかない不を見つけるしかないと思います



f:id:yusuke1581:20141117042233j:plain
【ビジョンリーダーの存在】
今回の起案では、発表ありきで行った面がありました
そのため、メンバー構成が決まってからブレインストーミングをしてサービスのアイディアをまとめていきました
一般的な方法かと思われますが、この方法には2つのデメリットがあります
・サービスの方向性が見失われる
・コンセプトが決まるまでの時間がかかる

メンバー全員で話し合って決めると、お互いの意見を取り入れるとあらぬ方向に向かうことがあります
これは全員の共通認識がとれていないことが一因だと考えられ、共通認識をとるのに時間がかかる場合や、最悪、完成図が見えていないため共通認識がとれない場合というのもあります

そのため、私が今回で切に感じたのが、「ビジョンリーダー」の存在です
明確に実現したいサービスが見えており、それをメンバーに伝えられる人物が自分の考えるビジョンリーダーです
ビジョンリーダーはプロジェクトに次のような効果をもたらしてくれると考えています
1)たたき台を提供してくれる
2)提供されたたたき台により、何について話し合っているかが明確になり、議論が具体化する
3)議論が進むため、時間効率が高まる



f:id:yusuke1581:20141117042241j:plain
【客観的な視点を取り入れる】
当たり前のことかもしれませんが、客観的視点はかなり大事です
メンバーでの話し合いが進むにつれ、無意識的に視野が狭くなることがだれにでもあると感じています
こうなってくると客観性が失われ、本人たちが気づかなかった穴が埋められずに終わります
そのため、話し合いに客観性をもたらすことが必要です

この状況を防ぐ一般的な方法としては次のような物があります
・悪魔の代弁者
悪魔の代弁者 - Wikipedia

今回はこれを導入したのですが、上手く機能しませんでした
これを使用してみて次回は少しこの方法をアレンジしてみようと思いました
その方法としては、「悪魔の代弁者役の人にはあえて話し合いに参加させない」というものです
理由としては、この役をやるにあたり、話し合いの過程を知ってしまっていて、それゆえ思考が固定されてしまうと思われるからです
悪魔の代弁者に話し合いに参加させないことで、その人はサービスが出来た過程を知ることができません
さらにはまっさらな状態でその案を聞くことができます
これにより、「悪魔の代弁者」の効果があがるのではないかと思いました

またこの方法でなくとも、1)第3者に話し合いに参加してもらう、2)メンターに案を聞いてもらいフィードバックをもらうなどもかなり効果的だと思います



f:id:yusuke1581:20141117042249j:plain
【命を懸けられるか】
最後にして最重要な部分です
サービスに対するコミットが不十分な場合、そのプロジェクトは高い確立で失敗すると考えていいと思います
社内ベンチャーの成功率がベンチャーより低いと思われる最大の理由はここにあると言えるでしょう
当たり前ですよね、会社辞めてまでやってるわけですから一生懸命しないはずがありません
ただ、そういったリスクをいつも負うというわけにもいきません
そんな中、コミットメントを上げるためには次のような方法があるかなと思いました
・金銭的なリスクを負わせる
・目標設定&名言(FBに投稿するなど)


以上になります
次回起案するときにはこれらの点を踏まえて行ってみたいと思います
ブラッシュアップを加えていって自分なりの成功方法を確立していきたいと思います

openCV2.4のインストール【CentOS6.5 python】

f:id:yusuke1581:20141116031726p:plain

前回のpython2.7のインストールに続き、openCVを使うためインストールしました

python2.7をcentOS6.5にインストール - ysku's blog

以下のサイトを参考にさせて頂きました
2014-10-09

【環境】
CentOS 6.5
python 2.7
openCV

【手順】
1)次のサイトからopenCV 2.4のzipファイルをダウンロードしてくる
Releases - OpenCV

2)zipファイルを解凍する

# unzip opencv-2.4.9.zip

3)cmakeがない場合はインストールする

# yum install -y cmake

4)インストール

# cmake CMakeLists.txt
# make
# make install

5)使ってみる

import cv

を書いたpythonファイルを作成する

試しに実行すると

ImportError: No module named cv

というエラーがはかれる

なんとかしようと思ったけど、面倒くさい...

6)結局、違う方法でインストール
少し調べてみると...

# yum install opencv-python

結局、これだけでできました

python2.7をcentOS6.5にインストール

centOS6.5に初期から入っているpythonのバージョンは2.6です
今回は
・python2.7
・easy_install
・pip
をインストールしようと思います

python2.7のインストール関しては、以下のサイトを参考にさせて頂きました

CentOS に Python2.7, Python3を入れたメモ - Qiita

1)ダウンロードして、展開する

# curl -O https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
# tar zxf Python-2.7.6.tgz

2)Python2.7のインストール
ディレクトリを移動

# cd Python-2.7.6

コンフィグレーション

# ./configure --prefix=/opt/local

ここでは、/opt/localにディレクトリを作成出来る権限の状態で実行する

インストール

# make && make altinstall

3)Easy_Installとpipをインストール
ここは以下のサイトを参考にさせて頂いた

いつの間にかpipのインストールが楽になってた件 - Qiita

よくわかってないのですが、
easy_install:パッケージ管理システムからPythonの モジュールを自動で検索してインストールやアップデートしてくれるツール
pip:パッケージソフトウェアをインストール・管理するためのパッケージ管理システム
という理解

# curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python

パイプ( | )のあとは「python」でよい
これで
・python2.7
・easy_install
・pip
のインストールが完了