課題いっぱいありますが,1回で全部終わらせようという意図ではありません. 自分で進められるひとはどんどん先へ進めたらよいですが.
顔画像
TLAB の GoogleDrive の sjs2017 ディレクトリ内に,次の二つのファイルがある.
これらをダウンロードし,tar コマンドを使って展開しなさい.展開の仕方は, 研究室内のページ http://www-tlab.math.ryukoku.ac.jp/tlab/index.php?data 参照
ヒント:
>>> for i in range(10): ... print('hoge%03d.png' % i)
face100 と cat131 の全ての画像の平均画像を求めるプログラムを作りなさい.両者で画像の大きさが異なるので,どちらかをもう一方のサイズにあわせるように作ろう.
課題Bと同じことをするプログラムを,今後のことを意識したスタイルで作り直そう.
全ての画像データを大きな2次元配列(データ数 x 画素数)に読み込むようにする.とりあえず,今回のデータで動作すればよいとして,以下に示すようにデータ数や画素数は直接プログラムに書いてしまってよい.
N = 231 # データ数 D = 96 * 96 # データの次元数 X = np.empty( ( N, D ) ) # 画素値を入れる2次元配列 y = np.empty( N, dtype = int ) # 種別を表す数を入れる for i in range(131): img = ... 猫画像を読み込んで画像サイズを (96,96) に変更 X[i, :] = img.reshape( -1 ) reshape の引数を -1 とすると,代入先に合わせてくれる y[i] = 0 for i in range(100): 人の顔画像を読み込む X[131+i, :] = ... y[131+i] = 女性なら 1, 男性なら 2
種類ごとの平均を求め,次のような配列に代入する.
Xm = np.empty( ( 3, D ) ) # 3つの平均を入れるための配列
以下を参考にすると,for i in range(3) の中に1行でできちゃうでしょう.
In [11]: X = np.arange(12).reshape( (4,3)) In [12]: X Out[12]: array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11]]) In [13]: y = np.array( [ 0, 2, 1, 0 ] ) In [14]: y Out[14]: array([0, 2, 1, 0]) In [15]: y == 0 Out[15]: array([ True, False, False, True], dtype=bool) In [16]: X[y==0, :] Out[16]: array([[ 0, 1, 2], [ 9, 10, 11]]) In [17]: X[y==1, :] Out[17]: array([[6, 7, 8]]) In [18]: np.sum(X[y==0,:],axis = 0) Out[18]: array([ 9, 11, 13])
Xm を3つの画像としてファイルに保存する.
Xm[i, :].reshape( (96, 96) )