I am trying to follow this Tutorial but on a different country. I am currently having a problem with the cloud masks. I tried to visualize the different cloud masks of different patches at different dates, but I always end up with the same purple patch as a cloud mask (and not the actual mask) despite the presence of clouds in my data. This is an example:
and this is the valid pixel count plot:
This is the time interval :
time_interval = ['2019-01-01', '2019-12-31']
This is the code I used to download the images:
class SentinelHubValidData: """ Combine Sen2Cor's classification map with `IS_DATA` to define a `VALID_DATA_SH` mask The SentinelHub's cloud mask is asumed to be found in eopatch.mask['CLM'] """ def __call__(self, eopatch): return np.logical_and(eopatch.mask['IS_DATA'].astype(np.bool), np.logical_not(eopatch.mask['CLM'].astype(np.bool))) class CountValid(EOTask): """ The task counts number of valid observations in time-series and stores the results in the timeless mask. """ def __init__(self, count_what, feature_name): self.what = count_what self.name = feature_name def execute(self, eopatch): eopatch.add_feature(FeatureType.MASK_TIMELESS, self.name, np.count_nonzero(eopatch.mask[self.what],axis=0)) return eopatch # Correspond to [coastal aerosol, B, G, R, vegetation red edge1,vegetation red edge2,vegetation red edge3, NIR, vegetation red edge4, water vapor, SWIR1, SWIR2] wavelengths BANDS-S2-L2A band_names=['B01','B02','B03','B04','B05','B06','B07','B08','B8A','B09','B11','B12'] # TASK FOR BAND DATA # add a request for S2 bands (downloading the data from the configurator) # s2cloudless masks and probabilities are requested via additional data add_data = SentinelHubInputTask( bands_feature=(FeatureType.DATA, 'BANDS'), bands = band_names, resolution=10, maxcc=0.1, time_difference=datetime.timedelta(minutes=120), data_source=DataSource.SENTINEL2_L2A, additional_data=[(FeatureType.MASK, 'dataMask', 'IS_DATA'), (FeatureType.MASK, 'CLM'), (FeatureType.DATA, 'CLP')]) # TASK FOR VALID MASK # validate pixels using SentinelHub's cloud detection mask and region of acquisition add_sh_valmask = AddValidDataMaskTask(SentinelHubValidData(), 'VALID_DATA' # name of output mask ) # TASK FOR COUNTING VALID PIXELS # count number of valid observations per pixel using valid data mask count_val_sh = CountValid('VALID_DATA', # name of existing mask 'VALID_COUNT' # name of output scalar )
Edit: I am guessing that my request to download the masks was not that of S2Cloudless, thus I tried the following:
cloud_classifier = get_s2_pixel_cloud_detector(average_over=2, dilation_size=1, all_bands=True) add_clm = AddCloudMaskTask(cloud_classifier, 'BANDS', cm_size_y='80m', cm_size_x='80m', cmask_feature='CLM', # cloud mask name cprobs_feature='CLP' # cloud prob. map name )
However, I got this error:
What is the right service type to do it then?
I have also tried this:
band_names=['B01','B02','B03','B04','B05','B06','B07','B08','B8A','B09','B11','B12'] add_data = SentinelHubInputTask( bands_feature=(FeatureType.DATA, 'BANDS'), bands = band_names, resolution=10, maxcc=0.1, time_difference=datetime.timedelta(minutes=120), data_source=DataSource.SENTINEL2_L2A, additional_data=[(FeatureType.MASK, 'dataMask', 'IS_DATA')],) # (FeatureType.MASK, 'CLM'), # 0 (no clouds), 1 (clouds), 255 (no data) # (FeatureType.DATA, 'CLP')]) # 0–255 (divide by 255 to get to the [0-1] range) # TASK FOR CLOUD INFO # cloud detection is performed at 160m resolution # and the resulting cloud probability map and mask # are scaled to EOPatch's resolution add_clm = AddMultiCloudMaskTask(data_feature='BANDS', all_bands=True, processing_resolution=160, mono_features=('CLP', 'CLM'), mask_feature=None, average_over=16, dilation_size=8)
and I got this error:
which to be honest I don’t get because my band array is of size (28,500,500,12) according to the logs.
Any kind of help would be highly appreciated.