Esempio n. 1
0
def image_encode(args, i, item, q_out):
    oitem = [item.id]
    #print('flag', item.flag)
    if item.flag == 0:
        fullpath = item.image_path
        header = mx.recordio.IRHeader(item.flag, item.label, item.id, 0)
        #print('write', item.flag, item.id, item.label)
        if item.aligned:
            with open(fullpath, 'rb') as fin:
                img = fin.read()
            s = mx.recordio.pack(header, img)
            q_out.put((i, s, oitem))
        else:
            img = cv2.imread(fullpath, args.color)
            assert item.landmark is not None
            img = face_preprocess.preprocess(img,
                                             bbox=item.bbox,
                                             landmark=item.landmark,
                                             image_size='%d,%d' %
                                             (args.image_h, args.image_w))
            s = mx.recordio.pack_img(header,
                                     img,
                                     quality=args.quality,
                                     img_fmt=args.encoding)
            q_out.put((i, s, oitem))
    else:
        header = mx.recordio.IRHeader(item.flag, item.label, item.id, 0)
        #print('write', item.flag, item.id, item.label)
        s = mx.recordio.pack(header, '')
        q_out.put((i, s, oitem))
Esempio n. 2
0
 def get_all_faces(self, img):
   str_image_size = "%d,%d"%(self.image_size[0], self.image_size[1])
   bounding_boxes, points = detect_face.detect_face(img, self.det_minsize, self.pnet, self.rnet, self.onet, self.det_threshold, self.det_factor)
   ret = []
   for i in range(bounding_boxes.shape[0]):
     bbox = bounding_boxes[i,0:4]
     landmark = points[:, i].reshape((2,5)).T
     aligned = face_preprocess.preprocess(img, bbox=bbox, landmark = landmark, image_size=str_image_size)
     aligned = np.transpose(aligned, (2,0,1))
     ret.append(aligned)
   return ret
Esempio n. 3
0
def cal_time_cost(embedding, detector, loop_time):
    model = mx.mod.Module(symbol=embedding,
                          context=mx.cpu(0),
                          label_names=None)
    model.bind(data_shapes=[('data', (1, 3, 112, 112))])
    model.init_params()
    read_img_time = 0
    crop_time = 0
    embedding_time = 0

    for i in range(loop_time):
        # 读取图片
        start_time = time.time()
        img = cv2.imread('Tom_Hanks_54745.png')
        end_time = time.time()
        read_img_time += end_time - start_time
        #print('cost of image read:' + str(end_time - start_time))

    for i in range(loop_time):
        # 从图片中crop人脸
        start_time = time.time()
        ret = detector.detect_face(img, det_type=0)
        bbox, points = ret
        bbox = bbox[0, 0:4]
        points = points[0, :].reshape((2, 5)).T
        nimg = face_preprocess.preprocess(img,
                                          bbox,
                                          points,
                                          image_size='112,112')
        nimg = cv2.cvtColor(nimg, cv2.COLOR_BGR2RGB)
        aligned = np.transpose(nimg, (2, 0, 1))
        end_time = time.time()
        crop_time += end_time - start_time
        #print('cost of crop input:' + str(end_time - start_time))

    for i in range(loop_time):
        # 根据人脸获取embedding
        start_time = time.time()
        input_blob = np.expand_dims(aligned, axis=0)
        data = mx.nd.array(input_blob)
        db = mx.io.DataBatch(data=(data, ))
        model.forward(db, is_train=False)
        embedding = model.get_outputs()[0].asnumpy()
        #embedding = sklearn.preprocessing.normalize(embedding).flatten()
        end_time = time.time()
        embedding_time += end_time - start_time
        #print('cost of generate features:' + str(end_time - start_time))

    return read_img_time / loop_time, crop_time / loop_time, embedding_time / loop_time
Esempio n. 4
0
 def get_input(self, face_img):
   ret = self.detector.detect_face(face_img, det_type = self.args.det)
   if ret is None:
     return None
   bbox, points = ret
   if bbox.shape[0]==0:
     return None
   bbox = bbox[0,0:4]
   points = points[0,:].reshape((2,5)).T
   #print(bbox)
   #print(points)
   nimg = face_preprocess.preprocess(face_img, bbox, points, image_size='112,112')
   nimg = cv2.cvtColor(nimg, cv2.COLOR_BGR2RGB)
   aligned = np.transpose(nimg, (2,0,1))
   return aligned
Esempio n. 5
0
def face_align(src_img, fd, args):
    src_image = ImageData(src_img, fd.input_shape)
    src_image.resize_image(mode='pad')

    dets, lmks = fd.detector.detect(src_image.transformed_image,
                                    threshold=args.fd_conf)
    if dets.shape[0] > 0:
        bindex = fd.get_max_face(dets)
        landmark = lmks[bindex]
        bbox = dets[bindex, :4].astype(np.int)
        image_size = '%d,%d' % (args.fr_input_size[1], args.fr_input_size[0])
        warped = preprocess(src_image.transformed_image,
                            bbox,
                            landmark,
                            image_size=image_size)
        return warped
    else:
        return None
Esempio n. 6
0
 def get_feature(self, face_img):
     #face_img is bgr image
     ret = self.detector.detect_face_limited(face_img,
                                             det_type=self.args.det)
     if ret is None:
         return None
     bbox, points = ret
     if bbox.shape[0] == 0:
         return None
     bbox = bbox[0, 0:4]
     points = points[0, :].reshape((2, 5)).T
     #print(bbox)
     #print(points)
     nimg = face_preprocess.preprocess(face_img,
                                       bbox,
                                       points,
                                       image_size='112,112')
     nimg = cv2.cvtColor(nimg, cv2.COLOR_BGR2RGB)
     aligned = np.transpose(nimg, (2, 0, 1))
     #print(nimg.shape)
     embedding = None
     for flipid in [0, 1]:
         if flipid == 1:
             if self.args.flip == 0:
                 break
             do_flip(aligned)
         input_blob = np.expand_dims(aligned, axis=0)
         data = mx.nd.array(input_blob)
         db = mx.io.DataBatch(data=(data, ))
         self.model.forward(db, is_train=False)
         _embedding = self.model.get_outputs()[0].asnumpy()
         #print(_embedding.shape)
         if embedding is None:
             embedding = _embedding
         else:
             embedding += _embedding
     embedding = sklearn.preprocessing.normalize(embedding).flatten()
     return embedding
Esempio n. 7
0
 def get_aligned_face(self, img, force = False):
   #print('before det', img.shape)
   bounding_boxes, points = detect_face.detect_face(img, self.det_minsize, self.pnet, self.rnet, self.onet, self.det_threshold, self.det_factor)
   #if bounding_boxes.shape[0]==0:
   #  fimg = np.copy(img)
   #  do_flip(fimg)
   #  bounding_boxes, points = detect_face.detect_face(fimg, self.det_minsize, self.pnet, self.rnet, self.onet, self.det_threshold, self.det_factor)
   if bounding_boxes.shape[0]==0 and force:
     print('force det', img.shape)
     bounding_boxes, points = detect_face.detect_face(img, self.det_minsize, self.pnet, self.rnet, self.onet, [0.3, 0.3, 0.1], self.det_factor)
     #bounding_boxes, points = detect_face.detect_face_force(img, None, self.pnet, self.rnet, self.onet)
   #print('after det')
   if bounding_boxes.shape[0]==0:
     return None
   bindex = 0
   nrof_faces = bounding_boxes.shape[0]
   det = bounding_boxes[:,0:4]
   img_size = np.asarray(img.shape)[0:2]
   if nrof_faces>1:
     bounding_box_size = (det[:,2]-det[:,0])*(det[:,3]-det[:,1])
     img_center = img_size / 2
     offsets = np.vstack([ (det[:,0]+det[:,2])/2-img_center[1], (det[:,1]+det[:,3])/2-img_center[0] ])
     offset_dist_squared = np.sum(np.power(offsets,2.0),0)
     bindex = np.argmax(bounding_box_size-offset_dist_squared*2.0) # some extra weight on the centering
   det = bounding_boxes[:,0:4]
   det = det[bindex,:]
   points = points[:, bindex]
   landmark = points.reshape((2,5)).T
   #points need to be transpose, points = points.reshape( (5,2) ).transpose()
   det = np.squeeze(det)
   bb = det
   points = list(points.flatten())
   assert(len(points)==10)
   str_image_size = "%d,%d"%(self.image_size[0], self.image_size[1])
   warped = face_preprocess.preprocess(img, bbox=bb, landmark = landmark, image_size=str_image_size)
   warped = np.transpose(warped, (2,0,1))
   print(warped.shape)
   return warped