Pythonを使用した画像認識方法をわかりやすく解説!API3つも紹介

Pythonで画像処理をする場合に必要なOpenCVとは?

OpenCVは画像認識や画像処理など画像全般を扱うためのライブラリで、機械学習に関する多くのアルゴリズムをサポートしています。

OpenCVはWindowsやmacOSなどの主要なプラットフォームに対応しています。利用できるプログラミング言語はC++、Python、Javaなどがあります。

特にPythonは機械学習を得意としているため、OpenCVとの組み合わせは画像認識をするのに適しています。

OpenCVのインストール方法

OpenCVは画像認識や画像処理用のライブラリのため、利用者が対象となるプログラミング言語で使用できるようにする必要があります。

ここではOepnCVをPythonで使えるようにする方法を紹介します。必須条件はPythonがインストールされていることです。

Windows

WindowsにPythonがインストールされていれば、利用者は簡単なコマンド実行でOpenCVをPythonに組み込んで使えるようになります。

Windowsでは、管理者としてコマンドプロンプトを立ち上げてPythonのコマンドであるpipを実行すればPythonに組み込めます。

pipコマンドに続けてPythonを立ち上げて、import cv2を実行してエラーが出なければ成功です。

Mac

利用者がmacOS上のPythonでOpenCVを使えるようにするには、2段階の操作が必要になります。

まず、AnacondaかHomebrewのいずれかでMacにOpenCVをインストールします。

続いて、Windowsと同様にPythonのコマンドであるpipを実行してPythonで使えるようにし、Pythonを立ち上げてimport cv2を実行してエラーが出なければ成功です。

PythonでOpenCVを使う画像処理の仕方3つ

OpenCVでの画像処理は、処理をする画像や動画の指定、処理の本体、処理をした結果の出力や表示、の順序で行います。

画像処理をする対象物として静止画のほかに動画も指定できます。また、画像処理をした結果はファイル出力のほかに画面への表示もできます。

PythonとOpenCVを組み合わせると、簡潔なプログラミングコードで画像処理や画像認識を実現できます。

PythonでOpenCVを使う画像処理の仕方1:入力

OpenCVでの入力とは、処理の対象となる画像や動画を指定し、読み込むことです。

画像ファイルを指定すると、そのファイルが読み込まれます。

動画ファイルを指定したときの処理単位はフレームごとになります。そのため、動画ファイルを指定した後に1フレームごとにデータを読み込みます。

入力のAPI

OpenCVで画像処理をする対象が、静止画と動画で入力方法が異なります。

静止画を読み込むときはcv2.imread()を使います。パラメータとして画像のファイル名を指定します。

動画を読み込むときはcv2.VideoCapture()を使い、パラメータとして動画のファイル名やカメラのデバイス番号を指定してオブジェクトを生成します。その後、read()で動画の各フレームを読み込みます。

PythonでOpenCVを使う画像処理の仕方2:処理

OpenCVでの画像処理とは、上記の入力で指定した画像や動画の各フレームの画像を加工することです。

OpenCVで行なえる主な画像処理の具体的な内容は下記のとおりです。

画像処理名内容
グレースケール白黒写真にする
二値化してモノクロ化白と黒の2色のみを使った画像にする
トリミング画像の切り抜きを行う
輪郭検出画像内のモノの輪郭を検出する
ぼかし画像を平滑化して画像全体をぼかす
モザイク画像を縮小して画素を平均化し、元の大きさにするとモザイクがかかる
線の描画画像内の任意の位置に線を描く

処理のAPI

画像処理は、指定した画像や動画のフレームの読み込み時にグレースケールを指定した後に加工する方法と、読み込んだデータを直接加工する方法の2種類があります。

グレースケールやモノクロ化、輪郭検出をするときは、imread()を実行するときにグレースケールでの読み込みを指定します。

PythonでOpenCVを使う画像処理の仕方3:出力

OpenCVでの出力とは、画像処理をした画像や動画をファイルに出力したり画面に表示したりすることです。

画像データはファイルへ出力、または画面に表示されます。動画データは指定したファイルへ1フレームごと出力、または画像に表示されます。

出力のAPI

OpenCVで画像処理をした後の出力方法は画像データと動画データで方法が異なります。

静止画をファイルに出力するときはcv2.imwrite()でファイル名を指定します。画面に表示するときはcv2.imshow()で行なえます。

動画はcv2.VideoWriter()で動画出力のオブジェクトを生成し、write()でフレームごとに出力します。また、cv2.imshow()で画面に表示できます。

Pythonを使用した簡単な画像認識方法

PythonとOpenCVを組み合わせれば簡単な画像認識装置を作れます。

OpenCVで画像内にあるモノなどを検出する方法には、テンプレートマッチング、特徴点抽出による比較、カスケード分類器による検出などがあります。

ここではPythonとOpenCVを使用した画像認識の方法として、カスケード分類器と呼ばれる手法を紹介します。

カスケード分類器とは

カスケード分類器はオブジェクト分類器の一種で、いくつもの分類器を繋げて目的となる分類器を実現するため、カスケード(cascade:小滝)と名前が付けられています。

画像から物体を検出するには、機械学習で物体の特徴を学習してそのデータを蓄積します。この機械学習で得たデータの塊がカスケード分類器です。

Pythonは画像認識や画像処理用の言語のため、カスケード分類器の生成にも適しています。

カスケード分類器の作成手順

カスケード分類器は、検出したいモノが入っている画像ファイルと、検出したいモノが入っていない画像ファイルをそれぞれ多数集めて判断の基準を学習することで作られます。

カスケード分類器を作るときの特徴は、検出したいモノが入っていない画像も使うことです。Pythonに検出したいモノとそれに似たものとを読み取らせることで画像認識の精度を上げます。

認識したい画像の例となる画像を収集

検出したいモノの特徴を学習させるために、検出したいモノが入っている画像ファイルを集めます。実用レベルにするには7,000枚程度必要になります。

これらの画像は正解画像、ポジティブ画などと呼ばれます。

ここで留意することは、検出したいモノが大きく写っている画像を集める、ということです。検出したいモノが大きく写っていると画像認識の精度が上がります。

認識したい画像ではない例を収集

検出したいモノの特徴を学習させるために、検出したいモノが入っていない画像ファイルも必要となります。これは実用レベルにするには3,000枚程度必要になります。

これらの画像は不正解画像、ネガティブ画などと呼ばれます。

収集したそれぞれの画像のリストを作成

検出したいモノが入っている画像ファイル群と、検出したいモノが入っていない画像ファイル群の、それぞれのファイルのリストを作成します。

検出したいモノが入っている画像ファイルのリストは、ファイルのパス、検出したいモノがいくつ写っているかと、画像の検出したいモノを囲む位置の座標を指定します。

また、検出したいモノが入っていない画像ファイルのリストは、ファイルのパスのみを指定します。

vecファイルを作成して完了

vecファイルとは画像認識の判断基準となるデータを集めたもので、カスケード分類器を作成するために必要となるファイルです。

上記の「収集したそれぞれの画像のリストを作成」で作成した二つのファイルを読み込ませてvecファイルを作ります。

Pythonでの画像認識や画像処理の注意点

PythonとOpenCVとで画像認識をするにはいくつかの留意点があります。

画像認識をする理由を明確にする必要があり、vecファイルを生成するための正解画像には対象となるモノが大きく写っている必要があります。

目的を明確にする

Pythonでのディープラーニングでの画像認識にはOpenCV、TensorFlow、Caffeなど、いくつかの方法があり、それぞれに特徴があります。

利用者がPythonで画像認識をする目的を明確にして、どの方法を使うかを決めます。

学習させたい画像は大きく写っているものを使用

画像認識をさせるとき、認識させたいモノが大きく写ってないと認識できないことがあるため、学習させたいモノが大きく写っている画像ファイルを使用します。

Pythonは画像認識や画像処理を得意としていますが、認識させたいモノの写り方が小さいと対象物を構成する画素数が少なくなります。その結果、対象物としての特徴が際立たず、画像認識の学習には適さなくなります。

Pythonで画像認識をしよう

PythonやOpenCVはオープンソースで誰でも自由に使えます。PythonはWindowsやmacOSにインストールできます。OpenCVは処理が速く、随時更新されています。

画像認識や画像処理に特化しているPythonとOpenCVを使って画像認識技術を体験してみましょう。