Teachable Machine Model과 카카오 챗봇 연동시키기

안녕하세요.

어린이도 쉽게 만드는 인공지능, 구글의 Teachable Machine에서 추출한 모델을 가지고

goormide, keras, flask를 이용하여 API를 만들어서 카카오 챗봇과 연동시켜 보겠습니다.

개와 고양이를 분류하는 모델을 만들고

유저가 챗봇에서 개 사진을 보내면 “개”라는 텍스트를,

고양이 사진을 보내면 “고양이”라는 텍스트를 출력해 보겠습니다.

주의사항

챗봇을 만들기 위해서는 사전에 카카오 i 오픈빌더에 오픈베타 신청을 하셔야 됩니다.

사전준비 및 모델 생성

이미지를 직접 웹캠으로 추출해도 되지만, 편의를 위해 크롬의 확장 프로그램 ‘Image Downloader’를 이용하여

개와 고양이의 이미지를 한꺼번에 다운로드 받겠습니다.

[##_Image|kage@J4WVC/btqEwgQ2TzB/oKt2N26rqKRLK2FN2aZa81/img.png|alignCenter|data-origin-width=”1915” data-origin-height=”1731” data-ke-mobilestyle=”widthContent”|크롬 확장프로그램 - Image Downloader||_##]

이미지 다운로드가 완료되었다면 다운로드된 폴더에서 관련 없는 사진을 삭제해 준 다음에

https://www.teachablemachine.withgoogle.com

티처블 머신 사이트에서 Image Project를 생성해줍니다.

1~2. Upload버튼을 누른 후 다운로드 받은 폴더를 하나씩 드래그 앤 드롭 해줍니다.

3. Train 버튼을 눌러 학습을 시킵니다.

4. Webcam을 File로 바꾼 후 아무 사진이나 하나를 드래그 앤 드롭해서 테스트를 해줍니다.

Dog 100%로 이미지 분류 모델이 손쉽게 완성되었습니다!

이후 Export Model을 클릭하고 Tensorflow로 Keras Model을 다운로드 해줍니다.

이렇게 간단한 방법으로 딥러닝을 이용한 이미지 분류 모델이 생성되었습니다!

카카오 챗봇과 연동가능한 API 만들기

goormide를 이용하여 Flask 스택의 새 컨테이너를 만들어줍니다.

컨테이너가 생성되었다면 컨테이너를 실행시킵니다.

상단의 파일->가져오기->파일을 클릭하여 다운로드 받은 후 압축을 푼 티처블 머신 모델을 업로드해줍니다.

실행시킨 컨테이너의 app.py에 아래 코드를 복사-붙여넣기 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import tensorflow.keras
import flask
import urllib.request
from PIL import Image, ImageOps
import numpy as np

app = flask.Flask(__name__)
model = None


def load_model():

global model
model = tensorflow.keras.models.load_model('keras_model.h5')


@app.route("/api/predict", methods=["POST"])
def api_predict():

# UserRequest 중 발화를 req에 parsing.
req = flask.request.get_json()
req = req['userRequest']['utterance']

# 이미지 전처리 - 발화가 jpg, png 확장자일 때만 실행
if 'jpg' in req or 'png' in req:
np.set_printoptions(suppress=True)
data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
urllib.request.urlretrieve(req, 'img')
image = Image.open('img').convert('RGB')
size = (224, 224)
image = ImageOps.fit(image, size, Image.ANTIALIAS)
image_array = np.asarray(image)
normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1
data[0] = normalized_image_array
prediction = model.predict(data)

output = np.argmax(prediction, axis=-1)

if (output == 0):
msg = "개입니다!"
else:
msg = "고양이입니다!"

# basic card format
res = {
"version": "2.0",
"template": {
"outputs": [
{
"basicCard": {
"title": msg,
"description": "",
"thumbnail": {
"imageUrl": req
},
"buttons": [
{
"action": "webLink",
"label": "사진보기",
"webLinkUrl": req
}
]
}
}
]
}
}

else:
# simple text format
res = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": "사진을 보내주세요"
}
}
]
}
}
print(res)
return flask.jsonify(res)


if __name__ == "__main__":
print("* Loading Keras model and Flask starting server...")
print("please wait until server has fully started")
load_model()
app.run(host='0.0.0.0')

플라스크는 기본으로 5000번 포트를 사용합니다.

상단에 컨테이너 -> 포트포워딩설정 후 내부포트 5000번을 등록시킵니다. (실제 접근은 외부포트 53513으로 합니다.)

이 때 나오는 명령어 부분을 복사해서 메모장에 적어놓습니다.

여기까지 완료되었다면, 터미널에 python app.py 명령어로 서버를 작동시킵니다.

아래와 같은 메세지가 출력된다면 서버가 정상적으로 실행된 것입니다. (종료는 Ctrl+C)

이제 api서버가 완성되었습니다!

카카오 챗봇 생성

카카오톡 채널 관리자센터에서 테스트용 채널을 하나 개설해줍니다.

https://i.kakao.com/login

사전신청이 완료되었다면 챗봇을 하나 만들어줍니다.

미리 만든 채널과 연결을 시켜주면 카카오톡에서 검색이 가능해집니다.

오픈빌더의 장점은 손쉽게 다양한 유저 시나리오를 구성할 수 있다는 것입니다.

자세한 내용은 도움말 탭을 참고하세요.

우선 스킬 탭으로 와서 스킬을 하나 생성해줍니다.

Flask 서버에서 “/api/predict”에 동작하게 해놨으니 URL에는

아까 복사해놓은 명령어(ip주소:포트) 뒤에 /api/predict를 붙여줍니다.

이렇게 스킬을 저장한 뒤, 이미지를 손쉽게 input으로 받기 위해서 폴백블록을 사용해줄 것입니다.

폴백블록은 사용자가 봇이 이해하기 힘든 말을 했을 때 “다시 말씀해 주세요”, “이해하지 못했어요” 등의 메세지를 처리하는 블록입니다.

위와 같이 우측 중단에 만든 스킬을 연결시켜주고, 하단 봇 응답에 “스킬데이터 사용”을 활성화 해주고 저장시킵니다.

이제 우측 상단에 있는 봇테스트 버튼을 누르고 폴백 블록이 잘 동작하는지 확인해봅니다.

위와 같은 메세지가 잘 출력이 되었다면, 배포 탭에 들어가서 배포를 해줍니다.

배포가 완료된 뒤 만든 채널을 찾아서 대화를 시작합니다.

Basic Card Format으로 응답이 잘 되는 것을 확인할 수 있습니다.

response의 경우 카카오 오픈빌더 도움말에서 상세하게 설명하고 있으니 적절한 포맷을 찾아 응답을 해주면 될 것 같습니다.

Teachable Machine Model과 카카오 챗봇 연동시키기

https://l-yohai.github.io/Teachable-Machine-Model-for-kakao-chatbot/

Author

Yohan Lee

Posted on

2020-05-30

Updated on

2021-08-22

Licensed under

댓글