当前位置:网站首页>FCOS3D label assignment
FCOS3D label assignment
2022-07-07 13:55:00 【Roast zongzi】
Follow 2d Of FCOS Not so much ,
It mainly depends on the picture coordinate system to allocate target:
def _get_target_single(self, gt_bboxes, gt_labels, gt_bboxes_3d,
gt_labels_3d, centers2d, depths, attr_labels,
points, regress_ranges, num_points_per_lvl):
"""Compute regression and classification targets for a single image."""
num_points = points.size(0)
num_gts = gt_labels.size(0)
if not isinstance(gt_bboxes_3d, torch.Tensor):
gt_bboxes_3d = gt_bboxes_3d.tensor.to(gt_bboxes.device)
if num_gts == 0:
return gt_labels.new_full((num_points,), self.background_label), \
gt_bboxes.new_zeros((num_points, 4)), \
gt_labels_3d.new_full(
(num_points,), self.background_label), \
gt_bboxes_3d.new_zeros((num_points, self.bbox_code_size)), \
gt_bboxes_3d.new_zeros((num_points,)), \
attr_labels.new_full(
(num_points,), self.attr_background_label)
# change orientation to local yaw
gt_bboxes_3d[..., 6] = -torch.atan2(
gt_bboxes_3d[..., 0], gt_bboxes_3d[..., 2]) + gt_bboxes_3d[..., 6]
areas = (gt_bboxes[:, 2] - gt_bboxes[:, 0]) * (
gt_bboxes[:, 3] - gt_bboxes[:, 1]) # [tl_x, tl_y, br_x, br_y]--> S_areas
areas = areas[None].repeat(num_points, 1) # [2] --> [30929, 2]
regress_ranges = regress_ranges[:, None, :].expand(
num_points, num_gts, 2) # [30929, 2] --> [30929, 2, 2]
gt_bboxes = gt_bboxes[None].expand(num_points, num_gts, 4)
centers2d = centers2d[None].expand(num_points, num_gts, 2)
gt_bboxes_3d = gt_bboxes_3d[None].expand(num_points, num_gts,
self.bbox_code_size)
depths = depths[None, :, None].expand(num_points, num_gts, 1)
# Every points Coordinates of (xs,ys)
xs, ys = points[:, 0], points[:, 1]
xs = xs[:, None].expand(num_points, num_gts)
ys = ys[:, None].expand(num_points, num_gts)
# gt center --> offsets
## centers2d: Every gt stay 2d image The coordinates on
delta_xs = (xs - centers2d[..., 0])[..., None]
delta_ys = (ys - centers2d[..., 1])[..., None]
# 0. The previous operation is mainly for here , Get the same as the network output target_box
bbox_targets_3d = torch.cat(
(delta_xs, delta_ys, depths, gt_bboxes_3d[..., 3:]), dim=-1)
left = xs - gt_bboxes[..., 0]
right = gt_bboxes[..., 2] - xs
top = ys - gt_bboxes[..., 1]
bottom = gt_bboxes[..., 3] - ys
bbox_targets = torch.stack((left, top, right, bottom), -1)
assert self.center_sampling is True, 'Setting center_sampling to '\
'False has not been implemented for FCOS3D.'
# condition1: inside a `center bbox`
radius = self.center_sample_radius # 1.5
center_xs = centers2d[..., 0]
center_ys = centers2d[..., 1]
center_gts = torch.zeros_like(gt_bboxes)
stride = center_xs.new_zeros(center_xs.shape)
# project the points on current lvl back to the `original` sizes
# 1. Map the position of feature points of each layer back to the input image
lvl_begin = 0
for lvl_idx, num_points_lvl in enumerate(num_points_per_lvl): # [23200, 5800, 1450, 375, 104]
lvl_end = lvl_begin + num_points_lvl
stride[lvl_begin:lvl_end] = self.strides[lvl_idx] * radius # [8, 16, 32, 64, 128] * 1.5
# Every point The scaling factor of * radius
lvl_begin = lvl_end
# 2. The position point in the object frame is regarded as a positive sample candidate
## Side length 1.5 Box of -->
center_gts[..., 0] = center_xs - stride
center_gts[..., 1] = center_ys - stride
center_gts[..., 2] = center_xs + stride
center_gts[..., 3] = center_ys + stride
cb_dist_left = xs - center_gts[..., 0] # points Center point to
cb_dist_right = center_gts[..., 2] - xs
cb_dist_top = ys - center_gts[..., 1]
cb_dist_bottom = center_gts[..., 3] - ys
center_bbox = torch.stack(
(cb_dist_left, cb_dist_top, cb_dist_right, cb_dist_bottom), -1)
inside_gt_bbox_mask = center_bbox.min(-1)[0] > 0 # anchor_box The center point falls on gt_box Center point 1.5 Only valid within the square of the unit
# condition2: limit the regression range for each location
# 3. The distance from a certain position point to the object frame can be regarded as a positive sample only if it is within a certain range ( Each floor has its own scope )
max_regress_distance = bbox_targets.max(-1)[0]
# Ensure that on each floor level Within the regression range of
inside_regress_range = (
(max_regress_distance >= regress_ranges[..., 0])
& (max_regress_distance <= regress_ranges[..., 1]))
# center-based criterion to deal with ambiguity
# 4. Fuzzy processing based on central criterion
## 4.1 Choose the one with the smallest offset gt+gt_inds
dists = torch.sqrt(torch.sum(bbox_targets_3d[..., :2]**2, dim=-1)) # offsets The European distance of [30929, 2]
dists[inside_gt_bbox_mask == 0] = INF # Screening anchor
dists[inside_regress_range == 0] = INF
min_dist, min_dist_inds = dists.min(dim=1)
labels = gt_labels[min_dist_inds] # Screening gt
labels_3d = gt_labels_3d[min_dist_inds]
attr_labels = attr_labels[min_dist_inds]
labels[min_dist == INF] = self.background_label # set as BG 10
labels_3d[min_dist == INF] = self.background_label # set as BG
attr_labels[min_dist == INF] = self.attr_background_label
## 4.2 Every point Select the corresponding box_target
bbox_targets = bbox_targets[range(num_points), min_dist_inds] # [30929, 2, 4] --> [30929, 4]
bbox_targets_3d = bbox_targets_3d[range(num_points), min_dist_inds]
## 4.3 Screening centerness_targets
## Offset --> hypotenuse / Side length 1.5scale To the side length of the actual triangle == Relative distance
relative_dists = torch.sqrt(
torch.sum(bbox_targets_3d[..., :2]**2,
dim=-1)) / (1.414 * stride[:, 0])
# [N, 1] / [N, 1]
centerness_targets = torch.exp(-self.centerness_alpha * relative_dists) # exp(-2.5 * relative_dists) todo?
return labels, bbox_targets, labels_3d, bbox_targets_3d, \
centerness_targets, attr_labels
边栏推荐
- What are the principles for distinguishing the security objectives and implementation methods that cloud computing security expansion requires to focus on?
- Problems that cannot be accessed in MySQL LAN
- mysql导入文件出现Data truncated for column ‘xxx’ at row 1的原因
- MySQL error 28 and solution
- Vmware共享主机的有线网络IP地址
- Excerpt from "misogyny: female disgust in Japan"
- Show the mathematical formula in El table
- LeetCode_二分搜索_中等_153.寻找旋转排序数组中的最小值
- 1. Deep copy 2. Call apply bind 3. For of in differences
- 提升树莓派性能的方法
猜你喜欢

JS slow motion animation principle teaching (super detail)

Milkdown control icon

使用day.js让时间 (显示为几分钟前 几小时前 几天前 几个月前 )
![Supply chain supply and demand estimation - [time series]](/img/2c/82d118cfbcef4498998298dd3844b1.png)
Supply chain supply and demand estimation - [time series]

Indoor ROS robot navigation commissioning record (experience in selecting expansion radius)

Detr introduction

Dry goods | summarize the linkage use of those vulnerability tools

Evolution of customer service hotline of dewu

1、深拷贝 2、call apply bind 3、for of for in 区别

"New red flag Cup" desktop application creativity competition 2022
随机推荐
mysql 局域网内访问不到的问题
118. Yanghui triangle
"Song of ice and fire" in the eleventh issue of "open source Roundtable" -- how to balance the natural contradiction between open source and security?
2022-7-6 sigurg is used to receive external data. I don't know why it can't be printed out
PostgreSQL array type, each splice
Flink | multi stream conversion
THINKPHP框架的优秀开源系统推荐
Final review notes of single chip microcomputer principle
Redis can only cache? Too out!
[1] Basic knowledge of ros2 - summary version of operation commands
Introduction and basic use of stored procedures
Ways to improve the performance of raspberry pie
MySQL error 28 and solution
Fast development board pinctrl and GPIO subsystem experiment for itop-imx6ull - modify the device tree file
《厌女:日本的女性嫌恶》摘录
Evolution of customer service hotline of dewu
为租客提供帮助
Toraw and markraw
flask session伪造之hctf admin
JS slow motion animation principle teaching (super detail)