From 7292c3575e7d325cb2c66c45210b3fcab059a96c Mon Sep 17 00:00:00 2001 From: sugarme Date: Sat, 22 May 2021 21:02:22 +1000 Subject: [PATCH] added image augmentation and minor fixed on ts.Lstsq --- CHANGELOG.md | 3 + example/augmentation/README.md | 31 + example/augmentation/bb.png | Bin 0 -> 271280 bytes example/augmentation/main.go | 69 ++ example/augmentation/output/.gitignore | 3 + example/augmentation/output/README.md | 1 + tensor/patch.go | 2 +- vision/aug/affine.go | 185 +++ vision/aug/blur.go | 89 ++ vision/aug/color.go | 77 ++ vision/aug/contrast.go | 43 + vision/aug/crop.go | 124 ++ vision/aug/cutout.go | 177 +++ vision/aug/equalize.go | 46 + vision/aug/flip.go | 78 ++ vision/aug/function.go | 1514 ++++++++++++++++++++++++ vision/aug/grayscale.go | 81 ++ vision/aug/invert.go | 39 + vision/aug/normalize.go | 91 ++ vision/aug/pad.go | 1 + vision/aug/perspective.go | 190 +++ vision/aug/posterize.go | 77 ++ vision/aug/resize.go | 39 + vision/aug/rotate.go | 109 ++ vision/aug/sharpness.go | 74 ++ vision/aug/solarize.go | 79 ++ vision/aug/transform.go | 188 +++ 27 files changed, 3409 insertions(+), 1 deletion(-) create mode 100644 example/augmentation/README.md create mode 100644 example/augmentation/bb.png create mode 100644 example/augmentation/main.go create mode 100644 example/augmentation/output/.gitignore create mode 100644 example/augmentation/output/README.md create mode 100644 vision/aug/affine.go create mode 100644 vision/aug/blur.go create mode 100644 vision/aug/color.go create mode 100644 vision/aug/contrast.go create mode 100644 vision/aug/crop.go create mode 100644 vision/aug/cutout.go create mode 100644 vision/aug/equalize.go create mode 100644 vision/aug/flip.go create mode 100644 vision/aug/function.go create mode 100644 vision/aug/grayscale.go create mode 100644 vision/aug/invert.go create mode 100644 vision/aug/normalize.go create mode 100644 vision/aug/pad.go create mode 100644 vision/aug/perspective.go create mode 100644 vision/aug/posterize.go create mode 100644 vision/aug/resize.go create mode 100644 vision/aug/rotate.go create mode 100644 vision/aug/sharpness.go create mode 100644 vision/aug/solarize.go create mode 100644 vision/aug/transform.go diff --git a/CHANGELOG.md b/CHANGELOG.md index ace57f7..12e7217 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] + +## [0.3.9] - [#24], [#26]: fixed memory leak. - [#30]: fixed varstore.Save() randomly panic - segmentfault - [#32]: nn.Seq Forward return nil tensor if length of layers = 1 +- [#36]: resolved image augmentation ## [0.3.8] diff --git a/example/augmentation/README.md b/example/augmentation/README.md new file mode 100644 index 0000000..f20d32e --- /dev/null +++ b/example/augmentation/README.md @@ -0,0 +1,31 @@ +# Image Augmentation Example + +This example demonstrates how to use image augmentation functions. It is implemented as similar as possible to [original Pytorch vision/transform](https://pytorch.org/vision/stable/transforms.html#). + +There are 2 APIs (`aug.Compose` and `aug.OneOf`) to compose augmentation methods as shown in the example: + +```go + t, err := aug.Compose( + aug.WithRandomVFlip(0.5), + aug.WithRandomHFlip(0.5), + aug.WithRandomCutout(), + aug.OneOf( + 0.3, + aug.WithColorJitter(0.3, 0.3, 0.3, 0.4), + aug.WithRandomGrayscale(1.0), + ), + aug.OneOf( + 0.3, + aug.WithGaussianBlur([]int64{5, 5}, []float64{1.0, 2.0}), + aug.WithRandomAffine(), + ), + ) + if err != nil { + panic(err) + } + + out := t.Transform(imgTs) +``` + + + diff --git a/example/augmentation/bb.png b/example/augmentation/bb.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1354132155f5f8854b5a74a6ce158c3d36f000 GIT binary patch literal 271280 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 literal 0 HcmV?d00001 diff --git a/example/augmentation/main.go b/example/augmentation/main.go new file mode 100644 index 0000000..c50ec1d --- /dev/null +++ b/example/augmentation/main.go @@ -0,0 +1,69 @@ +package main + +import ( + "fmt" + + "github.com/sugarme/gotch" + "github.com/sugarme/gotch/vision" + "github.com/sugarme/gotch/vision/aug" +) + +func main() { + n := 360 + for i := 1; i <= n; i++ { + img, err := vision.Load("./bb.png") + if err != nil { + panic(err) + } + + device := gotch.CudaIfAvailable() + // device := gotch.CPU + imgTs := img.MustTo(device, true) + // t, err := aug.Compose(aug.WithResize(512, 512)) // NOTE. WithResize just works on CPU. + // t, err := aug.Compose(aug.WithRandRotate(0, 360), aug.WithColorJitter(0.3, 0.3, 0.3, 0.4)) + // t, err := aug.Compose(aug.WithGaussianBlur([]int64{5, 5}, []float64{1.0, 2.0}), aug.WithRandRotate(0, 360), aug.WithColorJitter(0.3, 0.3, 0.3, 0.3)) + // t, err := aug.Compose(aug.WithRandomCrop([]int64{320, 320}, []int64{10, 10}, true, "constant")) + // t, err := aug.Compose(aug.WithCenterCrop([]int64{320, 320})) + // t, err := aug.Compose(aug.WithRandomCutout(aug.WithCutoutValue([]int64{124, 96, 255}), aug.WithCutoutScale([]float64{0.01, 0.1}), aug.WithCutoutRatio([]float64{0.5, 0.5}))) + // t, err := aug.Compose(aug.WithRandomPerspective(aug.WithPerspectiveScale(0.6), aug.WithPerspectivePvalue(0.8))) + // t, err := aug.Compose(aug.WithRandomAffine(aug.WithAffineDegree([]int64{0, 15}), aug.WithAffineShear([]float64{0, 15}))) + // t, err := aug.Compose(aug.WithRandomGrayscale(0.5)) + // t, err := aug.Compose(aug.WithRandomSolarize(aug.WithSolarizeThreshold(125), aug.WithSolarizePvalue(0.5))) + // t, err := aug.Compose(aug.WithRandomInvert(0.5)) + // t, err := aug.Compose(aug.WithRandomPosterize(aug.WithPosterizeBits(2), aug.WithPosterizePvalue(1.0))) + // t, err := aug.Compose(aug.WithRandomAutocontrast()) + // t, err := aug.Compose(aug.WithRandomAdjustSharpness(aug.WithSharpnessPvalue(0.3), aug.WithSharpnessFactor(10))) + // t, err := aug.Compose(aug.WithRandomEqualize(1.0)) + // t, err := aug.Compose(aug.WithNormalize(aug.WithNormalizeMean([]float64{0.485, 0.456, 0.406}), aug.WithNormalizeStd([]float64{0.229, 0.224, 0.225}))) + + t, err := aug.Compose( + aug.WithRandomVFlip(0.5), + aug.WithRandomHFlip(0.5), + aug.WithRandomCutout(), + aug.OneOf( + 0.3, + aug.WithColorJitter(0.3, 0.3, 0.3, 0.4), + aug.WithRandomGrayscale(1.0), + ), + aug.OneOf( + 0.3, + aug.WithGaussianBlur([]int64{5, 5}, []float64{1.0, 2.0}), + aug.WithRandomAffine(), + ), + ) + if err != nil { + panic(err) + } + + out := t.Transform(imgTs) + fname := fmt.Sprintf("./output/bb-%03d.png", i) + err = vision.Save(out, fname) + if err != nil { + panic(err) + } + imgTs.MustDrop() + out.MustDrop() + + fmt.Printf("%03d/%v completed.\n", i, n) + } +} diff --git a/example/augmentation/output/.gitignore b/example/augmentation/output/.gitignore new file mode 100644 index 0000000..7c9d611 --- /dev/null +++ b/example/augmentation/output/.gitignore @@ -0,0 +1,3 @@ +* +!.gitignore +!README.md diff --git a/example/augmentation/output/README.md b/example/augmentation/output/README.md new file mode 100644 index 0000000..b11fa64 --- /dev/null +++ b/example/augmentation/output/README.md @@ -0,0 +1 @@ +Output images will be here. diff --git a/tensor/patch.go b/tensor/patch.go index 13db623..855e372 100644 --- a/tensor/patch.go +++ b/tensor/patch.go @@ -581,7 +581,7 @@ func (ts *Tensor) Lstsq(a *Tensor, del bool) (retVal *Tensor, err error) { } func (ts *Tensor) MustLstsq(a *Tensor, del bool) (retVal *Tensor) { - retVal, err := ts.Lstsq(del) + retVal, err := ts.Lstsq(a, del) if err != nil { log.Fatal(err) } diff --git a/vision/aug/affine.go b/vision/aug/affine.go new file mode 100644 index 0000000..c8944c7 --- /dev/null +++ b/vision/aug/affine.go @@ -0,0 +1,185 @@ +package aug + +import ( + "github.com/sugarme/gotch" + ts "github.com/sugarme/gotch/tensor" +) + +// RandomAffine is transformation of the image keeping center invariant. +// If the image is torch Tensor, it is expected +// to have [..., H, W] shape, where ... means an arbitrary number of leading dimensions. +// Args: +// - degrees (sequence or number): Range of degrees to select from. +// If degrees is a number instead of sequence like (min, max), the range of degrees +// will be (-degrees, +degrees). Set to 0 to deactivate rotations. +// - translate (tuple, optional): tuple of maximum absolute fraction for horizontal +// and vertical translations. For example translate=(a, b), then horizontal shift +// is randomly sampled in the range -img_width * a < dx < img_width * a and vertical shift is +// randomly sampled in the range -img_height * b < dy < img_height * b. Will not translate by default. +// - scale (tuple, optional): scaling factor interval, e.g (a, b), then scale is +// randomly sampled from the range a <= scale <= b. Will keep original scale by default. +// - shear (sequence or number, optional): Range of degrees to select from. +// If shear is a number, a shear parallel to the x axis in the range (-shear, +shear) +// will be applied. Else if shear is a sequence of 2 values a shear parallel to the x axis in the +// range (shear[0], shear[1]) will be applied. Else if shear is a sequence of 4 values, +// a x-axis shear in (shear[0], shear[1]) and y-axis shear in (shear[2], shear[3]) will be applied. +// Will not apply shear by default. +// - interpolation (InterpolationMode): Desired interpolation enum defined by +// :class:`torchvision.transforms.InterpolationMode`. Default is ``InterpolationMode.NEAREST``. +// If input is Tensor, only ``InterpolationMode.NEAREST``, ``InterpolationMode.BILINEAR`` are supported. +// For backward compatibility integer values (e.g. ``PIL.Image.NEAREST``) are still acceptable. +// - fill (sequence or number): Pixel fill value for the area outside the transformed +// image. Default is ``0``. If given a number, the value is used for all bands respectively. +// Please use the ``interpolation`` parameter instead. +// .. _filters: https://pillow.readthedocs.io/en/latest/handbook/concepts.html#filters +type RandomAffine struct { + degree []int64 // degree range + translate []float64 + scale []float64 // scale range + shear []float64 + interpolationMode string + fillValue []float64 +} + +func (ra *RandomAffine) getParams(imageSize []int64) (float64, []int64, float64, []float64) { + angleTs := ts.MustEmpty([]int64{1}, gotch.Float, gotch.CPU) + angleTs.MustUniform_(float64(ra.degree[0]), float64(ra.degree[1])) + angle := angleTs.Float64Values()[0] + angleTs.MustDrop() + + var translations []int64 = []int64{0, 0} + if ra.translate != nil { + maxDX := ra.translate[0] * float64(imageSize[0]) + maxDY := ra.translate[1] * float64(imageSize[1]) + dx := ts.MustEmpty([]int64{1}, gotch.Float, gotch.CPU) + dx.MustUniform_(-maxDX, maxDX) + tx := dx.Float64Values()[0] + dx.MustDrop() + + dy := ts.MustEmpty([]int64{1}, gotch.Float, gotch.CPU) + dy.MustUniform_(-maxDY, maxDY) + ty := dx.Float64Values()[0] + dy.MustDrop() + + translations = []int64{int64(tx), int64(ty)} // should we use math.Round here??? + } + + scale := 1.0 + if ra.scale != nil { + scaleTs := ts.MustEmpty([]int64{1}, gotch.Float, gotch.CPU) + scaleTs.MustUniform_(ra.scale[0], ra.scale[1]) + scale = scaleTs.Float64Values()[0] + scaleTs.MustDrop() + } + + var ( + shearX, shearY float64 = 0.0, 0.0 + ) + if ra.shear != nil { + shearXTs := ts.MustEmpty([]int64{1}, gotch.Float, gotch.CPU) + shearXTs.MustUniform_(ra.shear[0], ra.shear[1]) + shearX = shearXTs.Float64Values()[0] + shearXTs.MustDrop() + + if len(ra.shear) == 4 { + shearYTs := ts.MustEmpty([]int64{1}, gotch.Float, gotch.CPU) + shearYTs.MustUniform_(ra.shear[2], ra.shear[3]) + shearY = shearYTs.Float64Values()[0] + shearYTs.MustDrop() + } + } + + var shear []float64 = []float64{shearX, shearY} + + return angle, translations, scale, shear +} + +func (ra *RandomAffine) Forward(x *ts.Tensor) *ts.Tensor { + w, h := getImageSize(x) + angle, translations, scale, shear := ra.getParams([]int64{w, h}) + + out := affine(x, angle, translations, scale, shear, ra.interpolationMode, ra.fillValue) + + return out +} + +func newRandomAffine(opts ...affineOption) *RandomAffine { + p := defaultAffineOptions() + for _, o := range opts { + o(p) + } + + return &RandomAffine{ + degree: p.degree, + translate: p.translate, + scale: p.scale, + shear: p.shear, + interpolationMode: p.interpolationMode, + fillValue: p.fillValue, + } +} + +type affineOptions struct { + degree []int64 + translate []float64 + scale []float64 + shear []float64 + interpolationMode string + fillValue []float64 +} + +type affineOption func(*affineOptions) + +func defaultAffineOptions() *affineOptions { + return &affineOptions{ + degree: []int64{-180, 180}, + translate: nil, + scale: nil, + shear: []float64{-180.0, 180.0}, + interpolationMode: "bilinear", + fillValue: []float64{0.0, 0.0, 0.0}, + } +} + +func WithAffineDegree(degree []int64) affineOption { + return func(o *affineOptions) { + o.degree = degree + } +} + +func WithAffineTranslate(translate []float64) affineOption { + return func(o *affineOptions) { + o.translate = translate + } +} + +func WithAffineScale(scale []float64) affineOption { + return func(o *affineOptions) { + o.scale = scale + } +} + +func WithAffineShear(shear []float64) affineOption { + return func(o *affineOptions) { + o.shear = shear + } +} + +func WithAffineMode(mode string) affineOption { + return func(o *affineOptions) { + o.interpolationMode = mode + } +} + +func WithAffineFillValue(fillValue []float64) affineOption { + return func(o *affineOptions) { + o.fillValue = fillValue + } +} + +func WithRandomAffine(opts ...affineOption) Option { + ra := newRandomAffine(opts...) + return func(o *Options) { + o.randomAffine = ra + } +} diff --git a/vision/aug/blur.go b/vision/aug/blur.go new file mode 100644 index 0000000..ea78524 --- /dev/null +++ b/vision/aug/blur.go @@ -0,0 +1,89 @@ +package aug + +import ( + "fmt" + "log" + + "github.com/sugarme/gotch" + ts "github.com/sugarme/gotch/tensor" +) + +type GaussianBlur struct { + kernelSize []int64 // >= 0 && ks%2 != 0 + sigma []float64 // [0.1, 2.0] range(min, max) +} + +// ks : kernal size. Can be 1-2 element slice +// sigma: minimal and maximal standard deviation that can be chosen for blurring kernel +// range (min, max). Can be 1-2 element slice +func newGaussianBlur(ks []int64, sig []float64) *GaussianBlur { + if len(ks) == 0 || len(ks) > 2 { + err := fmt.Errorf("Kernel size should have 1-2 elements. Got %v\n", len(ks)) + log.Fatal(err) + } + for _, size := range ks { + if size <= 0 || size%2 == 0 { + err := fmt.Errorf("Kernel size should be an odd and positive number.") + log.Fatal(err) + } + } + + if len(sig) == 0 || len(sig) > 2 { + err := fmt.Errorf("Sigma should have 1-2 elements. Got %v\n", len(sig)) + log.Fatal(err) + } + + for _, s := range sig { + if s <= 0 { + err := fmt.Errorf("Sigma should be a positive number.") + log.Fatal(err) + } + } + + var kernelSize []int64 + switch len(ks) { + case 1: + kernelSize = []int64{ks[0], ks[0]} + case 2: + kernelSize = ks + default: + panic("Shouldn't reach here.") + } + + var sigma []float64 + switch len(sig) { + case 1: + sigma = []float64{sig[0], sig[0]} + case 2: + min := sig[0] + max := sig[1] + if min > max { + min = sig[1] + max = sig[0] + } + sigma = []float64{min, max} + default: + panic("Shouldn't reach here.") + } + + return &GaussianBlur{ + kernelSize: kernelSize, + sigma: sigma, + } +} + +func (b *GaussianBlur) Forward(x *ts.Tensor) *ts.Tensor { + sigmaTs := ts.MustEmpty([]int64{1}, gotch.Float, gotch.CPU) + sigmaTs.MustUniform_(b.sigma[0], b.sigma[1]) + sigmaVal := sigmaTs.Float64Values()[0] + sigmaTs.MustDrop() + + return gaussianBlur(x, b.kernelSize, []float64{sigmaVal, sigmaVal}) +} + +func WithGaussianBlur(ks []int64, sig []float64) Option { + return func(o *Options) { + gb := newGaussianBlur(ks, sig) + o.gaussianBlur = gb + } +} diff --git a/vision/aug/color.go b/vision/aug/color.go new file mode 100644 index 0000000..18b5b0a --- /dev/null +++ b/vision/aug/color.go @@ -0,0 +1,77 @@ +package aug + +import ( + "math/rand" + "time" + + ts "github.com/sugarme/gotch/tensor" +) + +// Ref. https://github.com/pytorch/vision/blob/f1d734213af65dc06e777877d315973ba8386080/torchvision/transforms/functional_tensor.py + +type ColorJitter struct { + brightness float64 + contrast float64 + saturation float64 + hue float64 +} + +func defaultColorJitter() *ColorJitter { + return &ColorJitter{ + brightness: 1.0, + contrast: 1.0, + saturation: 1.0, + hue: 0.0, + } +} + +func (c *ColorJitter) setBrightness(brightness float64) { + c.brightness = brightness +} + +func (c *ColorJitter) setContrast(contrast float64) { + c.contrast = contrast +} + +func (c *ColorJitter) setSaturation(sat float64) { + c.saturation = sat +} + +func (c *ColorJitter) setHue(hue float64) { + c.hue = hue +} + +// Forward implement ts.Module by randomly picking one of brightness, contrast, +// staturation or hue function to transform input image tensor. +func (c *ColorJitter) Forward(x *ts.Tensor) *ts.Tensor { + rand.Seed(time.Now().UnixNano()) + idx := rand.Intn(4) + switch idx { + case 0: + v := randVal(getMinMax(c.brightness)) + return adjustBrightness(x, v) + case 1: + v := randVal(getMinMax(c.contrast)) + return adjustContrast(x, v) + case 2: + v := randVal(getMinMax(c.saturation)) + return adjustSaturation(x, v) + case 3: + v := randVal(0, c.hue) + return adjustHue(x, v) + default: + panic("Shouldn't reach here.") + } +} + +func WithColorJitter(brightness, contrast, sat, hue float64) Option { + c := defaultColorJitter() + c.setBrightness(brightness) + c.setContrast(contrast) + c.setSaturation(sat) + c.setHue(hue) + + return func(o *Options) { + o.colorJitter = c + } +} diff --git a/vision/aug/contrast.go b/vision/aug/contrast.go new file mode 100644 index 0000000..7b30d6c --- /dev/null +++ b/vision/aug/contrast.go @@ -0,0 +1,43 @@ +package aug + +import ( + ts "github.com/sugarme/gotch/tensor" +) + +// RandomAutocontrast autocontrasts the pixels of the given image randomly with a given probability. +// If the image is torch Tensor, it is expected +// to have [..., 1 or 3, H, W] shape, where ... means an arbitrary number of leading dimensions. +// Args: +// - p (float): probability of the image being autocontrasted. Default value is 0.5 +type RandomAutocontrast struct { + pvalue float64 +} + +func newRandomAutocontrast(pOpt ...float64) *RandomAutocontrast { + p := 0.5 + if len(pOpt) > 0 { + p = pOpt[0] + } + + return &RandomAutocontrast{p} +} + +func (rac *RandomAutocontrast) Forward(x *ts.Tensor) *ts.Tensor { + r := randPvalue() + var out *ts.Tensor + switch { + case r < rac.pvalue: + out = autocontrast(x) + default: + out = x.MustShallowClone() + } + + return out +} + +func WithRandomAutocontrast(p ...float64) Option { + rac := newRandomAutocontrast(p...) + return func(o *Options) { + o.randomAutocontrast = rac + } +} diff --git a/vision/aug/crop.go b/vision/aug/crop.go new file mode 100644 index 0000000..886f040 --- /dev/null +++ b/vision/aug/crop.go @@ -0,0 +1,124 @@ +package aug + +import ( + "fmt" + "log" + // "math" + + "github.com/sugarme/gotch" + ts "github.com/sugarme/gotch/tensor" +) + +type RandomCrop struct { + size []int64 + padding []int64 + paddingIfNeeded bool + paddingMode string +} + +func newRandomCrop(size, padding []int64, paddingIfNeeded bool, paddingMode string) *RandomCrop { + return &RandomCrop{ + size: size, + padding: padding, + paddingIfNeeded: paddingIfNeeded, + paddingMode: paddingMode, + } +} + +// get parameters for crop +func (c *RandomCrop) params(x *ts.Tensor) (int64, int64, int64, int64) { + w, h := getImageSize(x) + th, tw := c.size[0], c.size[1] + if h+1 < th || w+1 < tw { + err := fmt.Errorf("Required crop size %v is larger then input image size %v", c.size, []int64{h, w}) + log.Fatal(err) + } + + if w == tw && h == th { + return 0, 0, h, w + } + + iTs := ts.MustRandint1(0, h-th+1, []int64{1}, gotch.Int64, gotch.CPU) + i := iTs.Int64Values()[0] + iTs.MustDrop() + + jTs := ts.MustRandint1(0, w-tw+1, []int64{1}, gotch.Int64, gotch.CPU) + j := jTs.Int64Values()[0] + jTs.MustDrop() + + return i, j, th, tw +} + +func (c *RandomCrop) Forward(x *ts.Tensor) *ts.Tensor { + var img *ts.Tensor + if c.padding != nil { + img = pad(x, c.padding, c.paddingMode) + } else { + img = x.MustShallowClone() + } + + w, h := getImageSize(x) + + var ( + paddedW *ts.Tensor + paddedWH *ts.Tensor + ) + // pad width if needed + if c.paddingIfNeeded && w < c.size[1] { + padding := []int64{c.size[1] - w, 0} + paddedW = pad(img, padding, c.paddingMode) + } else { + paddedW = img.MustShallowClone() + } + img.MustDrop() + + // pad height if needed + if c.paddingIfNeeded && h < c.size[0] { + padding := []int64{0, c.size[0] - h} + paddedWH = pad(paddedW, padding, c.paddingMode) + } else { + paddedWH = paddedW.MustShallowClone() + } + + paddedW.MustDrop() + + // i, j, h, w = self.get_params(img, self.size) + i, j, h, w := c.params(x) + out := crop(paddedWH, i, j, h, w) + paddedWH.MustDrop() + return out +} + +func WithRandomCrop(size []int64, padding []int64, paddingIfNeeded bool, paddingMode string) Option { + return func(o *Options) { + c := newRandomCrop(size, padding, paddingIfNeeded, paddingMode) + o.randomCrop = c + } +} + +// CenterCrop crops the given image at the center. +// If the image is torch Tensor, it is expected +// to have [..., H, W] shape, where ... means an arbitrary number of leading dimensions. +// If image size is smaller than output size along any edge, image is padded with 0 and then center cropped. +type CenterCrop struct { + size []int64 +} + +func newCenterCrop(size []int64) *CenterCrop { + if len(size) != 2 { + err := fmt.Errorf("Expected size of 2 elements. Got %v\n", len(size)) + log.Fatal(err) + } + return &CenterCrop{size} +} + +func (cc *CenterCrop) Forward(x *ts.Tensor) *ts.Tensor { + return centerCrop(x, cc.size) +} + +func WithCenterCrop(size []int64) Option { + return func(o *Options) { + cc := newCenterCrop(size) + o.centerCrop = cc + } +} diff --git a/vision/aug/cutout.go b/vision/aug/cutout.go new file mode 100644 index 0000000..c0446b2 --- /dev/null +++ b/vision/aug/cutout.go @@ -0,0 +1,177 @@ +package aug + +import ( + "fmt" + "log" + "math" + + "github.com/sugarme/gotch" + ts "github.com/sugarme/gotch/tensor" +) + +// Randomly selects a rectangle region in an torch Tensor image and erases its pixels. +// This transform does not support PIL Image. +// 'Random Erasing Data Augmentation' by Zhong et al. See https://arxiv.org/abs/1708.04896 +// +// Args: +// p: probability that the random erasing operation will be performed. +// scale: range of proportion of erased area against input image. +// ratio: range of aspect ratio of erased area. +// value: erasing value. Default is 0. If a single int, it is used to +// erase all pixels. If a tuple of length 3, it is used to erase +// R, G, B channels respectively. +// If a str of 'random', erasing each pixel with random values. +type RandomCutout struct { + pvalue float64 + scale []float64 + ratio []float64 + rgbVal []int64 // RGB value +} + +type cutoutOptions struct { + pvalue float64 + scale []float64 + ratio []float64 + rgbVal []int64 // RGB value +} + +type cutoutOption func(o *cutoutOptions) + +func defaultCutoutOptions() *cutoutOptions { + return &cutoutOptions{ + pvalue: 0.5, + scale: []float64{0.02, 0.33}, + ratio: []float64{0.3, 3.3}, + rgbVal: []int64{0, 0, 0}, + } +} + +func newRandomCutout(pvalue float64, scale, ratio []float64, rgbVal []int64) *RandomCutout { + return &RandomCutout{ + pvalue: pvalue, + scale: scale, + ratio: ratio, + rgbVal: rgbVal, + } +} + +func WithCutoutPvalue(p float64) cutoutOption { + if p < 0 || p > 1 { + log.Fatalf("Cutout p-value must be in range from 0 to 1. Got %v\n", p) + } + return func(o *cutoutOptions) { + o.pvalue = p + } +} + +func WithCutoutScale(scale []float64) cutoutOption { + if len(scale) != 2 { + log.Fatalf("Cutout scale should be in a range of 2 elments. Got %v elements\n", len(scale)) + } + return func(o *cutoutOptions) { + o.scale = scale + } +} + +func WithCutoutRatio(ratio []float64) cutoutOption { + if len(ratio) != 2 { + log.Fatalf("Cutout ratio should be in a range of 2 elments. Got %v elements\n", len(ratio)) + } + return func(o *cutoutOptions) { + o.ratio = ratio + } +} + +func WithCutoutValue(rgb []int64) cutoutOption { + var rgbVal []int64 + switch len(rgb) { + case 1: + rgbVal = []int64{rgb[0], rgb[0], rgb[0]} + case 3: + rgbVal = rgb + default: + err := fmt.Errorf("Cutout values can be single value or 3-element (RGB) value. Got %v values.", len(rgb)) + log.Fatal(err) + } + return func(o *cutoutOptions) { + o.rgbVal = rgbVal + } +} + +func (rc *RandomCutout) cutoutParams(x *ts.Tensor) (int64, int64, int64, int64, *ts.Tensor) { + dim := x.MustSize() + + imgH, imgW := dim[len(dim)-2], dim[len(dim)-1] + area := float64(imgH * imgW) + logRatio := ts.MustOfSlice(rc.ratio).MustLog(true).Float64Values() + + for i := 0; i < 10; i++ { + scaleTs := ts.MustEmpty([]int64{1}, gotch.Float, gotch.CPU) + scaleTs.MustUniform_(rc.scale[0], rc.scale[1]) + scaleVal := scaleTs.Float64Values()[0] + scaleTs.MustDrop() + eraseArea := area * scaleVal + + ratioTs := ts.MustEmpty([]int64{1}, gotch.Float, gotch.CPU) + ratioTs.MustUniform_(logRatio[0], logRatio[1]) + asTs := ratioTs.MustExp(true) + asVal := asTs.Float64Values()[0] // aspect ratio + asTs.MustDrop() + + // h = int(round(math.sqrt(erase_area * aspect_ratio))) + // w = int(round(math.sqrt(erase_area / aspect_ratio))) + h := int64(math.Round(math.Sqrt(eraseArea * asVal))) + w := int64(math.Round(math.Sqrt(eraseArea / asVal))) + if !(h < imgH && w < imgW) { + continue + } + + // v = torch.tensor(value)[:, None, None] + v := ts.MustOfSlice(rc.rgbVal).MustUnsqueeze(1, true).MustUnsqueeze(1, true) + + // i = torch.randint(0, img_h - h + 1, size=(1, )).item() + iTs := ts.MustRandint1(0, imgH-h+1, []int64{1}, gotch.Int64, gotch.CPU) + i := iTs.Int64Values()[0] + iTs.MustDrop() + // j = torch.randint(0, img_w - w + 1, size=(1, )).item() + jTs := ts.MustRandint1(0, imgW-w+1, []int64{1}, gotch.Int64, gotch.CPU) + j := jTs.Int64Values()[0] + jTs.MustDrop() + return i, j, h, w, v + } + + // return original image + img := x.MustShallowClone() + return 0, 0, imgH, imgW, img +} + +func (rc *RandomCutout) Forward(img *ts.Tensor) *ts.Tensor { + randTs := ts.MustRandn([]int64{1}, gotch.Float, gotch.CPU) + randVal := randTs.Float64Values()[0] + randTs.MustDrop() + + switch randVal < rc.pvalue { + case true: + x, y, h, w, v := rc.cutoutParams(img) + out := cutout(img, x, y, h, w, rc.rgbVal) + v.MustDrop() + return out + case false: + out := img.MustShallowClone() + return out + } + + panic("Shouldn't reach here") +} + +func WithRandomCutout(opts ...cutoutOption) Option { + params := defaultCutoutOptions() + for _, o := range opts { + o(params) + } + + return func(o *Options) { + rc := newRandomCutout(params.pvalue, params.scale, params.ratio, params.rgbVal) + o.randomCutout = rc + } +} diff --git a/vision/aug/equalize.go b/vision/aug/equalize.go new file mode 100644 index 0000000..10d65a2 --- /dev/null +++ b/vision/aug/equalize.go @@ -0,0 +1,46 @@ +package aug + +import ( + ts "github.com/sugarme/gotch/tensor" +) + +// RandomEqualize equalizes the histogram of the given image randomly with a given probability. +// If the image is torch Tensor, it is expected +// to have [..., 1 or 3, H, W] shape, where ... means an arbitrary number of leading dimensions. +// Args: +// - p (float): probability of the image being equalized. Default value is 0.5 +// Histogram equalization +// Ref. https://en.wikipedia.org/wiki/Histogram_equalization +type RandomEqualize struct { + pvalue float64 +} + +func newRandomEqualize(pOpt ...float64) *RandomEqualize { + p := 0.5 + if len(pOpt) > 0 { + p = pOpt[0] + } + + return &RandomEqualize{p} +} + +func (re *RandomEqualize) Forward(x *ts.Tensor) *ts.Tensor { + r := randPvalue() + + var out *ts.Tensor + switch { + case r < re.pvalue: + out = equalize(x) + default: + out = x.MustShallowClone() + } + + return out +} + +func WithRandomEqualize(p ...float64) Option { + re := newRandomEqualize(p...) + return func(o *Options) { + o.randomEqualize = re + } +} diff --git a/vision/aug/flip.go b/vision/aug/flip.go new file mode 100644 index 0000000..503b5cf --- /dev/null +++ b/vision/aug/flip.go @@ -0,0 +1,78 @@ +package aug + +import ( + "github.com/sugarme/gotch" + ts "github.com/sugarme/gotch/tensor" +) + +// RandomHorizontalFlip horizontally flips the given image randomly with a given probability. +// +// If the image is torch Tensor, it is expected to have [..., H, W] shape, +// where ... means an arbitrary number of leading dimensions +// Args: +// p (float): probability of the image being flipped. Default value is 0.5 +type RandomHorizontalFlip struct { + pvalue float64 +} + +func newRandomHorizontalFlip(pvalue float64) *RandomHorizontalFlip { + return &RandomHorizontalFlip{ + pvalue: pvalue, + } +} + +func (hf *RandomHorizontalFlip) Forward(x *ts.Tensor) *ts.Tensor { + randTs := ts.MustRandn([]int64{1}, gotch.Float, gotch.CPU) + randVal := randTs.Float64Values()[0] + randTs.MustDrop() + switch { + case randVal < hf.pvalue: + return hflip(x) + default: + out := x.MustShallowClone() + return out + } +} + +func WithRandomHFlip(pvalue float64) Option { + return func(o *Options) { + hf := newRandomHorizontalFlip(pvalue) + o.randomHFlip = hf + } +} + +// RandomVerticalFlip vertically flips the given image randomly with a given probability. +// +// If the image is torch Tensor, it is expected to have [..., H, W] shape, +// where ... means an arbitrary number of leading dimensions +// Args: +// p (float): probability of the image being flipped. Default value is 0.5 +type RandomVerticalFlip struct { + pvalue float64 +} + +func newRandomVerticalFlip(pvalue float64) *RandomVerticalFlip { + return &RandomVerticalFlip{ + pvalue: pvalue, + } +} + +func (vf *RandomVerticalFlip) Forward(x *ts.Tensor) *ts.Tensor { + randTs := ts.MustRandn([]int64{1}, gotch.Float, gotch.CPU) + randVal := randTs.Float64Values()[0] + randTs.MustDrop() + switch { + case randVal < vf.pvalue: + return vflip(x) + default: + out := x.MustShallowClone() + return out + } +} + +func WithRandomVFlip(pvalue float64) Option { + return func(o *Options) { + vf := newRandomVerticalFlip(pvalue) + o.randomVFlip = vf + } +} diff --git a/vision/aug/function.go b/vision/aug/function.go new file mode 100644 index 0000000..8464bd9 --- /dev/null +++ b/vision/aug/function.go @@ -0,0 +1,1514 @@ +package aug + +import ( + "fmt" + "log" + "math" + "math/rand" + "time" + + "github.com/sugarme/gotch" + ts "github.com/sugarme/gotch/tensor" +) + +func gaussianKernel1D(ks int64, sigma float64, dtype gotch.DType, device gotch.Device) *ts.Tensor { + ksHalf := (ks - 1) / 2 + x := ts.MustLinspace(ts.IntScalar(-ksHalf), ts.IntScalar(ksHalf), []int64{ks}, dtype, device) + + // pdf = torch.exp(-0.5 * (x / sigma).pow(2)) + pdf := x.MustDiv1(ts.FloatScalar(sigma), true).MustPow(ts.IntScalar(2), true).MustMul1(ts.FloatScalar(0.5), true).MustExp(true) + // kernel1d = pdf / pdf.sum() + pdfSum := pdf.MustSum(dtype, false) + kernel1d := pdf.MustDiv(pdfSum, true) + pdfSum.MustDrop() + + return kernel1d +} + +func gaussianKernel2D(ks []int64, sigma []float64, dtype gotch.DType, device gotch.Device) *ts.Tensor { + kernel1dX := gaussianKernel1D(ks[0], sigma[0], dtype, device) + kernel1dY := gaussianKernel1D(ks[1], sigma[1], dtype, device) + + // dimX := kernel1dX.MustSize() + kernel1dX.MustUnsqueeze_(0) // kernel1d_x[None, :] + dimY := kernel1dY.MustSize() + kernel1dY.MustUnsqueeze_(int64(len(dimY))) // kernel1d_y[:, None] + + kernel2d := kernel1dY.MustMm(kernel1dX, true) + kernel1dX.MustDrop() + return kernel2d +} + +func containsDType(dtype gotch.DType, dtypes []gotch.DType) bool { + for _, dt := range dtypes { + if dtype == dt { + return true + } + } + + return false +} + +func castSqueezeIn(x *ts.Tensor, reqDtypes []gotch.DType) (*ts.Tensor, bool, bool, gotch.DType) { + needSqueeze := false + xdim := x.MustSize() + var img *ts.Tensor + if len(xdim) < 4 { + img = x.MustUnsqueeze(0, false) + needSqueeze = true + } else { + img = x.MustShallowClone() + } + outDtype := x.DType() + needCast := false + if !containsDType(outDtype, reqDtypes) { + needCast = true + reqDType := reqDtypes[0] + img1 := img.MustTotype(reqDType, true) + return img1, needCast, needSqueeze, outDtype + } + return img, needCast, needSqueeze, outDtype +} + +func castSqueezeOut(x *ts.Tensor, needCast, needSqueeze bool, outDType gotch.DType) *ts.Tensor { + var ( + squeezeTs, castTs *ts.Tensor + ) + switch needSqueeze { + case true: + squeezeTs = x.MustSqueeze1(0, false) + case false: + squeezeTs = x.MustShallowClone() + } + + switch needCast { + case true: + // it is better to round before cast + if containsDType(outDType, []gotch.DType{gotch.Uint8, gotch.Int8, gotch.Int16, gotch.Int, gotch.Int64}) { + roundTs := squeezeTs.MustRound(true) + castTs = roundTs.MustTotype(outDType, true) + } else { + castTs = squeezeTs.MustTotype(outDType, true) + } + case false: + castTs = squeezeTs.MustShallowClone() + squeezeTs.MustDrop() + } + + return castTs +} + +func gaussianBlur(x *ts.Tensor, ks []int64, sigma []float64) *ts.Tensor { + dtype := gotch.Float + if x.DType() == gotch.Float || x.DType() == gotch.Double { + dtype = x.DType() + } + device := x.MustDevice() + + assertImageTensor(x) + + kernel := gaussianKernel2D(ks, sigma, dtype, device) + xdim := x.MustSize() + kdim := kernel.MustSize() + + // kernel = kernel.expand(img.shape[-3], 1, kernel.shape[0], kernel.shape[1]) + kexpand := kernel.MustExpand([]int64{xdim[len(xdim)-3], 1, kdim[0], kdim[1]}, true, true) + kdtype := kexpand.DType() + img, needCast, needSqueeze, outDType := castSqueezeIn(x, []gotch.DType{kdtype}) + + // padding = (left, right, top, bottom) + // padding = [kernel_size[0] // 2, kernel_size[0] // 2, kernel_size[1] // 2, kernel_size[1] // 2] + left := ks[0] / 2 + right := ks[0] / 2 + top := ks[1] / 2 + bottom := ks[1] / 2 + padding := []int64{left, right, top, bottom} + + // F.pad() + // https://github.com/pytorch/pytorch/blob/71f4c5c1f436258adc303b710efb3f41b2d50c4e/torch/nn/functional.py#L4070 + // img = torch_pad(img, padding, mode="reflect") + imgPad := img.MustReflectionPad2d(padding, true) // deleted img + + imgPadDim := imgPad.MustSize() + // img = conv2d(img, kernel, groups=img.shape[-3]) + // ref. https://github.com/pytorch/pytorch/blob/6060684609ebf66120db5af004b4cdafc5cccbdb/torch/nn/functional.py#L71 + imgConv2d := ts.MustConv2d(imgPad, kexpand, ts.NewTensor(), []int64{1}, []int64{0}, []int64{1}, imgPadDim[len(imgPadDim)-3]) + imgPad.MustDrop() + + // img = _cast_squeeze_out(img, need_cast, need_squeeze, out_dtype) + out := castSqueezeOut(imgConv2d, needCast, needSqueeze, outDType) + imgConv2d.MustDrop() + + return out +} + +func isTorchImage(x *ts.Tensor) bool { + return x.Dim() >= 2 +} + +func assertImageTensor(x *ts.Tensor) { + if !isTorchImage(x) { + err := fmt.Errorf("Input tensor is not a torch image.") + log.Fatal(err) + } +} + +func imageChanNum(x *ts.Tensor) int64 { + ndim := x.Dim() + + switch { + case ndim == 2: + return 1 + case ndim > 2: + return x.MustSize()[0] + default: + err := fmt.Errorf("imageChanNum - Input should be 2 or more. Got %v", ndim) + log.Fatal(err) + return 0 + } +} + +func contains(item int64, list []int64) bool { + for _, i := range list { + if item == i { + return true + } + } + + return false +} + +func assertChannels(x *ts.Tensor, permitted []int64) { + c := imageChanNum(x) + if !contains(c, permitted) { + err := fmt.Errorf("Input image tensor permitted channels are %+v, but found %v", permitted, c) + log.Fatal(err) + } +} + +func blend(img1, img2 *ts.Tensor, ratio float64) *ts.Tensor { + dtype := img1.DType() + // bound := 1.0 + // if dtype == gotch.Double || dtype == gotch.Float { + // bound = 255.0 + // } + bound := 255.0 + + // (ratio * img1 + (1.0 - ratio) * img2).clamp(0, bound).to(img1.dtype) + i1 := img1.MustMul1(ts.FloatScalar(ratio), false) + i2 := img2.MustMul1(ts.FloatScalar(1.0-ratio), false) + sumTs := i1.MustAdd(i2, true) + i2.MustDrop() + out := sumTs.MustClamp(ts.FloatScalar(0), ts.FloatScalar(bound), true).MustTotype(dtype, true) + return out +} + +// brightness should be in range 0.25 - 1.25 for visible view +func adjustBrightness(x *ts.Tensor, brightness float64) *ts.Tensor { + if brightness < 0 { + err := fmt.Errorf("adjustBrightness - brightness factor (%v) is not non-negative.", brightness) + log.Fatal(err) + } + + assertImageTensor(x) + assertChannels(x, []int64{1, 3}) + + zeros := x.MustZerosLike(false) + out := blend(x, zeros, brightness) + zeros.MustDrop() + + return out +} + +// randVal generates a value from uniform values from 0 to x +func randVal(from, to float64) float64 { + v := ts.MustEmpty([]int64{1}, gotch.Float, gotch.CPU) + v.MustUniform_(from, to) + randVal := v.Float64Values()[0] + v.MustDrop() + return randVal +} + +func getMinMax(x float64) (float64, float64) { + from := 0.0 + if 1-x > 0 { + from = 1 - x + } + to := 1 + x + + return from, to +} + +func rgb2Gray(x *ts.Tensor, outChanOpt ...int64) *ts.Tensor { + var outChannels int64 = 1 + if len(outChanOpt) > 0 { + outChannels = outChanOpt[0] + } + + ndim := x.Dim() + if ndim < 3 { + err := fmt.Errorf("Input image tensor should have at least 3 dimensions, but found %v", ndim) + log.Fatal(err) + } + + assertChannels(x, []int64{3}) + if !contains(outChannels, []int64{1, 3}) { + err := fmt.Errorf("Number of output channels should be either 1 or 3") + log.Fatal(err) + } + + rgbTs := x.MustUnbind(-3, false) + r := &rgbTs[0] + g := &rgbTs[1] + b := &rgbTs[2] + + // This implementation closely follows the TF one: + // https://github.com/tensorflow/tensorflow/blob/v2.3.0/tensorflow/python/ops/image_ops_impl.py#L2105-L2138 + // l_img = (0.2989 * r + 0.587 * g + 0.114 * b).to(img.dtype) + rmul := r.MustMul1(ts.FloatScalar(0.2989), true) + gmul := g.MustMul1(ts.FloatScalar(0.587), true) + bmul := b.MustMul1(ts.FloatScalar(0.114), true) + addTs := rmul.MustAdd(gmul, true).MustAdd(bmul, true) + gmul.MustDrop() + bmul.MustDrop() + lImg := addTs.MustTotype(x.DType(), true).MustUnsqueeze(-3, true) + + if outChannels == 3 { + return lImg.MustExpand(x.MustSize(), true, true) + } + + return lImg +} + +func adjustContrast(x *ts.Tensor, contrast float64) *ts.Tensor { + if contrast < 0 { + err := fmt.Errorf("adjustContrast - contrast factor (%v) is not non-negative.", contrast) + log.Fatal(err) + } + + assertImageTensor(x) + assertChannels(x, []int64{3}) + + grayTs := rgb2Gray(x).MustTotype(x.DType(), true) + + mean := grayTs.MustMean1([]int64{-3, -2, -1}, true, gotch.Float, true).MustTotype(x.DType(), true) + out := blend(x, mean, contrast) + mean.MustDrop() + + return out +} + +func adjustSaturation(x *ts.Tensor, sat float64) *ts.Tensor { + if sat < 0 { + err := fmt.Errorf("adjustSaturation - saturation factor (%v) is not non-negative.", sat) + log.Fatal(err) + } + assertImageTensor(x) + assertChannels(x, []int64{3}) + grayTs := rgb2Gray(x).MustTotype(x.DType(), true) + out := blend(x, grayTs, sat) + grayTs.MustDrop() + + return out +} + +func rgb2HSV(x *ts.Tensor) *ts.Tensor { + rgbTs := x.MustUnbind(-3, false) + r := &rgbTs[0] + g := &rgbTs[1] + b := &rgbTs[2] + + // # Implementation is based on https://github.com/python-pillow/Pillow/blob/4174d4267616897df3746d315d5a2d0f82c656ee/ + // # src/libImaging/Convert.c#L330 + // maxc = torch.max(img, dim=-3).values + // minc = torch.min(img, dim=-3).values + maxC := x.MustAmax([]int64{-3}, false, false) + minC := x.MustAmin([]int64{-3}, false, false) + + // # The algorithm erases S and H channel where `maxc = minc`. This avoids NaN + // # from happening in the results, because + // # + S channel has division by `maxc`, which is zero only if `maxc = minc` + // # + H channel has division by `(maxc - minc)`. + // # + // # Instead of overwriting NaN afterwards, we just prevent it from occuring so + // # we don't need to deal with it in case we save the NaN in a buffer in + // # backprop, if it is ever supported, but it doesn't hurt to do so. + // eqc = maxc == minc + eqC := maxC.MustEq1(minC, false) + + // cr = maxc - minc + cr := maxC.MustSub(minC, false) + + // # Since `eqc => cr = 0`, replacing denominator with 1 when `eqc` is fine. + ones := maxC.MustOnesLike(false) + + // s = cr / torch.where(eqc, ones, maxc) + condMaxC := ones.MustWhere1(eqC, maxC, false) + s := cr.MustDiv(condMaxC, false) + + // # Note that `eqc => maxc = minc = r = g = b`. So the following calculation + // # of `h` would reduce to `bc - gc + 2 + rc - bc + 4 + rc - bc = 6` so it + // # would not matter what values `rc`, `gc`, and `bc` have here, and thus + // # replacing denominator with 1 when `eqc` is fine. + // cr_divisor = torch.where(eqc, ones, cr) + // rc = (maxc - r) / cr_divisor + // gc = (maxc - g) / cr_divisor + // bc = (maxc - b) / cr_divisor + crDivisor := ones.MustWhere1(eqC, cr, true) // delete ones + rc := maxC.MustSub(r, false).MustDiv(crDivisor, true) + gc := maxC.MustSub(g, false).MustDiv(crDivisor, true) + bc := maxC.MustSub(b, false).MustDiv(crDivisor, true) + + // hr = (maxc == r) * (bc - gc) + rSub := bc.MustSub(gc, false) + hr := maxC.MustEq1(r, false).MustMul(rSub, true) + rSub.MustDrop() + + // hg = ((maxc == g) & (maxc != r)) * (2.0 + rc - bc) + maxcCond1 := maxC.MustNotEqual1(r, false) + hgMul := rc.MustSub(bc, false).MustAdd1(ts.FloatScalar(2.0), true) + hg := maxC.MustEq1(g, false).MustLogicalAnd(maxcCond1, true).MustMul(hgMul, true) + maxcCond1.MustDrop() + hgMul.MustDrop() + + // hb = ((maxc != g) & (maxc != r)) * (4.0 + gc - rc) + maxcCond2 := maxC.MustNotEqual1(r, false) + hbMul := gc.MustSub(rc, false).MustAdd1(ts.FloatScalar(4.0), true) + hb := maxC.MustNotEqual1(g, false).MustLogicalAnd(maxcCond2, true).MustMul(hbMul, true) + maxcCond2.MustDrop() + hbMul.MustDrop() + + // h = (hr + hg + hb) + h1 := hr.MustAdd(hg, false).MustAdd(hb, true) + + // h = torch.fmod((h / 6.0 + 1.0), 1.0) + h2 := h1.MustDiv1(ts.FloatScalar(6.0), true).MustAdd1(ts.FloatScalar(1.0), true) // delete h1 + h3 := h2.MustFmod(ts.FloatScalar(1.0), true) // delete h2 + + // torch.stack((h, s, maxc), dim=-3) + out := ts.MustStack([]ts.Tensor{*h3, *s, *maxC}, -3) + + // Delete intermediate tensors + r.MustDrop() + g.MustDrop() + b.MustDrop() + h3.MustDrop() + maxC.MustDrop() + minC.MustDrop() + eqC.MustDrop() + s.MustDrop() + condMaxC.MustDrop() + cr.MustDrop() + crDivisor.MustDrop() + rc.MustDrop() + gc.MustDrop() + bc.MustDrop() + hr.MustDrop() + hg.MustDrop() + hb.MustDrop() + + return out +} + +func hsv2RGB(x *ts.Tensor) *ts.Tensor { + hsvTs := x.MustUnbind(-3, false) + h := &hsvTs[0] + s := &hsvTs[1] + v := &hsvTs[2] + + i := h.MustMul1(ts.FloatScalar(6.0), false).MustFloor(true) + f := h.MustMul1(ts.FloatScalar(0.6), false).MustSub(i, true) + + // p = torch.clamp((v * (1.0 - s)), 0.0, 1.0) + x1 := s.MustMul1(ts.FloatScalar(-1), false).MustAdd1(ts.FloatScalar(1.0), true) + p := v.MustMul(x1, false).MustClamp(ts.FloatScalar(0.0), ts.FloatScalar(1.0), true) + x1.MustDrop() + + // q = torch.clamp((v * (1.0 - s * f)), 0.0, 1.0) + x2 := s.MustMul(f, false).MustMul1(ts.FloatScalar(-1), true).MustAdd1(ts.FloatScalar(1.0), true) + q := v.MustMul(x2, false).MustClamp(ts.FloatScalar(0.0), ts.FloatScalar(1.0), true) + x2.MustDrop() + + //t = torch.clamp((v * (1.0 - s * (1.0 - f))), 0.0, 1.0) + // step1. s * (1.0 - f) + sub1 := f.MustMul1(ts.FloatScalar(-1), false).MustAdd1(ts.FloatScalar(1.0), true).MustMul(s, true) + // step 2: v *(1.0 - step1) + x3 := sub1.MustMul1(ts.FloatScalar(-1), true).MustAdd1(ts.FloatScalar(1.0), true).MustMul(v, true) // deleted sub1 + t := x3.MustClamp(ts.FloatScalar(0.0), ts.FloatScalar(1.0), true) // deleted x3 + + //i = i % 6 + iremainder := i.MustRemainder(ts.FloatScalar(6), true) // delete i + // torch.arange(6, device=i.device).view(-1, 1, 1) + x4 := ts.MustArange(ts.FloatScalar(6), gotch.Float, iremainder.MustDevice()).MustView([]int64{-1, 1, 1}, true) + mask := iremainder.MustUnsqueeze(-3, true).MustEq1(x4, true).MustTotype(x.DType(), true) // delete iremainder + x4.MustDrop() + + // a1 = torch.stack((v, q, p, p, t, v), dim=-3) + // a2 = torch.stack((t, v, v, q, p, p), dim=-3) + // a3 = torch.stack((p, p, t, v, v, q), dim=-3) + // a4 = torch.stack((a1, a2, a3), dim=-4) + a1 := ts.MustStack([]ts.Tensor{*v, *q, *p, *p, *t, *v}, -3) + a2 := ts.MustStack([]ts.Tensor{*t, *v, *v, *q, *p, *p}, -3) + a3 := ts.MustStack([]ts.Tensor{*p, *p, *t, *v, *v, *q}, -3) + a4 := ts.MustStack([]ts.Tensor{*a1, *a2, *a3}, -4) + + out := ts.MustEinsum("...ijk, ...xijk -> ...xjk", []ts.Tensor{*mask, *a4}) + + // Delete intermediate tensors + h.MustDrop() + s.MustDrop() + v.MustDrop() + f.MustDrop() + p.MustDrop() + q.MustDrop() + t.MustDrop() + + a1.MustDrop() + a2.MustDrop() + a3.MustDrop() + a4.MustDrop() + mask.MustDrop() + + return out +} + +// ref. https://en.wikipedia.org/wiki/HSL_and_HSV +func adjustHue(x *ts.Tensor, hue float64) *ts.Tensor { + if hue < -0.5 || hue > 0.5 { + err := fmt.Errorf("hue factor (%v) is not in [-0.5, 0.5]", hue) + log.Fatal(err) + } + assertImageTensor(x) + assertChannels(x, []int64{1, 3}) + + if c := imageChanNum(x); c == 1 { + out := x.MustShallowClone() + return out + } + + imgFl := x.MustTotype(gotch.Float, false).MustDiv1(ts.FloatScalar(255.0), true) + hsvImg := rgb2HSV(imgFl) + + hsvTs := hsvImg.MustUnbind(-3, true) + h := &hsvTs[0] + s := &hsvTs[1] + v := &hsvTs[2] + hAdj := h.MustAdd1(ts.FloatScalar(hue), false).MustRemainder(ts.FloatScalar(1.0), true) + + hsvAdj := ts.MustStack([]ts.Tensor{*hAdj, *s, *v}, -3) + + imgHueAdj := hsv2RGB(hsvAdj) + + out := imgHueAdj.MustMul1(ts.FloatScalar(255.0), true) + + imgFl.MustDrop() + h.MustDrop() + s.MustDrop() + v.MustDrop() + hAdj.MustDrop() + hsvAdj.MustDrop() + + return out +} + +func adjustGamma(x *ts.Tensor, gamma float64, gainOpt ...int64) *ts.Tensor { + // var gain int64 = 1 + // if len(gainOpt) > 0 { + // gain = gainOpt[0] + // } + // TODO + return x +} + +func RGB2HSV(x *ts.Tensor) *ts.Tensor { + return rgb2HSV(x) +} + +func HSV2RGB(x *ts.Tensor) *ts.Tensor { + return hsv2RGB(x) +} + +func pad(x *ts.Tensor, padding []int64, paddingMode string) *ts.Tensor { + switch paddingMode { + case "reflection": + return x.MustReflectionPad2d(padding, false) + case "constant": + return x.MustConstantPadNd(padding, false) + case "replicate": + return x.MustReplicationPad2d(padding, false) + case "circular": + // TODO: + // ref: https://github.com/pytorch/pytorch/blob/71f4c5c1f436258adc303b710efb3f41b2d50c4e/torch/nn/functional.py#L4493 + log.Fatal("Unsupported circular padding.") + default: + log.Fatalf("Unrecognized padding mode %q\n", paddingMode) + } + return nil +} + +func getImageSize(x *ts.Tensor) (width, height int64) { + assertImageTensor(x) + dim := x.MustSize() + return dim[len(dim)-1], dim[len(dim)-2] +} + +func makeSlice(from, to int64) []int64 { + n := from - to + var out []int64 = make([]int64, n) + for i := 0; i < int(n); i++ { + out[i] = from + int64(i) + } + return out +} + +func crop(x *ts.Tensor, top, left, height, width int64) *ts.Tensor { + // return img[..., top:top + height, left:left + width] + dim := x.MustSize() + c := dim[0] + + var chans []ts.Tensor = make([]ts.Tensor, c) + hNar := ts.NewNarrow(top, top+height) + wNar := ts.NewNarrow(left, left+width) + for i := 0; i < int(c); i++ { + cx := x.Idx(ts.NewSelect(int64(i))) + x1 := cx.Idx(hNar) + cx.MustDrop() + x1T := x1.MustT(true) + x2 := x1T.Idx(wNar) + x1T.MustDrop() + out := x2.MustT(true) + chans[i] = *out + } + + cropTs := ts.MustStack(chans, 0) + for i := range chans { + chans[i].MustDrop() + } + return cropTs +} + +// Crops the given image at the center. +// If the image is torch Tensor, it is expected +// to have [..., H, W] shape, where ... means an arbitrary number of leading dimensions. +// If image size is smaller than output size along any edge, image is padded with 0 and then center cropped. +func centerCrop(x *ts.Tensor, size []int64) *ts.Tensor { + imgW, imgH := getImageSize(x) + cropH, cropW := size[0], size[1] + + var paddedImg *ts.Tensor + + if cropW > imgW || cropH > imgH { + // (crop_width - image_width) // 2 if crop_width > image_width else 0, + // (crop_width - image_width + 1) // 2 if crop_width > image_width else 0, + var left, top, right, bottom int64 = 0, 0, 0, 0 + if cropW > imgW { + left = (cropW - imgW) / 2 + right = (cropW - imgW + 1) / 2 + } + // (crop_height - image_height) // 2 if crop_height > image_height else 0, + // (crop_height - image_height + 1) // 2 if crop_height > image_height else 0, + if cropH > imgH { + top = (cropH - imgH) / 2 + bottom = (cropH - imgH + 1) / 2 + } + + // floatX := x.MustTotype(gotch.Float, false) + // paddedImg = pad(floatX, []int64{left, right, top, bottom}, "reflection") + // floatX.MustDrop() + + paddedImg = pad(x, []int64{left, right, top, bottom}, "constant") + imgW, imgH = getImageSize(paddedImg) + if cropW == imgW && cropH == imgH { + return paddedImg + } + } else { + paddedImg = x.MustShallowClone() + } + + // cropTop := int64(math.Floor(float64(imgH-cropH) / 2.0)) + // cropLeft := int64(math.Floor(float64(imgW-cropW) / 2.0)) + cropTop := (imgH - cropH) / 2 + cropLeft := (imgW - cropW) / 2 + + out := crop(paddedImg, cropTop, cropLeft, cropH, cropW) + paddedImg.MustDrop() + + return out +} + +// cutout erases the input Tensor Image with given value +// +// Args: +// img (Tensor Image): Tensor image of size (C, H, W) to be erased +// i (int): i in (i,j) i.e coordinates of the upper left corner. +// j (int): j in (i,j) i.e coordinates of the upper left corner. +// h (int): Height of the erased region. +// w (int): Width of the erased region. +// v: Erasing value. +func cutout(x *ts.Tensor, top, left, height, width int64, rgbVal []int64) *ts.Tensor { + output := x.MustZerosLike(false) + output.Copy_(x) + dim := output.MustSize() + for i := 0; i < int(dim[0]); i++ { + cIdx := ts.NewSelect(int64(i)) + hNar := ts.NewNarrow(top, top+height) + wNar := ts.NewNarrow(left, left+width) + srcIdx := []ts.TensorIndexer{cIdx, hNar, wNar} + view := output.Idx(srcIdx) + oneTs := view.MustOnesLike(false) + vTs := oneTs.MustMul1(ts.IntScalar(rgbVal[i]), true) + view.Copy_(vTs) + vTs.MustDrop() + view.MustDrop() + } + + // output.Print() + return output +} + +func hflip(x *ts.Tensor) *ts.Tensor { + assertImageTensor(x) + return x.MustFlip([]int64{-1}, false) +} + +func vflip(x *ts.Tensor) *ts.Tensor { + assertImageTensor(x) + return x.MustFlip([]int64{-2}, false) +} + +// Ref. https://stackoverflow.com/questions/64197754 +// Ref. https://pytorch.org/tutorials/intermediate/spatial_transformer_tutorial.html +func getRotMat(theta float64) (*ts.Tensor, error) { + grid := []float64{math.Cos(theta), -1 * (math.Sin(theta)), 0, math.Sin(theta), math.Cos(theta), 0} + t, err := ts.NewTensorFromData(grid, []int64{2, 3}) + if err != nil { + return nil, err + } + + return t, nil +} + +func rotImg(x *ts.Tensor, theta float64, dtype gotch.DType) (*ts.Tensor, error) { + rotMat, err := getRotMat(theta) + if err != nil { + return nil, err + } + + size := x.MustSize() + mat := rotMat.MustUnsqueeze(0, true).MustTotype(dtype, true).MustRepeat([]int64{size[0], 1, 1}, true) + grid := ts.MustAffineGridGenerator(mat, size, true).MustTo(x.MustDevice(), true) + mat.MustDrop() + + out, err := ts.GridSampler(x, grid, 1, 1, true) + if err != nil { + return nil, err + } + grid.MustDrop() + return out, nil +} + +func applyGridTransform(x, gridInput *ts.Tensor, mode string, fillValue []float64) *ts.Tensor { + dtype := gridInput.DType() + img, needCast, needSqueeze, outDtype := castSqueezeIn(x, []gotch.DType{dtype}) + + imgDim := img.MustSize() + gridDim := gridInput.MustSize() + var grid *ts.Tensor + if imgDim[0] > 1 { + // Apply same grid to a batch of images + // grid = grid.expand(img.shape[0], grid.shape[1], grid.shape[2], grid.shape[3]) + grid = gridInput.MustExpand([]int64{imgDim[0], gridDim[1], gridDim[2], gridDim[3]}, true, false) + } else { + grid = gridInput.MustShallowClone() + } + + // Append a dummy mask for customized fill colors, should be faster than grid_sample() twice + // dummy = torch.ones((img.shape[0], 1, img.shape[2], img.shape[3]), dtype=img.dtype, device=img.device) + // img = torch.cat((img, dummy), dim=1) + dummy := ts.MustOnes([]int64{img.MustSize()[0], 1, img.MustSize()[2], img.MustSize()[3]}, img.DType(), img.MustDevice()) + imgCat := ts.MustCat([]ts.Tensor{*img, *dummy}, 1) + dummy.MustDrop() + img.MustDrop() + + // imgSample := gridSample(imgCat, grid, mode, "zeros", false) + var ( + modeInt int64 = 0 + paddingMode int64 = 0 + ) + + imgSample := ts.MustGridSampler(imgCat, grid, modeInt, paddingMode, false) + imgCat.MustDrop() + grid.MustDrop() + + // TODO. + // Fill with required color + // mask = img[:, -1:, :, :] # N * 1 * H * W + // img = img[:, :-1, :, :] # N * C * H * W + // mask = mask.expand_as(img) + // len_fill = len(fill) if isinstance(fill, (tuple, list)) else 1 + // fill_img = torch.tensor(fill, dtype=img.dtype, device=img.device).view(1, len_fill, 1, 1).expand_as(img) + // if mode == 'nearest': + // mask = mask < 0.5 + // img[mask] = fill_img[mask] + // else: # 'bilinear' + // img = img * mask + (1.0 - mask) * fill_img + image := imgSample.MustNarrow(0, 0, 1, false).MustNarrow(1, 0, 3, true) + mask := imgSample.MustNarrow(0, 0, 1, false).MustNarrow(1, -1, 1, true).MustExpandAs(image, true) + imgSample.MustDrop() + fillImg := ts.MustOfSlice(fillValue).MustTotype(image.DType(), true).MustTo(image.MustDevice(), true).MustView([]int64{1, 3, 1, 1}, true).MustExpandAs(image, true) + + // img = img * mask + (1.0 - mask) * fill_img + addTs := mask.MustMul1(ts.FloatScalar(-1), false).MustAdd1(ts.FloatScalar(1.0), true).MustMul(fillImg, true) + imgOut := image.MustMul(mask, true).MustAdd(addTs, true) + addTs.MustDrop() + image.MustDrop() + mask.MustDrop() + fillImg.MustDrop() + + // out := castSqueezeOut(imgSample, needCast, needSqueeze, outDtype) + out := castSqueezeOut(imgOut, needCast, needSqueeze, outDtype) + imgOut.MustDrop() + + return out +} + +// Helper function to get the coefficients (a, b, c, d, e, f, g, h) for the perspective transforms. +// +// In Perspective Transform each pixel (x, y) in the original image gets transformed as, +// (x, y) -> ( (ax + by + c) / (gx + hy + 1), (dx + ey + f) / (gx + hy + 1) ) +// Args: +// - startpoints (list of list of ints): List containing four lists of two integers corresponding to four corners +// ``[top-left, top-right, bottom-right, bottom-left]`` of the original image. +// - endpoints (list of list of ints): List containing four lists of two integers corresponding to four corners +// ``[top-left, top-right, bottom-right, bottom-left]`` of the transformed image. +// Returns: +// - octuple (a, b, c, d, e, f, g, h) for transforming each pixel. +func perspectiveCoeff(startPoints, endPoints [][]int64) []float64 { + size := int64(2 * len(startPoints)) + aMat := ts.MustZeros([]int64{size, 8}, gotch.Float, gotch.CPU) + for i := 0; i < len(startPoints); i++ { + p1 := endPoints[i] + p2 := startPoints[i] + // a_matrix[2 * i, :] = torch.tensor([p1[0], p1[1], 1, 0, 0, 0, -p2[0] * p1[0], -p2[0] * p1[1]]) + val1 := ts.MustOfSlice([]int64{p1[0], p1[1], 1, 0, 0, 0, -p2[0] * p1[0], -p2[0] * p1[1]}) + // a_matrix[2 * i + 1, :] = torch.tensor([0, 0, 0, p1[0], p1[1], 1, -p2[1] * p1[0], -p2[1] * p1[1]]) + val2 := ts.MustOfSlice([]int64{0, 0, 0, p1[0], p1[1], 1, -p2[1] * p1[0], -p2[1] * p1[1]}) + + idx1 := ts.NewSelect(int64(2 * i)) + aMatView1 := aMat.Idx(idx1) + aMatView1.Copy_(val1) + val1.MustDrop() + + idx2 := ts.NewSelect(int64(2*i + 1)) + aMatView2 := aMat.Idx(idx2) + aMatView2.Copy_(val2) + val2.MustDrop() + } + + var startData []int64 + for _, p := range startPoints { + startData = append(startData, p[0], p[1]) + } + + // bMat := ts.MustOfSlice(startPoints).MustTotype(gotch.Float, true).MustView([]int64{8}, true) + bMat := ts.MustOfSlice(startData).MustTotype(gotch.Float, true).MustView([]int64{8}, true) + + res := bMat.MustLstsq(aMat, true) + + aMat.MustDrop() + outputTs := res.MustSqueeze1(1, true) + output := outputTs.Float64Values() + outputTs.MustDrop() + + return output +} + +func perspectiveGrid(coef []float64, ow, oh int64, dtype gotch.DType, device gotch.Device) *ts.Tensor { + // https://github.com/python-pillow/Pillow/blob/4634eafe3c695a014267eefdce830b4a825beed7/ + // src/libImaging/Geometry.c#L394 + // x_out = (coeffs[0] * x + coeffs[1] * y + coeffs[2]) / (coeffs[6] * x + coeffs[7] * y + 1) + // y_out = (coeffs[3] * x + coeffs[4] * y + coeffs[5]) / (coeffs[6] * x + coeffs[7] * y + 1) + + theta1 := ts.MustOfSlice([]float64{ + coef[0], + coef[1], + coef[2], + coef[3], + coef[4], + coef[5], + }).MustTotype(dtype, true).MustTo(device, true).MustView([]int64{1, 2, 3}, true) + + theta2 := ts.MustOfSlice([]float64{ + coef[6], + coef[7], + coef[1.0], + coef[6], + coef[7], + coef[1.0], + }).MustTotype(dtype, true).MustTo(device, true).MustView([]int64{1, 2, 3}, true) + + d := 0.5 + + baseGrid := ts.MustEmpty([]int64{1, oh, ow, 3}, dtype, device) + + // x_grid = torch.linspace(d, ow * 1.0 + d - 1.0, steps=ow, device=device) + endX := float64(ow) + d - 1.0 + xGrid := ts.MustLinspace(ts.FloatScalar(d), ts.FloatScalar(endX), []int64{ow}, dtype, device) + + // y_grid = torch.linspace(d, oh * 1.0 + d - 1.0, steps=oh, device=device).unsqueeze_(-1) + endY := float64(oh) + d - 1.0 + yGrid := ts.MustLinspace(ts.FloatScalar(d), ts.FloatScalar(endY), []int64{oh}, dtype, device) + + // base_grid[..., 0].copy_(x_grid) + // base_grid[..., 1].copy_(y_grid) + // base_grid[..., 2].fill_(1) + baseDim := baseGrid.MustSize() + for i := 0; i < int(baseDim[1]); i++ { + view := baseGrid.MustSelect(0, 0, false).MustSelect(0, int64(i), true).MustSelect(1, 0, true) + view.Copy_(xGrid) + view.MustDrop() + } + for i := 0; i < int(baseDim[2]); i++ { + view := baseGrid.MustSelect(0, 0, false).MustSelect(1, int64(i), true).MustSelect(1, 1, true) + view.Copy_(yGrid) + view.MustDrop() + } + + for i := 0; i < int(baseDim[2]); i++ { + view := baseGrid.MustSelect(0, 0, false).MustSelect(1, int64(i), true).MustSelect(1, 2, true) + // view.Fill_(ts.FloatScalar(1.0)) // NOTE. THIS CAUSES MEMORY LEAK!!! + oneTs := view.MustOnesLike(false) + view.Copy_(oneTs) + oneTs.MustDrop() + view.MustDrop() + } + + // rescaled_theta1 = theta1.transpose(1, 2) / torch.tensor([0.5 * ow, 0.5 * oh], dtype=dtype, device=device) + divTs := ts.MustOfSlice([]float64{0.5 * float64(ow), 0.5 * float64(oh)}).MustTotype(dtype, true).MustTo(device, true) + rescaledTheta1 := theta1.MustTranspose(1, 2, true).MustDiv(divTs, true) + divTs.MustDrop() + outputGrid1 := baseGrid.MustView([]int64{1, oh * ow, 3}, false).MustBmm(rescaledTheta1, true) + + // output_grid2 = base_grid.view(1, oh * ow, 3).bmm(theta2.transpose(1, 2)) + rescaledTheta2 := theta2.MustTranspose(1, 2, true) + outputGrid2 := baseGrid.MustView([]int64{1, oh * ow, 3}, false).MustBmm(rescaledTheta2, true) + + rescaledTheta1.MustDrop() + rescaledTheta2.MustDrop() + + outputGrid := outputGrid1.MustDiv(outputGrid2, true).MustSub1(ts.FloatScalar(1.0), true).MustView([]int64{1, oh, ow, 2}, true) + outputGrid2.MustDrop() + + baseGrid.MustDrop() + + return outputGrid +} + +func perspective(x *ts.Tensor, startPoints, endPoints [][]int64, mode string, fillValue []float64) *ts.Tensor { + coef := perspectiveCoeff(startPoints, endPoints) + + assertImageTensor(x) + // assertGridTransformInputs(x, nil, mode, fillValue, []string{"nearest", "bilinear"}, coef) + + dim := x.MustSize() + ow, oh := dim[len(dim)-1], dim[len(dim)-2] + device := x.MustDevice() + grid := perspectiveGrid(coef, ow, oh, gotch.Float, device) + + output := applyGridTransform(x, grid, mode, fillValue) + grid.MustDrop() + + return output +} + +// Apply affine transformation on the image keeping image center invariant. +// +//If the image is torch Tensor, it is expected +// to have [..., H, W] shape, where ... means an arbitrary number of leading dimensions. +// Args: +// - img (Tensor): image to transform. +// - angle (number): rotation angle in degrees between -180 and 180, clockwise direction. +// - translate (sequence of integers): horizontal and vertical translations (post-rotation translation) +// - scale (float): overall scale +// - shear (float or sequence): shear angle value in degrees between -180 to 180, clockwise direction. +// If a sequence is specified, the first value corresponds to a shear parallel to the x axis, while +// the second value corresponds to a shear parallel to the y axis. +// - interpolation (InterpolationMode): Desired interpolation enum defined by +// :class:`torchvision.transforms.InterpolationMode`. Default is ``InterpolationMode.NEAREST``. +// If input is Tensor, only ``InterpolationMode.NEAREST``, ``InterpolationMode.BILINEAR`` are supported. +// - fill (sequence or number, optional): Pixel fill value for the area outside the transformed +// image. If given a number, the value is used for all bands respectively. +func affine(img *ts.Tensor, angle float64, translations []int64, scale float64, shear []float64, interpolationMode string, fillValue []float64) *ts.Tensor { + + var translateF []float64 + for _, v := range translations { + translateF = append(translateF, float64(v)) + } + + matrix := getInverseAffineMatrix([]float64{0.0, 0.0}, angle, translateF, scale, shear) + + dtype := gotch.Float + device := img.MustDevice() + dim := img.MustSize() + theta := ts.MustOfSlice(matrix).MustTotype(dtype, true).MustTo(device, true).MustView([]int64{1, 2, 3}, true) + + // grid will be generated on the same device as theta and img + w := dim[len(dim)-1] + h := dim[len(dim)-2] + ow := w + oh := h + + // grid = _gen_affine_grid(theta, w=shape[-1], h=shape[-2], ow=shape[-1], oh=shape[-2]) + grid := genAffineGrid(theta, w, h, ow, oh) + // grid := ts.MustEmpty([]int64{1, 512, 512, 2}, dtype, device) + + out := applyGridTransform(img, grid, interpolationMode, fillValue) + + grid.MustDrop() + theta.MustDrop() + + return out +} + +// Helper method to compute inverse matrix for affine transformation +// +// As it is explained in PIL.Image.rotate +// We need compute INVERSE of affine transformation matrix: M = T * C * RSS * C^-1 +// where T is translation matrix: [1, 0, tx | 0, 1, ty | 0, 0, 1] +// C is translation matrix to keep center: [1, 0, cx | 0, 1, cy | 0, 0, 1] +// RSS is rotation with scale and shear matrix +// RSS(a, s, (sx, sy)) = +// = R(a) * S(s) * SHy(sy) * SHx(sx) +// = [ s*cos(a - sy)/cos(sy), s*(-cos(a - sy)*tan(x)/cos(y) - sin(a)), 0 ] +// [ s*sin(a + sy)/cos(sy), s*(-sin(a - sy)*tan(x)/cos(y) + cos(a)), 0 ] +// [ 0 , 0 , 1 ] +// +// where R is a rotation matrix, S is a scaling matrix, and SHx and SHy are the shears: +// SHx(s) = [1, -tan(s)] and SHy(s) = [1 , 0] +// [0, 1 ] [-tan(s), 1] +// +// Thus, the inverse is M^-1 = C * RSS^-1 * C^-1 * T^-1 +func getInverseAffineMatrix(center []float64, angle float64, translate []float64, scale float64, shear []float64) []float64 { + + // convert to randiants + rot := angle * math.Pi / 180 + sx := shear[0] * math.Pi / 180 + sy := shear[1] * math.Pi / 180 + + cx, cy := center[0], center[1] + tx, ty := translate[0], translate[1] + + // RSS without scaling + // a = math.cos(rot - sy) / math.cos(sy) + a := math.Cos(rot-sy) / math.Cos(sy) + // b = -math.cos(rot - sy) * math.tan(sx) / math.cos(sy) - math.sin(rot) + b := -math.Cos(rot-sy)*math.Tan(sx)/math.Cos(sy) - math.Sin(rot) + // c = math.sin(rot - sy) / math.cos(sy) + c := math.Sin(rot-sy) / math.Cos(sy) + // d = -math.sin(rot - sy) * math.tan(sx) / math.cos(sy) + math.cos(rot) + d := -math.Sin(rot-sy)*math.Tan(sx)/math.Cos(sy) + math.Cos(rot) + + // Inverted rotation matrix with scale and shear + // det([[a, b], [c, d]]) == 1, since det(rotation) = 1 and det(shear) = 1 + // matrix = [d, -b, 0.0, -c, a, 0.0] + var matrix []float64 = []float64{d, -b, 0.0, -c, a, 0.0} + // matrix = [x / scale for x in matrix] + var mat []float64 + for _, v := range matrix { + mat = append(mat, v/scale) + } + + // Apply inverse of translation and of center translation: RSS^-1 * C^-1 * T^-1 + // matrix[2] += matrix[0] * (-cx - tx) + matrix[1] * (-cy - ty) + mat[2] += mat[0]*(-cx-tx) + mat[1]*(-cy-ty) + // matrix[5] += matrix[3] * (-cx - tx) + matrix[4] * (-cy - ty) + mat[5] += mat[3]*(-cx-tx) + mat[4]*(-cy-ty) + + // Apply center translation: C * RSS^-1 * C^-1 * T^-1 + // matrix[2] += cx + mat[2] += cx + // matrix[5] += cy + mat[5] += cy + + return mat +} + +// https://github.com/pytorch/pytorch/blob/74b65c32be68b15dc7c9e8bb62459efbfbde33d8/aten/src/ATen/native/ +// AffineGridGenerator.cpp#L18 +// Difference with AffineGridGenerator is that: +// 1) we normalize grid values after applying theta +// 2) we can normalize by other image size, such that it covers "extend" option like in PIL.Image.rotate +func genAffineGrid(theta *ts.Tensor, w, h, ow, oh int64) *ts.Tensor { + d := 0.5 + dtype := theta.DType() + device := theta.MustDevice() + // base_grid = torch.empty(1, oh, ow, 3, dtype=theta.dtype, device=theta.device) + baseGrid := ts.MustEmpty([]int64{1, oh, ow, 3}, dtype, device) + + // x_grid = torch.linspace(-ow * 0.5 + d, ow * 0.5 + d - 1, steps=ow, device=theta.device) + startX := float64(-ow)*0.5 + d + endX := float64(ow)*0.5 + d - 1.0 + xGrid := ts.MustLinspace(ts.FloatScalar(startX), ts.FloatScalar(endX), []int64{ow}, dtype, device) + + // y_grid = torch.linspace(-oh * 0.5 + d, oh * 0.5 + d - 1, steps=oh, device=theta.device).unsqueeze_(-1) + startY := float64(-oh)*0.5 + d + endY := float64(oh)*0.5 + d - 1.0 + yGrid := ts.MustLinspace(ts.FloatScalar(startY), ts.FloatScalar(endY), []int64{oh}, dtype, device) + + // base_grid[..., 0].copy_(x_grid) + // base_grid[..., 1].copy_(y_grid) + // base_grid[..., 2].fill_(1) + baseDim := baseGrid.MustSize() + for i := 0; i < int(baseDim[1]); i++ { + view := baseGrid.MustSelect(0, 0, false).MustSelect(0, int64(i), true).MustSelect(1, 0, true) + view.Copy_(xGrid) + view.MustDrop() + } + for i := 0; i < int(baseDim[2]); i++ { + view := baseGrid.MustSelect(0, 0, false).MustSelect(1, int64(i), true).MustSelect(1, 1, true) + view.Copy_(yGrid) + view.MustDrop() + } + + for i := 0; i < int(baseDim[2]); i++ { + view := baseGrid.MustSelect(0, 0, false).MustSelect(1, int64(i), true).MustSelect(1, 2, true) + // view.Fill_(ts.FloatScalar(1.0)) // NOTE. THIS CAUSES MEMORY LEAK!!!! + oneTs := view.MustOnesLike(false) + view.Copy_(oneTs) + oneTs.MustDrop() + view.MustDrop() + } + + // rescaled_theta = theta.transpose(1, 2) / torch.tensor([0.5 * w, 0.5 * h], dtype=theta.dtype, device=theta.device) + + // rescaled_theta1 = theta1.transpose(1, 2) / torch.tensor([0.5 * ow, 0.5 * oh], dtype=dtype, device=device) + divTs := ts.MustOfSlice([]float64{0.5 * float64(w), 0.5 * float64(h)}).MustTotype(dtype, true).MustTo(device, true) + rescaledTheta := theta.MustTranspose(1, 2, false).MustDiv(divTs, true) + divTs.MustDrop() + + // output_grid = base_grid.view(1, oh * ow, 3).bmm(rescaled_theta) + outputGrid := baseGrid.MustView([]int64{1, oh * ow, 3}, false).MustBmm(rescaledTheta, true).MustView([]int64{1, oh, ow, 2}, true) + + baseGrid.MustDrop() + xGrid.MustDrop() + yGrid.MustDrop() + rescaledTheta.MustDrop() + + return outputGrid +} + +// randPvalue generates a random propability value [0, 1] +func randPvalue() float64 { + rand.Seed(time.Now().UnixNano()) + var min, max float64 = 0.0, 1.0 + + r := min + rand.Float64()*(max-min) + return r +} + +func getImageChanNum(x *ts.Tensor) int64 { + dim := x.MustSize() + switch { + case len(dim) == 2: + return 1 + case len(dim) > 2: + return dim[len(dim)-3] + default: + log.Fatalf("Input image tensor should have dim of 2 or more. Got %v\n", len(dim)) + } + + log.Fatalf("Input image tensor should have dim of 2 or more. Got %v\n", len(dim)) + return -1 +} + +// solarize solarizes an RGB/grayscale image by inverting all pixel values above a threshold. +// Args: +// - img (Tensor): Image to have its colors inverted. +// If img is torch Tensor, it is expected to be in [..., 1 or 3, H, W] format, +// where ... means it can have an arbitrary number of leading dimensions. +// - threshold (float): All pixels equal or above this value are inverted. +func solarize(img *ts.Tensor, threshold float64) *ts.Tensor { + assertImageTensor(img) + + dim := img.MustSize() + if len(dim) < 3 { + log.Fatalf("Input image tensor should have at least 3 dimensions. Got %v", len(dim)) + } + + assertChannels(img, []int64{1, 3}) + + invertedImg := invert(img) + + // return torch.where(img >= threshold, inverted_img, img) + conditionTs := img.MustGe(ts.FloatScalar(threshold), false) + + out := img.MustWhere1(conditionTs, invertedImg, false) + + invertedImg.MustDrop() + conditionTs.MustDrop() + + return out +} + +// invert inverts image tensor. +func invert(img *ts.Tensor) *ts.Tensor { + assertImageTensor(img) + + dim := img.MustSize() + if len(dim) < 3 { + log.Fatalf("Input image tensor should have at least 3 dimensions. Got %v", len(dim)) + } + + assertChannels(img, []int64{1, 3}) + + var bound int64 = 255 + // return bound - img + out := img.MustMul1(ts.IntScalar(-1), false).MustAdd1(ts.IntScalar(bound), true) + return out +} + +func posterize(img *ts.Tensor, bits uint8) *ts.Tensor { + assertImageTensor(img) + + dim := img.MustSize() + + if len(dim) < 3 { + log.Fatalf("Input image tensor should have at least 3 dimensions. Got %v\n", len(dim)) + } + + dtype := img.DType() + if dtype != gotch.Uint8 { + log.Fatalf("Only dtype uint8 image tensors are supported. Got %v", dtype) + } + + assertChannels(img, []int64{1, 3}) + + // mask = -int(2**(8 - bits)) # JIT-friendly for: ~(2 ** (8 - bits) - 1) + // or mask := -int64(1<<(uint8(8) - bits)) + mask := -int64(math.Exp2(float64(uint8(8) - bits))) + + out := img.MustBitwiseAnd(ts.IntScalar(mask), false) + return out +} + +func autocontrast(img *ts.Tensor) *ts.Tensor { + assertImageTensor(img) + + dim := img.MustSize() + + if len(dim) < 3 { + log.Fatalf("Input image tensor should have at least 3 dimensions. Got %v\n", len(dim)) + } + + var bound int64 = 255 + dtype := gotch.Float + + // minimum = img.amin(dim=(-2, -1), keepdim=True).to(dtype) + minTs := img.MustAmin([]int64{-2, -1}, true, false).MustTotype(dtype, true) + // maximum = img.amax(dim=(-2, -1), keepdim=True).to(dtype) + maxTs := img.MustAmax([]int64{-2, -1}, true, false).MustTotype(dtype, true) + + // eq_idxs = torch.where(minimum == maximum)[0] + // NOTE. Eq(minTs, maxTs) give [n, c, 1, 1] or [channels, 1, 1] + eqIdx := minTs.MustEq1(maxTs, false).MustSqueeze1(-1, true).MustSqueeze1(-1, true).MustTotype(gotch.Int64, true) + + // minimum[eq_idxs] = 0 + minTsView := minTs.MustIndexSelect(0, eqIdx, false) + zerosTs := minTsView.MustZerosLike(false) + minTsView.Copy_(zerosTs) + zerosTs.MustDrop() + minTsView.MustDrop() + + // maximum[eq_idxs] = bound + maxTsView := maxTs.MustIndexSelect(0, eqIdx, false) + boundTs := maxTsView.MustOnesLike(false).MustMul1(ts.IntScalar(bound), true) + maxTsView.Copy_(boundTs) + boundTs.MustDrop() + maxTsView.MustDrop() + + // scale = bound / (maximum - minimum) + scale := maxTs.MustSub(minTs, false).MustPow(ts.IntScalar(-1), true).MustMul1(ts.IntScalar(bound), true) + // + // return ((img - minimum) * scale).clamp(0, bound).to(img.dtype) + out := img.MustSub(minTs, false).MustMul(scale, true).MustClamp(ts.IntScalar(0), ts.IntScalar(bound), true).MustTotype(dtype, true) + + minTs.MustDrop() + maxTs.MustDrop() + eqIdx.MustDrop() + scale.MustDrop() + + return out +} + +func adjustSharpness(img *ts.Tensor, factor float64) *ts.Tensor { + if factor < 0 { + log.Fatalf("Sharpness factor should not be negative. Got %v", factor) + } + + assertImageTensor(img) + assertChannels(img, []int64{1, 3}) + + dim := img.MustSize() + + var out *ts.Tensor + if (dim[len(dim)-1]) <= 2 || (dim[len(dim)-2] <= 2) { + out = img.MustShallowClone() + return out + } + + // return _blend(img, _blurred_degenerate_image(img), sharpness_factor) + img1 := blurredDegenerateImage(img) + out = blend(img, img1, factor) + + img1.MustDrop() + return out +} + +func blurredDegenerateImage(img *ts.Tensor) *ts.Tensor { + dtype := gotch.Float + device := img.MustDevice() + dim := img.MustSize() + + // kernel = torch.ones((3, 3), dtype=dtype, device=img.device) + kernel := ts.MustOnes([]int64{3, 3}, dtype, device) + + // kernel[1, 1] = 5.0 - Center kernel value + kernelView := kernel.MustNarrow(1, 1, 2, false) + centerVal := kernelView.MustOnesLike(false).MustMul1(ts.FloatScalar(5.0), true) + kernelView.Copy_(centerVal) // center kernel value + centerVal.MustDrop() + kernelView.MustDrop() + + // kernel /= kernel.sum() + kernelSum := kernel.MustSum(dtype, false) + kernelS := kernel.MustDiv(kernelSum, false) + kernelSum.MustDrop() + // kernel = kernel.expand(img.shape[-3], 1, kernel.shape[0], kernel.shape[1]) + kdim := kernelS.MustSize() + kdtype := kernelS.DType() + kernelExp := kernelS.MustExpand([]int64{dim[len(dim)-3], 1, kdim[0], kdim[1]}, true, false) + + // result_tmp, need_cast, need_squeeze, out_dtype = _cast_squeeze_in(img, [kernel.dtype, ]) + resTmp, needCast, needSqueeze, outDtype := castSqueezeIn(img, []gotch.DType{kdtype}) + + // result_tmp = conv2d(result_tmp, kernel, groups=result_tmp.shape[-3]) + stride := []int64{1, 1} + padding := []int64{0, 0} + dilation := []int64{1, 1} + resTmpDim := resTmp.MustSize() + group := resTmpDim[len(resTmpDim)-3] + resTmp1 := ts.MustConv2d(resTmp, kernelExp, ts.NewTensor(), stride, padding, dilation, group) + + // result_tmp = _cast_squeeze_out(result_tmp, need_cast, need_squeeze, out_dtype) + resTmp2 := castSqueezeOut(resTmp1, needCast, needSqueeze, outDtype) + + // result = img.clone() + out := img.MustShallowClone() + + // result[..., 1:-1, 1:-1] = result_tmp + hDim := int64(len(dim) - 2) // second last dim + wDim := int64(len(dim) - 1) // last dim + outView := out.MustNarrow(hDim, 1, dim[len(dim)-2]-2, false).MustNarrow(wDim, 1, dim[len(dim)-1]-2, true) + + outView.Copy_(resTmp2) + + outView.MustDrop() + kernelS.MustDrop() + kernelExp.MustDrop() + resTmp.MustDrop() + resTmp1.MustDrop() + resTmp2.MustDrop() + + return out +} + +func equalize(img *ts.Tensor) *ts.Tensor { + assertImageTensor(img) + + shape := img.MustSize() + ndim := len(shape) + dtype := img.DType() + + if ndim < 3 || ndim > 4 { + log.Fatalf("Input image should have 3 or 4 dimensions. Got %v", ndim) + } + + if dtype != gotch.Uint8 { + log.Fatalf("Only dtype uint8 image tensors are supported. Got %v", dtype) + } + + assertChannels(img, []int64{1, 3}) + + // single image + if ndim == 3 { + out := equalizeSingleImage(img) + return out + } + + // batched images + var images []ts.Tensor + for i := 0; i < int(shape[0]); i++ { + x := img.MustSelect(0, int64(i), false) + o := equalizeSingleImage(x) + images = append(images, *o) + x.MustDrop() + } + + out := ts.MustStack(images, 0) + + for _, x := range images { + x.MustDrop() + } + + return out +} + +func equalizeSingleImage(img *ts.Tensor) *ts.Tensor { + dim := img.MustSize() + var scaledChans []ts.Tensor + for i := 0; i < int(dim[0]); i++ { + cTs := img.MustSelect(0, int64(i), false) + scaledChan := scaleChannel(cTs) + cTs.MustDrop() + scaledChans = append(scaledChans, *scaledChan) + } + + out := ts.MustStack(scaledChans, 0) + + for _, x := range scaledChans { + x.MustDrop() + } + + return out +} + +func scaleChannel(imgChan *ts.Tensor) *ts.Tensor { + // # TODO: we should expect bincount to always be faster than histc, but this + // # isn't always the case. Once + // # https://github.com/pytorch/pytorch/issues/53194 is fixed, remove the if + // # block and only use bincount. + // if img_chan.is_cuda: + // hist = torch.histc(img_chan.to(torch.float32), bins=256, min=0, max=255) + // else: + // hist = torch.bincount(img_chan.view(-1), minlength=256) + + // hist = torch.histc(img_chan.to(torch.float32), bins=256, min=0, max=255) + hist := imgChan.MustHistc(256, false) + + // nonzero_hist = hist[hist != 0] + nonZeroHist := hist.MustNonzero(false) // [n, 1] + + // step = torch.div(nonzero_hist[:-1].sum(), 255, rounding_mode='floor') + nonZeroHistDim := nonZeroHist.MustSize() + nonZeroHistSum := nonZeroHist.MustNarrow(0, 0, nonZeroHistDim[0]-1, true).MustSum(gotch.Int64, true) + step := nonZeroHistSum.MustDiv1(ts.IntScalar(255), true) + stepVal := step.Int64Values()[0] + nonZeroHistSum.MustDrop() + + var out *ts.Tensor + // if step == 0: + // return img_chan + if stepVal == 0 { + out = imgChan.MustShallowClone() + return out + } + + // lut = torch.div(torch.cumsum(hist, 0) + torch.div(step, 2, rounding_mode='floor'),step, rounding_mode='floor') + dtype := gotch.Float + halfStep := step.MustDiv1(ts.IntScalar(2), false) + histCumSum := hist.MustCumsum(0, dtype, false) + histStep := histCumSum.MustAdd(halfStep, false) + halfStep.MustDrop() + lut := histStep.MustDiv(step, true) // deleted histStep + + // lut = torch.nn.functional.pad(lut, [1, 0])[:-1].clamp(0, 255) + lut1 := lut.MustConstantPadNd([]int64{1, 0}, true) // deleted lut + lut1Dim := lut1.MustSize() + + lut2 := lut1.MustNarrow(0, 0, lut1Dim[0]-1, true).MustClamp(ts.IntScalar(0), ts.IntScalar(255), true) // deleted lut1 + // return lut[img_chan.to(torch.int64)].to(torch.uint8) + // NOTE: haven't supported multi-dimentional tensor index yet. So we do a in a loop + // channel[h, w] + h := imgChan.MustSize()[0] + // w := imgChan.MustSize()[1] + var xs []ts.Tensor + for i := 0; i < int(h); i++ { + idx := imgChan.MustSelect(0, int64(i), false).MustTotype(gotch.Int64, true) + x := lut2.MustIndexSelect(0, idx, false).MustTotype(gotch.Uint8, true) + xs = append(xs, *x) + idx.MustDrop() + } + out = ts.MustStack(xs, 0) + + // delete intermediate tensors + for _, x := range xs { + x.MustDrop() + } + halfStep.MustDrop() + lut2.MustDrop() + hist.MustDrop() + step.MustDrop() + + return out +} + +// Normalize a float tensor image with mean and standard deviation. +// +// Args: +// - tensor (Tensor): Float tensor image of size (C, H, W) or (B, C, H, W) to be normalized. +// - mean (sequence): Sequence of means for each channel. +// - std (sequence): Sequence of standard deviations for each channel. +// Returns: +// - Tensor: Normalized Tensor image. +func normalize(img *ts.Tensor, mean, std []float64) *ts.Tensor { + for _, v := range std { + if v == 0 { + log.Fatalf("One of std (%v) is zero. This is invalid as it leads to division by zero.", std) + } + } + + assertImageTensor(img) + + dim := img.MustSize() + // dtype := img.DType() + device := img.MustDevice() + if len(dim) < 3 { + log.Fatalf("Expected tensor to be a tensor image of size (..., C, H, W). Got tensor.size() =%v", dim) + } + + meanTs := ts.MustOfSlice(mean).MustTotype(gotch.Float, true).MustTo(device, true) + stdTs := ts.MustOfSlice(std).MustTotype(gotch.Float, true).MustTo(device, true) + + var mTs, sTs *ts.Tensor + meanSize := meanTs.MustSize() + stdSize := stdTs.MustSize() + switch len(meanSize) { + case 1: + mTs = meanTs.MustView([]int64{-1, 1, 1}, true) + case 3: + mTs = meanTs.MustShallowClone() + meanTs.MustDrop() + default: + log.Fatalf("mean must be 1 or 3 elements. Got %v\n", len(mean)) + } + + switch len(stdSize) { + case 1: + sTs = stdTs.MustView([]int64{-1, 1, 1}, true) + case 3: + sTs = stdTs.MustShallowClone() + stdTs.MustDrop() + default: + log.Fatalf("std must be 1 or 3 elements. Got %v\n", len(std)) + } + + // out := img.MustSub(mTs, false).MustDiv(sTs, true) + x := img.MustDiv1(ts.FloatScalar(255.0), false) + out := x.MustSub(mTs, false).MustDiv(sTs, true).MustMul1(ts.IntScalar(255), true) + x.MustDrop() + + mTs.MustDrop() + sTs.MustDrop() + + return out +} diff --git a/vision/aug/grayscale.go b/vision/aug/grayscale.go new file mode 100644 index 0000000..9d0ef2c --- /dev/null +++ b/vision/aug/grayscale.go @@ -0,0 +1,81 @@ +package aug + +import ( + "log" + + ts "github.com/sugarme/gotch/tensor" + // "github.com/sugarme/gotch/tensor" +) + +// GrayScale converts image to grayscale. +// If the image is torch Tensor, it is expected +// to have [..., 3, H, W] shape, where ... means an arbitrary number of leading dimensions +// Args: +// - num_output_channels (int): (1 or 3) number of channels desired for output image +type Grayscale struct { + outChan int64 +} + +func (gs *Grayscale) Forward(x *ts.Tensor) *ts.Tensor { + out := rgb2Gray(x, gs.outChan) + return out +} + +func newGrayscale(outChanOpt ...int64) *Grayscale { + var outChan int64 = 3 + if len(outChanOpt) > 0 { + c := outChanOpt[0] + switch c { + case 1: + outChan = 1 + case 3: + outChan = 3 + default: + log.Fatalf("Out channels should be either 1 or 3. Got %v\n", c) + } + } + return &Grayscale{outChan} +} + +// RandomGrayscale randomly converts image to grayscale with a probability of p (default 0.1). +// If the image is torch Tensor, it is expected +// to have [..., 3, H, W] shape, where ... means an arbitrary number of leading dimensions +// Args: +// - p (float): probability that image should be converted to grayscale. +type RandomGrayscale struct { + pvalue float64 +} + +func newRandomGrayscale(pvalueOpt ...float64) *RandomGrayscale { + pvalue := 0.1 + if len(pvalueOpt) > 0 { + pvalue = pvalueOpt[0] + } + return &RandomGrayscale{pvalue} +} + +func (rgs *RandomGrayscale) Forward(x *ts.Tensor) *ts.Tensor { + c := getImageChanNum(x) + r := randPvalue() + var out *ts.Tensor + switch { + case r < rgs.pvalue: + out = rgb2Gray(x, c) + default: + out = x.MustShallowClone() + } + + return out +} + +func WithRandomGrayscale(pvalueOpt ...float64) Option { + var p float64 = 0.1 + if len(pvalueOpt) > 0 { + p = pvalueOpt[0] + } + + rgs := newRandomGrayscale(p) + return func(o *Options) { + o.randomGrayscale = rgs + } +} diff --git a/vision/aug/invert.go b/vision/aug/invert.go new file mode 100644 index 0000000..ae23584 --- /dev/null +++ b/vision/aug/invert.go @@ -0,0 +1,39 @@ +package aug + +import ( + ts "github.com/sugarme/gotch/tensor" +) + +type RandomInvert struct { + pvalue float64 +} + +func newRandomInvert(pOpt ...float64) *RandomInvert { + p := 0.5 + if len(pOpt) > 0 { + p = pOpt[0] + } + return &RandomInvert{p} +} + +func (ri *RandomInvert) Forward(x *ts.Tensor) *ts.Tensor { + r := randPvalue() + + var out *ts.Tensor + switch { + case r < ri.pvalue: + out = invert(x) + default: + out = x.MustShallowClone() + } + + return out +} + +func WithRandomInvert(pvalueOpt ...float64) Option { + ri := newRandomInvert(pvalueOpt...) + + return func(o *Options) { + o.randomInvert = ri + } +} diff --git a/vision/aug/normalize.go b/vision/aug/normalize.go new file mode 100644 index 0000000..eb1f513 --- /dev/null +++ b/vision/aug/normalize.go @@ -0,0 +1,91 @@ +package aug + +import ( + ts "github.com/sugarme/gotch/tensor" +) + +// Normalize normalizes a tensor image with mean and standard deviation. +// Given mean: ``(mean[1],...,mean[n])`` and std: ``(std[1],..,std[n])`` for ``n`` +// channels, this transform will normalize each channel of the input +// ``torch.*Tensor`` i.e., +// ``output[channel] = (input[channel] - mean[channel]) / std[channel]`` +// .. note:: +// This transform acts out of place, i.e., it does not mutate the input tensor. +// Args: +// - mean (sequence): Sequence of means for each channel. +// - std (sequence): Sequence of standard deviations for each channel. +type Normalize struct { + mean []float64 // should be from 0 to 1 + std []float64 // should be > 0 and <= 1 +} + +type normalizeOptions struct { + mean []float64 + std []float64 +} + +type normalizeOption func(*normalizeOptions) + +// Mean and SD can be calculated for specific dataset as follow: +/* + mean = 0.0 + meansq = 0.0 + count = 0 + + for index, data in enumerate(train_loader): + mean = data.sum() + meansq = meansq + (data**2).sum() + count += np.prod(data.shape) + + total_mean = mean/count + total_var = (meansq/count) - (total_mean**2) + total_std = torch.sqrt(total_var) + print("mean: " + str(total_mean)) + print("std: " + str(total_std)) +*/ + +// For example. ImageNet dataset has RGB mean and standard error: +// meanVals := []float64{0.485, 0.456, 0.406} +// sdVals := []float64{0.229, 0.224, 0.225} +func defaultNormalizeOptions() *normalizeOptions { + return &normalizeOptions{ + mean: []float64{0, 0, 0}, + std: []float64{1, 1, 1}, + } +} + +func WithNormalizeStd(std []float64) normalizeOption { + return func(o *normalizeOptions) { + o.std = std + } +} + +func WithNormalizeMean(mean []float64) normalizeOption { + return func(o *normalizeOptions) { + o.mean = mean + } +} + +func newNormalize(opts ...normalizeOption) *Normalize { + p := defaultNormalizeOptions() + for _, o := range opts { + o(p) + } + + return &Normalize{ + mean: p.mean, + std: p.std, + } +} + +func (n *Normalize) Forward(x *ts.Tensor) *ts.Tensor { + out := normalize(x, n.mean, n.std) + return out +} + +func WithNormalize(opts ...normalizeOption) Option { + n := newNormalize(opts...) + return func(o *Options) { + o.normalize = n + } +} diff --git a/vision/aug/pad.go b/vision/aug/pad.go new file mode 100644 index 0000000..6674395 --- /dev/null +++ b/vision/aug/pad.go @@ -0,0 +1 @@ +package aug diff --git a/vision/aug/perspective.go b/vision/aug/perspective.go new file mode 100644 index 0000000..69ab194 --- /dev/null +++ b/vision/aug/perspective.go @@ -0,0 +1,190 @@ +package aug + +import ( + // "fmt" + + "github.com/sugarme/gotch" + ts "github.com/sugarme/gotch/tensor" +) + +// RandomPerspective performs a random perspective transformation of the given image with a given probability. +// If the image is torch Tensor, it is expected +// to have [..., H, W] shape, where ... means an arbitrary number of leading dimensions. +// Args: +// distortion_scale (float): argument to control the degree of distortion and ranges from 0 to 1. +// Default is 0.5. +// p (float): probability of the image being transformed. Default is 0.5. +// interpolation (InterpolationMode): Desired interpolation enum defined by +// :class:`torchvision.transforms.InterpolationMode`. Default is ``InterpolationMode.BILINEAR``. +// If input is Tensor, only ``InterpolationMode.NEAREST``, ``InterpolationMode.BILINEAR`` are supported. +// For backward compatibility integer values (e.g. ``PIL.Image.NEAREST``) are still acceptable. +// fill (sequence or number): Pixel fill value for the area outside the transformed +// image. Default is ``0``. If given a number, the value is used for all bands respectively. +type RandomPerspective struct { + distortionScale float64 // range [0, 1] + pvalue float64 // range [0, 1] + interpolationMode string + fillValue []float64 +} + +type perspectiveOptions struct { + distortionScale float64 // range [0, 1] + pvalue float64 // range [0, 1] + interpolationMode string + fillValue []float64 +} + +func defaultPerspectiveOptions() *perspectiveOptions { + return &perspectiveOptions{ + distortionScale: 0.5, + pvalue: 0.5, + interpolationMode: "bilinear", + fillValue: []float64{0.0, 0.0, 0.0}, + } +} + +type perspectiveOption func(*perspectiveOptions) + +func WithPerspectivePvalue(p float64) perspectiveOption { + return func(o *perspectiveOptions) { + o.pvalue = p + } +} + +func WithPerspectiveScale(s float64) perspectiveOption { + return func(o *perspectiveOptions) { + o.distortionScale = s + } +} + +func WithPerspectiveMode(m string) perspectiveOption { + return func(o *perspectiveOptions) { + o.interpolationMode = m + } +} + +func WithPerspectiveValue(v []float64) perspectiveOption { + return func(o *perspectiveOptions) { + o.fillValue = v + } +} + +func newRandomPerspective(opts ...perspectiveOption) *RandomPerspective { + params := defaultPerspectiveOptions() + for _, opt := range opts { + opt(params) + } + + return &RandomPerspective{ + distortionScale: params.distortionScale, + pvalue: params.pvalue, + interpolationMode: params.interpolationMode, + fillValue: params.fillValue, + } +} + +// Get parameters for ``perspective`` for a random perspective transform. +// +// Args: +// - width (int): width of the image. +// - height (int): height of the image. +// Returns: +// - List containing [top-left, top-right, bottom-right, bottom-left] of the original image, +// - List containing [top-left, top-right, bottom-right, bottom-left] of the transformed image. +func (rp *RandomPerspective) getParams(w, h int64) ([][]int64, [][]int64) { + halfH := h / 2 + halfW := w / 2 + + var ( + topLeft []int64 + topRight []int64 + bottomRight []int64 + bottomLeft []int64 + ) + + // topleft = [ + // int(torch.randint(0, int(distortion_scale * half_width) + 1, size=(1, )).item()), + // int(torch.randint(0, int(distortion_scale * half_height) + 1, size=(1, )).item()) + // ] + tlVal1 := int64(rp.distortionScale*float64(halfW)) + 1 + tlTs1 := ts.MustRandint1(0, tlVal1, []int64{1}, gotch.Int64, gotch.CPU) + tl1 := tlTs1.Int64Values()[0] + tlTs1.MustDrop() + tlVal2 := int64(rp.distortionScale*float64(halfH)) + 1 + tlTs2 := ts.MustRandint1(0, tlVal2, []int64{1}, gotch.Int64, gotch.CPU) + tl2 := tlTs2.Int64Values()[0] + tlTs2.MustDrop() + topLeft = []int64{tl1, tl2} + + // topright = [ + // int(torch.randint(width - int(distortion_scale * half_width) - 1, width, size=(1, )).item()), + // int(torch.randint(0, int(distortion_scale * half_height) + 1, size=(1, )).item()) + // ] + trVal1 := w - int64(rp.distortionScale*float64(halfW)) - 1 + trTs1 := ts.MustRandint1(trVal1, w, []int64{1}, gotch.Int64, gotch.CPU) + tr1 := trTs1.Int64Values()[0] + trTs1.MustDrop() + trVal2 := int64(rp.distortionScale*float64(halfH)) + 1 + trTs2 := ts.MustRandint1(0, trVal2, []int64{1}, gotch.Int64, gotch.CPU) + tr2 := trTs2.Int64Values()[0] + trTs2.MustDrop() + topRight = []int64{tr1, tr2} + + // botright = [ + // int(torch.randint(width - int(distortion_scale * half_width) - 1, width, size=(1, )).item()), + // int(torch.randint(height - int(distortion_scale * half_height) - 1, height, size=(1, )).item()) + // ] + brVal1 := w - int64(rp.distortionScale*float64(halfW)) - 1 + brTs1 := ts.MustRandint1(brVal1, w, []int64{1}, gotch.Int64, gotch.CPU) + br1 := brTs1.Int64Values()[0] + brTs1.MustDrop() + brVal2 := h - int64(rp.distortionScale*float64(halfH)) - 1 + brTs2 := ts.MustRandint1(brVal2, h, []int64{1}, gotch.Int64, gotch.CPU) + br2 := brTs2.Int64Values()[0] + brTs2.MustDrop() + bottomRight = []int64{br1, br2} + + // botleft = [ + // int(torch.randint(0, int(distortion_scale * half_width) + 1, size=(1, )).item()), + // int(torch.randint(height - int(distortion_scale * half_height) - 1, height, size=(1, )).item()) + // ] + blVal1 := int64(rp.distortionScale*float64(halfW)) + 1 + blTs1 := ts.MustRandint1(0, blVal1, []int64{1}, gotch.Int64, gotch.CPU) + bl1 := blTs1.Int64Values()[0] + blTs1.MustDrop() + blVal2 := h - int64(rp.distortionScale*float64(halfH)) - 1 + blTs2 := ts.MustRandint1(blVal2, h, []int64{1}, gotch.Int64, gotch.CPU) + bl2 := blTs2.Int64Values()[0] + blTs2.MustDrop() + bottomLeft = []int64{bl1, bl2} + + startPoints := [][]int64{ + {0, 0}, + {w - 1, 0}, + {w - 1, h - 1}, + {0, h - 1}, + } + + endPoints := [][]int64{ + topLeft, + topRight, + bottomRight, + bottomLeft, + } + + return startPoints, endPoints +} + +func (rp *RandomPerspective) Forward(x *ts.Tensor) *ts.Tensor { + height, width := getImageSize(x) + startPoints, endPoints := rp.getParams(height, width) + out := perspective(x, startPoints, endPoints, rp.interpolationMode, rp.fillValue) + return out +} + +func WithRandomPerspective(opts ...perspectiveOption) Option { + rp := newRandomPerspective(opts...) + return func(o *Options) { + o.randomPerspective = rp + } +} diff --git a/vision/aug/posterize.go b/vision/aug/posterize.go new file mode 100644 index 0000000..9a0b24a --- /dev/null +++ b/vision/aug/posterize.go @@ -0,0 +1,77 @@ +package aug + +import ( + ts "github.com/sugarme/gotch/tensor" +) + +// RandomPosterize posterizes the image randomly with a given probability by reducing the +// number of bits for each color channel. If the image is torch Tensor, it should be of type torch.uint8, +// and it is expected to have [..., 1 or 3, H, W] shape, where ... means an arbitrary number of leading dimensions. +// Args: +// - bits (int): number of bits to keep for each channel (0-8) +// - p (float): probability of the image being color inverted. Default value is 0.5 +// Ref. https://en.wikipedia.org/wiki/Posterization +type RandomPosterize struct { + pvalue float64 + bits uint8 +} + +type posterizeOptions struct { + pvalue float64 + bits uint8 +} + +type posterizeOption func(*posterizeOptions) + +func defaultPosterizeOptions() *posterizeOptions { + return &posterizeOptions{ + pvalue: 0.5, + bits: 4, + } +} + +func WithPosterizePvalue(p float64) posterizeOption { + return func(o *posterizeOptions) { + o.pvalue = p + } +} + +func WithPosterizeBits(bits uint8) posterizeOption { + return func(o *posterizeOptions) { + o.bits = bits + } +} + +func newRandomPosterize(opts ...posterizeOption) *RandomPosterize { + p := defaultPosterizeOptions() + for _, o := range opts { + o(p) + } + + return &RandomPosterize{ + pvalue: p.pvalue, + bits: p.bits, + } +} + +func (rp *RandomPosterize) Forward(x *ts.Tensor) *ts.Tensor { + + r := randPvalue() + var out *ts.Tensor + switch { + case r < rp.pvalue: + out = posterize(x, rp.bits) + default: + out = x.MustShallowClone() + } + + return out +} + +func WithRandomPosterize(opts ...posterizeOption) Option { + rp := newRandomPosterize(opts...) + + return func(o *Options) { + o.randomPosterize = rp + } +} diff --git a/vision/aug/resize.go b/vision/aug/resize.go new file mode 100644 index 0000000..84af126 --- /dev/null +++ b/vision/aug/resize.go @@ -0,0 +1,39 @@ +package aug + +import ( + "log" + + "github.com/sugarme/gotch" + ts "github.com/sugarme/gotch/tensor" + "github.com/sugarme/gotch/vision" +) + +type ResizeModule struct { + height int64 + width int64 +} + +func newResizeModule(h, w int64) *ResizeModule { + return &ResizeModule{h, w} +} + +// Forward implements ts.Module for RandRotateModule +func (rs *ResizeModule) Forward(x *ts.Tensor) *ts.Tensor { + imgTs := x.MustTotype(gotch.Uint8, false) + out, err := vision.Resize(imgTs, rs.width, rs.height) + if err != nil { + log.Fatal(err) + } + imgTs.MustDrop() + return out +} + +func WithResize(h, w int64) Option { + return func(o *Options) { + rs := newResizeModule(h, w) + o.resize = rs + } +} + +// TODO. +type RandomResizedCrop struct{} diff --git a/vision/aug/rotate.go b/vision/aug/rotate.go new file mode 100644 index 0000000..a5afe8b --- /dev/null +++ b/vision/aug/rotate.go @@ -0,0 +1,109 @@ +package aug + +import ( + "fmt" + "log" + "math" + "math/rand" + "time" + + "github.com/sugarme/gotch" + ts "github.com/sugarme/gotch/tensor" +) + +// RandomRotate randomly rotates a tensor image within a specifed angle range (degree). +func RandomRotate(img *ts.Tensor, min, max float64) (*ts.Tensor, error) { + if min > max { + tmp := min + min = max + max = tmp + } + if min < -360 || min > 360 || max < -360 || max > 360 { + err := fmt.Errorf("min and max should be in range from -360 to 360. Got %v and %v\n", min, max) + return nil, err + } + // device := img.MustDevice() + dtype := gotch.Double + rand.Seed(time.Now().UnixNano()) + angle := min + rand.Float64()*(max-min) + + theta := float64(angle) * (math.Pi / 180) + input := img.MustUnsqueeze(0, false).MustTotype(dtype, true) + r, err := rotImg(input, theta, dtype) + if err != nil { + return nil, err + } + input.MustDrop() + rotatedImg := r.MustSqueeze(true) + return rotatedImg, nil +} + +func Rotate(img *ts.Tensor, angle float64) (*ts.Tensor, error) { + if angle < -360 || angle > 360 { + err := fmt.Errorf("angle must be in range (-360, 360)") + return nil, err + } + dtype := gotch.Double + theta := float64(angle) * (math.Pi / 180) + input := img.MustUnsqueeze(0, false).MustTotype(dtype, true) + r, err := rotImg(input, theta, dtype) + if err != nil { + return nil, err + } + input.MustDrop() + rotatedImg := r.MustSqueeze(true) + return rotatedImg, nil +} + +// RotateModule +type RotateModule struct { + angle float64 +} + +func newRotate(angle float64) *RotateModule { + return &RotateModule{angle} +} + +// Forward implements ts.Module for RotateModule +func (r *RotateModule) Forward(x *ts.Tensor) *ts.Tensor { + out, err := Rotate(x, r.angle) + if err != nil { + log.Fatal(err) + } + + return out +} + +func WithRotate(angle float64) Option { + return func(o *Options) { + r := newRotate(angle) + o.rotate = r + } +} + +// RandomRotateModule +type RandRotateModule struct { + minAngle float64 + maxAngle float64 +} + +func newRandRotate(min, max float64) *RandRotateModule { + return &RandRotateModule{min, max} +} + +// Forward implements ts.Module for RandRotateModule +func (rr *RandRotateModule) Forward(x *ts.Tensor) *ts.Tensor { + out, err := RandomRotate(x, rr.minAngle, rr.maxAngle) + if err != nil { + log.Fatal(err) + } + + return out +} + +func WithRandRotate(minAngle, maxAngle float64) Option { + return func(o *Options) { + r := newRandRotate(minAngle, maxAngle) + o.randRotate = r + } +} diff --git a/vision/aug/sharpness.go b/vision/aug/sharpness.go new file mode 100644 index 0000000..d38fad5 --- /dev/null +++ b/vision/aug/sharpness.go @@ -0,0 +1,74 @@ +package aug + +import ( + ts "github.com/sugarme/gotch/tensor" +) + +// Adjust the sharpness of the image randomly with a given probability. If the image is torch Tensor, +// it is expected to have [..., 1 or 3, H, W] shape, where ... means an arbitrary number of leading dimensions. +// Args: +// sharpness_factor (float): How much to adjust the sharpness. Can be +// any non negative number. 0 gives a blurred image, 1 gives the +// original image while 2 increases the sharpness by a factor of 2. +// p (float): probability of the image being color inverted. Default value is 0.5 +type RandomAdjustSharpness struct { + sharpnessFactor float64 + pvalue float64 +} + +type sharpnessOptions struct { + sharpnessFactor float64 + pvalue float64 +} + +type sharpnessOption func(*sharpnessOptions) + +func defaultSharpnessOptions() *sharpnessOptions { + return &sharpnessOptions{ + sharpnessFactor: 1.0, + pvalue: 0.5, + } +} + +func WithSharpnessPvalue(p float64) sharpnessOption { + return func(o *sharpnessOptions) { + o.pvalue = p + } +} + +func WithSharpnessFactor(f float64) sharpnessOption { + return func(o *sharpnessOptions) { + o.sharpnessFactor = f + } +} + +func newRandomAdjustSharpness(opts ...sharpnessOption) *RandomAdjustSharpness { + p := defaultSharpnessOptions() + for _, o := range opts { + o(p) + } + return &RandomAdjustSharpness{ + sharpnessFactor: p.sharpnessFactor, + pvalue: p.pvalue, + } +} + +func (ras *RandomAdjustSharpness) Forward(x *ts.Tensor) *ts.Tensor { + r := randPvalue() + var out *ts.Tensor + switch { + case r < ras.pvalue: + out = adjustSharpness(x, ras.sharpnessFactor) + default: + out = x.MustShallowClone() + } + + return out +} + +func WithRandomAdjustSharpness(opts ...sharpnessOption) Option { + ras := newRandomAdjustSharpness(opts...) + return func(o *Options) { + o.randomAdjustSharpness = ras + } +} diff --git a/vision/aug/solarize.go b/vision/aug/solarize.go new file mode 100644 index 0000000..729ea6f --- /dev/null +++ b/vision/aug/solarize.go @@ -0,0 +1,79 @@ +package aug + +import ( + ts "github.com/sugarme/gotch/tensor" +) + +// RandomSolarize solarizes the image randomly with a given probability by inverting all pixel +// values above a threshold. If img is a Tensor, it is expected to be in [..., 1 or 3, H, W] format, +// where ... means it can have an arbitrary number of leading dimensions. +// If img is PIL Image, it is expected to be in mode "L" or "RGB". +// Args: +// - threshold (float): all pixels equal or above this value are inverted. +// - p (float): probability of the image being color inverted. Default value is 0.5 +// Ref. https://en.wikipedia.org/wiki/Solarization_(photography) +type RandomSolarize struct { + threshold float64 + pvalue float64 +} + +type solarizeOptions struct { + threshold float64 + pvalue float64 +} + +type solarizeOption func(*solarizeOptions) + +func defaultSolarizeOptions() *solarizeOptions { + return &solarizeOptions{ + threshold: 128, + pvalue: 0.5, + } +} + +func WithSolarizePvalue(p float64) solarizeOption { + return func(o *solarizeOptions) { + o.pvalue = p + } +} + +func WithSolarizeThreshold(th float64) solarizeOption { + return func(o *solarizeOptions) { + o.threshold = th + } +} + +func newRandomSolarize(opts ...solarizeOption) *RandomSolarize { + params := defaultSolarizeOptions() + + for _, o := range opts { + o(params) + } + + return &RandomSolarize{ + threshold: params.threshold, + pvalue: params.pvalue, + } +} + +func (rs *RandomSolarize) Forward(x *ts.Tensor) *ts.Tensor { + r := randPvalue() + + var out *ts.Tensor + switch { + case r < rs.pvalue: + out = solarize(x, rs.threshold) + default: + out = x.MustShallowClone() + } + + return out +} + +func WithRandomSolarize(opts ...solarizeOption) Option { + rs := newRandomSolarize(opts...) + + return func(o *Options) { + o.randomSolarize = rs + } +} diff --git a/vision/aug/transform.go b/vision/aug/transform.go new file mode 100644 index 0000000..2767d60 --- /dev/null +++ b/vision/aug/transform.go @@ -0,0 +1,188 @@ +package aug + +import ( + "math/rand" + "time" + + "github.com/sugarme/gotch/nn" + ts "github.com/sugarme/gotch/tensor" +) + +// Transformer is an interface that can transform an image tensor. +type Transformer interface { + Transform(x *ts.Tensor) *ts.Tensor +} + +// Augment is a struct composes of augmentation functions to implement Transformer interface. +type Augment struct { + augments *nn.Sequential +} + +// Transform implements Transformer interface for Augment struct. +func (a *Augment) Transform(image *ts.Tensor) *ts.Tensor { + out := a.augments.Forward(image) + return out +} + +type Options struct { + rotate *RotateModule + randRotate *RandRotateModule + resize *ResizeModule + colorJitter *ColorJitter + gaussianBlur *GaussianBlur + randomHFlip *RandomHorizontalFlip + randomVFlip *RandomVerticalFlip + randomCrop *RandomCrop + centerCrop *CenterCrop + randomCutout *RandomCutout + randomPerspective *RandomPerspective + randomAffine *RandomAffine + randomGrayscale *RandomGrayscale + randomSolarize *RandomSolarize + randomPosterize *RandomPosterize + randomInvert *RandomInvert + randomAutocontrast *RandomAutocontrast + randomAdjustSharpness *RandomAdjustSharpness + randomEqualize *RandomEqualize + normalize *Normalize +} + +func defaultOption() *Options { + return &Options{ + rotate: nil, + randRotate: nil, + resize: nil, + colorJitter: nil, + gaussianBlur: nil, + randomHFlip: nil, + randomVFlip: nil, + randomCrop: nil, + centerCrop: nil, + randomCutout: nil, + randomPerspective: nil, + randomAffine: nil, + randomGrayscale: nil, + randomSolarize: nil, + randomPosterize: nil, + randomInvert: nil, + randomAutocontrast: nil, + randomAdjustSharpness: nil, + randomEqualize: nil, + normalize: nil, + } +} + +type Option func(o *Options) + +// Compose creates a new Augment struct by adding augmentation methods. +func Compose(opts ...Option) (Transformer, error) { + augOpts := defaultOption() + for _, opt := range opts { + if opt != nil { + opt(augOpts) + } + } + + var augs *nn.Sequential = nn.Seq() + + if augOpts.rotate != nil { + augs.Add(augOpts.rotate) + } + + if augOpts.randRotate != nil { + augs.Add(augOpts.randRotate) + } + + if augOpts.resize != nil { + augs.Add(augOpts.resize) + } + + if augOpts.colorJitter != nil { + augs.Add(augOpts.colorJitter) + } + + if augOpts.gaussianBlur != nil { + augs.Add(augOpts.gaussianBlur) + } + + if augOpts.randomHFlip != nil { + augs.Add(augOpts.randomHFlip) + } + + if augOpts.randomVFlip != nil { + augs.Add(augOpts.randomVFlip) + } + + if augOpts.randomCrop != nil { + augs.Add(augOpts.randomCrop) + } + + if augOpts.centerCrop != nil { + augs.Add(augOpts.centerCrop) + } + + if augOpts.randomCutout != nil { + augs.Add(augOpts.randomCutout) + } + + if augOpts.randomPerspective != nil { + augs.Add(augOpts.randomPerspective) + } + + if augOpts.randomAffine != nil { + augs.Add(augOpts.randomAffine) + } + + if augOpts.randomGrayscale != nil { + augs.Add(augOpts.randomGrayscale) + } + + if augOpts.randomSolarize != nil { + augs.Add(augOpts.randomSolarize) + } + + if augOpts.randomPosterize != nil { + augs.Add(augOpts.randomPosterize) + } + + if augOpts.randomInvert != nil { + augs.Add(augOpts.randomInvert) + } + + if augOpts.randomAutocontrast != nil { + augs.Add(augOpts.randomAutocontrast) + } + + if augOpts.randomAdjustSharpness != nil { + augs.Add(augOpts.randomAdjustSharpness) + } + + if augOpts.randomEqualize != nil { + augs.Add(augOpts.randomEqualize) + } + + if augOpts.normalize != nil { + augs.Add(augOpts.normalize) + } + + return &Augment{augs}, nil +} + +// OneOf randomly return one transformer from list of transformers +// with a specific p value. +func OneOf(pvalue float64, tfOpts ...Option) Option { + tfsNum := len(tfOpts) + if tfsNum < 1 { + return nil + } + + randP := randPvalue() + if randP >= pvalue { + return nil + } + + rand.Seed(time.Now().UnixNano()) + idx := rand.Intn(tfsNum) + + return tfOpts[idx] +}