Skip to content

Commit

Permalink
Merge pull request #100 from serengil/feat-task-1604-validate-project…
Browse files Browse the repository at this point in the history
…ed-coordinates

confirm projected coordinates are in boundaries
  • Loading branch information
serengil authored Apr 16, 2024
2 parents a4fd2b8 + fd1039e commit 7d333e1
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 7 deletions.
2 changes: 1 addition & 1 deletion retinaface/RetinaFace.py
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ def extract_faces(

# find new facial area coordinates after alignment
rotated_x1, rotated_y1, rotated_x2, rotated_y2 = postprocess.rotate_facial_area(
(x, y, x + w, y + h), rotate_angle, rotate_direction, img.shape
(x, y, x + w, y + h), rotate_angle, rotate_direction, (img.shape[0], img.shape[1])
)
facial_img = aligned_img[
int(rotated_y1) : int(rotated_y2), int(rotated_x1) : int(rotated_x2)
Expand Down
20 changes: 14 additions & 6 deletions retinaface/commons/postprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,25 +114,33 @@ def rotate_facial_area(
# Angle in radians
angle = angle * np.pi / 180

height, weight = size

# Translate the facial area to the center of the image
x = (facial_area[0] + facial_area[2]) / 2 - size[1] / 2
y = (facial_area[1] + facial_area[3]) / 2 - size[0] / 2
x = (facial_area[0] + facial_area[2]) / 2 - weight / 2
y = (facial_area[1] + facial_area[3]) / 2 - height / 2

# Rotate the facial area
x_new = x * np.cos(angle) + y * direction * np.sin(angle)
y_new = -x * direction * np.sin(angle) + y * np.cos(angle)

# Translate the facial area back to the original position
x_new = x_new + size[1] / 2
y_new = y_new + size[0] / 2
x_new = x_new + weight / 2
y_new = y_new + height / 2

# Calculate the new facial area
# Calculate projected coordinates after alignment
x1 = x_new - (facial_area[2] - facial_area[0]) / 2
y1 = y_new - (facial_area[3] - facial_area[1]) / 2
x2 = x_new + (facial_area[2] - facial_area[0]) / 2
y2 = y_new + (facial_area[3] - facial_area[1]) / 2

return (int(x1), int(y1), int(x2), int(y2))
# validate projected coordinates are in image's boundaries
x1 = max(int(x1), 0)
y1 = max(int(y1), 0)
x2 = min(int(x2), weight)
y2 = min(int(y2), height)

return (x1, y1, x2, y2)


def bbox_pred(boxes, box_deltas):
Expand Down

0 comments on commit 7d333e1

Please sign in to comment.