dlib Changelog

What's new in dlib 18.18

Feb 10, 2016
  • New Features:
  • Added the set_ptrm() routine for assigning dlib::matrix objects to arbitrary memory blocks.
  • Bug fixes:
  • Fixed a bug that caused cmake to not provide the correct preprocessor definitions until cmake was run twice. This was causing some projects to not build properly.
  • Improvements to build system:
  • Ehsan Azarnasab contributed a setup.py so the dlib Python API can be installed via the usual 'python setup.py install' command.
  • Séverin Lemaignan upgraded dlib's CMake scripts so they include an install target. Now dlib can be installed system wide by executing 'cmake PATH_TO_DLIB; make install'. This also includes installing the appropriate scripts for CMake's find_package(dlib) to work.

New in dlib 18.17 (Aug 19, 2015)

  • New Features:
  • More clustering tools:
  • Added bottom_up_cluster() and find_clusters_using_angular_kmeans() routines.
  • Added a --cluster option to the imglab tool. This lets you cluster objects into groups of similar appearance/pose.
  • Improved the shape_predictor. In particular, it can now be learned from datasets where some landmarks are missing. The shape_predictor also now outputs a sparse feature vector that encodes which leafs are used on each tree to make a prediction.
  • Non-Backwards Compatible Changes:
  • extract_highdim_face_lbp_descriptors() produces slightly different output.
  • Bug fixes:
  • Fixed a minor bug in extract_highdim_face_lbp_descriptors() which was pointed out by Yan Xu. One of the face locations was mistakenly used twice while another was skipped. This change breaks backwards compatibility with the previous feature extraction output but should slightly improve accuracy of classifiers trained using these features.
  • Fixed jet() and heatmap() so they work on empty images.
  • The SQLite transaction object did not function correctly when compiled in a C++11 program. Since its destructor can throw, an exception specification needed to be added indicating that this was possible since destructors are now noexcept by default in C++11.
  • Fixed a bug pointed out by Ernesto Tapia that could cause matrix expressions that involve sub matrix views (e.g. colm) to produce the wrong results when the BLAS bindings were enabled.
  • Added an if to avoid a possible division by zero inside spectral_cluster().
  • Fixed a bug in parse_xml(). It failed to check if the given input stream was valid before trying to parse it.

New in dlib 18.15 (Apr 30, 2015)

  • NEW FEATURES:
  • Added a number of tools for working with 3D data:
  • Added the perspective_window which is a tool for displaying 3D point clouds.
  • Added camera_transform. It performs the 3D to 2D mapping needed to visualize 3D
  • data.
  • Added point_transform_affine3d as well as functions for creating such transforms:
  • rotate_around_x(), rotate_around_y(), rotate_around_z(), and translate_point().
  • Added draw_solid_circle() for drawing on images.
  • Added get_best_hough_point() to the hough_transform.
  • Thanks to Jack Culpepper, the python API for object detection now outputs detection
  • confidences.
  • Added lspi, an implementation of the least-squares policy iteration algorithm.
  • NON-BACKWARDS COMPATIBLE CHANGES:
  • The shape_predictor and shape_predictor_trainer had a non-optimal behavior when used
  • with objects that have non-square bounding boxes. This has been fixed but will cause
  • models that were trained with the previous version of dlib to not work as accurately if
  • they used non-square boxes. So you might have to retrain your models when updating dlib.
  • BUG FIXES:
  • Fixed a bug which prevented add_image_rotations() from compiling.
  • OTHER:
  • The imglab tool now allows the user to click and drag annotations around by holding
  • shift and right clicking.

New in dlib 18.14 (Mar 2, 2015)

  • New Features:
  • Added spectral_cluster()
  • Added sub_image() and sub_image_proxy
  • Added set_all_logging_headers()
  • Non-Backwards Compatible Changes:
  • Bug fixes:
  • Fixed a bug that caused the correlation_tracker to erroneously trigger an assert when run in debug mode.
  • Other:
  • Improved the usability of the new drectanle object.
  • Optimized extract_fhog_features() for the case where cell_size==1. This makes it about 4x faster in that case.
  • Made it so you can compose point transform objects via operator *.

New in dlib 18.13 (Feb 4, 2015)

  • New Features:
  • IAdded the correlation_tracker object
  • Added the option to force the last weight to 1 to structural_assignment_trainer.
  • Added max_point_interpolated()
  • Added the drectangle object
  • New Python Tools:
  • Patrick Snape contributed a Python binding for the face landmarking tool and the general purpose shape prediction/training tools.
  • Vinh Khuc contributed a Python binding for find_candidate_object_locations(), dlib's implementation of the selective search object location proposal method.
  • Non-Backwards Compatible Changes:
  • Bug fixes:
  • Fixed a bug in extract_image_chips() and get_mapping_to_chip() that caused incorrect outputs when the requested chip stretched the image unevenly vertically or horizontally.
  • Made CMake check that libpng and libjpeg actually contain the link symbols they are supposed to since, on some systems, these libraries aren't installed correctly and will cause linker errors if used.
  • Fixed assign_border_pixels(img, rect) so that it correctly zeros an image when an empty rectangle is supplied. Previously, it did nothing to the image in this case.
  • Fixed compute_lda_transform() so it works properly when the class covariance matrices are singular even after performing PCA.
  • Fixed a bug in find_similarity_transform(). When given just two points as inputs it would sometimes produce a reflection rather than a similarity transform.
  • Disabled all bindings to FFTW because FFTW isn't threadsafe.
  • Other:
  • Added an example program for dlib's SQLite API and made a few minor usability improvements to the API as well.

New in dlib 18.12 (Dec 30, 2014)

  • New Features:
  • Upgraded fft() and ifft() to support 2D matrices.
  • Added hough_transform
  • Added skeleton() for finding the skeletonization of a binary image.
  • Added distance_to_line(), clip_line_to_rectangle(), min_point(), and max_point().
  • Added a simple API for calling C++ from MATLAB.
  • Bug fixes:
  • Fixed a compile time error that could happen when calling fft() for certain input types.
  • Fixed a compile time error that prevented auto_threshold_image() from being used.
  • Fixed name clashes with new version of Boost.
  • Changed Python pickling code so it works with Python 3.
  • Fixed CMake compile time error related to finding fftw.
  • Other:
  • Made extract_image_chips() much faster when extracting unscaled image chips.

New in dlib 18.11 (Nov 14, 2014)

  • New Features:
  • AAdded save_jpeg()
  • Added the option to use an identity matrix prior to vector_normalizer_frobmetric.
  • Made the extract_image_chips() routine more flexible, in particular: Added get_mapping_to_chip(), get_face_chip_details(), map_det_to_chip(), and also upgraded chip_details so you can specify a chip extraction by a bunch of point correspondences between the chip and the original image.
  • Added a set of local-binary-pattern based feature extractors: make_uniform_lbp_image(), extract_histogram_descriptors(), extract_uniform_lbp_descriptors(), and extract_highdim_face_lbp_descriptors()
  • Added compute_lda_transform()
  • Added equal_error_rate()
  • Added cast_to() to the type_safe_union. This allows you to get the contents of a const type_safe_union.
  • Bug fixes:
  • Changed noncopyable.h to avoid a name clash with boost 1.56
  • On some platforms hostname_to_ip() would erroneously return 0.0.0.0. This has been fixed.

New in dlib 18.10 (Aug 29, 2014)

  • New Features:
  • Added find_similarity_transform()
  • Added the ability to upgrade a auto_mutex_readonly from a readonly lock to a write lock.
  • Added an implementation of the paper "One Millisecond Face Alignment with an Ensemble of Regression Trees" by Vahid Kazemi and Josephine Sullivan which appeared in this year's CVPR conference. Therefore, dlib now includes tools for learning shape models and also comes with a state-of-the-art face landmark locator. See the face_landmark_detection_ex.cpp and train_shape_predictor_ex.cpp example programs for an introduction.
  • Non-Backwards Compatible Changes:
  • Made the interface to all the image processing routines more generic. In particular, it is now easier to use arbitrary image types with dlib. The new generic image interface is defined in dlib/image_processing/generic_image.h and simply consists of seven user defined global functions and a traits template. Any user code that was using array2d objects to represent images will still work. However, if you had been using your own custom image object you will need to provide implementations of the seven functions. Instructions for how to do this are in dlib/image_processing/generic_image.h.
  • Bug fixes:
  • Changed the murmur hash implementation to avoid any possibility of strict aliasing violations in user code, even when things get inlined in unfavorable ways.
  • Fixed a color space handling bug in resize_image() that caused bad looking outputs in some cases.
  • If "cmake" was a substring of the full path to your source code folder then the cmake scripts would fail. This has been fixed.
  • Fixed a compile time error that could occur when using find_max_single_variable().
  • Other:
  • load_image() now uses the internal file header information to detect the image format rather than looking at the file extension.
  • Renamed unit test program to dtest avoid warnings from CMake.
  • cross_validate_trainer() and cross_validate_trainer_threaded() no loner make copies of the training data. This significantly reduces their RAM usage for large datasets.
  • Changed the serialization code for C-strings so that they don't save the null terminator byte. This makes their serialization format the same as the format for std::string. The code should still be able to read all previously serialized data correctly, so the change is backwards compatible with previous versions of dlib.
  • Changed the evaluate_detectors() routine so that it applies non-max suppression to each detector individually. This way one detector doesn't stomp on the output of another detector.
  • Made the version of draw_line() that draws onto a regular image use alpha blending for drawing diagonal lines.

New in dlib 18.8 (Jun 3, 2014)

  • New Features:
  • Added the ability to set a previously trained function as a prior to the svm_multiclass_linear_trainer, svm_c_linear_trainer, and svm_rank_trainer objects.
  • Added a user settable loss to the structural_assignment_trainer and structural_track_association_trainer objects.
  • Added evaluate_detectors(), a function for efficiently running multiple fHOG based object detectors.
  • Added the new split_on_first() and split_on_last() string manipulation functions.
  • Added locally_change_current_dir, a RAII tool for switching between directories.
  • You can now make a 1x1 matrix containing a single value by calling mat() on a single scalar value.
  • The point transform functions and frobmetric_training_sample are now serializable.
  • Added a simplified operator > based syntax for serializing to and from files. So now you can serialize to a file using a syntax of: serialize("myfile.dat") myobject >> another_object; An arbitrary number of objects can be serialized or deserialized by chaining the > operators.
  • Bug fixes:
  • Fixed a bug pointed out by Daniel Girardeau-Montaut. The covariance() function didn't work on non-double valued matrices.
  • Fixed a bug in the backtracking_line_search() function pointed out by Ping-Chang Shih. The function ignored the max_iter parameter.
  • Fixed a compiler error encountered when using clang 3.4 on Mac OS X 10.9. Thanks to Martin Fergie for reporting this problem.
  • Fixed a potential divide by zero in draw_fhog()
  • Other:
  • Added an example program showing how to set a custom logger output hook.
  • Made linear decision_functions which use sparse vectors much faster.

New in dlib 18.7 (Apr 11, 2014)

  • New Features:
  • Added a Python API for working with fHOG based object detectors.
  • Added the ability to use a user supplied fHOG style feature extractor with the scan_fhog_pyramid object. So now you can define your own version of HOG for use with these tools.
  • The oca solver now supports taking a user supplied prior vector. That is, it lets you use a regularizer like ||w-prior||^2 instead of the usual ||w||^2 regularizer.
  • Added the structural_track_association_trainer object. It is a structural SVM tool for creating multi-target tracking algorithms. See the learning_to_track_ex.cpp example program for an introduction.
  • Added the following minor utility functions: nearest_center(), add_image_rotations(), set_aspect_ratio(), and tile_images().
  • Non-Backwards Compatible Changes:
  • Refactored the load_image_dataset() routines so they are easier to use and more flexible. This introduces a slight backwards incompatibility in that the version that loads full_object_detection objects now returns an ignore rectangle set instead of a parts name list. Other than that the changes are backwards compatible with previous versions of dlib.
  • Added a bias term to the assignment_function's model so the user doesn't need to remember, or even understand, that they should add it themselves. However, this change breaks backwards compatibility with the previous serialization format for assignment_function objects.
  • Bug fixes:
  • Fixed a number of compile time errors that could occur in rare cases.
  • The stopping condition for the svr_linear_trainer was too tight, causing it to take an excessive amount of time to converge in some cases.
  • Disabled use of XIM for X11 windowing since it makes programs hang on some systems. However, this means the wide character input methods won't work on X11 systems anymore.
  • Fixed a bug in randomize_samples() which caused the outputs to be not as random as they should be.
  • Fixed dlib's CMakeLists.txt file so that the "use FFTW" option actually causes the build to use FFTW.
  • Fixed a compile time error that triggered when trying to link with FFTW.
  • mat() did not work correctly when used with std::vector objects. This has been fixed.

New in dlib 18.4 (Aug 29, 2013)

  • New Features:
  • Added Python interfaces to dlib's structural support vector machine solver and Hungarian algorithm implementation.
  • Added running_cross_covariance
  • Added order_by_descending_distance()
  • Added is_finite()
  • Added the csv IO manipulator that lets you print a matrix in comma separated value
  • format.
  • Non-Backwards Compatible Changes:
  • Changed the object detector testing functions to output average precision instead of
  • mean average precision.
  • Added an option to weight the features from a hashed_feature_image relative to the
  • number of times they occur in an image. I also made it the default behavior to use
  • this relative weighting and changed the serialization format to accommodate this.
  • Bug fixes:
  • Fixed typo in learn_platt_scaling(). The method wasn't using the exact prior
  • suggested by Platt's paper.
  • Fixed a bug in running_scalar_covariance that caused the covariance() and
  • correlation() methods to output the wrong answer if the covariance was negative.
  • Other:
  • Gave the image_window the ability to tie the mouse and keyboard events together such
  • that it is possible for a user to listen for both simultaneously.
  • A number of changes were made to the structural_svm_problem's code which make it
  • significantly faster in some cases.
  • Added Steven Van Ingelgem's patch to the HTTP server which makes operations on HTTP
  • headers case-insensitive.

New in dlib 18.3 (Jun 22, 2013)

  • New Features:
  • Machine Learning:
  • Added the svr_linear_trainer, a tool for solving large scale support vector
  • regression problems.
  • Added a tool for working with BIO and BILOU style sequence taggers/segmenters.
  • This is the new sequence_segmenter object and its associated
  • structural_sequence_segmentation_trainer object.
  • Added a python interface to some of the machine learning tools. These
  • include the svm_c_trainer, svm_c_linear_trainer, svm_rank_trainer, and
  • structural_sequence_segmentation_trainer objects as well as the cca()
  • routine.
  • Added point_transform_projective and find_projective_transform().
  • Added a function for numerically integrating arbitrary functions, this is the
  • new integrate_function_adapt_simpson() routine which was contributed by
  • Steve Taylor
  • Added jet(), a routine for coloring images with the jet color scheme.
  • Bug fixes:
  • Fixed a bug in hysteresis_threshold() that caused it to produce incorrect
  • outputs in some cases.
  • Fixed a segmentation fault in the eigenvalue_decomposition object which
  • could occur when NaN valued inputs were given.
  • Other:
  • Made image saving routines work on matrix objects in addition to array2d objects.
  • The machine learning page now contains a flow chart to help new users
  • select a machine learning tool appropriate for their task.

New in dlib 18.2 (May 31, 2013)

  • New Features:
  • Object Detection Tools:
  • Added another image scanning tool similar to scan_image_pyramid.This
  • is the new scan_image_boxes object.It allows a user to easily specify
  • an arbitrary set of object boxes which should be checked by an object
  • detector rather than scanning a fixed sized window over the image as is
  • done by the scan_image_pyramid tool.This allows more flexible scanning
  • strategies.For example, it is now possible to use the selective search
  • method implemented by the new find_candidate_object_locations() routine.
  • Added the binned_vector_feature_image.
  • Upgraded the object_detector so that you can use the adjust_threshold
  • argument for all versions of the operator() method.
  • Added remove_unobtainable_rectangles()
  • Hashing Tools:
  • Added a set of new locality sensitive hashing functions meant for use
  • with larger vectors and higher bit sizes than the current LSH tools.
  • These are the new hash_similar_angles_xxx objects.
  • Added find_k_nearest_neighbors_lsh() and hash_samples()
  • Added create_max_margin_projection_hash()
  • New Matrix Routines: linpiece(), fft(), and ifft()
  • Added numeric constants and additional statistics to the running_stats
  • object.This code was contributed by Steve Taylor.
  • Added the image_window::get_next_keypress() routine.This tool allows a
  • user to easily find out which keyboard key the user is pressing.
  • Non-Backwards Compatible Changes:
  • Changed the object_detector interface slightly.In particular, it no
  • longer adds the adjust_threshold argument to the output scores.
  • The object detector testing functions now output mean average precision in
  • addition to precision and recall.
  • Changed how dlib does serialization in a number of ways:
  • The running_stats and scan_image_pyramid objects have had their
  • serialization format changed in a way that breaks backwards
  • compatibility.This means serialized versions of these objects can't be
  • loaded by the new version of dlib.
  • Changed the format dlib uses when it serializes floating point values.
  • Previously, we used an ASCII based format.Dlib now uses a much more
  • efficient binary format. However, the deserialization routines have
  • been made backwards compatible with the previous format. So dlib can
  • still deserialize older data but older software won't be able to read
  • the new format.
  • Changed the serialization formats for the matrix and array2d objects so
  • that either object can be deserialized into the other. This was done in a
  • way that is backwards compatible with previous versions of dlib. That is,
  • we can still load data serialized by previous dlib versions. However,
  • older versions of dlib can't load the new serialization format.
  • Bug fixes:
  • Fixed a bug in save_dng() that happened sometimes when saving images with
  • unsigned char pixels.
  • The test_ranking_function() and cross_validate_ranking_trainer() routines
  • computed incorrect MAP scores when the learned function output a constant
  • value for all samples.This has been fixed.
  • Other:
  • Gave load_image_dataset() the ability to skip images that don't have any
  • ground truth boxes.
  • Changed average_precision() to use interpolated precision. So now it uses
  • the same metric as the one used by the Pascal VOC challenge.
  • Upgraded the dng image format so it can natively store floating point
  • pixel types without any information loss.

New in dlib 18.1 (Mar 26, 2013)

  • New Features:
  • Added svd_fast(), a routine for computing a singular value decomposition of very
  • large matrices.
  • Added cca(), a routine for doing canonical correlation analysis on very large
  • and high-dimensional datasets.
  • Added tools for creating parallel for loops, see parallel_for().
  • Added some features to the image display widgets to let the user easily
  • get information about where the user is clicking. This is the new
  • get_next_double_click() routine.
  • Added an operator>> for matrix objects which allows you to read in ASCII
  • matrices using the format used by operator

New in dlib 18.00 (Feb 5, 2013)

  • NEW FEATURES:
  • Machine Learning:
  • Added svm_rank_trainer, an optimized implementation of the SVM-Rank algorithm.
  • Added rank_unlabeled_training_samples(), an implementation of the SVM Active Learning algorithm.
  • Added svm_c_linear_dcd_trainer, a warm-startable SVM solver using the dual coordinate descent algorithm used by liblinear.
  • Added the ability to force the last element of a weight vector to 1 to the following objects: svm_c_linear_trainer, svm_c_linear_dcd_trainer, svm_rank_trainer, and oca.
  • Added the ability to learn non-negative weight vectors to the structural_sequence_labeling_trainer object.
  • Networking:
  • Added an iosockstream object.
  • Added a method to the server object that lets a user set the graceful close timeout time to something other than the default of 500ms.
  • Linear Algebra:
  • Added the gaussian_randm() function.
  • Added the find_affine_transform() function.
  • Added the mat() function. It combines the array_to_matrix(), vector_to_matrix(), pointer_to_column_vector(), and pointer_to_matrix() methods all into one convenient interface. mat() also works for Armadillo and Eigen matrices.
  • Added STL style begin() and end() methods to matrix and matrix_exp.
  • Added an overload of sparse_matrix_vector_multiply() that multiplies a dense matrix with a sparse vector.
  • Made toMat() work with the matrix object in addition to array2d style images.
  • Graphical User Interface Tools:
  • Added draw_solid_convex_polygon().
  • Added an overload of draw_image() that's useful for drawing images and doing interpolation at the same time.
  • Added the on_view_changed() callback to zoomable_region and scrollable_region widgets.
  • Added parse_trees_to_string() and parse_trees_to_string_tagged().
  • Added lambda function support to the timeout object.
  • Added the vectorstream object.
  • Added the parse_xml() routines.
  • Added a group name feature to the command line parser. Now it is possible to make print_options() print related options in named groups.
  • Added the following new hashing functions: murmur_hash3_128bit_3(), murmur_hash3_2(), murmur_hash3_3(), uniform_random_hash(), gaussian_random_hash() as well as hash() overloads for uint32, uint64, and std::pair.
  • NON-BACKWARDS COMPATIBLE CHANGES:
  • Made the svm_c_linear_trainer use the risk gap to decide when to stop. This was done because it is how all the other OCA based SVM tools in dlib decide when to stop. However, it might cause the outputs to be slightly different in this version of dlib.
  • It is now illegal to call unlock() on a mutex when the mutex is not owned by the calling thread. The most likely reason for doing this was to unlock early in an area locked by an auto_mutex. Old code that does this can be fixed by calling auto_mutex's unlock() function instead.
  • Removed the structural_assignment_trainer::learns_nonnegative_weights() routine and moved its functionality into the feature extraction interface used by this object.
  • BUG FIXES:
  • Fixed a bug in find_max_factor_graph_nmplp() which caused it to not work properly on some compilers.
  • Fixed a bug pointed out by Joel Nelson in the version of md5() that took an istream. The bug caused the function to crash on strings longer than 56 characters.
  • OTHER:
  • dlib now has an excellent new logo thanks to Yasser Asmi.
  • Added a new documentation page for the various linear algebra tools.
  • The following objects were turned into single implementation components: sockstreambuf, timeout, member_function_pointer, xml_parser, linker, bound_function_pointer, and timer.

New in dlib 17.49 (Dec 19, 2012)

  • New Features:
  • Machine Learning
  • Added the ability to learn non-negative weight vectors to the
  • structural_assignment_trainer object.
  • Added two new graph clustering algorithms: Chinese Whispers and Newman's modularity
  • clustering.
  • Added a number of new graph manipulation tools: sparse_matrix_vector_multiply(),
  • is_ordered_by_index(), find_neighbor_ranges(), convert_unordered_to_ordered(),
  • remove_duplicate_edges(), and the ordered_sample_pair object.
  • Networking
  • Added a set of tools for creating applications using the Bulk Synchronous Parallel
  • computing model.See the new bsp_ex.cpp example program for an introduction.
  • Added a routine that lets a user disable Nagle's algorithm on a TCP connection.
  • Added an asynchronous start routine to the server object.This is the new
  • start_async() method.
  • Added the network_address object.
  • Added connect_to() to the bridge interface.
  • Added find_max_parse_cky(), a method implementing the well known CKY algorithm for
  • parsing probabilistic context free grammars.
  • Added the ability to label parts of objects with the mouse to the image_display
  • widget.
  • Added the ability to put overlay circles and full_object_detections into the
  • image_window widget.
  • Added a stddev() for matrix objects.
  • Added operator+() for running_stats and running_scalar_covariance.
  • Added an overload of murmur_hash3_128bit() that takes 4 integers instead of a block of
  • memory.
  • Added rand::get_random_64bit_number().
  • Non-Backwards Compatible Changes:
  • Changed the image_dataset_metadata XML reading tools to use a map of strings to points
  • to represent object parts. This change removes the old head point from a box since
  • this information can now be represented in the parts map.
  • The syntax for passing order_by_distance and order_by_index to std::sort() is now
  • slightly different since these functions are now templates.However, this change
  • allows them to work on any kind of sample_pair or ordered_sample_pair object.
  • The default distance value of a sample_pair is now initialized to 1 instead of
  • infinity.
  • Bug fixes:
  • Added a patch, contributed by Martin Müllenhaupt, to fix a minor bug in the SQLite
  • bindings.
  • Fixed a typo which would prevent code that called running_stats::max_n() from
  • compiling.
  • Other:
  • Added a new documentation page for the various graph tools in dlib.
  • Added support for Visual Studio 2012.
  • Switched the sample_pair object to use double to store its distance value instead of
  • float.
  • Added William Sobel's patch to the web server that improves its flexibility and
  • security.
  • Changed the server object so you don't have to use the server::kernel_1a syntax to
  • declare it anymore.Now you just say server, server_iostream, or server_http
  • depending on which one you want.
  • Changed the cmd_line_parser so you don't have to use the ::kernel_1a syntax anymore.
  • Now it is declared like a normal single implementation object.
  • Set the default max number of connections a server will accept at a time to 1000
  • rather than the previous default of infinity.

New in dlib 17.48 (Oct 19, 2012)

  • NEW FEATURES:
  • Added more overloads of find_max_factor_graph_potts() to make applying it over a Markov random field of image pixels really simple.
  • Added overloads of serialize()/deserialize() so that they can serialize Google protocol buffer objects.
  • Image Processing:
  • Added find_points_above_thresh()
  • Added max_filter()
  • Added scan_image_movable_parts()
  • Added sum_filter_assign()
  • Added the full_object_detection object.
  • Added the ability to model objects with movable parts into the scan_image_pyramid object. This update also includes all the needed tools to train movable part models using the structural_object_detection_trainer.
  • Machine Learning:
  • Added a per node loss option to the structural_svm_graph_labeling_problem's interface.
  • Added Emanuele Cesena's implementation of Sammon's nonlinear dimensionality reduction method.
  • NON-BACKWARDS COMPATIBLE CHANGES:
  • To support movable part models, the serialization format of scan_image_pyramid objects was modified. This breaks backwards compatibility with the previous format for scan_image_pyramid objects as well as object_detector instances that use the scan_image_pyramid.
  • BUG FIXES:
  • Fixed a bug in auto_threshold_image() that caused it to give bad outputs when used with very large images.
  • OTHER:
  • Updated find_max_factor_graph_potts() to correctly say you can use infinite weights for the factor_value_disagreement() values since the code actually supports this.
  • Made integer serialization about 3 times faster.

New in dlib 17.47 (Jun 16, 2012)

  • New Stuff:
  • Improvements to linear algebra tools:
  • Added the lowerbound() and upperbound() routines for thresholding dense
  • matrices.
  • Refined the tools for working with sparse vectors. In particular,
  • the following functions were added: min(), max(), make_sparse_vector(),
  • add(), and subtract(). A number of existing routines were also updated
  • to work with both sparse and dense vectors so that templated code which
  • works on both vector types is simpler to write.
  • Added the += and -= operators to the set_subm(), set_rowm(), and set_colm()
  • tools for operating on submatrices.
  • Optimization:
  • Added a new quadratic program solver, solve_qp4_using_smo(). This new
  • solver is useful for solving quadratic programs corresponding to
  • non-negative constrained primal quadratic programs.
  • Added an optional non-negativity constraint to the oca optimizer.
  • Added the min_cut object. It provides a method to find the minimum weight
  • cut on a graph.
  • Added tools for finding the maximum probability assignment in a Potts
  • style Markov random field. See the find_max_factor_graph_potts() routine
  • for details.
  • Machine Learning:
  • Added structural SVM tools for learning the parameters of a Potts style
  • Markov random field. See the structural_graph_labeling_trainer and
  • graph_labeler objects as well as their associated example program for
  • details.
  • Added the ability to learn only non-negative weights to the
  • svm_c_linear_trainer.
  • Improved Integration with OpenCV:
  • Updated the cv_image object so it works with cv::Mat as well as IplImage.
  • Added the toMat() routine for converting from a dlib style image to an
  • OpenCV cv::Mat image.
  • Non-Backwards Compatible Changes:
  • Removed the dlib::sparse_vector namespace. Everything from this namespace
  • was moved into the normal dlib:: namespace so that code which works with
  • both sparse and dense vectors is more cohesive.
  • Bug fixes:
  • Fixed a bug in find_max_factor_graph_viterbi() which sometimes occurred when
  • the model order was larger than the number of variables.
  • Fixed a bug which caused a compiler error if you tried to call dot() on two
  • 1x1 matrices which were statically dimensioned.
  • Other:
  • Improved existing documentation: added pictures of the gui widgets,
  • added documentation of the dlib::bridge protocol, and other minor
  • usability improvements.

New in dlib 17.46 (Apr 12, 2012)

  • New Stuff:
  • Image Processing:
  • Added the option to make the features generated by the poly_imagerotationally invariant.
  • Added a set of routines for warping, scaling, and resizing images.
  • See the new "Scaling and Rotating" section of the image processingdocumentation for details.
  • Added the heatmap() routine for converting an image into a heatmap.
  • Machine Learning
  • Updated the sequence labeling trainer to allow the user to set different loss values for different labels.
  • Added the rls object.It is an implementation of the linear recursive least squares algorithm.
  • Added the get_option() routines which slightly simplify option parsing from the command line and config files.
  • Added the 128bit version of Murmur hash.
  • Added the rls_filter and kalman_filter objects.These are tools for performing Kalman filtering and recursive least squares filtering.
  • Added the circular_buffer object.
  • Non-Backwards Compatible Changes:
  • The poly_image generates slightly different features in this new release.
  • Therefore, classifiers trained using the previous version will need to be retrained if they are switched to the new version of poly_image.
  • Changed the xcorr() functions so they take the complex conjugate of the right hand arguments if they are complex numbers.This way they do a proper cross-correlation and also mirror the behavior of MATLAB.However, this breaks backwards compatibility with the previous behavior of xcorr().
  • Previously, dlib included two versions of dlib::array.However, to simplify the user interface, dlib now includes only the contiguous memory implementation of dlib::array.This change should only affect you if you wrote code which assumed dlib::array::set_max_size() only allocated a small amount of RAM.The new behavior is similar to the std::vector::reserve() routine.That is, dlib::array::set_max_size() will allocate the requested amount of memory immediately.
  • Bug fixes:
  • Fixed a bug which caused certain matrix expressions to not compile when the BLAS bindings were enabled.In particular, expressions which involved a 1x1 matrix sometimes didn't compile.
  • Other:
  • Made the matrix routines min(), max(), sum() and mean() work with complex numbers.
  • Turned the array object into a single implementation object.Now arrays can be created using the normal array obj; syntax.Additionally, all extensions were merged into the array object.

New in dlib 17.45 (Feb 3, 2012)

  • New Stuff:
  • Added tools for timing blocks of code
  • Machine Learning
  • Added a set of tools for learning to solve the assignment problem.
  • See the structural_assignment_trainer and its associated example
  • program for an introduction.
  • Added random projection based locality sensitive hashing tools.
  • Added tools to simplify the creation of scan_image_pyramid objects.
  • See the object_detector_ex.cpp example program for details.
  • Image Processing
  • Added sum_filter() and spatially_filter_image_separable_down()
  • New feature extractors: poly_image, nearest_neighbor_feature_image, and
  • fine_hog_image
  • Non-Backwards Compatible Changes:
  • Changed the serialization format for rand objects.
  • Changed the order of arguments for the sequence_labeler's constructor.
  • Object Detection Changes
  • Some parts of the object detection tools have been refactored.In particular,
  • the interfaces of the scan_image_pyramid and structural_object_detection_trainer
  • have been changed slightly to improve usability.
  • Made the test_box_overlap a little more flexible.This change breaks
  • backwards compatibility with the previous version though.
  • The hashed_feature_image object has been made more general.It now
  • uses a user supplied hashing function rather than its own hashing
  • implementation.
  • Removed constness from the operator() member functions of the
  • object_detector.
  • Fixed improper normalization in the gaussian() functions.The
  • normalization constant was being computed incorrectly.
  • Sequence labeling feature extractors must now define a sequence_type
  • typedef instead of sample_type.This change allows the user to use any
  • type of sequence, not just std::vector objects.
  • Bug fixes:
  • Changed the add_probability() method of joint_probability_table so
  • it does a saturating add rather than a normal add.This ensures the
  • probability value stays exactly

New in dlib 17.44 (Nov 22, 2011)

  • New Stuff:
  • Machine Learning
  • Added the histogram intersection kernel for sparse and dense vectors.
  • Added a set of tools to allow a user to easily learn to do sequence
  • labeling using dlib's structural SVM implementation. See the new
  • sequence_labeler object and its associated example program for an
  • introduction.
  • Image processing:
  • Added segment_image()
  • Added randomly_color_image()
  • Added the border_enumerator
  • Added the disjoint_subsets object, it is an implementation of the
  • union-find algorithm/disjoint-set data structure.
  • Added new matrix routines: conv(), conv_same(), conv_valid(), xcorr(),
  • xcorr_same(), xcorr_valid(), and flip().
  • Non-Backwards Compatible Changes:
  • Changed find_max_factor_graph_viterbi() so you can use run-time
  • defined order and num_states parameters.
  • Bug fixes:
  • The last dlib release added a max_iterations parameter to the
  • svm_c_linear_trainer and svm_c_ekm_trainer objects. However,
  • there was a bug which made them only do at most 16 iterations,
  • which is too few to solve many problems. This has been fixed.
  • Fixed a bug in is_const_type. It didn't work for reference types.
  • Fixed a bug in the SQLite binding routine statement::get_column_as_text().
  • It didn't work correctly if the column contained a NULL.
  • Fixed a bug in find_max_factor_graph_viterbi() which occurred when a
  • zero order model had negative factor values.

New in dlib 17.43 (Oct 22, 2011)

  • New Stuff:
  • Two new routines for performing MAP inference in factor graphs:
  • For chain-structured graphs: find_max_factor_graph_viterbi()
  • For general graphs: find_max_factor_graph_nmplp()
  • Image Processing
  • Added more tools for creating image pyramids.See pyramid_down_5_4,
  • pyramid_down_4_3, and pyramid_down_3_2.
  • Added more image filtering and morphology functions.
  • Added a set of tools for creating sliding window classifiers:
  • Added the scan_image() routine.It is a tool for sliding a set of
  • rectangles over an image space and finding the locations where the sum
  • of pixels in the rectangles exceeds a threshold.Also added
  • scan_image_pyramid, which is a tool for running scan_image() over an
  • image pyramid.
  • Added the structural_object_detection_trainer.This is a tool which
  • formulates the sliding window classifier learning problem as an
  • instance of structural SVM learning.
  • Added a variety of supporting tools and two object detection example
  • programs.
  • Added the following functions for computing statistics on vectors:
  • mean_sign_agreement(), correlation(), covariance(), r_squared(),
  • and mean_squared_error()
  • Added a C++ wrapper for SQLite (see the new database and statement objects)
  • Non-Backwards Compatible Changes:
  • Changed the interface to the ridge regression trainer objects so that they
  • report the entire set of leave-one-out prediction values rather than a
  • summary statistic like mean squared error.
  • Changed the serialization routine for bgr_pixels to store the pixels in BGR
  • order rather than RGB.
  • Changed the interface for the spatially_filter_image() routine to take the
  • filter as a matrix rather than C-array.Also, now it won't force signed pixel
  • values to 0 if they go negative.
  • Changed the test_regression_function() and cross_validate_regression_trainer()
  • routines so they return both the MSE and R-squared values rather than just the
  • MSE.
  • Changed suppress_non_maximum_edges() to use the L2 norm instead of L1 norm
  • for measuring the strength of an edge since this produces a slightly better
  • result.
  • Bug fixes:
  • The image_display didn't display overlay rectangles quite right.If you zoomed
  • in you could see that some of the pixels which are inside the rectangle were
  • outside the overlay.Specifically, the right column and bottom row was outside
  • the overlay rectangle.This has been fixed.Now all pixels which are supposed
  • to be part of a rectangle are drawn as being inside the overlay rectangle.
  • Fixed a bug pointed out by Martin Müllenhaupt which caused the windows socket
  • code to not compile when used with the mingw-cross-env project.
  • Fixed a bug in the png_loader.If you loaded an image with an alpha channel
  • into something without an alpha channel there were uninitialized values being
  • alpha blended into the image.
  • Fixed a bug in the cpp_tokenizer that only shows up on newer versions of gcc.
  • It wasn't tokenizing double quoted strings right.
  • Fixed a bug in spatially_filter_image() which showed up when using non-square
  • filters.The bug would cause the edges of the output image to be incorrect.
  • Fixed a bug in the matrix class.Expressions of the form mat *= mat(0) would
  • evaluate incorrectly because the *= operator took the right hand side by reference
  • and thus experienced an aliasing problem.The other op= operators had similar
  • problems and have also been fixed.
  • Fixed a bug pointed out by Justin Solomon which could cause the svr_trainer and
  • svm_c_trainer to produce incorrect results in certain unusual cases.
  • Other:
  • Added a more complete set of methods for converting between image space and
  • the downsampled hog grid used by hog_image.Now you can convert from image
  • to hog in addition to hog to image.
  • Made the integral_image more general by making it templated on the type of
  • scalar used to store the sums.

New in dlib 17.42 (Jun 25, 2011)

  • New Stuff:
  • Added the check_sub_option() method to the command line parser check
  • object.
  • Added match_endings to the dir_nav utils.
  • Added a set_current_dir() function.
  • Added the distance_to_rect_edge() routine.
  • Added support for user drawn rectangle overlays and selectable overlays
  • to the image_display widget.
  • Non-Backwards Compatible Changes:
  • Bug fixes:
  • Fixed a bug in the image_display widget. If you switched it between
  • images of a different size while any kind of zoom was in effect
  • it could cause a segmentation fault.

New in dlib 17.41 (Jun 13, 2011)

  • New Stuff:
  • You can now add tasks to a thread_pool by value, using the new add_task_by_value() method. Non-Backwards Compatible Changes:
  • Bug fixes:
  • Fixed a bug which caused multiply defined symbol errors during linking if the PNG saving routine was #included.
  • Other:
  • Optimized the threaded and distributed structural svm solvers for the case where there are many data samples and the separation oracle is quick to evaluate.

New in dlib 17.40 (Jun 6, 2011)

  • New Stuff:
  • Added a function for saving to the PNG image format.
  • Added Austin Appleby's excellent MurmurHash3 hashing code and setup some
  • additional convenience functions. These functions are murmur_hash3() and
  • various overloads of hash().
  • Non-Backwards Compatible Changes:
  • Made get_pixel_intensity() more efficient. However, the value returned
  • is slightly different than it used to be for RGB pixel types.
  • Bug fixes:
  • Setup proper error handling for libpng in the png_loader. Now if the PNG
  • file is corrupted in the middle it won't just print a message and abort
  • the program.
  • Fixed a bug in assign_pixel_intensity() that happened when the target pixel
  • was an RGB pixel with an alpha channel.
  • Other:
  • Added a Frequently Asked Questions page
  • Changed the array2d object so you don't have to say array2d::kernel_1a
  • anymore to declare it. Now you just say array2d.

New in dlib 17.39 (May 23, 2011)

  • New Stuff:
  • Added tools for distributing the work involved in solving a structured SVM problem over many computers and CPUs.
  • Added the bridge. It allows a dlib::pipe to be used for networked communication.
  • Non-Backwards Compatible Changes:
  • Removed the DLIB_REVISION macro and replaced it with DLIB_MAJOR_VERSION and DLIB_MINOR_VERSION.
  • Other:
  • dlib's version control system has switched from Subversion to Mercurial.

New in dlib 17.38 (May 8, 2011)

  • New Stuff:
  • Added the max_sum_submatrix() function to the optimization tools.
  • Upgraded the pyramid_down function object so it can create color pyramids.
  • Also, added some functions which define the coordinate transforms between
  • different layers in an image pyramid.
  • Non-Backwards Compatible Changes:
  • Changed the oca_problem interface to the oca optimizer. Now the
  • optimization_status() function reports back the current risk and risk gap
  • in addition to the overall objective value and objective gap.
  • Changed the stopping condition for the structured svm to the one suggested
  • by the Joachims paper. Now it stops when the risk gap is below a user
  • supplied epsilon.
  • Bug fixes:
  • Other:
  • Various usability improvements.
  • Improved the feature vector caching in the structural_svm_problem object.
  • Some objects were setup as multi-implementation objects but only had one
  • implementation. I went through dlib and switched these to single implementation
  • objects. So for example, to use the dlib crc32 module you used to declare an
  • object of type "crc32::kernel_1a" but now you can just say "crc32". Note that
  • I did this change in a way that maintains backwards compatibility with previous
  • versions. So crc32::kernel_1a is still allowed but that form is officially
  • deprecated. The modified objects are as follows:
  • base64
  • byte_orderer
  • config_reader
  • crc32
  • pipe
  • rand

New in dlib 17.37 (Mar 25, 2011)

  • New Stuff:
  • Added a multiclass support vector machine.
  • Added a tool for solving the optimization problem associated with
  • structural support vector machines.
  • Added new functions for dealing with sparse vectors: add_to(),
  • subtract_from(), max_index_plus_one(), fix_nonzero_indexing(), a
  • more flexible dot(), and I renamed assign_dense_to_sparse() to assign()
  • and made it more flexible.
  • Non-Backwards Compatible Changes:
  • Renamed max_index_value_plus_one() (a function for working with graphs) to
  • max_index_plus_one() so that it uses the same name as the essentially
  • identical function for working with sparse vectors.
  • I simplified the cross_validate_multiclass_trainer(), cross_validate_trainer(),
  • test_binary_decision_function(), and test_multiclass_decision_function()
  • routines. They now always return double matrices regardless of any other
  • consideration. This only breaks previous code if you had been assigning
  • the result into a float or long double matrix.
  • Renamed assign_dense_to_sparse() to assign()
  • Bug fixes:
  • Fixed a bug in load_libsvm_formatted_data(). I had forgotten to clear the
  • contents of the labels output vector before adding the loaded label data.
  • Fixed a bug in the kernel_matrix() function. It didn't compile when used
  • with sparse samples which were of type std::vector.
  • Moreover, some of the trainers have a dependency on kernel_matrix() so this
  • fix makes those trainers also work with this kind of sparse sample.
  • Other:
  • Added a value_type typedef to matrix_exp so it's easier to write templates
  • which operate on STL containers and matrix objects.

New in dlib 17.35 (Feb 11, 2011)

  • New Stuff:
  • Added the rr_trainer. It is a version of krr_trainer which is optimized
  • for use with the linear_kernel.
  • Added the approximate_distance_function() routine. It is the core optimizer
  • behind the reduced2() trainer adapter.
  • Added an any_function which supports the same functionality as std::function
  • from the upcoming C++0x standard. I added this so dlib can be modified to
  • easily support lambda functions while still being compilable with compilers
  • which don't support the new std::function.
  • Added overloads of all the GUI event handlers so you can use general functions
  • as callbacks (via any_function). This way, if you have a C++0x compiler, you
  • can use lambda functions with the event handlers.
  • Added the split() function for splitting up strings.
  • Non-Backwards Compatible Changes:
  • Improved the distance_function object by turning it into a properly
  • encapsulated class rather than just a simple struct. I also added
  • overloaded +, -, *, and / operators for this object so you can do the
  • kind of arithmetic you would expect on an object which represents a
  • point in a vector space. This breaks backwards compatibility with
  • the previous interface though as the member variables are now private.
  • Bug fixes:
  • Fixed a compile-time error in the kernel_matrix().
  • Fixed a bug in an assert in the spatially_filter_image() function.
  • Applied a patch from Nils Labugt which fixes a runtime bug in the gui_core
  • component. The bug caused a crash when using X11 and Ubuntu 10.10 in
  • certain cases.
  • Updated code so that it compiles with the clang compiler.
  • Other:
  • Updated the image_display widget so you can zoom in and out using the
  • mouse wheel.

New in dlib 17.34 (Jan 4, 2011)

  • New Stuff:
  • General Stuff
  • Added the promote template
  • Added the basic_type template
  • Added the assign_image_scaled() function
  • Added the unordered_pair object.
  • Added the symmetric_matrix_cache() function
  • Added two new quadratic program solvers. The solve_qp2_using_smo
  • and solve_qp3_using_smo objects.
  • Machine Learning Stuff
  • Added the svm_c_trainer object. It implements C-SVM classification and
  • allows the user to set different C values for each class.
  • Added the svm_one_class_trainer object.
  • Added the svr_trainer object. It implements epsilon-insensitive
  • support vector regression.
  • Added two new any objects. The any_decision_function for containing
  • decision function style objects and the any_trainer for trainers.
  • Added cross_validate_regression_trainer()
  • Added test_regression_function()
  • Added the probabilistic() function. It is a trainer adapter that
  • simply calls train_probabilistic_decision_function().
  • Added tools for multiclass classification
  • Added one_vs_one_trainer
  • Added one_vs_all_trainer
  • Added cross_validate_multiclass_trainer()
  • Added test_multiclass_decision_function()
  • Non-Backwards Compatible Changes:
  • invalid_svm_nu_error has been renamed to invalid_nu_error.
  • Changed the pixel_traits so that signed grayscale pixel types are allowed.
  • This involved adding a few new fields to pixel_traits. I also changed the
  • get_pixel_intensity() function so that its return value is of the same type
  • as the basic pixel type rather than always being unsigned long.
  • Removed the kernel_type typedef from the normalized function since this
  • meta-object should be capable of working with non-kernel decision functions.
  • train_probabilistic_decision_function() no longer accepts column vectors of
  • samples and labels. Now it only accepts std::vectors of samples and labels.
  • Bug fixes:
  • Fixed a bug in the deserialization code for the sparse kernels. The bug
  • prevented code which used the deserialize() routine from compiling.
  • Other:
  • Changed the image display GUI widgets to use the assign_image_scaled()
  • function internally. Now they will accept just about any image and
  • do the right thing.
  • Modified the type_safe_union so that you can call apply_to_contents() on const
  • type_safe_unions.
  • Added serialization support for std::pair objects.
  • Made the train_probabilistic_decision_function() more general by making it work
  • with any kind of trainer object rather than only ones which produce
  • dlib::decision_function objects. I also made it work with trainers that only
  • take std::vectors.
  • Added overloads to the config_reader's methods to allow it to load directly
  • from a file name given as a string in addition to taking istream objects.

New in dlib 17.33 (Dec 6, 2010)

  • New Stuff:
  • Added the ability to add/subtract scalar values to/from all the elements
  • of a matrix using the - and + operators.
  • Added a trust region optimizer.
  • Added Levenberg-Marquardt and LM/quasi-newton hybrid methods for solving
  • non-linear least squares problems.
  • Added an any container object.
  • Non-Backwards Compatible Changes:
  • Bug fixes:
  • Fixed a compiler warning and also a runtime bug in sort_basis_vectors().
  • The bug triggered when all the basis vectors were included in the final
  • answer.
  • Other:
  • Added a bunch of overloads to catch operations on diagonal matrices
  • and use more efficient code paths for them. For example, inv(diagm(d))
  • turns into diagm(reciprocal(d)). Multiplication by a diagonal matrix
  • is now also handled efficiently.

New in dlib 17.32 (Nov 29, 2010)

  • New Stuff:
  • Added a class for reading JPEG image files.
  • Added scale_rows(), flipud() and fliplr() matrix functions.
  • Added console_progress_indicator. It is a tool for measuring how long a
  • task will take.
  • Added sort_basis_vectors(). It is a function for performing supervised
  • basis selection.
  • Non-Backwards Compatible Changes:
  • Renamed the linearly_independent_subset_finder's dictionary_size() member
  • function to size(). This way, linearly_independent_subset_finder objects
  • can be used in many templated functions which expect objects which look
  • like arrays.
  • Bug fixes:
  • Changed the assert macros so that they don't use __PRETTY_FUNCTION__
  • with gcc 4.4.5 since, on Ubuntu at least, this version of gcc segfaults
  • when __PRETTY_FUNCTION__ is used within certain template constructs.
  • Improved the alias detection capability of kernel_matrix() expressions.
  • Now statements of the form: sample = kernel_matrix(kern, *, sample) can
  • be used since the aliasing of sample will be handled.
  • Other:
  • Generally tried to make things more usable.
  • Optimized matrix expressions such as mat*diagm(vect)
  • Made the code in chol() more robust to indefinite matrices.

New in dlib 17.31 (Sep 16, 2010)

  • New Stuff:
  • Added the running_scalar_covariance object.
  • All the matrix decomposition routines now use LAPACK when DLIB_USE_LAPACK is #defined.
  • Non-Backwards Compatible Changes:
  • Removed the dlib::EOTHER constant since it conflicts with visual studio 2010.
  • Changed the svd functions so you can't supply output matrices which use both column and row major layouts. Now all the output matrices need to use the same memory layout.
  • Removed the qr_decomposition::get_householder() function.
  • Bug fixes:
  • Minor fixes so that dlib compiles in Visual Studio 2010
  • Other:
  • Added an overloaded matrix_assign() that handles symmetric kernel_matrix() expressions more efficiently by only evaluating the upper triangular part of the matrix.

New in dlib 17.30 (Jul 29, 2010)

  • Bug fixes:
  • Fixed a compile-time bug in the matrix related to multiplication by subm() expressions when the BLAS bindings were enabled.
  • Fixed a bug in train_probabilistic_decision_function() which could cause it to go into an infinite loop when working with very large datasets.

New in dlib 17.29 (Jul 26, 2010)

  • New Stuff:
  • Added a reference_wrapper implementation and modified the thread_function slightly so it works with it.
  • Added an implementation of kernel ridge regression.
  • Added a simple newton search strategy for optimizing functions.
  • Non-Backwards Compatible Changes:
  • If you have created your own matrix expressions then its possible this new release will cause them to not compile.
  • Bug fixes:
  • Fixed a bug in scale_columns. It said it didn't have any destructive aliasing when in fact it destructively aliased its second argument.
  • Fixed a bug in the random number generator where setting the seed back to "" didn't result in the object going back to it's initial state.
  • Other:
  • Reorganized the matrix expression code. It's now much simpler and the library includes a new example program which details the steps needed to create new matrix expressions.
  • Changed the train_probabilistic_decision_function() routine so that it uses a more numerically stable method to perform its maximum likelihood optimization.
  • Added missing get/set epsilon functions to the RVM training objects. I also changed the default epsilon from 0.0005 to 0.001.

New in dlib 17.28 (Jun 15, 2010)

  • New Stuff:
  • Added the simplify_linear_decision_function() routines.
  • Added the find_approximate_k_nearest_neighbors() function.
  • Added the fill_lisf() function.
  • Non-Backwards Compatible Changes:
  • Made the sample_pair have a default distance of infinity instead of the max floating point value. I also reworked the graph creation functions to make them a little more versatile. Now you can use infinite distances to indicate that certain nodes are not connected at all.
  • Changed the linear_manifold_regularizer to normalize the regularization parameter by the sum of edge weights instead of the sum of edges.
  • Bug fixes:
  • Fixed a bug in the timer_kernel_2 object. In certain rare cases it would stop calling the action function and essentially shut down without being told to do so.
  • Other:
  • Made the reduced() and reduced2() functions more efficient.
  • Many small usability improvements here and there.

New in dlib 17.27 (May 17, 2010)

  • New Stuff:
  • Added the svm_c_ekm_trainer. It is a kernelized version of the fast linear trainer svm_c_linear_trainer.
  • Added the linear_manifold_regularizer and some supporting tools.
  • Added the sum_rows(), sum_cols(), join_rows(), join_cols(), reshape(), and pointer_to_matrix() functions.
  • Added the randomly_subsample() function.
  • Bug fixes:
  • Fixed some minor compile time bugs on certain older compilers.
  • Other:
  • Updated the += and -= matrix operators to be a little more flexible. Now if you try to apply them to a matrix of the wrong size it will automatically resize the target matrix and just do a normal assignment.
  • Removed the requirement that you load dng files into an image of the exact pixel type that created the file. Now you can use any pixel type. I also changed the code so that grayscale pixels with more than 16 bits get saved as 16 bit grayscale images instead of 8 bit images.

New in dlib 17.24 (Jan 5, 2010)

  • New Stuff:
  • Added some MATLAB style thresholding relational operators to the matrix.
  • Added the kernel_matrix() functions.
  • Added the empirical_kernel_map object.
  • Added the discriminant_pca object.
  • Added the read_write_mutex object.
  • Non-Backwards Compatible Changes:
  • Renamed the support_vectors member of the decision_function and distance_function classes to basis_vectors. This name more appropriately reflects how these two classes are used within the library.
  • Changed the matrix_exp interface slightly. This could only impact users who created their own custom matrix expressions. If you don't get a compiler error then you don't have to worry about it.
  • Bug fixes:
  • Fixed a minor error in the LBFGS code.
  • Added a missing check for division by zero to the kcentroid, krls, and linearly_independent_subset_finder classes. If someone added the zero vector to them as the first training example a division by zero could result.
  • There were a few cases where the code wouldn't compile when using matrices of complex numbers. There was also a runtime bug that triggered when a rank 1 update was performed where one of the vectors was conjugated and two or more transposes were used in certain positions. This bug caused the wrong output to be computed if the BLAS bindings were used. Both of these bugs have been fixed.
  • Fixed a bug in the http server that affected cookies with certain kinds of data. The result was invalid data being sent back to the web browser.
  • Other:
  • Generally improved the BLAS bindings for the matrix object.

New in dlib 17.23 (Oct 21, 2009)

  • New Stuff:
  • Added the pointer_to_column_vector function.
  • Added the BOBYQA algorithm for derivative-free optimization.
  • Added some functions to make it easy to do a line search on a function of a single variable when derivatives are not available.
  • Non-Backwards Compatible Changes:
  • Bug fixes:
  • Fixed a bug in the cpp pretty printer. It wasn't parsing exponentiated numbers like 1e100 correctly.
  • Other:
  • Added a model selection example program using grid search and the new BOBYQA algorithm.

New in dlib 17.21 (Aug 31, 2009)

  • New Stuff:
  • Added the ability to use a kernel cache to the batch_trainer object.
  • svm_pegasos can now be configured to use two different lambda arguments for use with unbalanced data.
  • Added the reciprocal_max() and dot() matrix functions.
  • Added the bgr_pixel and cv_image objects so that OpenCV images can be easily used with dlib routines.
  • Non-Backwards Compatible Changes:
  • I changed the batch trainers so that they always call clear() on the trainer being used before training begins.
  • Modified the svm_pegasos class so that the user can set independent lambda parameters for each class. This breaks backwards compatibility with the previous interface slightly and changes the serialization format of this class.
  • Split the vector_normalizer into a normal normalizer and a pca normalizer version.
  • The zoomable_region widget now uses exponential rather than linear zoom scaling since this is much more pleasing to use. There is now a new requirement on the zoom increment that it must be between 0 and 1.
  • Bug fixes:
  • Fixed a bug in the cross_validate_trainer_threaded() function. It could deadlock if more than about 10 folds were requested.
  • Fixed the serialization functions for the normalized_function object. They will now work with custom normalizer function objects.
  • Fixed a minor bug in the zoomable_region::set_min_zoom_scale() function. It didn't always end up zooming in a smooth sensible manner after this function was called.
  • Other:
  • Made the thread_function object more general. It can now handle arbitrary functions of up to four arguments.

New in dlib 17.20 (Jul 13, 2009)

  • New Stuff:
  • Added the reshape_to_column_vector() function.
  • Added a hook to the logger object that lets you set a different kind of output logging destination (in addition to the std::ostream supported already).
  • Upgraded the smart_ptr so that it can handle array pointers as well as customer deleter functions.
  • Added overloads of the kernel_derivative object for all the kernels in dlib.
  • Non-Backwards Compatible Changes:
  • Reworked the config_reader interface a little to make it easier to use. In particular, I removed the enumerator over blocks in favor of a simple get_blocks() function that just returns a std::vector of all the blocks. I also removed the requires clauses on the block and key accessor functions and instead made a request for a non-existent key/block result in a non-fatal exception. This way users can let the config reader perform a more natural role in config file validation (by catching this exception and acting accordingly).
  • It is now illegal to multiply matrices of size zero together.
  • Bug fixes:
  • Fixed the gaussian() function used by the SURF code. It wasn't computing a properly weighted Gaussian function.
  • Fixed a few things in various parts of the code to avoid compiler errors in certain use-cases.
  • Added a missing rethrow statement. The xml parser would eat exceptions thrown by event handlers rather than letting them propagate out as documented in the specification.

New in dlib 17.19 (May 25, 2009)

  • New Stuff:
  • Added an implementation of the SURF algorithm which includes the
  • following new objects and functions: integral_image, hessian_pyramid,
  • interest_point, surf_point, compute_dominant_angle(),
  • compute_surf_descriptor(), haar_x(), haar_y(), get_interest_points(),
  • and get_surf_points().
  • Added the zeros_matrix() and ones_matrix() functions.
  • Added serialization support to the type_safe_union object.
  • Added the grow_rect() and shrink_rect() functions.
  • Added the get_files_in_directory_tree() function.
  • Added the null_trainer_type object.
  • Added the roc_trainer_type object.
  • Non-Backwards Compatible Changes:
  • Removed some extraneous get_kernel() functions from some of the
  • trainer adapter classes since they really aren't needed.
  • Bug fixes:
  • Changed the socket read/write code so that it can handle a large
  • number ( > 2 billion) of bytes in I/O calls.
  • Added a missing type cast to the reciprocal() function to fix a compile
  • time error you get when you use it with complex type matrices.
  • Fixed a bug in the assign_border_pixels() and zero_border_pixels() functions.
  • Their contracts said there was no upper limit on the size of the border that
  • could be assigned/zeroed but the implementations failed to handle the case
  • where the border was bigger than the image.
  • Other:
  • Generally cleaned up the code and documentation here and there.
  • Added in Steven Van Ingelgem's patches to improve the usability of the
  • HTTP server object.
  • Updated the load_bmp() function so that it is capable of reading BMP
  • files that have been compressed with the RLE compression sometimes
  • used for 8bit BMP files.
  • Merged in Miguel Grinberg's patch to add a non-blocking read() function to the connection object.

New in dlib 17.18 (May 11, 2009)

  • New Stuff:
  • Added a set of kernels that can operate on sparse vectors.
  • Added the image_window and image_display objects.
  • Added the rotate_point() function and the point_rotator object.
  • Non-Backwards Compatible Changes:
  • Added Steven Van Ingelgem's patch to add the body of data posted
  • back to the server into the incoming data object given to the
  • server_http::on_request() handler. This removes the content_length
  • field and replaces it with a string that contains the body of content
  • data.
  • Bug fixes:
  • Fixed a compile time bug in the offset_kernel.
  • Other:
  • Added optimized overloads of the kcentroid object for various
  • linear kernels.
  • Changed all the tests in the dlib test suite to use a new DLIB_TEST
  • macro instead of DLIB_CASSERT since the tests really aren't
  • technically assertions

New in dlib 17.17 (Mar 17, 2009)

  • New Stuff:
  • Added the strings_equal_ignore_case() functions
  • Non-Backwards Compatible Changes:
  • Changed the on_request() function in the http server
  • Changed the serialization format of the kcentroid and svm_pegasos objects
  • By default, the kcentroid now keeps the most linearly independent dictionary vectors rather than the newest
  • Other:
  • Split the algorithms documentation page into three pages, algorithms, machine learning, and bayes nets.
  • Merged in Steven Van Ingelgem's patch to cleanup the HTTP server and add new functionality. This breaks backwards compatibility with the previous on_request() interface but it is easy to update old code and it is now much cleaner and easier to use.
  • Changed the kcentroid so that you can tell it to keep the most linearly independent vectors rather than the newest vectors. I then changed the svm_pegasos object so that it has a max number of support vector setting so that the user can supply an upper limit on the number of support vectors to use.

New in dlib 17.16 (Mar 10, 2009)

  • New Stuff:
  • Matrix related
  • Added the find_min_and_max(), index_of_min(), index_of_max(), trace(), randm(), linspace(), logspace(), and cartesian_product() functions.
  • Machine learning related
  • Added the offset_kernel
  • Added some functions to the kcentroid to allow the user to compute the inner_product of kcentroids as well as a few other useful things.
  • Added a kernelized version of the Pegasos SVM training algorithm.
  • Non-Backwards Compatible Changes:
  • Changed the range() function so that it returns row vectors instead of column vectors.
  • Bug fixes:
  • Changed threading code to avoid a potential race condition during program termination.
  • Fixed a few incorrect DLIB_ASSERT statements
  • Fixed a bug in the way Content-type was handled in HTTP posts.
  • Fixed a bug in subm() that showed up when statically dimensioned row vectors were used to select a sub matrix.
  • Other:
  • Added some functions to the rectangle to make it easy to get the corner points.
  • The cross validation functions no longer allow invalid_svm_nu_error exceptions to escape. Instead, they are assigned low CV scores.
  • Made std_vector_c able to copy directly from std::vector objects.
  • Added a get_socket_descriptor() function to the connection class.

New in dlib 17.15 (Feb 4, 2009)

  • New Stuff:
  • Added QR, LU, Cholesky, and eigenvalue decomposition class objects
  • Added overloads for rowm() and colm() that allow you to pick out less than an entire vector
  • Added the lowerm() and upperm() functions
  • Added the const_temp_matrix class
  • Non-Backwards Compatible Changes:
  • Renamed the cholesky_decomposition() function to chol()
  • Bug fixes:
  • Fixed some errors in the requirements for calling the new rowm() and colm() functions.
  • Fixed dlib::abs() so that it returns the right type when used with complex matrices.
  • Fixed a race condition in the logger object. It was missing a needed call to unregister_thread_end_handler(). What could happen in some scenarios is, during program termination, a global part of the logger object could be destructed when it still had outstanding thread end handlers registered to it.
  • Other:
  • Added an example program that shows how to use the optimization functions.
  • Gave the matrix object the ability to factor expressions containing trans() function calls into more efficient forms.
  • Generally cleaned up the matrix code

New in dlib 17.14 (Jan 19, 2009)

  • New Stuff:
  • Added the multi-line text_box GUI widget.
  • Added the type_safe_union object
  • Non-Backwards Compatible Changes:
  • Renamed the array::expand() function to array::resize() since it does basically the same thing as std::vector::resize() and more than one user has told me they found the name "expand" to be confusing.
  • Other:
  • Added an example showing how to use the type_safe_union and pipe together.
  • Added a page to the documentation that discusses the dlib coding standards and how to contribute to the project.

New in dlib 17.13 (Jan 6, 2009)

  • New Stuff:
  • Added the bound_function_pointer object.
  • Added support for futures to the thread_pool object.
  • Added a set of objects that makes it possible to create simulations of quantum computing algorithms.
  • Added copy and paste support to the text_field.
  • matrix object stuff - Added the range() function as well as overloads of all the various sub-matrix selection functions so that you can pick out slices of matrices like in Matlab. - Added a new template argument to the matrix object that allows the user to select the memory layout. Also added a row_major_layout and column_major_layout. - The matrix object can now be initialized using a comma separated list of values.
  • Non-Backwards Compatible Changes:
  • Changed the fatal_error exception class so that it aborts your program and prints a message if you try to construct it more than once since doing so indicates that you ignored the first fatal error.
  • The way matrix expressions work in the library has been changed since the last release. So if you created custom matrix expressions then they will need to be updated to use the new matrix expression stuff.
  • Bug fixes:
  • Fixed a minor bug in how the zoomable_region widget drew itself after a resize in some cases.
  • Fixed a problem with draw_line where it didn't always redraw the line properly.
  • Other:
  • A lot of the matrix code has been refactored and optimized. The matrix object will now introduce temporary objects when doing so results in better performance. I also added a simple system for binding arbitrary matrix expressions to optimized BLAS routines.
  • Cleaned up the vector and point classes. Now there is only one class, the vector class, and it is capable of representing everything the old vector and point class could. I also added code to make sure the vector class does the appropriate type promotions when vector objects with different types are used together.
  • Made the vector class inherit from matrix

New in dlib 17.12 (Nov 11, 2008)

  • New Stuff:
  • Added user settable styles to most of the gui widgets
  • Added the diagm(), svd2() and svd3() matrix functions
  • Added the thread_pool object
  • Non-Backwards Compatible Changes:
  • Removed the arrow_button widget and moved its functionality into the button widget.
  • Renamed the dragable class to draggable
  • Removed the confusing and unnecessary hidden bool argument to the gui widget style drawing functions.
  • Changed some of the events that are about the mouse leaving a widget so that they still trigger even if the widget has been disabled or hidden.
  • Bug fixes:
  • Added some missing mutex locks to the scroll_bar widget
  • Fixed a bug in the fill_gradient_rounded() function. It didn't always
  • draw the entire rectangle.
  • Fixed a compile time bug in the pinv() function. It didn't compile when used on statically sized matrices when they weren't square.
  • Other:
  • The member_function_pointer object now never calls new or delete. So it is safe to use in a real time environment.

New in dlib 17.11 (Oct 24, 2008)

  • New Stuff:
  • Added the sort_columns() and rsort_columns() functions
  • Added the vector_normalizer object
  • Added the normalized_function object.
  • Added a tensor_product() function for the matrix object.
  • Bug fixes:
  • Made it so that the gui event handler thread isn't created at all unless some part of an application calls some of the gui_core code. In the previous release the event handler thread was executed briefly during program termination and could cause problems if no windowing environment was available.
  • Fixed an #include statement in the matrix utilities so that it works even if you don't specify an include path argument to your compiler.

New in dlib 17.10 (Oct 11, 2008)

  • Added a thread safe shared pointer object
  • Added the popup_menu_region widget.
  • The on_wheel_up() and on_wheel_down() gui events now take an unsigned long argument.
  • Removed the register_program_ending_handler() function from the threading API and also changed the dlib thread pool so that it no longer causes a terminating program to wait for any outstanding threads to finish before allowing the application to end.
  • Changed the serialization format of the linearly_independent_subset_finder class.
  • Changed all the font pointers in the gui API's interfaces to shared_ptr_thread_safe objects.
  • Made the kkmeans class actually use the min_change parameter.
  • Fixed a bug in the linearly_independent_subset_finder object. Also added a way to set a minimum tolerance.
  • Fixed a bug in the scrollable_region widget that caused it to scroll in an unpleasant way when the horizontal and vertical scroll increments weren't set to the same value.
  • Made one of the arguments to font::draw_string() not be a reference because some versions of gcc don't end up doing the right thing when -O3 is supplied.
  • Fixed a bug in the covariance() function that prevented it from compiling sometimes.
  • Changed the gui core code around so that it should be safe to make window objects at the global scope.
  • Added more control over how the scrollable_region scrolls its region. You can now adjust how much it scrolls when the mouse wheel is scrolled as well as enabling scrolling via a mouse drag.
  • Modified the library so that it compiles with the Intel compiler.
  • Added some example programs that use the relevance vector machine

New in dlib 17.8 (Aug 16, 2008)

  • New Stuff:
  • Added relevance vector machine regression and classification support.
  • Added the cross_validate_trainer_threaded() function
  • Added the length and length_squared matrix functions.
  • Non-Backwards Compatible Changes:
  • Bug fixes:
  • Changed gui code a little so that windows don't popup in funny places when used with the cygwin X windows system.
  • Other:
  • Made it easier to use the scoped_ptr with the TCP connection object
  • Optimized the matrix object a little