SJS2017 ex04

課題いっぱいありますが,1回で全部終わらせようという意図ではありません. 自分で進められるひとはどんどん先へ進めたらよいですが.

これまでの分

課題A

顔画像

TLAB の GoogleDrive の sjs2017 ディレクトリ内に,次の二つのファイルがある.

これらをダウンロードし,tar コマンドを使って展開しなさい.展開の仕方は, 研究室内のページ http://www-tlab.math.ryukoku.ac.jp/tlab/index.php?data 参照

課題B

step1

  1. cat131 の顔画像を読み込んでそれらの平均画像を求めるプログラムを作りなさい.
    • ただし,cv2.imread() の引数について調べ,グレイスケール画像として読み込むようにすること
  2. face100 の顔画像を読み込んでそれらの平均画像を求めるプログラムを作りなさい.
    • cat131 と同じ

ヒント:

>>> for i in range(10):
...    print('hoge%03d.png' % i)

step2

face100 と cat131 の全ての画像の平均画像を求めるプログラムを作りなさい.両者で画像の大きさが異なるので,どちらかをもう一方のサイズにあわせるように作ろう.

課題C

課題Bと同じことをするプログラムを,今後のことを意識したスタイルで作り直そう.

step1

全ての画像データを大きな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

step2

種類ごとの平均を求め,次のような配列に代入する.

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])

step3

Xm を3つの画像としてファイルに保存する.

Xm[i, :].reshape( (96, 96) )

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS