[PYTHON] So erstellen Sie einen LINE-Bot mit künstlicher Intelligenz mit der Flask + LINE Messaging-API

So erstellen Sie einen LINE-Bot mit künstlicher Intelligenz mit der Flask + LINE Messaging-API

Nakano Hitoshis Buch <a target = "_ blank" href = "https://www.amazon.co.jp/gp/product/B07QLGKJ8T/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07QLGKJ8T&linkCode=as2as2&tag2 > Einführung in die Entwicklung künstlicher Intelligenz mit Python + LINE - Erstellen eines LINE-Bot für künstliche Intelligenz mit Flask + LINE-Messaging-API <img src = "// ir-jp.amazon-adsystem.com/e/ir?t = kokkahasan-22 & l = am2 & o = 9 & a = B07QLGKJ8T "width =" 1 "height =" 1 "border =" 0 "alt =" "style =" border: none! Wichtig; Rand: 0px! Wichtig; "/>

Es war ziemlich interessant. Am Ende der Beispielübung befindet sich eine Bot-App, die Gesichter mit Stempeln durch Gesichtserkennung mithilfe der Google Vision-API verbirgt. Es gibt viele Apps dieses Typs, aber die Verwendung ist möglicherweise einfacher, wenn Sie einen LINE-Bot verwenden.

Schließlich erhält er die Hausaufgabe, zu versuchen, mehrere Gesichtserkennungen in Einklang zu bringen. In der Buch-App wird nur eine Person unterstützt. Es gibt keine Antwort. Es ist einfach. Lassen Sie uns unser Bestes geben, Mr. Nakano.

Ich gab eine Antwort mit ein wenig Mühe, also als Referenz.

Gesichtserkennung des vom Benutzer mit der Google Vison-API gesendeten Bildes und Antwort auf das von cat.png ausgeblendete zusammengesetzte Foto (unterstützt mehrere Gesichter)
#app.py

#Gesichtserkennung des vom Benutzer gesendeten Bildes mit Google Vison API und cat.Antworten Sie auf ein zusammengesetztes Foto, das in png versteckt ist(Unterstützt mehrere Gesichter)

import io
import os
import base64
import json
import requests
from flask import Flask, request, abort
from PIL import Image #Kissen installieren pip3 Kissen installieren

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, ImageMessage, ImageSendMessage
)


#LINE-Zugriffstoken und Anwendungsgeheimnis
ACCESS_TOKEN = ''
SECRET = ''
#Google Vision API-Schlüssel
API_KEY = ''

app = Flask(__name__)

line_bot_api = LineBotApi(ACCESS_TOKEN)
handler = WebhookHandler(SECRET)


@app.route('/')
def hello_world():
    return 'Hello World!'


@app.route('/callback',methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)
    
    return 'OK'

@handler.add(MessageEvent,message=ImageMessage)
def handle_message(event):
    try:
        message_content = line_bot_api.get_message_content(event.message.id)
        # event.message.Bildkörperdaten können durch Angabe der ID gelesen werden
        # message_content.content #Körper der erfassten Bilddatei

        image_base64 = base64.b64encode(message_content.content) #Konvertieren Sie die Bilddatei in base64

        #Anforderungshauptteil erstellen (json.dumps()In JSON konvertiert)
        req_body = json.dumps({
            'requests': [{
                'image': {
                    'content': image_base64.decode('utf-8')
                },
                'features': [{
                    'type': 'FACE_DETECTION',
                    'maxResults': 20,
                }]
            }]
        })
                            #Vision API-Endpunkt ↓
        res = requests.post("https://vision.googleapis.com/v1/images:annotate?key=" + API_KEY, data=req_body)
        #print('res Inhalt ist' + res.text)

        result = res.json()
    
        vertices = result["responses"][0]["faceAnnotations"]
        #print('Der Inhalt von Eckpunkten ist' + json.dumps(vertices)) 
        ##Antwortinhalt ist Antwort.Siehe json.

        if vertices:
            print('Ich konnte bekommen')
            image_base = Image.open(io.BytesIO(message_content.content))
            for face in vertices:
                corner = face["boundingPoly"]['vertices'][0]
                print('Ecke ist' + json.dumps(corner))
                print('face["boundingPoly"]["vertices"][1]["x"]Ist' + json.dumps(face["boundingPoly"]['vertices'][1]["x"]))
                width = face["boundingPoly"]['vertices'][1]["x"] - face["boundingPoly"]['vertices'][0]["x"]
                height = face["boundingPoly"]['vertices'][2]["y"] - face["boundingPoly"]['vertices'][1]["y"]

                image_cover = Image.open('static/cat.png') # cat.png muss ein Alpha-Kanal-Bild sein. ValueError:Fehler der schlechten Transparenzmaske
                image_cover = image_cover.resize((width,height))
                image_base.paste(image_cover, (corner['x'],corner['y']), image_cover)
                # Image.paste(im, box=None, mask=None)
                print('für Schleifenende')

            image_base.save('static/' + event.message.id + '.jpg')


        line_bot_api.reply_message(
            event.reply_token,
            ImageSendMessage(
                    original_content_url = "https://hidden-savannah-xxxxx.herokuapp.com/static/" + event.message.id + ".jpg ",
                    preview_image_url = "https://hidden-savannah-xxxxx.herokuapp.com/static/" + event.message.id + ".jpg "
            )
        )

    except:
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text="Ich konnte mein Gesicht nicht erkennen (keine Tiere, nur Menschen. Es ist schwierig, ein Profil zu haben oder zu nah dran zu sein")
        )


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))


Referenz:

Nur für den Fall, der Antwortinhalt von "print (" vertices content ist "+ json.dumps (vertices))" in Zeile 80

[
	{
		"boundingPoly": {
			"vertices": [
				{
					"x": 917,
					"y": 318
				},
				{
					"x": 1174,
					"y": 318
				},
				{
					"x": 1174,
					"y": 616
				},
				{
					"x": 917,
					"y": 616
				}
			]
		},
		"fdBoundingPoly": {
			"vertices": [
				{
					"x": 971,
					"y": 396
				},
				{
					"x": 1163,
					"y": 396
				},
				{
					"x": 1163,
					"y": 588
				},
				{
					"x": 971,
					"y": 588
				}
			]
		},
		"landmarks": [
			{
				"type": "LEFT_EYE",
				"position": {
					"x": 1031.1968,
					"y": 456.0161,
					"z": 0.0003030986
				}
			},
			{
				"type": "RIGHT_EYE",
				"position": {
					"x": 1112.0862,
					"y": 460.92987,
					"z": 28.232975
				}
			},
			{
				"type": "LEFT_OF_LEFT_EYEBROW",
				"position": {
					"x": 1008.84607,
					"y": 436.544,
					"z": -1.8571037
				}
			},
			{
				"type": "RIGHT_OF_LEFT_EYEBROW",
				"position": {
					"x": 1060.1007,
					"y": 440.86813,
					"z": -7.585352
				}
			},
			{
				"type": "LEFT_OF_RIGHT_EYEBROW",
				"position": {
					"x": 1095.2485,
					"y": 442.76245,
					"z": 5.0468025
				}
			},
			{
				"type": "RIGHT_OF_RIGHT_EYEBROW",
				"position": {
					"x": 1131.141,
					"y": 444.30832,
					"z": 41.595203
				}
			},
			{
				"type": "MIDPOINT_BETWEEN_EYES",
				"position": {
					"x": 1075.8728,
					"y": 455.9283,
					"z": -1.5975293
				}
			},
			{
				"type": "NOSE_TIP",
				"position": {
					"x": 1080.8457,
					"y": 504.33997,
					"z": -20.247692
				}
			},
			{
				"type": "UPPER_LIP",
				"position": {
					"x": 1071.2343,
					"y": 531.5437,
					"z": -1.6211907
				}
			},
			{
				"type": "LOWER_LIP",
				"position": {
					"x": 1069.6505,
					"y": 551.9242,
					"z": 4.4038887
				}
			},
			{
				"type": "MOUTH_LEFT",
				"position": {
					"x": 1035.7985,
					"y": 538.815,
					"z": 8.222528
				}
			},
			{
				"type": "MOUTH_RIGHT",
				"position": {
					"x": 1101.0676,
					"y": 541.8905,
					"z": 30.981604
				}
			},
			{
				"type": "MOUTH_CENTER",
				"position": {
					"x": 1070.1655,
					"y": 541.40643,
					"z": 4.1978736
				}
			},
			{
				"type": "NOSE_BOTTOM_RIGHT",
				"position": {
					"x": 1092.8889,
					"y": 510.94235,
					"z": 16.238985
				}
			},
			{
				"type": "NOSE_BOTTOM_LEFT",
				"position": {
					"x": 1049.6199,
					"y": 507.50146,
					"z": 0.9902145
				}
			},
			{
				"type": "NOSE_BOTTOM_CENTER",
				"position": {
					"x": 1072.0765,
					"y": 515.82806,
					"z": -2.7877321
				}
			},
			{
				"type": "LEFT_EYE_TOP_BOUNDARY",
				"position": {
					"x": 1037.2472,
					"y": 452.2355,
					"z": -4.3320293
				}
			},
			{
				"type": "LEFT_EYE_RIGHT_CORNER",
				"position": {
					"x": 1047.4124,
					"y": 459.2465,
					"z": 6.317641
				}
			},
			{
				"type": "LEFT_EYE_BOTTOM_BOUNDARY",
				"position": {
					"x": 1030.3141,
					"y": 461.9699,
					"z": 0.34013578
				}
			},
			{
				"type": "LEFT_EYE_LEFT_CORNER",
				"position": {
					"x": 1018.07513,
					"y": 455.93164,
					"z": 2.3924496
				}
			},
			{
				"type": "LEFT_EYE_PUPIL",
				"position": {
					"x": 1034.6456,
					"y": 457.22366,
					"z": -1.4217875
				}
			},
			{
				"type": "RIGHT_EYE_TOP_BOUNDARY",
				"position": {
					"x": 1109.9236,
					"y": 456.6617,
					"z": 21.767094
				}
			},
			{
				"type": "RIGHT_EYE_RIGHT_CORNER",
				"position": {
					"x": 1119.8134,
					"y": 462.12448,
					"z": 38.996845
				}
			},
			{
				"type": "RIGHT_EYE_BOTTOM_BOUNDARY",
				"position": {
					"x": 1110.3936,
					"y": 466.81308,
					"z": 26.98832
				}
			},
			{
				"type": "RIGHT_EYE_LEFT_CORNER",
				"position": {
					"x": 1094.9646,
					"y": 462.28857,
					"z": 22.470396
				}
			},
			{
				"type": "RIGHT_EYE_PUPIL",
				"position": {
					"x": 1109.2263,
					"y": 461.79114,
					"z": 25.238665
				}
			},
			{
				"type": "LEFT_EYEBROW_UPPER_MIDPOINT",
				"position": {
					"x": 1037.4519,
					"y": 429.95596,
					"z": -10.386488
				}
			},
			{
				"type": "RIGHT_EYEBROW_UPPER_MIDPOINT",
				"position": {
					"x": 1116.0272,
					"y": 434.71762,
					"z": 18.003847
				}
			},
			{
				"type": "LEFT_EAR_TRAGION",
				"position": {
					"x": 954.1669,
					"y": 484.3548,
					"z": 76.21559
				}
			},
			{
				"type": "RIGHT_EAR_TRAGION",
				"position": {
					"x": 1119.6852,
					"y": 494.08078,
					"z": 135.9113
				}
			},
			{
				"type": "FOREHEAD_GLABELLA",
				"position": {
					"x": 1078.9543,
					"y": 441.30212,
					"z": -4.084726
				}
			},
			{
				"type": "CHIN_GNATHION",
				"position": {
					"x": 1062.5234,
					"y": 589.9864,
					"z": 16.94458
				}
			},
			{
				"type": "CHIN_LEFT_GONION",
				"position": {
					"x": 968.6994,
					"y": 536.28186,
					"z": 52.295383
				}
			},
			{
				"type": "CHIN_RIGHT_GONION",
				"position": {
					"x": 1117.5015,
					"y": 545.4246,
					"z": 105.74548
				}
			}
		],
		"rollAngle": 4.5907497,
		"panAngle": 19.758451,
		"tiltAngle": -3.1237326,
		"detectionConfidence": 0.91960925,
		"landmarkingConfidence": 0.5607769,
		"joyLikelihood": "VERY_UNLIKELY",
		"sorrowLikelihood": "VERY_UNLIKELY",
		"angerLikelihood": "VERY_UNLIKELY",
		"surpriseLikelihood": "VERY_UNLIKELY",
		"underExposedLikelihood": "VERY_UNLIKELY",
		"blurredLikelihood": "VERY_UNLIKELY",
		"headwearLikelihood": "LIKELY"
	},
・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・

]


Es sieht aus wie das
GoogleVisionテスト.jpg
Hier sind einige der Bücher, die nicht funktioniert haben: [Flask-App für Heroku bereitstellen (bitter)](https://qiita.com/atomyah/items/91196f5fda95e4b9c7a6)
Referenz: [Gesichtserkennung mit Google Cloud Vision in Python](https://vaaaaaanquish.hatenablog.com/?page=1471257396)

Recommended Posts

So erstellen Sie einen LINE-Bot mit künstlicher Intelligenz mit der Flask + LINE Messaging-API
So erstellen Sie mit Flask einen BOT für Cisco Webex-Teams
Python-Anfänger haben beschlossen, einen LINE-Bot mit Flask zu erstellen (Flask-Kommentar)
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Machen Sie mit LINE + Flask einen morphologischen Analyse-Bot
Versuchen Sie, mit MVC eine RESTful-API mit Flask 1.0.2 zu erstellen
So erstellen Sie einen HTTPS-Server mit Go / Gin
So bedienen Sie die Discord API mit Python (Bot-Registrierung)
[LINE Messaging API] Erstellen Sie einen Papageienrückgabe-BOT mit Python
Ich habe versucht, LINE-Bot mit Python + Flask + ngrok + LINE Messaging API zu erstellen
Wie man einen lockeren Bot macht
Die weltweit am einfachsten zu verstehende Erklärung, wie LINE BOT erstellt wird (3) [Zusammenarbeit mit dem Server mit Git]
So erstellen Sie einen interaktiven LINE BOT 004 (beantworten Sie den Stichtag eines börsennotierten Unternehmens)
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
[Python] Erstellen Sie schnell eine API mit Flask
Hochladen mit Heroku, Flask, Python, Git (4)
Einführung in die künstliche Intelligenz mit Python 1 "Genetic Algorithm-Theory-"
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (11)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (8)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (1)
Einführung in die künstliche Intelligenz mit Python 2 "Genetic Algorithm-Practice-"
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (4)
So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (7)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (2)
So beschneiden Sie ein Bild mit Python + OpenCV
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (3)
LINE BOT mit Python + AWS Lambda + API Gateway
So lesen Sie ein Array mit Pythons ConfigParser
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (6)
Erstellen Sie mit Amazon Lex einen LINE WORKS-Bot
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (5)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (10)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (9)
Erklären, wie LINE BOT auf einfachste Weise der Welt erstellt werden kann (2) [Vorbereiten der Bot-Anwendung in einer lokalen Umgebung mit Django of Python]
[Lernnotiz] So erstellen Sie eine App mit Django ~ Bis Hello World angezeigt wird ~
Die weltweit am einfachsten zu verstehende Erklärung zur Herstellung von LINE BOT (1) [Kontoerstellung]
[Lernnotiz] So erstellen Sie eine Anwendung mit Django ~ Von der virtuellen Umgebung bis zum Pushing zu Github ~
So erstellen Sie einen Artikel über die Befehlszeile
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
Spielen mit der benutzerlokalen API für künstliche Intelligenz in Python
Hochladen mit Heroku, Flask, Python, Git (Teil 3)
So führen Sie mit OpenCV ein Null-Padding in einer Zeile durch
Wie man ein Schießspiel mit toio macht (Teil 1)
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
So erstellen Sie ein interaktives CLI-Tool mit Golang
Hochladen mit Heroku, Flask, Python, Git (Teil 1)
Hochladen mit Heroku, Flask, Python, Git (Teil 2)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (12) (vollständig)
Analysieren mit Google Colaboratory mithilfe der Kaggle-API
Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
[Super einfach] Machen wir einen LINE BOT mit Python.
Machen Sie einen LINE BOT
"Inoffizielle Apple Refurbished Product Introduction" BOT mit LINE Messaging API (v2) + API Gateway + Lambda (Python)