From a68699db62580d58b18ee1756e6836c50db6c2fa Mon Sep 17 00:00:00 2001 From: charlesbvll Date: Sat, 1 May 2021 17:25:13 +0200 Subject: [PATCH] Changed visualization --- monoloco/run.py | 5 +-- monoloco/visuals/printer.py | 63 +++++++++++++++++++------------------ monoloco/visuals/webcam.py | 5 ++- 3 files changed, 39 insertions(+), 34 deletions(-) diff --git a/monoloco/run.py b/monoloco/run.py index ae72242..358c350 100644 --- a/monoloco/run.py +++ b/monoloco/run.py @@ -24,8 +24,10 @@ def cli(): help='what to output: json keypoints skeleton for Pifpaf' 'json bird front or multi for MonStereo') predict_parser.add_argument('--no_save', help='to show images', action='store_true') + predict_parser.add_argument('--hide_distance', help='to not show the absolute distance of people from the camera', + default=False, action='store_true') predict_parser.add_argument('--dpi', help='image resolution', type=int, default=150) - predict_parser.add_argument('--long-edge', default=None, type=int, + predict_parser.add_argument('--long_edge', default=None, type=int, help='rescale the long side of the image (aspect ratio maintained)') predict_parser.add_argument('--white-overlay', nargs='?', default=False, const=0.8, type=float, @@ -60,7 +62,6 @@ def cli(): predict_parser.add_argument('--dropout', type=float, help='dropout parameter', default=0.2) predict_parser.add_argument('--show_all', help='only predict ground-truth matches or all', action='store_true') predict_parser.add_argument('--webcam', help='monstereo streaming', action='store_true') - predict_parser.add_argument('--scale', default=0.2, type=float, help='change the scale of the webcam image') predict_parser.add_argument('--focal', help='focal length in mm for a sensor size of 7.2x5.4 mm. (nuScenes)', type=float, default=5.7) diff --git a/monoloco/visuals/printer.py b/monoloco/visuals/printer.py index 4b5793d..06c82ff 100644 --- a/monoloco/visuals/printer.py +++ b/monoloco/visuals/printer.py @@ -65,6 +65,7 @@ class Printer: self.save = not args.no_save and not self.webcam self.plt_close = not self.webcam self.activities = args.activities + self.hide_distance = args.hide_distance # define image attributes self.attr = image_attributes(args.dpi, args.output_types) @@ -184,22 +185,22 @@ class Printer: keypoint_sets, _ = get_pifpaf_outputs(annotations) keypoint_painter = KeypointPainter(show_box=False, y_scale=self.y_scale) + if not self.hide_distance: + scores = self.dd_pred + else: + scores=None + if activities: keypoint_painter.keypoints( axis, keypoint_sets, size=self.im.size, - scores=self.dd_pred, colors=colors, activities=activities, dic_out=dic_out) + scores=scores, colors=colors, activities=activities, dic_out=dic_out) - if 'social_distance' in activities: - draw_orientation(axis, self.centers, - sizes, self.angles, colors, mode='front') else: keypoint_painter.keypoints( - axis, keypoint_sets, size=self.im.size, scores=self.dd_pred) + axis, keypoint_sets, size=self.im.size, colors=colors, scores=scores) - - def _activities_bird(self, axis, colors, activities): - if 'social_distance' in activities: - draw_orientation(axis, self.xz_centers, [], self.angles, colors, mode='bird') + draw_orientation(axis, self.centers, + sizes, self.angles, colors, mode='front') def _front_loop(self, iterator, axes, number, colors, annotations, dic_out): @@ -218,8 +219,7 @@ class Printer: def _bird_loop(self, iterator, axes, colors, number): for idx in iterator: if any(xx in self.output_types for xx in ['bird', 'multi']) and self.zz_pred[idx] > 0: - if self.activities: - self._activities_bird(axes[1], colors, self.activities) + draw_orientation(axes[1], self.xz_centers, [], self.angles, colors, mode='bird') # Draw ground truth and uncertainty self._draw_uncertainty(axes, idx) @@ -231,9 +231,8 @@ class Printer: def draw(self, figures, axes, image, dic_out=None, annotations=None): - colors = [] + colors = ['deepskyblue' for _ in self.uv_heads] if self.activities: - colors = ['deepskyblue' for _ in self.uv_heads] if 'social_distance' in self.activities: colors = social_distance_colors(colors, dic_out) @@ -291,23 +290,24 @@ class Printer: x_t = x0 - 1.5 y_t = y1 + self.attr['y_box_margin'] if y_t < (self.height-10): - ax.annotate( - text, - (x_t, y_t), - fontsize=self.attr['fontsize_d'], - weight='bold', - xytext=(5.0, 5.0), - textcoords='offset points', - color='white', - bbox=bbox_config, - ) - if number['flag']: - ax.text(x0 - 17, - y1 + 14, - chr(number['num']), - fontsize=self.attr['fontsize_num'], - color=self.attr[self.modes[idx]]['numcolor'], - weight='bold') + if not self.hide_distance: + ax.annotate( + text, + (x_t, y_t), + fontsize=self.attr['fontsize_d'], + weight='bold', + xytext=(5.0, 5.0), + textcoords='offset points', + color='white', + bbox=bbox_config, + ) + if number['flag']: + ax.text(x0 - 17, + y1 + 14, + chr(number['num']), + fontsize=self.attr['fontsize_num'], + color=self.attr[self.modes[idx]]['numcolor'], + weight='bold') def _draw_text_bird(self, axes, idx, num): """Plot the number in the bird eye view map""" @@ -429,13 +429,14 @@ class Printer: else: uv_max = [0., float(self.height)] xyz_max = pixel_to_camera(uv_max, self.kk, self.z_max) - x_max = max(abs(xyz_max[0]), 6) # shortcut to avoid oval circles in case of different kk + x_max = abs(xyz_max[0]) # shortcut to avoid oval circles in case of different kk corr = round(float(x_max / 3)) ax.plot([0, x_max], [0, self.z_max], 'k--') ax.plot([0, -x_max], [0, self.z_max], 'k--') ax.set_xlim(-x_max + corr, x_max - corr) ax.set_ylim(0, self.z_max + 1) ax.set_xlabel("X [m]") + ax.set_box_aspect(.8) plt.xticks(fontsize=self.attr['fontsize_ax']) plt.yticks(fontsize=self.attr['fontsize_ax']) return ax diff --git a/monoloco/visuals/webcam.py b/monoloco/visuals/webcam.py index 94bcc0b..6aa9489 100644 --- a/monoloco/visuals/webcam.py +++ b/monoloco/visuals/webcam.py @@ -55,6 +55,8 @@ def factory_from_args(args): args.no_save = True args.batch_size = 1 + if args.long_edge is None: + args.long_edge = 144 # Make default pifpaf argument args.force_complete_pose = True LOG.info("Force complete pose is active") @@ -88,7 +90,8 @@ def webcam(args): while True: start = time.time() ret, frame = cam.read() - image = cv2.resize(frame, None, fx=args.scale, fy=args.scale) + scale = (args.long_edge)/frame.shape[0] + image = cv2.resize(frame, None, fx=scale, fy=scale) height, width, _ = image.shape print('resized image size: {}'.format(image.shape)) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)