From 7889fe059d319c08e381a4ff29be460daca78693 Mon Sep 17 00:00:00 2001 From: Vishvesh Shah Date: Sun, 28 Jun 2015 11:48:24 -0700 Subject: [PATCH 1/4] Added support for Face Detection Recognition It was missing previously in the SDK. --- alchemyapi.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/alchemyapi.js b/alchemyapi.js index b83cd3a..492791a 100644 --- a/alchemyapi.js +++ b/alchemyapi.js @@ -268,6 +268,9 @@ AlchemyAPI.ENDPOINTS['image']['url'] = '/url/URLGetImage'; AlchemyAPI.ENDPOINTS['image_keywords'] = {}; AlchemyAPI.ENDPOINTS['image_keywords']['url'] = '/url/URLGetRankedImageKeywords'; AlchemyAPI.ENDPOINTS['image_keywords']['image'] = '/image/ImageGetRankedImageKeywords'; +AlchemyAPI.ENDPOINTS['image_face_tag'] = {}; +AlchemyAPI.ENDPOINTS['image_face_tag']['url'] = '/url/URLGetRankedImageFaceTags'; +AlchemyAPI.ENDPOINTS['image_face_tag']['image'] = '/image/ImageGetRankedImageFaceTags'; @@ -829,3 +832,33 @@ AlchemyAPI.prototype.image_keywords = } }; +/** + * Face detection and Recognition + * + * INPUT: + * flavor -> which version of the call (currently, only 'url' or 'image' is supported) + * data -> the URL to the data to analyze. + * options -> various parameters that can be used to adjust how the API works, see below for more info on the available options. + * callback -> the callback function for this async function + * + * Available Options: + * imagePostMode -> not-raw: pass an unencoded image file with "image=URI_ENCODED_DATA"; raw: pass an unencoded image file using POST ('image' flavor only). + * knowledgeGraph -> provide extra metadata for detected celebrities + * + * OUTPUT: + * The response, already converted from JSON to a Javascript object. +*/ +AlchemyAPI.prototype.image_face_tag = + function(flavor, data, options, callback) { + options = options || {} + + //Add the data to the options and analyze + if (flavor === "image") { // if it's an image, we'll pass the image to upload + this.analyze(AlchemyAPI.ENDPOINTS['image_face_tag'][flavor], + options, data, callback); + } else { + options[flavor] = data; + this.analyze(AlchemyAPI.ENDPOINTS['image_face_tag'][flavor], + options, callback); + } +}; From 2583105214655ae8aa43c44b8148b0ada69df6e6 Mon Sep 17 00:00:00 2001 From: Vishvesh Shah Date: Sun, 28 Jun 2015 11:50:36 -0700 Subject: [PATCH 2/4] Local Image POST and Display Using Base64 Image conversion. Local Image upload functionality was missing before. politicians.jpg local image for face recognition --- app.js | 36 ++++++++++++++++++++++++++++++++++++ politicians.jpg | Bin 0 -> 40053 bytes 2 files changed, 36 insertions(+) create mode 100644 politicians.jpg diff --git a/app.js b/app.js index 4836a51..82d7a73 100644 --- a/app.js +++ b/app.js @@ -55,7 +55,21 @@ server.listen(port, function(){ var demo_text = 'Yesterday dumb Bob destroyed my fancy iPhone in beautiful Denver, Colorado. I guess I will have to head over to the Apple Store and buy a new one.'; var demo_url = 'http://www.npr.org/2013/11/26/247336038/dont-stuff-the-turkey-and-other-tips-from-americas-test-kitchen'; var demo_html = 'Node.js Demo | AlchemyAPI

Did you know that AlchemyAPI works on HTML?

Well, you do now.

'; +var post_image = 'emaxfpo.jpg'; +var url_face_image = 'http://demo1.alchemyapi.com/images/vision/mother-daughter.jpg'; +var post_face_image = 'politicians.jpg'; +var fs = require('fs'); +// function to encode file data to base64 encoded string +function base64_encode(file) { + // read binary data + var bitmap = fs.readFileSync(file); + // convert binary data to base64 encoded string + return new Buffer(bitmap).toString('base64'); +} + +var base64str = base64_encode(post_image); +var face_base64str = base64_encode(post_face_image); function example(req, res) { var output = {}; @@ -178,6 +192,27 @@ function combined(req, res, output) { function image(req, res, output) { alchemyapi.image('url', demo_url, {}, function(response) { output['image'] = { url:demo_url, response:JSON.stringify(response,null,4), results:response }; + post_local_image(req, res, output); + }); +} + +function post_local_image(req, res, output) { + alchemyapi.image_keywords('image', post_image, {}, function(response) { + output['post_local_image'] = { url:post_image, base:base64str, response:JSON.stringify(response,null,4), results:response }; + face_image(req, res, output); + }); +} + +function face_image(req, res, output) { + alchemyapi.image_face_tag('url', url_face_image, {}, function(response) { + output['face_image'] = { url:url_face_image, response:JSON.stringify(response,null,4), results:response }; + face_local_image(req, res, output); + }); +} + +function face_local_image(req, res, output) { + alchemyapi.image_face_tag('image', post_face_image, {}, function(response) { + output['face_local_image'] = { url:post_face_image, base:face_base64str, response:JSON.stringify(response,null,4), results:response }; image_keywords(req, res, output); }); } @@ -189,3 +224,4 @@ function image_keywords(req, res, output) { }); } + diff --git a/politicians.jpg b/politicians.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb362e2a6392b330e817ea44188e1920337ba3bc GIT binary patch literal 40053 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 HxR3wY>R+g@ literal 0 HcmV?d00001 From a36f3e81e7af133a9fb702b7565cbb494f5036ac Mon Sep 17 00:00:00 2001 From: Vishvesh Shah Date: Sun, 28 Jun 2015 11:51:59 -0700 Subject: [PATCH 3/4] Added face recognition api call tests --- tests.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tests.js b/tests.js index ba9dee8..edc1710 100644 --- a/tests.js +++ b/tests.js @@ -24,6 +24,8 @@ var test_text = 'Bob broke my heart, and then made up this silly sentence to tes var test_html = 'The best SDK Test | AlchemyAPI

Hello World!

My favorite language is Javascript

'; var test_url = 'http://www.nytimes.com/2013/07/13/us/politics/a-day-of-friction-notable-even-for-a-fractious-congress.html?_r=0'; var test_image = './emaxfpo.jpg'; +var test_face_url = 'http://demo1.alchemyapi.com/images/vision/mother-daughter.jpg'; +var test_face_image = 'politicians.jpg'; @@ -380,10 +382,29 @@ function image_keywords() { alchemyapi.image_keywords('image', test_image, null, function(response) { assert.equal(response['status'],'OK'); console.log('Image keywords tests complete!\n'); - combined(); + url_face_tag(); + }); +} + +//Face detection with URL +function url_face_tag() { + console.log('Checking url image Face . . . '); + alchemyapi.image_face_tag('url', test_face_url, null, function(response) { + assert.equal(response['status'],'OK'); + console.log('Face Detection tests complete!\n'); + image_face_tag(); }); } +//Face detection with POST +function image_face_tag() { + console.log('Checking image Face . . . '); + alchemyapi.image_face_tag('image', test_face_image, null, function(response) { + assert.equal(response['status'],'OK'); + console.log('Face Detection tests complete!\n'); + combined(); + }); +} //Combined function combined() { From 21d4b94b4caf80cb85d391a00d77e38b807e24d4 Mon Sep 17 00:00:00 2001 From: Vishvesh Shah Date: Sun, 28 Jun 2015 11:53:07 -0700 Subject: [PATCH 4/4] Added Basic Layout Show local uploaded image and face detection and JSON response. --- views/example.dust | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/views/example.dust b/views/example.dust index e50f780..831c8ea 100644 --- a/views/example.dust +++ b/views/example.dust @@ -263,6 +263,20 @@

Image: {image.results.image}
+ +


+ +

Image Local Upload

+
+ +

Processed Local Image

+

+ +

Response Object

+ + +

Image Keywords Tagging

@@ -323,6 +337,29 @@
+

Face Recognition

+

+ For the docs: http://www.alchemyapi.com/api/

+ +

Processed URL

+

{face_image.url}

+ +

Response Object

+ + +
+ +

Face Recognition Local Image

+

+ For the docs: http://www.alchemyapi.com/api/

+ +

Local Image

+

+ +

Response Object

+ + +
{/content}

+ For the docs: http://www.alchemyapi.com/api/