Yolov8_obb (pérdida de probabilidad) basado en detección de objetivo de marco giratorio sin anclaje
El efecto es mejor que el de yolov5 y puede superar con creces los resultados de v5 en pequeños conjuntos de datos, pero se requieren algunos ajustes para diferentes conjuntos de datos.
1. Transformación y definición de spin box
Los datos de las cuatro esquinas de dota se convierten al formato (x, y, w, h, theta), y el punto central (x, y) y el ancho y alto (w, h) del cuadro se obtienen mediante cv2. minAreaRect(). Y el ángulo angle, angle ∈ [0, 90], asigna el ángulo a pi. Dado que hay dos formas de w>h y h>w, el lado largo se establece uniformemente en h, el lado corto es w, y el ángulo theta girado se asigna al rango [ -pi/2, pi/2]. Es decir, el método de representación del lado largo. Para conocer
algunos métodos de representación de ángulos específicos, consulte https://zhuanlan.zhihu.com/p/459018810
para la implementación del código relevante.
poly = np.float32(poly.reshape(4, 2))
(x, y), (w, h), angle = cv2.minAreaRect(poly) # θ ∈ [0, 90]
angle = -angle # θ ∈ [-90, 0]
theta = angle / 180 * pi # 转为pi制
# trans opencv format to longedge format θ ∈ [-pi/2, pi/2]
if w != max(w, h):
w, h = h, w
theta += pi/2
rboxes.append([x, y, w, h, theta])
Para reproyectar los resultados previstos en la imagen, el formato (x, y, w, h, theta) debe reconvertirse al formato de las cuatro coordenadas de las esquinas.
center, w, h, theta = obboxes[:,:, :2], obboxes[:,:, 2:3], obboxes[:,:, 3:4], obboxes[:,:, 4:5]
Cos, Sin = torch.cos(theta), torch.sin(theta)
vector1 = torch.cat(
(w/2 * Cos, -w/2 * Sin), dim=-1)
vector2 = torch.cat(
(-h/2 * Sin, -h/2 * Cos), dim=-1)
point1 = center + vector1 + vector2
point2 = center + vector1 - vector2
point3 = center - vector1 - vector2
point4 = center - vector1 + vector2
order = obboxes.shape[:-1]
return torch.cat(
(point2, point3, point4,point1), dim=-1).reshape(*order, 4,2)
El proceso de conversión se muestra en la figura: