*SJS2016 ex05 [#f69bd8f1] 課題いっぱいありますが,1回で全部終わらせようという意図ではありません. 自分で進められるひとはどんどん先へ進めたらよいですが. #contents **これまでの分 [#kbc5dcd1] - 以前の分を全て報告してokをもらってから,今回分にすすみましょう. **課題A [#w83b99ab] 顔画像 TLAB の GoogleDrive の sjs2016 ディレクトリ内に,次の二つのファイルがある. - face100.tbz - cat131-png.tbz これらをダウンロードし,tar コマンドを使って展開しなさい.展開の仕方は, 研究室内のページ http://www-tlab.math.ryukoku.ac.jp/tlab/index.php?data 参照 **課題B [#n31e3ac2] ***step1 [#y5abd1ee] + cat131 の顔画像を読み込んでそれらの平均画像を求めるプログラムを作りなさい. -- ただし,cv2.imread() の引数について調べ,グレイスケール画像として読み込むようにすること + face100 の顔画像を読み込んでそれらの平均画像を求めるプログラムを作りなさい. -- cat131 と同じ ヒント: #pre{{ >>> for i in range(10): ... print('hoge%03d.png' % i) }} ***step2 [#n0b35841] face100 と cat131 の全ての画像の平均画像を求めるプログラムを作りなさい.両者で画像の大きさが異なるので,どちらかをもう一方のサイズにあわせるように作ろう. **課題C [#id5509f0] 課題Bと同じことをするプログラムを,今後のことを意識したスタイルで作り直そう. ***step1 [#g6b07044] 全ての画像データを大きな2次元配列(データ数 x 画素数)に読み込むようにする.とりあえず,今回のデータで動作すればよいとして,以下に示すようにデータ数や画素数は直接プログラムに書いてしまってよい. #pre{{ 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 }} ***step2 [#c1dac5e2] 種類ごとの平均を求め,次のような配列に代入する. #pre{{ Xm = np.empty( ( 3, D ) ) # 3つの平均を入れるための配列 }} 以下を参考にすると,for i in range(3) の中に1行でできちゃうでしょう. #pre{{ 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]) }} ***step3 [#oeb96c8e] Xm を3つの画像としてファイルに保存する. Xm[i].reshape( (96, 96) ) Xm[i, :].reshape( (96, 96) )