実践型AIプログラミング特講 #13

実践型AIプログラミング特講 #13

今回はいかにもAIを使っている感覚がある、画像を用いた人の顔認識について具体的なソースコードを用いてご紹介していきます。顔認識は今やどこでも見かけることの多いものとなっており特に現在コロナウイルスの蔓延に伴い自動顔認識検温計など第一線で活躍している機械に導入されています。それ故、顔認識はハードルが高い、どうやっているのわからないと頭ごなしに拒絶される方が多いとは思いますが実際、顔認識に特化したライブラリがpythonには存在しており、そのライブラリを活用することで誰でも簡単に画像認識や映像認識を行うことが可能です。

 

OpenCVと機械学習-画像動画入門

OpenCVについて

画像や動画を扱うプログラムで欠かすことのできないライブラリーが「OpenCV」です本記事では OpenCVとは何か、何に使えるのかを紹介します。

OpenCV とは?

『OpenCV(Open Source Computer Vision Library)』とは、オープンソースの画像(動画)ライブラリーです。もともとインテルが開発し、公開しました。このライブラリーを使うと、画像形式の変換から、フィルター処理、さらに、顔認識や物体認識、文字認識など、画像に関連するさまざまな処理を行うことができます。動作対象 OSが幅広く、ライセンスの制限も緩いため、さまざまなプロダクトで利用されています。

OpenCV の Web サイト

[URL] https://opencv.orgO YEFJE OS : Windows/macOS/Linux/Android/iOS

ライセンス:BSD ライセンス(商用利用も可能)

機械学習との関わり

機械学習で OpenCV をどのように利用できるでしょうか。画像を機械学習の入力として与えるためには、画像を数列のデータに直す必要があります。入力として与えられる画像は、BMP 形式であったり、PNG 形式やJPEG 形式と、形式がバラバラのことも多くあります。また、ある画像はグレースケールだったり、ある画像はフルカラーだったりします。そのため、OpenCV を使って画像形式や色数などを整えます。また、画像は同じサイズである必要があるため、画像のサイズをリサイズしたり、必要な部分を切り出す必要が生じます。そうした処理にもOpenCV が利用できます。

OpenCV は loT 機器でも動作可能

OpenCV は、Raspberry Pi を代表とした Linux をベースとしたシングルボードのコンピューター上でも動かすことができます。そうしたloT を代表する端末でも使えるので、画像の基本的な整形処理ができて、それを機械学習の入力として与えることができます。小規模な機械学習システムであれば、単体の Raspberry Pi 上でも動かすことができます。少し規模の大きなシステムであれば、画像や動画のキャプチャーを Raspberry Pi で行い、サーバー側でデータを受け取って、機械学習をサーバー側で処理するということも可能です。

画像A loT 機器とサーバー側で連携して機械学習を行うシステム例

OpenCV の導入

OpenCVが使える状態であれば、以下のコードを実行しても、何もエラーは表示されません。もし、利用できない状態であれば、実行した際にエラーが表示されます。Jupyter Notebook を開き、以下のコードを実行して確認してみましょう。

画像を読み込んでみよう

それでは、OpenCV で画像を読み込んでみましょう。以下のプログラムは、Web から適当な画像データをダウンロードし、OpenCVで画像を読み込んで、そのピクセルデータを出力するものです。JupyterNotebook に書き込んで実行してみましょう。

# 画像のダウンロード

import urllib.request as req

url =https://uta.pw/shodou/img/28/214.png

req.urlretrieve (url, “test.png”)

# OpenCV で読み込む

import cv2

img= cv2.imread (“test.png”)

print(img)

正しく実行されると、画像がダウンロードされ、その画像の画素データが表示されます。ここでは、ullb.request モジュールのurlretrieve() 関数を利用して、Web 上にある画像をローカルにダウンロードします。その後、OpenCV の機能を利用して「cv2.imread( ファイル名)』で画像を読み込うっかリミスをしがちな点として、imread() 関数は画像の読み込みに失敗したときに、None を返すだけで例外を投げません。Python の組み込み関数の open() 関数とは挙動が異なるので注意が必要です。次のような明らかに存在しない画像ファイルを読み込んでテストしてみましょう。実行して結果みます。を確認すると、None が表示されます。Img=cv2.imread(“存在しないファイル .png”)print (img)

画像をインライン表示しよう

続いて、ダウンロードしたデータをそのまま Jupyter Notebook 上に表示しましょう。その際は、matplotlib モジュールをインラインで利用することを宣言する必要があります。Jupyter Notebook の先頭で以下の宣言を実行しておきましょう。

%matplotlib inline

その上で、画像をJupyter Notebook 上に表示するものです。ここから適当なJPEG ファイルを使って作業しますので、Jupyter Notebook を実行するディレクトリーに「test.jpg」というファイルをコピーしておきましょう。以下のプログラムを実行すると、test.jpg のイメージがインライン表示されます。

# ダウンロードした画像を画面に表示する

import matplotlib.py

plot as plt

import cv2

img = cv2.imread (“test.jpg”)

plt.imshow(cv2.cvtColor(img, cv2. COLOR_BGR2RGB))

plt.show()

プログラムを確認してみましょう。ポイントとなるのは、最後から2行目の imshow0 関数です。matplotlib.pyplot モジュールのimshow0を使うと画像を出力できます。ただし、ここでimread) で読み込んだ関数をそのまま imshow) に渡すことはせず、cvtColor) 関数を通して、色空間を BGR から RGB に変換しています。cvtColor() を通さずに直接 mshow() に画像データを与えると、赤と青が反転した状態で出力されます。これは、OpenCV のカラーデータが、BGR(青緑赤)の順番で並んでいるのに対して、matplotlib のカラーデータは、RGB(赤緑青)の順番で並んでいることを前提としているためです。つまり、変換前のデータが(255,0,0) ならば (0,0,255) となります。

画像:カラーグラフ

また、画像の左と下に数値のメモリーが表示されるので、以下のように、「plt.axis{“off”)」と書くと画像だけが表示されます。img = cv2.imread (“test.jpg”)plt.axis(“off”)# axisの表示をオフにplt.imshow (cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.show ()なお、NumPy による画像のフィルター処理や、カラー画像をグレースケールに変換するなど色空間の変換方法は、本章末尾のコラム(P.180)を参考にしてください。

画像を保存しよう

読み込んだ画像を処理して、ファイルへ保存するには imwrite() 関数を利用します。ファイル名の拡張子を「png」にすればPNG 画像に変換して保存されますし「jpg」にすれば、JPEG 画像に変換して保存されます。

import cv2

# 画像を読み込む

img = cv2.imread(“test.jpg”)

# 画像を保存する

cv2.imwrite(“out.png”, img)

OpenCV では、BMP/PPM/PGM/PBM/JPEG/JPEG2000/PNG/TIFF/OpenEXR/WebP といった、代表的な画像形式をサポートしています。

画像サイズの変更と切り取り

機械学習では、画像サイズを合わせたり、特定の部分を切り取ったりすることが多くあります。OpenCVで画像サイズを変更するには、cv2.resize() 関数を使います。そして、特定の部分を切り出すには、リストのスライスを使います。

画像のリサイズ

以下は、画像をリサイズする例です。リサイズしたことがわかるように、わざと画像を横に潰してみましょう。

import matplotlib.py

plot as plt

import cv2

# 画像を読み込む

img = cv2.imread (“test.jpg”)

# 画像をリサイズ

im2 = cv2.resize (img, (600, 300))

# リサイズした画像を保存

cv2.imwrite(“out-resize.png”, im2)

# 画像を表示

plt.imshow (cv2.cvtColor (im2, cv2.COLOR_BGR2RGB))

plt.show ()

画像のリサイズは、以下のように、第1引数に読み込んだ画像データ、第2引数に画像サイズを指定します。img=cv2.resize (img, (width, height))

画像の切り取り

次に、画像の顔の部分だけを切り取って、リサイズしてみましょう。画像の一部分を切り取るには、リストのスライスを利用して、「配列 Iyl:y2,x1:x2]」の書式で画像を切り取ることができます。

import matplotlib.py

plot as plt

import cv2

# 画像を読み込む

img = cv2.imread (“test.jpg”)

# 画像の一部を切り取る

im2 = img[150:450, 150:450]

# 画像をリサイズ

im2 = cv2.resize(im2, (400, 400))

# リサイズした画像を保存

cv2.imwrite(“cut-resize.png”, im2)

# 画像を表示plt imshow(cv2.cvtColor(im2, cv2. COLOR_BGR2RGB))

plt.show ()

OpenCVの座標系OpenCV では、Python の一般的な画像処理と同じような座標系を利用します。画像の左上の座標が(0,0)となり、右下に行くほど値が大きくなります。

画像 OpenCV の座標系

応用のヒント

ここでは、OpenCV について基本的な使い方を紹介しました。画像の色空間の変換、切り取りとリサイズは、機械学習で画像を利用する際によく使う操作です。しっかり覚えておきましょう。

この節のまとめ

・OpenCV はマルチプラットフォームの画像·動画処理ライブラリーである機械学習では、色空間の変換、切り取り·リサイズなどの操作をよく行う

・OpenCV で読み出した画像は、NumPy 形式の配列データとなるので、Python から手軽に操作ができる以上が顔認識講座第一回になります。

 

いかがでしたでしょうか、openCVを活用することで今最先端で用いられる顔認識が自分のパソコン上で行えることに呆気にとられた方も多いのではないでしょうか。口をすっぱく言いますがプログラミングは先人の知恵をいかに踏襲することができるかがキーポイントになります。ですからこういった、高度な技術も先人の方が築き上げてきたツールを活用することができれば簡単に顔認識や映像認識ができてしまうのです。では次回は自動画像編集アルゴリズムについてご紹介していきます。

 

プログラミングカテゴリの最新記事