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