[Kwiver-users] MapTK issues on Windows

Michael Rosen michael.rosen at gmail.com
Wed Oct 14 09:58:04 EDT 2015


I commented out lines from clif_track.conf as follows but it failed as
before:
# The OpenCV cv::Algorithm type to use for 'detector'.
feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:detector:type
= Feature2D.SURF

#feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:gridCols
= 4
#feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:gridRows
= 6
#feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:maxTotalKeypoints
= 1000

I had previously tried building Kwiver on Linux but it failed to build
Boost.  Can you recommend a way forward for me?

Thanks.

msr

On Wed, Oct 14, 2015 at 6:42 AM, Matthew Leotta <matt.leotta at kitware.com>
wrote:

> Michael,
>
> This is likely related persistent issues with OpenCV’s algorithm factory
> code on Windows.  For whatever reason, the OpenCV team could never seem to
> work the kinks out of this on Windows, but it works fine on other
> platforms.  I was really hoping they were going to fix it once and for all
> in OpenCV 3.0, but instead they decided it was too much hassle and they
> just removed algorithm factories altogether.  So OpenCV no longer supports
> creating algorithms at run-time from string names.  This makes me sad,
> because we had a nice system in MAP-Tk of allowing OpenCV algorithms to be
> created and configured on the fly using the MAP-Tk configuration file.  If
> we upgrade MAP-Tk to use OpenCV 3.0 we will have to hard code a fixed set
> of algorithm choices and configuration parameters.
>
> The problem seems to mostly manifest itself when you use nested OpenCV
> algorithm on Windows.  In this case, the example config file contains:
>
> -----------------------
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:detector:Feature2D.SURF:extended
> = false
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:detector:Feature2D.SURF:hessianThreshold
> = 100
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:detector:Feature2D.SURF:nOctaveLayers
> = 3
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:detector:Feature2D.SURF:nOctaves
> = 4
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:detector:Feature2D.SURF:upright
> = true
>
> # The OpenCV cv::Algorithm type to use for 'detector'.
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:detector:type
> = Feature2D.SURF
>
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:gridCols
> = 4
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:gridRows
> = 6
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.Grid:maxTotalKeypoints
> = 1000
>
> # The OpenCV cv::Algorithm type to use for 'detector'.
> feature_tracker:core:feature_detector:ocv:detector:type = Feature2D.Grid
> -----------------------
>
> This might run if you remove the OpenCV grid adaptive detector layer like
> this:
>
> -----------------------
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.SURF:extended
> = false
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.SURF:hessianThreshold
> = 100
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.SURF:nOctaveLayers
> = 3
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.SURF:nOctaves
> = 4
> feature_tracker:core:feature_detector:ocv:detector:Feature2D.SURF:upright
> = true
>
> # The OpenCV cv::Algorithm type to use for 'detector'.
> feature_tracker:core:feature_detector:ocv:detector:type = Feature2D.SURF
> -----------------------
>
> I would expect this to run (hopefully), but it is likely that it may not
> produce ideal results.
>
> —Matt
>
>
> On Oct 14, 2015, at 9:13 AM, Michael Rosen <michael.rosen at gmail.com>
> wrote:
>
> Presentation and test data look great.  Sadly, it's not working for me on
> Windows.  maptk_track_features posts an AV.  Can you provide some insight
> into what's wrong?
>
> Attempting to follow along with the example, I ran this:
>
>
> C:\dev\cvpr2015-opensfm-master\Exercises\maptk>C:\dev\maptk\bin\maptk_track_features.exe
> -c clif_track.conf
>
> I think the debug spew below looks ok:
>
> [DEBUG][maptk::algorithm_plugin_manager::register_plugins] Dynamically
> loading plugin impls
> [DEBUG][maptk::algorithm_plugin_manager::impl::load_from_search_paths]
> Loading plugins in search paths
> [DEBUG][maptk::algorithm_plugin_manager::impl::load_modules_in_directory]
> Loading modules in directory: "C:/dev/maptk/lib/maptk"
> [DEBUG][maptk::algorithm_plugin_manager::impl::register_from_module]
> Starting plug-in interfacing for module file: "C:/dev/maptk/lib
> /maptk\maptk_core_plugin.dll"
> [DEBUG][maptk::algorithm_plugin_manager::impl::register_from_module]
> Loaded module: 73EE0000
> [DEBUG][maptk::algorithm_plugin_manager::impl::register_from_module]
> Looking for algorithm impl registration function: private_regis
> ter_algo_impls
> [DEBUG][maptk::algorithm_plugin_manager::impl::register_from_module] ->
> returned function address: 73EE1163
> [DEBUG][maptk::Implementation Registration] Registering algorithm
> implementations from module 'maptk_core'
> [DEBUG][maptk::registrar] Registering algo implementation
> 'close_loops:bad_frames_only' for def type 'close_loops'
> [DEBUG][maptk::registrar] Registering algo implementation
> 'bad_frames_only' for def type 'close_loops'
> [DEBUG][maptk::registrar] Registering algo implementation
> 'close_loops:multi_method' for def type 'close_loops'
> [DEBUG][maptk::registrar] Registering algo implementation 'multi_method'
> for def type 'close_loops'
> [DEBUG][maptk::registrar] Registering algo implementation
> 'compute_ref_homography:core' for def type 'compute_ref_homography'
> [DEBUG][maptk::registrar] Registering algo implementation 'core' for def
> type 'compute_ref_homography'
> [DEBUG][maptk::registrar] Registering algo implementation
> 'convert_image:bypass' for def type 'convert_image'
> [DEBUG][maptk::registrar] Registering algo implementation 'bypass' for def
> type 'convert_image'
> [DEBUG][maptk::registrar] Registering algo implementation
> 'filter_features:magnitude' for def type 'filter_features'
> [DEBUG][maptk::registrar] Registering algo implementation 'magnitude' for
> def type 'filter_features'
> [DEBUG][maptk::registrar] Registering algo implementation
> 'bundle_adjust:hierarchical' for def type 'bundle_adjust'
> [DEBUG][maptk::registrar] Registering algo implementation 'hierarchical'
> for def type 'bundle_adjust'
> [DEBUG][maptk::registrar] Registering algo implementation
> 'match_features:homography_guided' for def type 'match_features'
> [DEBUG][maptk::registrar] Registering algo implementation
> 'homography_guided' for def type 'match_features'
> [DEBUG][maptk::registrar] Registering algo implementation
> 'track_features:core' for def type 'track_features'
> [DEBUG][maptk::registrar] Registering algo implementation 'core' for def
> type 'track_features'
> [DEBUG][maptk::algorithm_plugin_interface_macros::REGISTRATION_SUMMARY]
> Registered 8 of 8 algorithms
>         (@C:\dev\maptk\maptk\plugins\core\register_algorithms.cxx)
> [DEBUG][maptk::algorithm_plugin_manager::impl::register_from_module] ->
> Successfully called registration func
> [DEBUG][maptk::algorithm_plugin_manager::impl::register_from_module]
> Starting plug-in interfacing for module file: "C:/dev/maptk/lib
> /maptk\maptk_ocv_plugin.dll"
> [DEBUG][maptk::algorithm_plugin_manager::impl::register_from_module]
> Loaded module: 73EA0000
> [DEBUG][maptk::algorithm_plugin_manager::impl::register_from_module]
> Looking for algorithm impl registration function: private_regis
> ter_algo_impls
> [DEBUG][maptk::algorithm_plugin_manager::impl::register_from_module] ->
> returned function address: 73EA1163
> [DEBUG][maptk::Implementation Registration] Registering algorithm
> implementations from module 'maptk_ocv'
> [DEBUG][maptk::registrar] Registering algo implementation
> 'analyze_tracks:ocv' for def type 'analyze_tracks'
> [DEBUG][maptk::registrar] Registering algo implementation 'ocv' for def
> type 'analyze_tracks'
>
> But then right after that, I get an Access Violation with this call
> stack.  What's happening?
>
>   msvcr120.dll!memchr(unsigned char * buf, unsigned char chr, unsigned
> long cnt) Line 101 Unknown
> > opencv_features2d249.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char>
> >::find(const char * _Ptr, unsigned int _Off, unsigned int _Count) Line 1908
> C++
>   opencv_features2d249.dll!cv::FeatureDetector::create(const
> std::basic_string<char,std::char_traits<char>,std::allocator<char> > &
> detectorType) Line 93 C++
>   maptk_ocv.dll!maptk::ocv::detect_features::priv::default_detector()
> Line 76 C++
>   maptk_ocv.dll!maptk::ocv::detect_features::priv::priv() Line 63 C++
>   maptk_ocv.dll!maptk::ocv::detect_features::detect_features() Line 94 C++
>   maptk_ocv.dll!maptk::algo::algorithm_impl<maptk::ocv::detect_features,maptk::algo::detect_features>::register_self(maptk::registrar
> & reg) Line 370 C++
>   maptk_ocv.dll!maptk::ocv::register_algorithms(maptk::registrar & reg)
> Line 70 C++
>   maptk_ocv_plugin.dll!register_algo_impls(maptk::registrar & reg) Line 44
> C++
>   maptk_ocv_plugin.dll!private_register_algo_impls(maptk::registrar &
> reg) Line 59 C++
>   maptk_apm.dll!maptk::algorithm_plugin_manager::impl::register_from_module(boost::filesystem::path
> module_path) Line 293 C++
>   maptk_apm.dll!maptk::algorithm_plugin_manager::impl::load_modules_in_directory(boost::filesystem::path
> dir_path,
> std::basic_string<char,std::char_traits<char>,std::allocator<char> > name)
> Line 198 C++
>   maptk_apm.dll!maptk::algorithm_plugin_manager::impl::load_from_search_paths(std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > name) Line 146 C++
>   maptk_apm.dll!maptk::algorithm_plugin_manager::register_plugins(std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > name) Line 409 C++
>   maptk_track_features.exe!maptk_main(int argc, const char * * argv) Line
> 236 C++
>   maptk_track_features.exe!main(int argc, const char * * argv) Line 489
> C++
>   maptk_track_features.exe!__tmainCRTStartup() Line 626 C
>   maptk_track_features.exe!mainCRTStartup() Line 466 C
>
>
> The offending code seems to be this:
> /// create the default feature detector
>   static cv::Ptr<cv::FeatureDetector> default_detector()
>   {
>     cv::Ptr<cv::FeatureDetector> det;
>     // try the SURF detector first
>     det = cv::FeatureDetector::create("SURF"); //////// Access Violation
> here.
>     if( !det )
>     {
>       // if SURF is not available (nonfree not built) use ORB
>       det = cv::FeatureDetector::create("ORB");
>     }
>     return det;
>   }
>
> On Tue, Oct 6, 2015 at 2:47 PM, Michael Rosen <michael.rosen at gmail.com>
> wrote:
>
>> Thanks very much.  This looks really helpful.  I'll give it a spin and
>> let you know how it goes.
>>
>> msr
>>
>> On Tue, Oct 6, 2015 at 2:01 PM, Matthew Leotta <matt.leotta at kitware.com>
>> wrote:
>>
>>>
>>> On Oct 6, 2015, at 3:38 PM, Michael Rosen <michael.rosen at gmail.com>
>>> wrote:
>>>
>>> Thanks for this.  It compiles and the assert is gone.
>>>
>>> To be clear, here's what I did:
>>>
>>> git clone https://github.com/Kitware/maptk.git
>>> cd .\maptk
>>> git fetch origin pull/88/head:dev/camera-pass-by-reference
>>> git checkout dev/camera-pass-by-reference
>>> cmake -G "NMake Makefiles" -DBOOST_ROOT=C:\dev\fletch\install
>>> -DEIGEN3_INCLUDE_DIR="C:\Program Files (x86)\Eigen\include\eigen3"
>>> nmake
>>> nmake install
>>>
>>>
>>>
>>> Interesting, so you didn’t need to do any of the defines to disable byte
>>> alignment for Eigen?  Were you building master or release before?
>>>
>>> By the way, I have now merged that dev/camera-pass-by-reference branch
>>> into both the release and master branches of MAP-Tk, so you should be able
>>> to use one of the primary branches again.
>>>
>>>
>>>
>>> Is there a simple workflow you can pass that will demonstrate use of
>>> some of the utilities.  For example, suppose I have a collection of
>>> overlapping images, what can I do with them?
>>>
>>>
>>> I’ve been meaning to write up a tutorial on this, but haven’t gotten to
>>> it yet.  Part of this is because there are big API changes coming soon as
>>> well as improvements in algorithms.  There is a bunch of stuff building up
>>> that I can’t release yet until I get approval from AFRL.  A preview of
>>> those changes is on the kwiver-integration branch.  We are pulling a lot of
>>> core guts of MAP-Tk out into a new repository named VITAL (
>>> https://github.com/kitware/vital) that is shared across KWIVER
>>> projects.  I don’t recommend building that on Windows just yet.  But Keith
>>> Fieldhouse is working on a KWIVER “super build” that will use CMake to make
>>> the various projects build together easily.
>>>
>>> Anyway, the best I can do at this point is to point you to a tutorial I
>>> gave back in June at the CVPR conference:
>>>
>>> http://www.kitware.com/cvpr2015-tutorial.html
>>>
>>> This used a version of MAP-Tk similar to the current release branch.
>>> There are examples for applying MAP-Tk to a sample dataset.  A Linux VM
>>> image is provided with all the software and data pre-installed, but you can
>>> also get the config files here:
>>>
>>> https://github.com/mleotta/cvpr2015-opensfm/tree/master/Exercises/maptk
>>>
>>> and the sample data here:
>>>
>>> https://github.com/mleotta/cvpr2015-opensfm/tree/master/Data/CLIF_2007
>>>
>>> and slides explaining what to do here:
>>>
>>>
>>> http://midas3.kitware.com/midas/download/item/317119/Hands_on_with_MAP-Tk.pdf
>>>
>>> FYI, MAP-Tk is (for the moment) a bit specialized to aerial imagery, so
>>> it might not work well out of the box on arbitrary images.
>>>
>>> Good Luck,
>>> Matt
>>>
>>>
>>>
>>>
>>> msr
>>>
>>> On Tue, Oct 6, 2015 at 10:36 AM, Matthew Leotta <matt.leotta at kitware.com
>>> > wrote:
>>>
>>>> Michael,
>>>>
>>>> Thank you for reporting this issue.  I’ll be upfront and warn you that
>>>> I’m not a Windows developer and MAP-Tk is currently better tested on Linux
>>>> and Mac.  That said, we are working toward getting things better running on
>>>> Windows more reliably.
>>>>
>>>> In this case, the issues are related to Eigen byte-alignment issues as
>>>> explained on the Eigen website linked from your error message:
>>>>
>>>>
>>>> http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html
>>>>
>>>> I have read this page before, and expected I would need to make changes
>>>> at some point to work around these issues, but until now I had not come
>>>> across a compiler that exhibited these symptoms.  We should probably try to
>>>> get a VisualStudio 2012 build up on our dashboard so I can work through
>>>> those issues properly.  I expect that will take some time.  A shorter term
>>>> solution is to try to disable alignment in your build.  Can you try the
>>>> solutions described at the bottom of the page at the above URL?  In the "I
>>>> don't care about vectorization, how do I get rid of that stuff?” section it
>>>> suggests defining some macros to disable alignment.  Let me know if that
>>>> works.
>>>>
>>>> In the meantime, I can at least work around that pass-by-value build
>>>> issue.  That function is pass-by-value because we intentionally want to
>>>> make a local copy of the camera object to modify.  However, I can
>>>> explicitly make that copy inside the function instead.  I’ve done this on
>>>> the release branch of MAP-Tk and made a pull request (
>>>> https://github.com/Kitware/maptk/pull/88).  Can you try to build this
>>>> branch and verify that it at least builds for you?
>>>>
>>>> git fetch origin pull/88/head:dev/camera-pass-by-reference
>>>> git checkout dev/camera-pass-by-reference
>>>>
>>>> If that works, I’ll merge this change into the release and master
>>>> branches.  Also let me know if the solution on the Eigen page helps.
>>>>
>>>> —Matt
>>>>
>>>>
>>>> On Oct 5, 2015, at 1:24 PM, Michael Rosen <michael.rosen at gmail.com>
>>>> wrote:
>>>>
>>>> Hello Kwiver-folk,
>>>>
>>>> I'm building MapTK on Windows 7/64 using VStudio 12 and having two
>>>> immediate difficulties:  a compilation problem and a runtime assert.
>>>>
>>>> MapTK is version 0.6.0, Eigen is 3.2.6
>>>>
>>>> I've worked through getting Boost and Eigen built.  When I compile
>>>> maptk, the first problem is this:
>>>>
>>>>    [ 98%] Building CXX object
>>>> tools/CMakeFiles/maptk_pos2krtd.dir/pos2krtd.cxx.obj
>>>>
>>>>   pos2krtd.cxx
>>>>
>>>>   C:\dev\maptk\tools\pos2krtd.cxx(220) : error C2719: 'base_camera':
>>>> formal parameter with __declspec(align('16')) won't
>>>>
>>>>   be aligned
>>>>
>>>>   C:\dev\maptk\tools\pos2krtd.cxx(238) : error C2719: 'base_camera':
>>>> formal parameter with __declspec(align('16')) won't
>>>>
>>>>>>>>
>>>>
>>>> I fixed these compilation errors by changing the signature of the
>>>> offending function from pass-by-value to pass-by-reference:
>>>>
>>>>
>>>>     /// Convert a POS file to a KRTD file
>>>>
>>>>     bool convert_pos2krtd(const maptk::path_t& pos_filename,
>>>>
>>>>                       const maptk::path_t& krtd_filename,
>>>>
>>>>                       maptk::local_geo_cs& cs,
>>>>
>>>>                       maptk::camera_d& base_camera, // msr.  was
>>>> pass-by-value
>>>>
>>>>                       maptk::rotation_d const& ins_rot_offset =
>>>> maptk::rotation_d())
>>>>
>>>>
>>>>
>>>> That allows everything to compile and link.  The next problem was that
>>>> I got an Eigen Assert when I run any of the executables:
>>>>
>>>>
>>>> C:\Program Files (x86)\MAPTK\bin>maptk_analyze_tracks.exe
>>>>
>>>> ...
>>>>
>>>> Assertion failed: (reinterpret_cast<size_t>(array) & 0xf) == 0 && "this
>>>> assertion is explained here: " "http://eigen.tuxfamily.org/d
>>>>
>>>> ox-devel/group__TopicUnalignedArrayAssert.html" " **** READ THIS WEB
>>>> PAGE !!! ****", file c:\program files (x86)\eigen\include\eigen
>>>>
>>>> 3\eigen\src/Core/DenseStorage.h, line 86
>>>>
>>>>
>>>> The web page says that classes which contain certain Eigen data
>>>> structures as members need to use the
>>>>
>>>>      EIGEN_MAKE_ALIGNED_OPERATOR_NEW macro to override the "new"
>>>> operator so that those members will be 16-byte aligned. I've done that but
>>>> am still seeing the assert.
>>>>
>>>>
>>>> Can anyone offer insight into any of this?
>>>>
>>>>
>>>> msr
>>>>
>>>>
>>>> _______________________________________________
>>>> Kwiver-users mailing list
>>>> Kwiver-users at public.kitware.com
>>>> http://public.kitware.com/mailman/listinfo/kwiver-users
>>>>
>>>>
>>>>
>>>
>>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/kwiver-users/attachments/20151014/9d1d5338/attachment-0001.html>


More information about the Kwiver-users mailing list