Skip to content

KWIVER Release 1.5.0

Compare
Choose a tag to compare
@Cookt2 Cookt2 released this 04 May 16:56
· 2254 commits to release since this release
5a7a959

KWIVER v1.5.0 Release Notes

This is a minor release of KWIVER that provides both new functionality and fixes over the previous v1.4.0 release.

Updates since v1.4.0

Config

  • Default configuration files have been added to KWIVER for several
    algorithms. These configuration files provide recommended ways to combine
    algorithms across arrows, assuming all arrows are available. The
    configuration files are installed and may be loaded automatically by
    applets as their default configuration.

Vital

Vital Algo

  • Changed the callback API on compute_depth to accept a string status
    message. Integer progress is now interpreted as percent complete
    rather than number of iterations.

  • Added a variant of the integrate_depth_maps API that takes weight images
    along with depth images. This feature was added to include binary image
    masks in the fusion, but it also extends to continuous weight values
    between zero and one.

Vital Types

  • Added kwiver::vital::set mixin class to define standard set methods as
    well as iterability.

  • Added iterator, const_iterator and iterable classes to support container-
    independent iteration.

  • Added a parameter to the clone() methods of the track_state, track and
    track_set types controlling whether to make an actual deep copy (default) or
    to make a shallow copy (previous behavior) where elements of the derived
    feature_track_state or object_track_state would still be shared. (This
    change also affects track_set::merge_in_other_track_set(). However, the copy
    constructors of feature_track_state and object_track_state still make only
    shallow copies.)

  • Added a variant of config_block::get_enum_value that accepts a default
    value to fall back on.

  • Added support for registering callbacks to the KWIVER logger. Callbacks
    receive any message that is logged with the KWIVER logging framework.

Vital Plugin-loader

  • Added support for filtering plugins when they are loaded. Filter
    objects can be added to the plugin loader at run time to select or
    exclude specific plugins.

Vital Logger

  • Log4cplus now searches in more locations to find the log4cplus.properties
    file during start up. If not found with the environment variable or in the
    current working directory it will now search in the location of the
    executable and also in "../lib/kwiver" relative to the executable.

Vital Types

  • Added functions to camera_intrinsics to test if a point is in the valid
    domain of the mapping function. In the radial distortion case of
    simple_camera_intrinsics, this computes a maximum radius for which
    distortion is valid. This feature is to help avoid invalid projections
    of points into images due to the distortion being non-injective.

  • Added get_vector() member function to access the vector of all metadata on
    a frame in metadata_map.

  • Added kwiver::vital::set mixin class to define standard set methods as
    well as iterability.

  • Added iterator, const_iterator and iterable classes to support container-
    independent iteration.

  • Refactored detected_object_set to convert some methods to external
    functions since they were not properties of the class.

  • Vital types protobuf support now requires protobuf version 3 or greater.

Vital Bindings

  • Remove ctypes python bindings

  • Moved python bindings associated with config from sprokit.pipeline to
    vital.config.

Vital Config

  • Extended the application_config_file_paths() function to list configuration
    file paths for both the application name provided and for KWIVER-provided
    configuration files. This allows KWIVER-provided configuration files to be
    found if the file is not found in an application configuration directory
    first.

Arrows

Arrows: Core

  • Added an algorithm implementation (transform_detected_object_set) for
    transforming detected object sets from one camera perspective to another.
    Implements vital::algo::detected_object_filter.

  • Added an algorithm implementation (transfer_bbox_with_depth_map) for
    transforming detected object set bounding boxes from one camera perspective
    to another with respect to a depth map. Implements
    vital::algo::detected_object_filter.

  • Added a detect_features adaptor that applies a filter_features
    algorithm to filter features returned by the detector. This allows
    a filter to be injected anywhere a detector is normally used.

  • Added an adaptive non-max suppression filter for features points.
    This algorithm provides more uniformity to detected features by
    removing all features within a radius of the strongest points.
    The radius is dynamically adapted to achieve a target point count.

  • Added an option to the fundamental matrix matcher that does a second
    round of filtering to remove outliers with large motion relative to
    most other matches.

  • When resectioning cameras in the keyframe initializer we now copy the
    intrinsics from the nearest existing camera rather than from the base
    camera in the config or metadata. This way the focal length better matches
    existing cameras and the initial pose will better match as well.

  • During keyframe camera initialization the algorithm detects if the camera
    graph has split into multiple components. Previously only the largest
    component was kept resulting in significant data loss. Instead the
    algorithm now tries to retriangulate tracks that previously held the
    camera graph together.

  • Refactored initialize_cameras_landmarks_keyframe code for better
    reuseability and readability.

  • Updated the initialize_cameras_landmarks_keyframe algorithm to better
    handle early termination through callbacks.

  • Added a new SfM utility function to compute a set of well-distributed
    but well-connected keyframes for use in initializing SfM.

  • Use a canonical transform estimator in initialize_cameras_landmarks_keyframe
    to reorient the solution when no metadata constraints are available.
    This also helps detect upside down cameras and trigger a Necker reversal to
    correct for that case.

  • Added utility functions to estimate the ground center of landmarks and
    to apply a translational offset to landmarks and cameras.

  • Added a utility to compute the subset of cameras located on the positive
    side of a specified plane.

  • Improved Necker reversal correction in the keyframe camera and landmark
    initializer by allowing reversal of individual cameras that are upside down
    provided that all cameras are above the estimated ground plane.

  • In the keyframe camera and landmark initializer, only use windowed bundle
    adjustment for filling in cameras after the entire initial sequence is
    complete.

  • In the keyframe camera and landmark initializer, we no longer update
    the base_camera intrinsics configuration value with estimated values.
    These should remain fixed to their configured settings. Instead we now
    use nearby established cameras to initialize similar or shared intrinsics.

  • Added a utility to compute the subset of cameras located on the positive
    side of a specified plane.

  • Improved Necker reversal correction in the keyframe camera and landmark
    initializer by allowing reversal of individual cameras that are upside down
    provided that all cameras are above the estimated ground plane.

Arrows: Ceres

  • Fixed long-broken bundle adjustment regularization parameters for
    camera smoothness and forward motion damping. The fixed versions now
    support non-sequential camera frame numbers and the residual costs are
    normalized relative to both the number of existing residuals and the
    spatial scale of the camera positions. These normalization allow the
    regularization to work similarly across different problem sizes and scales.

  • Added a configuration option to the bundle adjuster that allow for
    callbacks to not provided updates on every iteration for efficiency.

  • Add a new option for minimum horizontal field of view (hfov) in bundle
    adjustment and camera optimization. This is mostly for telescopic lenses
    when the hfov is very small (e.g. less than 5 degrees). There is a
    tendency for small FOVs to drift toward zero due to lack of perspective.
    This new parameter introduces a large cost if the HFOV drops below the
    set threshold.

Arrows: CUDA

  • Added a new parameter for the truncated signed distance function in depth
    map integration. The new "Epsilon" value is used in the occluded portion
    of the function that was previously zero. Setting Epsilon > 0 can remove
    a double surface artifact. Setting Epsilon = 0 restores the previous
    behavior.

  • CUDA depth map integration now uses optional weight maps to down-weight
    the contribution of some rays.

Arrows: FFMPEG

  • Optimized the num_frames() call to produce a count of the number of frames
    in constant time without scanning the entire video and counting all frames.

Arrows: Serialization

  • Updated serialization algorithms to use PLUGIN_INFO macro and added
    serializer specific plugin registrar.

Arrows: Super3d

  • Replaced cout and cerr usage in Super3D with vital logger.

  • Improved callback handling in compute_depth. Callbacks are now more
    frequent providing better progress updates and quicker early termination.
    However, depth maps updates still occur at the slower rate as before.

Sprokit: Processes

  • Added a core sprokit process to shift a stream of detected object
    sets by a specified offset. When a negative offset is specified,
    detected object sets are initially consumed from the stream until
    the offset is satisfied. When a positive offset is specified,
    empty detected object sets are prepended to the stream until the
    offset is satisfied.

  • Added method to compare the config declared by the process against
    the config supplied by the pipeline. Any differences can be written
    to the log. This is useful for identifying misspelled config items.

  • Add finalize method to process base class which allows derived
    processes to be optionally called when the all upstream processes
    have terminated and a complete datum is present on all required
    input ports.

Tools

  • Converting stand-alone tools to reside under the main "kwiver" top
    level tool. Individual tools are specified as a parameter to the
    "kwiver" tool runner.

  • Moved source of tools/applets and reorganized:

    • tools - contains executables, E.g. kwiver tool runner
    • vital/applets - contains applet framework
    • arrows/core/applets - general applets

Bug Fixes

Arrows: Core

  • Fixed a bug in initialize_cameras_landmarks_keyframe that was causing
    points to be rejected because cameras were swapped.

Arrows: Ceres

  • Fixed an issue in bundle adjustment where intrinsics were optimized
    when shared between fixed and non-fixed cameras. This resulted in an
    increased error in residual terms of fixed cameras not included in the
    bundle adjustment. As a result, filtering often removed these points as
    outliers. It is better to only optimize intrinsics when not shared with
    a fixed camera.

  • Fixed and issue with bundle adjustment regularization in which the
    regularization would dominate the data terms if the scale of the data
    was large.

Arrows: Super3D

  • Fixed mask conversion code to allow both boolean and byte images
    without crashing.

  • Fixed a bug in which the mask was being applied to G-weighting in an
    inverted way from what was expected.