アプリなどを開発するブログ

React Native / Swift / Ruby on Railsなどの学習メモ。


Deviseでサインイン後に新しいsession idを取得する

deviseのcontrollerでログイン処理を書く時、

sign_in(user)

しても、sessionのidは更新されません。
actionの処理を抜けると初めて更新されます。

調べてるとこれが出てきました。
stackoverflow.com

で、この記事が参照してるのがこちら。
stackoverflow.com

2つの記事をまとめるとこんな感じ

class SessionsController < Devise::SessionsController
  def create
    self.resource = warden.authenticate!
    sign_in(resource_name, resource)
    commit_session_now!
    render json: { session_id: session.id }
  end

  private

  def commit_session_now!
    return unless request.session_options[:renew]

    session_data = session.to_hash.delete_if { |_k, v| v.nil? }
    session_store.send(:set_session, env, session_id, session_data, request.session_options)

    request.session_options[:renew] = false
    request.session_options[:id] = session_id
  end

  def session_store
    @session_store ||= request.session_options.instance_variable_get('@by')
  end

  def env
    @env ||= request.session_options.instance_variable_get('@env')
  end

  def session_id
    @session_id ||= session_store.send(:destroy_session, env, session.id || session_store.generate_sid, request.session_options)
  end
end

採用すべきでないやり方ですが、こんなのもありました。
319ring.net

おまけ

Railsガイドのセキュリティ対策に関するページ。
読み応えありますね。 Railsのセキュリティ | Rails日本語ドキュメント | Ruby STUDIO

【OpenCV バグ】i2 >= 0 && i2 < static_cast<int>(keypoints2.size()) in function drawMatches

動画からリアルタイムでBruteForceMatcherでオブジェクトを検出しようとしていて、
cv::drawMatchesで以下のエラーが出て困り果てていました。

i2 >= 0 && i2 < static_cast<int>(keypoints2.size()) in function drawMatches

バグとのことでした。 answers.opencv.org

検出対象画像とカメラ画像の順番を入れ替えるとうまくいくとのこと。
私の環境でも無事動きました。

XCode 7.3で黒背景の時でもカーソルを見やすく

7.3からbetter-xcode-ibeam-cursorが使えなくなってしまいました。

カーソルファイルの位置が変わったのが原因のようです。
以下のパスにあるファイルを、以下のファイルAssets.car に差し替えればOKです!

/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Versions/A/Resources/Assets.car

https://github.com/egold/better-xcode-ibeam-cursor/files/185722/Assets.car.zip

参考

iOSで局所特徴量AKAZEを使うまとめ

AKAZEを使って局所特徴量抽出、記述、マッチングをやってみます。
そのための勉強記事まとめ。

qiita.com

dronebiz.net

astertune.com

iOSでのAKAZE最適化

GitHub - pablofdezalc/akaze: Accelerated-KAZE Features

AKAZEで取得したのをfindHomographyでゆがみ取得する

qiita.com

[おまけ]ORBだとこちらが参考になる

pukulab.blog.fc2.com

OpenCV3.0のtraincascadeコマンドでLBP指定できない問題

分類器を作ろうとして./opencv_traincascadeコマンドに -featureType LBP を渡すと、永遠にプロセスが進まない問題。

こちらに解決策が。 github.com

openCVインストール時に、コードを並列実行するためのtbbも一緒にインストールしないといけなかったみたい。
一度OpenCVをアンインストールして、以下で再度インストール。

brew install opencv3 --with-tbb

これでOK。

LBPは学習速度がHAARに比べて非常に早く、ありがたいです。

【OpenCV3】複数の正解画像を自分で集めて物体検出器を作る(Mac)

精度の高い物体検出器の作成をしたくて、色々試しております。

前回の記事

source.hatenadiary.jp

前回は一枚の正解画像から検出器を作成しましたが、
今回は対象を数枚写真に撮り、そちらで検出器をつくります。
また、createsampleやtraincascadeコマンドの別のオプションも試してみます。

複数の正解画像をテキストファイルに書き出す

find pos/ts1 -name '*.png' -exec identify -format '%i 1 0 0 %w %h\n' {} \; > pos_ts1.txt

サンプルファイルの作成

./opencv_createsamples -info pos_ts1.txt -vec vec/ts1.vec -num 6 -w 40 -h 40

分類器の作成

 ./opencv_traincascade -data cascade/ts1/ -vec vec/ts1.vec -bg nglist.txt -numPos 5 -numNeg 2900 -w 40 -h 40

OpenCV3を使って1枚の正解画像から物体検出器を作成する(Mac)

前回のOpenCV3.0インストールに引き続き、
今回はOpen CV 3を使って物体検出器を作っていきます。

以下の記事を参考にさせていただきました。ありがとうございます。
www.pro-s.co.jp

使用しているのが古いバージョンのようで、OpenCV3と比べてパスなどが異なる箇所があったため備忘録としてメモしていきます。

1. 作業ディレクトリを作る

どこでもいいので作業ディレクトリを作ります。

Users/username/Desktop/traincascade/

さらにこの中に以下のディレクトリを作ります。

  • pos(正解画像を保存するフォルダ)
  • vec(正解画像ベクトルファイル用フォルダ)
  • neg(不正解画像を保存するフォルダ)
  • cascade
  • cascade/trained_data (分類器用フォルダ)

2. 必要なファイルをディレクトリに入れる

  • pos/ の中に正解データ画像を入れます。
pos/image.png
  • neg/ の中に不正解画像を入れます。
neg/1.png
neg/2.png
neg/3png
...

3. opencv_createsamples コマンドでベクトルデータ作成

3000枚の画像を作ってみます。

$ ./opencv_createsamples -img ./pos/image.png -vec ./vec/image.vec -num 3000 -bgcolor 255 -maxidev 40 -maxxangle 0.8 -maxyangle 0.8 -maxzangle 0.5

4. 不正解画像一覧ファイルの作成

$ ls neg | xargs -I {} echo neg/{} > nglist.txt

5. 分類器ファイル作成

./opencv_traincascade -data ./cascade/trained_data/ -vec ./vec/image.vec -bg nglist.txt -numPos 2400 -numNeg 100

-numPosにはcreatesamplesで作成した枚数の8割の数を指定。
-numNegにはneg/ に入っている画像の枚数を指定。

以下のデータが分類器になります!

cascade/trained_data/cascade.xml

ちなみに公式ドキュメントはこちらです。

Cascade Classifier Training — OpenCV 3.0.0-dev documentation

より精度の高い分類器を求めて

次回はこちらのスライドを参考に、より精度の高い分類器を作っていきます。

ちなみにこちらを使えば精度が測れるとのこと。 OpenCV Computer Vision Library ()