PyCuAmpcor: offer an option to add gross offset to output offset image
parent
563568561d
commit
7c40da5a74
|
@ -170,11 +170,15 @@ def runDenseOffsetsGPU(self):
|
||||||
m = isceobj.createSlcImage()
|
m = isceobj.createSlcImage()
|
||||||
m.load(reference + '.xml')
|
m.load(reference + '.xml')
|
||||||
m.setAccessMode('READ')
|
m.setAccessMode('READ')
|
||||||
|
# re-create vrt in terms of merged full slc
|
||||||
|
m.renderHdr()
|
||||||
|
|
||||||
### Load the secondary object
|
### Load the secondary object
|
||||||
s = isceobj.createSlcImage()
|
s = isceobj.createSlcImage()
|
||||||
s.load(secondary + '.xml')
|
s.load(secondary + '.xml')
|
||||||
s.setAccessMode('READ')
|
s.setAccessMode('READ')
|
||||||
|
# re-create vrt in terms of merged full slc
|
||||||
|
s.renderHdr()
|
||||||
|
|
||||||
# get the dimension
|
# get the dimension
|
||||||
width = m.getWidth()
|
width = m.getWidth()
|
||||||
|
@ -244,6 +248,9 @@ def runDenseOffsetsGPU(self):
|
||||||
objOffset.snrImageName = os.path.join(self._insar.mergedDirname, self._insar.snrfile)
|
objOffset.snrImageName = os.path.join(self._insar.mergedDirname, self._insar.snrfile)
|
||||||
objOffset.covImageName = os.path.join(self._insar.mergedDirname, self._insar.covfile)
|
objOffset.covImageName = os.path.join(self._insar.mergedDirname, self._insar.covfile)
|
||||||
|
|
||||||
|
# merge gross offset to final offset
|
||||||
|
objOffset.mergeGrossOffset = 1
|
||||||
|
|
||||||
### print the settings
|
### print the settings
|
||||||
print('\nReference frame: %s' % (mf))
|
print('\nReference frame: %s' % (mf))
|
||||||
print('Secondary frame: %s' % (sf))
|
print('Secondary frame: %s' % (sf))
|
||||||
|
|
|
@ -89,6 +89,8 @@ def createParser():
|
||||||
help='Gross range offset (default: %(default)s).')
|
help='Gross range offset (default: %(default)s).')
|
||||||
gross.add_argument('--gf', '--gross-file', type=str, dest='gross_offset_file',
|
gross.add_argument('--gf', '--gross-file', type=str, dest='gross_offset_file',
|
||||||
help='Varying gross offset input file')
|
help='Varying gross offset input file')
|
||||||
|
gross.add_argument('--mg', '--merge-gross-offset', type=int, dest='merge_gross_offset', default=0,
|
||||||
|
help='Whether to merge gross offset to the output offset image (default: %(default)s).')
|
||||||
|
|
||||||
corr = parser.add_argument_group('Correlation surface')
|
corr = parser.add_argument_group('Correlation surface')
|
||||||
corr.add_argument('--corr-stat-size', type=int, dest='corr_stat_win_size', default=21,
|
corr.add_argument('--corr-stat-size', type=int, dest='corr_stat_win_size', default=21,
|
||||||
|
@ -238,6 +240,9 @@ def estimateOffsetField(reference, secondary, inps=None):
|
||||||
print("snr: ",objOffset.snrImageName)
|
print("snr: ",objOffset.snrImageName)
|
||||||
print("cov: ",objOffset.covImageName)
|
print("cov: ",objOffset.covImageName)
|
||||||
|
|
||||||
|
# whether to include the gross offset in offsetImage
|
||||||
|
objOffset.mergeGrossOffset = inps.merge_gross_offset
|
||||||
|
|
||||||
offsetImageName = objOffset.offsetImageName
|
offsetImageName = objOffset.offsetImageName
|
||||||
grossOffsetImageName = objOffset.grossOffsetImageName
|
grossOffsetImageName = objOffset.grossOffsetImageName
|
||||||
snrImageName = objOffset.snrImageName
|
snrImageName = objOffset.snrImageName
|
||||||
|
|
|
@ -87,6 +87,8 @@ cdef extern from "cuAmpcorParameter.h":
|
||||||
int *grossOffsetAcross ## Gross offsets between reference and secondary windows (across)
|
int *grossOffsetAcross ## Gross offsets between reference and secondary windows (across)
|
||||||
int grossOffsetDown0 ## constant gross offset (down)
|
int grossOffsetDown0 ## constant gross offset (down)
|
||||||
int grossOffsetAcross0 ## constant gross offset (across)
|
int grossOffsetAcross0 ## constant gross offset (across)
|
||||||
|
int mergeGrossOffset ## whether to merge gross offset to final offset
|
||||||
|
|
||||||
int referenceStartPixelDown0 ## the first pixel of reference image (down), be adjusted with margins and gross offset
|
int referenceStartPixelDown0 ## the first pixel of reference image (down), be adjusted with margins and gross offset
|
||||||
int referenceStartPixelAcross0 ## the first pixel of reference image (across)
|
int referenceStartPixelAcross0 ## the first pixel of reference image (across)
|
||||||
int *referenceChunkStartPixelDown ## array of starting pixels for all reference chunks (down)
|
int *referenceChunkStartPixelDown ## array of starting pixels for all reference chunks (down)
|
||||||
|
@ -337,6 +339,13 @@ cdef class PyCuAmpcor(object):
|
||||||
def offsetImageName(self, str a):
|
def offsetImageName(self, str a):
|
||||||
self.c_cuAmpcor.param.offsetImageName = <string> a.encode()
|
self.c_cuAmpcor.param.offsetImageName = <string> a.encode()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def mergeGrossOffset(self):
|
||||||
|
return self.c_cuAmpcor.param.mergeGrossOffset
|
||||||
|
@mergeGrossOffset.setter
|
||||||
|
def mergeGrossOffset(self, int a):
|
||||||
|
self.c_cuAmpcor.param.mergeGrossOffset = a
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def snrImageName(self):
|
def snrImageName(self):
|
||||||
return self.c_cuAmpcor.param.snrImageName.decode("utf-8")
|
return self.c_cuAmpcor.param.snrImageName.decode("utf-8")
|
||||||
|
|
|
@ -129,12 +129,32 @@ void cuAmpcorController::runAmpcor()
|
||||||
cuArraysCopyExtract(offsetImageRun, offsetImage, make_int2(0,0), streams[0]);
|
cuArraysCopyExtract(offsetImageRun, offsetImage, make_int2(0,0), streams[0]);
|
||||||
cuArraysCopyExtract(snrImageRun, snrImage, make_int2(0,0), streams[0]);
|
cuArraysCopyExtract(snrImageRun, snrImage, make_int2(0,0), streams[0]);
|
||||||
cuArraysCopyExtract(covImageRun, covImage, make_int2(0,0), streams[0]);
|
cuArraysCopyExtract(covImageRun, covImage, make_int2(0,0), streams[0]);
|
||||||
// save outputs to files
|
|
||||||
offsetImage->outputToFile(param->offsetImageName, streams[0]);
|
/* save the offsets and gross offsets */
|
||||||
|
// copy the offset to host
|
||||||
|
offsetImage->allocateHost();
|
||||||
|
offsetImage->copyToHost(streams[0]);
|
||||||
|
// construct the gross offset
|
||||||
|
cuArrays<float2> *grossOffsetImage = new cuArrays<float2>(param->numberWindowDown, param->numberWindowAcross);
|
||||||
|
grossOffsetImage->allocateHost();
|
||||||
|
for(int i=0; i< param->numberWindows; i++)
|
||||||
|
grossOffsetImage->hostData[i] = make_float2(param->grossOffsetDown[i], param->grossOffsetAcross[i]);
|
||||||
|
|
||||||
|
// check whether to merge gross offset
|
||||||
|
if (param->mergeGrossOffset)
|
||||||
|
{
|
||||||
|
// if merge, add the gross offsets to offset
|
||||||
|
for(int i=0; i< param->numberWindows; i++)
|
||||||
|
offsetImage->hostData[i] += grossOffsetImage->hostData[i];
|
||||||
|
}
|
||||||
|
// output both offset and gross offset
|
||||||
|
offsetImage->outputHostToFile(param->offsetImageName);
|
||||||
|
grossOffsetImage->outputHostToFile(param->grossOffsetImageName);
|
||||||
|
delete grossOffsetImage;
|
||||||
|
|
||||||
|
// save the snr/cov images
|
||||||
snrImage->outputToFile(param->snrImageName, streams[0]);
|
snrImage->outputToFile(param->snrImageName, streams[0]);
|
||||||
covImage->outputToFile(param->covImageName, streams[0]);
|
covImage->outputToFile(param->covImageName, streams[0]);
|
||||||
// also save the gross offsets
|
|
||||||
outputGrossOffsets();
|
|
||||||
|
|
||||||
// Delete arrays.
|
// Delete arrays.
|
||||||
delete offsetImage;
|
delete offsetImage;
|
||||||
|
@ -155,19 +175,4 @@ void cuAmpcorController::runAmpcor()
|
||||||
delete secondaryImage;
|
delete secondaryImage;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Output gross offset fields
|
|
||||||
*/
|
|
||||||
void cuAmpcorController::outputGrossOffsets()
|
|
||||||
{
|
|
||||||
cuArrays<float2> *grossOffsets = new cuArrays<float2>(param->numberWindowDown, param->numberWindowAcross);
|
|
||||||
grossOffsets->allocateHost();
|
|
||||||
|
|
||||||
for(int i=0; i< param->numberWindows; i++)
|
|
||||||
grossOffsets->hostData[i] = make_float2(param->grossOffsetDown[i], param->grossOffsetAcross[i]);
|
|
||||||
grossOffsets->outputHostToFile(param->grossOffsetImageName);
|
|
||||||
delete grossOffsets;
|
|
||||||
}
|
|
||||||
|
|
||||||
// end of file
|
// end of file
|
||||||
|
|
|
@ -27,8 +27,6 @@ public:
|
||||||
~cuAmpcorController();
|
~cuAmpcorController();
|
||||||
// run interface
|
// run interface
|
||||||
void runAmpcor();
|
void runAmpcor();
|
||||||
// output gross offsets
|
|
||||||
void outputGrossOffsets();
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,8 @@ cuAmpcorParameter::cuAmpcorParameter()
|
||||||
useMmap = 1; // use mmap
|
useMmap = 1; // use mmap
|
||||||
mmapSizeInGB = 1;
|
mmapSizeInGB = 1;
|
||||||
|
|
||||||
|
mergeGrossOffset = 0; // default to separate gross offset
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -112,6 +112,7 @@ public:
|
||||||
int grossOffsetAcross0; ///< gross offset static component (across)
|
int grossOffsetAcross0; ///< gross offset static component (across)
|
||||||
int *grossOffsetDown; ///< Gross offsets between reference and secondary windows (down)
|
int *grossOffsetDown; ///< Gross offsets between reference and secondary windows (down)
|
||||||
int *grossOffsetAcross; ///< Gross offsets between reference and secondary windows (across)
|
int *grossOffsetAcross; ///< Gross offsets between reference and secondary windows (across)
|
||||||
|
int mergeGrossOffset; ///< whether to merge gross offsets into the final offsets
|
||||||
|
|
||||||
int *referenceChunkStartPixelDown; ///< reference starting pixels for each chunk (down)
|
int *referenceChunkStartPixelDown; ///< reference starting pixels for each chunk (down)
|
||||||
int *referenceChunkStartPixelAcross; ///< reference starting pixels for each chunk (across)
|
int *referenceChunkStartPixelAcross; ///< reference starting pixels for each chunk (across)
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// my module dependencies
|
||||||
#include "cuAmpcorUtil.h"
|
#include "cuAmpcorUtil.h"
|
||||||
|
// for FLT_MAX
|
||||||
#include <cfloat>
|
#include <cfloat>
|
||||||
|
|
||||||
// find the max between two elements
|
// find the max between two elements
|
||||||
|
@ -254,6 +256,7 @@ void cuDetermineSecondaryExtractOffset(cuArrays<int2> *maxLoc, cuArrays<int2> *m
|
||||||
int blockspergrid=IDIVUP(maxLoc->size, threadsperblock);
|
int blockspergrid=IDIVUP(maxLoc->size, threadsperblock);
|
||||||
cudaKernel_determineSecondaryExtractOffset<<<blockspergrid, threadsperblock, 0, stream>>>
|
cudaKernel_determineSecondaryExtractOffset<<<blockspergrid, threadsperblock, 0, stream>>>
|
||||||
(maxLoc->devData, maxLocShift->devData, maxLoc->size, xOldRange, yOldRange, xNewRange, yNewRange);
|
(maxLoc->devData, maxLocShift->devData, maxLoc->size, xOldRange, yOldRange, xNewRange, yNewRange);
|
||||||
|
getLastCudaError("cuDetermineSecondaryExtractOffset");
|
||||||
}
|
}
|
||||||
|
|
||||||
// end of file
|
// end of file
|
||||||
|
|
Loading…
Reference in New Issue