NTT docomoのAPIを使って、画像認識カメラを作る
第1回:初めの一歩、ラズパイに目、耳、口を追加する
第2回:ボタンとウェブサーバー機能を付けて、カメラ、マイクを操作
こんにちは、ヨシケンです!
ラズパイを使ったデバイス作りの第3回になりましたが、いよいよ今回から高度なAPIなどを導入して、カメラをスマートなものにしていきましょう。
ハードウェアの設定、ボタン、ウェブからの操作などは、第1回、第2回の記事を見て、準備しておいて下さいね。
NTT docomoの画像APIを使って、風景や料理を認識する
それでは今回は、カメラで写真を撮って、そこに何が映っているかを解析するようにして行きたいと思います。
画像認識は、自分でモデルデータやディープラーニングを駆使する方法もありますが、既に各社から高機能で便利なAPIが出ていますので、今回はそれを利用していきます。
画像APIの中でも様々なものがありますが、登録のみで無料で使え、日本語にも対応したNTT docomoのAPIを使う事にします。
この図のように、写真の中に写っている料理が何なのかを、APIを適用するだけで識別する事ができます。
今回の記事で必要なもの一覧
今回の記事の流れ
1.docomo APIの登録、導入
2.画像認識APIでカテゴリ認識を使う
3.Pythonで画像解析プログラムを作る
4.まとめ
1.docomo APIの登録、導入
撮った画像から、そこに何が写っているのかを認識するのは、ちょっと高度で難しそうに思えるかもしれません。ただNTT docomoが、スマホや、しゃべってコンシェルなどのこれまでの実績、データの蓄積を生かし、外部からでも使用できるdocomo APIを公開してくれています。
登録さえすれば、6ヶ月間無料で使用する事ができますので(追加登録により延長も可能)、この機会に是非登録をしてみて下さい。
docomo APIの使用開始
docomo APIを使い始めるには、まずこちらdocomo Developer Supportページにアクセスします。
docomo Developerサイトには、以下のように様々なAPIがあり、登録すればどれも無料で使う事ができます。(一部企業登録などの必要があります。)
今回はこの中で、「画像認識」APIを使っていきます。「画像認識」のリンクを押して、進めて下さい。
右上のログイン/新規登録 からアカウントを作成していきます。
メールアドレス、パスワードを設定します。法人か個人かはご自身のステータスにより決めて下さい。今回の画像認識に関しては、個人の登録でも使用することができます。
その後メールアドレスの確認が行われ、ログインする事ができるようになります。最初のアプリ画面で「新規API利用申請へ」を選び、APIを追加します。
その後、各種必要な情報を入れていきます。
そしてメインのAPI選択画面になりますが、ここには様々な機能/APIが並んでいます。興味のある機能を選んで下さい。今回は画像系の「画像認識」APIを使います。
その後、個人情報などを入力し、最後に申請を押します。
するとほどなく申請が通り、アプリケーション一覧に戻ると、以下のようにAPI Keyなどが付与されます。このAPI Keyは後でAPIを呼び出す時に使用しますので、記録しておいて下さい。
2.画像認識APIを使ってカテゴリ認識を行う
ではこのAPIを使って、写真に写っている物の認識をしていきましょう。
詳細なドキュメントはこちらの機能別リファレンスに詳しく書かれています。その中でもまず「カテゴリ認識」を使っていきます。
プログラムを書く前に、まずサンプル・コマンドから、このカテゴリ認識機能を試してみましょう。
コマンドのimageパラメータに、写真のファイル名を設定します。modelNameには以下のようなカテゴリがあり、認識したいものに合わせてmodelName値を指定してください。
APIKEYには、もちろん先ほど取得したAPI Keyを入れます。
まずmodelでfoodを選び、このような料理の写真を認識させてみましょう。
curl -F "image=@image.jpg" -F "modelName=food" -k | |
https://api.apigw.smt.docomo.ne.jp/imageRecognition/v1/concept/classify/?APIKEY=xxxxxxxxx | |
{"jobId":"125849_m8jj2xErvC", | |
"candidates":[ | |
{"tag":"グラタン","score":0.9510621428489685}, | |
{"tag":"かぼちゃのグラタン","score":0.04848846048116684}, | |
{"tag":"ドリア","score":0.00025079285842366517}, | |
{"tag":"フレンチトースト","score":7.04359044902958e-05}, | |
{"tag":"ナン","score":2.3732713088975288e-05}] | |
} |
そうすると、グラタンの可能性0.951…(95%)、などと出てきました。これは自宅で作ったポテトグラタンで、見かけも悪かったのですが、見事当ててくれて、少しホッとしました。
それ以外のmodelでは、scene(風景)やfashion_type(ファッションの種類)、landmark(観光名所)などが選べます。
flowerを指定して、花の写真を使うと、このような結果になりました。
結果は、一番目に「ユリ」の確率98%と出ましたが、これってポインセチアですよね。。惜しい!兎にも角にも、たくさんの花の候補を挙げてくれました。
curl -F "image=@image2.jpg" -F "modelName=flower" -k https://api.apigw.smt.docomo.ne.jp/imageRecognition/v1/concept/classify/?APIKEY=xxxxxxxxx | |
{"jobId":"130317_MU57WalWuS", | |
"candidates":[ | |
{"tag":"ユリ","score":0.9878935217857361}, | |
{"tag":"ハナミズキ","score":0.004197415895760059}, | |
{"tag":"アルストロメリア","score":0.003823954612016678}, | |
{"tag":"ペンタス","score":0.0009086288046091795}, | |
{"tag":"ダイアンサス(ナデシコ)","score":0.0005268410895951092}] | |
} |
3.Pythonで画像解析プログラムを作る
それではラズパイでPythonを使って、解析結果を出力させるプログラムを作ります。
Pythonで画像を扱うには、OpenCV (Computer Vision)というオープンソースの画像ライブラリを使うのが一般的です。ラズパイに以下のコマンドでOpenCVをインストールしておいて下さい。
sudo apt-get install python-opencv
このOpenCVを使って、Pythonプログラムを書いていきます。
先ほどのカテゴリ認識APIのurlに、パラメータに指定されたイメージファイルとモデルを適用させます。
ここでは確からしさ(score)が70%以上であれば、その物を認識できたとして、コマンドラインに出力しています。docomo_keyにはご自身のAPI Keyを設定して下さいね。
以下がそのサンプル・プログラムですが、画像解析に関わる部分は、黄色でハイライトしています。
[category_camera.py]
#! /usr/bin/python | |
# -*- coding: utf-8 -*- | |
import cv2 | |
import json | |
import time | |
from datetime import datetime | |
import urllib2 | |
import urllib | |
import dateutil.parser | |
from poster.encode import multipart_encode | |
from poster.streaminghttp import register_openers | |
import argparse | |
BUTTON = 20 | |
LED = 16 | |
accuracy = 70 | |
models_cat = ['scene', 'fashion_pattern', 'fashion_type', 'fashion_style', 'fashion_color', 'food', 'flower', 'kinoko'] | |
docomo_key='xxx' | |
URL_CAT = 'https://api.apigw.smt.docomo.ne.jp/imageRecognition/v1/concept/classify/?APIKEY=' | |
def getImage(fname, modelName): | |
register_openers() | |
f = open(fname, 'r') | |
url = URL_CAT | |
datagen, headers = multipart_encode({'image': f, 'modelName': modelName}) | |
url = url + docomo_key | |
request = urllib2.Request(url,datagen, headers) | |
response= urllib2.urlopen(request) | |
res_dat = response.read() | |
res_json = json.loads(res_dat)['candidates'] | |
return res_json | |
if __name__ == '__main__': | |
parser = argparse.ArgumentParser() | |
parser.add_argument('--image' ,dest='image', type=str, default='', help='name of input image') | |
parser.add_argument('--model', dest='model', type=str, default='', help='modelName = {scene, fasion_pattern, fashion_type, fashion_style, fashion_color, food, flower, kinoko, bodyPart, currency}') | |
args = parser.parse_args() | |
model_name = args.model if args.model in models_cat else '' | |
fname = args.image if args.image else 'image.jpg' | |
print model_name, fname | |
if fname: | |
img = cv2.imread(fname) | |
candidate_list = [] | |
if model_name == '': | |
for model in models_cat: | |
candidate_list += getImage(fname, model) | |
else: | |
candidate_list = getImage(fname, model_name) | |
print candidate_list | |
obj= 0 | |
objects = '' | |
message = 'No message' | |
if candidate_list: | |
for can in candidate_list: | |
score = round(can['score']*100, 1) | |
object = can['tag'] | |
obj_model= model_name | |
if score > accuracy: | |
obj +=1 | |
print object + "(" + str(score) + "%)" | |
if object: objects += object + ', ' | |
message = str(obj) + " object detected: " | |
if objects: | |
message += objects.encode('utf-8') | |
else: | |
message = "No candidate" | |
if message: | |
print message | |
else: | |
print "No message" |
それではこのプログラムを実行してみましょう。
先ほどの料理や花の写真をパラメータの -imageに、また–modelにfoodやflowerを指定して、流してみます。
1 food detected. グラタン(95.1%)
python category_camera.py –image /home/pi/web/image/images/n1.jpg –model flower
1 flower detected. ユリ(98.8%)
プログラムからでも、同様の結果が出力されましたね。
またmodelにsceneを適用して、風景写真を読み込ませてみます。
撮られた夕日の画像に、「夜景82.8%」と出ていますが、まあまあの結果が出ました。
画像解析APIをPythonプログラムとしても、動くことが確認できました。
今後は、このプログラムに機能を順次追加し、どんどんできる事を増やしていきたいと思います。
4.まとめ
今回は、ラズパイで撮った写真を解析するために、NTT docomo APIを導入しました。
これまで、写真が撮るだけだったものが、その写真に何が写っているのかを自動で判別する画像解析APIを付け加えました。
最低限のプログラミングで、写真に写ったものをおおよその精度で検出してくれるのが、こんなに簡単とは少し驚きですね。カテゴリ認識には、食べ物や風景、花だけでなく、ファッションや毒キノコなど、面白いものがありますので、色々試してみて下さい。
今回の最終的なサンプル・プログラムはこちらにも保存されています。[category_camera.py]
さて次回は、音声系APIを使い、撮った画像に何が写っているのか、しゃべってお知らせするような面白いカメラにしたいと思います。
お楽しみに!
今回の連載の流れ
第1回:初めの一歩、ラズパイに目、耳、口を追加する
第2回:ボタンとウェブサーバー機能を付けて、カメラ、マイクを操作
第3回:NTT docomoのAPIを使って、画像認識カメラを作る(今回)
第4回:撮った画像を読み上げる、おしゃべりカメラにしよう
第5回:顔や文字などを読み取って、自動でメールする
第6回:人の話を聞いて、写真撮影、画像解析するAIカメラを完成させる!