mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-18 08:44:11 +08:00

* Minor fixes * Start adding correspondence finding * Added finding of correspondences using GPC * New evaluation tool for GPC * Changed default parameters * Display ground truth in the evaluation tool * Added training tool for MPI Sintel dataset * Added the training tool for Middlebury dataset * Added some OpenCL optimization * Added explanatory notes * Minor improvements: time measurements + little ocl optimization * Added demos * Fixed warnings * Make parameter struct assignable * Fix warning * Proper command line argument usage * Prettified training tool, added parameters * Fixed VS warning * Fixed VS warning * Using of compressed forest.yml.gz files by default to save space * Added OpenCL flag to the evaluation tool * Updated documentation * Major speed and memory improvements: 1) Added new (optional) type of patch descriptors which are much faster. Retraining with option --descriptor-type=1 is required. 2) Got rid of hash table for descriptors, less memory usage. * Fixed various floating point errors related to precision. SIMD for dot product, forest traversing is a little bit faster now. * Tolerant floating point comparison * Triplets * Added comment * Choosing negative sample among nearest neighbors * Fix warning * Usage of parallel_for_() in critical places. Performance improvments. * Simulated annealing heuristic * Moved OpenCL kernel to separate file * Moved implementation to source file * Added basic accuracy tests for GPC and PCAFlow * Fixing warnings * Test accuracy constraints were too strict * Test accuracy constraints were too strict * Make tests more lightweight
67 lines
2.5 KiB
C++
67 lines
2.5 KiB
C++
#include "opencv2/optflow.hpp"
|
|
#include <iostream>
|
|
|
|
/* This tool trains the forest for the Global Patch Collider and stores output to the "forest.yml.gz".
|
|
*/
|
|
|
|
using namespace cv;
|
|
|
|
const String keys = "{help h ? | | print this message}"
|
|
"{max-tree-depth | | Maximum tree depth to stop partitioning}"
|
|
"{min-samples | | Minimum number of samples in the node to stop partitioning}"
|
|
"{descriptor-type|0 | Descriptor type. Set to 0 for quality, 1 for speed.}"
|
|
"{print-progress | | Set to 0 to enable quiet mode, set to 1 to print progress}"
|
|
"{f forest |forest.yml.gz| Path where to store resulting forest. It is recommended to use .yml.gz extension.}";
|
|
|
|
const int nTrees = 5;
|
|
|
|
static void fillInputImagesFromCommandLine( std::vector< String > &img1, std::vector< String > &img2, std::vector< String > >, int argc,
|
|
const char **argv )
|
|
{
|
|
for ( int i = 1, j = 0; i < argc; ++i )
|
|
{
|
|
if ( argv[i][0] == '-' )
|
|
continue;
|
|
if ( j % 3 == 0 )
|
|
img1.push_back( argv[i] );
|
|
if ( j % 3 == 1 )
|
|
img2.push_back( argv[i] );
|
|
if ( j % 3 == 2 )
|
|
gt.push_back( argv[i] );
|
|
++j;
|
|
}
|
|
}
|
|
|
|
int main( int argc, const char **argv )
|
|
{
|
|
CommandLineParser parser( argc, argv, keys );
|
|
parser.about( "Global Patch Collider training tool" );
|
|
|
|
std::vector< String > img1, img2, gt;
|
|
optflow::GPCTrainingParams params;
|
|
|
|
if ( parser.has( "max-tree-depth" ) )
|
|
params.maxTreeDepth = parser.get< unsigned >( "max-tree-depth" );
|
|
if ( parser.has( "min-samples" ) )
|
|
params.minNumberOfSamples = parser.get< unsigned >( "min-samples" );
|
|
if ( parser.has( "descriptor-type" ) )
|
|
params.descriptorType = parser.get< int >( "descriptor-type" );
|
|
if ( parser.has( "print-progress" ) )
|
|
params.printProgress = parser.get< unsigned >( "print-progress" ) != 0;
|
|
|
|
fillInputImagesFromCommandLine( img1, img2, gt, argc, argv );
|
|
|
|
if ( parser.has( "help" ) || img1.size() != img2.size() || img1.size() != gt.size() || img1.size() == 0 )
|
|
{
|
|
std::cerr << "\nUsage: " << argv[0] << " [params] ImageFrom1 ImageTo1 GroundTruth1 ... ImageFromN ImageToN GroundTruthN\n" << std::endl;
|
|
parser.printMessage();
|
|
return 1;
|
|
}
|
|
|
|
Ptr< optflow::GPCForest< nTrees > > forest = optflow::GPCForest< nTrees >::create();
|
|
forest->train( img1, img2, gt, params );
|
|
forest->save( parser.get< String >( "forest" ) );
|
|
|
|
return 0;
|
|
}
|