|
@@ -27,14 +27,8 @@ from PIL import Image
|
|
|
from joblib import load
|
|
|
|
|
|
import paddlers
|
|
|
+import paddlers.transforms.functions as F
|
|
|
import paddlers.transforms.indices as indices
|
|
|
-from .functions import (
|
|
|
- normalize, horizontal_flip, permute, vertical_flip, center_crop, is_poly,
|
|
|
- horizontal_flip_poly, horizontal_flip_rle, vertical_flip_poly,
|
|
|
- vertical_flip_rle, crop_poly, crop_rle, expand_poly, expand_rle,
|
|
|
- resize_poly, resize_rle, dehaze, select_bands, to_intensity, to_uint8,
|
|
|
- img_flip, img_simple_rotate, decode_seg_mask, calc_hr_shape,
|
|
|
- match_by_regression, match_histograms)
|
|
|
|
|
|
__all__ = [
|
|
|
"Compose",
|
|
@@ -243,7 +237,7 @@ class DecodeImg(Transform):
|
|
|
raise IOError('Cannot open', img_path)
|
|
|
im_data = dataset.ReadAsArray()
|
|
|
if im_data.ndim == 2 and self.decode_sar:
|
|
|
- im_data = to_intensity(im_data)
|
|
|
+ im_data = F.to_intensity(im_data)
|
|
|
im_data = im_data[:, :, np.newaxis]
|
|
|
else:
|
|
|
if im_data.ndim == 3:
|
|
@@ -287,7 +281,7 @@ class DecodeImg(Transform):
|
|
|
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
|
|
|
|
|
if self.to_uint8:
|
|
|
- image = to_uint8(image)
|
|
|
+ image = F.to_uint8(image)
|
|
|
|
|
|
if self.read_geo_info:
|
|
|
return image, geo_info_dict
|
|
@@ -442,15 +436,15 @@ class Resize(Transform):
|
|
|
im_scale_x, im_scale_y = scale
|
|
|
resized_segms = []
|
|
|
for segm in segms:
|
|
|
- if is_poly(segm):
|
|
|
+ if F.is_poly(segm):
|
|
|
# Polygon format
|
|
|
resized_segms.append([
|
|
|
- resize_poly(poly, im_scale_x, im_scale_y) for poly in segm
|
|
|
+ F.resize_poly(poly, im_scale_x, im_scale_y) for poly in segm
|
|
|
])
|
|
|
else:
|
|
|
# RLE format
|
|
|
resized_segms.append(
|
|
|
- resize_rle(segm, im_h, im_w, im_scale_x, im_scale_y))
|
|
|
+ F.resize_rle(segm, im_h, im_w, im_scale_x, im_scale_y))
|
|
|
|
|
|
return resized_segms
|
|
|
|
|
@@ -495,7 +489,7 @@ class Resize(Transform):
|
|
|
# For SR tasks
|
|
|
sample['target'] = self.apply_im(
|
|
|
sample['target'], interp,
|
|
|
- calc_hr_shape(target_size, sample['sr_factor']))
|
|
|
+ F.calc_hr_shape(target_size, sample['sr_factor']))
|
|
|
else:
|
|
|
# For non-SR tasks
|
|
|
sample['target'] = self.apply_im(sample['target'], interp,
|
|
@@ -692,16 +686,16 @@ class RandomFlipOrRotate(Transform):
|
|
|
|
|
|
def apply_im(self, image, mode_id, flip_mode=True):
|
|
|
if flip_mode:
|
|
|
- image = img_flip(image, mode_id)
|
|
|
+ image = F.img_flip(image, mode_id)
|
|
|
else:
|
|
|
- image = img_simple_rotate(image, mode_id)
|
|
|
+ image = F.img_simple_rotate(image, mode_id)
|
|
|
return image
|
|
|
|
|
|
def apply_mask(self, mask, mode_id, flip_mode=True):
|
|
|
if flip_mode:
|
|
|
- mask = img_flip(mask, mode_id)
|
|
|
+ mask = F.img_flip(mask, mode_id)
|
|
|
else:
|
|
|
- mask = img_simple_rotate(mask, mode_id)
|
|
|
+ mask = F.img_simple_rotate(mask, mode_id)
|
|
|
return mask
|
|
|
|
|
|
def apply_bbox(self, bbox, mode_id, flip_mode=True):
|
|
@@ -817,11 +811,11 @@ class RandomHorizontalFlip(Transform):
|
|
|
self.prob = prob
|
|
|
|
|
|
def apply_im(self, image):
|
|
|
- image = horizontal_flip(image)
|
|
|
+ image = F.horizontal_flip(image)
|
|
|
return image
|
|
|
|
|
|
def apply_mask(self, mask):
|
|
|
- mask = horizontal_flip(mask)
|
|
|
+ mask = F.horizontal_flip(mask)
|
|
|
return mask
|
|
|
|
|
|
def apply_bbox(self, bbox, width):
|
|
@@ -834,13 +828,13 @@ class RandomHorizontalFlip(Transform):
|
|
|
def apply_segm(self, segms, height, width):
|
|
|
flipped_segms = []
|
|
|
for segm in segms:
|
|
|
- if is_poly(segm):
|
|
|
+ if F.is_poly(segm):
|
|
|
# Polygon format
|
|
|
flipped_segms.append(
|
|
|
- [horizontal_flip_poly(poly, width) for poly in segm])
|
|
|
+ [F.horizontal_flip_poly(poly, width) for poly in segm])
|
|
|
else:
|
|
|
# RLE format
|
|
|
- flipped_segms.append(horizontal_flip_rle(segm, height, width))
|
|
|
+ flipped_segms.append(F.horizontal_flip_rle(segm, height, width))
|
|
|
return flipped_segms
|
|
|
|
|
|
def apply(self, sample):
|
|
@@ -877,11 +871,11 @@ class RandomVerticalFlip(Transform):
|
|
|
self.prob = prob
|
|
|
|
|
|
def apply_im(self, image):
|
|
|
- image = vertical_flip(image)
|
|
|
+ image = F.vertical_flip(image)
|
|
|
return image
|
|
|
|
|
|
def apply_mask(self, mask):
|
|
|
- mask = vertical_flip(mask)
|
|
|
+ mask = F.vertical_flip(mask)
|
|
|
return mask
|
|
|
|
|
|
def apply_bbox(self, bbox, height):
|
|
@@ -894,13 +888,13 @@ class RandomVerticalFlip(Transform):
|
|
|
def apply_segm(self, segms, height, width):
|
|
|
flipped_segms = []
|
|
|
for segm in segms:
|
|
|
- if is_poly(segm):
|
|
|
+ if F.is_poly(segm):
|
|
|
# Polygon format
|
|
|
flipped_segms.append(
|
|
|
- [vertical_flip_poly(poly, height) for poly in segm])
|
|
|
+ [F.vertical_flip_poly(poly, height) for poly in segm])
|
|
|
else:
|
|
|
# RLE format
|
|
|
- flipped_segms.append(vertical_flip_rle(segm, height, width))
|
|
|
+ flipped_segms.append(F.vertical_flip_rle(segm, height, width))
|
|
|
return flipped_segms
|
|
|
|
|
|
def apply(self, sample):
|
|
@@ -978,7 +972,7 @@ class Normalize(Transform):
|
|
|
mean = np.asarray(
|
|
|
self.mean, dtype=np.float32)[np.newaxis, np.newaxis, :]
|
|
|
std = np.asarray(self.std, dtype=np.float32)[np.newaxis, np.newaxis, :]
|
|
|
- image = normalize(image, mean, std, self.min_val, self.max_val)
|
|
|
+ image = F.normalize(image, mean, std, self.min_val, self.max_val)
|
|
|
return image
|
|
|
|
|
|
def apply(self, sample):
|
|
@@ -1007,12 +1001,12 @@ class CenterCrop(Transform):
|
|
|
self.crop_size = crop_size
|
|
|
|
|
|
def apply_im(self, image):
|
|
|
- image = center_crop(image, self.crop_size)
|
|
|
+ image = F.center_crop(image, self.crop_size)
|
|
|
|
|
|
return image
|
|
|
|
|
|
def apply_mask(self, mask):
|
|
|
- mask = center_crop(mask, self.crop_size)
|
|
|
+ mask = F.center_crop(mask, self.crop_size)
|
|
|
return mask
|
|
|
|
|
|
def apply(self, sample):
|
|
@@ -1159,12 +1153,12 @@ class RandomCrop(Transform):
|
|
|
crop_segms = []
|
|
|
for id in valid_ids:
|
|
|
segm = segms[id]
|
|
|
- if is_poly(segm):
|
|
|
+ if F.is_poly(segm):
|
|
|
# Polygon format
|
|
|
- crop_segms.append(crop_poly(segm, crop))
|
|
|
+ crop_segms.append(F.crop_poly(segm, crop))
|
|
|
else:
|
|
|
# RLE format
|
|
|
- crop_segms.append(crop_rle(segm, crop, height, width))
|
|
|
+ crop_segms.append(F.crop_rle(segm, crop, height, width))
|
|
|
|
|
|
return crop_segms
|
|
|
|
|
@@ -1196,7 +1190,7 @@ class RandomCrop(Transform):
|
|
|
delete_id = list()
|
|
|
valid_polys = list()
|
|
|
for idx, poly in enumerate(crop_polys):
|
|
|
- if not crop_poly:
|
|
|
+ if not poly:
|
|
|
delete_id.append(idx)
|
|
|
else:
|
|
|
valid_polys.append(poly)
|
|
@@ -1231,7 +1225,7 @@ class RandomCrop(Transform):
|
|
|
if 'sr_factor' in sample:
|
|
|
sample['target'] = self.apply_im(
|
|
|
sample['target'],
|
|
|
- calc_hr_shape(crop_box, sample['sr_factor']))
|
|
|
+ F.calc_hr_shape(crop_box, sample['sr_factor']))
|
|
|
else:
|
|
|
sample['target'] = self.apply_im(sample['image'], crop_box)
|
|
|
|
|
@@ -1393,14 +1387,14 @@ class Pad(Transform):
|
|
|
h, w = size
|
|
|
expanded_segms = []
|
|
|
for segm in segms:
|
|
|
- if is_poly(segm):
|
|
|
+ if F.is_poly(segm):
|
|
|
# Polygon format
|
|
|
expanded_segms.append(
|
|
|
- [expand_poly(poly, x, y) for poly in segm])
|
|
|
+ [F.expand_poly(poly, x, y) for poly in segm])
|
|
|
else:
|
|
|
# RLE format
|
|
|
expanded_segms.append(
|
|
|
- expand_rle(segm, x, y, height, width, h, w))
|
|
|
+ F.expand_rle(segm, x, y, height, width, h, w))
|
|
|
return expanded_segms
|
|
|
|
|
|
def _get_offsets(self, im_h, im_w, h, w):
|
|
@@ -1450,7 +1444,7 @@ class Pad(Transform):
|
|
|
sample['gt_poly'], offsets, im_size=[im_h, im_w], size=[h, w])
|
|
|
if 'target' in sample:
|
|
|
if 'sr_factor' in sample:
|
|
|
- hr_shape = calc_hr_shape((h, w), sample['sr_factor'])
|
|
|
+ hr_shape = F.calc_hr_shape((h, w), sample['sr_factor'])
|
|
|
hr_offsets = self._get_offsets(*sample['target'].shape[:2],
|
|
|
*hr_shape)
|
|
|
sample['target'] = self.apply_im(sample['target'], hr_offsets,
|
|
@@ -1757,7 +1751,7 @@ class Dehaze(Transform):
|
|
|
self.gamma = gamma
|
|
|
|
|
|
def apply_im(self, image):
|
|
|
- image = dehaze(image, self.gamma)
|
|
|
+ image = F.dehaze(image, self.gamma)
|
|
|
return image
|
|
|
|
|
|
def apply(self, sample):
|
|
@@ -1819,7 +1813,7 @@ class SelectBand(Transform):
|
|
|
self.apply_to_tar = apply_to_tar
|
|
|
|
|
|
def apply_im(self, image):
|
|
|
- image = select_bands(image, self.band_list)
|
|
|
+ image = F.select_bands(image, self.band_list)
|
|
|
return image
|
|
|
|
|
|
def apply(self, sample):
|
|
@@ -1944,10 +1938,10 @@ class RandomSwap(Transform):
|
|
|
|
|
|
class ReloadMask(Transform):
|
|
|
def apply(self, sample):
|
|
|
- sample['mask'] = decode_seg_mask(sample['mask_ori'])
|
|
|
+ sample['mask'] = F.decode_seg_mask(sample['mask_ori'])
|
|
|
if 'aux_masks' in sample:
|
|
|
sample['aux_masks'] = list(
|
|
|
- map(decode_seg_mask, sample['aux_masks_ori']))
|
|
|
+ map(F.decode_seg_mask, sample['aux_masks_ori']))
|
|
|
return sample
|
|
|
|
|
|
|
|
@@ -1987,18 +1981,21 @@ class MatchRadiance(Transform):
|
|
|
|
|
|
Args:
|
|
|
method (str, optional): Method used to match the radiance of the
|
|
|
- bi-temporal images. Choices are {'hist', 'lsr'}. 'hist' stands
|
|
|
- for histogram matching and 'lsr' stands for least-squares
|
|
|
- regression. Default: 'hist'.
|
|
|
+ bi-temporal images. Choices are {'hist', 'lsr', 'fft}. 'hist'
|
|
|
+ stands for histogram matching, 'lsr' stands for least-squares
|
|
|
+ regression, and 'fft' replaces the low-frequency components of
|
|
|
+ the image to match the reference image. Default: 'hist'.
|
|
|
"""
|
|
|
|
|
|
def __init__(self, method='hist'):
|
|
|
super(MatchRadiance, self).__init__()
|
|
|
|
|
|
if method == 'hist':
|
|
|
- self._match_func = match_histograms
|
|
|
+ self._match_func = F.match_histograms
|
|
|
elif method == 'lsr':
|
|
|
- self._match_func = match_by_regression
|
|
|
+ self._match_func = F.match_by_regression
|
|
|
+ elif method == 'fft':
|
|
|
+ self._match_func = F.match_lf_components
|
|
|
else:
|
|
|
raise ValueError(
|
|
|
"{} is not a supported radiometric correction method.".format(
|