#include "lsgrmController.h" namespace lsgrm { template Controller::Controller() { m_Memory = 0; m_ImageDivisionActivated = true; } template Controller::~Controller() { } template void Controller::RunSegmentation() { // Rajouter un if pour vérifier si l'utilisateur a enclenché la procédure automatique if(m_Memory < 1) { this->GetAutomaticConfiguration(); } if(m_ImageDivisionActivated) { // Compute the splitting scheme SplitOTBImage(m_InputImage, m_TileWidth, m_TileHeight, m_Margin, m_NumberOfFirstIterations, m_NbTilesX, m_NbTilesY, m_Tiles); // // Boolean indicating if there are remaining fusions // bool isFusion = false; // // // Run first partial segmentation // boost::timer t; t.restart(); // auto accumulatedMemory = RunFirstPartialSegmentation( // m_InputImage, // m_SpecificParameters, // m_Threshold, // m_NumberOfFirstIterations, // 3, // m_Tiles, // m_TileDirectory, // m_NbTilesX, // m_NbTilesY, // m_Margin, // m_TileWidth, // m_TileHeight, // m_InputImage->GetLargestPossibleRegion().GetSize()[0], // m_InputImage->GetLargestPossibleRegion().GetSize()[1], // m_TemporaryDirectory, // isFusion); // // // Gathering useful variables // GatherUsefulVariables(accumulatedMemory, isFusion); // // // Time monitoring // ShowTime(t); // // while(accumulatedMemory > m_Memory && isFusion) // { // // isFusion = false; // accumulatedMemory = RunPartialSegmentation(m_SpecificParameters, // m_Threshold, // 3, // m_Tiles, // m_TemporaryDirectory, // m_NbTilesX, // m_NbTilesY, // m_TileWidth, // m_TileHeight, // m_InputImage->GetLargestPossibleRegion().GetSize()[0], // m_InputImage->GetLargestPossibleRegion().GetSize()[1], // m_InputImage->GetNumberOfComponentsPerPixel(), // isFusion); // // // Gathering useful variables // GatherUsefulVariables(accumulatedMemory, isFusion); // // // Time monitoring // ShowTime(t); // } // // //#ifdef OTB_USE_MPI // if (otb::MPIConfig::Instance()->GetMyRank() != 0) // return; //#endif // // if(accumulatedMemory <= m_Memory) if (true) { // Merge all the graphs MergeAllGraphsAndAchieveSegmentation( m_SpecificParameters, m_Threshold, m_Tiles, m_TemporaryDirectory, m_NbTilesX, m_NbTilesY, m_TileWidth, m_TileHeight, m_InputImage->GetLargestPossibleRegion().GetSize()[0], m_InputImage->GetLargestPossibleRegion().GetSize()[1], m_InputImage->GetNumberOfComponentsPerPixel(), m_OutputGraphDirectory); // ShowTime(t); } else { // That means there are no more possible fusions but we can not store the ouput graph // Todo do not clean up temporary directory before copying resulting graph to the output directory // In the output directory add an info file to give the number of tiles. } } else { //TODO: use classic GRM } } template void Controller::GetAutomaticConfiguration() { m_Memory = getMemorySize(); assert(m_Memory > 0); m_Memory /= 2; // For safety and can prevent out of memory troubles // Compute the size of an initial segment using NodeType = typename TSegmenter::NodeType; using NodePointer = typename TSegmenter::NodePointerType; using EdgeType = typename TSegmenter::EdgeType; // long long unsigned int sizePerNode = sizeof(NodePointer) + sizeof(NodeType) + 1 + 4 *(sizeof(EdgeType) + sizeof(float)); // last term is specific to BS. long long unsigned int sizePerNode = sizeof(NodePointer); sizePerNode += sizeof(NodeType) + 1; sizePerNode += sizeof(float) * m_InputImage->GetNumberOfComponentsPerPixel(); //Specific to BS: means, squeredMeans, spectralSums, stds sizePerNode += 4 * (sizeof(EdgeType) + sizeof(float)); // 4 neighbors long unsigned int maximumNumberOfNodes = std::ceil(m_Memory / sizePerNode); unsigned int tileDimension = std::sqrt(maximumNumberOfNodes); // Compute the stability margin. The naive strategy consider a margin value and a stable size equal. unsigned int niter = 1; unsigned int maxMargin = tileDimension/2; unsigned int currMargin = static_cast(pow(2, niter + 1) - 2); unsigned int prevMargin = currMargin; while(currMargin < maxMargin) { prevMargin = currMargin; niter++; currMargin = static_cast(pow(2, niter + 1) - 2); } m_TileWidth = tileDimension - prevMargin; m_TileHeight = m_TileWidth; m_Margin = prevMargin; m_NumberOfFirstIterations = niter - 1; std::cerr << "Configuration: \n" << "Available RAM: " << m_Memory << "\n" << "Max. number of nodes: " << maximumNumberOfNodes << "\n" << "Max. tile dimension: " << tileDimension << "\n" << "Nb. iter: " << niter << "\n" << "Margin: " << prevMargin << "\n" << "Tile size: " << m_TileWidth << " x " << m_TileHeight << std::endl; } template void Controller::SetInternalMemoryAvailable(long long unsigned int v) // expecting a value in Mbytes. { assert(v > 0); m_Memory = v * 1024ul * 1024ul; } template void Controller::SetImageDivision(bool f) { m_ImageDivisionActivated = f; } template void Controller::SetInputImage(ImageType * inputImage) { m_InputImage = inputImage; } template void Controller::SetOutputGraphDirectory(const std::string& str) { m_OutputGraphDirectory = str; } template void Controller::SetTileDirectory(const std::string& str) { m_TileDirectory = str; } template void Controller::SetTemporaryDirectory(const std::string& str) { m_TemporaryDirectory = str; } template void Controller::SetTileWidth(const unsigned int v) { m_TileWidth = v; } template void Controller::SetTileHeight(const unsigned int v) { m_TileHeight = v; } template void Controller::SetNumberOfFirstIterations(const unsigned int v) { m_NumberOfFirstIterations = v; m_Margin = static_cast(pow(2, m_NumberOfFirstIterations + 1) - 2);// 2^{n+1}-2 } template void Controller::SetSpecificParameters(const SegmentationParameterType& params) { m_SpecificParameters = params; } template void Controller::SetThreshold(const float& t) { m_Threshold = t; } } // end of namespace lsgrm