課題いっぱいありますが,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) )