summaryrefslogtreecommitdiff
path: root/megapixels/app/processors/face_age_gender.py
diff options
context:
space:
mode:
Diffstat (limited to 'megapixels/app/processors/face_age_gender.py')
-rw-r--r--megapixels/app/processors/face_age_gender.py20
1 files changed, 12 insertions, 8 deletions
diff --git a/megapixels/app/processors/face_age_gender.py b/megapixels/app/processors/face_age_gender.py
index 95efa8fc..66c51fa8 100644
--- a/megapixels/app/processors/face_age_gender.py
+++ b/megapixels/app/processors/face_age_gender.py
@@ -32,19 +32,21 @@ class _FaceAgeGender:
'''
dnn_size = (224,224)
- dnn_mean = (104.0, 177.0, 123.0)
+ dnn_mean = (104.0, 177.0, 123.0) # ?
+ # authors used imagenet mean
+ #dnn_mean = [103.939, 116.779, 123.68]
ages = np.arange(0, 101).reshape(101, 1)
+ padding = 0.4
def __init__(self, fp_prototxt, fp_model):
self.log = logger_utils.Logger.getLogger()
self.net = cv.dnn.readNetFromCaffe(fp_prototxt, fp_model)
- def _preprocess(self, im, bbox_dim):
+ def _preprocess(self, im, bbox_norm):
# isolate face ROI, expand bbox by 40% according to authors
# https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/
dim = im.shape[:2][::-1]
- bbox_dim_exp = bbox_dim.expand_dim( int(0.4*bbox_dim.width), dim)
- roi = bbox_dim_exp.to_xyxy()
+ roi = bbox_norm.expand(self.padding).to_dim(dim).to_xyxy()
im_face_crop = im[roi[1]:roi[3], roi[0]:roi[2]] # isolate face roi
# resize for blob
@@ -52,6 +54,7 @@ class _FaceAgeGender:
blob = cv.dnn.blobFromImage(im_resized, 1.0, self.dnn_size, self.dnn_mean)
return blob
+
class FaceGender(_FaceAgeGender):
# use "apparent" age models
@@ -61,17 +64,18 @@ class FaceGender(_FaceAgeGender):
def __init__(self):
super().__init__(self.fp_prototxt, self.fp_model)
- def predict(self, im, bbox_dim):
+ def predict(self, im, bbox_norm):
'''Predicts gender from face crop
:param im: (numpy.ndarray) BGR image
:param bbox_dim: (BBox) dimensioned
:returns (dict) with scores for male and female
'''
- im_blob = self._preprocess(im, bbox_dim)
+ im_blob = self._preprocess(im, bbox_norm)
self.net.setInput(im_blob)
preds = self.net.forward()[0]
return {'f': preds[0], 'm': preds[1]}
+
class FaceAgeApparent(_FaceAgeGender):
# use "apparent" age models
@@ -81,13 +85,13 @@ class FaceAgeApparent(_FaceAgeGender):
def __init__(self):
super().__init__(self.fp_prototxt, self.fp_model)
- def predict(self, im, bbox_dim):
+ def predict(self, im, bbox_norm):
'''Predicts apparent age from face crop
:param im: (numpy.ndarray) BGR image
:param bbox_dim: (BBox) dimensioned
:returns (float) predicted age
'''
- im_blob = self._preprocess(im, bbox_dim)
+ im_blob = self._preprocess(im, bbox_norm)
self.net.setInput(im_blob)
preds = self.net.forward()[0]
age = preds.dot(self.ages).flatten()[0]