Skip to content

Commit 722d0ae

Browse files
committed
feat: WIP additive truncated
1 parent cea7624 commit 722d0ae

File tree

4 files changed

+100
-22
lines changed

4 files changed

+100
-22
lines changed

lib/augmenters/abstract.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,23 @@ class AbstractAugmenter extends Abstract {
6060

6161
const o2 = Object.assign({}, metadata, params1);
6262
const {nImages} = metadata;
63-
64-
const params = this.buildHasard(o2);
65-
66-
debug(`runOnce ${this._name}`);
67-
const resolved = [];
68-
69-
// Every image hasard is generated independantly
70-
for (let i = 0; i < nImages; i++) {
71-
const resolvedParams = hasard.isHasard(params) ? params.runOnce(runOpts) : params;
72-
resolved.push(resolvedParams);
63+
64+
let resolved = [];
65+
66+
if(typeof(this.buildAllImagesHasard) === 'function'){
67+
resolved = this.buildAllImagesHasard(o2).runOnce(runOpts);
68+
} else {
69+
debug(`runOnce ${this._name}`);
70+
const params = this.buildHasard(o2);
71+
// Every image hasard is generated independantly
72+
for (let i = 0; i < nImages; i++) {
73+
const resolvedParams = hasard.isHasard(params) ? params.runOnce(runOpts) : params;
74+
resolved.push(resolvedParams);
75+
}
7376
}
77+
78+
79+
7480

7581
// Console.log({resolved, params})
7682
debug(`augment ${this._name}`);

lib/augmenters/additive.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@ class AdditiveAugmenter extends AbstractAugmenter {
1414
this.generator = new Generator(opts2);
1515
}
1616

17-
buildParams({width, height, channels}) {
18-
return this.generator.build({width, height, channels});
17+
buildAllImagesHasard({nImages, width, height, channels}) {
18+
return this.generator.build({nImages, width, height, channels});
1919
}
20-
21-
augmentImage({image}, params) {
22-
// Console.log(image, generated)
23-
return this.backend.addNoise(image, params.image);
20+
augment(attrs, params, runOpts) {
21+
return {images: this.backend.addNoise(attrs.images, params.images)};
2422
}
2523
}
2624

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
const path = require('path');
2+
const test = require('ava');
3+
const AdditiveTruncatedNormalNoise = require('../../lib/augmenters/additive-truncated-normal-noise');
4+
const macroAugmenter = require('../macros/augmenter');
5+
6+
const mean = 10;
7+
const nImages = 2;
8+
9+
test.only('additiveTruncatedNormalNoise not perChannel', macroAugmenter, AdditiveTruncatedNormalNoise, {
10+
inputFilenames: new Array(nImages).fill('lenna.png'),
11+
backends:[
12+
require('@tensorflow/tfjs-node-gpu')
13+
],
14+
// Backends: ['tfjs'],
15+
// backends: ['opencv4nodejs'],
16+
expectImg(t, mats1, mats2, backend) {
17+
const mat1 = backend.splitImages(mats1)[0];
18+
const mat2 = backend.splitImages(mats2)[0];
19+
const metadata = backend.getMetadata(mats1);
20+
const diff = backend.diff(mat1, mat2);
21+
const norm = backend.normL1(diff) / (metadata.width * metadata.height * 3);
22+
const tolerance = 100 / Math.sqrt((metadata.width * metadata.height * 3));
23+
t.true(Math.abs(norm - mean) < tolerance);
24+
25+
// Console.log(diff.getDataAsArray().slice(0,30).map(v => v.slice(440, 450)))
26+
27+
let count = 0;
28+
const m2 = backend.imageToArray(mat2);
29+
30+
backend.forEachPixel(diff, ([b, g, r], rowIndex, colIndex) => {
31+
// Console.log({rowIndex, colIndex})
32+
if (m2[rowIndex][colIndex].indexOf(255) === -1 && m2[rowIndex][colIndex].indexOf(0) === -1 && (r !== g || g !== b)) {
33+
count++;
34+
}
35+
});
36+
t.is(count, 0);
37+
},
38+
options: {
39+
mean,
40+
std: 2,
41+
perChannel: false
42+
}
43+
});
44+
45+
test('additiveTruncatedNormalNoise per Channel', macroAugmenter, AdditiveTruncatedNormalNoise, {
46+
inputFilename: 'lenna.png',
47+
expectImg(t, mats1, mats2, backend) {
48+
const mat1 = backend.splitImages(mats1)[0];
49+
const mat2 = backend.splitImages(mats2)[0];
50+
const diff = backend.diff(mat1, mat2);
51+
let count = 0;
52+
const m2 = backend.imageToArray(mat2);
53+
backend.forEachPixel(diff, ([b, g, r], rowIndex, colIndex) => {
54+
if (m2[rowIndex][colIndex].indexOf(255) === -1 && m2[rowIndex][colIndex].indexOf(0) === -1 && (r !== g || g !== b)) {
55+
count++;
56+
}
57+
});
58+
t.not(count, 0);
59+
},
60+
options: {
61+
mean,
62+
sigma: 2,
63+
perChannel: true
64+
}
65+
});

test/macros/augmenter.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,37 @@ const allBackends = require('../../lib/backend');
77
module.exports = function (t, Cstr, {
88
inputFilename,
99
outputFilename,
10+
inputFilenames = [],
1011
options,
1112
debugOutput,
1213
inputPoints,
1314
outputPoints,
1415
expectImg,
15-
backends = ['opencv4nodejs', 'tfjs']
16+
backends = [
17+
require('@tensorflow/tfjs-node-gpu'),
18+
require('opencv4nodejs')
19+
]
1620
}) {
1721
return PromiseBlue.map(backends, bKey => {
1822
const backend = allBackends.get(bKey);
1923
const inst = new Cstr(Object.assign({}, options, {backend: bKey}));
20-
const input = path.join(__dirname, '../data', bKey, inputFilename);
24+
let inputs
25+
if(inputFilename){
26+
inputs = [path.join(__dirname, '../data', backend.key, inputFilename)];
27+
} else { // if(inputFilenames)
28+
inputs = inputFilenames.map(inF => path.join(__dirname, '../data', backend.key, inF));
29+
}
2130
let output;
2231
if (outputFilename) {
23-
output = path.join(__dirname, '../data', bKey, outputFilename);
32+
output = path.join(__dirname, '../data', backend.key, outputFilename);
2433
}
2534

26-
return backend.readImages([input])
35+
return backend.readImages(inputs)
2736
.then(images => {
28-
debug(`${Cstr.name}/${bKey} start `);
37+
debug(`${Cstr.name}/${backend.key} start `);
2938
return inst.runAugmenter({images})
3039
.then(res => {
31-
debug(`${Cstr.name}/${bKey} end`);
40+
debug(`${Cstr.name}/${backend.key} end`);
3241
if (!debugOutput) {
3342
return Promise.resolve(res);
3443
}

0 commit comments

Comments
 (0)