機械学習を用いて顔認識したいとき、顔の画像データが大量に必要になります。しかし手元に少量しかない時、データを増やすことをやるそうです(Data Augmentation)。その手法の一つに画像を微妙に回転させるやり方があります。OpenCVを使って画像を回転させてみます。
warpAffineを使う
def getRotateImage(img, angle): original_width, original_height = img.shape[:2] size = original_width matrix = cv2.getRotationMatrix2D((size / 2, size / 2), angle, 1.0) rotated_img = cv2.warpAffine(img, matrix, (size, size)) return rotated_img
warpAffineを使ってアフィン変換を使えばできます。
回転させて画像を表示
for delta_angle in range(-15, 15, 5): rotated_img = getRotateImage(croppedFace, delta_angle) plt.imshow(cv2.cvtColor(rotated_img, cv2.COLOR_BGR2RGB)) plt.show()
croppedFaceはcv2.imreadした配列です。
結果
回転していることがわかりやすいように、range(-150, 150, 50)でやってみます。回転できました。
データ拡張では回転量は微量で良いのではないかという予想してます(まだ実践していないのでわからない)。