You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

90 lines
2.7 KiB

# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle
import paddle.nn.functional as F
import cv2
import numpy as np
from .utils import *
def detect(net, img, device):
H, W, C = img.shape
orig_size = min(H, W)
img, (xshift, yshift) = resize_and_crop_image(img, 128)
preds = net.predict_on_image(img.astype('float32')).numpy()
if 0 == len(preds):
return [[]]
shift = np.array([xshift, yshift] * 2)
scores = preds[:, -1:]
locs = np.concatenate(
(preds[:, 1:2], preds[:, 0:1], preds[:, 3:4], preds[:, 2:3]), axis=1)
return [np.concatenate((locs * orig_size + shift, scores), axis=1)]
def batch_detect(net, img_batch):
"""
Inputs:
- img_batch: a numpy array or tensor of shape (Batch size, Channels, Height, Width)
Outputs:
- list of 2-dim numpy arrays with shape (faces_on_this_image, 5): x1, y1, x2, y2, confidence
(x1, y1) - top left corner, (x2, y2) - bottom right corner
"""
B, H, W, C = img_batch.shape
orig_size = min(H, W)
if isinstance(img_batch, paddle.Tensor):
img_batch = img_batch.numpy()
imgs, (xshift, yshift) = resize_and_crop_batch(img_batch, 128)
preds = net.predict_on_batch(imgs.astype('float32'))
bboxlists = []
for pred in preds:
pred = pred.numpy()
shift = np.array([xshift, yshift] * 2)
scores = pred[:, -1:]
xmin = pred[:, 1:2]
ymin = pred[:, 0:1]
xmax = pred[:, 3:4]
ymax = pred[:, 2:3]
locs = np.concatenate((xmin, ymin, xmax, ymax), axis=1)
bboxlists.append(
np.concatenate(
(locs * orig_size + shift, scores), axis=1))
return bboxlists
def flip_detect(net, img):
img = cv2.flip(img, 1)
b = detect(net, img)
bboxlist = np.zeros(b.shape)
bboxlist[:, 0] = img.shape[1] - b[:, 2]
bboxlist[:, 1] = b[:, 1]
bboxlist[:, 2] = img.shape[1] - b[:, 0]
bboxlist[:, 3] = b[:, 3]
bboxlist[:, 4] = b[:, 4]
return bboxlist
def pts_to_bb(pts):
min_x, min_y = np.min(pts, axis=0)
max_x, max_y = np.max(pts, axis=0)
return np.array([min_x, min_y, max_x, max_y])