技術雑記帳兼日記帳

AWS、Python、Terraformの使い方をコッソリ

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))

実行結果

画像は以前使用したイーヌ

f:id:halhalhal1:20210410143208j:plain

$ 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)

実行

プログラムの実行結果
■変換前画像 f:id:halhalhal1:20210410143208j:plain


■変換後画像 f:id:halhalhal1:20210410143223j:plain

cv2.imreadが変換したバイト配列をそのまま読んでくれればスタイリッシュになりそう。
「cv2.COLOR_BGR2GRAY」を変更すればもっといろいろ変換できそう。


まとめ

画像は拾いもので他意は無いです。



python タートル表示

はじめに

今日は短めにタートル表示をやってみる。

コード

from turtle import *
shape("turtle")
col = ["red", "blue", "green", "tomato"]
for i in range(4):
    color(col[i])
    forward(500)
    left(90)
done()

実行結果

f:id:halhalhal1:20210407214533p:plain


まとめ

無駄にカラフルにしてみた
GUI表示もお手の物でPythonすごい。

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アクセスを実装できるので良い。