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))
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
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
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
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
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
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