@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.
Files changed (173) hide show
  1. package/package.json +10 -5
  2. package/dist/cli.d.ts +0 -2
  3. package/dist/cli.d.ts.map +0 -1
  4. package/dist/cli.js +0 -50
  5. package/dist/cli.js.map +0 -1
  6. package/dist/flatten/args.d.ts +0 -16
  7. package/dist/flatten/args.d.ts.map +0 -1
  8. package/dist/flatten/args.js +0 -8
  9. package/dist/flatten/args.js.map +0 -1
  10. package/dist/flatten/cli.d.ts +0 -18
  11. package/dist/flatten/cli.d.ts.map +0 -1
  12. package/dist/flatten/cli.js +0 -31
  13. package/dist/flatten/cli.js.map +0 -1
  14. package/dist/flatten/flatten.d.ts +0 -5
  15. package/dist/flatten/flatten.d.ts.map +0 -1
  16. package/dist/flatten/flatten.js +0 -66
  17. package/dist/flatten/flatten.js.map +0 -1
  18. package/dist/flatten/index.d.ts +0 -4
  19. package/dist/flatten/index.d.ts.map +0 -1
  20. package/dist/flatten/index.js +0 -4
  21. package/dist/flatten/index.js.map +0 -1
  22. package/dist/generate/args.d.ts +0 -37
  23. package/dist/generate/args.d.ts.map +0 -1
  24. package/dist/generate/args.js +0 -15
  25. package/dist/generate/args.js.map +0 -1
  26. package/dist/generate/cli.d.ts +0 -32
  27. package/dist/generate/cli.d.ts.map +0 -1
  28. package/dist/generate/cli.js +0 -63
  29. package/dist/generate/cli.js.map +0 -1
  30. package/dist/generate/distinct/args.d.ts +0 -49
  31. package/dist/generate/distinct/args.d.ts.map +0 -1
  32. package/dist/generate/distinct/args.js +0 -10
  33. package/dist/generate/distinct/args.js.map +0 -1
  34. package/dist/generate/distinct/cli.d.ts +0 -20
  35. package/dist/generate/distinct/cli.d.ts.map +0 -1
  36. package/dist/generate/distinct/cli.js +0 -32
  37. package/dist/generate/distinct/cli.js.map +0 -1
  38. package/dist/generate/distinct/dummy.d.ts +0 -2
  39. package/dist/generate/distinct/dummy.d.ts.map +0 -1
  40. package/dist/generate/distinct/dummy.js +0 -29
  41. package/dist/generate/distinct/dummy.js.map +0 -1
  42. package/dist/generate/distinct/generate.d.ts +0 -5
  43. package/dist/generate/distinct/generate.d.ts.map +0 -1
  44. package/dist/generate/distinct/generate.js +0 -186
  45. package/dist/generate/distinct/generate.js.map +0 -1
  46. package/dist/generate/distinct/index.d.ts +0 -4
  47. package/dist/generate/distinct/index.d.ts.map +0 -1
  48. package/dist/generate/distinct/index.js +0 -4
  49. package/dist/generate/distinct/index.js.map +0 -1
  50. package/dist/generate/index.d.ts +0 -5
  51. package/dist/generate/index.d.ts.map +0 -1
  52. package/dist/generate/index.js +0 -5
  53. package/dist/generate/index.js.map +0 -1
  54. package/dist/generate/union/args.d.ts +0 -52
  55. package/dist/generate/union/args.d.ts.map +0 -1
  56. package/dist/generate/union/args.js +0 -11
  57. package/dist/generate/union/args.js.map +0 -1
  58. package/dist/generate/union/cli.d.ts +0 -22
  59. package/dist/generate/union/cli.d.ts.map +0 -1
  60. package/dist/generate/union/cli.js +0 -36
  61. package/dist/generate/union/cli.js.map +0 -1
  62. package/dist/generate/union/generate.d.ts +0 -5
  63. package/dist/generate/union/generate.d.ts.map +0 -1
  64. package/dist/generate/union/generate.js +0 -168
  65. package/dist/generate/union/generate.js.map +0 -1
  66. package/dist/generate/union/index.d.ts +0 -4
  67. package/dist/generate/union/index.d.ts.map +0 -1
  68. package/dist/generate/union/index.js +0 -4
  69. package/dist/generate/union/index.js.map +0 -1
  70. package/dist/generate/util.d.ts +0 -12
  71. package/dist/generate/util.d.ts.map +0 -1
  72. package/dist/generate/util.js +0 -40
  73. package/dist/generate/util.js.map +0 -1
  74. package/dist/get/args.d.ts +0 -10
  75. package/dist/get/args.d.ts.map +0 -1
  76. package/dist/get/args.js +0 -6
  77. package/dist/get/args.js.map +0 -1
  78. package/dist/get/cli.d.ts +0 -14
  79. package/dist/get/cli.d.ts.map +0 -1
  80. package/dist/get/cli.js +0 -20
  81. package/dist/get/cli.js.map +0 -1
  82. package/dist/get/get.d.ts +0 -5
  83. package/dist/get/get.d.ts.map +0 -1
  84. package/dist/get/get.js +0 -58
  85. package/dist/get/get.js.map +0 -1
  86. package/dist/get/index.d.ts +0 -4
  87. package/dist/get/index.d.ts.map +0 -1
  88. package/dist/get/index.js +0 -4
  89. package/dist/get/index.js.map +0 -1
  90. package/dist/index.d.ts +0 -2
  91. package/dist/index.d.ts.map +0 -1
  92. package/dist/index.js +0 -15
  93. package/dist/index.js.map +0 -1
  94. package/dist/labels/args.d.ts +0 -10
  95. package/dist/labels/args.d.ts.map +0 -1
  96. package/dist/labels/args.js +0 -6
  97. package/dist/labels/args.js.map +0 -1
  98. package/dist/labels/cli.d.ts +0 -14
  99. package/dist/labels/cli.d.ts.map +0 -1
  100. package/dist/labels/cli.js +0 -20
  101. package/dist/labels/cli.js.map +0 -1
  102. package/dist/labels/index.d.ts +0 -4
  103. package/dist/labels/index.d.ts.map +0 -1
  104. package/dist/labels/index.js +0 -4
  105. package/dist/labels/index.js.map +0 -1
  106. package/dist/labels/labels.d.ts +0 -5
  107. package/dist/labels/labels.d.ts.map +0 -1
  108. package/dist/labels/labels.js +0 -23
  109. package/dist/labels/labels.js.map +0 -1
  110. package/dist/relocate/args.d.ts +0 -16
  111. package/dist/relocate/args.d.ts.map +0 -1
  112. package/dist/relocate/args.js +0 -8
  113. package/dist/relocate/args.js.map +0 -1
  114. package/dist/relocate/cli.d.ts +0 -18
  115. package/dist/relocate/cli.d.ts.map +0 -1
  116. package/dist/relocate/cli.js +0 -30
  117. package/dist/relocate/cli.js.map +0 -1
  118. package/dist/relocate/relocate.d.ts +0 -5
  119. package/dist/relocate/relocate.d.ts.map +0 -1
  120. package/dist/relocate/relocate.js +0 -38
  121. package/dist/relocate/relocate.js.map +0 -1
  122. package/dist/scale/args.d.ts +0 -22
  123. package/dist/scale/args.d.ts.map +0 -1
  124. package/dist/scale/args.js +0 -10
  125. package/dist/scale/args.js.map +0 -1
  126. package/dist/scale/cli.d.ts +0 -22
  127. package/dist/scale/cli.d.ts.map +0 -1
  128. package/dist/scale/cli.js +0 -39
  129. package/dist/scale/cli.js.map +0 -1
  130. package/dist/scale/index.d.ts +0 -4
  131. package/dist/scale/index.d.ts.map +0 -1
  132. package/dist/scale/index.js +0 -4
  133. package/dist/scale/index.js.map +0 -1
  134. package/dist/scale/scale.d.ts +0 -5
  135. package/dist/scale/scale.d.ts.map +0 -1
  136. package/dist/scale/scale.js +0 -65
  137. package/dist/scale/scale.js.map +0 -1
  138. package/src/cli.ts +0 -50
  139. package/src/flatten/args.ts +0 -11
  140. package/src/flatten/cli.ts +0 -33
  141. package/src/flatten/flatten.ts +0 -77
  142. package/src/flatten/index.ts +0 -3
  143. package/src/generate/args.ts +0 -18
  144. package/src/generate/cli.ts +0 -65
  145. package/src/generate/distinct/args.ts +0 -13
  146. package/src/generate/distinct/cli.ts +0 -34
  147. package/src/generate/distinct/dummy.ts +0 -35
  148. package/src/generate/distinct/generate.ts +0 -238
  149. package/src/generate/distinct/index.ts +0 -3
  150. package/src/generate/index.ts +0 -4
  151. package/src/generate/union/args.ts +0 -14
  152. package/src/generate/union/cli.ts +0 -38
  153. package/src/generate/union/generate.ts +0 -210
  154. package/src/generate/union/index.ts +0 -3
  155. package/src/generate/util.ts +0 -61
  156. package/src/get/args.ts +0 -9
  157. package/src/get/cli.ts +0 -21
  158. package/src/get/get.ts +0 -56
  159. package/src/get/index.ts +0 -3
  160. package/src/index.ts +0 -14
  161. package/src/labels/args.ts +0 -9
  162. package/src/labels/cli.ts +0 -21
  163. package/src/labels/index.ts +0 -3
  164. package/src/labels/labels.ts +0 -27
  165. package/src/relocate/args.ts +0 -11
  166. package/src/relocate/cli.ts +0 -32
  167. package/src/relocate/relocate.ts +0 -38
  168. package/src/scale/args.ts +0 -13
  169. package/src/scale/cli.ts +0 -43
  170. package/src/scale/index.ts +0 -3
  171. package/src/scale/scale.ts +0 -79
  172. package/tsconfig.json +0 -17
  173. 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
@@ -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"}
@@ -1,4 +0,0 @@
1
- export * from './scale.js';
2
- export * from './cli.js';
3
- export * from './args.js';
4
- //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -1,4 +0,0 @@
1
- export * from './scale.js';
2
- export * from './cli.js';
3
- export * from './args.js';
4
- //# sourceMappingURL=index.js.map
@@ -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"}
@@ -1,5 +0,0 @@
1
- import { Args } from './args.js';
2
- import { Logger } from '@prosopo/common';
3
- declare const _default: (args: Args, logger?: Logger) => Promise<void>;
4
- export default _default;
5
- //# sourceMappingURL=scale.d.ts.map
@@ -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"}
@@ -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
@@ -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
- }
@@ -1,11 +0,0 @@
1
- // Args for generating a dataset
2
-
3
- import { z } from 'zod'
4
-
5
- export const argsSchema = z.object({
6
- data: z.string(),
7
- out: z.string(),
8
- overwrite: z.boolean().optional(),
9
- })
10
-
11
- export type Args = z.infer<typeof argsSchema>
@@ -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
- }
@@ -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
- }
@@ -1,3 +0,0 @@
1
- export * from './flatten.js'
2
- export * from './cli.js'
3
- export * from './args.js'
@@ -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>
@@ -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)