Skip to content

Releases: Kitware/kwiver

Kwiver Release 1.8.0

29 May 16:49
d98f76d
Compare
Choose a tag to compare

KWIVER v1.8.0 Release Notes

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

Updates

KWIVER

  • Adopted C++17.

  • Added setup_KWIVER.ps1.

  • Added the MSVC 2022 compiler as a case in our CMake logic.

Vital

Vital Algo

  • Added API for algorithms to find nearest neighbor to a set of point in 3D.

  • Expanded the pointcloud_io API to include the ability to load point cloud data

  • Added option to open file given to metadata_map_io in binary mode.

  • Added buffered_metadata_filter.

Vital Types

  • Added new pointcloud type to hold point cloud data

  • Added VITAL_META_UNIX_TIMESTAMP_SOURCE, VITAL_META_VIDEO_DATA_STREAM_SYNCHRONOUS.

  • Removed VITAL_META_ICING_DETECTED.

  • Added equality operators for metadata_item.

  • Added metadata_[io]stream.

Vital Util

  • Added support for different text codecs (ASCII, UTF-8, etc).

  • Added threeway_compare().

Arrows

  • Passed a constant seed to the random point generator used by several tests to
    prevent occasional random failure.

Arrows: Core

  • Implemented a general-purpose CSV reader and writer.

  • Prevent UV coordinates from going to NaN for degenerate triangles in uv_unwrap_mesh.

  • Fixed race condition in close_loops_exhaustive that could result in a crash
    when matching and merging feature tracks.

  • Fixed undefined behavior leading to a crash in track_features_core when the
    track set remained empty after the first frame.

  • Fixed an incorrect cast of a geo_point to double in derive_metadata.

Arrows: FFmpeg

  • Added support for FFmpeg 5.1.2.

  • Added basic configuration options to ffmpeg_video_output.

  • Added CUVID video decoding/encoding support.

  • Added support in ffmpeg_video_output for non-RGB24 input images.

  • Fixed many bugs with timestamps.

  • Implemented direct copying of video stream packets from input to output.

  • Improved robustness against invalid input data.

  • Added config options to ffmpeg_video_input to ignore the video or KLV streams.

  • Properly handle MISP nanosecond timestamps.

  • Added padding to end of image memory to avoid segfaults.

  • Improved the search paths to find an FFmpeg installation.

  • Fixed alignment between KLV packets and frames when reading and writing.

  • Limit total amount of past KLV maintained in memory.

  • Added new synthetic test videos.

  • Added derivation of KLV synchronicity from stream and packet characteristics.

  • Made initial probing logic more persistent.

Arrows: KLV

  • Implemented ST1107.

  • Updated ST0903 implementation to version 6.

  • Implemented the BOOLEAN, UINT, and RLE APAs in ST1303.

  • Adjusted tag number requirements of ST0806.

  • Changed data type of EG0104 Episode Number to string.

  • Implemented configuration of KLV muxing update rates.

  • Modified interface to use pointers when reading/writing instead of
    std::vector iterators.

  • Used std::nullopt to indicate no ST0601 control command timestamp instead of 0.

  • Used std::chrono to better express MISP timestamps.

  • Changed type of ST0601 Waypoint Record bitfield.

  • Added detailed length constraint information.

  • Fixed bug when calculating length of ST0601 Airbase Locations.

  • Fixed bug which prevented detection of some too-long KLV packet lengths.

  • Added apply_child_klv and update_klv metadata filters.

  • Implemented CRC-8-CCITT checksum.

  • Fixed bug when ST0903 local set packs fail to parse.

  • Made headers public which were included by other public headers.

  • Improved descriptions of formats.

  • Implemented handling of different string encodings.

  • Fixed possible out-of-bounds memory read leading to crash when KLV parsing
    fails.

  • Fixed bug in KLV packet reader which failed to check if the packet's length
    was larger than the available number of input bytes.

  • Fixed bug in ST0601 view domain writer which would not write the length of
    the final field.

  • Added a missing type to the ST0601 KLV JSON exporter.

Arrows: PDAL

  • Added implementation of the load API to pointcloud_io to load point data via the PDAL library

Arrows: Serialize JSON

  • Fixed bug when loading a KLV local set item with a null value.

  • Fixed bug preventing the proper loading of strings with embedded null ('\0')
    characters.

  • Increased the precision of exported floating point values.

  • Added a configuration option to compress JSON on output.

Arrows: Zlib

  • Added this arrow with bytestream_compressor functionality.

KwiverSys

  • Made compiling regular expression thread-safe.

Applets

Applets: bundle adjustment tool

  • Added an implementation bundle adjustment (BA) applet that optimizes a set of
    cameras given multiple 3D-2D point correspondences.

Applets: transcode

  • Fixed a bug in which metadata was erroneously written after each frame,
    instead of before.

Applets: dump-klv

  • Added an option to use multithreading when dumping frame images.

  • Removed early exit when no KLV stream is found.

Applets: compare-klv

  • Added this applet.

Python:

  • Removed the custom pybind11.h header file since the current version of
    pybind11 now handles cases where the GIL is acquired via the
    PyGILState_* API.

Kwiver Release 1.7.0

13 May 20:54
Compare
Choose a tag to compare

KWIVER v1.7.0 Release Notes

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

Updates

Vital

Vital Types

  • Modified rotation_ constructor from yaw-pitch-roll to keep the given
    North-East-Down coordinate system as-is instead of automatically converting to
    East-North-Up. Added utility functions which perform conversion between NED
    and ENU coordinates.

Build System

  • Removed some CMake statements and support for old CMake version predating the
    current minimum version specification.

Vital KLV

  • Moved KLV to a new arrow.

Arrows

Arrows: Core

  • Added transcode applet.

  • Added frame dumping capability to dump-klv.

  • Added the option to choose the metadata export format in dump-klv.

  • Added the derive_metadata filter.

  • Enabled exporting components of composite data types separately in
    metadata_map_io_csv.

  • Added frame decimation to metadata_map_io_csv.

  • Allowed the overriding of column names in metadata_map_io_csv.

Arrows: FFmpeg

  • Enabled reading MISP timestamps from stream.

  • Added additional video metadata reporting.

  • Added exporting of encoding settings from input video.

  • Added basic video encoder.

Arrows: KLV

  • Moved KLV arrow from Vital.

  • Ensured proper handling of ST0601 Report-on-Change behavior.

  • Rewrote EG0104 and ST0601 to be able to read and write all tags.

  • Newly implemented reading and writing for the following standards: ST0102,
    ST0806, ST0903, ST1102, ST1010, ST1108, ST1202, ST1204, ST1206, ST1303,
    ST1601, ST1602, and ST1607.

Arrows: Serialize

  • Added partial KLV-JSON reader/writer.

Bug Fixes

Arrows: Core

  • Fixed metadata_map_io_csv printing the wrong number of commas for some empty
    fields.

Kwiver Release 1.6.1

11 Apr 17:31
d09bdc8
Compare
Choose a tag to compare

KWIVER v1.6.1 Release Notes

This is a patch release of KWIVER that provides fixes over the previous v1.6.0 release.

Bug Fixes since v1.6.0

Arrows: Ceres

  • Fixed a bug in which the FORCE_COMMON_INTRINSICS option in bundle
    adjustment was not actually forcing intrinsics to be common.

Arrows: FFMPEG

  • Fixed a bug in which slight variations in presentation timestamps would
    sometimes cause frames to be skipped while decoding.

  • Fixed a bug in which the video reader would not request any frames at end of
    video that FFmpeg still had buffered internally.

Arrows: MVG

  • Fixed a typo in the command line argument name for camera path in the
    init_cameras_landmarks applet. This was preventing changing the camera
    directory in the applet.

Arrows: VTK

  • Fixed an error in the calculation of depth used in mesh coloring. This
    caused coloring to fail to apply color in some cases. It was primarily
    an issue when the near plane was much closer to the camera than to the
    far plane.

  • Fix an error that always caused a segmentation fault in the
    color_mesh applet for VTK version greater than 9.0.1. The issue was
    that rendering was not properly initialized at build time.

Build System

  • Fix missing ZeroMQ_INCLUDE_DIR set when building statically.

  • Fix missing-closing-bracket typo in CMake/utils/kwiver-utils-python.cmake.

  • Use xvfb in Docker image to support running VTK applets in a headless
    environment.

  • Include CUDA include directories when building CUDA arrow. This is needed
    if CUDA is not installed in standard system locations.

  • Enable the CUDA arrow in the Docker container.

Vital Algorithms

  • Fix potential leak of stream pointers in the base functionality of
    write_object_track_set.

Vital: Logging

  • Fixed an issue in the default logger where leading zeros of fractional
    seconds were being stripped leading to the printing of the incorrect time.

Kwiver Release 1.6.0

10 Aug 16:59
6786e13
Compare
Choose a tag to compare

KWIVER v1.6.0 Release Notes

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

Updates since v1.5.0

  • Renamed symbols or other approaches to reduce "shadowing" warnings.

Vital

Vital Algo

  • Extended the API for compute_depth to also return an uncertainty image.

  • Added API for camera resectioning.

Vital Applets

  • Added utility functions to help validate config file entries for input
    and output files and directories.

Vital Config:

  • Added use of environment variable KWIVER_CONFIG_PREFIX in conjunction with previous
    search strategy for config location.

  • Introduced function using config search pattern to locate files, returning valid path(s).

Vital Types

  • Added new method to metadata class to add a metadata item being
    passed by shared_ptr.

  • Added methods to track to facilitate removing states by frame number or iterator.

  • Use specific typing frame_id_t for track_features::track.

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.

  • Added optional bit mask to load_all_plugins() which allows selected
    groups of plugins to be loaded. In addition the build/install
    directory structure for the plugins was reorganized.

  • Internal change to consolidate determining and configuring the
    build-time plugin search paths.

Vital Util

Vital Logger

Vital Tools

Vital Types

Vital Bindings

  • Remove ctypes python bindings

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

  • Force logging level of TRACE to be DEBUG in bindings because Python logging
    does not support the TRACE level.

Arrows

  • Cleaned up arrows library links. Many arrows linked to the core arrow
    when really only needed to link directly to vital libraries.

Arrows: Core

  • Updated dump-klv applet to load default configuration from a file.

  • Updated dump-klv to support option including metadata in write out.

  • Added a utility function to depth_utils.h to find similar cameras by view
    angle.

  • Added a utility function to depth_utils.h to gather corresponding cameras,
    images, and masks from video sources for use in depth map estimation.

  • Added serialization of video metadata to CSV output for file export.

Arrows: Ceres

  • Improve logging in bundle_adjust to allow logging per-iteration summaries
    and independently control logging fully summaries after optimization
    completes.

  • Refactored camera estimation configuration options and moved those utilities
    to the new MVG arrow for easier reuse without depending on Ceres Solver.

Arrows: CUDA

Arrows: FFmpeg

  • Now checks the timestamps of the metadata packets to catch packets
    that are arriving early. Packets that arrive early are cached until the
    timestamp of the current frame is larger than the timestamp of the
    metadata packet. This synchronization can be disabled if desired.

  • Fixed an issue where only metadata packets from the first data stream
    are saved.

  • Added a libavfilter pipeline into the ffmpeg_video_input reader. This
    allows users to inject filters in the video reader, much the same as
    is possible in the ffmpeg command line with the -vf option. The default
    filter applies deinterlacing to any interlaced frames.

  • Fixed the memory leak that occurred when a video was opened and closed.

Arrows: GDAL

Arrows: KPF

Arrows: MVG

  • Created new MVG arrow to make a new home for Multi-View Geometry and
    other 3D vision code. Much of this code will move from the "core" arrow
    which had grown too large.

  • Moved track_features applet from core into mvg.

  • Moved the following algorithms from core into mvg:

    • hierarchical_bundle_adjust
    • initialize_cameras_landmarks_keyframe (renamed to initialize_cameras_landmarks)
    • initialize_cameras_landmarks (renamed to initialize_cameras_landmarks_basic)
    • triangulate_landmarks
  • Moved the following utility headers from core into mvg:

    • epipolar_geometry.h
    • interpolate_camera.h
    • necker_reverse.h
    • metrics.h
    • projected_track_set.h
    • sfm_utils.h
    • transform.h
    • triangulate.h
  • Added a new applet, init_cameras_landmarks, to run the estimate cameras
    and landmarks from feature tracks produced by the track_features applet.

  • Added an implementation of integrate_depth_maps. This works exactly the same
    as the implementation in the CUDA arrow, but does not require a GPU.

Arrows: OpenCV

  • Added a new camera resectioning algorithm implementation using
    cv::calibrateCamera().

  • Added Telea inpainting method.

  • Added Navier-Stokes inpainting method.

  • Added Black-Mask inpainting method.

  • Added OpenCV implementation of resection camera algorithm.

Arrows: PROJ

  • Accepted use of PROJ 5 and 6.

Arrows: Serialization

  • Added capacity to read and write video metadata as json types.

Arrows: Super3d

  • Changed the compute_depth parameters to take a sampling rate, in pixels,
    instead of an absolute number of depth slices. This allows the algorithm
    the scale the number of slices appropriately ensuring at least a minimum
    sampling rate when projecting into support images.

  • Updated the Super3D compute_depth algorithm to compute uncertainty.

Arrows: VTK

  • Created new VTK arrow.

  • Added utility function to convert depth images to vtkImageData.
    This function was ported from TeleSculptor.

  • Added an applet to estimate depth maps from multiple views.

  • Added a new applet for fusing depth maps in volume and extracting a
    surface mesh.

Arrows: VXL

  • Added pixel extractor type converter.

Arrows: Python

Sprokit

Sprokit: Pipeline

  • Added signal indicating pipeline endcap input termination.

  • Embedded pipelines search config paths on construction.

Sprokit: Processes

  • Added four new PyTorch-using Python Sprokit processes for tracking
    (srnn_tracker), descriptor computation (alexnet_descriptors and
    resnet_descriptors), and augmentation (resnet_augmentation).

  • Added method to request data from Adapter Dataset with support for a
    fallback option if data is unavailable.

  • Replaced API call get_port_data with more conventional value.

Sprokit: Bindings

  • Removed redundant logger support sprokit.sprokit_logging module.

Tools

Build System

  • Added a new build flag, KWIVER_ENABLE_PYTORCH, to include
    PyTorch-dependent code in the build.

  • Enabled the use of folders for CMake targets to provided better
    organization in IDEs that support folders, like Visual Studio.

Unit Tests

General Documentation

Python

  • Added argument to build_pipeline command to include additonal directories in which
    to search for pipe files to load.

  • Python virtual env creation and dependency install removed from build process.
    Added Kwiver Python dependency install to setup script instead.

  • Added Python Algo for Camera resection Vital Algo.

  • Added metadata_map_io Python Algo.

Bug Fixes

Arrows: Core

  • Fixed several uses of wrong values in the core implementation of
    compute_ref_homography.

  • Fixed failure to report end of video status.

Arrows: Ceres

Arrows: CUDA

  • Fixed an issue in which depth imagery was loaded transposed and flipped
    and then later flipped and transposed back during CUDA processing.

Arrows: FFmpeg

  • Prevented looping seeks in some video files.

  • Fixed imporper setting of capability metadata.

Arrows: Super3D

Sprokit: Processes

  • Fixed the compute_track_descriptors process's handling of null
    output from its nested algorithm.

  • Fixed configuration check for read_object_track, enabling configuration to
    succeed.

Sprokit: Pipelines

Python:

  • Fixed kwiver.arrows.core mesh exposure to module importation.

Kwiver Release 1.5.1

01 Mar 17:37
5f8cd69
Compare
Choose a tag to compare

KWIVER v1.5.1 Release Notes

This is a patch release of KWIVER that provides fixes over the previous
v1.5.0 release.

Bug Fixes since v1.5.0

Config

  • Add support for Visual Studio 2019 in the setup_KWIVER.bat

Vital

  • Added a missing include file in track.cxx required to build on MSVC 2019.

  • Changed incorrect metadata tag in convert_0601_metadata.cxx from
    KLV_0601_TARGET_LOCATION_LAT to KLV_0601_TARGET_LOCATION_ELEV.

  • Fixed a typo in the TARGET_LOCATION metadata field name.

  • Updated metadata field names for kv::geo_point types to be more
    descriptive. Made the distinction between elevation and altitude.

Arrows: Ceres

  • Fixed a bug in which the update_state_every_iteration config option
    for bundle_adjust was not respected and was always manually overridden with
    "true" if a callback was registered.

Arrows: Core

  • Remove some unnecessary computation in initialize_camera_landmarks_keyframe
    by adding checks to detect earlier when computations that cannot achieve
    their desired result due to insufficient data.

  • Fixed a bug in initialize_cameras_landmarks_keyframe in which the
    principal point was not initialized from the image size unless there
    was also metadata useful for determining focal length. Distortion
    parameters were also not properly preserved in this initialization
    and this has also been resolved.

  • Fixed a bug in initialize_cameras_landmarks_keyframe in which the
    camera estimation loop would sometimes exit early without processing
    the remaining cameras. This is further improved to try the lists of
    remaining cameras multiple times until no further cameras are added.

  • Fixed a bug in initialize_cameras_landmarks_keyframe in which the
    updated landmarks are not returned from a helper function and therefore
    intermediate results are returned as the final output.

  • Fixed a bug in track features that was causing a crash on Linux after
    detecting features on the first frame of video.

Arrows: CUDA

  • Fixed a linking error on Linux with some versions of CUDA requiring
    to "recompile with -fPIC".

  • Fixed a bug in launching the integrate_depth_maps CUDA kernel.
    Previously, the kernel would fail to launch if the size of the volume
    along the X direction was greater than 1024.

  • Added a max_voxels_per_launch configuration option to the CUDA
    integrate_depth_maps algorithm. This works around a CUDA limitation
    in which long-running CUDA kernels cause the GPU to freeze the system.
    On Windows this leads to a time out after 2 seconds and the application
    is terminated. To avoid this we now launch the kernel multiple times
    covering a subset of voxels in each chunk.

Arrows: OpenCV

  • Fixed improper use of RANSAC in the OpenCV estimate_pnp algorithm.
    This algorithm was producing a lower then expected success rate when
    resectioning cameras.

  • Fixed a long standing bug with memory management when converting between
    OpenCV and Vital images. Reference counting was not handled correctly.
    A workaround was previously added that forced a deep copy, but this created
    another bug resulting in images with invalid first_pixel() values.
    Both of these issues have been addressed.

Arrows: Serialize

  • Fixed a bug in the JSON serializer for metadata where bool fields caused a
    runtime error.

  • Fixed a bug in JSON serialization of metadata maps which caused name
    collisions for multiple metadata packets associated the same frame. This
    made the output unusable by applications other than KWIVER.

KWIVER Release 1.5.0

04 May 16:56
5a7a959
Compare
Choose a tag to compare

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,
    ...
Read more

KWIVER Release 1.4.0

11 Jun 00:01
Compare
Choose a tag to compare

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

Updates since v1.3.0

Vital

  • Added constructors taking initializer lists to mesh types for easier
    initialization. * Added a new abstract algorithm, uv_unwrap_mesh, which unwraps
    a mesh and generates normalized texture coordinates.

  • Added a foreach_pixel helper function to apply an operation at every pixel of
    a const image.

  • Added the data_serializer base algorithm to support serialization of Vital
    types for distributed processing and other uses.

  • Applied a new approach to adding metadata to plugins. The plugin name and
    description are now specified in the plugin header. Added new plugin registrar
    class framework to simplify the registration process.

  • Promoted version.h from Sprokit to vital for use across all of KWIVER.

  • Change the return type of the as_bytes() function on vital::descriptor to
    return a raw pointer to the bytes instead of a vector of bytes. This API change
    avoids many memory copies when comparing descriptors at the byte level.

  • Added a sfm_constraints class and pass this to the structure-from-motion
    algorithms (initialize_cameras_landmark, bundle_adjust, optimize_cameras)
    instead of passing the raw metadata.

  • Added additional range helpers indirect and valid. The former provides access
    to iterators while still allowing a range-based for to be used. The latter
    filters iteration so that only "valid" items are visited.

  • Changes to track_set_impl to facilitate passing track changes between Sprokit
    processes rather than full track sets for efficiency.

  • Moved python module loader and registration from Sprokit to vital

  • Added metadata tag, VITAL_META_VIDEO_KEY_FRAME, which is a bool that marks if
    a video frame is a key frame.

Vital Util

  • Added simple statistic class for accumulating values. Computes average and
    std-deviation

Vital Tools

  • Converted tools to use applet plugin approach.

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

Vital Types

  • Added crop method to vital::image to get a cropped view of the image.

  • Added version of the get_image method to vital::image_container to get a
    cropped view of the underlying image.

Vital Bindings

  • Added python bindings for image_object_detector

Arrows

  • Converted arrows to use new plugin registrar implementation.

Arrows: Core

  • Created a new plugin for core applets

  • Added video_input_image_list function which enables all images contained
    inside a directory to be read in.

  • Converted Arrows core to use new PLUGIN_INFO and registrar approach.

  • Added an applet to render meshes into depth or height maps

  • Added mesh_operations.h, initially with a function to triangulate a mesh.
    That is, subdivide mesh faces into triangles.

  • Added an implementation for triangular mesh unwrapping. The method transforms
    each face independently to 2D and packs them in an almost square texture.

  • Improved triangulate_landmarks implementation with an option to use RANSAC
    for robustness to outliers and additional checks to reject poorly constrained
    landmarks with minimal view angle variation.

  • Switched track_set_impl from using a vector to store track_sptr to using an
    unordered map. This allows for more efficient search for tracks.

  • Set inlier flag for track states during triangulation. Stored max
    intersection angle of rays in landmark, a quality metric.

  • Extracts ORB descriptors at KLT feature locations. No longer runs ORB
    detector.

  • When triangulating switch to using squared re-projection error for
    efficiency. Optionally pass initial guess for landmark position to RANSAC
    triangulation. If location is already known or a good guess is available this
    can cut down the RANSAC loops considerably.

  • Optionally estimates a fundamental matrix before loop closure. Accepts a loop
    only if the number of inlier matches is above a threshold.

  • Improved the efficiency of loop closing and descriptor comparison.

  • Added triangulate_landmarks method that takes a map of tracks rather than a
    track_set_sptr as input. This is done for efficiency. Using the track map we can
    directly access the track corresponding to a landmark that needs to be
    triangulated, rather than looping over all tracks.

  • Added an alternative triangulation method based on "Triangulation Made Easy"
    Lindstrom CVPR 2010.

  • Added a new video_input implementation, video_input_splice, that splices
    multiple video sources together into a single video source.

  • Added depth utilities to compute depth ranges based on landmarks

  • Added a convenience class for storing maps of arbitrary cameras and adapted
    SfM utils to use it.

  • Added metrics for rms error by camera and a check that the rays meeting at a
    point have some minimum angle.

  • Added functions to clip meshes with a plane or a camera frustum.

  • Added a temporal down sampling option to video_input_filter where only every
    nth frame of the video source will be provided.

  • Added a utility function to compute the average world distance per pixel in a
    provided world region of interest.

  • Updated the keyframe loop closure algorithm to store keyframes in the track
    set data structure rather than internally. This change exposes the list of
    selected keyframes outside of this algorithm.

Arrows: Ceres

  • Added ability to fix either cameras or landmarks in bundle adjustment.

  • Automatically fixes the gauge if there are not enough fixed cameras or
    landmarks.

  • Added option to necker reverse only the cameras but not the landmarks.

  • Improved speed of klt/ORB feature tracking by choosing which features to
    track and match with visual vocabulary node ID. Made klt feature tracker in
    Sprokit return just the most recent tracked features, not the entire history at
    each step. Made keyframe selector remove non keyframes temporally between
    keyframes to improve speed. That way matcher process needs only get keyframes.
    After Sprokit klt tracks and keyframe orb feature tracks are merged into a
    single final track set.

  • Added feature detection that adaptively changes thresholds to detect close to
    a target number of features in each frame. Also improves the distribution of
    features across the image with a gridded approach.

  • Added functions that detect issues in the structure from motion solution and
    correct them. Issues could be disconnected components of cameras, cameras with
    too little coverage, landmarks without enough measurements to constrain them
    etc. The corrections typically remove offending items. Only the largest
    connected map component is kept. Under-constrained landmarks are removed etc.

Arrows: CUDA

  • Added CUDA arrow

  • Added depth map integration using CUDA. The algorithm takes a set of depth
    maps and associated cameras to produce a volume that a surface can be extracted
    from using an algorithm like marching cubes.

  • Switch from std::map to std::unordered_map for internal bookkeeping for
    efficiency.

  • Updated depth map integration to adjust the voxel size relative to the
    average world distance per pixel. This allows fusion to work on scenes of
    various scales without manually tuning the configuration parameters.

  • Added utilities for checking CUDA functions for error codes and then logging
    the error and throwing an exception.

  • Added utilities for CUDA memory management with unique_ptr. This is required
    to prevent memory leak when exceptions are thrown.

Arrows: FFmpeg

  • Translated log messages from FFMPEG into KWIVER log messages so we can
    control the verbosity.

  • Added metadata handling to FFMPEG implementation of video_input

  • Improved the seek_frame call to seek to a nearby keyframe first before
    advancing to the precise frame requested. This is much faster than running
    through the entire video until hitting the requested frame.

  • Using the new metadata tag, VITAL_META_VIDEO_KEY_FRAME, mark each frame of
    the video whether it is or isn't a key frame.

Arrows: KPF

  • Updated the KPF YAML parser to allow for embedded YAML in metadata.

Arrows: Super3d

  • Added region of interest specification for depth maps

  • Used OpenMP to accelerate various operations with parallel loops.

Arrows: Python

  • Added python arrow

  • Added simple_image_object_detector.py that serves as a use-case for python
    bindings of image_object_detector and replicates the functionality of
    example_detector in python

Sprokit

  • Changed KLT tracking pipeline to pass track change information between
    processes rather than full track sets for efficiency.

Sprokit: Processes

  • Added an extension plugin capability to embedded_pipeline that provides a
    hook just before the pipeline is set up and a hook after pipeline has reached
    end of data.

  • Converted processes to use the new process registrar approach.

  • Improved process timing instrumentation to provide simple stats for step
    entry.

General Documentation

  • Re-factored and improved documentation for video_input algo in vital.

  • Greatly improved documentation of 'image' and 'image_of' classes in vital.

Bug Fixes

Arrows: Core

  • Added gradual reprojection error threshold reduction in metadata based SfM to
    keep solutions from falling apart.

Arrows: CUDA

  • In integrate_depth_maps.cu depthMapKernel a test was included for depth
    values equal to -1 which should be excluded. Testing for equality in a float is
    generally bad practice because of machine precision issues. Changed to testing
    if the depth value is less than or equal to zero. If it is, then the depth value
    is skipped. This can be used to mask out bad measurements in the depth ...
Read more

KWIVER Release v1.3.1

10 Jun 23:31
Compare
Choose a tag to compare

This is a patch release of KWIVER that provides fixes over the previous v1.3.0 release.

Bug Fixes since v1.3.0

  • Fixed issue where ffmpeg_video_input does not set the depth step for
    frame images correctly.

  • Fixed an issue in the MSVC environment in which and extra ";" was
    appended to each variable

  • Fixed an issue in the MSVC environment in which redefining variables
    from setup_KWIVER.bat would append to the old value instead of replacing.

  • Install two CMake find-package modules (FFMPEG and Sphinx) that were
    missing from the installation scripts.

KWIVER Release v1.3.0

30 Jan 13:58
26c75f8
Compare
Choose a tag to compare

KWIVER v1.3.0 Release Notes

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

There has been a batch of updates surrounding serialization. Vital, Arrows, and Sprokit have all received updates to enhance the support of serialization. Vital has new algorithms to support the serialization of different vital types. In Arrows, there are new JSON and protocol buffer serializers for bounding boxes and detected objects. In Sprokit, there are new processes that convert serialized byte strings to Sprokit data ports.

This update also includes a series of organizational changes that reduce conflicts and increase usability.

There are many other changes in this release. These are detailed in the change log below.

Updates since v1.2.0

  • Loadable modules (algorithms and processes) have been moved under
    the .../lib/kwiver subdirectory so that they will not conflict with
    other packages.

  • Replaces sprokit_private_header_group with kwiver equivalent.

  • Remove unused Sprokit CMake support.

Vital

  • Added new class to format config block to a stream and deprecated
    print method in config_block class. Config block formatter provides
    methods to produce different format outputs. Config block
    formatting can be extended with plugins.

  • Added the data_serializer base algorithm to support serialization
    of Vital types for distributed processing and other uses.

Vital Bindings

  • Added python bindings for timestamp class.

Arrows: Core

  • Added support for RPC cameras to the triangulate_landmark implementation.
  • Added a function to render a depth map of a mesh from a perspective camera.

Arrows: FFmpeg

  • Created a new FFmpeg arrow with a video_input algorithm implementation.
    This provides an alternative to the vidl_ffmpeg_video_input in the VXL
    arrow. The goal is to provide direct access to FFMPEG without requiring
    VXL and to improve efficiency, especially with video seeking. Currently
    this implementation is not full featured and does not yet provide a
    complete replacement for the VXL implementation.

Arrows: GDAL

  • Created a new GDAL arrow with an image_io algorithm implementation.
    This allows opening images with GDAL, which is especially useful for
    Geospatial image formats like GeoTIFF and NITF.

Arrows: Serialization

  • Added JSON Serializers for:

    • bounding_box
    • detected_object (partial)
    • detected_object_set (partial)
    • detected_object_type
  • Added Protocol Buffer Serializers for:

    • bounding_box
    • detected_object (partial)
    • detected_object_set (partial)
    • detected_object_type

Sprokit: Processes

  • Added serializer_process and deserializer_process that convert from/to
    serialized byte strings and Sprokit data ports.

  • Added zmq_transport_send_process and zmq_transport_recieve process to support
    Publish/Subscribe distributed processing with ZeroMQ.

Bug Fixes

  • Fixed a problem where ports that were not supplied data in the
    input_adapter_process were incorrectly reported.

  • Fix and issue in the feature_detect_extract_SURF arrow. The arrow was using a dynamicCast
    which causes a segmentation fault on the Mac. On the Mac, symbols exported from an image loaded
    with RTLD_GLOBAL mode are not available to other images unless built with -flat_namespace.

  • Fixed issue with loading logger plugins on Windows due to a semicolon
    that gets appended to environment variables

KWIVER Release v1.2.0

30 Jul 14:29
b8872c3
Compare
Choose a tag to compare

Release Summary

This is a minor release of KWIVER that provides both new functionality and
fixes over the previous v1.1.1 release. There are also a significant number
of quality of life updates, as well as minor restructuring updates that are
included in this release. The primary changes in this release are to Vital,
Arrows: Core, and Sprokit.

Vital, the core framework of KWIVER, has been updated in several ways in
this release. There is an assortment of new algorithms, functions, and types
added in this release. Most are in support of a basic object tracker, including
readers/writers, matrix-based associate detections to track process, a generic
track initializer, and others. However, there is also a new abstract algorithm
called integrate_depth_maps for the integration of depth map images to implicit
surface volume. This release also includes expansions to the video_input API to
include a seek_frame() and frame_time() methods.

Arrows: Core has received a batch of updates in this release. New features include
a special feature tracker that augments keyframes with additional detections, new
keyframe selection classes, new loop closure algorithm, and more. In addition, there
is general restructuring of track merging and descriptions() from some
implementations had been removed.

Sprokit has also received a batch of updates in this release. Most of the updates
to Sprokit are in the area of managing processes. Process instrumentation calls
have been added to all processes, this allows the ability to monitor the activity
of processes on a per-process basis. There are new Sprokit processes corresponding
to the feature tracker and keyframe selection vital algorithms. As well as an
added detect_feature_if_keyframe process that calls the new augment features tracker and
also merges tracks.

KWIVER can now be built by utilizing Docker. There is a Dockerfile included in
/docker/ for this purpose. Optionally, it can be built by utilizing the dockersetup.sh
script in /docker/. This script automatically builds and configures the provided KWIVER
Docker container.

There are many other changes in this release. These are detailed in the change log below.

Updates since v1.1.1

Vital

  • C++11 feature test macros have been removed. The current version of KWIVER
    assumes a fully C++11 compliant compiler; C++11 features should be used
    directly. VITAL_FOREACH (and the header vital_foreach.h which provided
    this), has also been removed. Remaining compatibility shims are deprecated
    and should not be used in new code and will eventually be removed also.
    Note also that [[noreturn]] must appear before _EXPORT; this was not
    the case with the old definition of VITAL_NO_RETURN.

  • Added a small range utilities library. This implements a small subset of
    range adapters inspired by the upcoming Ranges TS.

  • Added new data types geo_point and geo_polygon for representing points
    and polygons in geographic coordinates. These new types use the new
    geodetic conversion function and know how to convert themselves into
    different coordinate systems. These replace the old geo_UTM, geo_lat_lon
    and geo_corner_points types.

  • The geo_map algorithm has been replaced with a new non-algorithm mechanism
    for geodetic conversion. The new approach uses member functions on the new
    geodetic types to request conversions in combination with a conversion
    algorithm that must be provided and registered by a suitable plugin (e.g.
    the PROJ.4 arrow). Registration is automatic when the plugin is loaded,
    with a mechanism in place for users to register their own algorithm if
    desired. The new API is also more general and supports arbitrary datums,
    not just WGS84.

  • Generalized the track and track_state types to be useful for both feature
    and object tracks. Data that is specific to features or objects is now
    stored in subclasses of track_state.

  • Generalized the track_set to be useful for both feature and object tracks.
    Added derived classes for feature_track_set and object_track_set to
    indicate the type of tracks in the set and provide specialized helper
    functions. Algorithm APIs previously using track_set now use either
    feature_track_set or object_track_set.

  • The track_set class now has a separate implementation class named
    track_set_implementation. Using a bridge design pattern this allows
    any combination of implementations and derived track_set types. Custom
    track_set implementations allow alternative storage and query mechanisms
    for better scalability and speed under different use cases.

  • The track_set is now a mutable class and has new member functions including
    'insert', 'remove', and 'merge_tracks' to allow in place modification.
    The intent is that most algorithms will now modify a track_set in place
    and return it rather than creating a new track_set from the tracks. This
    is important for a track_set because it is often a very large structure
    and may now have backend implementations with bookkeeping that we would
    like to persist.

  • Track states now have a pointer (std::weak_ptr) back to the track object
    which contains them. This means that each track state can belong to at
    most one track, and tracks and track states must now be created and
    referenced only via shared_ptr. Constructors for track are now protected
    and "make()" static member is used for construction. A "clone()" function
    is now used for track copy construction.

  • Array descriptors are now iterable (have begin/end methods), allowing them
    to be used in standard algorithms, range-based for, etc.

  • Detected object classifications (detected_object_type) are now iterable
    (have begin/end methods), allowing them to be used in standard algorithms,
    range-based for, etc. This provides a much more efficient mechanism for
    visiting all classifications.

  • Improved plugin explorer so it is easier to get information about
    processes and algorithms. Typical usage for locating processes would
    be to enter the following command to find which processes have to
    do with reading.

    $ plugin_explorer --proc read

    Then enter the following command when the specific process has been
    identified to get a detailed output about the process.

    $ plugin_explorer --proc image_file_reader -d

  • Added macros to access low level datum objects using port traits.

  • Select operations on detected_object_set now return the selected
    subset as a new detected_object_set.

  • Detected object set is iterable. begin() and end() methods have
    been added in place of returning the vector of detections. This
    allows iteration over arbitrarily large detection sets. Also
    simplifies the select methods that now return a detected_object_set
    rather than a vector of detections.

  • Added method to return a vector of values from a single config
    entry. The method is templated on the vector element type.

  • Added at() method to detected_object_set to provide bounds checked
    direct indexing.

  • Added process properties that are bound to the process
    object. Process properties were created based on the process class
    hierarchy, where the derived process would create the set of
    properties. There are cases where the derived process does not know
    all the properties, such as when process instrumentation is
    enabled. The solution is to add a set of properties that is part of
    the process object that can accumulate these condition based
    properties. Properties from the derived class are merged with the
    fixed set of properties when the set of properties is requested.

  • The video_metadata library has been removed by refactoring its contents
    into other parts of Vital. The video_metadata type has moved into
    vital/types and was renamed to "metadata". The file I/O functions have
    moved into vital/io, and the KLV conversion functions have moved into
    vital/klv.

  • Refactor timestamp types for time and frame number. Standardized on
    the base kwiver::vital types for frame_id and time. Renamed time_t
    to time_us_t to provide some distance from std::time_t and make the
    units apparent.

  • Added frame_time() method to video_input to access the current time stamp.

  • Expanded video_input API to include a seek_frame() method which will seek
    the video source to specific frame and a seekable() method which returns
    true if the video source supports frame seeking. This allows
    implementations to support seeking to a specific frame if possible.

  • Added a new abstract algorithm, integrate_depth_maps, for the integration
    of depth map images into an implicit surface volume using truncated signed
    distance functions (TSDF) or similar approaches.

  • Added clone() functions to the track_set and the class that it contains
    to allow deep copies of track sets.

  • Added a track_set_frame_data class to store frame-level data along side
    the tracks. The feature_track_set uses this to mark frames as key frames.

  • Added an assortment of types and algorithms in support of a basic object
    tracker, including readers/writers, a matrix-based associate detections to
    tracks process, a generic track initializer, and others.

Vital Bindings

  • Vital C and Python bindings have been updated with respect the refactoring
    of tracks and track_sets to account for both feature and object tracks.

Arrows: Core

  • Added a new frame-indexed track_set_implementation. When used in place of
    the default track_set_implementation this implementation will cache a mapping
    from frame number to the set of track states on that frame. This makes it
    substantially faster to query tracks by frame ID...
Read more