【関連記事】【Pythonのライブラリ管理ツール】pipインストールを徹底解説!Windowsでも簡単?
Pythonを使った画像認識
Pythonは、データサイエンスや機械学習などのAI領域で活用されており、その用途の1つに画像認識があります。ここでは、画像認識の概要とともに、実際にPythonの代表的な画像認識ソフトウェアであるOpenCVを用いてコードを作成して理解を深めていきます。
【参考】:Python
そもそも画像認識とは
画像認識とは、画像に写っている情報が何なのか認識する技術を表します。ここでいう情報とは人や物などで、これらを識別する情報処理の分野として、パターン認識と呼ぶ場合もあります。パターン認識には、広く音声や画像、文字テキストなども含まれますが、ここでは画像を対象に解説していきます。
人間の脳と機械やコンピュータとの違い
人間は脳に蓄積されている情報から、画像を見るとそれが何なのか、記憶や経験から識別することができます。機械やコンピュータでは画像の情報が単なるドットの集合体ですので、それが何を意味するのかそのままでは識別できません。
そのために、画像の特徴やパターンを学習させておき、対象となる画像がどの分類に近いかの識別や、どのパターンに近いか適合の状況を表示させます。
これらにより、人物の顔の部分を特定したり、生産工場の品質検査で異常がある製品を判別したりすることができます。
Pythonの代表的な画像認識ソフトウェア
Pythonの代表的な画像認識ソフトウェアとして、次の2点が挙げられます。
・OpenCV OpenCVは、インテルが開発した画像認識ライブラリです。画像処理や解析、パターン認識、機械学習に広く利用することができます。学習済みのモデルが用意されており、自作に適しています。
・TensorFlow TensorFlowは、Googleが開発した機械学習用ライブラリです。機械学習のみならず、画像認識にも対応します。合わせてTensorFlowのコアライブラリでサポートされるニューラルネットワークライブラリ、Kerasを使うことも可能です。
【参考】:OpenCV 【参考】:TensorFlow 【参考】:Keras: Pythonの深層学習ライブラリ 【参考】:TensorFlow Core チュートリアル:Keras
ここからは、Pythonの画像認識ソフトウェアとして利用者の多いOpenCVを使い、さらに詳しく解説していきます。
PythonでOpenCVを使ってみる
OpenCVは、PythonのほかC++やJavaでも利用できるポピュラーな画像認識ソフトウェアです。画像処理の機能が豊富で、他のソフトウェアを追加せずに多くの処理をこなすことができます。英語ですが、豊富なドキュメントが公開されています。
【参考】:OpenCV 【参考】:Introduction to OpenCV 【参考】:OpenCV-Python 4.8.0 Tutorials
OpenCVの日本語ドキュメント
OpenCVの公式サイトは英語のドキュメントが中心です。英語が心配な方は、日本のOpenCVユーザの方々が有志で日本語のドキュメントやサンプルコードを掲載していますので、利用することもできます。
日本語サイトは、公式サイトにもリンクが掲載されていますが、掲載情報はOpenCV2.4.2までですので、ご注意ください。
【参考】:OpenCV.jp
OpenCVのインストール
Pythonで利用するには、”pip install opencv-python”などでインストールを行います。同様に、NumpyもPythonの配列処理に活用しますので、”pip install numpy”でインストールしておくと良いでしょう。
インストールについて、WindowsやLinuxなどOS別のインストール手順は必要に応じて以下のリンク先をご確認ください。
【参考】:OpenCV installation overview 【参考】:Install OpenCV-Python in Windows 【参考】:Install OpenCV-Python in Fedora 【参考】:Install OpenCV-Python in Ubuntu
OpenCVの基本操作
ここでは、OpenCVの基本操作を学んでいきます。手順は以下の通りです。
・ライブラリのインポートと画像の読み込み PythonでOpenCVを使う場合は、”import cv2”でライブラリをインポートします。取り扱う画像データは、JPEGやPNG、BMP・PBMなどの主要なフォーマットに対応します。
配列処理を行う場合は、必要に応じて”import numpy”などを行い、ライブラリをインポートしておきます。画像の読み込みですが、静止画の場合はcv2.imread()、動画の場合はcv2.VideoCapture()を使って読み込みます。
実際の使い方は、次のように行います。なお、NumPyを使用しない場合は、OpenCVのみインポートしてください。
import numpy
import cv2
image = cv2.imread('picture.jpg')
・画像の前処理 前処理として画像の処理を行います。認識精度向上のために、cv2.cvtColor()でグレースケールや二値化によるモノクロ化、トリミングなどを行います。BGRの分離やマージも行うことができます。
ここで言うBGRは、青緑赤で通常のRGBとは逆の順番となることに注意します。GBRからRGBへの変換は、cv2.cvtColor()を用います。
次の例は、グレースケールに変換する場合の指定です。
grayscale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
・画像の画面表示と保存 処理した画像を画面に表示するには、cv2.imshow()を使います。保存するには、静止画はcv2.imwrite()、動画はcv2.VideoWriter()で出力します。
具体的には、次のように使用して画像を保存します。
cv2.imwrite('grayscale.jpg', grayscale)
OpenCVを用いた画像の認識
ここから、OpenCVを用いた画像の認識を行っていきます。画像認識には、cv2.CascadeClassifier()で学習済みのモデルを読み込み、cv2.CascadeClassifier.detectMultiScale()で顔などのパターンを検出します。
なお、OpenCVではあらかじめ認識できるパターンが用意されていますので、それを用いるのが良いでしょう。
ここで用いる学習済みのモデルは、カスケード分類器と言います。同様に学習済みのモデルである、認識パターンの登録済みファイルはカスケードファイルと言い、目や眼鏡、ネコや人の顔、人物の全身・下半身・上半身、左目・右目・証明写真風の顔や笑顔などが用意されています。
格納場所は、”Pythonのインストール先\Lib\site-packages\cv2\data”で、17種類の登録ファイルがあります。
【参考】:OpenCV /data/ haarcascades 【参考】:OpenCV Cascade Classifier 【参考】:OpenCV Cascade Classifier Training
OpenCVを用いた画像認識のサンプルコード
ここまで学んだことを実際のコードにしてみます。サンプルコードでは、画像から顔(正面)を認識する一連の流れを表します。顔(正面)の学習済みモデルは、”haarcascade_frontalface_default.xml"を使います。このファイルをローカルに保存するか、パスを指定して読み込みます。
実際のサンプルコードは、以下の通りです。作成したサンプルコードに注釈を入れておきましたので、参考にしてください。
# NumPyを使う場合インポートします(通常、numpyをnpとして使用します)
#import numpy as np
# OpenCVは必ずインポートします(通常、cv2をcvとして使用します)
import cv2 as cv
# 画像を読み込みます(ここでは'picture.jpg'とします)
imagefile = 'picture.jpg'
image = cv.imread(imagefile)
# グレースケールに変換します
grayscale = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 学習済みモデルを読み込みます
# 正式なパスは"Pythonのインストール先\Lib\site-packages\cv2\data"です
cascade = cv.CascadeClassifier("haarcascade_frontalface_default.xml")
# 顔を検出します(検出する最小サイズは50x50とします)
results = cascade.detectMultiScale(grayscale, minSize=(50, 50))
# 検出した場合の処理です
if len(results) > 0:
# 検出した顔を矩形で囲みます(色は赤、線の太さは2とします)
for rectangle in results:
cv.rectangle(image, tuple(rectangle[0:2]),tuple(rectangle[0:2]+rectangle[2:4]), (0, 0, 255), thickness=2)
# 検出結果を保存します(ここではファイル名の最初に'result-'という文字列を追加します)
cv.imwrite('result-'+imagefile, image)
# 検出結果を画面に表示します(ウィンドウタイトルに'imshow:ファイル名'を表示します)
cv.imshow('imshow: '+imagefile, image)
Pythonを使った画像認識は簡単にできます
Pythonは、用途に応じたライブラリが豊富です。画像認識も人や動物などを認識するほか、物体の形状を登録することで生産ラインの品質検査にも応用できます。その中でも、OpenCVは手間なく環境構築と学習済みモデルを使った画像検出が可能で、簡単に始めるにはおすすめのソフトウェアです。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから