Пример #1
0
    def detect_pnet(self, im):
        """Get face candidates through pnet

		Parameters:
		----------
		im: numpy array
			input image array

		Returns:
		-------
		boxes: numpy array
			detected boxes before calibration
		boxes_align: numpy array
			boxes after calibration
		"""

        # im = self.unique_image_format(im)

        h, w, c = im.shape
        net_size = 12

        current_scale = float(
            net_size) / self.min_face_size  # find initial scale
        im_resized = self.resize_image(im, current_scale)
        current_height, current_width, _ = im_resized.shape

        # fcn
        all_boxes = list()
        while min(current_height, current_width) > net_size:
            feed_imgs = []
            image_tensor = convert_image_to_tensor(im_resized)
            feed_imgs.append(image_tensor)
            feed_imgs = torch.stack(feed_imgs)

            feed_imgs = feed_imgs.to(device='cuda: 1', dtype=torch.float32)

            cls_map, reg = self.pnet_detector(feed_imgs)

            cls_map_np = convert_chwtensor_to_hwcnumpy(cls_map.cpu())
            reg_np = convert_chwtensor_to_hwcnumpy(reg.cpu())
            # landmark_np = image_tools.convert_chwTensor_to_hwcNumpy(landmark.cpu())

            boxes = self.generate_bounding_box(cls_map_np[0, :, :], reg_np,
                                               current_scale, self.thresh[0])

            current_scale *= self.scale_factor
            im_resized = self.resize_image(im, current_scale)
            current_height, current_width, _ = im_resized.shape

            if boxes.size == 0:
                continue
            keep = utils.nms(boxes[:, :5], 0.5, 'Union')
            boxes = boxes[keep]
            all_boxes.append(boxes)

        if len(all_boxes) == 0:
            return None, None

        all_boxes = np.vstack(all_boxes)

        # merge the detection from first stage
        keep = utils.nms(all_boxes[:, 0:5], 0.7, 'Union')
        all_boxes = all_boxes[keep]
        # boxes = all_boxes[:, :5]

        bw = all_boxes[:, 2] - all_boxes[:, 0] + 1
        bh = all_boxes[:, 3] - all_boxes[:, 1] + 1

        # landmark_keep = all_boxes[:, 9:].reshape((5,2))

        boxes = np.vstack([
            all_boxes[:, 0],
            all_boxes[:, 1],
            all_boxes[:, 2],
            all_boxes[:, 3],
            all_boxes[:, 4],
        ])

        boxes = boxes.T

        align_topx = all_boxes[:, 0] + all_boxes[:, 5] * bw
        align_topy = all_boxes[:, 1] + all_boxes[:, 6] * bh
        align_bottomx = all_boxes[:, 2] + all_boxes[:, 7] * bw
        align_bottomy = all_boxes[:, 3] + all_boxes[:, 8] * bh

        # refine the boxes
        boxes_align = np.vstack([
            align_topx,
            align_topy,
            align_bottomx,
            align_bottomy,
            all_boxes[:, 4],
        ])
        boxes_align = boxes_align.T

        return boxes_align
Пример #2
0
	def detect_rnet(self, im, dets):
		'''
		get face candidates using rnet
		:param im: input image array
		:param dets: detection results of pnet
		:return: boxes_align
		'''
		h, w, c = im.shape

		if dets is None:
			return None

		dets = self.square_bbox(dets)
		dets[:, 0:4] = np.round(dets[:, 0:4])

		[dy, edy, dx, edx, y, ey, x, ex, tmpw, tmph] = self.pad(dets, w, h)
		num_boxes = dets.shape[0]

		cropped_ims_tensors = []
		for i in range(num_boxes):
			#if dx[i] <= 0 or dy[i] <= 0 or edx[i] <= 0 or edy[i] <= 0:
				#continue
			'''if (ex[i] < x[i] or ey[i] < y[i] or edx[i] < dx[i] or edy[i] < dy[i] or x[i] > tmpw[i]
					or y[i] > tmph[i] or ex[i] < 0 or ey[i] < 0):
				continue'''
			#list = [x[i], y[i], ex[i], ey[i], dx[i], dy[i], edx[i], edy[i], tmpw[i], tmph[i]]
			#print(list)
			try:
				tmp = np.zeros((tmph[i], tmpw[i], 3), dtype=np.uint8)
				if edy[i] != ey[i]-y[i] or edx[i] != ex[i] - x[i]:
					continue
				tmp[dy[i]:edy[i] + dy[i] + 1, dx[i]:edx[i] + dx[i] + 1, :] = im[y[i]:ey[i] + 1, x[i]:ex[i] + 1, :]
				crop_im = cv2.resize(tmp, (24, 24))
				crop_im_tensor = convert_image_to_tensor(crop_im)
				# cropped_ims_tensors[i, :, :, :] = crop_im_tensor
				cropped_ims_tensors.append(crop_im_tensor)
			except:
				continue
		if len(cropped_ims_tensors) == 0:
			return None, None
		cropped_ims_tensors = torch.stack(cropped_ims_tensors)
		feed_imgs = cropped_ims_tensors.to(device='cuda: 1', dtype=torch.float32)


		cls_map, reg = self.rnet_detector(feed_imgs)

		cls_map = cls_map.cpu().data.numpy()
		reg = reg.cpu().data.numpy()

		keep_inds = np.where(cls_map > self.thresh[1])[0]

		if len(keep_inds) > 0:
			boxes = dets[keep_inds]
			cls = cls_map[keep_inds]
			reg = reg[keep_inds]
		# landmark = landmark[keep_inds]
		else:
			return None, None

		keep = utils.nms(boxes, 0.7)
		if len(keep) == 0:
			return None, None

		keep_cls = cls[keep]
		keep_boxes = boxes[keep]
		keep_reg = reg[keep]
		# keep_landmark = landmark[keep]

		bw = keep_boxes[:, 2] - keep_boxes[:, 0] + 1
		bh = keep_boxes[:, 3] - keep_boxes[:, 1] + 1

		boxes = np.vstack([keep_boxes[:, 0],
		                   keep_boxes[:, 1],
		                   keep_boxes[:, 2],
		                   keep_boxes[:, 3],
		                   keep_cls[:, 0],
		                   # keep_boxes[:,0] + keep_landmark[:, 0] * bw,
		                   # keep_boxes[:,1] + keep_landmark[:, 1] * bh,
		                   # keep_boxes[:,0] + keep_landmark[:, 2] * bw,
		                   # keep_boxes[:,1] + keep_landmark[:, 3] * bh,
		                   # keep_boxes[:,0] + keep_landmark[:, 4] * bw,
		                   # keep_boxes[:,1] + keep_landmark[:, 5] * bh,
		                   # keep_boxes[:,0] + keep_landmark[:, 6] * bw,
		                   # keep_boxes[:,1] + keep_landmark[:, 7] * bh,
		                   # keep_boxes[:,0] + keep_landmark[:, 8] * bw,
		                   # keep_boxes[:,1] + keep_landmark[:, 9] * bh,
		                   ])

		align_topx = keep_boxes[:, 0] + keep_reg[:, 0] * bw
		align_topy = keep_boxes[:, 1] + keep_reg[:, 1] * bh
		align_bottomx = keep_boxes[:, 2] + keep_reg[:, 2] * bw
		align_bottomy = keep_boxes[:, 3] + keep_reg[:, 3] * bh

		boxes_align = np.vstack([align_topx,
		                         align_topy,
		                         align_bottomx,
		                         align_bottomy,
		                         keep_cls[:, 0],
		                         # align_topx + keep_landmark[:, 0] * bw,
		                         # align_topy + keep_landmark[:, 1] * bh,
		                         # align_topx + keep_landmark[:, 2] * bw,
		                         # align_topy + keep_landmark[:, 3] * bh,
		                         # align_topx + keep_landmark[:, 4] * bw,
		                         # align_topy + keep_landmark[:, 5] * bh,
		                         # align_topx + keep_landmark[:, 6] * bw,
		                         # align_topy + keep_landmark[:, 7] * bh,
		                         # align_topx + keep_landmark[:, 8] * bw,
		                         # align_topy + keep_landmark[:, 9] * bh,
		                         ])

		boxes = boxes.T
		boxes_align = boxes_align.T

		return boxes, boxes_align