modification for face recognition utility 18/2018/4
authorEric Z <ezavesky@research.att.com>
Fri, 1 Jun 2018 22:19:04 +0000 (17:19 -0500)
committerEric Z <ezavesky@research.att.com>
Mon, 4 Jun 2018 15:40:09 +0000 (15:40 +0000)
- update type monikers for region naming instead of tag/detection (+version bump)
- minor JS response updates
- new local protobuf defintion for pending recognition

Change-Id: I069922f502e6e08ff65a5a0020686520f550392c
Signed-off-by: Eric Z <ezavesky@research.att.com>
docs/release-notes.md
docs/tutorials/lesson3.md
face_privacy_filter/_version.py
face_privacy_filter/transform_detect.py
face_privacy_filter/transform_region.py
web_demo/face-privacy.html
web_demo/face-privacy.js
web_demo/images/face_DeGeneres.jpg [new file with mode: 0644]
web_demo/model.detect.proto
web_demo/model.pixelate.proto
web_demo/model.recognize.proto [new file with mode: 0644]

index 74450f2..3995a46 100644 (file)
 
 # Face Privacy Filter Release Notes
 ## 0.3
+### 0.3.2
+* Minor updates to web JS demo pages for pending recognition model
+* *Type Change* rename input and output types to **region** monikers to better reflect target
+
 ### 0.3.1
 * Update model to use single image as input type
 * Update javascript demo to run with better CORS behavior (github htmlpreview)
index 53975bd..c442d22 100644 (file)
@@ -87,7 +87,7 @@ image that was sent to the remote service.  When available, the <strong>Download
 button will be enabled and a binary file will be generated in the browser.
 
 ```
-protoc --decode=HipTviKTkIkcmyuMCIAIDkeOOQQYyJne.FaceImage model.pixelate.proto < protobuf.bin
+protoc --decode=HipTviKTkIkcmyuMCIAIDkeOOQQYyJne.Image model.pixelate.proto < protobuf.bin
 ```
 
 **NOTE** The specific package name may have changed since the time of writing,
@@ -120,6 +120,7 @@ and visualize the results of image classification.
 * [family face example](../../web_demo/images/face_family.jpg) ([pexel source](https://www.pexels.com/photo/adult-affection-beautiful-beauty-265764/))
 * [DiCaprio celebrity face sample](../../web_demo/images/face_DiCaprio.jpg) ([wikimedia source](https://en.wikipedia.org/wiki/Celebrity#/media/File:Leonardo_DiCaprio_visited_Goddard_Saturday_to_discuss_Earth_science_with_Piers_Sellers_(26105091624)_cropped.jpg))
 * [Schwarzenegger celebrity face sample](../../web_demo/images/face_Schwarzenegger.jpg) ([wikimedia source](https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/A._Schwarzenegger.jpg/220px-A._Schwarzenegger.jpg))
+* [DeGeneres celebrity face sample](../../web_demo/images/face_DeGeneres.jpg) ([wikipedia source](https://en.wikipedia.org/wiki/Ellen_DeGeneres#/media/File:Ellen_DeGeneres-2009.jpg))
 
 
 before  | after
index e1b7def..d5fad04 100644 (file)
@@ -1,3 +1,3 @@
 # -*- coding: utf-8 -*-
-__version__ = "0.3.1"
+__version__ = "0.3.2"
 MODEL_NAME = 'face_privacy_filter'
index 21a44dc..e9b704f 100644 (file)
@@ -122,7 +122,7 @@ class FaceDetectTransform(BaseEstimator, ClassifierMixin):
     def _type_out(self):
         """Custom input type for this processing transformer"""
         output_dict = FaceDetectTransform.generate_out_dict()
-        return [(k, type(output_dict[k])) for k in output_dict], "DetectionFrame"
+        return [(k, type(output_dict[k])) for k in output_dict], "RegionDetection"
 
     def score(self, X, y=None):
         return 0
index 938fbec..863fee2 100644 (file)
@@ -65,7 +65,7 @@ class RegionTransform(BaseEstimator, ClassifierMixin):
     def _type_in(self):
         """Custom input type for this processing transformer"""
         input_dict = RegionTransform.generate_in_dict()
-        return [(k, type(input_dict[k])) for k in input_dict], "DetectionFrame"
+        return [(k, type(input_dict[k])) for k in input_dict], "RegionDetection"
 
     @property
     def _type_out(self):
index c264983..c0996e3 100644 (file)
@@ -70,6 +70,10 @@ Rewrite to utilize simple image-based processing steps.
         <img src="images/face_Schwarzenegger.jpg" />
         <span><a href="https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/A._Schwarzenegger.jpg/220px-A._Schwarzenegger.jpg" target="_new">wikimedia source</a></span>
     </div>
+    <div>
+        <img src="images/face_DeGeneres.jpg" />
+        <span><a href="https://en.wikipedia.org/wiki/Ellen_DeGeneres#/media/File:Ellen_DeGeneres-2009.jpg" target="_new">wikipedia source</a></span>
+    </div>
     <div>
         <label>Custom Upload</label><br/>
         <input type="file" id="imageLoader" name="imageLoader"/>
index 59f0727..548dc10 100644 (file)
@@ -44,7 +44,7 @@ $(document).ready(function() {
         urlDefault = "http://localhost:8884/classify";
     demo_init({
         classificationServer: urlDefault,
-        protoList: [["model.pixelate.proto", true], ["model.detect.proto", false] ]
+        protoList: [["model.pixelate.proto", true], ["model.detect.proto", false], ["model.recognize.proto", false] ]
     });
 });
 
@@ -113,7 +113,7 @@ function processResult(data, dstDiv, methodKeys, dstImg, imgPlaceholder) {
             var nameClean = val.name;
             if (nameClean != 'imageBinary') {
                 domTable.append($("<th />").html(nameClean));
-                arrNames.push(nameClean);
+                arrNames.push([nameClean, val.repeated]);
             }
         });
         domTable = $("<table />").append(domTable);     // create embedded table
@@ -132,8 +132,10 @@ function processResult(data, dstDiv, methodKeys, dstImg, imgPlaceholder) {
             }
 
             var domRow = $("<tr />");
-            $.each(arrNames, function(idx, name) {      //collect data from each column
-                domRow.append($("<td />").html(val[name]));
+            $.each(arrNames, function(idx, field_data) {      //collect data from each column
+                //add safety to avoid printing repeated rows!
+                domRow.append($("<td />").html(!field_data[1] ?
+                    val[field_data[0]] : val[field_data[0]].length + " items"));
             });
             domTable.append(domRow);
         });
@@ -144,10 +146,13 @@ function processResult(data, dstDiv, methodKeys, dstImg, imgPlaceholder) {
         if (objBest != null) {
             //some images are too big for direct btoa/array processing...
             //dstImg.attr('src', "data:"+objBest.mimeType+";base64,"+strImage).removeClass('workingImage');
-            dstImg.attr('src', BlobToDataURI(objBest.imageBinary)).removeClass('workingImage');
+            dstImg.attr('src', BlobToDataURI(objBest.imageBinary, objBest.mimeType)).removeClass('workingImage');
+        }
+        else if (imgPlaceholder) {
+            dstImg.attr('src', imgPlaceholder).removeClass('workingImage');
         }
         else {
-            var errStr = "Error: No valid image data was found, aborting display.";
+            var errStr = "Error: No valid image data was found and no placeholder, aborting display.";
             console.log(errStr);
             dstDiv.html(errStr);
             return false;
diff --git a/web_demo/images/face_DeGeneres.jpg b/web_demo/images/face_DeGeneres.jpg
new file mode 100644 (file)
index 0000000..7d3d9e1
Binary files /dev/null and b/web_demo/images/face_DeGeneres.jpg differ
index b1d913c..a0df2d3 100644 (file)
@@ -2,7 +2,7 @@ syntax = "proto3";
 package wvHeYuPGGFSeCSLULBxxJquKipiUljuZ;
 
 service Model {
-  rpc detect (Image) returns (DetectionFrameSet);
+  rpc detect (Image) returns (RegionDetectionSet);
 }
 
 message Image {
@@ -10,11 +10,11 @@ message Image {
   bytes image_binary = 2;
 }
 
-message DetectionFrameSet {
-  repeated DetectionFrame DetectionFrames = 1;
+message RegionDetectionSet {
+  repeated RegionDetection RegionDetections = 1;
 }
 
-message DetectionFrame {
+message RegionDetection {
   int64 image = 1;
   int64 region = 2;
   int64 x = 3;
index 4bc53d7..045e9d6 100644 (file)
@@ -2,15 +2,15 @@ syntax = "proto3";
 package HipTviKTkIkcmyuMCIAIDkeOOQQYyJne;
 
 service Model {
-  rpc pixelate (DetectionFrameSet) returns (Image);
+  rpc pixelate (RegionDetectionSet) returns (Image);
   rpc detect (Image) returns (Image);
 }
 
-message DetectionFrameSet {
-  repeated DetectionFrame DetectionFrames = 1;
+message RegionDetectionSet {
+  repeated RegionDetection RegionDetections = 1;
 }
 
-message DetectionFrame {
+message RegionDetection {
   int64 image = 1;
   int64 region = 2;
   int64 x = 3;
diff --git a/web_demo/model.recognize.proto b/web_demo/model.recognize.proto
new file mode 100644 (file)
index 0000000..623ecda
--- /dev/null
@@ -0,0 +1,54 @@
+syntax = "proto3";
+package XGGINkLKNWOtfRnNHcOkTpAsWCpEBevm;
+
+service Model {
+  rpc detect (Image) returns (RegionDetectionSet);
+  rpc embed (Image) returns (RegionEmbeddingSet);
+  rpc recognize (RegionDetectionSet) returns (RegionTagSet);
+  rpc recognize_image (Image) returns (RegionTagSet);
+}
+
+message Image {
+  string mime_type = 1;
+  bytes image_binary = 2;
+}
+
+message RegionDetectionSet {
+  repeated RegionDetection RegionDetections = 1;
+}
+
+message RegionDetection {
+  int64 image = 1;
+  int64 region = 2;
+  int64 x = 3;
+  int64 y = 4;
+  int64 w = 5;
+  int64 h = 6;
+  string mime_type = 7;
+  bytes image_binary = 8;
+}
+
+message RegionEmbeddingSet {
+  repeated RegionEmbedding RegionEmbeddings = 1;
+}
+
+message RegionEmbedding {
+  int64 image = 1;
+  int64 region = 2;
+  int64 x = 3;
+  int64 y = 4;
+  int64 w = 5;
+  int64 h = 6;
+  repeated double embedding = 7;
+}
+
+message RegionTagSet {
+  repeated RegionTag RegionTags = 1;
+}
+
+message RegionTag {
+  int64 image = 1;
+  int64 region = 2;
+  string tag = 3;
+  double score = 4;
+}
\ No newline at end of file