画像・音声処理

画像処理をPython&OpenCVで学ぶ!顔検出の実装に挑戦

画像処理の自動化にはPythonがおすすめです。Pythonを学び始めている方のなかには、下記のように疑問がある方も多いのではないでしょうか。

  • Pythonで画像処理をしたいけど、何ができるのかイマイチわからない…
  • OpenCVが良いって聞くけど、ほかのライブラリじゃできないの?

今回は、OpenCVでできることやOpenCV以外で画像処理ができるPythonライブラリをまとめました。また、PythonとOpenCVを組み合わせた「顔検出」プログラムの実装手順も解説します。本記事ではOpenCVの魅力を理解したうえで、実装内容を確認できます。

Pythonで画像処理をしたい方は、ぜひ最後までご覧くださいね!


本ブログを運営しているTech Teacherは、
プログラミング家庭教師サービスを運営しています。
完全マンツーマン・フルオーダーメイド
あなたが必要な指導を提供します。

画像処理をPythonで行うなら「OpenCV」がおすすめ!

画像処理をPythonで行うなら、「OpenCV」が最もおすすめです!

OpenCVとは、オープンソースのコンピュータビジョンライブラリのことです。

PythonやC++など、さまざまなプログラミング言語で使用できます。

【1分でわかる】初心者でも簡単にOpenCVで画像認識の実装ができるやり方を学ぶ!OpenCVで画像認識をしてみようとお考えの方に向けて、OpenCVを使ってそもそも何ができて、何のためにそのようなことをするのかを解説します。そして初心者でも簡単にPythonで画像認識を実行する手法を見ていきます。実際にコードを示しながら進めているので、一緒に手を動かしながら学べます!...

おすすめする理由は、画像認識や描画用のライブラリがたくさん収録されているため、OpenCVだけで処理できることが多いからです。

では、これから具体的にどのようなことができるのかを紹介します。

OpenCVでできること

OpenCVでは、検出・画像内への描画・前処理・ファイル処理など、画像処理に関するあらゆることができます。下記の表でできることの例をまとめたので、チェックしてみてくださいね!

処理項目 具体例:ライブラリ名
オブジェクト検出系 ・顔や物体検出:cv2.CascadeClassifier

・物体追跡:cv2.TrackerMIL_create

・エッジ検出:cv2.Canny

画像内への描画系 ・線:cv2.line

・矢印:cv2.arrowedLine

・マーカー:cv2.drawMaker

・円:cv2.circle

・楕円:cv2.ellipse

・長方形や正方形:cv2.rectangle

・文字:cv2.putText

前処理系 ・リサイズ/応用するとモザイク処理も可能:cv2.resize

・回転:cv2.rotate

・ぼかし処理:cv2.blur

・2値化:cv2.threshold

・色空間変換:cv2.cvtColor

ファイル処理系 ・読み込み:cv2.imread

・保存:cv2.imwrite

・ヒストグラム作成:cv2.calcHist

・カラー画像出力:cv2.imshow

機械学習系 ・サポートベクターマシン:cv2.ml.SVM_create

・K近傍:cv2.ml.KNearest_creat

・ニューラルネットワーク:cv2.ml.ANN_MLP_create

OpenCVでは、画像の前処理から機械学習まで可能です。なお、検出系や描画系の詳しい実装方法は下記を参考にしてみてくださいね!

Python + OpenCVで画像処理をマスター!使用法・実用例を解説Python初心者の方でOpenCVの使い方について悩んでいる人必見。OpenCVの基礎知識やインストール方法、使い方を網羅しました。OpenCVを使用した画像動画処理について悩んでいる人は参考にしてください。...

【OpenCV以外】画像処理ができるPythonライブラリは?

Pythonでは、OpenCV以外にも画像処理で使えるライブラリがあります。OpenCV以外で、画像処理ができるPythonライブラリは下記の2つです。

Pythonライブラリ名 特徴
NumPy ・数値計算用のライブラリ
・多次元配列の処理やソート、平均・最大値の取得など、あらゆる数値計算をサポートしている
Pillow ・簡単な画像処理ができるPython用の画像処理ライブラリ
・リサイズや回転、トリミングが可能

OpenCVとNumPy、Pillowそれぞれで、同じ出力内容でもコードの書き方が大きく異なります。例えば、画像を回転させるコードは、下記のように違いがあります。

Pythonライブラリ名 回転コードの書き方
OpenCV cv2.rotate(回転させる画像, 回転角度)
角度指定:cv2.ROTATE_90_CLOCKWISE・cv2.ROTATE_180など
NumPy np.rot90(回転させる画像, 90度回転させる回数)
Pillow 回転させる画像.rotate(回転角度)

では、OpenCVとNumPy、Pillowを比較するために、画像を回転させるコードをまとめて見てみましょう!実行環境は「Google Colaboratory」です。

# OpenCVバージョンの画像回転コード =====
import cv2

# 1.画像の読み込み
img = cv2.imread("/content/Lenna.png")

# 2.90度回転
opencv_90rotate = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)

# 3.画像保存
cv2.imwrite('opencv_90rotate.jpg', opencv_90rotate)

# Numpyバージョンの画像回転コード =====
import numpy as np
from PIL import Image

# 1.画像の読み込み
img = np.array(Image.open("/content/Lenna.png"))

# 2.90度回転
# 第二引数:90度回転させる回数
numpy_90rotate = np.rot90(img)

# 3.画像保存
Image.fromarray(numpy_90rotate).save("numpy_90rotate.jpg")

# Pillowバージョンの画像回転コード =====
from PIL import Image

# 1.画像の読み込み
img = Image.open("/content/Lenna.png")

# 2.90度回転
pillow_90rotate = img.rotate(90)

# 3.画像保存
# quality:解像度(1~100)
pillow_90rotate.save("pillow_90rotate.jpg", quality=95)

それぞれを実行すると、下記のように元画像を反時計回りに回転させた画像が得られます。

同じ出力結果が得られる処理が多いとはいえ、どのライブラリでも推奨できるわけではありません。

C++ではなくPythonで画像処理をする場合には、NumPyよりもOpenCVがおすすめです。NumPyでは1から画像処理用の関数やクラスの実装が必要になるケースも多く、初心者には難易度が高いからです。

また、Pillowは処理できる内容が少ないため、基本的にはおすすめしません。したがって、画像の認識や検知をスムーズに行いたい場合には、OpenCVを習得するのが近道です!

NumPyとPillowについては、下記で詳しく扱っているので参考にしてみてください。

画像処理の実際のプログラミングコードを紹介!学習法も一緒に解説画像処理の学習において、ついつい複雑なテクニックや理論に挫折してしまうことってありますよね。 画像処理のオープンソースライブラリで...

【入門】Pythonの画像処理ライブラリで顔検出コードを実装

では、Pythonを使って顔を検出するプログラムを実装してみましょう。今回のテーマは、PythonとOpenCVを使って画像内の顔を検出するコードを実装することです!

実装手順は下記のとおりです。

  1. OpenCVや画像、学習済みモデルの準備
  2. 顔を検出するコードをOpenCVで実装

    実装環境は、クラウド上でPythonを使える「Google Colaboratory」を使用します。

    事前準備|OpenCVのインポート・画像の読み込み・学習済みカスケード分類器のダウンロード

    では、顔検出に必要な準備工程を説明します。事前準備で行うことは、下記のとおりです。

    • OpenCVのインポート
    • 画像の読み込み
    • 学習済みのカスケード分類器のダウンロード

      まずは、OpenCVをインポートする必要があります。Google Colabでは、OpenCVがすでにインストールされているため、下記のようにモジュールをインポートするだけでOKです。

      import cv2
      

      WindowsやLinux環境で行う場合のOpenCVのインストール方法は、下記でチェックしてくださいね。

      Python + OpenCVで画像処理をマスター!使用法・実用例を解説Python初心者の方でOpenCVの使い方について悩んでいる人必見。OpenCVの基礎知識やインストール方法、使い方を網羅しました。OpenCVを使用した画像動画処理について悩んでいる人は参考にしてください。...

      次に、画像ファイルをGoogle Colaboratory上にアップロードしましょう。Google Colaboratoryでは、画像をドラッグ&ドロップでアップロードが完了します。

      画像をアップロードしたら、画像を読み込みます。画像を読み込むコードは下記のとおりです。

      # 顔を検出する画像のパス
      img_path = "/content/Lenna.png"
      
      # 画像を読み込む
      img = cv2.imread(img_path)

      最後に、学習済みのカスケード分類器を用意します。

      カスケード分類器とは、複数の識別器を組み合わせた分類器のこと

      OpenCV公式の「Releases」から、Sorcesをクリックしてzipファイルをパソコン上へダウンロードしましょう。

      ダウンロードしたzipファイルを解凍して、「opencv-バージョン/data/haarcascade」の中に学習済みのカスケード分類器のファイルがあるかどうか確認してください。

      そして、使うxmlファイルをドラッグ&ドロップで、Google Colaboratory上にアップロードしましょう。今回は正面を向いた顔の検出を行いますので、「haarcascade_frontalface_alt.xml」をアップロードする必要があります。

      学習済みのカスケード分類器はOpenCVの公式Githubからもダウンロードできますが、環境によっては使用時にエラーが発生する可能性があります。

      そのため、OpenCV公式の「Releases」からダウンロードする方法をおすすめします。

      以上で事前準備は完了です。

      顔検出プログラムの実装

      事前準備が完了したら、顔検出の実装をしていきましょう。実装コードは下記を参考にしてくださいね。

      import cv2
      
      # 顔を検出する画像のパス
      img_path = "/Lenna.png"
      
      # 画像を読み込む
      img = cv2.imread(img_path)
      
      # 正面を向いている顔を学習したカスケード分類器が保存されているパス
      cascade_path = "/haarcascade_frontalface_alt.xml"
      
      # 学習済みモデルを読み込む
      cascade = cv2.CascadeClassifier(cascade_path)
      
      # 画像をグレースケールに変換
      img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      
      # 顔を検出する
      face_detect = cascade.detectMultiScale(img_gray)
      
      # 検出した顔を赤く囲む
      img_copy = img.copy()
      
      for (x,y,w,h) in face_detect:
          cv2.rectangle(img_copy, (x, y), (x+w, y+h), color=(0, 0, 255), thickness=3)
      
      # 顔検出後の画像表示
      cv2.imwrite("Lennaface_detect.png", img_copy)
      

      実行すると、下記の画像が保存されます。

      しっかりと、顔を検出できていますね!

      顔検出モデルの「cv2.CascadeClassifier」は、グレースケールの画像でなければエラーが出るため、分類器に入れる画像を「cv2.cvtColor」でグレースケールへ変更します。

      OpenCVでは「カスケード分類器.detectMultiScale(グレースケール画像)」と記述するだけで、顔検出ができます。さらにはカスケード分類器の種類を変えるだけで、今回の正面を向く人の顔以外にも猫・笑顔・メガネをかけた人・車のナンバーなど、さまざまな検出が可能です。

      またOpenCVでは画像内への描画も可能なため、検出した顔のピクセルデータをもとに四角形を描画すれば、正しく顔を検出できたのかが一目でわかります。

      今回の内容のように、OpenCVを使えば簡単に画像の取り込み・前処理・検出・可視化まで実装できます

      下記では顔検出以外のOpenCVを使った実装コードを紹介しているので、参考にしてみてください!

      画像処理の実際のプログラミングコードを紹介!学習法も一緒に解説画像処理の学習において、ついつい複雑なテクニックや理論に挫折してしまうことってありますよね。 画像処理のオープンソースライブラリで...

      画像処理をPythonでする時に役立つ本

      OpenCVやPythonには、画像認識や検出など、さまざまな目的別の本が提供されています。そのため、本を使って知識や実装スキルを身につけるのも一つの方法です。

      Pythonで画像処理をするときには、下記の2冊がおすすめです。

      書籍名 特徴 メリット おすすめな人
      OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書) 画像処理アルゴリズムの内部処理の解説をもとに、PythonとOpenCVでの実装方法を解説している本 各関数のパラメータや選び方から丁寧に解説されているので、OpenCVの基本を押さえられる PythonとOpenCVの基本的な使い方を習得したい人
      OpenCVではじめようディープラーニングによる画像認識・物体 OpenCVをサポートする言語や前処理用のモジュールの解説など、画像処理の基礎内容が網羅された本 基本を押さえたうえで、OpenCVを使ったディープラーニングの基礎~応用レベルの実装方法を学べる OpenCVの概要やディープラーニングモジュールの使い方を深く理解したい人

      「OpenCVによる画像処理入門 改訂第2版 」はOpenCVの導入手順から、グラフィックス・アフィン変換・色空間の処理・フィルタ処理など、PythonとOpenCVを使って画像処理の基本スキルを学べる内容になっています。

      一方で「OpenCVではじめようディープラーニングによる画像認識・物体」の方は、ディープラーニングモジュールを使った実装方法の説明も含まれており、最新の画像処理技術も習得できるメリットがあります。

      そのため、基本的な内容をしっかりとインプットしたい場合には「OpenCVによる画像処理入門」がおすすめで、OpenCVでディープラーニングをしたい場合には「Pythonで始めるOpenCV 4プログラミング」を選ぶと良いでしょう。

      ただし、本を使っても解決しないことがあるときや、本の解説内容でわからないことがあるときは「Tech Teacher」に相談してくださいね!

      データサイエンスを学習するならTech Teacherで!

      『Tech Teacher』3つの魅力

      魅力1. オーダーメイドのカリキュラ

      『Tech Teacher』では、決められたカリキュラムがなくオーダーメイドでカリキュラムを組んでいます。「質問だけしたい」「相談相手が欲しい」等のご要望も実現できます。

        魅力2. 担当教師によるマンツーマン指導

        Tech Teacherでは完全マンツーマン指導で目標達成までサポートします。
        東京大学を始めとする難関大学の理系学生・院生・博士の教師がが1対1で、丁寧に指導しています。
        そのため、理解できない箇所は何度も分かるまで説明を受けることができます。

        魅力3. 3,960円/30分で必要な分だけ受講

        Tech Teacherでは、授業を受けた分だけ後払いの「従量課金制」を採用しているので、必要な分だけ授業を受講することができます。また、初期費用は入会金22,000円のみです一般的なプログラミングスクールとは異なり、多額な初期費用がかからないため、気軽に学習を始めることができます。

        まとめ

        ・魅力1. 担当教師によるマンツーマン指導

        ・魅力2. オーダーメイドのカリキュラム

        ・魅力3. 3,960円/30分で必要な分だけ受講

        質問のみのお問い合わせも受け付けております。

        まとめ

        Pythonには、OpenCVやPillow、NumPyといった画像処理ができるライブラリがあります。特におすすめなのはOpenCVで、画像処理用の関数が豊富なため、下記のようにさまざまなことができます

        • 検出
        • 画像内への描画処理
        • 前処理
        • 機械学習

          OpenCVを習得するときには参考書を利用するのも良いですが、自分でエラーを解決しなければならないため初心者にとっては大変です。

          エラーの解決をスムーズにしたい場合には、「Tech Teacher」がおすすめです!TechTeacherでは、画像処理やOpenCVに熟知した講師から、マンツーマンでレッスンを受けられるメリットがあります。

          OpenCVの悩みがある方は、お気軽にお問い合わせください。