module.exports = { main: async function (event, context) {
const request = require('request-promise-native');
if (!event.image && !event.extensions && !event.extensions.request && !event.extensions.request.query && !event.extensions.request.query.image) {
return "Parameter missing:\nimage: image url (mandatory)\n";
}
const query = event.extensions.request.query;
const image = query.image;
//-------- Leonardo MLF Find Similarity ------------
const lmlf_auth = Buffer.from(process.env.LMLF_CLIENT_ID + ':' + process.env.LMLF_CLIENT_SECRET).toString('base64');
const tokenResp = await request({
method: 'GET',
headers: {
'Authorization': `Basic ${lmlf_auth}`,
json: true
},
url: `${process.env.LMLF_URL}/oauth/token?grant_type=client_credentials`,
json: true
});
const apiKey = tokenResp.access_token;
var imageFeatureExtractionData = {};
imageFeatureExtractionData = await request({
method: 'POST',
headers: {
'Authorization': 'Bearer ' + apiKey
},
formData: {
files: {
value: await request.get(image, { encoding: null }),
options: {
filename: 'label.jpg',
contentType: 'image/jepg'
}
}
},
url: `${process.env.LMLF_IMAGE_FEATURE_EXTRACTION_URL}`,
json: true
});
const similarScoring = { "0": [] };
similarScoring["0"].push({"id": "examinee", "vector": imageFeatureExtractionData.predictions[0].featureVectors});
var referenceLabel = JSON.parse(process.env.REFERENCE_1);
const referenceLabels = [];
referenceLabels.push(referenceLabel);
similarScoring["0"].push({"id": 0, "vector": referenceLabel.featureVectors});
referenceLabel = JSON.parse(process.env.REFERENCE_2);
referenceLabels.push(referenceLabel);
similarScoring["0"].push({"id": 1, "vector": referenceLabel.featureVectors});
referenceLabel = JSON.parse(process.env.REFERENCE_3);
referenceLabels.push(referenceLabel);
similarScoring["0"].push({"id": 2, "vector": referenceLabel.featureVectors});
referenceLabel = JSON.parse(process.env.REFERENCE_4);
referenceLabels.push(referenceLabel);
similarScoring["0"].push({"id": 3, "vector": referenceLabel.featureVectors});
referenceLabel = JSON.parse(process.env.REFERENCE_5);
referenceLabels.push(referenceLabel);
similarScoring["0"].push({"id": 4, "vector": referenceLabel.featureVectors});
const imageSimilarityScoringData = await request({
method: 'POST',
headers: {
'Authorization': 'Bearer ' + apiKey
},
formData: {
texts: JSON.stringify(similarScoring),
options: '{"numSimilarVectors":1}'
},
url: `${process.env.LMLF_SIMILARITY_SCORING_URL}`,
json: true
});
var similarityResult = imageSimilarityScoringData.predictions[0].similarVectors[0];
var similar = referenceLabels[similarityResult.id];
similarityResponse = {
name: similar.name,
image: similar.image,
detail: similar.detail,
score: similarityResult.score
};
//--------- Helper Functions GOOGLE VISION Scan Text --------------
const regexDetectLeviTrade = /(501|502|504|505|510|511|512|513|514|517|519|527|541|550|559|560|569|705)/;
const regexSize = /(W *\d{2,} *(I|L|1|\|) *\d{2,})|(\d{2,} *(I|L|1|\|) *\d{2,}^)|(W *\d{2,} *\d{2,})/;
const regexSizeNumber = /[2-6]{1}\d{1}/g;
const outScanGoogle = function(text) {
var resp = {
id: "Done!",
type: {number: "", name: "Google Scan"},
size: {W:0, L:0}
};
var regex;
regex = regexDetectLeviTrade.exec(text);
if (regex) {
resp.type.number = regex[0];
}
regex = regexSize.exec(text);
if (regex) {
var textSize = regex[0];
var isW = true;
do {
regex = regexSizeNumber.exec(textSize);
if (regex) {
if (isW){
resp.size.W = parseInt(regex[0]);
isW = false;
} else {
resp.size.L = parseInt(regex[0]);
}
}
} while(regex);
}
return resp;
};
//--------- GOOGLE VISION Scan Text --------------
const vision = require('@google-cloud/vision');
const client = new vision.ImageAnnotatorClient({credentials:{
client_email: process.env.GOOGLE_APPLICATION_CREDENTIALS_EMAIL,
private_key: process.env.GOOGLE_APPLICATION_CREDENTIALS_KEY.replace(/\\n/g, '\n')
}});
const [googleResult] = await client.documentTextDetection(`${image}`);
const fullTextAnnotation = googleResult.fullTextAnnotation;
var text = fullTextAnnotation ? fullTextAnnotation.text : "";
var response = outScanGoogle(text);
response.similarity = similarityResponse;
return {
response
}
}}
要获取更多Jerry的原创文章,请关注公众号"汪子熙":