Small fixes
This commit is contained in:
parent
549026513a
commit
6ca23a8f9c
@ -22,9 +22,11 @@ def social_interactions(idx, centers, angles, dds, stds=None, social_distance=Fa
|
|||||||
# A) Check whether people are close together
|
# A) Check whether people are close together
|
||||||
xx = centers[idx][0]
|
xx = centers[idx][0]
|
||||||
zz = centers[idx][1]
|
zz = centers[idx][1]
|
||||||
distances = [math.sqrt((xx - centers[i][0]) ** 2 + (zz - centers[i][1]) ** 2) for i, _ in enumerate(centers)]
|
distances = [math.sqrt((xx - centers[i][0]) ** 2 + (zz - centers[i][1]) ** 2)
|
||||||
|
for i, _ in enumerate(centers)]
|
||||||
sorted_idxs = np.argsort(distances)
|
sorted_idxs = np.argsort(distances)
|
||||||
indices = [idx_t for idx_t in sorted_idxs[1:] if distances[idx_t] <= threshold_dist]
|
indices = [idx_t for idx_t in sorted_idxs[1:]
|
||||||
|
if distances[idx_t] <= threshold_dist]
|
||||||
|
|
||||||
# B) Check whether people are looking inwards and whether there are no intrusions
|
# B) Check whether people are looking inwards and whether there are no intrusions
|
||||||
# Deterministic
|
# Deterministic
|
||||||
@ -72,17 +74,14 @@ def is_raising_hand(keypoint):
|
|||||||
l_hand = 9
|
l_hand = 9
|
||||||
r_shoulder = 6
|
r_shoulder = 6
|
||||||
r_hand = 10
|
r_hand = 10
|
||||||
l_ear = 3
|
|
||||||
r_ear = 4
|
|
||||||
h_offset = 20
|
|
||||||
|
|
||||||
if keypoint[1][l_hand] < keypoint[1][l_shoulder] and keypoint[1][r_hand] < keypoint[1][r_shoulder]:
|
if keypoint[1][l_hand] < keypoint[1][l_shoulder] and keypoint[1][r_hand] < keypoint[1][r_shoulder]:
|
||||||
return 'both'
|
return 'both'
|
||||||
|
|
||||||
if keypoint[1][l_hand] < keypoint[1][l_shoulder]:
|
if keypoint[1][l_hand] < keypoint[1][l_shoulder]:
|
||||||
return 'left'
|
return 'left'
|
||||||
|
|
||||||
if keypoint[1][r_hand] < keypoint[1][r_shoulder]:
|
if keypoint[1][r_hand] < keypoint[1][r_shoulder]:
|
||||||
return 'right'
|
return 'right'
|
||||||
|
|
||||||
return 'none'
|
return 'none'
|
||||||
@ -96,7 +95,8 @@ def check_f_formations(idx, idx_t, centers, angles, radii, social_distance=False
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Extract centers and angles
|
# Extract centers and angles
|
||||||
other_centers = np.array([cent for l, cent in enumerate(centers) if l not in (idx, idx_t)])
|
other_centers = np.array(
|
||||||
|
[cent for l, cent in enumerate(centers) if l not in (idx, idx_t)])
|
||||||
theta0 = angles[idx]
|
theta0 = angles[idx]
|
||||||
theta1 = angles[idx_t]
|
theta1 = angles[idx_t]
|
||||||
|
|
||||||
@ -115,15 +115,18 @@ def check_f_formations(idx, idx_t, centers, angles, radii, social_distance=False
|
|||||||
|
|
||||||
# 1) Verify they are looking inwards.
|
# 1) Verify they are looking inwards.
|
||||||
# The distance between mus and the center should be less wrt the original position and the center
|
# The distance between mus and the center should be less wrt the original position and the center
|
||||||
d_new = np.linalg.norm(mu_0 - mu_1) / 2 if social_distance else np.linalg.norm(mu_0 - mu_1)
|
d_new = np.linalg.norm(
|
||||||
|
mu_0 - mu_1) / 2 if social_distance else np.linalg.norm(mu_0 - mu_1)
|
||||||
d_0 = np.linalg.norm(x_0 - o_c)
|
d_0 = np.linalg.norm(x_0 - o_c)
|
||||||
d_1 = np.linalg.norm(x_1 - o_c)
|
d_1 = np.linalg.norm(x_1 - o_c)
|
||||||
|
|
||||||
# 2) Verify no intrusion for third parties
|
# 2) Verify no intrusion for third parties
|
||||||
if other_centers.size:
|
if other_centers.size:
|
||||||
other_distances = np.linalg.norm(other_centers - o_c.reshape(1, -1), axis=1)
|
other_distances = np.linalg.norm(
|
||||||
|
other_centers - o_c.reshape(1, -1), axis=1)
|
||||||
else:
|
else:
|
||||||
other_distances = 100 * np.ones((1, 1)) # Condition verified if no other people
|
# Condition verified if no other people
|
||||||
|
other_distances = 100 * np.ones((1, 1))
|
||||||
|
|
||||||
# Binary Classification
|
# Binary Classification
|
||||||
# if np.min(other_distances) > radius: # Ablation without orientation
|
# if np.min(other_distances) > radius: # Ablation without orientation
|
||||||
@ -163,8 +166,10 @@ def show_activities(args, image_t, output_path, annotations, dic_out):
|
|||||||
show=args.show,
|
show=args.show,
|
||||||
fig_width=10,
|
fig_width=10,
|
||||||
dpi_factor=1.0) as ax:
|
dpi_factor=1.0) as ax:
|
||||||
keypoint_painter.keypoints(ax, keypoint_sets, colors=colors, raise_hand=r_h)
|
keypoint_painter.keypoints(
|
||||||
draw_orientation(ax, uv_centers, sizes, angles, colors, mode='front')
|
ax, keypoint_sets, colors=colors, raise_hand=r_h)
|
||||||
|
draw_orientation(ax, uv_centers, sizes,
|
||||||
|
angles, colors, mode='front')
|
||||||
|
|
||||||
if 'bird' in args.output_types:
|
if 'bird' in args.output_types:
|
||||||
z_max = min(args.z_max, 4 + max([el[1] for el in xz_centers]))
|
z_max = min(args.z_max, 4 + max([el[1] for el in xz_centers]))
|
||||||
|
|||||||
@ -46,7 +46,8 @@ def get_torch_checkpoints_dir():
|
|||||||
|
|
||||||
def download_checkpoints(args):
|
def download_checkpoints(args):
|
||||||
torch_dir = get_torch_checkpoints_dir()
|
torch_dir = get_torch_checkpoints_dir()
|
||||||
pifpaf_model = os.path.join(torch_dir, 'shufflenetv2k30-201104-224654-cocokp-d75ed641.pkl')
|
pifpaf_model = os.path.join(
|
||||||
|
torch_dir, 'shufflenetv2k30-201104-224654-cocokp-d75ed641.pkl')
|
||||||
dic_models = {'keypoints': pifpaf_model}
|
dic_models = {'keypoints': pifpaf_model}
|
||||||
if not os.path.exists(pifpaf_model):
|
if not os.path.exists(pifpaf_model):
|
||||||
import gdown
|
import gdown
|
||||||
@ -154,14 +155,16 @@ def predict(args):
|
|||||||
# data
|
# data
|
||||||
data = datasets.ImageList(args.images, preprocess=preprocess)
|
data = datasets.ImageList(args.images, preprocess=preprocess)
|
||||||
if args.mode == 'stereo':
|
if args.mode == 'stereo':
|
||||||
assert len(data.image_paths) % 2 == 0, "Odd number of images in a stereo setting"
|
assert len(
|
||||||
|
data.image_paths) % 2 == 0, "Odd number of images in a stereo setting"
|
||||||
|
|
||||||
data_loader = torch.utils.data.DataLoader(
|
data_loader = torch.utils.data.DataLoader(
|
||||||
data, batch_size=args.batch_size, shuffle=False,
|
data, batch_size=args.batch_size, shuffle=False,
|
||||||
pin_memory=False, collate_fn=datasets.collate_images_anns_meta)
|
pin_memory=False, collate_fn=datasets.collate_images_anns_meta)
|
||||||
|
|
||||||
for batch_i, (image_tensors_batch, _, meta_batch) in enumerate(data_loader):
|
for batch_i, (image_tensors_batch, _, meta_batch) in enumerate(data_loader):
|
||||||
pred_batch = processor.batch(pifpaf_model, image_tensors_batch, device=args.device)
|
pred_batch = processor.batch(
|
||||||
|
pifpaf_model, image_tensors_batch, device=args.device)
|
||||||
|
|
||||||
# unbatch (only for MonStereo)
|
# unbatch (only for MonStereo)
|
||||||
for idx, (pred, meta) in enumerate(zip(pred_batch, meta_batch)):
|
for idx, (pred, meta) in enumerate(zip(pred_batch, meta_batch)):
|
||||||
@ -183,7 +186,8 @@ def predict(args):
|
|||||||
output_path = os.path.join(splits[0], 'out_' + splits[1])
|
output_path = os.path.join(splits[0], 'out_' + splits[1])
|
||||||
else:
|
else:
|
||||||
file_name = os.path.basename(meta['file_name'])
|
file_name = os.path.basename(meta['file_name'])
|
||||||
output_path = os.path.join(args.output_directory, 'out_' + file_name)
|
output_path = os.path.join(
|
||||||
|
args.output_directory, 'out_' + file_name)
|
||||||
|
|
||||||
im_name = os.path.basename(meta['file_name'])
|
im_name = os.path.basename(meta['file_name'])
|
||||||
print(f'{batch_i} image {im_name} saved as {output_path}')
|
print(f'{batch_i} image {im_name} saved as {output_path}')
|
||||||
@ -195,15 +199,18 @@ def predict(args):
|
|||||||
# 3D Predictions
|
# 3D Predictions
|
||||||
if args.mode != 'keypoints':
|
if args.mode != 'keypoints':
|
||||||
im_size = (cpu_image.size[0], cpu_image.size[1]) # Original
|
im_size = (cpu_image.size[0], cpu_image.size[1]) # Original
|
||||||
kk, dic_gt = factory_for_gt(im_size, focal_length=args.focal, name=im_name, path_gt=args.path_gt)
|
kk, dic_gt = factory_for_gt(
|
||||||
|
im_size, focal_length=args.focal, name=im_name, path_gt=args.path_gt)
|
||||||
|
|
||||||
# Preprocess pifpaf outputs and run monoloco
|
# Preprocess pifpaf outputs and run monoloco
|
||||||
boxes, keypoints = preprocess_pifpaf(pifpaf_outs['left'], im_size, enlarge_boxes=False)
|
boxes, keypoints = preprocess_pifpaf(
|
||||||
|
pifpaf_outs['left'], im_size, enlarge_boxes=False)
|
||||||
|
|
||||||
if args.mode == 'mono':
|
if args.mode == 'mono':
|
||||||
LOG.info("Prediction with MonoLoco++")
|
LOG.info("Prediction with MonoLoco++")
|
||||||
dic_out = net.forward(keypoints, kk)
|
dic_out = net.forward(keypoints, kk)
|
||||||
dic_out = net.post_process(dic_out, boxes, keypoints, kk, dic_gt)
|
dic_out = net.post_process(
|
||||||
|
dic_out, boxes, keypoints, kk, dic_gt)
|
||||||
if args.social_distance or (args.activities and 'social_distance' in args.activities):
|
if args.social_distance or (args.activities and 'social_distance' in args.activities):
|
||||||
dic_out = net.social_distance(dic_out, args)
|
dic_out = net.social_distance(dic_out, args)
|
||||||
if args.activities and 'raise_hand' in args.activities:
|
if args.activities and 'raise_hand' in args.activities:
|
||||||
@ -211,9 +218,11 @@ def predict(args):
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
LOG.info("Prediction with MonStereo")
|
LOG.info("Prediction with MonStereo")
|
||||||
boxes_r, keypoints_r = preprocess_pifpaf(pifpaf_outs['right'], im_size)
|
boxes_r, keypoints_r = preprocess_pifpaf(
|
||||||
|
pifpaf_outs['right'], im_size)
|
||||||
dic_out = net.forward(keypoints, kk, keypoints_r=keypoints_r)
|
dic_out = net.forward(keypoints, kk, keypoints_r=keypoints_r)
|
||||||
dic_out = net.post_process(dic_out, boxes, keypoints, kk, dic_gt)
|
dic_out = net.post_process(
|
||||||
|
dic_out, boxes, keypoints, kk, dic_gt)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
dic_out = defaultdict(list)
|
dic_out = defaultdict(list)
|
||||||
@ -242,7 +251,8 @@ def factory_outputs(args, pifpaf_outs, dic_out, output_path, kk=None):
|
|||||||
elif any((xx in args.output_types for xx in ['front', 'bird', 'multi'])):
|
elif any((xx in args.output_types for xx in ['front', 'bird', 'multi'])):
|
||||||
LOG.info(output_path)
|
LOG.info(output_path)
|
||||||
if args.activities:
|
if args.activities:
|
||||||
show_activities(args, pifpaf_outs['image'], output_path, pifpaf_outs['left'], dic_out)
|
show_activities(
|
||||||
|
args, pifpaf_outs['image'], output_path, pifpaf_outs['left'], dic_out)
|
||||||
else:
|
else:
|
||||||
printer = Printer(pifpaf_outs['image'], output_path, kk, args)
|
printer = Printer(pifpaf_outs['image'], output_path, kk, args)
|
||||||
figures, axes = printer.factory_axes(dic_out)
|
figures, axes = printer.factory_axes(dic_out)
|
||||||
@ -253,4 +263,5 @@ def factory_outputs(args, pifpaf_outs, dic_out, output_path, kk=None):
|
|||||||
json.dump(dic_out, ff)
|
json.dump(dic_out, ff)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
LOG.info("No output saved, please select one among front, bird, multi, or pifpaf options")
|
LOG.info(
|
||||||
|
"No output saved, please select one among front, bird, multi, or pifpaf options")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user