1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Re:ゼロから始める物体認識 その2 実際に動くものを作っていく

Posted at

#前回
この記事は
Re:ゼロから始める物体認識 その1 導入と環境構築 https://qiita.com/FcAqx/items/7e7d553b274300276967
の続きとなります。

#はじめに
お久しぶりです。なんとかにどめのこうしんをすることができました。
かなり時間が空きましたがこの間何をしていたかというと~~学生として最後の春休みを満喫していました。~~統計学的声質変換というものに挑戦しているのですがなかなか資料が少なく苦戦しています。そちらの方も後々共有できればな、と思います。
前回は物体検出に必要な環境構築をしていきました。
今回は実際にある程度動くものを作っていきたいと思います。

OpenCV

OpenCVはPythonで顔検出をする際に最も有名なライブラリです。
顔検出の他に目の検出などもすることができる非常に優れたライブラリです。
今回の最終的な目標は自分で顔検出のモデルを作っていくことなのでOpenCVで顔検出をすることがゴールではないのですが、
実際に手元で顔検出が動く物ができるとそれはそれでテンションが上がるので一度OpenCVを使ってみたいと思います。
既存のライブラリは自分で作った物の性能を確かめる上でひとつの指標となりますし、動くものがひとつあるだけでモチベーションに繋がり易いので僕は作ろうとしているものと近いものがあれば触るようにしています。

OpenCVを使うようにするにはAnaconda Promptでインストールコマンドpip install opencv-pythonを入力します。
これからPythonでこのようなパッケージをインストールする場合は毎回Anaconda Promptからコマンドを入力します。

それでは実際にコード入力し、動かしてみましょう。

TestCV.py
#coding: utf-8

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import cv2

# 分類機のパス
# Anaconda3をインストールした場所にあるので必要に応じて変えてください
cascade_path = "haarcascade_frontalface_default.xml"

# 判定したい画像のパス
images = ""



# 画像の読み込みをする
def read_img(img_path):
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    return img


# 顔を検出
def detect_face(image_path, cascade_path):
    img = read_img(image_path)
    width = img.shape[1]
    height = img.shape[0]
    img = cv2.resize(img, (width, height))
    # グレー画像に変換
    gry = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    # 判定モデルを指定して顔判定を実行
    cascade = cv2.CascadeClassifier(cascade_path)

    # ここの引数のそれぞれの意味はしっかりと確認しておいたほうが使いやすいと思います
    # [OpenCVのリファレンス](http://opencv.jp/opencv-2.2/py/objdetect_cascade_classification.html)
    facerect = cascade.detectMultiScale(
        gry, scaleFactor=1.11, minNeighbors=20, minSize=(30, 30))
    dst_img = []
    if len(facerect) > 0:
        color = (255, 0, 0)
        for rect in facerect:
            x = rect[0]
            y = rect[1]
            w = rect[2]
            h = rect[3]

            add_image = cv2.resize(img[y: y+h, x: x+w], (64, 64))
            dst_img.append(add_image)

            cv2.rectangle(img, tuple(rect[0:2]), tuple(
                rect[0:2]+rect[2:4]), color, thickness=2)
        # 画像の表示
        plt.imshow(img)
        plt.show()
    else:
        print("顔が認識できませんでした")


detect_face(images, cascade_path)

上のコードを実行すると

image.png

このように顔の部分を検出することができます。
OpenCVではこれ以外にも目や鼻の検出もすることができるので興味のある方は試してみるといいと思います。

おわりに

今回はライブラリを使って顔検出をやってみました。
これで作りたいものがとりあえず手元で動くものとなったので目標としやすいのではないかと思います。
次回はこれを自分で作るために必要な素材集めなどの準備をしていきたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?