HumanSignal / HumanSignal/label-studio

Bounding boxes displaced in the image.

Open
#5,923 2 comments 0 reactions 0 assignees View on GitHub
community:needs-information community:reviewed
Dominant language
TypeScript
Stars
28.3k
Forks
3.7k
Avg merge
14h
Merged PRs (30d)
15

Description

Hi, I have exported my annotations in JSON format. But when I try to view them in python, they appear offset almost 100 pixels. Here is an example of how they look in LabelStudio and how I see them in my code.

The code that I'm using:

```
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image

def get_rotated_bounding_box_corners_and_extremes(x_center_pct, y_center_pct, width_pct, height_pct, rotation_deg, image_width, image_height):
"""
Calculate the four corner coordinates of a rotated bounding box and its extreme values.

Args:
x_center_pct (float): x-coordinate of the center of the box in percentage.
y_center_pct (float): y-coordinate of the center of the box in percentage.
width_pct (float): Width of the box in percentage.
height_pct (float): Height of the box in percentage.
rotation_deg (float): Rotation of the box in degrees.
image_width (int): Width of the image in pixels.
image_height (int): Height of the image in pixels.

Returns:
corners (list of tuples): List with the (x, y) coordinates of the four corners of the rotated bounding box.
extremes (tuple): Tuple with (xmin, xmax, ymin, ymax) of the rotated bounding box.
"""

x_center = x_center_pct / 100 * image_width
y_center = y_center_pct / 100 * image_height
width = width_pct / 100 * image_width
height = height_pct / 100 * image_height

rotation_rad = np.deg2rad(rotation_deg)

corners = np.array([
[x_center - width / 2, y_center - height / 2],
[x_center + width / 2, y_center - height / 2],
[x_center + width / 2, y_center + height / 2],
[x_center - width / 2, y_center + height / 2]
])

rotation_matrix = np.array([
[np.cos(rotation_rad), -np.sin(rotation_rad)],
[np.sin(rotation_rad), np.cos(rotation_rad)]
])

rotated_corners = np.dot(corners - np.array([x_center, y_center]), rotation_matrix.T) + np.array([x_center, y_center])

rotated_corners = rotated_corners.astype(int)

# Obtener extremos
x_coords = rotated_corners[:, 0]
y_coords = rotated_corners[:, 1]
xmin = x_coords.min()
xmax = x_coords.max()
ymin = y_coords.min()
ymax = y_coords.max()

return rotated_corners.tolist(), (xmin, xmax, ymin, ymax)

def plot_rotated_bounding_box(image_path, corners):
"""
Plot the rotated bounding box on the original image.

Args:
image_path (str): Path to the original image.
corners (list of tuples): List with the (x, y) coordinates of the four corners of the rotated bounding box.
"""

img = Image.open(image_path)
img_width, img_height = img.size
print('width', img_width, 'h', img_height)

fig, ax = plt.subplots(1)
ax.imshow(img)

for i in range(len(corners)):
next_i = (i + 1) % len(corners)
x_values = [corners[i][0], corners[next_i][0]]
y_values = [corners[i][1], corners[next_i][1]]
ax.plot(x_values, y_values, 'r-')

plt.gca().set_aspect('equal', adjustable='box')
plt.show()

# Example
image_path = 'save_frame_test.jpg'
image_width = 640
image_height = 352
x_center_pct = 72.26388590829315
y_center_pct = 87.85889758341253
width_pct = 14.273870065050815
height_pct = 9.12891897312828
rotation_deg = -25.40638952513592

```

**Screenshots**
IMAGE AND LABELS IN LABELSTUDIO
![image](https://github.com/HumanSignal/label-studio/assets/76424439/db3c6048-c1f7-4af3-8b02-1c5bb2ee125d)

IMAGE AND ONE LABEL IN PYTHON
My labels in python (at least one example)
![image](https://github.com/HumanSignal/label-studio/assets/76424439/4dd4582b-6eb4-41b7-8a44-a0c749eda8b5)

**Environment (please complete the following information):**
- OS: [e.g. iOS]
- Label Studio Version [e.g. 0.8.0]

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.