MATLAB DataHash

これは ████████ Advent Calender 4 日目の記事です.

画像からの特徴抽出に時間がかかるようになってきた

研究で画像分類とかやってるんですけど,特徴抽出を当初実験のたびにやらせてた.当初から抽出した生の特徴をキャッシュしたほうがいいとは思ってたんですけど,初期の段階ではそれを実装するコストとほかの部分の実装を遅らせることを天秤にかけると後者のほうが重要だったので,とりあえず気にしてなかった.

そのうち実装が落ちついてきて,畳み込み応答とかも特徴に使おうとかしていると特徴抽出の計算コストがバカにならなくなってきて,いいかげんキャッシュ実装しよう,という気持ちになってきた.

困ったポイント

データセットに対して特徴の組が 1 通りであれば適当にデータセットの名前でもつけて保存しておけばよかったんですけど,いろんな特徴のとり方を試したかったのでそういうわけにいかなかった.

どの特徴を使うか,だけでよければ charcell に入れてたのでそれを繋げてファイル名に付加するとかすればよさそうな話なんですけど,畳み込み応答のパラメータとかもあったりして,これは単純に文字列に変換すると破滅しそうな予感がしたので設定を詰めた struct のハッシュを作ったりできないかな,と思った.

MATLAB は Java ベース

実はそういうことがあったりして MATLAB から Java のクラスライブラリが呼べたりする.”matlab hash” とかで検索すると Java のクラスライブラリから SHA-1 を計算する関数を呼ぶ,とかいう方法が提案されていたりした.

ただ struct を渡すことはできないし,MATLAB レベルでもついてくる関数群に任意の MATLAB オブジェクトからハッシュ計算するみたいなものはないっぽかった.

神は File Exchange に宿る

File Exchange で DataHash という関数をアップロードしてくれてる人がいて神だった.

>> info.features = {'R', 'G', 'B', 'Ix', 'Iy', 'Ixx', 'Iyy', 'gabor'};
>> info.gabor = gabor(2.*(1:5), [0, 45, 90, 135]);
>> DataHash(info)
ans =
e44567273915306e8d6901a4c211be2e
>> info.gabor = [];
>> DataHash(info)
ans =
88c11717ee91f463ee7979408bfba855
>> info.features = {'R', 'G', 'B', 'Ix', 'Iy', 'Ixx', 'Iyy'};
>> DataHash(info)
ans =
e728011d3ef6d0453889870273316fdf

あとはこのハッシュをファイル名に入れて保存すればいいし,この特徴を保持したファイルがあるかどうかもハッシュ作ってファイル検索すればわかる.

まとめ

  • DataHash で任意の MATLAB オブジェクトのハッシュ値を求められる
  • ほかのひとはこういう実験に必要なデータの整理とかってどうやってるんだ……
comments powered by Disqus