第1回:OpenCVで顔認識
〇開発環境
windows10
python3.6
PyCharm Community Edition 2017.1.5
〇OpenCVの導入
サイト
opencv_python‑3.2.0+contrib‑cp36‑cp36m‑win_amd64.whlをインストール
②コマンドプロントを開き 以下のコマンドを実行でインストール完
1 |
pip install opencv_python‑3.2.0+contrib‑cp36‑cp36m‑win_amd64.whl |
〇安倍総理とトランプ大統領、その他の人物の識別
参考
①参考サイトのソースまるまるコピー、ファイル格納場所およびラベル取得位置(安倍総理:001、トランプ大統領:002が取得できるように)修正
・トレーニング画像で安倍総理画像5枚(画像命名:aaa_001_1.jpg、aaa_001_2.jpg~aaa_001_5.jpg)、トランプ大統領画像5枚(画像命名:aaa_002_1.jpg、aaa_002_2.jpg~aaa_002_5.jpg)
計10枚を格納
・テスト画像で安倍総理画像2枚(画像命名:bbb_001_1.jpg、bbb_001_2.jpg)、トランプ大統領画像2枚(画像命名:bbb_002_1.jpg、bbb_002_2.jpg)
計4枚を格納
②動かしたがエラー。。。
error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale
③調べたところHaar-like特徴分類器を取得するPathが間違っていることが判明
cascadePath = "haarcascade_frontalface_default.xml"
→cascadePath = "C:/~/opencv/sources/data/haarcascades_cuda/haarcascade_frontalface_default.xml"
④実行→動いてくれた!!
トレーニング画像で学習した結果、テスト画像4枚をそれぞれ認識してくれた
⑤ただ現状人の顔を認識→トレーニングした画像から似た画像を返す動き
・試しに話題の稲田元防衛大臣とオバマ元大統領を入れて実施してみるとトランプと返ってくる(稲田さんに失礼かな。。。)
・小泉進次郎衆議院議員だと安倍総理と返ってきてしまう
⑥さすがに稲田さんがかわいそうなので画像のラベルから一致しない場合はそれ以外と表示するように修正。
→稲田さん、オバマさん、小泉さんはその他で表示された。現状正解率100%
次週 特徴分類機を自作にチャレンジ
最後に今回のソースを張っておきます!この行数でできるのはすごいですね!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
#!/usr/bin/python # -*- coding: utf-8 -*- import os import cv2 import sys import numpy as np from PIL import Image # トレーニング画像 train_path = 'C:/Users/yuba/Desktop/catt' # テスト画像 test_path = 'C:/Users/yuba/Desktop/not_catt' # Haar-like特徴分類器 cascadePath = "C:/Users/yuba/Downloads/opencv/sources/data/haarcascades_cuda/haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeClassifier(cascadePath) # 顔認識器の構築 for OpenCV 2 # ※ OpenCV3ではFaceRecognizerはcv2.faceのモジュールになります # EigenFace recognizer = cv2.face.createEigenFaceRecognizer() # FisherFace #recognizer = cv2.face.createLBPHFaceRecognizer() # LBPH #recognizer = cv2.face.createLBPHFaceRecognizer() # 指定されたpath内の画像を取得 def get_images_and_labels(path): # 画像を格納する配列 images = [] # ラベルを格納する配列 labels = [] # ファイル名を格納する配列 files = [] for f in os.listdir(path): # 画像のパス image_path = os.path.join(path, f) # グレースケールで画像を読み込む image_pil = Image.open(image_path).convert('L') # NumPyの配列に格納 image = np.array(image_pil, 'uint8') # Haar-like特徴分類器で顔を検知 faces = faceCascade.detectMultiScale(image) # 検出した顔画像の処理 for (x, y, w, h) in faces: # 顔を 200x200 サイズにリサイズ roi = cv2.resize(image[y: y + h, x: x + w], (200, 200), interpolation=cv2.INTER_LINEAR) # 画像を配列に格納 images.append(roi) # ファイル名からラベルを取得 labels.append(int(f[4:7])) # ファイル名を配列に格納 files.append(f) return images, labels, files # トレーニング画像を取得 images, labels, files = get_images_and_labels(train_path) # トレーニング実施 recognizer.train(images, np.array(labels)) # テスト画像を取得 test_images, test_labels, test_files = get_images_and_labels(test_path) i = 0 while i < len(test_labels): # テスト画像に対して予測実施 label, confidence = recognizer.predict(test_images[i]) # 予測結果をコンソール出力 aaa = (test_files[i])[6:7] bbb = label if int((test_files[i])[6:7]) == label and label == 1: print("Test Image: {}, Predicted Label: {}, Confidence: {}".format(test_files[i], '安倍総理', confidence)) elif int((test_files[i])[6:7]) == label and label == 2: print("Test Image: {}, Predicted Label: {}, Confidence: {}".format(test_files[i], 'トランプ大統領', confidence)) else: print("Test Image: {}, Predicted Label: {}, Confidence: {}".format(test_files[i], 'それ以外', confidence)) print("Test Image: {}, Predicted Label: {}, Confidence: {}".format(test_files[i], label, confidence)) # テスト画像を表示 cv2.imshow("test image", test_images[i]) cv2.waitKey(300) i += 1 # 終了処理 cv2.destroyAllWindows() |