SIGNATEのDeepLearning入門〜画像分類編〜の学習を終えたので、主に自分が知らなかったことにつて知識定着のために記事を書いてみます。
まずはインプットとなる画像の処理について。
画像処理は自分は扱った経験がほとんどなく、基本的な内容からコーディングの上での勉強になりました。
画像を扱う際にはskimageライブラリを使用すると便利で、そのうちioモジュールによって画像を読み込んだり中身を確認する。
以下は機械学習のためによく使う画像処理。
- 画像の表示:subplotにて場所を確保し、imshowを使用(plt.subplot(1,2,1)→plt.imshow(img))
- 画像の切り出し:行列の範囲指定で可能 (img[100:200,300:400])
- 画像の反転:配列の反転と同じ発想(縦反転→img[::-1,:]、横反転→img[:,::-1])
- サイズ変更:transformモジュールのrisizeを使用 (transform.resize(img, output_shape=(100,100)))
- 回転:transformのrotateで左回転角度を指定(transform.rotate(img,angle=90))
- 平行移動:アフィン変換(※)を利用。AffineTransformで位置を定義してからwarpで移動 (x = transform.AffineTransform(translation=(40,40)) → transform.warp(img, x) )
- 複数ファイルを読み込む際にはglobを使用(files = glob.glob(“train_*.jpg”)→filesに対してimreadしていく)
※アフィン変換
アフィン変換は、幾何学的には、ベクトル空間上での一次変換(つまり、スケーリング、回転、反射など)の後に、平行移動を行う操作。
数学的には、アフィン変換は以下の形式の行列を使って表現される:
アフィン変換は、幾何学的には、ベクトル空間上での一次変換(つまり、スケーリング、回転、反射など)の後に、平行移動を行う操作。
数学的には、アフィン変換は以下の形式の行列を使って表現される:
[a b tx]
[c d ty]
[0 0 1 ]
aとdはスケーリング、bとcはシアリング(つまり、画像の「歪み」)を制御する。txとtyは平行移動(つまり、画像の「シフト」)を制御する。これらの操作は個別または一緒に行え、複数のアフィン変換は一つの変換に結合可能。これは、アフィン変換が行列により表され、行列の乗算が順番を問わないから。
画像処理の文脈では、アフィン変換は画像(2次元配列)の各ピクセルに対して実行され、新しい座標を計算する。したがって、元の画像のピクセル値を新しい座標に移動させることで、変換後の画像が生成される。ただし、新しい座標が整数でない場合(これは一般的によく起こります)、補間手法が使用される。
いったん以上ですが、今後画像処理で使用する知識が増えるに従い、この記事もアップデートしていきます。
そしてこの記事に関わらず、最終的に自分が新たに学んだことのすべてがこのブログにすべて詰まっている状態にできたらいいなと思っていますが、あまり気負い過ぎると続かないので無理のない範囲でやっていきます笑
間違いや誤解等も多々あると思いますが、コメント等でご指摘ください。