@prosopo/datasets-fs 0.1.17
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/README.md +84 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +50 -0
- package/dist/cli.js.map +1 -0
- package/dist/flatten/args.d.ts +16 -0
- package/dist/flatten/args.d.ts.map +1 -0
- package/dist/flatten/args.js +8 -0
- package/dist/flatten/args.js.map +1 -0
- package/dist/flatten/cli.d.ts +18 -0
- package/dist/flatten/cli.d.ts.map +1 -0
- package/dist/flatten/cli.js +31 -0
- package/dist/flatten/cli.js.map +1 -0
- package/dist/flatten/flatten.d.ts +5 -0
- package/dist/flatten/flatten.d.ts.map +1 -0
- package/dist/flatten/flatten.js +66 -0
- package/dist/flatten/flatten.js.map +1 -0
- package/dist/flatten/index.d.ts +4 -0
- package/dist/flatten/index.d.ts.map +1 -0
- package/dist/flatten/index.js +4 -0
- package/dist/flatten/index.js.map +1 -0
- package/dist/generate/args.d.ts +37 -0
- package/dist/generate/args.d.ts.map +1 -0
- package/dist/generate/args.js +15 -0
- package/dist/generate/args.js.map +1 -0
- package/dist/generate/cli.d.ts +32 -0
- package/dist/generate/cli.d.ts.map +1 -0
- package/dist/generate/cli.js +63 -0
- package/dist/generate/cli.js.map +1 -0
- package/dist/generate/distinct/args.d.ts +49 -0
- package/dist/generate/distinct/args.d.ts.map +1 -0
- package/dist/generate/distinct/args.js +10 -0
- package/dist/generate/distinct/args.js.map +1 -0
- package/dist/generate/distinct/cli.d.ts +20 -0
- package/dist/generate/distinct/cli.d.ts.map +1 -0
- package/dist/generate/distinct/cli.js +32 -0
- package/dist/generate/distinct/cli.js.map +1 -0
- package/dist/generate/distinct/dummy.d.ts +2 -0
- package/dist/generate/distinct/dummy.d.ts.map +1 -0
- package/dist/generate/distinct/dummy.js +29 -0
- package/dist/generate/distinct/dummy.js.map +1 -0
- package/dist/generate/distinct/generate.d.ts +5 -0
- package/dist/generate/distinct/generate.d.ts.map +1 -0
- package/dist/generate/distinct/generate.js +186 -0
- package/dist/generate/distinct/generate.js.map +1 -0
- package/dist/generate/distinct/index.d.ts +4 -0
- package/dist/generate/distinct/index.d.ts.map +1 -0
- package/dist/generate/distinct/index.js +4 -0
- package/dist/generate/distinct/index.js.map +1 -0
- package/dist/generate/index.d.ts +5 -0
- package/dist/generate/index.d.ts.map +1 -0
- package/dist/generate/index.js +5 -0
- package/dist/generate/index.js.map +1 -0
- package/dist/generate/union/args.d.ts +52 -0
- package/dist/generate/union/args.d.ts.map +1 -0
- package/dist/generate/union/args.js +11 -0
- package/dist/generate/union/args.js.map +1 -0
- package/dist/generate/union/cli.d.ts +22 -0
- package/dist/generate/union/cli.d.ts.map +1 -0
- package/dist/generate/union/cli.js +36 -0
- package/dist/generate/union/cli.js.map +1 -0
- package/dist/generate/union/generate.d.ts +5 -0
- package/dist/generate/union/generate.d.ts.map +1 -0
- package/dist/generate/union/generate.js +168 -0
- package/dist/generate/union/generate.js.map +1 -0
- package/dist/generate/union/index.d.ts +4 -0
- package/dist/generate/union/index.d.ts.map +1 -0
- package/dist/generate/union/index.js +4 -0
- package/dist/generate/union/index.js.map +1 -0
- package/dist/generate/util.d.ts +12 -0
- package/dist/generate/util.d.ts.map +1 -0
- package/dist/generate/util.js +40 -0
- package/dist/generate/util.js.map +1 -0
- package/dist/get/args.d.ts +10 -0
- package/dist/get/args.d.ts.map +1 -0
- package/dist/get/args.js +6 -0
- package/dist/get/args.js.map +1 -0
- package/dist/get/cli.d.ts +14 -0
- package/dist/get/cli.d.ts.map +1 -0
- package/dist/get/cli.js +20 -0
- package/dist/get/cli.js.map +1 -0
- package/dist/get/get.d.ts +5 -0
- package/dist/get/get.d.ts.map +1 -0
- package/dist/get/get.js +58 -0
- package/dist/get/get.js.map +1 -0
- package/dist/get/index.d.ts +4 -0
- package/dist/get/index.d.ts.map +1 -0
- package/dist/get/index.js +4 -0
- package/dist/get/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/labels/args.d.ts +10 -0
- package/dist/labels/args.d.ts.map +1 -0
- package/dist/labels/args.js +6 -0
- package/dist/labels/args.js.map +1 -0
- package/dist/labels/cli.d.ts +14 -0
- package/dist/labels/cli.d.ts.map +1 -0
- package/dist/labels/cli.js +20 -0
- package/dist/labels/cli.js.map +1 -0
- package/dist/labels/index.d.ts +4 -0
- package/dist/labels/index.d.ts.map +1 -0
- package/dist/labels/index.js +4 -0
- package/dist/labels/index.js.map +1 -0
- package/dist/labels/labels.d.ts +5 -0
- package/dist/labels/labels.d.ts.map +1 -0
- package/dist/labels/labels.js +23 -0
- package/dist/labels/labels.js.map +1 -0
- package/dist/relocate/args.d.ts +16 -0
- package/dist/relocate/args.d.ts.map +1 -0
- package/dist/relocate/args.js +8 -0
- package/dist/relocate/args.js.map +1 -0
- package/dist/relocate/cli.d.ts +18 -0
- package/dist/relocate/cli.d.ts.map +1 -0
- package/dist/relocate/cli.js +30 -0
- package/dist/relocate/cli.js.map +1 -0
- package/dist/relocate/relocate.d.ts +5 -0
- package/dist/relocate/relocate.d.ts.map +1 -0
- package/dist/relocate/relocate.js +38 -0
- package/dist/relocate/relocate.js.map +1 -0
- package/dist/scale/args.d.ts +22 -0
- package/dist/scale/args.d.ts.map +1 -0
- package/dist/scale/args.js +10 -0
- package/dist/scale/args.js.map +1 -0
- package/dist/scale/cli.d.ts +22 -0
- package/dist/scale/cli.d.ts.map +1 -0
- package/dist/scale/cli.js +39 -0
- package/dist/scale/cli.js.map +1 -0
- package/dist/scale/index.d.ts +4 -0
- package/dist/scale/index.d.ts.map +1 -0
- package/dist/scale/index.js +4 -0
- package/dist/scale/index.js.map +1 -0
- package/dist/scale/scale.d.ts +5 -0
- package/dist/scale/scale.d.ts.map +1 -0
- package/dist/scale/scale.js +65 -0
- package/dist/scale/scale.js.map +1 -0
- package/package.json +54 -0
- package/src/cli.ts +50 -0
- package/src/flatten/args.ts +11 -0
- package/src/flatten/cli.ts +33 -0
- package/src/flatten/flatten.ts +77 -0
- package/src/flatten/index.ts +3 -0
- package/src/generate/args.ts +18 -0
- package/src/generate/cli.ts +65 -0
- package/src/generate/distinct/args.ts +13 -0
- package/src/generate/distinct/cli.ts +34 -0
- package/src/generate/distinct/dummy.ts +35 -0
- package/src/generate/distinct/generate.ts +238 -0
- package/src/generate/distinct/index.ts +3 -0
- package/src/generate/index.ts +4 -0
- package/src/generate/union/args.ts +14 -0
- package/src/generate/union/cli.ts +38 -0
- package/src/generate/union/generate.ts +210 -0
- package/src/generate/union/index.ts +3 -0
- package/src/generate/util.ts +61 -0
- package/src/get/args.ts +9 -0
- package/src/get/cli.ts +21 -0
- package/src/get/get.ts +56 -0
- package/src/get/index.ts +3 -0
- package/src/index.ts +14 -0
- package/src/labels/args.ts +9 -0
- package/src/labels/cli.ts +21 -0
- package/src/labels/index.ts +3 -0
- package/src/labels/labels.ts +27 -0
- package/src/relocate/args.ts +11 -0
- package/src/relocate/cli.ts +32 -0
- package/src/relocate/relocate.ts +38 -0
- package/src/scale/args.ts +13 -0
- package/src/scale/cli.ts +43 -0
- package/src/scale/index.ts +3 -0
- package/src/scale/scale.ts +79 -0
- package/tsconfig.json +17 -0
- package/tsconfig.tsbuildinfo +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
## How to produce captchas
|
|
2
|
+
|
|
3
|
+
You need 3 files:
|
|
4
|
+
|
|
5
|
+
1. a json file containing labelled data in the form:
|
|
6
|
+
```json
|
|
7
|
+
[
|
|
8
|
+
{
|
|
9
|
+
"label": "dog",
|
|
10
|
+
"data": "http://example.com/a.png"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"label": "cat",
|
|
14
|
+
"data": "http://example.com/b.png"
|
|
15
|
+
},
|
|
16
|
+
...
|
|
17
|
+
]
|
|
18
|
+
```
|
|
19
|
+
1. a json file containing unlabelled data in the form:
|
|
20
|
+
```json
|
|
21
|
+
[
|
|
22
|
+
{
|
|
23
|
+
"data": "http://example.com/c.png"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"data": "http://example.com/d.png"
|
|
27
|
+
},
|
|
28
|
+
...
|
|
29
|
+
]
|
|
30
|
+
```
|
|
31
|
+
1. (optional) a json file with an array of labels which unlabelled data can be categorised into. If not specified will default to the same labels as seen in the labelled data.
|
|
32
|
+
|
|
33
|
+
Then build and run the cli, passing appropriate parameters:
|
|
34
|
+
`npm run build && node ./dist/js/cli.js generate --labelled /path/to/my/labelled/data.json --unlabelled /path/to/my/unlabelled/data.json --seed 0 --labels /path/to/my/labels.json --output /path/to/the/output/captchas.json`
|
|
35
|
+
|
|
36
|
+
Use `node ./dist/js/cli.ts --help` to inspect other parameters.
|
|
37
|
+
|
|
38
|
+
Commands:
|
|
39
|
+
|
|
40
|
+
1. `flatten` converts a hierarchical directory structure into a single directory with corresponding map file, e.g.
|
|
41
|
+
```
|
|
42
|
+
data/
|
|
43
|
+
dog/
|
|
44
|
+
a.png
|
|
45
|
+
...
|
|
46
|
+
cat/
|
|
47
|
+
b.png
|
|
48
|
+
...
|
|
49
|
+
```
|
|
50
|
+
into
|
|
51
|
+
```
|
|
52
|
+
data/
|
|
53
|
+
a.png
|
|
54
|
+
b.png
|
|
55
|
+
...
|
|
56
|
+
map.json
|
|
57
|
+
```
|
|
58
|
+
where `map.json` looks like:
|
|
59
|
+
```
|
|
60
|
+
[
|
|
61
|
+
{
|
|
62
|
+
"label": "dog",
|
|
63
|
+
"data": "http://example.com/a.png"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"label": "cat",
|
|
67
|
+
"data": "http://example.com/b.png"
|
|
68
|
+
},
|
|
69
|
+
...
|
|
70
|
+
]
|
|
71
|
+
```
|
|
72
|
+
e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js flatten --in ~/bench/test/data --out ~/bench/test/flat --overwrite`
|
|
73
|
+
1. `generateDistinct` takes the 3 files described above and produces captcha challenges comprising 2 rounds, one labelled and one unlabelled.
|
|
74
|
+
e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js generate distinct --out ~/bench/test/captchas.json --labelled ~/bench/test/flat/data.json --unlabelled ~/bench/test/flat/data.json --seed 0 --size 9 --allow-duplicates --solved 1 --unsolved 1 --overwrite --labels ~/bench/test/flat/labels.json`
|
|
75
|
+
1. `generateUnion` takes the 3 files described above and produces captcha challenges comprising one or more rounds, mixing labelled and unlabelled data into a single round.
|
|
76
|
+
e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js generate union --out ~/bench/test/captchas-union.json --labelled ~/bench/test/flat/data.json --unlabelled ~/bench/test/flat/data.json --seed 0 --size 9 --allow-duplicates --count 2 --overwrite --labels ~/bench/test/flat/labels.json`
|
|
77
|
+
1. 'labels' gets all labels from a data json.
|
|
78
|
+
e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js labels --data ~/bench/test/flat/data2.json`
|
|
79
|
+
1. 'get' fetches all images using a GET request, displaying errors for any images which hit 404 or not OK.
|
|
80
|
+
e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js get --data ~/bench/test/flat/data2.json`
|
|
81
|
+
1. 'relocate' rewrites the url of images in a json file.
|
|
82
|
+
e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js relocate --from example.com --to web.site --data ~/bench/test/flat/data2.json`
|
|
83
|
+
1. 'scale' rescales images in a flat directory structure to a given size.
|
|
84
|
+
e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js scale --data ~/bench/test/flat/data.json --out ~/bench/test/flat/images2 --overwrite --size 128`
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { LogLevelSchema, getLogger } from '@prosopo/common';
|
|
3
|
+
import { hideBin } from 'yargs/helpers';
|
|
4
|
+
import esMain from 'es-main';
|
|
5
|
+
import flatten from './flatten/cli.js';
|
|
6
|
+
import generate from './generate/cli.js';
|
|
7
|
+
import get from './get/cli.js';
|
|
8
|
+
import labels from './labels/cli.js';
|
|
9
|
+
import process from 'process';
|
|
10
|
+
import relocate from './relocate/cli.js';
|
|
11
|
+
import scale from './scale/cli.js';
|
|
12
|
+
import yargs from 'yargs';
|
|
13
|
+
const dirname = process.cwd();
|
|
14
|
+
const logger = getLogger(LogLevelSchema.enum.Info, `${dirname}`);
|
|
15
|
+
const main = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
16
|
+
yield 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);
|
|
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
|
+
//if main process
|
|
39
|
+
if (esMain(import.meta)) {
|
|
40
|
+
main()
|
|
41
|
+
.then(() => {
|
|
42
|
+
logger.debug('done');
|
|
43
|
+
process.exit(0);
|
|
44
|
+
})
|
|
45
|
+
.catch((err) => {
|
|
46
|
+
logger.error('error:', err);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAAA,OAAO,EAAY,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,OAAO,MAAM,kBAAkB,CAAA;AACtC,OAAO,QAAQ,MAAM,mBAAmB,CAAA;AACxC,OAAO,GAAG,MAAM,cAAc,CAAA;AAC9B,OAAO,MAAM,MAAM,iBAAiB,CAAA;AACpC,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,QAAQ,MAAM,mBAAmB,CAAA;AACxC,OAAO,KAAK,MAAM,gBAAgB,CAAA;AAClC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;AAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;AAEhE,MAAM,IAAI,GAAG,GAAS,EAAE;IACpB,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC7B,IAAI,EAAE;SACN,MAAM,CAAC,WAAW,EAAE;QACjB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC;QAC3C,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI;QACjC,WAAW,EAAE,eAAe;KAC/B,CAAC;SACD,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;QACjB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAoB,CAAC,CAAA;IACjD,CAAC,CAAC;SACD,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC7B,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC5B,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC1B,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SACxB,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC3B,cAAc,EAAE;SAChB,cAAc,CAAC,KAAK,EAAE,sCAAsC,CAAC;SAC7D,IAAI,CAAC,KAAK,CAAC;SACX,KAAK,EAAE,CAAA;AAChB,CAAC,CAAA,CAAA;AAED,iBAAiB;AACjB,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;IACrB,IAAI,EAAE;SACD,IAAI,CAAC,GAAG,EAAE;QACP,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;CACT"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const argsSchema: z.ZodObject<{
|
|
3
|
+
data: z.ZodString;
|
|
4
|
+
out: z.ZodString;
|
|
5
|
+
overwrite: z.ZodOptional<z.ZodBoolean>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
data: string;
|
|
8
|
+
out: string;
|
|
9
|
+
overwrite?: boolean | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
data: string;
|
|
12
|
+
out: string;
|
|
13
|
+
overwrite?: boolean | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export type Args = z.infer<typeof argsSchema>;
|
|
16
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/flatten/args.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,UAAU;;;;;;;;;;;;EAIrB,CAAA;AAEF,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/flatten/args.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ArgumentsCamelCase, Argv } from 'yargs';
|
|
2
|
+
import { Logger } from '@prosopo/common';
|
|
3
|
+
declare const _default: (cmdArgs?: {
|
|
4
|
+
logger?: Logger;
|
|
5
|
+
}) => {
|
|
6
|
+
command: string;
|
|
7
|
+
describe: string;
|
|
8
|
+
builder: (yargs: Argv) => Argv<{
|
|
9
|
+
data: string;
|
|
10
|
+
} & {
|
|
11
|
+
out: string;
|
|
12
|
+
} & {
|
|
13
|
+
overwrite: boolean | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
handler: (argv: ArgumentsCamelCase) => Promise<void>;
|
|
16
|
+
};
|
|
17
|
+
export default _default;
|
|
18
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/flatten/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;mCAId;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;qBAKpB,IAAI;;;;;;;oBAkBC,kBAAkB;;AAvBhD,wBA2BC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { argsSchema } from './args.js';
|
|
3
|
+
import flatten from './flatten.js';
|
|
4
|
+
export default (cmdArgs) => {
|
|
5
|
+
return {
|
|
6
|
+
command: 'flatten',
|
|
7
|
+
describe: 'Restructure a directory containing directories for each image classification into a single directory with a file containing the labels',
|
|
8
|
+
builder: (yargs) => {
|
|
9
|
+
return yargs
|
|
10
|
+
.option('data', {
|
|
11
|
+
type: 'string',
|
|
12
|
+
alias: 'in',
|
|
13
|
+
demand: true,
|
|
14
|
+
description: 'Path to the data directory containing subdirectories for each image classification',
|
|
15
|
+
})
|
|
16
|
+
.option('out', {
|
|
17
|
+
type: 'string',
|
|
18
|
+
demand: true,
|
|
19
|
+
description: 'Where to put the output file containing the labels and single directory of images',
|
|
20
|
+
})
|
|
21
|
+
.option('overwrite', {
|
|
22
|
+
type: 'boolean',
|
|
23
|
+
description: 'Overwrite the output file if it already exists',
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
handler: (argv) => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
+
yield flatten(argsSchema.parse(argv), cmdArgs === null || cmdArgs === void 0 ? void 0 : cmdArgs.logger);
|
|
28
|
+
}),
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/flatten/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,eAAe,CAAC,OAA6B,EAAE,EAAE;IAC7C,OAAO;QACH,OAAO,EAAE,SAAS;QAClB,QAAQ,EACJ,wIAAwI;QAC5I,OAAO,EAAE,CAAC,KAAW,EAAE,EAAE;YACrB,OAAO,KAAK;iBACP,MAAM,CAAC,MAAM,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,oFAAoF;aACpG,CAAC;iBACD,MAAM,CAAC,KAAK,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,mFAAmF;aACnG,CAAC;iBACD,MAAM,CAAC,WAAW,EAAE;gBACjB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,gDAAgD;aAChE,CAAC,CAAA;QACV,CAAC;QACD,OAAO,EAAE,CAAO,IAAwB,EAAE,EAAE;YACxC,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC,CAAA;QAC1D,CAAC,CAAA;KACJ,CAAA;AACL,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../src/flatten/flatten.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,MAAM,EAAqC,MAAM,iBAAiB,CAAA;+BAK/C,IAAI,WAAW,MAAM;AAAjD,wBAqEC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { CaptchaItemTypes, 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
|
+
export default (args, logger) => __awaiter(void 0, void 0, void 0, function* () {
|
|
8
|
+
logger = logger || getLoggerDefault();
|
|
9
|
+
logger.debug(args, 'flattening...');
|
|
10
|
+
const dataDir = args.data;
|
|
11
|
+
if (!fs.existsSync(dataDir)) {
|
|
12
|
+
throw new ProsopoEnvError(new Error(`data directory does not exist: ${dataDir}`), 'FS.DIRECTORY_NOT_FOUND');
|
|
13
|
+
}
|
|
14
|
+
const outDir = args.out;
|
|
15
|
+
const overwrite = args.overwrite || false;
|
|
16
|
+
if (!overwrite && fs.existsSync(outDir)) {
|
|
17
|
+
throw new ProsopoEnvError(new Error(`output directory already exists: ${outDir}`), 'FS.DIRECTORY_ALREADY_EXISTS');
|
|
18
|
+
}
|
|
19
|
+
// find the labels (these should be subdirectories of the data directory)
|
|
20
|
+
const labels = fs
|
|
21
|
+
.readdirSync(dataDir, { withFileTypes: true })
|
|
22
|
+
.filter((dirent) => dirent.isDirectory())
|
|
23
|
+
.map((dirent) => dirent.name);
|
|
24
|
+
// create the output directory
|
|
25
|
+
const imageDir = `${outDir}/images`;
|
|
26
|
+
fs.mkdirSync(imageDir, { recursive: true });
|
|
27
|
+
// for each label
|
|
28
|
+
const items = [];
|
|
29
|
+
for (const label of labels) {
|
|
30
|
+
// find all the images
|
|
31
|
+
const images = fs.readdirSync(`${dataDir}/${label}`);
|
|
32
|
+
// for each image
|
|
33
|
+
for (const image of images) {
|
|
34
|
+
logger.log(`flattening ${label}/${image}`);
|
|
35
|
+
// copy the image to the output directory
|
|
36
|
+
const extension = image.split('.').pop();
|
|
37
|
+
// read file to bytes
|
|
38
|
+
const content = fs.readFileSync(`${dataDir}/${label}/${image}`);
|
|
39
|
+
// hash based on the content of the image
|
|
40
|
+
const hash = blake2b(content);
|
|
41
|
+
const hex = u8aToHex(hash);
|
|
42
|
+
const name = `${hex}.${extension}`;
|
|
43
|
+
if (fs.existsSync(`${imageDir}/${name}`)) {
|
|
44
|
+
logger.log(`duplicate image: ${label}/${image} -> ${name}`);
|
|
45
|
+
}
|
|
46
|
+
fs.copyFileSync(`${dataDir}/${label}/${image}`, `${imageDir}/${name}`);
|
|
47
|
+
const filePath = fs.realpathSync(`${imageDir}/${name}`);
|
|
48
|
+
// add the image to the map file
|
|
49
|
+
const entry = {
|
|
50
|
+
data: filePath,
|
|
51
|
+
type: CaptchaItemTypes.Image,
|
|
52
|
+
label,
|
|
53
|
+
hash: hex,
|
|
54
|
+
};
|
|
55
|
+
items.push(entry);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const data = {
|
|
59
|
+
items,
|
|
60
|
+
};
|
|
61
|
+
// verify data
|
|
62
|
+
DataSchema.parse(data);
|
|
63
|
+
// write map file
|
|
64
|
+
fs.writeFileSync(`${outDir}/data.json`, JSON.stringify(data, null, 4));
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=flatten.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten.js","sourceRoot":"","sources":["../../src/flatten/flatten.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/flatten/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/flatten/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const argsSchema: z.ZodObject<{
|
|
3
|
+
labels: z.ZodOptional<z.ZodString>;
|
|
4
|
+
out: z.ZodString;
|
|
5
|
+
labelled: z.ZodOptional<z.ZodString>;
|
|
6
|
+
unlabelled: z.ZodOptional<z.ZodString>;
|
|
7
|
+
seed: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
overwrite: z.ZodOptional<z.ZodBoolean>;
|
|
10
|
+
allowDuplicates: z.ZodOptional<z.ZodBoolean>;
|
|
11
|
+
allowDuplicatesLabelled: z.ZodOptional<z.ZodBoolean>;
|
|
12
|
+
allowDuplicatesUnlabelled: z.ZodOptional<z.ZodBoolean>;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
out: string;
|
|
15
|
+
labels?: string | undefined;
|
|
16
|
+
labelled?: string | undefined;
|
|
17
|
+
unlabelled?: string | undefined;
|
|
18
|
+
seed?: number | undefined;
|
|
19
|
+
size?: number | undefined;
|
|
20
|
+
overwrite?: boolean | undefined;
|
|
21
|
+
allowDuplicates?: boolean | undefined;
|
|
22
|
+
allowDuplicatesLabelled?: boolean | undefined;
|
|
23
|
+
allowDuplicatesUnlabelled?: boolean | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
out: string;
|
|
26
|
+
labels?: string | undefined;
|
|
27
|
+
labelled?: string | undefined;
|
|
28
|
+
unlabelled?: string | undefined;
|
|
29
|
+
seed?: number | undefined;
|
|
30
|
+
size?: number | undefined;
|
|
31
|
+
overwrite?: boolean | undefined;
|
|
32
|
+
allowDuplicates?: boolean | undefined;
|
|
33
|
+
allowDuplicatesLabelled?: boolean | undefined;
|
|
34
|
+
allowDuplicatesUnlabelled?: boolean | undefined;
|
|
35
|
+
}>;
|
|
36
|
+
export type Args = z.infer<typeof argsSchema>;
|
|
37
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/generate/args.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWrB,CAAA;AAEF,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Args for generating a dataset
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export const argsSchema = z.object({
|
|
4
|
+
labels: z.string().optional(),
|
|
5
|
+
out: z.string(),
|
|
6
|
+
labelled: z.string().optional(),
|
|
7
|
+
unlabelled: z.string().optional(),
|
|
8
|
+
seed: z.number().optional(),
|
|
9
|
+
size: z.number().optional(),
|
|
10
|
+
overwrite: z.boolean().optional(),
|
|
11
|
+
allowDuplicates: z.boolean().optional(),
|
|
12
|
+
allowDuplicatesLabelled: z.boolean().optional(),
|
|
13
|
+
allowDuplicatesUnlabelled: z.boolean().optional(),
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/generate/args.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACvC,uBAAuB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/C,yBAAyB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACpD,CAAC,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ArgumentsCamelCase, Argv } from 'yargs';
|
|
2
|
+
import { Logger } from '@prosopo/common';
|
|
3
|
+
declare const _default: (cmdArgs?: {
|
|
4
|
+
logger?: Logger;
|
|
5
|
+
}) => {
|
|
6
|
+
command: string;
|
|
7
|
+
describe: string;
|
|
8
|
+
builder: (yargs: Argv) => Argv<{
|
|
9
|
+
overwrite: boolean | undefined;
|
|
10
|
+
} & {
|
|
11
|
+
out: string;
|
|
12
|
+
} & {
|
|
13
|
+
labelled: string;
|
|
14
|
+
} & {
|
|
15
|
+
unlabelled: string;
|
|
16
|
+
} & {
|
|
17
|
+
seed: number | undefined;
|
|
18
|
+
} & {
|
|
19
|
+
size: number | undefined;
|
|
20
|
+
} & {
|
|
21
|
+
labels: string | undefined;
|
|
22
|
+
} & {
|
|
23
|
+
"allow-duplicates": boolean | undefined;
|
|
24
|
+
} & {
|
|
25
|
+
"allow-duplicates-labelled": boolean | undefined;
|
|
26
|
+
} & {
|
|
27
|
+
"allow-duplicates-unlabelled": boolean | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
handler: (argv: ArgumentsCamelCase) => Promise<never>;
|
|
30
|
+
};
|
|
31
|
+
export default _default;
|
|
32
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/generate/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;mCAId;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;qBAIpB,IAAI;;;;;;;;;;;;;;;;;;;;;oBAmDC,kBAAkB;;AAvDhD,wBA2DC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import generateDistinct from './distinct/cli.js';
|
|
3
|
+
import generateUnion from './union/cli.js';
|
|
4
|
+
export default (cmdArgs) => {
|
|
5
|
+
return {
|
|
6
|
+
command: 'generate',
|
|
7
|
+
describe: 'Generate captchas',
|
|
8
|
+
builder: (yargs) => {
|
|
9
|
+
return yargs
|
|
10
|
+
.command(generateDistinct(cmdArgs))
|
|
11
|
+
.command(generateUnion(cmdArgs))
|
|
12
|
+
.demandCommand()
|
|
13
|
+
.option('overwrite', {
|
|
14
|
+
type: 'boolean',
|
|
15
|
+
description: 'Overwrite the output file if it already exists',
|
|
16
|
+
})
|
|
17
|
+
.option('out', {
|
|
18
|
+
type: 'string',
|
|
19
|
+
demand: true,
|
|
20
|
+
description: 'Path to the output file',
|
|
21
|
+
default: 'captchas.json',
|
|
22
|
+
})
|
|
23
|
+
.option('labelled', {
|
|
24
|
+
type: 'string',
|
|
25
|
+
demand: true,
|
|
26
|
+
description: 'Path to the file containing map of images urls to labels',
|
|
27
|
+
})
|
|
28
|
+
.option('unlabelled', {
|
|
29
|
+
type: 'string',
|
|
30
|
+
demand: true,
|
|
31
|
+
description: 'Path to the file containing list of images url which are unlabelled',
|
|
32
|
+
})
|
|
33
|
+
.option('seed', {
|
|
34
|
+
type: 'number',
|
|
35
|
+
description: 'Seed for the random number generator',
|
|
36
|
+
})
|
|
37
|
+
.option('size', {
|
|
38
|
+
type: 'number',
|
|
39
|
+
description: 'Number of images in each captcha',
|
|
40
|
+
})
|
|
41
|
+
.options('labels', {
|
|
42
|
+
type: 'string',
|
|
43
|
+
description: 'Path to the labels file. This is a file containing a list of labels which unlabelled data will be assigned to.',
|
|
44
|
+
})
|
|
45
|
+
.option('allow-duplicates', {
|
|
46
|
+
type: 'boolean',
|
|
47
|
+
description: 'Allow duplicates in the data (labelled and unlabelled)',
|
|
48
|
+
})
|
|
49
|
+
.option('allow-duplicates-labelled', {
|
|
50
|
+
type: 'boolean',
|
|
51
|
+
description: 'Allow duplicates in the labelled data',
|
|
52
|
+
})
|
|
53
|
+
.option('allow-duplicates-unlabelled', {
|
|
54
|
+
type: 'boolean',
|
|
55
|
+
description: 'Allow duplicates in the unlabelled data',
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
handler: (argv) => __awaiter(void 0, void 0, void 0, function* () {
|
|
59
|
+
throw new Error('Please specify a command');
|
|
60
|
+
}),
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/generate/cli.ts"],"names":[],"mappings":";AAEA,OAAO,gBAAgB,MAAM,mBAAmB,CAAA;AAChD,OAAO,aAAa,MAAM,gBAAgB,CAAA;AAE1C,eAAe,CAAC,OAA6B,EAAE,EAAE;IAC7C,OAAO;QACH,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,mBAAmB;QAC7B,OAAO,EAAE,CAAC,KAAW,EAAE,EAAE;YACrB,OAAO,KAAK;iBACP,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;iBAClC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;iBAC/B,aAAa,EAAE;iBACf,MAAM,CAAC,WAAW,EAAE;gBACjB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,gDAAgD;aAChE,CAAC;iBACD,MAAM,CAAC,KAAK,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,yBAAyB;gBACtC,OAAO,EAAE,eAAe;aAC3B,CAAC;iBACD,MAAM,CAAC,UAAU,EAAE;gBAChB,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,0DAA0D;aAC1E,CAAC;iBACD,MAAM,CAAC,YAAY,EAAE;gBAClB,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,qEAAqE;aACrF,CAAC;iBACD,MAAM,CAAC,MAAM,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sCAAsC;aACtD,CAAC;iBACD,MAAM,CAAC,MAAM,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kCAAkC;aAClD,CAAC;iBACD,OAAO,CAAC,QAAQ,EAAE;gBACf,IAAI,EAAE,QAAQ;gBACd,WAAW,EACP,gHAAgH;aACvH,CAAC;iBACD,MAAM,CAAC,kBAAkB,EAAE;gBACxB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,wDAAwD;aACxE,CAAC;iBACD,MAAM,CAAC,2BAA2B,EAAE;gBACjC,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,uCAAuC;aACvD,CAAC;iBACD,MAAM,CAAC,6BAA6B,EAAE;gBACnC,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,yCAAyC;aACzD,CAAC,CAAA;QACV,CAAC;QACD,OAAO,EAAE,CAAO,IAAwB,EAAE,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC/C,CAAC,CAAA;KACJ,CAAA;AACL,CAAC,CAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const argsSchema: z.ZodObject<{
|
|
3
|
+
out: z.ZodString;
|
|
4
|
+
overwrite: z.ZodOptional<z.ZodBoolean>;
|
|
5
|
+
labels: z.ZodOptional<z.ZodString>;
|
|
6
|
+
labelled: z.ZodOptional<z.ZodString>;
|
|
7
|
+
unlabelled: z.ZodOptional<z.ZodString>;
|
|
8
|
+
seed: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
allowDuplicates: z.ZodOptional<z.ZodBoolean>;
|
|
11
|
+
allowDuplicatesLabelled: z.ZodOptional<z.ZodBoolean>;
|
|
12
|
+
allowDuplicatesUnlabelled: z.ZodOptional<z.ZodBoolean>;
|
|
13
|
+
solved: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
unsolved: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
minCorrect: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
maxCorrect: z.ZodOptional<z.ZodNumber>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
out: string;
|
|
19
|
+
overwrite?: boolean | undefined;
|
|
20
|
+
labels?: string | undefined;
|
|
21
|
+
labelled?: string | undefined;
|
|
22
|
+
unlabelled?: string | undefined;
|
|
23
|
+
seed?: number | undefined;
|
|
24
|
+
size?: number | undefined;
|
|
25
|
+
allowDuplicates?: boolean | undefined;
|
|
26
|
+
allowDuplicatesLabelled?: boolean | undefined;
|
|
27
|
+
allowDuplicatesUnlabelled?: boolean | undefined;
|
|
28
|
+
solved?: number | undefined;
|
|
29
|
+
unsolved?: number | undefined;
|
|
30
|
+
minCorrect?: number | undefined;
|
|
31
|
+
maxCorrect?: number | undefined;
|
|
32
|
+
}, {
|
|
33
|
+
out: string;
|
|
34
|
+
overwrite?: boolean | undefined;
|
|
35
|
+
labels?: string | undefined;
|
|
36
|
+
labelled?: string | undefined;
|
|
37
|
+
unlabelled?: string | undefined;
|
|
38
|
+
seed?: number | undefined;
|
|
39
|
+
size?: number | undefined;
|
|
40
|
+
allowDuplicates?: boolean | undefined;
|
|
41
|
+
allowDuplicatesLabelled?: boolean | undefined;
|
|
42
|
+
allowDuplicatesUnlabelled?: boolean | undefined;
|
|
43
|
+
solved?: number | undefined;
|
|
44
|
+
unsolved?: number | undefined;
|
|
45
|
+
minCorrect?: number | undefined;
|
|
46
|
+
maxCorrect?: number | undefined;
|
|
47
|
+
}>;
|
|
48
|
+
export type Args = z.infer<typeof argsSchema>;
|
|
49
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/generate/distinct/args.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKrB,CAAA;AAEF,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { argsSchema as parentSchema } from '../args.js';
|
|
2
|
+
// Args for generating a dataset
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export const argsSchema = parentSchema.extend({
|
|
5
|
+
solved: z.number().optional(),
|
|
6
|
+
unsolved: z.number().optional(),
|
|
7
|
+
minCorrect: z.number().optional(),
|
|
8
|
+
maxCorrect: z.number().optional(),
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/generate/distinct/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,MAAM,YAAY,CAAA;AACvD,gCAAgC;AAEhC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ArgumentsCamelCase, Argv } from 'yargs';
|
|
2
|
+
import { Logger } from '@prosopo/common';
|
|
3
|
+
declare const _default: (cmdArgs?: {
|
|
4
|
+
logger?: Logger;
|
|
5
|
+
}) => {
|
|
6
|
+
command: string;
|
|
7
|
+
describe: string;
|
|
8
|
+
builder: (yargs: Argv) => Argv<{
|
|
9
|
+
solved: number | undefined;
|
|
10
|
+
} & {
|
|
11
|
+
unsolved: number | undefined;
|
|
12
|
+
} & {
|
|
13
|
+
"min-correct": number | undefined;
|
|
14
|
+
} & {
|
|
15
|
+
"max-correct": number | undefined;
|
|
16
|
+
}>;
|
|
17
|
+
handler: (argv: ArgumentsCamelCase) => Promise<void>;
|
|
18
|
+
};
|
|
19
|
+
export default _default;
|
|
20
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/generate/distinct/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;mCAId;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;qBAKpB,IAAI;;;;;;;;;oBAmBC,kBAAkB;;AAxBhD,wBA4BC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { argsSchema } from './args.js';
|
|
3
|
+
import generate from './generate.js';
|
|
4
|
+
export default (cmdArgs) => {
|
|
5
|
+
return {
|
|
6
|
+
command: 'distinct',
|
|
7
|
+
describe: 'Generate distinct captchas producing captcha challenges comprising 2 rounds, one labelled and one unlabelled',
|
|
8
|
+
builder: (yargs) => {
|
|
9
|
+
return yargs
|
|
10
|
+
.option('solved', {
|
|
11
|
+
type: 'number',
|
|
12
|
+
description: 'Number of captchas to generate that are solved',
|
|
13
|
+
})
|
|
14
|
+
.option('unsolved', {
|
|
15
|
+
type: 'number',
|
|
16
|
+
description: 'Number of captchas to generate that are unsolved',
|
|
17
|
+
})
|
|
18
|
+
.option('min-correct', {
|
|
19
|
+
type: 'number',
|
|
20
|
+
description: 'Minimum number of target images in each captcha',
|
|
21
|
+
})
|
|
22
|
+
.option('max-correct', {
|
|
23
|
+
type: 'number',
|
|
24
|
+
description: 'Maximum number of target images in each captcha',
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
handler: (argv) => __awaiter(void 0, void 0, void 0, function* () {
|
|
28
|
+
yield generate(argsSchema.parse(argv), cmdArgs === null || cmdArgs === void 0 ? void 0 : cmdArgs.logger);
|
|
29
|
+
}),
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=cli.js.map
|