Patrikhuber Eos Versions Save

A lightweight 3D Morphable Face Model library in modern C++

v1.4.0

1 year ago

This release contains quite a few major updates, alongside some smaller "maintenance" updates.

  • Removed the use of the GLM library completely, and now using Eigen types throughout. (E.g. 413c9f96302286db346384e8be4a371557003a18, 7e99ab18cd538e8d8ddd4b78affa56a8f00dcfe2, a23ee0bacbd32f2649211a88817c23f3d246c7fc, 096b68e3fb560787871bf7be91b2fd914a353be6, and other commits). This simplified a lot of code. Rewrote glm::project(), perspective() and ortho() using Eigen (see eos/render/matrix_projection.hpp).
  • Rewrote the nonlinear Ceres fitting using Eigen. This means no more messing around with GLM_FORCE_UNRESTRICTED_GENTYPE. Eigen and Ceres work much nicer together. Many improvements, and most cost functions were renamed - check the commit message in d101ca546118ae8736920915c6ac0dead448161f for more details. Also reworked PriorCost and renamed it to NormCost (e79da919a14b2449acbf8eff57572238e205ed95), and updated fit-model-ceres.
  • Now doing a proper conversion between quaternions (or rotation matrices) and Euler angles that makes sense (1023e4b09a8c88f0f7dae25b7f83785f2d997a15, a23ee0bacbd32f2649211a88817c23f3d246c7fc)
  • Added the necessary Python bindings so that the fitting loop can now be written and customised in Python (#347) (Thank you @omar-h-omar)
  • Updated eigen3-nnls, nanoflann, toml11 and pybind11 submodules to their latest version. Especially toml11 had a big update, and the updated pybind11 supports Python 3.11.
  • Minor change, but may break downstream code: Moved fitting::concat to contour_correspondence.hpp (1029f96f8bd8fa66b55ad1f73962b14aa3fc0f85)
  • Modernised CMake scripts a bit. Removed add_definitions() for Boost (1de80682ad38f0e5784302e3089b52b6aca5ff39), and used CMake targets whenever available (e.g. Ceres::ceres).

The documentation website is updated to v1.4.0.

The updated release is available on PyPI, with wheels for Python 3.9, 3.10 and 3.11 on Windows (x64), and source installation for other platforms.

Note: It is very likely that the next release will require the C++17 standard, and will no longer compile in C++14 mode.

v1.3.0

2 years ago

This is a minor maintenance release, but with one important change, warranting the version push to 1.3.0 to not catch anyone off guard: The Eigen version in 3rdparty/ is updated from 3.3.4 to the latest 3.4.0.

Full release notes:

  • Eigen version in 3rdparty/ is updated from 3.3.4 to 3.4.0. The submodule now also uses the official Eigen gitlab.com URL.
  • Added a script to load the Liverpool-York Head Model (LYHM) (1153e77dab41161f91c1bdeece72650b0956317a)
  • Added a CITATION.cff file to make it easier to correctly cite eos
  • Updated the __repr__ methods of some Python bindings a bit (9b8b3509e609be026f56d98073c2cb6699c55978)
  • Replaced ExpressionModelType None with none in Python to avoid clashing with Python's keyword None (85d09d255da4d57817e0263a06aec0626ed38fed)
  • Added a constructor to eos::core::Mesh's Python bindings to make it more convenient to create a Mesh object (b2f24a12123b0e2409c139cc5d991e3b2a326454)
  • Updated pybind11 to 2.9.1

Note: It is quite likely that support for C++14 will be dropped in one of the future releases, and a C++17 compliant compiler will become the minimum requirement to use eos.

v1.2.1

3 years ago

This is a follow-up update pushing the python bindings to PyPI:

Updated pybind11 to their latest master commit, and changed the Visual Studio CMake generator for the Python bindings from VS 2017 to VS 2019 (75ecca4ac84dce5a1a5113704f7f8714060663da).

eos/@patrikhuber is now part of GitHub Sponsors. If you are finding eos valuable, there is now the possibility of becoming a sponsor.

See the v1.2.0 release notes for all the changes and improvements in this release!

The updated release is available on PyPI.

v1.2.0

3 years ago

This release updates the renderer and texture extraction, with full support for perspective projection (along with orthographic projection), and contains various other smaller improvements and fixes.

New / major improvements:

  • Improved v2::extract_texture(...) to support texture coordinates with seams (63243b2)
  • Moved v2::extract_texture(...) to the eos::render namespace and made it the new default (08cba28). Calling code needs to be adjusted slightly, but the function's parameters are very similar. This new texture extraction uses the Rasterizer of the new renderer, and supports both orthographic and perspective projection.
  • Removed the old extract_texture(...) function, which only supported affine cameras (8fd1735)
  • Improved SoftwareRenderer::render(...) to correctly deal with texture maps with seams (c1defba)
  • Removed the old render(...) function, moved v2::SoftwareRenderer to the render namespace, and added a convenience function for the new renderer that can be called (almost) like the old renderer (12a4120) - calling code needs slight adjustments. The core of the new renderer is the same, but the architecture has been changed to mirror more closely the hardware (or OpenGL) pipeline, with vertex- and fragment shaders. Results should be exactly the same, and they have the same parameters.
    • Note: Whereas previously, meshes without vertex colour would be rendered with the colour (0.5, 0.5, 0.5), in the new renderer, they will have default colour black (bd01644). In any case, it does not make sense to try and render a mesh without vertex colours or texture.
  • Added vertex visibility check function that supports both orthographic and perspective projection (0db88d3). Introduced an enum class ProjectionType, which specifies whether orthographic or perspective projection should be used.

Fixes:

  • Changed strides in Image python bindings to account for row-major Image class (dc0fce8). (The Image class was changed to row-major in a commit a while ago, but the python bindings were never updated to accommodate this.)
  • Updated mpark::variant to their latest master (bd590bf). This should fix a few compile errors with certain compilers when compiling eos in C++14 mode.

Minor improvements/changes:

  • Improved v2::extract_texture(...) to not crash when the projected model is partially outside the image (442497e)
  • Added clear_buffers() function to SoftwareRenderer and Rasterizer to clear the colour- and depth buffers (1e8a875)
  • Set the colourbuffer's clear color to fully transparent (fc1465e)
  • Added project(...) function to PcaModel (4694d6f) (see #295 for a potential issue)
  • Moved render/draw_utils.hpp to render/opencv/ (914fdd5)
  • Added new draw_wireframe(...) function that doesn't need OpenCV (7303b39) and added python binding for it (f1f83d0)
  • Renamed "isomap" to "texturemap" throughout, and the <filename>.isomap.png output of the example apps to <filename>.texture.png (174a2c2)
  • Various other minor improvements.

Removed:

  • Removed render::detail::interpolate_black_line(...) (it was only needed for #4, which was fixed, and also it was for the old texture extraction) (35abed8)
  • Removed estimate_affine_camera(...). See the commit message, for people that were still using this. (507eb77)
  • Removed render_affine(...), this was used in the old texture extraction and is no longer needed (aee7984).

v1.1.2

4 years ago

This is a minor update that slightly improves the internals of loading .scm models from CVSSP from the University of Surrey, and also adds load_scm_model(...) to the Python bindings, so these models can be loaded directly in Python.

Changes/improvements:

  • Removed the OpenCV dependency of eos/morphablemodel/io/cvssp.hpp, and clarified the documentation slightly [dd4cd62d4724f4368916875d1303f03e98f2f0fb and following]
  • Subsequently, the utils (with utils/scm-to-cereal being the only one) can now be built without OpenCV [d465a042a860283ba3f11ce15683bf186a607273]
  • Added load_scm_model(...) to the Python bindings (in the namespace eos.morphablemodel.load_scm_model(...)) [b82b85244d5e5ed55a257d0483d21bcfcef4c9c6]

The updated release is also available on PyPI.

v1.1.1

4 years ago

This release mainly fixes the write_obj(...) and write_textured_obj(...) functions to now also write out the texture triangle indices (tti), when they're present in a mesh. Previously for meshes who used a different set of texture triangle indices, this could cause weird artefacts on the top of the head because the tti were not written to the obj. [c25319769f3d103293d62c857a1b330631c90e5f]

Other small changes/improvements:

  • Moved write_obj(...) and write_textured_obj(...) into a separate header, eos/core/write_obj.hpp, so that including Mesh.hpp doesn't result in transitively including <fstream> and <string> [a040c0ed73b6df426fdfedb7fa7804e28514a879]
  • Prefixed all header guards with EOS_ in the eos::core namespace to reduce possible name collisions [4381fd16b994c4533e9af2fe6cc1f63b5adea48a]
  • write_obj(...) now also inverts the y axis of the uv coords, to be consistent with write_textured_obj(...) [7ce291825a916190aedf790b465ec68dcf49373f]
  • setup.py now checks for CMake 3.10.0 on Windows [3dd69f7727167345f135421a918f2e1ec7c6b5b7]

v1.1.0

5 years ago

This release contains an important fix for models that have separate texture_triangle_indices, like e.g. the 4DFM. It also contains a number of other minor improvements and an updated documentation.

Fixes:

  • texture_triangle_indices is now correctly passed along to sample_to_mesh(...) in all MorphableModel member functions (e598203ddf8ec370cc86b6ab3e1ea8045f6fb705). Previously, get_mean and the draw_sample functions (except for the one that takes shape, colour and expression coefficients) would have returned a mesh without the texture triangle indices (if the MorphableModel contained them). This might actually have been causing wrong code to be run or some bad memory access to - the assert that checks for that in sample_to_mesh(...) is not triggered in Release and RelWithDebInfo builds, therefore we haven't caught this for a while. Now we always handle models correctly that contain texture triangle indices, like the 4DFM.

Minor improvements & changes:

  • The documentation at http://patrikhuber.github.io/eos/doc/ is now updated to eos v1.1.0
  • Added Mesh::tti to the Python bindings (afc80dfb4bdd3160c867e6327be0ec3818da1fb0)
  • Moved mesh normal computation functions to eos/render/normals.hpp header (5b6cd230ffac75c8139bb1e74be8d888eb830004)
  • Added functions to compute face and vertex normals of a mesh (7af6131a334666778e96250bfbbaab784186f7ff)
  • Renamed include/eos/render/utils.hpp to transforms.hpp
  • Improve error messaging when loading MorphableModels with odd versions (41fddf6d732df07c5077139b74235b995f7edf4f)
  • Moved ray_triangle_intersect(...) to its own header (5b574092d562e8628b95edbf4af83a2f8049b5e9)
  • Added simple image resize function (ae533982269246fbb56cf2f2260c9e09a59d49ee)
  • Improved the natvis Image visualiser for Image Watch: Set channel type to RGB(A) for 3 and 4 channel images (622fc35a0e6fd22938237e834c1511c7a749bbf4)

In-progress changes:

These are in-progress changes on new rendering/texture extraction stuff in the render::v2 namespace - these work in principle but are not too thoroughly tested or used in eos yet.

  • Uncommented v2::extract_texture(...) and updated all affected code (23d07554a014d7ce1a1fcafe13e4173074175512)
  • Updated v2::SoftwareRenderer and related code to compile with the latest eos changes and without OpenCV

v1.0.1

5 years ago

Small maintenance release with updated Python bindings, fixed demo.py script (updated to work with the latest eos changes), and fixed BFM2009/2017 converter scripts.

See the release notes from v1.0.0 for the latest changes!

v1.0.0

5 years ago

The API and functionality of eos have been quite stable for a while now and proven themselves robust and useful. This release mainly constitutes the exciting bump to v1.0!

One major recent addition is support for the 4D Face Model, 4DFM, a full-head 3D morphable face model with 36 expressions/action units, from 4dface.io.

4D Face Model colour picture     4D Face Model shape picture

The update also includes the most recent version of pybind11, and addition of sample_to_mesh() to the Python bindings.

Other recent changes & improvements include supporting uv coordinates with seams, support for landmark/vertex definitions in the MorphableModel class to give certain vertices a fixed semantic meaning, and lots of other things. See the release notes from v0.17.0 and v0.18.0 for more details.

v0.18.0

5 years ago

This release adds support for texture maps with seams. When a texture map contains seams, the vertices at the seams are usually duplicated, and then some of the triangle indices are different in uv space from the triangulation of the 3D vertices. This change allows to support the texture coordinates of the full-head 4D Face Model (4DFM).

  • The MorphableModel file format version was increased to 4 to store an additional member containing the uv triangulation (85cc563afe7e1916fa98d577c5b036cb622c8806)
  • Updated extract_texture to support uv coordinates with seams (a70ded3d3c7644b54fd97878183d7b5c46323624)

Other minor changes:

  • Made the return type of get_texture_coordinates const ref (3a25d5278f131b72fc1f91c5009f4684a2dcf97f)

Please also have a look at the changes in v0.17.0.