@prosopo/datasets-fs 0.1.17 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +10 -5
- package/dist/cli.d.ts +0 -2
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -50
- package/dist/cli.js.map +0 -1
- package/dist/flatten/args.d.ts +0 -16
- package/dist/flatten/args.d.ts.map +0 -1
- package/dist/flatten/args.js +0 -8
- package/dist/flatten/args.js.map +0 -1
- package/dist/flatten/cli.d.ts +0 -18
- package/dist/flatten/cli.d.ts.map +0 -1
- package/dist/flatten/cli.js +0 -31
- package/dist/flatten/cli.js.map +0 -1
- package/dist/flatten/flatten.d.ts +0 -5
- package/dist/flatten/flatten.d.ts.map +0 -1
- package/dist/flatten/flatten.js +0 -66
- package/dist/flatten/flatten.js.map +0 -1
- package/dist/flatten/index.d.ts +0 -4
- package/dist/flatten/index.d.ts.map +0 -1
- package/dist/flatten/index.js +0 -4
- package/dist/flatten/index.js.map +0 -1
- package/dist/generate/args.d.ts +0 -37
- package/dist/generate/args.d.ts.map +0 -1
- package/dist/generate/args.js +0 -15
- package/dist/generate/args.js.map +0 -1
- package/dist/generate/cli.d.ts +0 -32
- package/dist/generate/cli.d.ts.map +0 -1
- package/dist/generate/cli.js +0 -63
- package/dist/generate/cli.js.map +0 -1
- package/dist/generate/distinct/args.d.ts +0 -49
- package/dist/generate/distinct/args.d.ts.map +0 -1
- package/dist/generate/distinct/args.js +0 -10
- package/dist/generate/distinct/args.js.map +0 -1
- package/dist/generate/distinct/cli.d.ts +0 -20
- package/dist/generate/distinct/cli.d.ts.map +0 -1
- package/dist/generate/distinct/cli.js +0 -32
- package/dist/generate/distinct/cli.js.map +0 -1
- package/dist/generate/distinct/dummy.d.ts +0 -2
- package/dist/generate/distinct/dummy.d.ts.map +0 -1
- package/dist/generate/distinct/dummy.js +0 -29
- package/dist/generate/distinct/dummy.js.map +0 -1
- package/dist/generate/distinct/generate.d.ts +0 -5
- package/dist/generate/distinct/generate.d.ts.map +0 -1
- package/dist/generate/distinct/generate.js +0 -186
- package/dist/generate/distinct/generate.js.map +0 -1
- package/dist/generate/distinct/index.d.ts +0 -4
- package/dist/generate/distinct/index.d.ts.map +0 -1
- package/dist/generate/distinct/index.js +0 -4
- package/dist/generate/distinct/index.js.map +0 -1
- package/dist/generate/index.d.ts +0 -5
- package/dist/generate/index.d.ts.map +0 -1
- package/dist/generate/index.js +0 -5
- package/dist/generate/index.js.map +0 -1
- package/dist/generate/union/args.d.ts +0 -52
- package/dist/generate/union/args.d.ts.map +0 -1
- package/dist/generate/union/args.js +0 -11
- package/dist/generate/union/args.js.map +0 -1
- package/dist/generate/union/cli.d.ts +0 -22
- package/dist/generate/union/cli.d.ts.map +0 -1
- package/dist/generate/union/cli.js +0 -36
- package/dist/generate/union/cli.js.map +0 -1
- package/dist/generate/union/generate.d.ts +0 -5
- package/dist/generate/union/generate.d.ts.map +0 -1
- package/dist/generate/union/generate.js +0 -168
- package/dist/generate/union/generate.js.map +0 -1
- package/dist/generate/union/index.d.ts +0 -4
- package/dist/generate/union/index.d.ts.map +0 -1
- package/dist/generate/union/index.js +0 -4
- package/dist/generate/union/index.js.map +0 -1
- package/dist/generate/util.d.ts +0 -12
- package/dist/generate/util.d.ts.map +0 -1
- package/dist/generate/util.js +0 -40
- package/dist/generate/util.js.map +0 -1
- package/dist/get/args.d.ts +0 -10
- package/dist/get/args.d.ts.map +0 -1
- package/dist/get/args.js +0 -6
- package/dist/get/args.js.map +0 -1
- package/dist/get/cli.d.ts +0 -14
- package/dist/get/cli.d.ts.map +0 -1
- package/dist/get/cli.js +0 -20
- package/dist/get/cli.js.map +0 -1
- package/dist/get/get.d.ts +0 -5
- package/dist/get/get.d.ts.map +0 -1
- package/dist/get/get.js +0 -58
- package/dist/get/get.js.map +0 -1
- package/dist/get/index.d.ts +0 -4
- package/dist/get/index.d.ts.map +0 -1
- package/dist/get/index.js +0 -4
- package/dist/get/index.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -15
- package/dist/index.js.map +0 -1
- package/dist/labels/args.d.ts +0 -10
- package/dist/labels/args.d.ts.map +0 -1
- package/dist/labels/args.js +0 -6
- package/dist/labels/args.js.map +0 -1
- package/dist/labels/cli.d.ts +0 -14
- package/dist/labels/cli.d.ts.map +0 -1
- package/dist/labels/cli.js +0 -20
- package/dist/labels/cli.js.map +0 -1
- package/dist/labels/index.d.ts +0 -4
- package/dist/labels/index.d.ts.map +0 -1
- package/dist/labels/index.js +0 -4
- package/dist/labels/index.js.map +0 -1
- package/dist/labels/labels.d.ts +0 -5
- package/dist/labels/labels.d.ts.map +0 -1
- package/dist/labels/labels.js +0 -23
- package/dist/labels/labels.js.map +0 -1
- package/dist/relocate/args.d.ts +0 -16
- package/dist/relocate/args.d.ts.map +0 -1
- package/dist/relocate/args.js +0 -8
- package/dist/relocate/args.js.map +0 -1
- package/dist/relocate/cli.d.ts +0 -18
- package/dist/relocate/cli.d.ts.map +0 -1
- package/dist/relocate/cli.js +0 -30
- package/dist/relocate/cli.js.map +0 -1
- package/dist/relocate/relocate.d.ts +0 -5
- package/dist/relocate/relocate.d.ts.map +0 -1
- package/dist/relocate/relocate.js +0 -38
- package/dist/relocate/relocate.js.map +0 -1
- package/dist/scale/args.d.ts +0 -22
- package/dist/scale/args.d.ts.map +0 -1
- package/dist/scale/args.js +0 -10
- package/dist/scale/args.js.map +0 -1
- package/dist/scale/cli.d.ts +0 -22
- package/dist/scale/cli.d.ts.map +0 -1
- package/dist/scale/cli.js +0 -39
- package/dist/scale/cli.js.map +0 -1
- package/dist/scale/index.d.ts +0 -4
- package/dist/scale/index.d.ts.map +0 -1
- package/dist/scale/index.js +0 -4
- package/dist/scale/index.js.map +0 -1
- package/dist/scale/scale.d.ts +0 -5
- package/dist/scale/scale.d.ts.map +0 -1
- package/dist/scale/scale.js +0 -65
- package/dist/scale/scale.js.map +0 -1
- package/src/cli.ts +0 -50
- package/src/flatten/args.ts +0 -11
- package/src/flatten/cli.ts +0 -33
- package/src/flatten/flatten.ts +0 -77
- package/src/flatten/index.ts +0 -3
- package/src/generate/args.ts +0 -18
- package/src/generate/cli.ts +0 -65
- package/src/generate/distinct/args.ts +0 -13
- package/src/generate/distinct/cli.ts +0 -34
- package/src/generate/distinct/dummy.ts +0 -35
- package/src/generate/distinct/generate.ts +0 -238
- package/src/generate/distinct/index.ts +0 -3
- package/src/generate/index.ts +0 -4
- package/src/generate/union/args.ts +0 -14
- package/src/generate/union/cli.ts +0 -38
- package/src/generate/union/generate.ts +0 -210
- package/src/generate/union/index.ts +0 -3
- package/src/generate/util.ts +0 -61
- package/src/get/args.ts +0 -9
- package/src/get/cli.ts +0 -21
- package/src/get/get.ts +0 -56
- package/src/get/index.ts +0 -3
- package/src/index.ts +0 -14
- package/src/labels/args.ts +0 -9
- package/src/labels/cli.ts +0 -21
- package/src/labels/index.ts +0 -3
- package/src/labels/labels.ts +0 -27
- package/src/relocate/args.ts +0 -11
- package/src/relocate/cli.ts +0 -32
- package/src/relocate/relocate.ts +0 -38
- package/src/scale/args.ts +0 -13
- package/src/scale/cli.ts +0 -43
- package/src/scale/index.ts +0 -3
- package/src/scale/scale.ts +0 -79
- package/tsconfig.json +0 -17
- package/tsconfig.tsbuildinfo +0 -1
package/dist/scale/cli.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { argsSchema } from './args.js';
|
|
3
|
-
import scale from './scale.js';
|
|
4
|
-
export default (cmdArgs) => {
|
|
5
|
-
return {
|
|
6
|
-
command: 'scale',
|
|
7
|
-
describe: 'Scale images down to a given size',
|
|
8
|
-
builder: (yargs) => {
|
|
9
|
-
return yargs
|
|
10
|
-
.option('data', {
|
|
11
|
-
type: 'string',
|
|
12
|
-
demand: true,
|
|
13
|
-
description: 'JSON file containing a list of objects with (at least) a url',
|
|
14
|
-
})
|
|
15
|
-
.option('out', {
|
|
16
|
-
type: 'string',
|
|
17
|
-
demand: true,
|
|
18
|
-
description: 'Where to put the output directory containing the map file and single directory of images. The map file will contain the new urls of the scaled images, new hashes and pass through any other information, e.g. labels.',
|
|
19
|
-
})
|
|
20
|
-
.option('overwrite', {
|
|
21
|
-
type: 'boolean',
|
|
22
|
-
description: 'Overwrite the output if it already exists',
|
|
23
|
-
})
|
|
24
|
-
.option('size', {
|
|
25
|
-
type: 'number',
|
|
26
|
-
demand: true,
|
|
27
|
-
description: 'The dimension (height/width) of the scaled image. If the image is not square, the other dimension will be scaled to maintain the aspect ratio.',
|
|
28
|
-
})
|
|
29
|
-
.option('square', {
|
|
30
|
-
type: 'boolean',
|
|
31
|
-
description: 'If true, the image will be cropped to a square before scaling. If false, the image will be scaled to the given size, maintaining the aspect ratio.',
|
|
32
|
-
});
|
|
33
|
-
},
|
|
34
|
-
handler: (argv) => __awaiter(void 0, void 0, void 0, function* () {
|
|
35
|
-
yield scale(argsSchema.parse(argv), cmdArgs === null || cmdArgs === void 0 ? void 0 : cmdArgs.logger);
|
|
36
|
-
}),
|
|
37
|
-
};
|
|
38
|
-
};
|
|
39
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/scale/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/scale/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,KAAK,MAAM,YAAY,CAAA;AAE9B,eAAe,CAAC,OAA6B,EAAE,EAAE;IAC7C,OAAO;QACH,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,mCAAmC;QAC7C,OAAO,EAAE,CAAC,KAAW,EAAE,EAAE;YACrB,OAAO,KAAK;iBACP,MAAM,CAAC,MAAM,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,8DAA8D;aAC9E,CAAC;iBACD,MAAM,CAAC,KAAK,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,WAAW,EACP,wNAAwN;aAC/N,CAAC;iBACD,MAAM,CAAC,WAAW,EAAE;gBACjB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,2CAA2C;aAC3D,CAAC;iBACD,MAAM,CAAC,MAAM,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,WAAW,EACP,gJAAgJ;aACvJ,CAAC;iBACD,MAAM,CAAC,QAAQ,EAAE;gBACd,IAAI,EAAE,SAAS;gBACf,WAAW,EACP,oJAAoJ;aAC3J,CAAC,CAAA;QACV,CAAC;QACD,OAAO,EAAE,CAAO,IAAwB,EAAE,EAAE;YACxC,MAAM,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC,CAAA;QACxD,CAAC,CAAA;KACJ,CAAA;AACL,CAAC,CAAA"}
|
package/dist/scale/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scale/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
|
package/dist/scale/index.js
DELETED
package/dist/scale/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scale/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
|
package/dist/scale/scale.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scale.d.ts","sourceRoot":"","sources":["../../src/scale/scale.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,MAAM,EAAqC,MAAM,iBAAiB,CAAA;+BAM/C,IAAI,WAAW,MAAM;AAAjD,wBAsEC"}
|
package/dist/scale/scale.js
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { DataSchema } from '@prosopo/types';
|
|
3
|
-
import { ProsopoEnvError, getLoggerDefault } from '@prosopo/common';
|
|
4
|
-
import { blake2b } from '@noble/hashes/blake2b';
|
|
5
|
-
import { u8aToHex } from '@polkadot/util';
|
|
6
|
-
import fs from 'fs';
|
|
7
|
-
import sharp from 'sharp';
|
|
8
|
-
export default (args, logger) => __awaiter(void 0, void 0, void 0, function* () {
|
|
9
|
-
var _a;
|
|
10
|
-
logger = logger || getLoggerDefault();
|
|
11
|
-
logger.debug(args, 'scaling...');
|
|
12
|
-
const size = args.size;
|
|
13
|
-
const square = (_a = args.square) !== null && _a !== void 0 ? _a : false;
|
|
14
|
-
const mapFile = args.data;
|
|
15
|
-
if (!fs.existsSync(mapFile)) {
|
|
16
|
-
throw new ProsopoEnvError(new Error(`Map file does not exist: ${mapFile}`), 'FS.FILE_NOT_FOUND');
|
|
17
|
-
}
|
|
18
|
-
const outDir = args.out;
|
|
19
|
-
const overwrite = args.overwrite || false;
|
|
20
|
-
if (!overwrite && fs.existsSync(outDir)) {
|
|
21
|
-
throw new ProsopoEnvError(new Error(`Output directory already exists: ${outDir}`), 'FS.FILE_NOT_FOUND');
|
|
22
|
-
}
|
|
23
|
-
// create the output directory
|
|
24
|
-
const imgDir = `${outDir}/images`;
|
|
25
|
-
fs.mkdirSync(imgDir, { recursive: true });
|
|
26
|
-
// read the map file
|
|
27
|
-
const inputItems = DataSchema.parse(JSON.parse(fs.readFileSync(mapFile, 'utf8'))).items;
|
|
28
|
-
// for each item
|
|
29
|
-
const outputItems = [];
|
|
30
|
-
for (const inputItem of inputItems) {
|
|
31
|
-
logger.log(`scaling ${inputItem.data}`);
|
|
32
|
-
// read the file
|
|
33
|
-
const img = fs.readFileSync(inputItem.data);
|
|
34
|
-
// resize the image
|
|
35
|
-
const resized = yield sharp(img)
|
|
36
|
-
.resize({
|
|
37
|
-
width: size,
|
|
38
|
-
height: size,
|
|
39
|
-
fit: square ? 'fill' : 'inside',
|
|
40
|
-
})
|
|
41
|
-
.png();
|
|
42
|
-
const tmpFilePath = `${imgDir}/tmp.png`;
|
|
43
|
-
yield resized.toFile(tmpFilePath);
|
|
44
|
-
// read the resized image
|
|
45
|
-
const resizedImg = fs.readFileSync(tmpFilePath);
|
|
46
|
-
// hash the image
|
|
47
|
-
const hash = blake2b(resizedImg);
|
|
48
|
-
const hex = u8aToHex(hash);
|
|
49
|
-
// move the image
|
|
50
|
-
const finalFilePath = `${imgDir}/${hex}.png`;
|
|
51
|
-
fs.renameSync(tmpFilePath, finalFilePath);
|
|
52
|
-
// add the item to the output
|
|
53
|
-
const outputItem = Object.assign(Object.assign({}, inputItem), { hash: hex, data: fs.realpathSync(finalFilePath) });
|
|
54
|
-
outputItems.push(outputItem);
|
|
55
|
-
}
|
|
56
|
-
// write the map file
|
|
57
|
-
const outputMapFile = `${outDir}/map.json`;
|
|
58
|
-
const data = {
|
|
59
|
-
items: outputItems,
|
|
60
|
-
};
|
|
61
|
-
// verify the output
|
|
62
|
-
DataSchema.parse(data);
|
|
63
|
-
fs.writeFileSync(outputMapFile, JSON.stringify(outputItems, null, 4));
|
|
64
|
-
});
|
|
65
|
-
//# sourceMappingURL=scale.js.map
|
package/dist/scale/scale.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scale.js","sourceRoot":"","sources":["../../src/scale/scale.ts"],"names":[],"mappings":"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"}
|
package/src/cli.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { LogLevel, LogLevelSchema, getLogger } from '@prosopo/common'
|
|
2
|
-
import { hideBin } from 'yargs/helpers'
|
|
3
|
-
import esMain from 'es-main'
|
|
4
|
-
import flatten from './flatten/cli.js'
|
|
5
|
-
import generate from './generate/cli.js'
|
|
6
|
-
import get from './get/cli.js'
|
|
7
|
-
import labels from './labels/cli.js'
|
|
8
|
-
import process from 'process'
|
|
9
|
-
import relocate from './relocate/cli.js'
|
|
10
|
-
import scale from './scale/cli.js'
|
|
11
|
-
import yargs from 'yargs'
|
|
12
|
-
const dirname = process.cwd()
|
|
13
|
-
const logger = getLogger(LogLevelSchema.enum.Info, `${dirname}`)
|
|
14
|
-
|
|
15
|
-
const main = async () => {
|
|
16
|
-
await yargs(hideBin(process.argv))
|
|
17
|
-
.help()
|
|
18
|
-
.option('log-level', {
|
|
19
|
-
type: 'string',
|
|
20
|
-
choices: Object.values(LogLevelSchema.enum),
|
|
21
|
-
default: LogLevelSchema.enum.Info,
|
|
22
|
-
description: 'The log level',
|
|
23
|
-
})
|
|
24
|
-
.middleware((argv) => {
|
|
25
|
-
logger.setLogLevel(argv.logLevel as LogLevel)
|
|
26
|
-
})
|
|
27
|
-
.command(generate({ logger }))
|
|
28
|
-
.command(flatten({ logger }))
|
|
29
|
-
.command(scale({ logger }))
|
|
30
|
-
.command(relocate({ logger }))
|
|
31
|
-
.command(get({ logger }))
|
|
32
|
-
.command(labels({ logger }))
|
|
33
|
-
.strictCommands()
|
|
34
|
-
.showHelpOnFail(false, 'Specify --help for available options')
|
|
35
|
-
.fail(false)
|
|
36
|
-
.parse()
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
//if main process
|
|
40
|
-
if (esMain(import.meta)) {
|
|
41
|
-
main()
|
|
42
|
-
.then(() => {
|
|
43
|
-
logger.debug('done')
|
|
44
|
-
process.exit(0)
|
|
45
|
-
})
|
|
46
|
-
.catch((err) => {
|
|
47
|
-
logger.error('error:', err)
|
|
48
|
-
process.exit(1)
|
|
49
|
-
})
|
|
50
|
-
}
|
package/src/flatten/args.ts
DELETED
package/src/flatten/cli.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { ArgumentsCamelCase, Argv } from 'yargs'
|
|
2
|
-
import { Logger } from '@prosopo/common'
|
|
3
|
-
import { argsSchema } from './args.js'
|
|
4
|
-
import flatten from './flatten.js'
|
|
5
|
-
|
|
6
|
-
export default (cmdArgs?: { logger?: Logger }) => {
|
|
7
|
-
return {
|
|
8
|
-
command: 'flatten',
|
|
9
|
-
describe:
|
|
10
|
-
'Restructure a directory containing directories for each image classification into a single directory with a file containing the labels',
|
|
11
|
-
builder: (yargs: Argv) => {
|
|
12
|
-
return yargs
|
|
13
|
-
.option('data', {
|
|
14
|
-
type: 'string',
|
|
15
|
-
alias: 'in',
|
|
16
|
-
demand: true,
|
|
17
|
-
description: 'Path to the data directory containing subdirectories for each image classification',
|
|
18
|
-
})
|
|
19
|
-
.option('out', {
|
|
20
|
-
type: 'string',
|
|
21
|
-
demand: true,
|
|
22
|
-
description: 'Where to put the output file containing the labels and single directory of images',
|
|
23
|
-
})
|
|
24
|
-
.option('overwrite', {
|
|
25
|
-
type: 'boolean',
|
|
26
|
-
description: 'Overwrite the output file if it already exists',
|
|
27
|
-
})
|
|
28
|
-
},
|
|
29
|
-
handler: async (argv: ArgumentsCamelCase) => {
|
|
30
|
-
await flatten(argsSchema.parse(argv), cmdArgs?.logger)
|
|
31
|
-
},
|
|
32
|
-
}
|
|
33
|
-
}
|
package/src/flatten/flatten.ts
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { Args } from './args.js'
|
|
2
|
-
import { CaptchaItemTypes, Data, DataSchema, LabelledItem } from '@prosopo/types'
|
|
3
|
-
import { Logger, ProsopoEnvError, getLoggerDefault } from '@prosopo/common'
|
|
4
|
-
import { blake2b } from '@noble/hashes/blake2b'
|
|
5
|
-
import { u8aToHex } from '@polkadot/util'
|
|
6
|
-
import fs from 'fs'
|
|
7
|
-
|
|
8
|
-
export default async (args: Args, logger?: Logger) => {
|
|
9
|
-
logger = logger || getLoggerDefault()
|
|
10
|
-
|
|
11
|
-
logger.debug(args, 'flattening...')
|
|
12
|
-
|
|
13
|
-
const dataDir: string = args.data
|
|
14
|
-
if (!fs.existsSync(dataDir)) {
|
|
15
|
-
throw new ProsopoEnvError(new Error(`data directory does not exist: ${dataDir}`), 'FS.DIRECTORY_NOT_FOUND')
|
|
16
|
-
}
|
|
17
|
-
const outDir: string = args.out
|
|
18
|
-
const overwrite = args.overwrite || false
|
|
19
|
-
if (!overwrite && fs.existsSync(outDir)) {
|
|
20
|
-
throw new ProsopoEnvError(
|
|
21
|
-
new Error(`output directory already exists: ${outDir}`),
|
|
22
|
-
'FS.DIRECTORY_ALREADY_EXISTS'
|
|
23
|
-
)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// find the labels (these should be subdirectories of the data directory)
|
|
27
|
-
const labels: string[] = fs
|
|
28
|
-
.readdirSync(dataDir, { withFileTypes: true })
|
|
29
|
-
.filter((dirent) => dirent.isDirectory())
|
|
30
|
-
.map((dirent) => dirent.name)
|
|
31
|
-
|
|
32
|
-
// create the output directory
|
|
33
|
-
const imageDir = `${outDir}/images`
|
|
34
|
-
fs.mkdirSync(imageDir, { recursive: true })
|
|
35
|
-
|
|
36
|
-
// for each label
|
|
37
|
-
const items: LabelledItem[] = []
|
|
38
|
-
for (const label of labels) {
|
|
39
|
-
// find all the images
|
|
40
|
-
const images: string[] = fs.readdirSync(`${dataDir}/${label}`)
|
|
41
|
-
// for each image
|
|
42
|
-
for (const image of images) {
|
|
43
|
-
logger.log(`flattening ${label}/${image}`)
|
|
44
|
-
// copy the image to the output directory
|
|
45
|
-
const extension = image.split('.').pop()
|
|
46
|
-
// read file to bytes
|
|
47
|
-
const content = fs.readFileSync(`${dataDir}/${label}/${image}`)
|
|
48
|
-
// hash based on the content of the image
|
|
49
|
-
const hash = blake2b(content)
|
|
50
|
-
const hex = u8aToHex(hash)
|
|
51
|
-
const name = `${hex}.${extension}`
|
|
52
|
-
if (fs.existsSync(`${imageDir}/${name}`)) {
|
|
53
|
-
logger.log(`duplicate image: ${label}/${image} -> ${name}`)
|
|
54
|
-
}
|
|
55
|
-
fs.copyFileSync(`${dataDir}/${label}/${image}`, `${imageDir}/${name}`)
|
|
56
|
-
const filePath = fs.realpathSync(`${imageDir}/${name}`)
|
|
57
|
-
// add the image to the map file
|
|
58
|
-
const entry: LabelledItem = {
|
|
59
|
-
data: filePath,
|
|
60
|
-
type: CaptchaItemTypes.Image,
|
|
61
|
-
label,
|
|
62
|
-
hash: hex,
|
|
63
|
-
}
|
|
64
|
-
items.push(entry)
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const data: Data = {
|
|
69
|
-
items,
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// verify data
|
|
73
|
-
DataSchema.parse(data)
|
|
74
|
-
|
|
75
|
-
// write map file
|
|
76
|
-
fs.writeFileSync(`${outDir}/data.json`, JSON.stringify(data, null, 4))
|
|
77
|
-
}
|
package/src/flatten/index.ts
DELETED
package/src/generate/args.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
// Args for generating a dataset
|
|
2
|
-
|
|
3
|
-
import { z } from 'zod'
|
|
4
|
-
|
|
5
|
-
export const argsSchema = z.object({
|
|
6
|
-
labels: z.string().optional(),
|
|
7
|
-
out: z.string(),
|
|
8
|
-
labelled: z.string().optional(),
|
|
9
|
-
unlabelled: z.string().optional(),
|
|
10
|
-
seed: z.number().optional(),
|
|
11
|
-
size: z.number().optional(),
|
|
12
|
-
overwrite: z.boolean().optional(),
|
|
13
|
-
allowDuplicates: z.boolean().optional(),
|
|
14
|
-
allowDuplicatesLabelled: z.boolean().optional(),
|
|
15
|
-
allowDuplicatesUnlabelled: z.boolean().optional(),
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
export type Args = z.infer<typeof argsSchema>
|
package/src/generate/cli.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { ArgumentsCamelCase, Argv } from 'yargs'
|
|
2
|
-
import { Logger } from '@prosopo/common'
|
|
3
|
-
import generateDistinct from './distinct/cli.js'
|
|
4
|
-
import generateUnion from './union/cli.js'
|
|
5
|
-
|
|
6
|
-
export default (cmdArgs?: { logger?: Logger }) => {
|
|
7
|
-
return {
|
|
8
|
-
command: 'generate',
|
|
9
|
-
describe: 'Generate captchas',
|
|
10
|
-
builder: (yargs: Argv) => {
|
|
11
|
-
return yargs
|
|
12
|
-
.command(generateDistinct(cmdArgs))
|
|
13
|
-
.command(generateUnion(cmdArgs))
|
|
14
|
-
.demandCommand()
|
|
15
|
-
.option('overwrite', {
|
|
16
|
-
type: 'boolean',
|
|
17
|
-
description: 'Overwrite the output file if it already exists',
|
|
18
|
-
})
|
|
19
|
-
.option('out', {
|
|
20
|
-
type: 'string',
|
|
21
|
-
demand: true,
|
|
22
|
-
description: 'Path to the output file',
|
|
23
|
-
default: 'captchas.json',
|
|
24
|
-
})
|
|
25
|
-
.option('labelled', {
|
|
26
|
-
type: 'string',
|
|
27
|
-
demand: true,
|
|
28
|
-
description: 'Path to the file containing map of images urls to labels',
|
|
29
|
-
})
|
|
30
|
-
.option('unlabelled', {
|
|
31
|
-
type: 'string',
|
|
32
|
-
demand: true,
|
|
33
|
-
description: 'Path to the file containing list of images url which are unlabelled',
|
|
34
|
-
})
|
|
35
|
-
.option('seed', {
|
|
36
|
-
type: 'number',
|
|
37
|
-
description: 'Seed for the random number generator',
|
|
38
|
-
})
|
|
39
|
-
.option('size', {
|
|
40
|
-
type: 'number',
|
|
41
|
-
description: 'Number of images in each captcha',
|
|
42
|
-
})
|
|
43
|
-
.options('labels', {
|
|
44
|
-
type: 'string',
|
|
45
|
-
description:
|
|
46
|
-
'Path to the labels file. This is a file containing a list of labels which unlabelled data will be assigned to.',
|
|
47
|
-
})
|
|
48
|
-
.option('allow-duplicates', {
|
|
49
|
-
type: 'boolean',
|
|
50
|
-
description: 'Allow duplicates in the data (labelled and unlabelled)',
|
|
51
|
-
})
|
|
52
|
-
.option('allow-duplicates-labelled', {
|
|
53
|
-
type: 'boolean',
|
|
54
|
-
description: 'Allow duplicates in the labelled data',
|
|
55
|
-
})
|
|
56
|
-
.option('allow-duplicates-unlabelled', {
|
|
57
|
-
type: 'boolean',
|
|
58
|
-
description: 'Allow duplicates in the unlabelled data',
|
|
59
|
-
})
|
|
60
|
-
},
|
|
61
|
-
handler: async (argv: ArgumentsCamelCase) => {
|
|
62
|
-
throw new Error('Please specify a command')
|
|
63
|
-
},
|
|
64
|
-
}
|
|
65
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { argsSchema as parentSchema } from '../args.js'
|
|
2
|
-
// Args for generating a dataset
|
|
3
|
-
|
|
4
|
-
import { z } from 'zod'
|
|
5
|
-
|
|
6
|
-
export const argsSchema = parentSchema.extend({
|
|
7
|
-
solved: z.number().optional(),
|
|
8
|
-
unsolved: z.number().optional(),
|
|
9
|
-
minCorrect: z.number().optional(),
|
|
10
|
-
maxCorrect: z.number().optional(),
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
export type Args = z.infer<typeof argsSchema>
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { ArgumentsCamelCase, Argv } from 'yargs'
|
|
2
|
-
import { Logger } from '@prosopo/common'
|
|
3
|
-
import { argsSchema } from './args.js'
|
|
4
|
-
import generate from './generate.js'
|
|
5
|
-
|
|
6
|
-
export default (cmdArgs?: { logger?: Logger }) => {
|
|
7
|
-
return {
|
|
8
|
-
command: 'distinct',
|
|
9
|
-
describe:
|
|
10
|
-
'Generate distinct captchas producing captcha challenges comprising 2 rounds, one labelled and one unlabelled',
|
|
11
|
-
builder: (yargs: Argv) => {
|
|
12
|
-
return yargs
|
|
13
|
-
.option('solved', {
|
|
14
|
-
type: 'number',
|
|
15
|
-
description: 'Number of captchas to generate that are solved',
|
|
16
|
-
})
|
|
17
|
-
.option('unsolved', {
|
|
18
|
-
type: 'number',
|
|
19
|
-
description: 'Number of captchas to generate that are unsolved',
|
|
20
|
-
})
|
|
21
|
-
.option('min-correct', {
|
|
22
|
-
type: 'number',
|
|
23
|
-
description: 'Minimum number of target images in each captcha',
|
|
24
|
-
})
|
|
25
|
-
.option('max-correct', {
|
|
26
|
-
type: 'number',
|
|
27
|
-
description: 'Maximum number of target images in each captcha',
|
|
28
|
-
})
|
|
29
|
-
},
|
|
30
|
-
handler: async (argv: ArgumentsCamelCase) => {
|
|
31
|
-
await generate(argsSchema.parse(argv), cmdArgs?.logger)
|
|
32
|
-
},
|
|
33
|
-
}
|
|
34
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
// generate some dummy data for testing the generate fns
|
|
2
|
-
|
|
3
|
-
import { CaptchaItemTypes, Item, LabelledItem } from '@prosopo/types'
|
|
4
|
-
import fs from 'fs'
|
|
5
|
-
|
|
6
|
-
const nLabels = 4
|
|
7
|
-
const nLabelledImages = 100
|
|
8
|
-
const nUnlabelledImages = 100
|
|
9
|
-
|
|
10
|
-
const labelledImages: LabelledItem[] = []
|
|
11
|
-
const unlabelledImages: Item[] = []
|
|
12
|
-
|
|
13
|
-
for (let i = 0; i < nLabelledImages; i++) {
|
|
14
|
-
const label = i % nLabels
|
|
15
|
-
labelledImages.push({
|
|
16
|
-
label: label.toString(),
|
|
17
|
-
data: `abc${i}`,
|
|
18
|
-
type: CaptchaItemTypes.Image,
|
|
19
|
-
hash: `abc${i}hash`,
|
|
20
|
-
})
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
for (let i = 0; i < nUnlabelledImages; i++) {
|
|
24
|
-
unlabelledImages.push({
|
|
25
|
-
data: `def${i}`,
|
|
26
|
-
type: CaptchaItemTypes.Image,
|
|
27
|
-
hash: `def${i}hash`,
|
|
28
|
-
})
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
fs.writeFileSync('labelled.json', JSON.stringify(labelledImages))
|
|
32
|
-
fs.writeFileSync('unlabelled.json', JSON.stringify(unlabelledImages))
|
|
33
|
-
fs.writeFileSync('labels.json', JSON.stringify(Array.from(Array(nLabels).keys()).map((x) => x.toString())))
|
|
34
|
-
|
|
35
|
-
process.exit(0)
|