python Amazon Rekognition detect_labelsその1
はじめに
Amazon Rekognitionを使用してみる。
Amazon Rekognitionは簡単に言えば画像分析サービス。
画像に有名人がいるかとか、その画像に含まれている要素は何なのかを判断してくれる
ほかにも、文字認識もできる。
今回は画像のラベル検出(detect_labels)を試してみる
準備
下記のプログラムを用意する。
- rekognition.py
import boto3 import sys import json if len(sys.argv) != 2: exit() client=boto3.client('rekognition') #写真を読み出して、Byte変換してdetect_labels送信 file = open(sys.argv[1],'rb') response = client.detect_labels(Image={'Bytes':file.read()}, MaxLabels=30) print(type(response)) print(json.dumps(response)) print('Detected labels for ' + sys.argv[1]) print() for label in response['Labels']: print ("ラベル: " + label['Name']) print ("信頼: " + str(label['Confidence'])) print ("**********インスタンス**********") for instance in label['Instances']: print (" 境界") print (" Top : " + str(instance['BoundingBox']['Top'])) print (" Left : " + str(instance['BoundingBox']['Left'])) print (" Width : " + str(instance['BoundingBox']['Width'])) print (" Height: " + str(instance['BoundingBox']['Height'])) print (" 信頼: " + str(instance['Confidence'])) print() print ("Parents:") for parent in label['Parents']: print (" " + parent['Name']) print ("********************************") print () label_count=len(response['Labels']) print("Labels detected: " + str(label_count))
実行結果
画像は以前使用したイーヌ
$ python rekognition.py 85898497.jpg ***レスポンス表示は中略*** Detected labels for 85898497.jpg ラベル: Mammal 信頼: 95.82337188720703 **********インスタンス********** Parents: Animal ******************************** ラベル: Animal 信頼: 95.82337188720703 **********インスタンス********** Parents: ******************************** ラベル: Wildlife 信頼: 62.20775604248047 **********インスタンス********** Parents: Animal ******************************** ラベル: Hedgehog 信頼: 58.174739837646484 **********インスタンス********** Parents: Mammal Animal ******************************** ラベル: Canine 信頼: 56.14072799682617 **********インスタンス********** Parents: Mammal Animal ******************************** Labels detected: 5
どこからどう見ても犬だし、ハリネヅミだけど100じゃないのが面白い。
まとめ
今回は手軽に引数の画像を解析するようにしてみたが、S3バケットの画像データからも分析できるので、その方法も試してみたい。
python AWS awscli
はじめに
awscliを使いつつAWSを学ぶ環境を構築する。
準備
下記の手順でawscliの設定とインストールを行う。
$ pip install awscli $ aws configure AWS Access Key ID [None]: IAMの認証情報から取得 AWS Secret Access Key [None]: 最初に配られるCSVから取得 Default region name [None]: ap-northeast-1 Default output format [None]: json
EC2インスタンスを一つ仮に作っておいて以下を投入。
$ aws ec2 describe-instances --filters "Name=instance-type,Values=t2.micro" --query "Reservations[].Instances[].InstanceId" [ "インスタンスID" ]
インスタンス情報が取得できればawscliでアクセスできていることがわかる。
まとめ
世がわりとGoogleを使用しているので、Amazonに絞って学習していきたい。
python 画像のアップロードとグレー変換
はじめに
POSTメソッドで画像ファイルをグレーに変換するプログラムを書いてみた。
準備
クライアントで画像をbese64に変換してJSONで転送する。
サーバは画像データを取り出して、一時保存してからグレーに変換してbese64でそのまま返すようにした。
- imageClient.py
import requests, base64 fileName = '85898497.jpg' headers = {"content-type": "application/json"} f = open(fileName, 'rb') b64 = base64.b64encode(f.read()) payload = {'image': b64.decode()} r = requests.post('http://Server IP Address/image/', json = payload, headers = headers) imageByte = base64.b64decode(r.text) w = open('clinetImage.jpg', 'wb') w.write(imageByte)
- imageServer.py
from flask import Flask, request, json import base64 import cv2 app = Flask(__name__) @app.route('/image/', methods=['POST']) def trans(): data = request.data.decode('utf-8') data = json.loads(data) imageByte = base64.b64decode(data['image']) w = open('imageFile.jpg', 'wb') w.write(imageByte) imgBgr = cv2.imread('imageFile.jpg') imgGray = cv2.cvtColor(imgBgr, cv2.COLOR_BGR2GRAY) cv2.imwrite('imageFileGray.jpg', imgGray) r = open('imageFileGray.jpg', 'rb') return base64.b64encode(r.read()) if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=80)
実行
プログラムの実行結果
■変換前画像
■変換後画像
cv2.imreadが変換したバイト配列をそのまま読んでくれればスタイリッシュになりそう。
「cv2.COLOR_BGR2GRAY」を変更すればもっといろいろ変換できそう。
まとめ
画像は拾いもので他意は無いです。
python POSTメソッドとレスポンス
はじめに
今回も人間のためのHTTPの続きで、POSTメソッドを使用して、レスポンスを表示してみる。
準備
サーバはFlaskでPOSTを受け取れるプログラムを実装してみた。
- postServer.py
from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/postdata', methods=['POST']) def index(): payload = request.json app.logger.info(payload.get('name')) app.logger.info(payload.get('age')) return jsonify({"Language": "python"}), 200 if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=80)
POSTを行うクライアントプログラムも用意する。
- getClient.py
import requests payload = {'name':'getClient', 'age':'134',} r = requests.post('http://IP ADDR/postdata', json=payload) print(r.url) print(r.text) print(r.status_code)
実行
プログラムの実行結果
- クライアント
$ python postClient.py http://IP ADDR/postdata { "Language": "python" } 200
- サーバ
[2021-04-05 12:33:39,382] INFO in postServer: getClient [2021-04-05 12:33:39,383] INFO in postServer: 134
ステータスコードも200が返ってきており、jsonifyでJSONに変換した値が、ちゃんと返ってきていることがわかる。
また、JSONで渡した値もしっかりログに表示できている。
まとめ
JSONで受けて、JSONで返すAPIの実装が簡単にできることがわかった。
PythonはライトにHTTPのプログラムがかけるので使っていて楽しい。
自分でサーバを実装して、クライアントを実装するというマッチポンプ的なことが楽にできる。
python GETメソッドとレスポンス
はじめに
前回やった人間のためのHTTPの続きで、GETメソッドを使用して、レスポンスを表示してみる。
準備
サーバはFlaskのときに解説したプログラムを使用する。
- getServer.py
from flask import Flask, request app = Flask(__name__) @app.route('/getdata', methods=['GET']) def index(): name = request.args.get('name') if name: return 'Hello, ' + name return 'Hello, no name' if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=80)
HTTPリクエストはプログラムも用意する。
- getClient.py
import requests payload = {'name':'getClient'} r = requests.get('http://Your Server Address/getdata', params=payload) print(r.url) print(r.text)
実行
サーバプログラムの起動
python getServer.py
クライアントプログラムの実行結果
$ python3 getClient.py http://Your Server Address/getdata?name=getClient Hello, getClient
print(r.encoding)でtextのエンコーディングもわかる。
r.encodingを変更すると、r.textを指定した値で表示してくれる。
まとめ
ざっとまとめたが、これならGETを使用するようなAPIの呼び出しも簡単に実装できる。
python リクエストとレスポンス
はじめに
「人間のためのHTTP」からリクエストを送信してレスポンス受け取る処理を解説する。 requests-docs-ja.readthedocs.io
簡単なリクエスト
Googleにアクセスしてレスポンスと内容を表示するプログラムを作成してみる。
※最初にpipでrequestsをインストールしておく必要がある
pip install requests
import requests r = requests.get('https://www.google.co.jp') print(r.status_code) print(r.headers)
実行結果
200 {'Date': 'Thu, 01 Apr 2021 13:42:58 GMT', 'Expires': '-1', 'Cache-Control': 'private, max-age=0', 'Content-Type': 'text/html; charset=Shift_JIS', 'P3P': 'CP="This is not a P3P policy! See g.co/p3phelp for more info."', 'Content-Encoding': 'gzip', 'Server': 'gws', 'X-XSS-Protection': '0',<BR> 省略 Thu, 01 Apr 2021 13:56:29 GMT
内容自体はステータスコードを表示してヘッダーを表示しているだけ。
たった数行でHTTPアクセスできるので、直感的でわかりやすい実装だと思う。
headerの中身がリファレンス通り、「print(r.headers['Date'])」でDateの中身が取れるので使いやすいと感じる。
量が多いので省略しているが「r.text」で生のHTMLが取れるのも非常に便利。
まとめ
ささやかだが、外部コマンドを使わなくてシンプルにHTTPアクセスを実装できるので良い。