【기계 학습】Custom Vision을 사용하여 재료의 사진을 보내면 자동으로 요리를 제안해 주는 LINEBOT를 작성해 보았다 【이미지 인식】
그래서 이번 Azure Custom Vision을 사용하여 재료의 사진을 보내면 자동으로 요리를 제안해주는 LINEBOT을 만들어 보았습니다.
Custom Vision은 이미지 식별 로직을 직접 구축, 배포할 수 있는 AI 이미지 인식 서비스로 업로드한 이미지에 태그를 지정(라벨링)하여 기계 학습할 수 있습니다.
자세한 내용은 여기을 참조하십시오.
LINEBOT: "cook-book"
환경
기계 학습
이러한 형태로 업로드한 이미지를 라벨링하여 기계 학습이 가능합니다.
소스 코드
'use strict';
const express = require('express');
const line = require('@line/bot-sdk');
const axios = require('axios');
const PORT = process.env.PORT || 3000;
const config = {
channelSecret: '', //チャンネルシークレット
channelAccessToken: '' //チャンネルアクセストークン
};
const app = express();
app.post('/webhook', line.middleware(config), (req, res) => {
console.log(req.body.events);
Promise
.all(req.body.events.map(handleEvent))
.then((result) => res.json(result));
});
const client = new line.Client(config);
function handleEvent(event) {
console.log(event);
if (event.type !== 'message' || event.message.type !== 'image') {
return Promise.resolve(null);
}
let mes = ''
if (event.message.type === 'image') {
mes = 'レシピを探します';
getFaceDetect2(event.message.id, event.source.userId, config.channelAccessToken);
} else {
mes = event.message.text;
}
return client.replyMessage(event.replyToken, {
type: 'text',
text: mes
});
}
const getFaceDetect2 = async (messageId, userId, accessToken) => {
console.log("getFaceDetect2");
console.log(messageId);
console.log(accessToken);
//LINEbotから画像取得する
const configImageAPI = {
url: `https://api.line.me/v2/bot/message/${messageId}/content`,
method: 'get',
headers: {
'Authorization': 'Bearer ' + accessToken,
},
responseType: 'arraybuffer'
};
let responseImageAPI;
try {
responseImageAPI = await axios.request(configImageAPI);
console.log('image data get');
} catch (error) {
console.log('post Error');
console.error(error);
}
//Custom Vision APIへのリクエスト
const CUSTOM_VISION_API_ENDPOINT_URL = ''; //CUSTOM_VISION_API URL"If you have an image file:"
const configCustomVisionAPI = {
url: CUSTOM_VISION_API_ENDPOINT_URL,
method: 'post',
headers: {
'Content-type': 'application/octet-stream',
'Prediction-Key': '' //CustomVisionAPIのプレディクションキー
},
data: responseImageAPI.data
};
let responseCustomVision;
try {
responseCustomVision = await axios.request(configCustomVisionAPI);
console.log("post OK");
console.log(responseCustomVision.data.predictions[0].tagName);
} catch (error) {
console.log("post Error");
}
//LINEBOT
await client.pushMessage(userId, {
type: 'text',
text: JSON.stringify(responseCustomVision.data.predictions[0].tagName) + 'がお薦めです'
});
}
app.listen(PORT);
console.log(`Server running at ${PORT}`);
LINE BOT의 움직임
미리 업로드하지 않은 이미지에서도 Custom Vision에서 기계 학습을 했으므로,
어느 정도 인식하고 판정하는 것이 가능합니다.
다음은 사전에 캡처하지 않은 이미지를 사용하여 테스트합니다.
쇠고기, 실 곤약, 감자, 당근, 콩의 경우
계란, 푸른 파, 베이컨의 경우
쇠고기, 양고기, 양파, 당근, 토마토, 감자의 경우
돼지고기, 두부, 파 파의 경우
끝에
'use strict';
const express = require('express');
const line = require('@line/bot-sdk');
const axios = require('axios');
const PORT = process.env.PORT || 3000;
const config = {
channelSecret: '', //チャンネルシークレット
channelAccessToken: '' //チャンネルアクセストークン
};
const app = express();
app.post('/webhook', line.middleware(config), (req, res) => {
console.log(req.body.events);
Promise
.all(req.body.events.map(handleEvent))
.then((result) => res.json(result));
});
const client = new line.Client(config);
function handleEvent(event) {
console.log(event);
if (event.type !== 'message' || event.message.type !== 'image') {
return Promise.resolve(null);
}
let mes = ''
if (event.message.type === 'image') {
mes = 'レシピを探します';
getFaceDetect2(event.message.id, event.source.userId, config.channelAccessToken);
} else {
mes = event.message.text;
}
return client.replyMessage(event.replyToken, {
type: 'text',
text: mes
});
}
const getFaceDetect2 = async (messageId, userId, accessToken) => {
console.log("getFaceDetect2");
console.log(messageId);
console.log(accessToken);
//LINEbotから画像取得する
const configImageAPI = {
url: `https://api.line.me/v2/bot/message/${messageId}/content`,
method: 'get',
headers: {
'Authorization': 'Bearer ' + accessToken,
},
responseType: 'arraybuffer'
};
let responseImageAPI;
try {
responseImageAPI = await axios.request(configImageAPI);
console.log('image data get');
} catch (error) {
console.log('post Error');
console.error(error);
}
//Custom Vision APIへのリクエスト
const CUSTOM_VISION_API_ENDPOINT_URL = ''; //CUSTOM_VISION_API URL"If you have an image file:"
const configCustomVisionAPI = {
url: CUSTOM_VISION_API_ENDPOINT_URL,
method: 'post',
headers: {
'Content-type': 'application/octet-stream',
'Prediction-Key': '' //CustomVisionAPIのプレディクションキー
},
data: responseImageAPI.data
};
let responseCustomVision;
try {
responseCustomVision = await axios.request(configCustomVisionAPI);
console.log("post OK");
console.log(responseCustomVision.data.predictions[0].tagName);
} catch (error) {
console.log("post Error");
}
//LINEBOT
await client.pushMessage(userId, {
type: 'text',
text: JSON.stringify(responseCustomVision.data.predictions[0].tagName) + 'がお薦めです'
});
}
app.listen(PORT);
console.log(`Server running at ${PORT}`);
LINE BOT의 움직임
미리 업로드하지 않은 이미지에서도 Custom Vision에서 기계 학습을 했으므로,
어느 정도 인식하고 판정하는 것이 가능합니다.
다음은 사전에 캡처하지 않은 이미지를 사용하여 테스트합니다.
쇠고기, 실 곤약, 감자, 당근, 콩의 경우
계란, 푸른 파, 베이컨의 경우
쇠고기, 양고기, 양파, 당근, 토마토, 감자의 경우
돼지고기, 두부, 파 파의 경우
끝에
Reference
이 문제에 관하여(【기계 학습】Custom Vision을 사용하여 재료의 사진을 보내면 자동으로 요리를 제안해 주는 LINEBOT를 작성해 보았다 【이미지 인식】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Naru0607/items/16c42a242ddc90009a30텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)