Commit 4934c345 authored by Gaetano Raffaele's avatar Gaetano Raffaele
Browse files

Working on the resume option to resume segmentation after fail or abort.

parent e22de7db
......@@ -112,8 +112,17 @@ private:
AddChoice("tiling.none", "No tiling layout");
AddParameter(ParameterType_Int, "memory", "Restrict memory use (mb)");
MandatoryOff("memory");
AddParameter(ParameterType_Bool, "resume", "Activate resume mode");
SetDefaultParameterBool("resume", false);
AddParameter(ParameterType_Int, "resume.tilerow", "Starting tile row in resume mode");
AddParameter(ParameterType_Int, "resume.tilecol", "Starting tile column in resume mode");
SetDefaultParameterInt("resume.tilerow", 0);
SetDefaultParameterInt("resume.tilecol", 0);
//MandatoryOff("resume");
//MandatoryOff("resume.tilex");
//MandatoryOff("resume.tiley");
}
void DoUpdateParameters()
......@@ -224,6 +233,12 @@ private:
otbAppLogINFO("Setting maximum memory to " << GetParameterInt("memory") << " MBytes");
controller->SetInternalMemoryAvailable(GetParameterInt("memory"));
}
// Resume mode?
if (GetParameterBool("resume"))
{
controller.SetResumingMode(GetParameterInt("resume.tilerow"),GetParameterInt("resume.tilecol"));
}
// Run the segmentation
controller->RunSegmentation();
......
......@@ -44,6 +44,9 @@ public:
void SetSpecificParameters(const SegmentationParameterType& params);
void SetInputImage(ImageType * inputImage);
void SetInternalMemoryAvailable(long long unsigned int v); // expecting a value in Mbytes.
void SetResumingMode(unsigned int rRow, unsigned int rCol);
void StopResumingMode();
/* Accessors */
void SetTilingModeNone(){m_TilingMode = LSGRM_TILING_NONE; Modified();};
......@@ -114,6 +117,10 @@ private:
unsigned int m_NumberOfFirstIterations; // number of iterations in the first step
unsigned int m_TileWidth; // regular tile width (i.e. not left tiles)
unsigned int m_TileHeight; // regular tile height (i.e. not bottom tiles)
bool m_Resuming; // True if in resuming mode
unsigned int m_ResumeTileRow; // X index of starting tile in resume mode
unsigned int m_ResumeTileCol; // Y index of starting tile in resume mode
/* read-only variables */
LSGRMTilingMode m_TilingMode; // tiling mode (none/user/auto)
......
......@@ -18,6 +18,9 @@ Controller<TSegmenter>::Controller()
m_NbTilesY = 0;
m_Threshold = 75;
m_Memory = 0;
m_Resuming = false;
m_ResumeTileRow = 0;
m_ResumeTileCol = 0;
}
......@@ -122,7 +125,12 @@ void Controller<TSegmenter>::RunSegmentation()
m_InputImage->GetLargestPossibleRegion().GetSize()[0],
m_InputImage->GetLargestPossibleRegion().GetSize()[1],
m_InputImage->GetNumberOfComponentsPerPixel(),
isFusion);
isFusion,
m_Resuming,
m_ResumeTileRow,
m_ResumeTileCol);
if (m_Resuming) StopResumingMode();
#ifdef OTB_USE_MPI
GatherUsefulVariables(accumulatedMemory, isFusion);
......@@ -461,5 +469,13 @@ std::vector<std::string> Controller<TSegmenter>::GetTemporaryFilesList()
return list;
}
template<class TSegmenter>
void Controller<TSegmenter>::SetResumingMode(unsigned int rX, unsigned int rY)
{
m_Resuming = true;
m_ResumeTileX = rx;
m_ResumeTileY = ry;
}
} // end of namespace lsgrm
#endif
......@@ -68,7 +68,10 @@ long long unsigned int RunPartialSegmentation(
const unsigned int imageWidth,
const unsigned int imageHeight,
const unsigned int imageBands,
bool& isFusion);
bool& isFusion,
bool resume = false,
unsigned int rRow = 0,
unsigned int rCol = 0);
template<class TSegmenter>
void RemoveUselessNodes(ProcessingTile& tile,
......
......@@ -138,7 +138,10 @@ long long unsigned int RunPartialSegmentation(const typename TSegmenter::ParamTy
const unsigned int imageWidth,
const unsigned int imageHeight,
const unsigned int imageBands,
bool& isFusion)
bool& isFusion,
bool resume,
unsigned int rRow,
unsigned int rCol)
{
long long unsigned int accumulatedMemory = 0;
isFusion = false;
......@@ -155,6 +158,18 @@ long long unsigned int RunPartialSegmentation(const typename TSegmenter::ParamTy
if (MyTurn(row*nbTilesX + col))
#endif
{
// If resume mode, get accumulated memory on previous tiles
if (resume && (row*nbTilesX+col) < (rRow*nbTilesX+rCol) ) {
// Load the graph
std::cout << "\tResuming graph..." << std::endl;
TSegmenter segmenter;
ReadGraph<TSegmenter>(segmenter.m_Graph, currentTile.nodeFileName, currentTile.edgeFileName);
// Retrieve the amount of memory to store this graph
std::cout << "\tGet graph memory..." << std::endl;
accumulatedMemory += segmenter.GetGraphMemory();
continue;
}
// Get the current tile
std::cout << "Processing tile " << row << ", " << col << std::endl;
ProcessingTile currentTile = tiles[row*nbTilesX + col];
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment