Googleの画像認識(Vision API)で、写真内の人をカウントする場合、object_localizationを使用することで、簡単に実現できます。
写真内の人をカウントするには【Google Vision API】
入力画像・検出画像
左の画像が入力画像、右の画像がVision APIでの検出結果の画像です。
Pythonサンプル
from google.cloud import vision
from google.oauth2 import service_account
import io
# 身元証明書のjson読み込み
credentials = service_account.Credentials.from_service_account_file('key.json')
client = vision.ImageAnnotatorClient(credentials=credentials)
#ローカル画像を読み込み、imageオブジェクト作成
with io.open("./callcenter.jpg", 'rb') as image_file:
content = image_file.read()
image = vision.Image(content=content)
#Cloud Vision APIにアクセスして、物体検出
response = client.object_localization(image=image)
# 物体検出結果からPersonをカウント
labels = response.localized_object_annotations
num = 0
for label in labels:
if label.name=="Person":
num += 1
# 人数カウント結果を表示
print("画像内の人数:" + str(num))
入力画像から、人数検出しするPythonサンプルです。
物体検出で"Person"と検出された数を、表示しています。
検出結果
画像内の人数:4
画像内の4人を、正しく検出できています。
Pythonサンプルの解説
物体検出
まず、画像をCloud Vision APIに渡して、物体検出した結果を受け取ります。
with io.open("./callcenter.jpg", 'rb') as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.object_localiz ation(image=image)
人数カウント
上記の物体検出結果であるjsonデータのresponse内で、nameがPersonの数をカウントしています。
labels = response.localized_object_annotations
num = 0
for label in labels:
if label.name=="Person":
num += 1
いろいろな画像で人数カウントした結果
入力画像・検出画像①
こちらは、後ろ姿2人の画像です。
検出結果①
画像内の人数:2
後ろ姿でも、正しくカウントできています。
入力画像・検出画像②
こちらは、浴衣の女性11人の画像です。
検出結果②
画像内の人数:10
結果は1人少ないですが、そこそこの精度で人数カウントできています。
入力画像・出力画像③
こちらは、菅内閣当時の25名の画像を使用させて頂きました。
検出結果③
画像内の人数:10
人数が10人を超えてくると、検出が厳しいようです。
特に後列の体が隠れている人は、人数カウントできていないようでした。
入力画像④
こちらは、座った子供11人の画像です。
検出結果④
画像内の人数:10人
実際は11人ですが、10人までは検出できています。
まとめ
本記事では、Google Cloud Vision APIで、画像認識で人数カウントする基本的な方法をまとめました。
しかし本手法では、人数が多かったり、体が隠れていたりすると、人を検出できない場合があります。
さらなる改善策として、顔検出と併用し、物体検出のPersonか、顔検出のどちらかで検出できれば人数にカウントする方法等も考えられます。
Google CloudのVision APIで、画像内の顔の数を検出するには、face_detectionを使用します。 顔の数を検出するには 入力画像・検出画像 サンプルコード 実行する場合、APIキーファイルをGCPからダ[…]
みなさんも、Cloud Vision APIとご自身のアイデアで、より良い人数カウント方法を試してみてはどうでしょうか。
今回は以上です。