From b0d664ccb2448ac663ee500a47ba613e932d0e49 Mon Sep 17 00:00:00 2001 From: Rose Judge Date: Wed, 1 May 2024 13:49:14 -0700 Subject: [PATCH 01/11] Add general software profile example This commit adds the software profile example drawio file and screenshot of the drawio diagram. The hope is that other profiles will build on top of this core example and we can generate SPDX docs for these examples to make adopting 3.0 easier. Signed-off-by: Rose Judge --- software/README.md | 2 + software/example13/README.md | 7 + software/example13/example-13.png | Bin 0 -> 111435 bytes .../example13/spdx-3.0/example-13-spdx-3.json | 153 ++++ software/example13/spdx-3.0/example-13.drawio | 845 ++++++++++++++++++ 5 files changed, 1007 insertions(+) create mode 100644 software/example13/README.md create mode 100644 software/example13/example-13.png create mode 100644 software/example13/spdx-3.0/example-13-spdx-3.json create mode 100644 software/example13/spdx-3.0/example-13.drawio diff --git a/software/README.md b/software/README.md index 45ee36b..baa86f1 100644 --- a/software/README.md +++ b/software/README.md @@ -30,4 +30,6 @@ Each directory contains build metadata which is used to create the build artifac | 9 | 2 Java files | generated from Gradle | 1 document |a copy of the [App-BOM-ination SPDX example](https://github.com/yevster/App-BOM-ination) contributed by @yevster for the SPDX spec version 2.0 docfest | | 10 | 1 Python file | python package | 1 document | packaged using the [instructions from python.org](https://packaging.python.org/en/latest/tutorials/packaging-projects/) | | 11 | 1 Rust file | compiled with Cargo | 1 document | SBOM describing both source and artifact, related with GENERATED_FROM | +| 12 | 1 Ruby library | built using `bundle` | 1 document | SBOM describing Ruby library packaged in a gem | +| 13 | Bundled app with a package and container | No compiling - hypothetical example | Documents in progress | SBOM describing a hypothetical "Acme Aplication" | diff --git a/software/example13/README.md b/software/example13/README.md new file mode 100644 index 0000000..26acfa5 --- /dev/null +++ b/software/example13/README.md @@ -0,0 +1,7 @@ +# Example 13 + +## Description + +This is a hypothetical example of a "simple" piece of software, Acme Application version 1.3. This example shows what an SPDX-3.0 document looks like for said Acme Application. The idea for this example is that other profiles will be able to build on top of this and demonstrate how all the profiles can work in harmony. + +In this specific example, Acme Application is a bundled and distributed piece of software. When Acme Application is run, it pulls in the `alpine:latest` container image which runs in parallel to the `npm-elliptic` library that is packaged and distributed within the Acme Application binary. Among others not depicted for the sake of simplicity, `openssl` is a package included in the `alpine:latest` container image. The example-13 SBOM describes the Acme Application top level piece of software. diff --git a/software/example13/example-13.png b/software/example13/example-13.png new file mode 100644 index 0000000000000000000000000000000000000000..02141e947f0f330151783d440a34523fde5efe73 GIT binary patch literal 111435 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f41acdbbfcbc622625bc7f6f68a41e62c86910fc Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Sat, 18 May 2024 02:29:27 +0100 Subject: [PATCH 02/11] Fix JSON errors + rename "hrt" to "htr" Fix these JSON errors: - Unexpected end of string. json(258) - Invalid characters in string. Control characters must be escaped. json(262) Changes: - Remove one Start of Heading (SOH) control character inside a string value - Inside string values, replace tab with space - Make all strings a one-liner (escaped new-line character inside a string value to `\n`) - JSON cannot have a multi-line value - Replace "hrt"/"simpleHRT" with "htr"/"simpleHTR" - Keep spelling the same as https://github.com/githubharald/SimpleHTR/ - Format document - Make it easier to review on GitHub - Rename "AI" directory to "ai", to keep it consistent with the value of profileConformance ("core", "software", "ai", "dataset") --- AI/simpleHRT-example.json | 1111 ----------------------------- ai/simpleHTR-example.json | 1395 +++++++++++++++++++++++++++++++++++++ 2 files changed, 1395 insertions(+), 1111 deletions(-) delete mode 100644 AI/simpleHRT-example.json create mode 100644 ai/simpleHTR-example.json diff --git a/AI/simpleHRT-example.json b/AI/simpleHRT-example.json deleted file mode 100644 index ce1d8ab..0000000 --- a/AI/simpleHRT-example.json +++ /dev/null @@ -1,1111 +0,0 @@ -{ - "@context": "https://spdx.org/rdf/3.0.0/spdx-context.jsonld", - "@graph" : [ - { - "type" : "Person", - "spdxId" : "https://my-first-aibom.com/gopi", - "creationInfo" : "_:creationinfo", - "name" : "Gopi Krishnan Rajbahadur", - "externalIdentifier" : [ - { - "type" : "ExternalIdentifier", - "externalIdentifierType" : "email", - "identifier" : "iamironman@616.com" - } - ] - }, - { - "type" : "creationInfo", - "@id" : "_:creationinfo", - "specVersion" : "3.0.0", - "createdBy" : [ - - "https://my-first-aibom.com/gopi" - ], - "created" : "2024-05-09T13:50:30Z" - }, - { - "type" : "creationInfo", - "@id" : "_:creationinfo_of_package", - "specversion" : "3.0.0", - "createdBy" : [ - "https://github.com/githubharald" - ], - "created" : "2023-08-07T00:00:00Z" - }, - { - "type" : "SpdxDocument", - "spdxId" : "https://my-first-aibom.com/document1", - "creationInfo" : "_:creationinfo", - "profileConformance" : [ - "core", - "software", - "ai", - "dataset" - ], - "rootElement" : [ - "https://my-first-aibom.com/BOM1" - ] - }, - - { - "type" : "software_package", - "spdxId" : "https://my-first-aibom.com/SimpleHTR", - "creationinfo" : "_:creationinfo_of_package", - "name" : "simpleHRT", - "software_downloadLocation" : "https://github.com/githubharald/SimpleHTR/tree/master", - "originatedBy" : [ - "https://github.com/githubharald" - ] - - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/src/main", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/src/main.py", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "executable", - "software_additionalPurpose": [ - "source" - ], - "comment" : "This file is the main entry point for execution of the Handwriting recognition application. ", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/src/create_lmdb", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/src/create_lmdb.py", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "executable", - "software_additionalPurpose": [ - "source" - ], - "comment" : "This file is to store images into lmdb as pickled grayscale images", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/src/dataloader_iam", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/src/dataloader_iam.py", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "executable", - "software_additionalPurpose": [ - "source" - ], - "comment" : "Loads data which corresponds to IAM format", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/src/model", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/src/model.py", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "source", "executable" - ], - "comment" : "Source code for the AI model that is used in this application", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/src/preprocessor", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/src/preprocessor.py", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "source", - "software_additionalPurpose": [ - "executable" - ], - "comment" : "Source code for preprocessing the data that is used for training and testing the model", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/src", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/src", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "source", - "comment" : "This directory contains all the source code files that is required for SimpleHRT application", - "software_FileKind" : "directory", - }, - { - "type" : "Relationship", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/src- contains", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "contains", - "from" : "https://github.com/githubharald/SimpleHTR/tree/master/src", - "to" : [ - "https://github.com/githubharald/SimpleHTR/tree/master/src/main", - "https://github.com/githubharald/SimpleHTR/tree/master/src/create_lmdb", - "https://github.com/githubharald/SimpleHTR/tree/master/src/dataloader_iam", - "https://github.com/githubharald/SimpleHTR/tree/master/src/model", - "https://github.com/githubharald/SimpleHTR/tree/master/src/preprocessor" - ] - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/doc", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/doc", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "documentation", - "comment" : "This directory contains several images required for documentation", - "software_FileKind" : "directory" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/doc/decoder_comparision", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/doc/decoder_comparision.png", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "documentation", - "software_additionalPurpose": [ - "file" - ], - "comment" : "An image that shows documentation related information for SimpleHRT options", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/doc/graphics", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/doc/graphics.svg", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "documentation", - "software_additionalPurpose": [ - "file" - ], - "comment" : "An image that shows documentation related information for SimpleHRT options", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/doc/hrt", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/doc/hrt.png", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "documentation", - "software_additionalPurpose": [ - "file" - ], - "comment" : "An image that shows documentation related information for SimpleHRT options", - "software_FileKind" : "file" - }, - { - "type" : "Relationship", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/doc-contains", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "contains", - "from" : "https://github.com/githubharald/SimpleHTR/tree/master/doc", - "to" : [ - "https://github.com/githubharald/SimpleHTR/tree/master/doc/decoder_comparision", - "https://github.com/githubharald/SimpleHTR/tree/master/doc/graphics", - "https://github.com/githubharald/SimpleHTR/tree/master/doc/hrt" - ] - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "library" - ], - "comment" : "This directory contains several images required for documentation", - "software_FileKind" : "directory" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/.gitignore", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/.gitignore", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "other", - "comment" : "The gitignore file for the directory", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/wordCharList", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/wordCharList.txt", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "configuration", - "software_additionalPurpose": [ - "file" - ], - "comment" : "Configuration/parameter file for the beam search decoder of the model", - "software_FileKind" : "file" - }, - { - "type" : "software_package", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model", - "creationinfo" : "_:creationinfo_of_package", - "name" : "word-model", - "software_downloadLocation" : "https://www.dropbox.com/s/7xwkcilho10rthn/word-model.zip?dl=1", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "archive" - ], - "description" : "The simpleHRT application uses two AI models which is distributed as a Zip file. This model is a word -level handwriting recognition model", - "comment" : "This file is not present at the source repo in VCS, but the users of the application are required to download it from the specified download location and present make it a part of the ./model/ directory" - - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/charList", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/word-model/CharList.txt", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "file", "configuration" - ], - "comment" : "Configuration/parameter file for the beam search decoder of the model", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/checkpoint", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/word-model/checkpoint", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "data", "file" - ], - "comment" : "Saved checkpoint of the model", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.data-00000-of-00001", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/word-model/snapshot-33.data-00000-of-00001", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "data", "file" - ], - "comment" : "Actual values of all variables that make up the word level handwriting recognition AI model", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.index", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/word-model/snapshot-33.index", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "data", "file" - ], - "comment" : "The name and shape of all the variables that make up the word level handwriting recognition AI model thier actual data is stored in /model/word-model/snapshot-33.index", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.meta", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/word-model/snapshot-33.meta", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "data", "file" - ], - "comment" : "Its a file storing all the information required to restore a training or information process including the graph that describes the data flow and additional annotations that describes the variables, input pipelines and other relevant information", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/summary.json", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/word-model/summary.json", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "evidence", - "software_additionalPurpose": [ - "data", "file" - ], - "comment" : "Records the character level error rates of each letter in a json format", - "software_FileKind" : "file" - }, - { - "type" : "Relationship", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model-contains", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "contains", - "from" : "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model", - "to" : [ - "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/charList", - "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/checkpoint", - "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.data-00000-of-00001", - "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.index", - "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.meta", - "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/summary.json" - ] - }, - { - "type" : "software_package", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model", - "creationinfo" : "_:creationinfo_of_package", - "name" : "line-model", - "software_downloadLocation" : "https://www.dropbox.com/s/7xwkcilho10rthn/line-model.zip?dl=1", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "archive" - ], - "description" : "The simpleHRT application uses two AI models which is distributed as a Zip file. This model is a line-level handwriting recognition model", - "comment" : "This file is not present at the source repo in VCS, but the users of the application are required to download it from the specified download location and present make it a part of the ./model/ directory" - - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/charList", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/line-model/CharList.txt", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "file", "configuration" - ], - "comment" : "Configuration/parameter file for the beam search decoder of the model", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/checkpoint", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/line-model/checkpoint", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "data", "file" - ], - "comment" : "Saved checkpoint of the model", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.data-00000-of-00001", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/line-model/snapshot-13.data-00000-of-00001", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "data", "file" - ], - "comment" : "Actual values of all variables that make up the line level handwriting recognition AI model", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.index", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/line-model/snapshot-13.index", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "data", "file" - ], - "comment" : "The name and shape of all the variables that make up the line level handwriting recognition AI model thier actual data is stored in /model/line-model/snapshot-13.index", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.meta", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/line-model/snapshot-13.meta", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "model", - "software_additionalPurpose": [ - "data", "file" - ], - "comment" : "Its a file storing all the information required to restore a training or information process including the graph that describes the data flow and additional annotations that describes the variables, input pipelines and other relevant information", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/summary.json", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/model/line-model/summary.json", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "evidence", - "software_additionalPurpose": [ - "data", "file" - ], - "comment" : "Records the character level error rates of each letter in a json format", - "software_FileKind" : "file" - }, - { - "type" : "Relationship", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model-contains", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "contains", - "from" : "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model", - "to" : [ - "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/charList", - "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/checkpoint", - "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.data-00000-of-00001", - "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.index", - "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.meta", - "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/summary.json" - ] - }, - { - "type" : "Relationship", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/model-contains", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "contains", - "from" : "https://github.com/githubharald/SimpleHTR/tree/master/model", - "to" : [ - "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model", - "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model", - "https://github.com/githubharald/SimpleHTR/tree/master/model/wordCharList", - "https://github.com/githubharald/SimpleHTR/tree/master/model/.gitignore" - ] - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/data", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/data", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "data", - "comment" : "This directory contains all the data and examples required to train the simpleHRT AI model", - "software_FileKind" : "directory" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/data/corpus", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/data/corpus.txt", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "data", - "software_additionalPurpose": [ - "file" - ], - "comment" : "The data corpus extracted from IAM dataset and this data is used to train the underlying SimpleHRT AI model", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/data/line", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/data/line.png", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "data", - "software_additionalPurpose": [ - "file" - ], - "comment" : "An example image to test the model's line level character recognition capability", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/data/word", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/data/word.png", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "data", - "software_additionalPurpose": [ - "file" - ], - "comment" : "An example image to test the model's word level character recognition capability", - "software_FileKind" : "file" - }, - { - "type" : "Relationship", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/data-contains", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "contains", - "from" : "https://github.com/githubharald/SimpleHTR/tree/master/data", - "to" : [ - "https://github.com/githubharald/SimpleHTR/tree/master/data/corpus", - "https://github.com/githubharald/SimpleHTR/tree/master/data/line", - "https://github.com/githubharald/SimpleHTR/tree/master/data/word" - ] - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/.gitignore", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/master/.gitignore", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "other", - "comment" : "The git ignore file for the directory", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/LICENSE", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/master/LICENSE.md", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "documentation", - "software_additionalPurpose": [ - "file" - ], - "comment" : "License of the software", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/README", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/master/README.md", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "documentation", - "software_additionalPurpose": [ - "file" - ], - "comment" : "The overall documentation and getting started of the document", - "software_FileKind" : "file" - }, - { - "type" : "software_File", - "spdxId" : "https://github.com/githubharald/SimpleHTR/tree/master/requirements", - "creationinfo" : "_:creationinfo_of_package", - "name" : "/master/requirements.txt", - "originatedBy" : [ - "https://github.com/githubharald" - ], - "software_primaryPurpose" : "requirements", - "software_additionalPurpose": [ - "file" - ], - "comment" : "Lists the external package dependencies that are required to be satisfied for the application to execute", - "software_FileKind" : "file" - }, - { - "type" : "Relationship", - "spdxId" : "https://my-first-aibom.com/SimpleHTR-contains", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "contains", - "from" : "https://my-first-aibom.com/SimpleHTR", - "to" : [ - "https://github.com/githubharald/SimpleHTR/tree/master/src", - "https://github.com/githubharald/SimpleHTR/tree/master/doc", - "https://github.com/githubharald/SimpleHTR/tree/master/model", - "https://github.com/githubharald/SimpleHTR/tree/master/data", - "https://github.com/githubharald/SimpleHTR/tree/master/.gitignore", - "https://github.com/githubharald/SimpleHTR/tree/master/LICENSE", - "https://github.com/githubharald/SimpleHTR/tree/master/README", - "https://github.com/githubharald/SimpleHTR/tree/master/requirements" - ] - }, - { - "type" : "software_package", - "spdxId" : "https://pypi.org/project/editdistance/0.5.2/", - "creationinfo" : "_:creationinfo_of_editdistance", - "name" : "editdistance", - "software_downloadLocation" : "https://pypi.org/project/editdistance/0.5.2/", - "software_homePage" : "https://github.com/roy-ht/editdistance", - "software_packageVersion" : "0.5.2", - "originatedBy" : [ - "https://pypi.org/user/aflc/" - ], - "software_primaryPurpose" : "library", - - "description" : "This library simply implements Levenshtein distance with C++ and Cython." - - - }, - { - "type" : "creationInfoaz", - "@id" : "_:creationinazfo_of_editdistance", - "specversion" : "3.0.0", - "createdBy" : [ - "https://azpypi.org/user/aflc/" - ], - "created" : "2018-09-17T0az0:00:00Z" - }, - { - "type" : "software_pacazkage", - "spdxId" : "https://pypiaz.org/project/lmdb/1.0.0/", - "creationinfo" : "_:creationinazfo_of_lmdb", - "name" : "lmdb", - "software_downloadLocation" : "https://pypi.org/project/lmdb/1.0.0/", - "software_homePage" : "https://github.com/jnwatson/py-lmdb/", - "software_packageVersion" : "1.0.0", - "originatedBy" : [ - "https://pypi.org/user/dw/", - "https://pypi.org/user/jnwatson/" - ], - "software_primaryPurpose" : "library", - - "description" : "This is a universal Python binding for the LMDB ‘Lightning’ Database." - - - }, - { - "type" : "creationInfo", - "@id" : "_:creationinfo_of_lmdb", - "specversion" : "3.0.0", - "createdBy" : [ - "https://pypi.org/user/dw/", - "https://pypi.org/user/jnwatson/" - ], - "created" : "2020-08-28T00:00:00Z" - }, - { - "type" : "software_package", - "spdxId" : "https://pypi.org/project/matplotlib/3.2.1/", - "creationinfo" : "_:creationinfo_of_matplotlib", - "name" : "lmdb", - "software_downloadLocation" : "https://pypi.org/project/matplotlib/3.2.1/", - "software_homePage" : "https://matplotlib.org/", - "software_packageVersion" : "3.2.1", - "originatedBy" : [ - "https://pypi.org/org/matplotlib/" - ], - "software_primaryPurpose" : "library", - - "description" : "Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python." - - - }, - { - "type" : "creationInfo", - "@id" : "_:creationinfo_of_creationinfo_of_numpy", - "specversion" : "3.0.0", - "createdBy" : [ - "https://pypi.org/org/matplotlib/" - ], - "created" : "2020-03-18T00:00:00Z" - }, - { - "type" : "software_package", - "spdxId" : "https://pypi.org/project/numpy/1.19.5/", - "creationinfo" : "_:creationinfo_of_matplotlib", - "name" : "numpy", - "software_downloadLocation" : "https://pypi.org/project/numpy/1.19.5/", - "software_homePage" : "https://numpy.org/", - "software_packageVersion" : "1.19.5", - "originatedBy" : [ - "https://pypi.org/user/charlesr.harris/", - "https://pypi.org/user/matthew.brett/", - "https://pypi.org/user/mattip/", - "https://pypi.org/user/rgommers/", - "https://pypi.org/user/teoliphant/" - ], - "software_primaryPurpose" : "library", - - "description" : "NumPy is the fundamental package for scientific computing with Python." - - - }, - { - "type" : "creationInfo", - "@id" : "_:creationinfo_of_numpy", - "specversion" : "3.0.0", - "createdBy" : [ - "https://pypi.org/user/charlesr.harris/", - "https://pypi.org/user/matthew.brett/", - "https://pypi.org/user/mattip/", - "https://pypi.org/user/rgommers/", - "https://pypi.org/user/teoliphant/" - ], - "created" : "2021-01-05T00:00:00Z" - }, - { - "type" : "software_package", - "spdxId" : "https://pypi.org/project/opencv-python/4.4.0.46/", - "creationinfo" : "_:creationinfo_of_opencv-python", - "name" : "opencv-python", - "software_downloadLocation" : "https://pypi.org/project/opencv-python/4.4.0.46/", - "software_homePage" : "https://github.com/opencv/opencv-python", - "software_packageVersion" : "4.4.0.46", - "originatedBy" : [ - "https://pypi.org/user/andrey.senyaev/", - "https://pypi.org/user/asmorkalov/", - "https://pypi.org/user/sergregory/", - "https://pypi.org/user/skvark/" - ], - "software_primaryPurpose" : "library", - - "description" : "Pre-built CPU-only OpenCV packages for Python." - - - }, - { - "type" : "creationInfo", - "@id" : "_:creationinfo_of_opencv-python", - "specversion" : "3.0.0", - "createdBy" : [ - "https://pypi.org/user/andrey.senyaev/", - "https://pypi.org/user/asmorkalov/", - "https://pypi.org/user/sergregory/", - "https://pypi.org/user/skvark/" - ], - "created" : "2020-11-02T00:00:00Z" - }, - { - "type" : "software_package", - "spdxId" : "https://pypi.org/project/path/15.0.0/", - "creationinfo" : "_:creationinfo_of_path", - "name" : "path", - "software_downloadLocation" : "https://pypi.org/project/path/15.0.0/", - "software_homePage" : "https://github.com/jaraco/path", - "software_packageVersion" : "15.0.0", - "originatedBy" : [ - "https://pypi.org/user/jaraco/" - ], - "software_primaryPurpose" : "library", - - "description" : "path (aka path pie, formerly path.py) implements path objects as first-class entities, allowing common operations on files to be invoked on those path objects directly" - - - }, - { - "type" : "creationInfo", - "@id" : "_:creationinfo_of_path", - "specversion" : "3.0.0", - "createdBy" : [ - "https://pypi.org/user/jaraco/" - ], - "created" : "2020-07-27T00:00:00Z" - }, - { - "type" : "software_package", - "spdxId" : "https://pypi.org/project/tensorflow/2.4.0/", - "creationinfo" : "_:creationinfo_of_tensorflow", - "name" : "tensorflow", - "software_downloadLocation" : "https://pypi.org/project/tensorflow/2.4.0/", - "software_homePage" : "https://www.tensorflow.org/", - "software_packageVersion" : "2.4.0", - "originatedBy" : [ - "https://pypi.org/user/jaraco/" - ], - "software_primaryPurpose" : "library", - - "description" : "TensorFlow is an open source software library for high performance numerical computation. Its flexible architecture allows easy deployment of computation across a variety of platforms (CPUs, GPUs, TPUs), and from desktops to clusters of servers to mobile and edge devices." - - - }, - { - "type" : "creationInfo", - "@id" : "_:creationinfo_of_tensorflow", - "specversion" : "3.0.0", - "createdBy" : [ - "https://pypi.org/user/mihaimaruseac/", - "https://pypi.org/user/rishikasinha/", - "https://pypi.org/user/rostam/", - "https://pypi.org/user/tf-nightly/" - ], - "created" : "2020-12-14T00:00:00Z" - }, - { - "type" : "Relationship", - "spdxId" : "https://my-first-aibom.com/SimpleHTR-depends-on", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "dependsOn", - "from" : "https://my-first-aibom.com/SimpleHTR", - "to" : [ - "https://pypi.org/project/tensorflow/2.4.0/", - "https://pypi.org/project/path/15.0.0/", - "https://pypi.org/project/opencv-python/4.4.0.46/", - "https://pypi.org/project/numpy/1.19.5/", - "https://pypi.org/project/matplotlib/3.2.1/", - "https://pypi.org/project/lmdb/1.0.0/", - "https://pypi.org/project/editdistance/0.5.2/" - ] - }, - { - "type" : "ai", - "spdxId" : "https://my-first-aibom.com/word-model", - "creationinfo" : ":_creationinfo", - "name" : "word-model", - "releaseTime" : "2023-09-07T00:00:00Z", - "suppliedBy" : "https://github.com/githubharald", - "software_downloadLocation" : "https://www.dropbox.com/s/mya8hw6jyzqm0a3/word-model.zip?dl=1", - "software_packageVersion" : "0.0", - "software_primaryPurpose" : "Word level handwriting recognition model", - "aipackage_autonomyType" : "no", - "aipackage_domain" : "image recognition, optical character recognition, handwriting recognition", - "aipackage_hyperparameters" : { - "cnn_kernel_vals" : "[5, 5, 3, 3, 3]", - "cnn_nfeature_vals" : "[1, 32, 64, 128, 128, 256]", - "cnn_stride_vals" : "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", - "cnn_pool_vals" : "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", - "cnn_num_layers" : "5", - "cnn_activation" : "relu", - "cnn_padding" : "SAME", - "cnn_pooling_layer_padding" : "VALID", - "cnn_kernal_stddev" : "0.1", - "cnn_conv2d_strides" : "(1,1,1,1)", - "rnn_num_layers" : "2", - "rnn_hidden_layers" : "256", - "rnn_LSTM_state_is_tuple" : "True", - "rnn_MultiRNNCell_state_is_tuple" : "True", - "rnn_filters_sttdev" : "0.1", - "rnn_output_rate" : "1", - "rnn_output_padding" : "SAME", - "loss" : "CTCLoss", - "Decode" : "CTCDecode", - "beam_serach_decoder_beam_width" : "50", - "beam_search_scoring_mode" : "Words", - "beam_search_smoothing" : "0.1", - "beam_search_encoding" : "UTF-8", - "optimizer" : "RMSprop" - - }, - "aipackage_informationAboutApplication" : "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset.", - "aipackage_informationAboutTraining" : "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long.", - "aipackage_metric" : { - "charErrorRates": [0.9838042269187987, 0.8809788654060067, 0.5203559510567297, 0.33205784204671857, 0.29054505005561737, 0.2439599555061179, 0.2181979977753059, 0.20262513904338153, 0.18593993325917688, 0.18740823136818688, 0.17259176863181314, 0.1646273637374861, 0.16347052280311458, 0.15830923248053394, 0.14696329254727475, 0.1495884315906563, 0.14197997775305896, 0.1457174638487208, 0.14189098998887653, 0.137174638487208, 0.13490545050055616, 0.13152391546162404, 0.13094549499443828, 0.1332146829810901, 0.13090100111234707, 0.1254282536151279, 0.12525027808676306, 0.12529477196885427, 0.12596218020022246, 0.12596218020022246, 0.12182424916573971, 0.12262513904338153, 0.11942157953281424, 0.12031145717463848, 0.11839822024471636, 0.11661846496106786, 0.12195773081201335, 0.11853170189099, 0.11608453837597331, 0.11719688542825361, 0.12048943270300334, 0.12088987764182425, 0.11599555061179088, 0.11781979977753058, 0.11506117908787541, 0.11546162402669632, 0.11692992213570634, 0.11790878754171301, 0.11612903225806452, 0.11412680756395996, 0.11688542825361513, 0.11101223581757508, 0.11568409343715239, 0.12017797552836484, 0.11350389321468297, 0.11541713014460511, 0.1181757508342603, 0.11875417130144605, 0.11105672969966629, 0.11350389321468297, 0.11234705228031146, 0.11688542825361513, 0.11461624026696329, 0.11154616240266964, 0.11359288097886541, 0.10914349276974417, 0.11283648498331479, 0.11332591768631813, 0.11394883203559511, 0.11492769744160178, 0.11119021134593993, 0.11145717463848721, 0.11265850945494994, 0.11804226918798665, 0.11092324805339265, 0.11648498331479422, 0.1135483870967742, 0.11599555061179088, 0.11154616240266964, 0.11279199110122358, 0.11421579532814238], "wordAccuracies": [0.061394380853277836, 0.10353798126951093, 0.2443635102323968, 0.3935137010058966, 0.449531737773153, 0.5071106486298994, 0.5483870967741935, 0.5613943808532779, 0.5872355185570586, 0.591918140825529, 0.6122095039889005, 0.6184530003468609, 0.620013874436351, 0.6304197016996185, 0.6546999653139092, 0.6481096080471731, 0.6625043357613597, 0.654873395768297, 0.6626777662157475, 0.6722164412070759, 0.6758584807492196, 0.6833159902878946, 0.6817551161984045, 0.6770724939299341, 0.6855705861949358, 0.701179327089837, 0.6945889698231009, 0.690426638917794, 0.6959764134582033, 0.6888657648283039, 0.7034339229968782, 0.7010058966354492, 0.7103711411723899, 0.7065556711758585, 0.7105445716267776, 0.7133194588969823, 0.7018730489073881, 0.7089836975372875, 0.7124523066250433, 0.7129725979882068, 0.7072493929934096, 0.7043010752688172, 0.7169614984391259, 0.7114117238987167, 0.7211238293444329, 0.719389524800555, 0.7134928893513701, 0.7131460284425946, 0.7171349288935137, 0.7221644120707597, 0.7166146375303504, 0.7273673257023934, 0.7190426638917794, 0.7124523066250433, 0.7271938952480056, 0.7238987166146376, 0.7167880679847382, 0.7070759625390218, 0.7278876170655567, 0.723551855705862, 0.7289281997918835, 0.7155740548040236, 0.7225112729795352, 0.723551855705862, 0.7263267429760666, 0.7348248352410683, 0.725979882067291, 0.7282344779743323, 0.7206035379812695, 0.7232049947970863, 0.7273673257023934, 0.7315296566077003, 0.7280610475199445, 0.711064862989941, 0.7337842525147416, 0.723551855705862, 0.7277141866111689, 0.7230315643426986, 0.7351716961498439, 0.7261533125216788, 0.7232049947970863] - }, - "aipackage_modelDataPreprocessing" : "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.", - "aipackage_safetyRiskAssesment" : "low", - "aipackage_typeOfModel" : "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" - - }, - { - "type" : "Relationship", - "spdxId" : "https://my-first-aibom.com/SimpleHTR-depends-on", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "dependsOn", - "from" : "https://my-first-aibom.com/SimpleHTR", - "to" : [ - "https://pypi.org/project/tensorflow/2.4.0/", - "https://pypi.org/project/path/15.0.0/", - "https://pypi.org/project/opencv-python/4.4.0.46/", - "https://pypi.org/project/numpy/1.19.5/", - "https://pypi.org/project/matplotlib/3.2.1/", - "https://pypi.org/project/lmdb/1.0.0/", - "https://pypi.org/project/editdistance/0.5.2/" - ] - }, - { - "type" : "ai", - "spdxId" : "https://my-first-aibom.com/line-model", - "creationinfo" : ":_creationinfo", - "name" : "line-model", - "releaseTime" : "2023-09-07T00:00:00Z", - "suppliedBy" : "https://github.com/githubharald", - "software_downloadLocation" : "https://www.dropbox.com/s/mya8hw6jyzqm0a3/word-model.zip?dl=1", - "software_packageVersion" : "0.0", - "software_primaryPurpose" : "Line level handwriting recognition model", - "aipackage_autonomyType" : "no", - "aipackage_domain" : "image recognition, optical character recognition, handwriting recognition", - "aipackage_hyperparameters" : { - "cnn_kernel_vals" : "[5, 5, 3, 3, 3]", - "cnn_nfeature_vals" : "[1, 32, 64, 128, 128, 256]", - "cnn_stride_vals" : "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", - "cnn_pool_vals" : "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", - "cnn_num_layers" : "5", - "cnn_activation" : "relu", - "cnn_padding" : "SAME", - "cnn_pooling_layer_padding" : "VALID", - "cnn_kernal_stddev" : "0.1", - "cnn_conv2d_strides" : "(1,1,1,1)", - "rnn_num_layers" : "2", - "rnn_hidden_layers" : "256", - "rnn_LSTM_state_is_tuple" : "True", - "rnn_MultiRNNCell_state_is_tuple" : "True", - "rnn_filters_sttdev" : "0.1", - "rnn_output_rate" : "1", - "rnn_output_padding" : "SAME", - "loss" : "CTCLoss", - "Decode" : "CTCDecode", - "beam_serach_decoder_beam_width" : "50", - "beam_search_scoring_mode" : "Words", - "beam_search_smoothing" : "0.1", - "beam_search_encoding" : "UTF-8", - "optimizer" : "RMSprop" - - }, - "aipackage_informationAboutApplication": "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset.", - "aipackage_informationAboutTraining" : "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long.", - "aipackage_metric" : { - "charErrorRates": [0.9838042269187987, 0.8809788654060067, 0.5203559510567297, 0.33205784204671857, 0.29054505005561737, 0.2439599555061179, 0.2181979977753059, 0.20262513904338153, 0.18593993325917688, 0.18740823136818688, 0.17259176863181314, 0.1646273637374861, 0.16347052280311458, 0.15830923248053394, 0.14696329254727475, 0.1495884315906563, 0.14197997775305896, 0.1457174638487208, 0.14189098998887653, 0.137174638487208, 0.13490545050055616, 0.13152391546162404, 0.13094549499443828, 0.1332146829810901, 0.13090100111234707, 0.1254282536151279, 0.12525027808676306, 0.12529477196885427, 0.12596218020022246, 0.12596218020022246, 0.12182424916573971, 0.12262513904338153, 0.11942157953281424, 0.12031145717463848, 0.11839822024471636, 0.11661846496106786, 0.12195773081201335, 0.11853170189099, 0.11608453837597331, 0.11719688542825361, 0.12048943270300334, 0.12088987764182425, 0.11599555061179088, 0.11781979977753058, 0.11506117908787541, 0.11546162402669632, 0.11692992213570634, 0.11790878754171301, 0.11612903225806452, 0.11412680756395996, 0.11688542825361513, 0.11101223581757508, 0.11568409343715239, 0.12017797552836484, 0.11350389321468297, 0.11541713014460511, 0.1181757508342603, 0.11875417130144605, 0.11105672969966629, 0.11350389321468297, 0.11234705228031146, 0.11688542825361513, 0.11461624026696329, 0.11154616240266964, 0.11359288097886541, 0.10914349276974417, 0.11283648498331479, 0.11332591768631813, 0.11394883203559511, 0.11492769744160178, 0.11119021134593993, 0.11145717463848721, 0.11265850945494994, 0.11804226918798665, 0.11092324805339265, 0.11648498331479422, 0.1135483870967742, 0.11599555061179088, 0.11154616240266964, 0.11279199110122358, 0.11421579532814238], "wordAccuracies": [0.061394380853277836, 0.10353798126951093, 0.2443635102323968, 0.3935137010058966, 0.449531737773153, 0.5071106486298994, 0.5483870967741935, 0.5613943808532779, 0.5872355185570586, 0.591918140825529, 0.6122095039889005, 0.6184530003468609, 0.620013874436351, 0.6304197016996185, 0.6546999653139092, 0.6481096080471731, 0.6625043357613597, 0.654873395768297, 0.6626777662157475, 0.6722164412070759, 0.6758584807492196, 0.6833159902878946, 0.6817551161984045, 0.6770724939299341, 0.6855705861949358, 0.701179327089837, 0.6945889698231009, 0.690426638917794, 0.6959764134582033, 0.6888657648283039, 0.7034339229968782, 0.7010058966354492, 0.7103711411723899, 0.7065556711758585, 0.7105445716267776, 0.7133194588969823, 0.7018730489073881, 0.7089836975372875, 0.7124523066250433, 0.7129725979882068, 0.7072493929934096, 0.7043010752688172, 0.7169614984391259, 0.7114117238987167, 0.7211238293444329, 0.719389524800555, 0.7134928893513701, 0.7131460284425946, 0.7171349288935137, 0.7221644120707597, 0.7166146375303504, 0.7273673257023934, 0.7190426638917794, 0.7124523066250433, 0.7271938952480056, 0.7238987166146376, 0.7167880679847382, 0.7070759625390218, 0.7278876170655567, 0.723551855705862, 0.7289281997918835, 0.7155740548040236, 0.7225112729795352, 0.723551855705862, 0.7263267429760666, 0.7348248352410683, 0.725979882067291, 0.7282344779743323, 0.7206035379812695, 0.7232049947970863, 0.7273673257023934, 0.7315296566077003, 0.7280610475199445, 0.711064862989941, 0.7337842525147416, 0.723551855705862, 0.7277141866111689, 0.7230315643426986, 0.7351716961498439, 0.7261533125216788, 0.7232049947970863] - }, - "aipackage_modelDataPreprocessing" : "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.", - "aipackage_safetyRiskAssesment" : "low", - "aipackage_typeOfModel" : "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" - - }, - { - "type" : "dataset", - "spdxId" : "https://my-first-aibom.com/IAMdataset", - "creationinfo" : ":_creationinfo", - "name" : "IAMdataset", - "builtTime" : "1999-09-20T00:00:00Z", - "originatedBy" : "U. Marti and H. Bunke.", - "releaseTime" : "NoAssertion", - "software_downloadLocation" : "https://fki.tic.heia-fr.ch/databases/iam-handwriting-database", - "software_primaryPurpose" : "The IAM Handwriting Database contains forms of handwritten English text which can be used to train and test handwritten text recognizers and to perform writer identification and verification experiments.", - "dataset_confidentialityLevel" : "clear", - "dataset_datasetCollectionProcess" : "It was decided to use the Lancaster - Oslo/Bergen corpus (LOB), a collection of 500 English texts, each consisting of about 2,000 words as a basis of our database. The LOB corpus is the British pendant to the Brown corpus, which has a structure similar to that of the - LOB corpus. Then, we split the texts in the corpus into fragments of about three to six sentences with at least 50 words each. These text fragments were printed onto forms and we asked a number of persons to write the text printed on the forms by hand. We extracted the sentences of each text fragment from the corpus and generated a LATEX document containing the text and the structure of the form. The formatted documents were printed by a HP Laserjet 4000TN at a resolution of 600 dpi. Each form consists of four parts. The first part comprises the title “Sentence Database” and a number assigned to the text. The first character of this number shows which category the text belongs to, - and the following two digits identify the text number. For example in Fig. 1, M01 indicates that the text on the form is extracted from text “01“ in the text category “Science fiction“. The next three digits show with which sentence the text starts. In the second part of the form, the text the individual persons were asked to write is printed. The third part of the form is a blank zone where the writers have to put in their handwriting. In the last part, the writer can voluntarily enter his or her name. All four parts are separated from each other by a horizontal line. This makes it easy to automatically extract the individual parts from a form. It was decided that the writers had to use rulers. These guiding lines, with 1.5 cm space between them, were printed on a separate sheet of paper which - was put under the form. The writers were asked to use their every day writing in order to get the most natural and unconstrained way of writing. We also told the writers to stop writing, if there was not enough space left on the form to write the whole text. No restrictions were imposed on the writing instrument. Hence, text produced with a number of different writing instruments is included in the database (ballpoint pens, ink pens, and pencils, all with various stroke widths). The filled forms were scanned with a HP-Scanjet 6100 connected to a Sun Ultra 1. The software used to scan the data is xvscan version 1.62. It is an add-on to the wellknown image tool xv. The resolution was set to 300 dpi at a grey-level resolution of 8 bits. The images were saved in TIFF-format with LZW compression. Each form was - completely scanned, including the printed and handwritten text. To create the label files, the text of a form was copied twice into the label file, once for the machine-printed text and once for the handwritten text. Then the line feeds were filled in manually. In some cases corrections were necessary, because the handwritten text did not exactly correspond to the printed text. These corrections include deletions, insertions, and changes of words so as to make the text in the label file of each form identical to the handwritten text. All corrections were done manually, but they did not take a long. Typically, only approximately 30s of manual processing time for the generation of the label files and the correction of errors were spent - on each document, which is less than the time required for scanning.", - "dataset_dataPreprocessing" : " - First, the skew of the document is corrected. Then the positions of the three horizontal lines are computed by a projection method. Given this positional information the handwriting is extracted. Next, the handwritten text is segmented into text lines. Finally, each text line - is segmented into individual words. To find the first horizontal line, the form is scanned top-down in the middle of the image. The first black pixel found is assumed to belong to the first horizontal line. - By following the line to the left and to the right, the end points of the line are found. Once the left and right end of the first horizontal line has been determined, its angle is used to correct the skew of the whole document by a rotation. Then, the form is segmented into its four main parts (see Sect. 2). This is a relatively easy task because the four parts are separated from each other by very long - horizontal lines, which are easy to detect by horizontal projection. To make the projection algorithm more robust, not only the horizontal projection profile is considered, but also the value of the longest horizontal black run in each row. A horizontal line separating two parts from each other is characterized by a value in the horizontal grey-value projection histogram greater than a threshold t and a value of the longest horizontal black run greater than a threshold t -  (see Fig. 5). After all three horizontal lines have been found, we are able to extract the part of the form that contains the handwriting. Over the whole database the handwritten zone was automatically extracted by means of this procedure without any - error. The next step in preprocessing is to cut the text into - individual lines. For this purpose a histogram of the horizontal black/white transitions is used. In this histogram we look for local minima. If the value at a local minimum is zero, a cut has been found that does not touch any word. If the value is greater than zero, we have found a position where we can horizontally cut the image with a minimal number of intersections with strokes belonging to words of the previous or the following text line. To handle intersections of this kind a method based on the center of gravity is used. If the center of gravity of the connected component that is cut is in the range of the - previous (the following) text line, the connected component is assumed to belong to that text line. If the center of gravity is near the cutting line, the component is cut into two parts, one belonging to the previous and one to the following text line. With this method we could extract almost all text lines correctly. Only in about 1.2% (113 of 9157) of the lines did errors occur. The 113 segmentation errors can be classified into acceptable and serious errors. An acceptable error is defined as one where only single punctuation marks or i-dots are assigned to the wrong line, but no cut component. By contrast, parts of letters or words assigned to the wrong text line are considered serious errors. There were 52 acceptable and 61serious errors out of a total of 113. The correction of these errors is left to - the user of the database. That is, no attempts were made - to include any manual corrections of the segmentation errors in the database. To segment the text lines into single words, a method - similar to those described in the paper 'External word segmentation of off-line handwritten text lines.'' and the paper 'Gap metrics for - word separation in handwritten lines' is used. Because a word can be split into several components, the goal is to cluster the connected components of a text line image into words. First, the convex hull and the center of gravity of each connected component in a line of text is - computed. Then for each pair of connected components, c1 and c2, the straight line segment s that connects the center of gravity of c1 with the center of gravity of c2 is considered. The distance d between the two points where s intersects the convex hull of c1 and c2 is determined. This distance d is assigned to s as a weight. A graphical illustration is shown in Fig. 7. By means of this procedure, a completely connected and weighted graph is obtained, where each node corresponds to a connected component in the image and the weight on an edge represents the distance between two connected components. Given such a graph, its minimum spanning tree is computed. Finally, all distances that occur as weights on the edges of the minimum spanning tree are clustered into two groups, namely, intra-word and inter-word distance. For this purpose, Otsu’s thresholding algorithm is used, which yields a threshold t. Any two connected components, c1 - and c2, that are linked by an edge in the minimum spanning tree with a weight d ≤ t are considered to be part of the same word. By contrast, if the weight d is larger than t, c1 and c2 are regarded as belonging to two different words. Applied on 541text lines with 3,899 words, - a correct word extraction of 94.92%, with 3.62% of the words over- and 1.46% undersegmented, was achieved. The primary goal of the preprocessing and segmentation procedures described in this section is to support the labeling of the text. However, these procedures can be - integrated in any recognizer as well. All procedures have been implemented in C++ and can be compiled under Unix/Solaris and Linux. To actually run the procedures only the TIFF library for image read and write, but no other software utilities are needed. - ", - "dataset_datasetAvailability" : "registration", - "dataset_datasetSize" : "4620000000", - "dataset_datasetType" : "image", - "dataset_intendedUse" : "For line level or word level character recognition", - "dataset_sensor" : { - "printer" : " HP Laserjet 4000TN", - "scanner" : "HP-Scanjet 6100" - } - - - - }, - { - "type" : "Relationship", - "spdxId" : "https://my-first-aibom.com/word-model-trained-on", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "trainedOn", - "from" : "https://my-first-aibom.com/word-model", - "to" : [ - "https://my-first-aibom.com/IAMdataset" - ] - }, - { - "type" : "Relationship", - "spdxId" : "https://my-first-aibom.com/word-model-tested-on", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "testedOn", - "from" : "https://my-first-aibom.com/word-model", - "to" : [ - "https://my-first-aibom.com/IAMdataset" - ] - }, - { - "type" : "Relationship", - "spdxId" : "https://my-first-aibom.com/line-model-trained-on", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "trainedOn", - "from" : "https://my-first-aibom.com/line-model", - "to" : [ - "https://my-first-aibom.com/IAMdataset" - ] - }, - { - "type" : "Relationship", - "spdxId" : "https://my-first-aibom.com/line-model-tested-on", - "creationInfo" : "_:creationinfo_of_package", - "relationshipType" : "testedOn", - "from" : "https://my-first-aibom.com/line-model", - "to" : [ - "https://my-first-aibom.com/IAMdataset" - ] - }, - - - - { - "type" : "software_sbom", - "spdxId" : "https://my-first-aibom.com/BOM1", - "creationInfo" : "_:creationinfo", - "rootElement" : [ - "https://my-first-aibom.com/SimpleHTR" - ], - "element" : [ - "TO BE ADDED LATER" - ], - "software_sbomType" : [ - "analyzed" - ] - } - - ] -} diff --git a/ai/simpleHTR-example.json b/ai/simpleHTR-example.json new file mode 100644 index 0000000..c276f99 --- /dev/null +++ b/ai/simpleHTR-example.json @@ -0,0 +1,1395 @@ +{ + "@context": "https://spdx.org/rdf/3.0.0/spdx-context.jsonld", + "@graph": [ + { + "type": "Person", + "spdxId": "https://my-first-aibom.com/gopi", + "creationInfo": "_:creationinfo", + "name": "Gopi Krishnan Rajbahadur", + "externalIdentifier": [ + { + "type": "ExternalIdentifier", + "externalIdentifierType": "email", + "identifier": "iamironman@616.com" + } + ] + }, + { + "type": "creationInfo", + "@id": "_:creationinfo", + "specVersion": "3.0.0", + "createdBy": [ + "https://my-first-aibom.com/gopi" + ], + "created": "2024-05-09T13:50:30Z" + }, + { + "type": "creationInfo", + "@id": "_:creationinfo_of_package", + "specversion": "3.0.0", + "createdBy": [ + "https://github.com/githubharald" + ], + "created": "2023-08-07T00:00:00Z" + }, + { + "type": "SpdxDocument", + "spdxId": "https://my-first-aibom.com/document1", + "creationInfo": "_:creationinfo", + "profileConformance": [ + "core", + "software", + "ai", + "dataset" + ], + "rootElement": [ + "https://my-first-aibom.com/BOM1" + ] + }, + { + "type": "software_package", + "spdxId": "https://my-first-aibom.com/SimpleHTR", + "creationinfo": "_:creationinfo_of_package", + "name": "simpleHTR", + "software_downloadLocation": "https://github.com/githubharald/SimpleHTR/tree/master", + "originatedBy": [ + "https://github.com/githubharald" + ] + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src/main", + "creationinfo": "_:creationinfo_of_package", + "name": "/src/main.py", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "executable", + "software_additionalPurpose": [ + "source" + ], + "comment": "This file is the main entry point for execution of the Handwriting recognition application. ", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src/create_lmdb", + "creationinfo": "_:creationinfo_of_package", + "name": "/src/create_lmdb.py", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "executable", + "software_additionalPurpose": [ + "source" + ], + "comment": "This file is to store images into lmdb as pickled grayscale images", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src/dataloader_iam", + "creationinfo": "_:creationinfo_of_package", + "name": "/src/dataloader_iam.py", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "executable", + "software_additionalPurpose": [ + "source" + ], + "comment": "Loads data which corresponds to IAM format", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src/model", + "creationinfo": "_:creationinfo_of_package", + "name": "/src/model.py", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "source", + "executable" + ], + "comment": "Source code for the AI model that is used in this application", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src/preprocessor", + "creationinfo": "_:creationinfo_of_package", + "name": "/src/preprocessor.py", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "source", + "software_additionalPurpose": [ + "executable" + ], + "comment": "Source code for preprocessing the data that is used for training and testing the model", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src", + "creationinfo": "_:creationinfo_of_package", + "name": "/src", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "source", + "comment": "This directory contains all the source code files that is required for simpleHTR application", + "software_FileKind": "directory" + }, + { + "type": "Relationship", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src- contains", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "contains", + "from": "https://github.com/githubharald/SimpleHTR/tree/master/src", + "to": [ + "https://github.com/githubharald/SimpleHTR/tree/master/src/main", + "https://github.com/githubharald/SimpleHTR/tree/master/src/create_lmdb", + "https://github.com/githubharald/SimpleHTR/tree/master/src/dataloader_iam", + "https://github.com/githubharald/SimpleHTR/tree/master/src/model", + "https://github.com/githubharald/SimpleHTR/tree/master/src/preprocessor" + ] + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/doc", + "creationinfo": "_:creationinfo_of_package", + "name": "/doc", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "documentation", + "comment": "This directory contains several images required for documentation", + "software_FileKind": "directory" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/doc/decoder_comparision", + "creationinfo": "_:creationinfo_of_package", + "name": "/doc/decoder_comparision.png", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "documentation", + "software_additionalPurpose": [ + "file" + ], + "comment": "An image that shows documentation related information for simpleHTR options", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/doc/graphics", + "creationinfo": "_:creationinfo_of_package", + "name": "/doc/graphics.svg", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "documentation", + "software_additionalPurpose": [ + "file" + ], + "comment": "An image that shows documentation related information for simpleHTR options", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/doc/htr", + "creationinfo": "_:creationinfo_of_package", + "name": "/doc/htr.png", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "documentation", + "software_additionalPurpose": [ + "file" + ], + "comment": "An image that shows documentation related information for simpleHTR options", + "software_FileKind": "file" + }, + { + "type": "Relationship", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/doc-contains", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "contains", + "from": "https://github.com/githubharald/SimpleHTR/tree/master/doc", + "to": [ + "https://github.com/githubharald/SimpleHTR/tree/master/doc/decoder_comparision", + "https://github.com/githubharald/SimpleHTR/tree/master/doc/graphics", + "https://github.com/githubharald/SimpleHTR/tree/master/doc/htr" + ] + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model", + "creationinfo": "_:creationinfo_of_package", + "name": "/model", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "library" + ], + "comment": "This directory contains several images required for documentation", + "software_FileKind": "directory" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/.gitignore", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/.gitignore", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "other", + "comment": "The gitignore file for the directory", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/wordCharList", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/wordCharList.txt", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "configuration", + "software_additionalPurpose": [ + "file" + ], + "comment": "Configuration/parameter file for the beam search decoder of the model", + "software_FileKind": "file" + }, + { + "type": "software_package", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model", + "creationinfo": "_:creationinfo_of_package", + "name": "word-model", + "software_downloadLocation": "https://www.dropbox.com/s/7xwkcilho10rthn/word-model.zip?dl=1", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "archive" + ], + "description": "The simpleHTR application uses two AI models which is distributed as a Zip file. This model is a word -level handwriting recognition model", + "comment": "This file is not present at the source repo in VCS, but the users of the application are required to download it from the specified download location and present make it a part of the ./model/ directory" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/charList", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/word-model/CharList.txt", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "file", + "configuration" + ], + "comment": "Configuration/parameter file for the beam search decoder of the model", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/checkpoint", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/word-model/checkpoint", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "data", + "file" + ], + "comment": "Saved checkpoint of the model", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.data-00000-of-00001", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/word-model/snapshot-33.data-00000-of-00001", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "data", + "file" + ], + "comment": "Actual values of all variables that make up the word level handwriting recognition AI model", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.index", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/word-model/snapshot-33.index", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "data", + "file" + ], + "comment": "The name and shape of all the variables that make up the word level handwriting recognition AI model thier actual data is stored in /model/word-model/snapshot-33.index", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.meta", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/word-model/snapshot-33.meta", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "data", + "file" + ], + "comment": "Its a file storing all the information required to restore a training or information process including the graph that describes the data flow and additional annotations that describes the variables, input pipelines and other relevant information", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/summary.json", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/word-model/summary.json", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "evidence", + "software_additionalPurpose": [ + "data", + "file" + ], + "comment": "Records the character level error rates of each letter in a json format", + "software_FileKind": "file" + }, + { + "type": "Relationship", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model-contains", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "contains", + "from": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model", + "to": [ + "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/charList", + "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/checkpoint", + "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.data-00000-of-00001", + "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.index", + "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.meta", + "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/summary.json" + ] + }, + { + "type": "software_package", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model", + "creationinfo": "_:creationinfo_of_package", + "name": "line-model", + "software_downloadLocation": "https://www.dropbox.com/s/7xwkcilho10rthn/line-model.zip?dl=1", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "archive" + ], + "description": "The simpleHTR application uses two AI models which is distributed as a Zip file. This model is a line-level handwriting recognition model", + "comment": "This file is not present at the source repo in VCS, but the users of the application are required to download it from the specified download location and present make it a part of the ./model/ directory" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/charList", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/line-model/CharList.txt", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "file", + "configuration" + ], + "comment": "Configuration/parameter file for the beam search decoder of the model", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/checkpoint", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/line-model/checkpoint", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "data", + "file" + ], + "comment": "Saved checkpoint of the model", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.data-00000-of-00001", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/line-model/snapshot-13.data-00000-of-00001", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "data", + "file" + ], + "comment": "Actual values of all variables that make up the line level handwriting recognition AI model", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.index", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/line-model/snapshot-13.index", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "data", + "file" + ], + "comment": "The name and shape of all the variables that make up the line level handwriting recognition AI model thier actual data is stored in /model/line-model/snapshot-13.index", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.meta", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/line-model/snapshot-13.meta", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "model", + "software_additionalPurpose": [ + "data", + "file" + ], + "comment": "Its a file storing all the information required to restore a training or information process including the graph that describes the data flow and additional annotations that describes the variables, input pipelines and other relevant information", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/summary.json", + "creationinfo": "_:creationinfo_of_package", + "name": "/model/line-model/summary.json", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "evidence", + "software_additionalPurpose": [ + "data", + "file" + ], + "comment": "Records the character level error rates of each letter in a json format", + "software_FileKind": "file" + }, + { + "type": "Relationship", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model-contains", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "contains", + "from": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model", + "to": [ + "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/charList", + "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/checkpoint", + "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.data-00000-of-00001", + "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.index", + "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.meta", + "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/summary.json" + ] + }, + { + "type": "Relationship", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model-contains", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "contains", + "from": "https://github.com/githubharald/SimpleHTR/tree/master/model", + "to": [ + "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model", + "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model", + "https://github.com/githubharald/SimpleHTR/tree/master/model/wordCharList", + "https://github.com/githubharald/SimpleHTR/tree/master/model/.gitignore" + ] + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/data", + "creationinfo": "_:creationinfo_of_package", + "name": "/data", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "data", + "comment": "This directory contains all the data and examples required to train the simpleHTR AI model", + "software_FileKind": "directory" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/data/corpus", + "creationinfo": "_:creationinfo_of_package", + "name": "/data/corpus.txt", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "data", + "software_additionalPurpose": [ + "file" + ], + "comment": "The data corpus extracted from IAM dataset and this data is used to train the underlying simpleHTR AI model", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/data/line", + "creationinfo": "_:creationinfo_of_package", + "name": "/data/line.png", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "data", + "software_additionalPurpose": [ + "file" + ], + "comment": "An example image to test the model's line level character recognition capability", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/data/word", + "creationinfo": "_:creationinfo_of_package", + "name": "/data/word.png", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "data", + "software_additionalPurpose": [ + "file" + ], + "comment": "An example image to test the model's word level character recognition capability", + "software_FileKind": "file" + }, + { + "type": "Relationship", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/data-contains", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "contains", + "from": "https://github.com/githubharald/SimpleHTR/tree/master/data", + "to": [ + "https://github.com/githubharald/SimpleHTR/tree/master/data/corpus", + "https://github.com/githubharald/SimpleHTR/tree/master/data/line", + "https://github.com/githubharald/SimpleHTR/tree/master/data/word" + ] + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/.gitignore", + "creationinfo": "_:creationinfo_of_package", + "name": "/master/.gitignore", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "other", + "comment": "The git ignore file for the directory", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/LICENSE", + "creationinfo": "_:creationinfo_of_package", + "name": "/master/LICENSE.md", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "documentation", + "software_additionalPurpose": [ + "file" + ], + "comment": "License of the software", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/README", + "creationinfo": "_:creationinfo_of_package", + "name": "/master/README.md", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "documentation", + "software_additionalPurpose": [ + "file" + ], + "comment": "The overall documentation and getting started of the document", + "software_FileKind": "file" + }, + { + "type": "software_File", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/requirements", + "creationinfo": "_:creationinfo_of_package", + "name": "/master/requirements.txt", + "originatedBy": [ + "https://github.com/githubharald" + ], + "software_primaryPurpose": "requirements", + "software_additionalPurpose": [ + "file" + ], + "comment": "Lists the external package dependencies that are required to be satisfied for the application to execute", + "software_FileKind": "file" + }, + { + "type": "Relationship", + "spdxId": "https://my-first-aibom.com/SimpleHTR-contains", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "contains", + "from": "https://my-first-aibom.com/SimpleHTR", + "to": [ + "https://github.com/githubharald/SimpleHTR/tree/master/src", + "https://github.com/githubharald/SimpleHTR/tree/master/doc", + "https://github.com/githubharald/SimpleHTR/tree/master/model", + "https://github.com/githubharald/SimpleHTR/tree/master/data", + "https://github.com/githubharald/SimpleHTR/tree/master/.gitignore", + "https://github.com/githubharald/SimpleHTR/tree/master/LICENSE", + "https://github.com/githubharald/SimpleHTR/tree/master/README", + "https://github.com/githubharald/SimpleHTR/tree/master/requirements" + ] + }, + { + "type": "software_package", + "spdxId": "https://pypi.org/project/editdistance/0.5.2/", + "creationinfo": "_:creationinfo_of_editdistance", + "name": "editdistance", + "software_downloadLocation": "https://pypi.org/project/editdistance/0.5.2/", + "software_homePage": "https://github.com/roy-ht/editdistance", + "software_packageVersion": "0.5.2", + "originatedBy": [ + "https://pypi.org/user/aflc/" + ], + "software_primaryPurpose": "library", + "description": "This library simply implements Levenshtein distance with C++ and Cython." + }, + { + "type": "creationInfoaz", + "@id": "_:creationinazfo_of_editdistance", + "specversion": "3.0.0", + "createdBy": [ + "https://azpypi.org/user/aflc/" + ], + "created": "2018-09-17T0az0:00:00Z" + }, + { + "type": "software_pacazkage", + "spdxId": "https://pypiaz.org/project/lmdb/1.0.0/", + "creationinfo": "_:creationinazfo_of_lmdb", + "name": "lmdb", + "software_downloadLocation": "https://pypi.org/project/lmdb/1.0.0/", + "software_homePage": "https://github.com/jnwatson/py-lmdb/", + "software_packageVersion": "1.0.0", + "originatedBy": [ + "https://pypi.org/user/dw/", + "https://pypi.org/user/jnwatson/" + ], + "software_primaryPurpose": "library", + "description": "This is a universal Python binding for the LMDB ‘Lightning’ Database." + }, + { + "type": "creationInfo", + "@id": "_:creationinfo_of_lmdb", + "specversion": "3.0.0", + "createdBy": [ + "https://pypi.org/user/dw/", + "https://pypi.org/user/jnwatson/" + ], + "created": "2020-08-28T00:00:00Z" + }, + { + "type": "software_package", + "spdxId": "https://pypi.org/project/matplotlib/3.2.1/", + "creationinfo": "_:creationinfo_of_matplotlib", + "name": "lmdb", + "software_downloadLocation": "https://pypi.org/project/matplotlib/3.2.1/", + "software_homePage": "https://matplotlib.org/", + "software_packageVersion": "3.2.1", + "originatedBy": [ + "https://pypi.org/org/matplotlib/" + ], + "software_primaryPurpose": "library", + "description": "Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python." + }, + { + "type": "creationInfo", + "@id": "_:creationinfo_of_creationinfo_of_numpy", + "specversion": "3.0.0", + "createdBy": [ + "https://pypi.org/org/matplotlib/" + ], + "created": "2020-03-18T00:00:00Z" + }, + { + "type": "software_package", + "spdxId": "https://pypi.org/project/numpy/1.19.5/", + "creationinfo": "_:creationinfo_of_matplotlib", + "name": "numpy", + "software_downloadLocation": "https://pypi.org/project/numpy/1.19.5/", + "software_homePage": "https://numpy.org/", + "software_packageVersion": "1.19.5", + "originatedBy": [ + "https://pypi.org/user/charlesr.harris/", + "https://pypi.org/user/matthew.brett/", + "https://pypi.org/user/mattip/", + "https://pypi.org/user/rgommers/", + "https://pypi.org/user/teoliphant/" + ], + "software_primaryPurpose": "library", + "description": "NumPy is the fundamental package for scientific computing with Python." + }, + { + "type": "creationInfo", + "@id": "_:creationinfo_of_numpy", + "specversion": "3.0.0", + "createdBy": [ + "https://pypi.org/user/charlesr.harris/", + "https://pypi.org/user/matthew.brett/", + "https://pypi.org/user/mattip/", + "https://pypi.org/user/rgommers/", + "https://pypi.org/user/teoliphant/" + ], + "created": "2021-01-05T00:00:00Z" + }, + { + "type": "software_package", + "spdxId": "https://pypi.org/project/opencv-python/4.4.0.46/", + "creationinfo": "_:creationinfo_of_opencv-python", + "name": "opencv-python", + "software_downloadLocation": "https://pypi.org/project/opencv-python/4.4.0.46/", + "software_homePage": "https://github.com/opencv/opencv-python", + "software_packageVersion": "4.4.0.46", + "originatedBy": [ + "https://pypi.org/user/andrey.senyaev/", + "https://pypi.org/user/asmorkalov/", + "https://pypi.org/user/sergregory/", + "https://pypi.org/user/skvark/" + ], + "software_primaryPurpose": "library", + "description": "Pre-built CPU-only OpenCV packages for Python." + }, + { + "type": "creationInfo", + "@id": "_:creationinfo_of_opencv-python", + "specversion": "3.0.0", + "createdBy": [ + "https://pypi.org/user/andrey.senyaev/", + "https://pypi.org/user/asmorkalov/", + "https://pypi.org/user/sergregory/", + "https://pypi.org/user/skvark/" + ], + "created": "2020-11-02T00:00:00Z" + }, + { + "type": "software_package", + "spdxId": "https://pypi.org/project/path/15.0.0/", + "creationinfo": "_:creationinfo_of_path", + "name": "path", + "software_downloadLocation": "https://pypi.org/project/path/15.0.0/", + "software_homePage": "https://github.com/jaraco/path", + "software_packageVersion": "15.0.0", + "originatedBy": [ + "https://pypi.org/user/jaraco/" + ], + "software_primaryPurpose": "library", + "description": "path (aka path pie, formerly path.py) implements path objects as first-class entities, allowing common operations on files to be invoked on those path objects directly" + }, + { + "type": "creationInfo", + "@id": "_:creationinfo_of_path", + "specversion": "3.0.0", + "createdBy": [ + "https://pypi.org/user/jaraco/" + ], + "created": "2020-07-27T00:00:00Z" + }, + { + "type": "software_package", + "spdxId": "https://pypi.org/project/tensorflow/2.4.0/", + "creationinfo": "_:creationinfo_of_tensorflow", + "name": "tensorflow", + "software_downloadLocation": "https://pypi.org/project/tensorflow/2.4.0/", + "software_homePage": "https://www.tensorflow.org/", + "software_packageVersion": "2.4.0", + "originatedBy": [ + "https://pypi.org/user/jaraco/" + ], + "software_primaryPurpose": "library", + "description": "TensorFlow is an open source software library for high performance numerical computation. Its flexible architecture allows easy deployment of computation across a variety of platforms (CPUs, GPUs, TPUs), and from desktops to clusters of servers to mobile and edge devices." + }, + { + "type": "creationInfo", + "@id": "_:creationinfo_of_tensorflow", + "specversion": "3.0.0", + "createdBy": [ + "https://pypi.org/user/mihaimaruseac/", + "https://pypi.org/user/rishikasinha/", + "https://pypi.org/user/rostam/", + "https://pypi.org/user/tf-nightly/" + ], + "created": "2020-12-14T00:00:00Z" + }, + { + "type": "Relationship", + "spdxId": "https://my-first-aibom.com/SimpleHTR-depends-on", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "dependsOn", + "from": "https://my-first-aibom.com/SimpleHTR", + "to": [ + "https://pypi.org/project/tensorflow/2.4.0/", + "https://pypi.org/project/path/15.0.0/", + "https://pypi.org/project/opencv-python/4.4.0.46/", + "https://pypi.org/project/numpy/1.19.5/", + "https://pypi.org/project/matplotlib/3.2.1/", + "https://pypi.org/project/lmdb/1.0.0/", + "https://pypi.org/project/editdistance/0.5.2/" + ] + }, + { + "type": "ai", + "spdxId": "https://my-first-aibom.com/word-model", + "creationinfo": ":_creationinfo", + "name": "word-model", + "releaseTime": "2023-09-07T00:00:00Z", + "suppliedBy": "https://github.com/githubharald", + "software_downloadLocation": "https://www.dropbox.com/s/mya8hw6jyzqm0a3/word-model.zip?dl=1", + "software_packageVersion": "0.0", + "software_primaryPurpose": "Word level handwriting recognition model", + "aipackage_autonomyType": "no", + "aipackage_domain": "image recognition, optical character recognition, handwriting recognition", + "aipackage_hyperparameters": { + "cnn_kernel_vals": "[5, 5, 3, 3, 3]", + "cnn_nfeature_vals": "[1, 32, 64, 128, 128, 256]", + "cnn_stride_vals": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", + "cnn_pool_vals": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", + "cnn_num_layers": "5", + "cnn_activation": "relu", + "cnn_padding": "SAME", + "cnn_pooling_layer_padding": "VALID", + "cnn_kernal_stddev": "0.1", + "cnn_conv2d_strides": "(1,1,1,1)", + "rnn_num_layers": "2", + "rnn_hidden_layers": "256", + "rnn_LSTM_state_is_tuple": "True", + "rnn_MultiRNNCell_state_is_tuple": "True", + "rnn_filters_sttdev": "0.1", + "rnn_output_rate": "1", + "rnn_output_padding": "SAME", + "loss": "CTCLoss", + "Decode": "CTCDecode", + "beam_serach_decoder_beam_width": "50", + "beam_search_scoring_mode": "Words", + "beam_search_smoothing": "0.1", + "beam_search_encoding": "UTF-8", + "optimizer": "RMSprop" + }, + "aipackage_informationAboutApplication": "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset.", + "aipackage_informationAboutTraining": "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long.", + "aipackage_metric": { + "charErrorRates": [ + 0.9838042269187987, + 0.8809788654060067, + 0.5203559510567297, + 0.33205784204671857, + 0.29054505005561737, + 0.2439599555061179, + 0.2181979977753059, + 0.20262513904338153, + 0.18593993325917688, + 0.18740823136818688, + 0.17259176863181314, + 0.1646273637374861, + 0.16347052280311458, + 0.15830923248053394, + 0.14696329254727475, + 0.1495884315906563, + 0.14197997775305896, + 0.1457174638487208, + 0.14189098998887653, + 0.137174638487208, + 0.13490545050055616, + 0.13152391546162404, + 0.13094549499443828, + 0.1332146829810901, + 0.13090100111234707, + 0.1254282536151279, + 0.12525027808676306, + 0.12529477196885427, + 0.12596218020022246, + 0.12596218020022246, + 0.12182424916573971, + 0.12262513904338153, + 0.11942157953281424, + 0.12031145717463848, + 0.11839822024471636, + 0.11661846496106786, + 0.12195773081201335, + 0.11853170189099, + 0.11608453837597331, + 0.11719688542825361, + 0.12048943270300334, + 0.12088987764182425, + 0.11599555061179088, + 0.11781979977753058, + 0.11506117908787541, + 0.11546162402669632, + 0.11692992213570634, + 0.11790878754171301, + 0.11612903225806452, + 0.11412680756395996, + 0.11688542825361513, + 0.11101223581757508, + 0.11568409343715239, + 0.12017797552836484, + 0.11350389321468297, + 0.11541713014460511, + 0.1181757508342603, + 0.11875417130144605, + 0.11105672969966629, + 0.11350389321468297, + 0.11234705228031146, + 0.11688542825361513, + 0.11461624026696329, + 0.11154616240266964, + 0.11359288097886541, + 0.10914349276974417, + 0.11283648498331479, + 0.11332591768631813, + 0.11394883203559511, + 0.11492769744160178, + 0.11119021134593993, + 0.11145717463848721, + 0.11265850945494994, + 0.11804226918798665, + 0.11092324805339265, + 0.11648498331479422, + 0.1135483870967742, + 0.11599555061179088, + 0.11154616240266964, + 0.11279199110122358, + 0.11421579532814238 + ], + "wordAccuracies": [ + 0.061394380853277836, + 0.10353798126951093, + 0.2443635102323968, + 0.3935137010058966, + 0.449531737773153, + 0.5071106486298994, + 0.5483870967741935, + 0.5613943808532779, + 0.5872355185570586, + 0.591918140825529, + 0.6122095039889005, + 0.6184530003468609, + 0.620013874436351, + 0.6304197016996185, + 0.6546999653139092, + 0.6481096080471731, + 0.6625043357613597, + 0.654873395768297, + 0.6626777662157475, + 0.6722164412070759, + 0.6758584807492196, + 0.6833159902878946, + 0.6817551161984045, + 0.6770724939299341, + 0.6855705861949358, + 0.701179327089837, + 0.6945889698231009, + 0.690426638917794, + 0.6959764134582033, + 0.6888657648283039, + 0.7034339229968782, + 0.7010058966354492, + 0.7103711411723899, + 0.7065556711758585, + 0.7105445716267776, + 0.7133194588969823, + 0.7018730489073881, + 0.7089836975372875, + 0.7124523066250433, + 0.7129725979882068, + 0.7072493929934096, + 0.7043010752688172, + 0.7169614984391259, + 0.7114117238987167, + 0.7211238293444329, + 0.719389524800555, + 0.7134928893513701, + 0.7131460284425946, + 0.7171349288935137, + 0.7221644120707597, + 0.7166146375303504, + 0.7273673257023934, + 0.7190426638917794, + 0.7124523066250433, + 0.7271938952480056, + 0.7238987166146376, + 0.7167880679847382, + 0.7070759625390218, + 0.7278876170655567, + 0.723551855705862, + 0.7289281997918835, + 0.7155740548040236, + 0.7225112729795352, + 0.723551855705862, + 0.7263267429760666, + 0.7348248352410683, + 0.725979882067291, + 0.7282344779743323, + 0.7206035379812695, + 0.7232049947970863, + 0.7273673257023934, + 0.7315296566077003, + 0.7280610475199445, + 0.711064862989941, + 0.7337842525147416, + 0.723551855705862, + 0.7277141866111689, + 0.7230315643426986, + 0.7351716961498439, + 0.7261533125216788, + 0.7232049947970863 + ] + }, + "aipackage_modelDataPreprocessing": "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.", + "aipackage_safetyRiskAssesment": "low", + "aipackage_typeOfModel": "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" + }, + { + "type": "Relationship", + "spdxId": "https://my-first-aibom.com/SimpleHTR-depends-on", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "dependsOn", + "from": "https://my-first-aibom.com/SimpleHTR", + "to": [ + "https://pypi.org/project/tensorflow/2.4.0/", + "https://pypi.org/project/path/15.0.0/", + "https://pypi.org/project/opencv-python/4.4.0.46/", + "https://pypi.org/project/numpy/1.19.5/", + "https://pypi.org/project/matplotlib/3.2.1/", + "https://pypi.org/project/lmdb/1.0.0/", + "https://pypi.org/project/editdistance/0.5.2/" + ] + }, + { + "type": "ai", + "spdxId": "https://my-first-aibom.com/line-model", + "creationinfo": ":_creationinfo", + "name": "line-model", + "releaseTime": "2023-09-07T00:00:00Z", + "suppliedBy": "https://github.com/githubharald", + "software_downloadLocation": "https://www.dropbox.com/s/mya8hw6jyzqm0a3/word-model.zip?dl=1", + "software_packageVersion": "0.0", + "software_primaryPurpose": "Line level handwriting recognition model", + "aipackage_autonomyType": "no", + "aipackage_domain": "image recognition, optical character recognition, handwriting recognition", + "aipackage_hyperparameters": { + "cnn_kernel_vals": "[5, 5, 3, 3, 3]", + "cnn_nfeature_vals": "[1, 32, 64, 128, 128, 256]", + "cnn_stride_vals": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", + "cnn_pool_vals": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", + "cnn_num_layers": "5", + "cnn_activation": "relu", + "cnn_padding": "SAME", + "cnn_pooling_layer_padding": "VALID", + "cnn_kernal_stddev": "0.1", + "cnn_conv2d_strides": "(1,1,1,1)", + "rnn_num_layers": "2", + "rnn_hidden_layers": "256", + "rnn_LSTM_state_is_tuple": "True", + "rnn_MultiRNNCell_state_is_tuple": "True", + "rnn_filters_sttdev": "0.1", + "rnn_output_rate": "1", + "rnn_output_padding": "SAME", + "loss": "CTCLoss", + "Decode": "CTCDecode", + "beam_serach_decoder_beam_width": "50", + "beam_search_scoring_mode": "Words", + "beam_search_smoothing": "0.1", + "beam_search_encoding": "UTF-8", + "optimizer": "RMSprop" + }, + "aipackage_informationAboutApplication": "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset.", + "aipackage_informationAboutTraining": "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long.", + "aipackage_metric": { + "charErrorRates": [ + 0.9838042269187987, + 0.8809788654060067, + 0.5203559510567297, + 0.33205784204671857, + 0.29054505005561737, + 0.2439599555061179, + 0.2181979977753059, + 0.20262513904338153, + 0.18593993325917688, + 0.18740823136818688, + 0.17259176863181314, + 0.1646273637374861, + 0.16347052280311458, + 0.15830923248053394, + 0.14696329254727475, + 0.1495884315906563, + 0.14197997775305896, + 0.1457174638487208, + 0.14189098998887653, + 0.137174638487208, + 0.13490545050055616, + 0.13152391546162404, + 0.13094549499443828, + 0.1332146829810901, + 0.13090100111234707, + 0.1254282536151279, + 0.12525027808676306, + 0.12529477196885427, + 0.12596218020022246, + 0.12596218020022246, + 0.12182424916573971, + 0.12262513904338153, + 0.11942157953281424, + 0.12031145717463848, + 0.11839822024471636, + 0.11661846496106786, + 0.12195773081201335, + 0.11853170189099, + 0.11608453837597331, + 0.11719688542825361, + 0.12048943270300334, + 0.12088987764182425, + 0.11599555061179088, + 0.11781979977753058, + 0.11506117908787541, + 0.11546162402669632, + 0.11692992213570634, + 0.11790878754171301, + 0.11612903225806452, + 0.11412680756395996, + 0.11688542825361513, + 0.11101223581757508, + 0.11568409343715239, + 0.12017797552836484, + 0.11350389321468297, + 0.11541713014460511, + 0.1181757508342603, + 0.11875417130144605, + 0.11105672969966629, + 0.11350389321468297, + 0.11234705228031146, + 0.11688542825361513, + 0.11461624026696329, + 0.11154616240266964, + 0.11359288097886541, + 0.10914349276974417, + 0.11283648498331479, + 0.11332591768631813, + 0.11394883203559511, + 0.11492769744160178, + 0.11119021134593993, + 0.11145717463848721, + 0.11265850945494994, + 0.11804226918798665, + 0.11092324805339265, + 0.11648498331479422, + 0.1135483870967742, + 0.11599555061179088, + 0.11154616240266964, + 0.11279199110122358, + 0.11421579532814238 + ], + "wordAccuracies": [ + 0.061394380853277836, + 0.10353798126951093, + 0.2443635102323968, + 0.3935137010058966, + 0.449531737773153, + 0.5071106486298994, + 0.5483870967741935, + 0.5613943808532779, + 0.5872355185570586, + 0.591918140825529, + 0.6122095039889005, + 0.6184530003468609, + 0.620013874436351, + 0.6304197016996185, + 0.6546999653139092, + 0.6481096080471731, + 0.6625043357613597, + 0.654873395768297, + 0.6626777662157475, + 0.6722164412070759, + 0.6758584807492196, + 0.6833159902878946, + 0.6817551161984045, + 0.6770724939299341, + 0.6855705861949358, + 0.701179327089837, + 0.6945889698231009, + 0.690426638917794, + 0.6959764134582033, + 0.6888657648283039, + 0.7034339229968782, + 0.7010058966354492, + 0.7103711411723899, + 0.7065556711758585, + 0.7105445716267776, + 0.7133194588969823, + 0.7018730489073881, + 0.7089836975372875, + 0.7124523066250433, + 0.7129725979882068, + 0.7072493929934096, + 0.7043010752688172, + 0.7169614984391259, + 0.7114117238987167, + 0.7211238293444329, + 0.719389524800555, + 0.7134928893513701, + 0.7131460284425946, + 0.7171349288935137, + 0.7221644120707597, + 0.7166146375303504, + 0.7273673257023934, + 0.7190426638917794, + 0.7124523066250433, + 0.7271938952480056, + 0.7238987166146376, + 0.7167880679847382, + 0.7070759625390218, + 0.7278876170655567, + 0.723551855705862, + 0.7289281997918835, + 0.7155740548040236, + 0.7225112729795352, + 0.723551855705862, + 0.7263267429760666, + 0.7348248352410683, + 0.725979882067291, + 0.7282344779743323, + 0.7206035379812695, + 0.7232049947970863, + 0.7273673257023934, + 0.7315296566077003, + 0.7280610475199445, + 0.711064862989941, + 0.7337842525147416, + 0.723551855705862, + 0.7277141866111689, + 0.7230315643426986, + 0.7351716961498439, + 0.7261533125216788, + 0.7232049947970863 + ] + }, + "aipackage_modelDataPreprocessing": "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.", + "aipackage_safetyRiskAssesment": "low", + "aipackage_typeOfModel": "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" + }, + { + "type": "dataset", + "spdxId": "https://my-first-aibom.com/IAMdataset", + "creationinfo": ":_creationinfo", + "name": "IAMdataset", + "builtTime": "1999-09-20T00:00:00Z", + "originatedBy": "U. Marti and H. Bunke.", + "releaseTime": "NoAssertion", + "software_downloadLocation": "https://fki.tic.heia-fr.ch/databases/iam-handwriting-database", + "software_primaryPurpose": "The IAM Handwriting Database contains forms of handwritten English text which can be used to train and test handwritten text recognizers and to perform writer identification and verification experiments.", + "dataset_confidentialityLevel": "clear", + "dataset_datasetCollectionProcess": "It was decided to use the Lancaster - Oslo/Bergen corpus (LOB), a collection of 500 English texts, each consisting of about 2,000 words as a basis of our database. The LOB corpus is the British pendant to the Brown corpus, which has a structure similar to that of the\n LOB corpus. Then, we split the texts in the corpus into fragments of about three to six sentences with at least 50 words each. These text fragments were printed onto forms and we asked a number of persons to write the text printed on the forms by hand. We extracted the sentences of each text fragment from the corpus and generated a LATEX document containing the text and the structure of the form. The formatted documents were printed by a HP Laserjet 4000TN at a resolution of 600 dpi. Each form consists of four parts. The first part comprises the title “Sentence Database” and a number assigned to the text. The first character of this number shows which category the text belongs to,\n and the following two digits identify the text number. For example in Fig. 1, M01 indicates that the text on the form is extracted from text “01“ in the text category “Science fiction“. The next three digits show with which sentence the text starts. In the second part of the form, the text the individual persons were asked to write is printed. The third part of the form is a blank zone where the writers have to put in their handwriting. In the last part, the writer can voluntarily enter his or her name. All four parts are separated from each other by a horizontal line. This makes it easy to automatically extract the individual parts from a form. It was decided that the writers had to use rulers. These guiding lines, with 1.5 cm space between them, were printed on a separate sheet of paper which\n was put under the form. The writers were asked to use their every day writing in order to get the most natural and unconstrained way of writing. We also told the writers to stop writing, if there was not enough space left on the form to write the whole text. No restrictions were imposed on the writing instrument. Hence, text produced with a number of different writing instruments is included in the database (ballpoint pens, ink pens, and pencils, all with various stroke widths). The filled forms were scanned with a HP-Scanjet 6100 connected to a Sun Ultra 1. The software used to scan the data is xvscan version 1.62. It is an add-on to the wellknown image tool xv. The resolution was set to 300 dpi at a grey-level resolution of 8 bits. The images were saved in TIFF-format with LZW compression. Each form was\n completely scanned, including the printed and handwritten text. To create the label files, the text of a form was copied twice into the label file, once for the machine-printed text and once for the handwritten text. Then the line feeds were filled in manually. In some cases corrections were necessary, because the handwritten text did not exactly correspond to the printed text. These corrections include deletions, insertions, and changes of words so as to make the text in the label file of each form identical to the handwritten text. All corrections were done manually, but they did not take a long. Typically, only approximately 30s of manual processing time for the generation of the label files and the correction of errors were spent\n on each document, which is less than the time required for scanning.", + "dataset_dataPreprocessing": "First, the skew of the document is corrected. Then the positions of the three horizontal lines are computed by a projection method. Given this positional information the handwriting is extracted. Next, the handwritten text is segmented into text lines. Finally, each text line\n is segmented into individual words. To find the first horizontal line, the form is scanned top-down in the middle of the image. The first black pixel found is assumed to belong to the first horizontal line.\n By following the line to the left and to the right, the end points of the line are found. Once the left and right end of the first horizontal line has been determined, its angle is used to correct the skew of the whole document by a rotation. Then, the form is segmented into its four main parts (see Sect. 2). This is a relatively easy task because the four parts are separated from each other by very long\n horizontal lines, which are easy to detect by horizontal projection. To make the projection algorithm more robust, not only the horizontal projection profile is considered, but also the value of the longest horizontal black run in each row. A horizontal line separating two parts from each other is characterized by a value in the horizontal grey-value projection histogram greater than a threshold t and a value of the longest horizontal black run greater than a threshold t\n (see Fig. 5). After all three horizontal lines have been found, we are able to extract the part of the form that contains the handwriting. Over the whole database the handwritten zone was automatically extracted by means of this procedure without any\n error. The next step in preprocessing is to cut the text into\n individual lines. For this purpose a histogram of the horizontal black/white transitions is used. In this histogram we look for local minima. If the value at a local minimum is zero, a cut has been found that does not touch any word. If the value is greater than zero, we have found a position where we can horizontally cut the image with a minimal number of intersections with strokes belonging to words of the previous or the following text line. To handle intersections of this kind a method based on the center of gravity is used. If the center of gravity of the connected component that is cut is in the range of the\n previous (the following) text line, the connected component is assumed to belong to that text line. If the center of gravity is near the cutting line, the component is cut into two parts, one belonging to the previous and one to the following text line. With this method we could extract almost all text lines correctly. Only in about 1.2% (113 of 9157) of the lines did errors occur. The 113 segmentation errors can be classified into acceptable and serious errors. An acceptable error is defined as one where only single punctuation marks or i-dots are assigned to the wrong line, but no cut component. By contrast, parts of letters or words assigned to the wrong text line are considered serious errors. There were 52 acceptable and 61serious errors out of a total of 113. The correction of these errors is left to\n the user of the database. That is, no attempts were made\n to include any manual corrections of the segmentation errors in the database. To segment the text lines into single words, a method\n similar to those described in the paper 'External word segmentation of off-line handwritten text lines.'' and the paper 'Gap metrics for\n word separation in handwritten lines' is used. Because a word can be split into several components, the goal is to cluster the connected components of a text line image into words. First, the convex hull and the center of gravity of each connected component in a line of text is\n computed. Then for each pair of connected components, c1 and c2, the straight line segment s that connects the center of gravity of c1 with the center of gravity of c2 is considered. The distance d between the two points where s intersects the convex hull of c1 and c2 is determined. This distance d is assigned to s as a weight. A graphical illustration is shown in Fig. 7. By means of this procedure, a completely connected and weighted graph is obtained, where each node corresponds to a connected component in the image and the weight on an edge represents the distance between two connected components. Given such a graph, its minimum spanning tree is computed. Finally, all distances that occur as weights on the edges of the minimum spanning tree are clustered into two groups, namely, intra-word and inter-word distance. For this purpose, Otsu's thresholding algorithm is used, which yields a threshold t. Any two connected components, c1\n and c2, that are linked by an edge in the minimum spanning tree with a weight d ≤ t are considered to be part of the same word. By contrast, if the weight d is larger than t, c1 and c2 are regarded as belonging to two different words. Applied on 541 text lines with 3,899 words,\n a correct word extraction of 94.92%, with 3.62% of the words over- and 1.46% undersegmented, was achieved. The primary goal of the preprocessing and segmentation procedures described in this section is to support the labeling of the text. However, these procedures can be\n integrated in any recognizer as well. All procedures have been implemented in C++ and can be compiled under Unix/Solaris and Linux. To actually run the procedures only the TIFF library for image read and write, but no other software utilities are needed.", + "dataset_datasetAvailability": "registration", + "dataset_datasetSize": "4620000000", + "dataset_datasetType": "image", + "dataset_intendedUse": "For line level or word level character recognition", + "dataset_sensor": { + "printer": "HP Laserjet 4000TN", + "scanner": "HP-Scanjet 6100" + } + }, + { + "type": "Relationship", + "spdxId": "https://my-first-aibom.com/word-model-trained-on", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "trainedOn", + "from": "https://my-first-aibom.com/word-model", + "to": [ + "https://my-first-aibom.com/IAMdataset" + ] + }, + { + "type": "Relationship", + "spdxId": "https://my-first-aibom.com/word-model-tested-on", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "testedOn", + "from": "https://my-first-aibom.com/word-model", + "to": [ + "https://my-first-aibom.com/IAMdataset" + ] + }, + { + "type": "Relationship", + "spdxId": "https://my-first-aibom.com/line-model-trained-on", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "trainedOn", + "from": "https://my-first-aibom.com/line-model", + "to": [ + "https://my-first-aibom.com/IAMdataset" + ] + }, + { + "type": "Relationship", + "spdxId": "https://my-first-aibom.com/line-model-tested-on", + "creationInfo": "_:creationinfo_of_package", + "relationshipType": "testedOn", + "from": "https://my-first-aibom.com/line-model", + "to": [ + "https://my-first-aibom.com/IAMdataset" + ] + }, + { + "type": "software_sbom", + "spdxId": "https://my-first-aibom.com/BOM1", + "creationInfo": "_:creationinfo", + "rootElement": [ + "https://my-first-aibom.com/SimpleHTR" + ], + "element": [ + "TO BE ADDED LATER" + ], + "software_sbomType": [ + "analyzed" + ] + } + ] +} From fad152941948930700d2694d4fc66448c9ba2e0f Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Wed, 5 Jun 2024 16:43:59 +0100 Subject: [PATCH 03/11] Update class/property names, made validated - Fix typos in class/property/type names - Convert dictionary ("key": "value") entries to SPDX 3.0 "DictionaryEntry" objects - Now validated with spdx3ToGraph Signed-off-by: Arthit Suriyawongkul --- ai/simpleHTR-example.json | 950 +++++++++++++++++--------------------- 1 file changed, 420 insertions(+), 530 deletions(-) diff --git a/ai/simpleHTR-example.json b/ai/simpleHTR-example.json index c276f99..ff9b251 100644 --- a/ai/simpleHTR-example.json +++ b/ai/simpleHTR-example.json @@ -15,7 +15,7 @@ ] }, { - "type": "creationInfo", + "type": "CreationInfo", "@id": "_:creationinfo", "specVersion": "3.0.0", "createdBy": [ @@ -24,9 +24,9 @@ "created": "2024-05-09T13:50:30Z" }, { - "type": "creationInfo", + "type": "CreationInfo", "@id": "_:creationinfo_of_package", - "specversion": "3.0.0", + "specVersion": "3.0.0", "createdBy": [ "https://github.com/githubharald" ], @@ -47,9 +47,9 @@ ] }, { - "type": "software_package", + "type": "software_Package", "spdxId": "https://my-first-aibom.com/SimpleHTR", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "simpleHTR", "software_downloadLocation": "https://github.com/githubharald/SimpleHTR/tree/master", "originatedBy": [ @@ -59,7 +59,7 @@ { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src/main", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/src/main.py", "originatedBy": [ "https://github.com/githubharald" @@ -69,12 +69,12 @@ "source" ], "comment": "This file is the main entry point for execution of the Handwriting recognition application. ", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src/create_lmdb", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/src/create_lmdb.py", "originatedBy": [ "https://github.com/githubharald" @@ -84,12 +84,12 @@ "source" ], "comment": "This file is to store images into lmdb as pickled grayscale images", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src/dataloader_iam", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/src/dataloader_iam.py", "originatedBy": [ "https://github.com/githubharald" @@ -99,12 +99,12 @@ "source" ], "comment": "Loads data which corresponds to IAM format", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src/model", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/src/model.py", "originatedBy": [ "https://github.com/githubharald" @@ -115,12 +115,12 @@ "executable" ], "comment": "Source code for the AI model that is used in this application", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src/preprocessor", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/src/preprocessor.py", "originatedBy": [ "https://github.com/githubharald" @@ -130,19 +130,19 @@ "executable" ], "comment": "Source code for preprocessing the data that is used for training and testing the model", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/src", "originatedBy": [ "https://github.com/githubharald" ], "software_primaryPurpose": "source", "comment": "This directory contains all the source code files that is required for simpleHTR application", - "software_FileKind": "directory" + "software_fileKind": "directory" }, { "type": "Relationship", @@ -161,19 +161,19 @@ { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/doc", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/doc", "originatedBy": [ "https://github.com/githubharald" ], "software_primaryPurpose": "documentation", "comment": "This directory contains several images required for documentation", - "software_FileKind": "directory" + "software_fileKind": "directory" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/doc/decoder_comparision", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/doc/decoder_comparision.png", "originatedBy": [ "https://github.com/githubharald" @@ -183,12 +183,12 @@ "file" ], "comment": "An image that shows documentation related information for simpleHTR options", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/doc/graphics", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/doc/graphics.svg", "originatedBy": [ "https://github.com/githubharald" @@ -198,12 +198,12 @@ "file" ], "comment": "An image that shows documentation related information for simpleHTR options", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/doc/htr", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/doc/htr.png", "originatedBy": [ "https://github.com/githubharald" @@ -213,7 +213,7 @@ "file" ], "comment": "An image that shows documentation related information for simpleHTR options", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "Relationship", @@ -230,7 +230,7 @@ { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model", "originatedBy": [ "https://github.com/githubharald" @@ -240,24 +240,24 @@ "library" ], "comment": "This directory contains several images required for documentation", - "software_FileKind": "directory" + "software_fileKind": "directory" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/.gitignore", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/.gitignore", "originatedBy": [ "https://github.com/githubharald" ], "software_primaryPurpose": "other", "comment": "The gitignore file for the directory", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/wordCharList", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/wordCharList.txt", "originatedBy": [ "https://github.com/githubharald" @@ -267,12 +267,12 @@ "file" ], "comment": "Configuration/parameter file for the beam search decoder of the model", - "software_FileKind": "file" + "software_fileKind": "file" }, { - "type": "software_package", + "type": "software_Package", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "word-model", "software_downloadLocation": "https://www.dropbox.com/s/7xwkcilho10rthn/word-model.zip?dl=1", "originatedBy": [ @@ -288,7 +288,7 @@ { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/charList", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/word-model/CharList.txt", "originatedBy": [ "https://github.com/githubharald" @@ -299,12 +299,12 @@ "configuration" ], "comment": "Configuration/parameter file for the beam search decoder of the model", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/checkpoint", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/word-model/checkpoint", "originatedBy": [ "https://github.com/githubharald" @@ -315,12 +315,12 @@ "file" ], "comment": "Saved checkpoint of the model", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.data-00000-of-00001", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/word-model/snapshot-33.data-00000-of-00001", "originatedBy": [ "https://github.com/githubharald" @@ -331,12 +331,12 @@ "file" ], "comment": "Actual values of all variables that make up the word level handwriting recognition AI model", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.index", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/word-model/snapshot-33.index", "originatedBy": [ "https://github.com/githubharald" @@ -347,12 +347,12 @@ "file" ], "comment": "The name and shape of all the variables that make up the word level handwriting recognition AI model thier actual data is stored in /model/word-model/snapshot-33.index", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.meta", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/word-model/snapshot-33.meta", "originatedBy": [ "https://github.com/githubharald" @@ -363,12 +363,12 @@ "file" ], "comment": "Its a file storing all the information required to restore a training or information process including the graph that describes the data flow and additional annotations that describes the variables, input pipelines and other relevant information", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/summary.json", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/word-model/summary.json", "originatedBy": [ "https://github.com/githubharald" @@ -379,7 +379,7 @@ "file" ], "comment": "Records the character level error rates of each letter in a json format", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "Relationship", @@ -397,9 +397,9 @@ ] }, { - "type": "software_package", + "type": "software_Package", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "line-model", "software_downloadLocation": "https://www.dropbox.com/s/7xwkcilho10rthn/line-model.zip?dl=1", "originatedBy": [ @@ -415,7 +415,7 @@ { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/charList", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/line-model/CharList.txt", "originatedBy": [ "https://github.com/githubharald" @@ -426,12 +426,12 @@ "configuration" ], "comment": "Configuration/parameter file for the beam search decoder of the model", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/checkpoint", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/line-model/checkpoint", "originatedBy": [ "https://github.com/githubharald" @@ -442,12 +442,12 @@ "file" ], "comment": "Saved checkpoint of the model", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.data-00000-of-00001", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/line-model/snapshot-13.data-00000-of-00001", "originatedBy": [ "https://github.com/githubharald" @@ -458,12 +458,12 @@ "file" ], "comment": "Actual values of all variables that make up the line level handwriting recognition AI model", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.index", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/line-model/snapshot-13.index", "originatedBy": [ "https://github.com/githubharald" @@ -474,12 +474,12 @@ "file" ], "comment": "The name and shape of all the variables that make up the line level handwriting recognition AI model thier actual data is stored in /model/line-model/snapshot-13.index", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.meta", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/line-model/snapshot-13.meta", "originatedBy": [ "https://github.com/githubharald" @@ -490,12 +490,12 @@ "file" ], "comment": "Its a file storing all the information required to restore a training or information process including the graph that describes the data flow and additional annotations that describes the variables, input pipelines and other relevant information", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/summary.json", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/model/line-model/summary.json", "originatedBy": [ "https://github.com/githubharald" @@ -506,7 +506,7 @@ "file" ], "comment": "Records the character level error rates of each letter in a json format", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "Relationship", @@ -539,19 +539,19 @@ { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/data", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/data", "originatedBy": [ "https://github.com/githubharald" ], "software_primaryPurpose": "data", "comment": "This directory contains all the data and examples required to train the simpleHTR AI model", - "software_FileKind": "directory" + "software_fileKind": "directory" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/data/corpus", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/data/corpus.txt", "originatedBy": [ "https://github.com/githubharald" @@ -561,12 +561,12 @@ "file" ], "comment": "The data corpus extracted from IAM dataset and this data is used to train the underlying simpleHTR AI model", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/data/line", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/data/line.png", "originatedBy": [ "https://github.com/githubharald" @@ -576,12 +576,12 @@ "file" ], "comment": "An example image to test the model's line level character recognition capability", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/data/word", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/data/word.png", "originatedBy": [ "https://github.com/githubharald" @@ -591,7 +591,7 @@ "file" ], "comment": "An example image to test the model's word level character recognition capability", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "Relationship", @@ -608,19 +608,19 @@ { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/.gitignore", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/master/.gitignore", "originatedBy": [ "https://github.com/githubharald" ], "software_primaryPurpose": "other", "comment": "The git ignore file for the directory", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/LICENSE", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/master/LICENSE.md", "originatedBy": [ "https://github.com/githubharald" @@ -630,12 +630,12 @@ "file" ], "comment": "License of the software", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/README", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/master/README.md", "originatedBy": [ "https://github.com/githubharald" @@ -645,22 +645,22 @@ "file" ], "comment": "The overall documentation and getting started of the document", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "software_File", "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/requirements", - "creationinfo": "_:creationinfo_of_package", + "creationInfo": "_:creationinfo_of_package", "name": "/master/requirements.txt", "originatedBy": [ "https://github.com/githubharald" ], - "software_primaryPurpose": "requirements", + "software_primaryPurpose": "requirement", "software_additionalPurpose": [ "file" ], "comment": "Lists the external package dependencies that are required to be satisfied for the application to execute", - "software_FileKind": "file" + "software_fileKind": "file" }, { "type": "Relationship", @@ -680,9 +680,9 @@ ] }, { - "type": "software_package", + "type": "software_Package", "spdxId": "https://pypi.org/project/editdistance/0.5.2/", - "creationinfo": "_:creationinfo_of_editdistance", + "creationInfo": "_:creationinfo_of_editdistance", "name": "editdistance", "software_downloadLocation": "https://pypi.org/project/editdistance/0.5.2/", "software_homePage": "https://github.com/roy-ht/editdistance", @@ -694,18 +694,18 @@ "description": "This library simply implements Levenshtein distance with C++ and Cython." }, { - "type": "creationInfoaz", - "@id": "_:creationinazfo_of_editdistance", - "specversion": "3.0.0", + "type": "CreationInfo", + "@id": "_:creationinfo_of_editdistance", + "specVersion": "3.0.0", "createdBy": [ - "https://azpypi.org/user/aflc/" + "https://pypi.org/user/aflc/" ], - "created": "2018-09-17T0az0:00:00Z" + "created": "2018-09-17T00:00:00Z" }, { - "type": "software_pacazkage", - "spdxId": "https://pypiaz.org/project/lmdb/1.0.0/", - "creationinfo": "_:creationinazfo_of_lmdb", + "type": "software_Package", + "spdxId": "https://pypi.org/project/lmdb/1.0.0/", + "creationInfo": "_:creationinfo_of_lmdb", "name": "lmdb", "software_downloadLocation": "https://pypi.org/project/lmdb/1.0.0/", "software_homePage": "https://github.com/jnwatson/py-lmdb/", @@ -718,9 +718,9 @@ "description": "This is a universal Python binding for the LMDB ‘Lightning’ Database." }, { - "type": "creationInfo", + "type": "CreationInfo", "@id": "_:creationinfo_of_lmdb", - "specversion": "3.0.0", + "specVersion": "3.0.0", "createdBy": [ "https://pypi.org/user/dw/", "https://pypi.org/user/jnwatson/" @@ -728,9 +728,9 @@ "created": "2020-08-28T00:00:00Z" }, { - "type": "software_package", + "type": "software_Package", "spdxId": "https://pypi.org/project/matplotlib/3.2.1/", - "creationinfo": "_:creationinfo_of_matplotlib", + "creationInfo": "_:creationinfo_of_matplotlib", "name": "lmdb", "software_downloadLocation": "https://pypi.org/project/matplotlib/3.2.1/", "software_homePage": "https://matplotlib.org/", @@ -742,18 +742,18 @@ "description": "Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python." }, { - "type": "creationInfo", + "type": "CreationInfo", "@id": "_:creationinfo_of_creationinfo_of_numpy", - "specversion": "3.0.0", + "specVersion": "3.0.0", "createdBy": [ "https://pypi.org/org/matplotlib/" ], "created": "2020-03-18T00:00:00Z" }, { - "type": "software_package", + "type": "software_Package", "spdxId": "https://pypi.org/project/numpy/1.19.5/", - "creationinfo": "_:creationinfo_of_matplotlib", + "creationInfo": "_:creationinfo_of_matplotlib", "name": "numpy", "software_downloadLocation": "https://pypi.org/project/numpy/1.19.5/", "software_homePage": "https://numpy.org/", @@ -769,9 +769,9 @@ "description": "NumPy is the fundamental package for scientific computing with Python." }, { - "type": "creationInfo", + "type": "CreationInfo", "@id": "_:creationinfo_of_numpy", - "specversion": "3.0.0", + "specVersion": "3.0.0", "createdBy": [ "https://pypi.org/user/charlesr.harris/", "https://pypi.org/user/matthew.brett/", @@ -782,9 +782,9 @@ "created": "2021-01-05T00:00:00Z" }, { - "type": "software_package", + "type": "software_Package", "spdxId": "https://pypi.org/project/opencv-python/4.4.0.46/", - "creationinfo": "_:creationinfo_of_opencv-python", + "creationInfo": "_:creationinfo_of_opencv-python", "name": "opencv-python", "software_downloadLocation": "https://pypi.org/project/opencv-python/4.4.0.46/", "software_homePage": "https://github.com/opencv/opencv-python", @@ -799,9 +799,9 @@ "description": "Pre-built CPU-only OpenCV packages for Python." }, { - "type": "creationInfo", + "type": "CreationInfo", "@id": "_:creationinfo_of_opencv-python", - "specversion": "3.0.0", + "specVersion": "3.0.0", "createdBy": [ "https://pypi.org/user/andrey.senyaev/", "https://pypi.org/user/asmorkalov/", @@ -811,9 +811,9 @@ "created": "2020-11-02T00:00:00Z" }, { - "type": "software_package", + "type": "software_Package", "spdxId": "https://pypi.org/project/path/15.0.0/", - "creationinfo": "_:creationinfo_of_path", + "creationInfo": "_:creationinfo_of_path", "name": "path", "software_downloadLocation": "https://pypi.org/project/path/15.0.0/", "software_homePage": "https://github.com/jaraco/path", @@ -825,18 +825,18 @@ "description": "path (aka path pie, formerly path.py) implements path objects as first-class entities, allowing common operations on files to be invoked on those path objects directly" }, { - "type": "creationInfo", + "type": "CreationInfo", "@id": "_:creationinfo_of_path", - "specversion": "3.0.0", + "specVersion": "3.0.0", "createdBy": [ "https://pypi.org/user/jaraco/" ], "created": "2020-07-27T00:00:00Z" }, { - "type": "software_package", + "type": "software_Package", "spdxId": "https://pypi.org/project/tensorflow/2.4.0/", - "creationinfo": "_:creationinfo_of_tensorflow", + "creationInfo": "_:creationinfo_of_tensorflow", "name": "tensorflow", "software_downloadLocation": "https://pypi.org/project/tensorflow/2.4.0/", "software_homePage": "https://www.tensorflow.org/", @@ -848,9 +848,9 @@ "description": "TensorFlow is an open source software library for high performance numerical computation. Its flexible architecture allows easy deployment of computation across a variety of platforms (CPUs, GPUs, TPUs), and from desktops to clusters of servers to mobile and edge devices." }, { - "type": "creationInfo", + "type": "CreationInfo", "@id": "_:creationinfo_of_tensorflow", - "specversion": "3.0.0", + "specVersion": "3.0.0", "createdBy": [ "https://pypi.org/user/mihaimaruseac/", "https://pypi.org/user/rishikasinha/", @@ -876,216 +876,157 @@ ] }, { - "type": "ai", + "type": "ai_AIPackage", "spdxId": "https://my-first-aibom.com/word-model", - "creationinfo": ":_creationinfo", + "creationInfo": ":_creationinfo", "name": "word-model", "releaseTime": "2023-09-07T00:00:00Z", "suppliedBy": "https://github.com/githubharald", "software_downloadLocation": "https://www.dropbox.com/s/mya8hw6jyzqm0a3/word-model.zip?dl=1", "software_packageVersion": "0.0", - "software_primaryPurpose": "Word level handwriting recognition model", - "aipackage_autonomyType": "no", - "aipackage_domain": "image recognition, optical character recognition, handwriting recognition", - "aipackage_hyperparameters": { - "cnn_kernel_vals": "[5, 5, 3, 3, 3]", - "cnn_nfeature_vals": "[1, 32, 64, 128, 128, 256]", - "cnn_stride_vals": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", - "cnn_pool_vals": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", - "cnn_num_layers": "5", - "cnn_activation": "relu", - "cnn_padding": "SAME", - "cnn_pooling_layer_padding": "VALID", - "cnn_kernal_stddev": "0.1", - "cnn_conv2d_strides": "(1,1,1,1)", - "rnn_num_layers": "2", - "rnn_hidden_layers": "256", - "rnn_LSTM_state_is_tuple": "True", - "rnn_MultiRNNCell_state_is_tuple": "True", - "rnn_filters_sttdev": "0.1", - "rnn_output_rate": "1", - "rnn_output_padding": "SAME", - "loss": "CTCLoss", - "Decode": "CTCDecode", - "beam_serach_decoder_beam_width": "50", - "beam_search_scoring_mode": "Words", - "beam_search_smoothing": "0.1", - "beam_search_encoding": "UTF-8", - "optimizer": "RMSprop" - }, - "aipackage_informationAboutApplication": "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset.", - "aipackage_informationAboutTraining": "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long.", - "aipackage_metric": { - "charErrorRates": [ - 0.9838042269187987, - 0.8809788654060067, - 0.5203559510567297, - 0.33205784204671857, - 0.29054505005561737, - 0.2439599555061179, - 0.2181979977753059, - 0.20262513904338153, - 0.18593993325917688, - 0.18740823136818688, - 0.17259176863181314, - 0.1646273637374861, - 0.16347052280311458, - 0.15830923248053394, - 0.14696329254727475, - 0.1495884315906563, - 0.14197997775305896, - 0.1457174638487208, - 0.14189098998887653, - 0.137174638487208, - 0.13490545050055616, - 0.13152391546162404, - 0.13094549499443828, - 0.1332146829810901, - 0.13090100111234707, - 0.1254282536151279, - 0.12525027808676306, - 0.12529477196885427, - 0.12596218020022246, - 0.12596218020022246, - 0.12182424916573971, - 0.12262513904338153, - 0.11942157953281424, - 0.12031145717463848, - 0.11839822024471636, - 0.11661846496106786, - 0.12195773081201335, - 0.11853170189099, - 0.11608453837597331, - 0.11719688542825361, - 0.12048943270300334, - 0.12088987764182425, - 0.11599555061179088, - 0.11781979977753058, - 0.11506117908787541, - 0.11546162402669632, - 0.11692992213570634, - 0.11790878754171301, - 0.11612903225806452, - 0.11412680756395996, - 0.11688542825361513, - 0.11101223581757508, - 0.11568409343715239, - 0.12017797552836484, - 0.11350389321468297, - 0.11541713014460511, - 0.1181757508342603, - 0.11875417130144605, - 0.11105672969966629, - 0.11350389321468297, - 0.11234705228031146, - 0.11688542825361513, - 0.11461624026696329, - 0.11154616240266964, - 0.11359288097886541, - 0.10914349276974417, - 0.11283648498331479, - 0.11332591768631813, - 0.11394883203559511, - 0.11492769744160178, - 0.11119021134593993, - 0.11145717463848721, - 0.11265850945494994, - 0.11804226918798665, - 0.11092324805339265, - 0.11648498331479422, - 0.1135483870967742, - 0.11599555061179088, - 0.11154616240266964, - 0.11279199110122358, - 0.11421579532814238 - ], - "wordAccuracies": [ - 0.061394380853277836, - 0.10353798126951093, - 0.2443635102323968, - 0.3935137010058966, - 0.449531737773153, - 0.5071106486298994, - 0.5483870967741935, - 0.5613943808532779, - 0.5872355185570586, - 0.591918140825529, - 0.6122095039889005, - 0.6184530003468609, - 0.620013874436351, - 0.6304197016996185, - 0.6546999653139092, - 0.6481096080471731, - 0.6625043357613597, - 0.654873395768297, - 0.6626777662157475, - 0.6722164412070759, - 0.6758584807492196, - 0.6833159902878946, - 0.6817551161984045, - 0.6770724939299341, - 0.6855705861949358, - 0.701179327089837, - 0.6945889698231009, - 0.690426638917794, - 0.6959764134582033, - 0.6888657648283039, - 0.7034339229968782, - 0.7010058966354492, - 0.7103711411723899, - 0.7065556711758585, - 0.7105445716267776, - 0.7133194588969823, - 0.7018730489073881, - 0.7089836975372875, - 0.7124523066250433, - 0.7129725979882068, - 0.7072493929934096, - 0.7043010752688172, - 0.7169614984391259, - 0.7114117238987167, - 0.7211238293444329, - 0.719389524800555, - 0.7134928893513701, - 0.7131460284425946, - 0.7171349288935137, - 0.7221644120707597, - 0.7166146375303504, - 0.7273673257023934, - 0.7190426638917794, - 0.7124523066250433, - 0.7271938952480056, - 0.7238987166146376, - 0.7167880679847382, - 0.7070759625390218, - 0.7278876170655567, - 0.723551855705862, - 0.7289281997918835, - 0.7155740548040236, - 0.7225112729795352, - 0.723551855705862, - 0.7263267429760666, - 0.7348248352410683, - 0.725979882067291, - 0.7282344779743323, - 0.7206035379812695, - 0.7232049947970863, - 0.7273673257023934, - 0.7315296566077003, - 0.7280610475199445, - 0.711064862989941, - 0.7337842525147416, - 0.723551855705862, - 0.7277141866111689, - 0.7230315643426986, - 0.7351716961498439, - 0.7261533125216788, - 0.7232049947970863 - ] - }, - "aipackage_modelDataPreprocessing": "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.", - "aipackage_safetyRiskAssesment": "low", - "aipackage_typeOfModel": "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" + "software_primaryPurpose": "application", + "comment": "Word level handwriting recognition model", + "ai_autonomyType": "no", + "ai_domain": "image recognition, optical character recognition, handwriting recognition", + "ai_hyperparameter": [ + { + "type": "DictionaryEntry", + "key": "cnn_kernel_vals", + "value": "[5, 5, 3, 3, 3]" + }, + { + "type": "DictionaryEntry", + "key": "cnn_nfeature_vals", + "value": "[1, 32, 64, 128, 128, 256]" + }, + { + "type": "DictionaryEntry", + "key": "cnn_stride_vals", + "value": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" + }, + { + "type": "DictionaryEntry", + "key": "cnn_pool_vals", + "value": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" + }, + { + "type": "DictionaryEntry", + "key": "cnn_num_layers", + "value": "5" + }, + { + "type": "DictionaryEntry", + "key": "cnn_activation", + "value": "relu" + }, + { + "type": "DictionaryEntry", + "key": "cnn_padding", + "value": "SAME" + }, + { + "type": "DictionaryEntry", + "key": "cnn_pooling_layer_padding", + "value": "VALID" + }, + { + "type": "DictionaryEntry", + "key": "cnn_kernal_stddev", + "value": "0.1" + }, + { + "type": "DictionaryEntry", + "key": "cnn_conv2d_strides", + "value": "(1,1,1,1)" + }, + { + "type": "DictionaryEntry", + "key": "rnn_num_layers", + "value": "2" + }, + { + "type": "DictionaryEntry", + "key": "rnn_hidden_layers", + "value": "256" + }, + { + "type": "DictionaryEntry", + "key": "rnn_LSTM_state_is_tuple", + "value": "True" + }, + { + "type": "DictionaryEntry", + "key": "rnn_MultiRNNCell_state_is_tuple", + "value": "True" + }, + { + "type": "DictionaryEntry", + "key": "rnn_filters_sttdev", + "value": "0.1" + }, + { + "type": "DictionaryEntry", + "key": "rnn_output_rate", + "value": "1" + }, + { + "type": "DictionaryEntry", + "key": "rnn_output_padding", + "value": "SAME" + }, + { + "type": "DictionaryEntry", + "key": "loss", + "value": "CTCLoss" + }, + { + "type": "DictionaryEntry", + "key": "Decode", + "value": "CTCDecode" + }, + { + "type": "DictionaryEntry", + "key": "beam_serach_decoder_beam_width", + "value": "50" + }, + { + "type": "DictionaryEntry", + "key": "beam_search_scoring_mode", + "value": "Words" + }, + { + "type": "DictionaryEntry", + "key": "beam_search_smoothing", + "value": "0.1" + }, + { + "type": "DictionaryEntry", + "key": "beam_search_encoding", + "value": "UTF-8" + }, + { + "type": "DictionaryEntry", + "key": "optimizer", + "value": "RMSprop" + } + ], + "ai_informationAboutApplication": "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset.", + "ai_informationAboutTraining": "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long.", + "ai_metric": [ + { + "type": "DictionaryEntry", + "key": "charErrorRates", + "value": "[ 0.9838042269187987, 0.8809788654060067, 0.5203559510567297, 0.33205784204671857, 0.29054505005561737, 0.2439599555061179, 0.2181979977753059, 0.20262513904338153, 0.18593993325917688, 0.18740823136818688, 0.17259176863181314, 0.1646273637374861, 0.16347052280311458, 0.15830923248053394, 0.14696329254727475, 0.1495884315906563, 0.14197997775305896, 0.1457174638487208, 0.14189098998887653, 0.137174638487208, 0.13490545050055616, 0.13152391546162404, 0.13094549499443828, 0.1332146829810901, 0.13090100111234707, 0.1254282536151279, 0.12525027808676306, 0.12529477196885427, 0.12596218020022246, 0.12596218020022246, 0.12182424916573971, 0.12262513904338153, 0.11942157953281424, 0.12031145717463848, 0.11839822024471636, 0.11661846496106786, 0.12195773081201335, 0.11853170189099, 0.11608453837597331, 0.11719688542825361, 0.12048943270300334, 0.12088987764182425, 0.11599555061179088, 0.11781979977753058, 0.11506117908787541, 0.11546162402669632, 0.11692992213570634, 0.11790878754171301, 0.11612903225806452, 0.11412680756395996, 0.11688542825361513, 0.11101223581757508, 0.11568409343715239, 0.12017797552836484, 0.11350389321468297, 0.11541713014460511, 0.1181757508342603, 0.11875417130144605, 0.11105672969966629, 0.11350389321468297, 0.11234705228031146, 0.11688542825361513, 0.11461624026696329, 0.11154616240266964, 0.11359288097886541, 0.10914349276974417, 0.11283648498331479, 0.11332591768631813, 0.11394883203559511, 0.11492769744160178, 0.11119021134593993, 0.11145717463848721, 0.11265850945494994, 0.11804226918798665, 0.11092324805339265, 0.11648498331479422, 0.1135483870967742, 0.11599555061179088, 0.11154616240266964, 0.11279199110122358, 0.11421579532814238 ]" + }, + { + "type": "DictionaryEntry", + "key": "wordAccuracies", + "value": "[ 0.061394380853277836, 0.10353798126951093, 0.2443635102323968, 0.3935137010058966, 0.449531737773153, 0.5071106486298994, 0.5483870967741935, 0.5613943808532779, 0.5872355185570586, 0.591918140825529, 0.6122095039889005, 0.6184530003468609, 0.620013874436351, 0.6304197016996185, 0.6546999653139092, 0.6481096080471731, 0.6625043357613597, 0.654873395768297, 0.6626777662157475, 0.6722164412070759, 0.6758584807492196, 0.6833159902878946, 0.6817551161984045, 0.6770724939299341, 0.6855705861949358, 0.701179327089837, 0.6945889698231009, 0.690426638917794, 0.6959764134582033, 0.6888657648283039, 0.7034339229968782, 0.7010058966354492, 0.7103711411723899, 0.7065556711758585, 0.7105445716267776, 0.7133194588969823, 0.7018730489073881, 0.7089836975372875, 0.7124523066250433, 0.7129725979882068, 0.7072493929934096, 0.7043010752688172, 0.7169614984391259, 0.7114117238987167, 0.7211238293444329, 0.719389524800555, 0.7134928893513701, 0.7131460284425946, 0.7171349288935137, 0.7221644120707597, 0.7166146375303504, 0.7273673257023934, 0.7190426638917794, 0.7124523066250433, 0.7271938952480056, 0.7238987166146376, 0.7167880679847382, 0.7070759625390218, 0.7278876170655567, 0.723551855705862, 0.7289281997918835, 0.7155740548040236, 0.7225112729795352, 0.723551855705862, 0.7263267429760666, 0.7348248352410683, 0.725979882067291, 0.7282344779743323, 0.7206035379812695, 0.7232049947970863, 0.7273673257023934, 0.7315296566077003, 0.7280610475199445, 0.711064862989941, 0.7337842525147416, 0.723551855705862, 0.7277141866111689, 0.7230315643426986, 0.7351716961498439, 0.7261533125216788, 0.7232049947970863 ]" + } + ], + "ai_modelDataPreprocessing": "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.", + "ai_safetyRiskAssessment": "low", + "ai_typeOfModel": "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" }, { "type": "Relationship", @@ -1104,238 +1045,187 @@ ] }, { - "type": "ai", + "type": "ai_AIPackage", "spdxId": "https://my-first-aibom.com/line-model", - "creationinfo": ":_creationinfo", + "creationInfo": ":_creationinfo", "name": "line-model", "releaseTime": "2023-09-07T00:00:00Z", "suppliedBy": "https://github.com/githubharald", "software_downloadLocation": "https://www.dropbox.com/s/mya8hw6jyzqm0a3/word-model.zip?dl=1", "software_packageVersion": "0.0", - "software_primaryPurpose": "Line level handwriting recognition model", - "aipackage_autonomyType": "no", - "aipackage_domain": "image recognition, optical character recognition, handwriting recognition", - "aipackage_hyperparameters": { - "cnn_kernel_vals": "[5, 5, 3, 3, 3]", - "cnn_nfeature_vals": "[1, 32, 64, 128, 128, 256]", - "cnn_stride_vals": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", - "cnn_pool_vals": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]", - "cnn_num_layers": "5", - "cnn_activation": "relu", - "cnn_padding": "SAME", - "cnn_pooling_layer_padding": "VALID", - "cnn_kernal_stddev": "0.1", - "cnn_conv2d_strides": "(1,1,1,1)", - "rnn_num_layers": "2", - "rnn_hidden_layers": "256", - "rnn_LSTM_state_is_tuple": "True", - "rnn_MultiRNNCell_state_is_tuple": "True", - "rnn_filters_sttdev": "0.1", - "rnn_output_rate": "1", - "rnn_output_padding": "SAME", - "loss": "CTCLoss", - "Decode": "CTCDecode", - "beam_serach_decoder_beam_width": "50", - "beam_search_scoring_mode": "Words", - "beam_search_smoothing": "0.1", - "beam_search_encoding": "UTF-8", - "optimizer": "RMSprop" - }, - "aipackage_informationAboutApplication": "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset.", - "aipackage_informationAboutTraining": "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long.", - "aipackage_metric": { - "charErrorRates": [ - 0.9838042269187987, - 0.8809788654060067, - 0.5203559510567297, - 0.33205784204671857, - 0.29054505005561737, - 0.2439599555061179, - 0.2181979977753059, - 0.20262513904338153, - 0.18593993325917688, - 0.18740823136818688, - 0.17259176863181314, - 0.1646273637374861, - 0.16347052280311458, - 0.15830923248053394, - 0.14696329254727475, - 0.1495884315906563, - 0.14197997775305896, - 0.1457174638487208, - 0.14189098998887653, - 0.137174638487208, - 0.13490545050055616, - 0.13152391546162404, - 0.13094549499443828, - 0.1332146829810901, - 0.13090100111234707, - 0.1254282536151279, - 0.12525027808676306, - 0.12529477196885427, - 0.12596218020022246, - 0.12596218020022246, - 0.12182424916573971, - 0.12262513904338153, - 0.11942157953281424, - 0.12031145717463848, - 0.11839822024471636, - 0.11661846496106786, - 0.12195773081201335, - 0.11853170189099, - 0.11608453837597331, - 0.11719688542825361, - 0.12048943270300334, - 0.12088987764182425, - 0.11599555061179088, - 0.11781979977753058, - 0.11506117908787541, - 0.11546162402669632, - 0.11692992213570634, - 0.11790878754171301, - 0.11612903225806452, - 0.11412680756395996, - 0.11688542825361513, - 0.11101223581757508, - 0.11568409343715239, - 0.12017797552836484, - 0.11350389321468297, - 0.11541713014460511, - 0.1181757508342603, - 0.11875417130144605, - 0.11105672969966629, - 0.11350389321468297, - 0.11234705228031146, - 0.11688542825361513, - 0.11461624026696329, - 0.11154616240266964, - 0.11359288097886541, - 0.10914349276974417, - 0.11283648498331479, - 0.11332591768631813, - 0.11394883203559511, - 0.11492769744160178, - 0.11119021134593993, - 0.11145717463848721, - 0.11265850945494994, - 0.11804226918798665, - 0.11092324805339265, - 0.11648498331479422, - 0.1135483870967742, - 0.11599555061179088, - 0.11154616240266964, - 0.11279199110122358, - 0.11421579532814238 - ], - "wordAccuracies": [ - 0.061394380853277836, - 0.10353798126951093, - 0.2443635102323968, - 0.3935137010058966, - 0.449531737773153, - 0.5071106486298994, - 0.5483870967741935, - 0.5613943808532779, - 0.5872355185570586, - 0.591918140825529, - 0.6122095039889005, - 0.6184530003468609, - 0.620013874436351, - 0.6304197016996185, - 0.6546999653139092, - 0.6481096080471731, - 0.6625043357613597, - 0.654873395768297, - 0.6626777662157475, - 0.6722164412070759, - 0.6758584807492196, - 0.6833159902878946, - 0.6817551161984045, - 0.6770724939299341, - 0.6855705861949358, - 0.701179327089837, - 0.6945889698231009, - 0.690426638917794, - 0.6959764134582033, - 0.6888657648283039, - 0.7034339229968782, - 0.7010058966354492, - 0.7103711411723899, - 0.7065556711758585, - 0.7105445716267776, - 0.7133194588969823, - 0.7018730489073881, - 0.7089836975372875, - 0.7124523066250433, - 0.7129725979882068, - 0.7072493929934096, - 0.7043010752688172, - 0.7169614984391259, - 0.7114117238987167, - 0.7211238293444329, - 0.719389524800555, - 0.7134928893513701, - 0.7131460284425946, - 0.7171349288935137, - 0.7221644120707597, - 0.7166146375303504, - 0.7273673257023934, - 0.7190426638917794, - 0.7124523066250433, - 0.7271938952480056, - 0.7238987166146376, - 0.7167880679847382, - 0.7070759625390218, - 0.7278876170655567, - 0.723551855705862, - 0.7289281997918835, - 0.7155740548040236, - 0.7225112729795352, - 0.723551855705862, - 0.7263267429760666, - 0.7348248352410683, - 0.725979882067291, - 0.7282344779743323, - 0.7206035379812695, - 0.7232049947970863, - 0.7273673257023934, - 0.7315296566077003, - 0.7280610475199445, - 0.711064862989941, - 0.7337842525147416, - 0.723551855705862, - 0.7277141866111689, - 0.7230315643426986, - 0.7351716961498439, - 0.7261533125216788, - 0.7232049947970863 - ] - }, - "aipackage_modelDataPreprocessing": "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.", - "aipackage_safetyRiskAssesment": "low", - "aipackage_typeOfModel": "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" - }, - { - "type": "dataset", + "software_primaryPurpose": "application", + "comment": "Line level handwriting recognition model", + "ai_autonomyType": "no", + "ai_domain": "image recognition, optical character recognition, handwriting recognition", + "ai_hyperparameter": [ + { + "type": "DictionaryEntry", + "key": "cnn_kernel_vals", + "value": "[5, 5, 3, 3, 3]" + }, + { + "type": "DictionaryEntry", + "key": "cnn_nfeature_vals", + "value": "[1, 32, 64, 128, 128, 256]" + }, + { + "type": "DictionaryEntry", + "key": "cnn_stride_vals", + "value": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" + }, + { + "type": "DictionaryEntry", + "key": "cnn_pool_vals", + "value": "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" + }, + { + "type": "DictionaryEntry", + "key": "cnn_num_layers", + "value": "5" + }, + { + "type": "DictionaryEntry", + "key": "cnn_activation", + "value": "relu" + }, + { + "type": "DictionaryEntry", + "key": "cnn_padding", + "value": "SAME" + }, + { + "type": "DictionaryEntry", + "key": "cnn_pooling_layer_padding", + "value": "VALID" + }, + { + "type": "DictionaryEntry", + "key": "cnn_kernal_stddev", + "value": "0.1" + }, + { + "type": "DictionaryEntry", + "key": "cnn_conv2d_strides", + "value": "(1,1,1,1)" + }, + { + "type": "DictionaryEntry", + "key": "rnn_num_layers", + "value": "2" + }, + { + "type": "DictionaryEntry", + "key": "rnn_hidden_layers", + "value": "256" + }, + { + "type": "DictionaryEntry", + "key": "rnn_LSTM_state_is_tuple", + "value": "True" + }, + { + "type": "DictionaryEntry", + "key": "rnn_MultiRNNCell_state_is_tuple", + "value": "True" + }, + { + "type": "DictionaryEntry", + "key": "rnn_filters_sttdev", + "value": "0.1" + }, + { + "type": "DictionaryEntry", + "key": "rnn_output_rate", + "value": "1" + }, + { + "type": "DictionaryEntry", + "key": "rnn_output_padding", + "value": "SAME" + }, + { + "type": "DictionaryEntry", + "key": "loss", + "value": "CTCLoss" + }, + { + "type": "DictionaryEntry", + "key": "Decode", + "value": "CTCDecode" + }, + { + "type": "DictionaryEntry", + "key": "beam_serach_decoder_beam_width", + "value": "50" + }, + { + "type": "DictionaryEntry", + "key": "beam_search_scoring_mode", + "value": "Words" + }, + { + "type": "DictionaryEntry", + "key": "beam_search_smoothing", + "value": "0.1" + }, + { + "type": "DictionaryEntry", + "key": "beam_search_encoding", + "value": "UTF-8" + }, + { + "type": "DictionaryEntry", + "key": "optimizer", + "value": "RMSprop" + } + ], + "ai_informationAboutApplication": "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset.", + "ai_informationAboutTraining": "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long.", + "ai_metric": [ + { + "type": "DictionaryEntry", + "key": "charErrorRates", + "value": "[ 0.9838042269187987, 0.8809788654060067, 0.5203559510567297, 0.33205784204671857, 0.29054505005561737, 0.2439599555061179, 0.2181979977753059, 0.20262513904338153, 0.18593993325917688, 0.18740823136818688, 0.17259176863181314, 0.1646273637374861, 0.16347052280311458, 0.15830923248053394, 0.14696329254727475, 0.1495884315906563, 0.14197997775305896, 0.1457174638487208, 0.14189098998887653, 0.137174638487208, 0.13490545050055616, 0.13152391546162404, 0.13094549499443828, 0.1332146829810901, 0.13090100111234707, 0.1254282536151279, 0.12525027808676306, 0.12529477196885427, 0.12596218020022246, 0.12596218020022246, 0.12182424916573971, 0.12262513904338153, 0.11942157953281424, 0.12031145717463848, 0.11839822024471636, 0.11661846496106786, 0.12195773081201335, 0.11853170189099, 0.11608453837597331, 0.11719688542825361, 0.12048943270300334, 0.12088987764182425, 0.11599555061179088, 0.11781979977753058, 0.11506117908787541, 0.11546162402669632, 0.11692992213570634, 0.11790878754171301, 0.11612903225806452, 0.11412680756395996, 0.11688542825361513, 0.11101223581757508, 0.11568409343715239, 0.12017797552836484, 0.11350389321468297, 0.11541713014460511, 0.1181757508342603, 0.11875417130144605, 0.11105672969966629, 0.11350389321468297, 0.11234705228031146, 0.11688542825361513, 0.11461624026696329, 0.11154616240266964, 0.11359288097886541, 0.10914349276974417, 0.11283648498331479, 0.11332591768631813, 0.11394883203559511, 0.11492769744160178, 0.11119021134593993, 0.11145717463848721, 0.11265850945494994, 0.11804226918798665, 0.11092324805339265, 0.11648498331479422, 0.1135483870967742, 0.11599555061179088, 0.11154616240266964, 0.11279199110122358, 0.11421579532814238 ]" + }, + { + "type": "DictionaryEntry", + "key": "wordAccuracies", + "value": "[ 0.061394380853277836, 0.10353798126951093, 0.2443635102323968, 0.3935137010058966, 0.449531737773153, 0.5071106486298994, 0.5483870967741935, 0.5613943808532779, 0.5872355185570586, 0.591918140825529, 0.6122095039889005, 0.6184530003468609, 0.620013874436351, 0.6304197016996185, 0.6546999653139092, 0.6481096080471731, 0.6625043357613597, 0.654873395768297, 0.6626777662157475, 0.6722164412070759, 0.6758584807492196, 0.6833159902878946, 0.6817551161984045, 0.6770724939299341, 0.6855705861949358, 0.701179327089837, 0.6945889698231009, 0.690426638917794, 0.6959764134582033, 0.6888657648283039, 0.7034339229968782, 0.7010058966354492, 0.7103711411723899, 0.7065556711758585, 0.7105445716267776, 0.7133194588969823, 0.7018730489073881, 0.7089836975372875, 0.7124523066250433, 0.7129725979882068, 0.7072493929934096, 0.7043010752688172, 0.7169614984391259, 0.7114117238987167, 0.7211238293444329, 0.719389524800555, 0.7134928893513701, 0.7131460284425946, 0.7171349288935137, 0.7221644120707597, 0.7166146375303504, 0.7273673257023934, 0.7190426638917794, 0.7124523066250433, 0.7271938952480056, 0.7238987166146376, 0.7167880679847382, 0.7070759625390218, 0.7278876170655567, 0.723551855705862, 0.7289281997918835, 0.7155740548040236, 0.7225112729795352, 0.723551855705862, 0.7263267429760666, 0.7348248352410683, 0.725979882067291, 0.7282344779743323, 0.7206035379812695, 0.7232049947970863, 0.7273673257023934, 0.7315296566077003, 0.7280610475199445, 0.711064862989941, 0.7337842525147416, 0.723551855705862, 0.7277141866111689, 0.7230315643426986, 0.7351716961498439, 0.7261533125216788, 0.7232049947970863 ]" + } + ], + "ai_modelDataPreprocessing": "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.", + "ai_safetyRiskAssessment": "low", + "ai_typeOfModel": "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" + }, + { + "type": "dataset_DatasetPackage", "spdxId": "https://my-first-aibom.com/IAMdataset", - "creationinfo": ":_creationinfo", + "creationInfo": ":_creationinfo", "name": "IAMdataset", "builtTime": "1999-09-20T00:00:00Z", "originatedBy": "U. Marti and H. Bunke.", - "releaseTime": "NoAssertion", "software_downloadLocation": "https://fki.tic.heia-fr.ch/databases/iam-handwriting-database", - "software_primaryPurpose": "The IAM Handwriting Database contains forms of handwritten English text which can be used to train and test handwritten text recognizers and to perform writer identification and verification experiments.", + "software_primaryPurpose": "data", + "comment": "The IAM Handwriting Database contains forms of handwritten English text which can be used to train and test handwritten text recognizers and to perform writer identification and verification experiments.", "dataset_confidentialityLevel": "clear", - "dataset_datasetCollectionProcess": "It was decided to use the Lancaster - Oslo/Bergen corpus (LOB), a collection of 500 English texts, each consisting of about 2,000 words as a basis of our database. The LOB corpus is the British pendant to the Brown corpus, which has a structure similar to that of the\n LOB corpus. Then, we split the texts in the corpus into fragments of about three to six sentences with at least 50 words each. These text fragments were printed onto forms and we asked a number of persons to write the text printed on the forms by hand. We extracted the sentences of each text fragment from the corpus and generated a LATEX document containing the text and the structure of the form. The formatted documents were printed by a HP Laserjet 4000TN at a resolution of 600 dpi. Each form consists of four parts. The first part comprises the title “Sentence Database” and a number assigned to the text. The first character of this number shows which category the text belongs to,\n and the following two digits identify the text number. For example in Fig. 1, M01 indicates that the text on the form is extracted from text “01“ in the text category “Science fiction“. The next three digits show with which sentence the text starts. In the second part of the form, the text the individual persons were asked to write is printed. The third part of the form is a blank zone where the writers have to put in their handwriting. In the last part, the writer can voluntarily enter his or her name. All four parts are separated from each other by a horizontal line. This makes it easy to automatically extract the individual parts from a form. It was decided that the writers had to use rulers. These guiding lines, with 1.5 cm space between them, were printed on a separate sheet of paper which\n was put under the form. The writers were asked to use their every day writing in order to get the most natural and unconstrained way of writing. We also told the writers to stop writing, if there was not enough space left on the form to write the whole text. No restrictions were imposed on the writing instrument. Hence, text produced with a number of different writing instruments is included in the database (ballpoint pens, ink pens, and pencils, all with various stroke widths). The filled forms were scanned with a HP-Scanjet 6100 connected to a Sun Ultra 1. The software used to scan the data is xvscan version 1.62. It is an add-on to the wellknown image tool xv. The resolution was set to 300 dpi at a grey-level resolution of 8 bits. The images were saved in TIFF-format with LZW compression. Each form was\n completely scanned, including the printed and handwritten text. To create the label files, the text of a form was copied twice into the label file, once for the machine-printed text and once for the handwritten text. Then the line feeds were filled in manually. In some cases corrections were necessary, because the handwritten text did not exactly correspond to the printed text. These corrections include deletions, insertions, and changes of words so as to make the text in the label file of each form identical to the handwritten text. All corrections were done manually, but they did not take a long. Typically, only approximately 30s of manual processing time for the generation of the label files and the correction of errors were spent\n on each document, which is less than the time required for scanning.", + "dataset_dataCollectionProcess": "It was decided to use the Lancaster - Oslo/Bergen corpus (LOB), a collection of 500 English texts, each consisting of about 2,000 words as a basis of our database. The LOB corpus is the British pendant to the Brown corpus, which has a structure similar to that of the\n LOB corpus. Then, we split the texts in the corpus into fragments of about three to six sentences with at least 50 words each. These text fragments were printed onto forms and we asked a number of persons to write the text printed on the forms by hand. We extracted the sentences of each text fragment from the corpus and generated a LATEX document containing the text and the structure of the form. The formatted documents were printed by a HP Laserjet 4000TN at a resolution of 600 dpi. Each form consists of four parts. The first part comprises the title “Sentence Database” and a number assigned to the text. The first character of this number shows which category the text belongs to,\n and the following two digits identify the text number. For example in Fig. 1, M01 indicates that the text on the form is extracted from text “01“ in the text category “Science fiction“. The next three digits show with which sentence the text starts. In the second part of the form, the text the individual persons were asked to write is printed. The third part of the form is a blank zone where the writers have to put in their handwriting. In the last part, the writer can voluntarily enter his or her name. All four parts are separated from each other by a horizontal line. This makes it easy to automatically extract the individual parts from a form. It was decided that the writers had to use rulers. These guiding lines, with 1.5 cm space between them, were printed on a separate sheet of paper which\n was put under the form. The writers were asked to use their every day writing in order to get the most natural and unconstrained way of writing. We also told the writers to stop writing, if there was not enough space left on the form to write the whole text. No restrictions were imposed on the writing instrument. Hence, text produced with a number of different writing instruments is included in the database (ballpoint pens, ink pens, and pencils, all with various stroke widths). The filled forms were scanned with a HP-Scanjet 6100 connected to a Sun Ultra 1. The software used to scan the data is xvscan version 1.62. It is an add-on to the wellknown image tool xv. The resolution was set to 300 dpi at a grey-level resolution of 8 bits. The images were saved in TIFF-format with LZW compression. Each form was\n completely scanned, including the printed and handwritten text. To create the label files, the text of a form was copied twice into the label file, once for the machine-printed text and once for the handwritten text. Then the line feeds were filled in manually. In some cases corrections were necessary, because the handwritten text did not exactly correspond to the printed text. These corrections include deletions, insertions, and changes of words so as to make the text in the label file of each form identical to the handwritten text. All corrections were done manually, but they did not take a long. Typically, only approximately 30s of manual processing time for the generation of the label files and the correction of errors were spent\n on each document, which is less than the time required for scanning.", "dataset_dataPreprocessing": "First, the skew of the document is corrected. Then the positions of the three horizontal lines are computed by a projection method. Given this positional information the handwriting is extracted. Next, the handwritten text is segmented into text lines. Finally, each text line\n is segmented into individual words. To find the first horizontal line, the form is scanned top-down in the middle of the image. The first black pixel found is assumed to belong to the first horizontal line.\n By following the line to the left and to the right, the end points of the line are found. Once the left and right end of the first horizontal line has been determined, its angle is used to correct the skew of the whole document by a rotation. Then, the form is segmented into its four main parts (see Sect. 2). This is a relatively easy task because the four parts are separated from each other by very long\n horizontal lines, which are easy to detect by horizontal projection. To make the projection algorithm more robust, not only the horizontal projection profile is considered, but also the value of the longest horizontal black run in each row. A horizontal line separating two parts from each other is characterized by a value in the horizontal grey-value projection histogram greater than a threshold t and a value of the longest horizontal black run greater than a threshold t\n (see Fig. 5). After all three horizontal lines have been found, we are able to extract the part of the form that contains the handwriting. Over the whole database the handwritten zone was automatically extracted by means of this procedure without any\n error. The next step in preprocessing is to cut the text into\n individual lines. For this purpose a histogram of the horizontal black/white transitions is used. In this histogram we look for local minima. If the value at a local minimum is zero, a cut has been found that does not touch any word. If the value is greater than zero, we have found a position where we can horizontally cut the image with a minimal number of intersections with strokes belonging to words of the previous or the following text line. To handle intersections of this kind a method based on the center of gravity is used. If the center of gravity of the connected component that is cut is in the range of the\n previous (the following) text line, the connected component is assumed to belong to that text line. If the center of gravity is near the cutting line, the component is cut into two parts, one belonging to the previous and one to the following text line. With this method we could extract almost all text lines correctly. Only in about 1.2% (113 of 9157) of the lines did errors occur. The 113 segmentation errors can be classified into acceptable and serious errors. An acceptable error is defined as one where only single punctuation marks or i-dots are assigned to the wrong line, but no cut component. By contrast, parts of letters or words assigned to the wrong text line are considered serious errors. There were 52 acceptable and 61serious errors out of a total of 113. The correction of these errors is left to\n the user of the database. That is, no attempts were made\n to include any manual corrections of the segmentation errors in the database. To segment the text lines into single words, a method\n similar to those described in the paper 'External word segmentation of off-line handwritten text lines.'' and the paper 'Gap metrics for\n word separation in handwritten lines' is used. Because a word can be split into several components, the goal is to cluster the connected components of a text line image into words. First, the convex hull and the center of gravity of each connected component in a line of text is\n computed. Then for each pair of connected components, c1 and c2, the straight line segment s that connects the center of gravity of c1 with the center of gravity of c2 is considered. The distance d between the two points where s intersects the convex hull of c1 and c2 is determined. This distance d is assigned to s as a weight. A graphical illustration is shown in Fig. 7. By means of this procedure, a completely connected and weighted graph is obtained, where each node corresponds to a connected component in the image and the weight on an edge represents the distance between two connected components. Given such a graph, its minimum spanning tree is computed. Finally, all distances that occur as weights on the edges of the minimum spanning tree are clustered into two groups, namely, intra-word and inter-word distance. For this purpose, Otsu's thresholding algorithm is used, which yields a threshold t. Any two connected components, c1\n and c2, that are linked by an edge in the minimum spanning tree with a weight d ≤ t are considered to be part of the same word. By contrast, if the weight d is larger than t, c1 and c2 are regarded as belonging to two different words. Applied on 541 text lines with 3,899 words,\n a correct word extraction of 94.92%, with 3.62% of the words over- and 1.46% undersegmented, was achieved. The primary goal of the preprocessing and segmentation procedures described in this section is to support the labeling of the text. However, these procedures can be\n integrated in any recognizer as well. All procedures have been implemented in C++ and can be compiled under Unix/Solaris and Linux. To actually run the procedures only the TIFF library for image read and write, but no other software utilities are needed.", "dataset_datasetAvailability": "registration", - "dataset_datasetSize": "4620000000", + "dataset_datasetSize": 4620000000, "dataset_datasetType": "image", "dataset_intendedUse": "For line level or word level character recognition", - "dataset_sensor": { - "printer": "HP Laserjet 4000TN", - "scanner": "HP-Scanjet 6100" - } + "dataset_sensor": [ + { + "type": "DictionaryEntry", + "key": "printer", + "value": "HP Laserjet 4000TN" + }, + { + "type": "DictionaryEntry", + "key": "scanner", + "value": "HP-Scanjet 6100" + } + ] }, { "type": "Relationship", @@ -1378,7 +1268,7 @@ ] }, { - "type": "software_sbom", + "type": "software_Sbom", "spdxId": "https://my-first-aibom.com/BOM1", "creationInfo": "_:creationinfo", "rootElement": [ @@ -1392,4 +1282,4 @@ ] } ] -} +} \ No newline at end of file From a48ed90d58f6c73d2552ab281e4845ee5a63499c Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Thu, 6 Jun 2024 05:44:35 +0100 Subject: [PATCH 04/11] Add custom license for IAM database Signed-off-by: Arthit Suriyawongkul --- ai/simpleHTR-example.json | 40 ++ ai/simpleHTR-example.json.puml | 849 +++++++++++++++++++++++++++++++++ 2 files changed, 889 insertions(+) create mode 100644 ai/simpleHTR-example.json.puml diff --git a/ai/simpleHTR-example.json b/ai/simpleHTR-example.json index ff9b251..d6e52db 100644 --- a/ai/simpleHTR-example.json +++ b/ai/simpleHTR-example.json @@ -1280,6 +1280,46 @@ "software_sbomType": [ "analyzed" ] + }, + { + "type": "expandedlicensing_CustomLicense", + "spdxId": "https://spdx.org/spdxdocs/CustomLicense-c63547c2-62e0-48ec-b98d-ff1b917d67db", + "creationInfo": "_:creationinfo", + "simplelicensing_licenseText": "This database may be used for non-commercial research purpose only. If you publish material based on this database, we request you to include a reference to paper. U. Marti and H. Bunke. The IAM-database: An English Sentence Database for Off-line Handwriting Recognition. Int. Journal on Document Analysis and Recognition, Volume 5, pages 39 - 46, 2002.", + "expandedlicensing_isFsfLibre": false, + "expandedlicensing_isOsiApproved": false + }, + { + "type": "Relationship", + "spdxId": "https://spdx.org/spdxdocs/Relationship/declaredLicense-2c9563dc-baa1-4385-be02-ad671976a8aa", + "creationInfo": "_:creationinfo", + "relationshipType": "hasDeclaredLicense", + "from": "https://my-first-aibom.com/IAMdataset", + "to": "https://spdx.org/spdxdocs/CustomLicense-c63547c2-62e0-48ec-b98d-ff1b917d67db" + }, + { + "type": "Relationship", + "spdxId": "https://spdx.org/spdxdocs/Relationship/concludedLicense-3bcfa4ce-6a65-46e8-bed1-18985211bb9e", + "creationInfo": "_:creationinfo", + "relationshipType": "hasConcludedLicense", + "from": "https://my-first-aibom.com/IAMdataset", + "to": "https://spdx.org/spdxdocs/CustomLicense-c63547c2-62e0-48ec-b98d-ff1b917d67db" + }, + { + "type": "Relationship", + "spdxId": "https://spdx.org/spdxdocs/Relationship/declaredLicense-6f9cae4f-b015-473b-a87c-4a330c589331", + "creationInfo": "_:creationinfo", + "relationshipType": "hasDeclaredLicense", + "from": "https://my-first-aibom.com/SimpleHTR", + "to": "MIT" + }, + { + "type": "Relationship", + "spdxId": "https://spdx.org/spdxdocs/Relationship/concludedLicense-7ea6e28f-eead-4b56-8376-282e2d31397b", + "creationInfo": "_:creationinfo", + "relationshipType": "hasConcludedLicense", + "from": "https://my-first-aibom.com/SimpleHTR", + "to": "MIT" } ] } \ No newline at end of file diff --git a/ai/simpleHTR-example.json.puml b/ai/simpleHTR-example.json.puml new file mode 100644 index 0000000..60e769b --- /dev/null +++ b/ai/simpleHTR-example.json.puml @@ -0,0 +1,849 @@ +@startuml +Package "simpleHTR-example.json" as 8090585aee4ce9a3a59a5a8fff7a30af { +object "/model/line-model/summary.json\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o1 +object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o2 +object "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o3 +object "line-model\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o4 +object "/model/line-model/CharList.txt\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o5 +object "/model/line-model/checkpoint\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o6 +object "/model/line-model/snapshot-13.data-00000-of-00001\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o7 +object "/model/line-model/snapshot-13.index\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o8 +object "/model/line-model/snapshot-13.meta\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o9 +object "/doc/graphics.svg\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o10 +object "lmdb\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o11 +object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o12 +object "/data/word.png\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o13 +object "line-model\nai_AIPackage" as 8090585aee4ce9a3a59a5a8fff7a30af_o14 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o15 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o16 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o17 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o18 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o19 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o20 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o21 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o22 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o23 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o24 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o25 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o26 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o27 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o28 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o29 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o30 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o31 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o32 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o33 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o34 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o35 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o36 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o37 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o38 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o39 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o40 +object "Gopi Krishnan Rajbahadur\nPerson" as 8090585aee4ce9a3a59a5a8fff7a30af_o41 +object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o42 +object "ExternalIdentifier" as 8090585aee4ce9a3a59a5a8fff7a30af_o43 +object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o44 +object "https://my-first-aibom.com/word-model-trained-on\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o45 +object "word-model\nai_AIPackage" as 8090585aee4ce9a3a59a5a8fff7a30af_o46 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o47 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o48 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o49 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o50 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o51 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o52 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o53 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o54 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o55 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o56 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o57 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o58 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o59 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o60 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o61 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o62 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o63 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o64 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o65 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o66 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o67 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o68 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o69 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o70 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o71 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o72 +object "IAMdataset\ndataset_DatasetPackage" as 8090585aee4ce9a3a59a5a8fff7a30af_o73 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o74 +object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o75 +object "/data/line.png\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o76 +object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o77 +object "https://my-first-aibom.com/word-model-tested-on\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o78 +object "/master/LICENSE.md\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o79 +object "/data\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o80 +object "https://github.com/githubharald/SimpleHTR/tree/master/src- contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o81 +object "/src\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o82 +object "/src/main.py\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o83 +object "/src/create_lmdb.py\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o84 +object "/src/dataloader_iam.py\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o85 +object "/src/model.py\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o86 +object "/src/preprocessor.py\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o87 +object "simpleHTR\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o88 +object "opencv-python\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o89 +object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o90 +object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o91 +object "/model\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o92 +object "https://my-first-aibom.com/BOM1\nsoftware_Sbom" as 8090585aee4ce9a3a59a5a8fff7a30af_o93 +object "/doc/decoder_comparision.png\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o94 +object "editdistance\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o95 +object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o96 +object "lmdb\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o97 +object "https://my-first-aibom.com/SimpleHTR-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o98 +object "/doc\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o99 +object "/master/.gitignore\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o100 +object "/master/README.md\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o101 +object "/master/requirements.txt\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o102 +object "https://my-first-aibom.com/SimpleHTR-depends-on\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o103 +object "tensorflow\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o104 +object "path\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o105 +object "numpy\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o106 +object "https://github.com/githubharald/SimpleHTR/tree/master/doc-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o107 +object "/doc/htr.png\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o108 +object "https://spdx.org/spdxdocs/CustomLicense-c63547c2-62e0-48ec-b98d-ff1b917d67db\nexpandedlicensing_CustomLicense" as 8090585aee4ce9a3a59a5a8fff7a30af_o109 +object "https://spdx.org/spdxdocs/Relationship/declaredLicense-2c9563dc-baa1-4385-be02-ad671976a8aa\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o110 +object "https://github.com/githubharald/SimpleHTR/tree/master/model-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o111 +object "word-model\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o112 +object "/model/wordCharList.txt\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o113 +object "/model/.gitignore\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o114 +object "https://my-first-aibom.com/line-model-tested-on\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o115 +object "https://spdx.org/spdxdocs/Relationship/concludedLicense-7ea6e28f-eead-4b56-8376-282e2d31397b\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o116 +object "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o117 +object "/model/word-model/CharList.txt\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o118 +object "/model/word-model/checkpoint\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o119 +object "/model/word-model/snapshot-33.data-00000-of-00001\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o120 +object "/model/word-model/snapshot-33.index\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o121 +object "/model/word-model/snapshot-33.meta\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o122 +object "/model/word-model/summary.json\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o123 +object "https://github.com/githubharald/SimpleHTR/tree/master/data-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o124 +object "/data/corpus.txt\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o125 +object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o126 +object "https://my-first-aibom.com/document1\nSpdxDocument" as 8090585aee4ce9a3a59a5a8fff7a30af_o127 +object "https://spdx.org/spdxdocs/Relationship/concludedLicense-3bcfa4ce-6a65-46e8-bed1-18985211bb9e\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o128 +object "https://my-first-aibom.com/line-model-trained-on\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o129 +object "https://spdx.org/spdxdocs/Relationship/declaredLicense-6f9cae4f-b015-473b-a87c-4a330c589331\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o130 +} +8090585aee4ce9a3a59a5a8fff7a30af_o1 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/summary.json" +8090585aee4ce9a3a59a5a8fff7a30af_o1 : comment = "Records the character level error rates of each letter in a json format" +8090585aee4ce9a3a59a5a8fff7a30af_o2 : created = 2023-08-07 00:00:00+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o2 : createdBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o2 : specVersion = "3.0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o1::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o1 : name = "/model/line-model/summary.json" +8090585aee4ce9a3a59a5a8fff7a30af_o1 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o1 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o1 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/evidence" +8090585aee4ce9a3a59a5a8fff7a30af_o1 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o3 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model-contains" +8090585aee4ce9a3a59a5a8fff7a30af_o3::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o4 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model" +8090585aee4ce9a3a59a5a8fff7a30af_o4 : comment = "This file is not present at the source repo in VCS, but the users of the application are required to download it from the specified download location and present make it a part of the ./model/ directory" +8090585aee4ce9a3a59a5a8fff7a30af_o4::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o4 : description = "The simpleHTR application uses two AI models which is distributed as a Zip file. This model is a line-level handwriting recognition model" +8090585aee4ce9a3a59a5a8fff7a30af_o4 : name = "line-model" +8090585aee4ce9a3a59a5a8fff7a30af_o4 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o4 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/archive'] +8090585aee4ce9a3a59a5a8fff7a30af_o4 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o4 : software_downloadLocation = "https://www.dropbox.com/s/7xwkcilho10rthn/line-model.zip?dl=1" +8090585aee4ce9a3a59a5a8fff7a30af_o4 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o3::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o3 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" +8090585aee4ce9a3a59a5a8fff7a30af_o5 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/charList" +8090585aee4ce9a3a59a5a8fff7a30af_o5 : comment = "Configuration/parameter file for the beam search decoder of the model" +8090585aee4ce9a3a59a5a8fff7a30af_o5::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o5 : name = "/model/line-model/CharList.txt" +8090585aee4ce9a3a59a5a8fff7a30af_o5 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o5 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/configuration'] +8090585aee4ce9a3a59a5a8fff7a30af_o5 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o5 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o5 : to +8090585aee4ce9a3a59a5a8fff7a30af_o6 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/checkpoint" +8090585aee4ce9a3a59a5a8fff7a30af_o6 : comment = "Saved checkpoint of the model" +8090585aee4ce9a3a59a5a8fff7a30af_o6::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o6 : name = "/model/line-model/checkpoint" +8090585aee4ce9a3a59a5a8fff7a30af_o6 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o6 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o6 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o6 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o6 : to +8090585aee4ce9a3a59a5a8fff7a30af_o7 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.data-00000-of-00001" +8090585aee4ce9a3a59a5a8fff7a30af_o7 : comment = "Actual values of all variables that make up the line level handwriting recognition AI model" +8090585aee4ce9a3a59a5a8fff7a30af_o7::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o7 : name = "/model/line-model/snapshot-13.data-00000-of-00001" +8090585aee4ce9a3a59a5a8fff7a30af_o7 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o7 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o7 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o7 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o7 : to +8090585aee4ce9a3a59a5a8fff7a30af_o8 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.index" +8090585aee4ce9a3a59a5a8fff7a30af_o8 : comment = "The name and shape of all the variables that make up the line level handwriting recognition AI model thier actual data is stored in /model/line-model/snapshot-13.index" +8090585aee4ce9a3a59a5a8fff7a30af_o8::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o8 : name = "/model/line-model/snapshot-13.index" +8090585aee4ce9a3a59a5a8fff7a30af_o8 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o8 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o8 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o8 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o8 : to +8090585aee4ce9a3a59a5a8fff7a30af_o9 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.meta" +8090585aee4ce9a3a59a5a8fff7a30af_o9 : comment = "Its a file storing all the information required to restore a training or information process including the graph that describes the data flow and additional annotations that describes the variables, input pipelines and other relevant information" +8090585aee4ce9a3a59a5a8fff7a30af_o9::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o9 : name = "/model/line-model/snapshot-13.meta" +8090585aee4ce9a3a59a5a8fff7a30af_o9 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o9 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o9 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o9 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o9 : to +8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o1 : to +8090585aee4ce9a3a59a5a8fff7a30af_o10 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/doc/graphics" +8090585aee4ce9a3a59a5a8fff7a30af_o10 : comment = "An image that shows documentation related information for simpleHTR options" +8090585aee4ce9a3a59a5a8fff7a30af_o10::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o10 : name = "/doc/graphics.svg" +8090585aee4ce9a3a59a5a8fff7a30af_o10 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o10 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o10 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" +8090585aee4ce9a3a59a5a8fff7a30af_o10 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o11 : spdxId = "https://pypi.org/project/lmdb/1.0.0/" +8090585aee4ce9a3a59a5a8fff7a30af_o12 : created = 2020-08-28 00:00:00+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o12 : createdBy = ['https://pypi.org/user/dw/', 'https://pypi.org/user/jnwatson/'] +8090585aee4ce9a3a59a5a8fff7a30af_o12 : specVersion = "3.0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o11::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o12 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o11 : description = "This is a universal Python binding for the LMDB ‘Lightning’ Database." +8090585aee4ce9a3a59a5a8fff7a30af_o11 : name = "lmdb" +8090585aee4ce9a3a59a5a8fff7a30af_o11 : originatedBy = ['https://pypi.org/user/dw/', 'https://pypi.org/user/jnwatson/'] +8090585aee4ce9a3a59a5a8fff7a30af_o11 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" +8090585aee4ce9a3a59a5a8fff7a30af_o11 : software_downloadLocation = "https://pypi.org/project/lmdb/1.0.0/" +8090585aee4ce9a3a59a5a8fff7a30af_o11 : software_homePage = "https://github.com/jnwatson/py-lmdb/" +8090585aee4ce9a3a59a5a8fff7a30af_o11 : software_packageVersion = "1.0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o13 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/data/word" +8090585aee4ce9a3a59a5a8fff7a30af_o13 : comment = "An example image to test the model's word level character recognition capability" +8090585aee4ce9a3a59a5a8fff7a30af_o13::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o13 : name = "/data/word.png" +8090585aee4ce9a3a59a5a8fff7a30af_o13 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o13 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o13 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data" +8090585aee4ce9a3a59a5a8fff7a30af_o13 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o14 : spdxId = "https://my-first-aibom.com/line-model" +8090585aee4ce9a3a59a5a8fff7a30af_o14 : comment = "Line level handwriting recognition model" +8090585aee4ce9a3a59a5a8fff7a30af_o14 : creationInfo = ":_creationinfo" +8090585aee4ce9a3a59a5a8fff7a30af_o14 : name = "line-model" +8090585aee4ce9a3a59a5a8fff7a30af_o14 : releaseTime = 2023-09-07 00:00:00+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o14 : suppliedBy = "https://github.com/githubharald" +8090585aee4ce9a3a59a5a8fff7a30af_o14 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/application" +8090585aee4ce9a3a59a5a8fff7a30af_o14 : software_downloadLocation = "https://www.dropbox.com/s/mya8hw6jyzqm0a3/word-model.zip?dl=1" +8090585aee4ce9a3a59a5a8fff7a30af_o14 : software_packageVersion = "0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_autonomyType = "https://spdx.org/rdf/3.0.0/terms/Core/PresenceType/no" +8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_domain = ['image recognition, optical character recognition, handwriting recognition'] +8090585aee4ce9a3a59a5a8fff7a30af_o15 : key = "cnn_kernel_vals" +8090585aee4ce9a3a59a5a8fff7a30af_o15 : value = "[5, 5, 3, 3, 3]" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o15 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o16 : key = "cnn_nfeature_vals" +8090585aee4ce9a3a59a5a8fff7a30af_o16 : value = "[1, 32, 64, 128, 128, 256]" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o16 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o17 : key = "cnn_stride_vals" +8090585aee4ce9a3a59a5a8fff7a30af_o17 : value = "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o17 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o18 : key = "cnn_pool_vals" +8090585aee4ce9a3a59a5a8fff7a30af_o18 : value = "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o18 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o19 : key = "cnn_num_layers" +8090585aee4ce9a3a59a5a8fff7a30af_o19 : value = "5" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o19 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o20 : key = "cnn_activation" +8090585aee4ce9a3a59a5a8fff7a30af_o20 : value = "relu" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o20 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o21 : key = "cnn_padding" +8090585aee4ce9a3a59a5a8fff7a30af_o21 : value = "SAME" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o21 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o22 : key = "cnn_pooling_layer_padding" +8090585aee4ce9a3a59a5a8fff7a30af_o22 : value = "VALID" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o22 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o23 : key = "cnn_kernal_stddev" +8090585aee4ce9a3a59a5a8fff7a30af_o23 : value = "0.1" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o23 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o24 : key = "cnn_conv2d_strides" +8090585aee4ce9a3a59a5a8fff7a30af_o24 : value = "(1,1,1,1)" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o24 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o25 : key = "rnn_num_layers" +8090585aee4ce9a3a59a5a8fff7a30af_o25 : value = "2" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o25 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o26 : key = "rnn_hidden_layers" +8090585aee4ce9a3a59a5a8fff7a30af_o26 : value = "256" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o26 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o27 : key = "rnn_LSTM_state_is_tuple" +8090585aee4ce9a3a59a5a8fff7a30af_o27 : value = "True" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o27 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o28 : key = "rnn_MultiRNNCell_state_is_tuple" +8090585aee4ce9a3a59a5a8fff7a30af_o28 : value = "True" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o28 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o29 : key = "rnn_filters_sttdev" +8090585aee4ce9a3a59a5a8fff7a30af_o29 : value = "0.1" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o29 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o30 : key = "rnn_output_rate" +8090585aee4ce9a3a59a5a8fff7a30af_o30 : value = "1" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o30 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o31 : key = "rnn_output_padding" +8090585aee4ce9a3a59a5a8fff7a30af_o31 : value = "SAME" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o31 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o32 : key = "loss" +8090585aee4ce9a3a59a5a8fff7a30af_o32 : value = "CTCLoss" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o32 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o33 : key = "Decode" +8090585aee4ce9a3a59a5a8fff7a30af_o33 : value = "CTCDecode" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o33 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o34 : key = "beam_serach_decoder_beam_width" +8090585aee4ce9a3a59a5a8fff7a30af_o34 : value = "50" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o34 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o35 : key = "beam_search_scoring_mode" +8090585aee4ce9a3a59a5a8fff7a30af_o35 : value = "Words" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o35 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o36 : key = "beam_search_smoothing" +8090585aee4ce9a3a59a5a8fff7a30af_o36 : value = "0.1" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o36 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o37 : key = "beam_search_encoding" +8090585aee4ce9a3a59a5a8fff7a30af_o37 : value = "UTF-8" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o37 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o38 : key = "optimizer" +8090585aee4ce9a3a59a5a8fff7a30af_o38 : value = "RMSprop" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o38 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_informationAboutApplication = "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset." +8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_informationAboutTraining = "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long." +8090585aee4ce9a3a59a5a8fff7a30af_o39 : key = "charErrorRates" +8090585aee4ce9a3a59a5a8fff7a30af_o39 : value = "[ 0.9838042269187987, 0.8809788654060067, 0.5203559510567297, 0.33205784204671857, 0.29054505005561737, 0.2439599555061179, 0.2181979977753059, 0.20262513904338153, 0.18593993325917688, 0.18740823136818688, 0.17259176863181314, 0.1646273637374861, 0.16347052280311458, 0.15830923248053394, 0.14696329254727475, 0.1495884315906563, 0.14197997775305896, 0.1457174638487208, 0.14189098998887653, 0.137174638487208, 0.13490545050055616, 0.13152391546162404, 0.13094549499443828, 0.1332146829810901, 0.13090100111234707, 0.1254282536151279, 0.12525027808676306, 0.12529477196885427, 0.12596218020022246, 0.12596218020022246, 0.12182424916573971, 0.12262513904338153, 0.11942157953281424, 0.12031145717463848, 0.11839822024471636, 0.11661846496106786, 0.12195773081201335, 0.11853170189099, 0.11608453837597331, 0.11719688542825361, 0.12048943270300334, 0.12088987764182425, 0.11599555061179088, 0.11781979977753058, 0.11506117908787541, 0.11546162402669632, 0.11692992213570634, 0.11790878754171301, 0.11612903225806452, 0.11412680756395996, 0.11688542825361513, 0.11101223581757508, 0.11568409343715239, 0.12017797552836484, 0.11350389321468297, 0.11541713014460511, 0.1181757508342603, 0.11875417130144605, 0.11105672969966629, 0.11350389321468297, 0.11234705228031146, 0.11688542825361513, 0.11461624026696329, 0.11154616240266964, 0.11359288097886541, 0.10914349276974417, 0.11283648498331479, 0.11332591768631813, 0.11394883203559511, 0.11492769744160178, 0.11119021134593993, 0.11145717463848721, 0.11265850945494994, 0.11804226918798665, 0.11092324805339265, 0.11648498331479422, 0.1135483870967742, 0.11599555061179088, 0.11154616240266964, 0.11279199110122358, 0.11421579532814238 ]" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_metric --> 8090585aee4ce9a3a59a5a8fff7a30af_o39 : ai_metric +8090585aee4ce9a3a59a5a8fff7a30af_o40 : key = "wordAccuracies" +8090585aee4ce9a3a59a5a8fff7a30af_o40 : value = "[ 0.061394380853277836, 0.10353798126951093, 0.2443635102323968, 0.3935137010058966, 0.449531737773153, 0.5071106486298994, 0.5483870967741935, 0.5613943808532779, 0.5872355185570586, 0.591918140825529, 0.6122095039889005, 0.6184530003468609, 0.620013874436351, 0.6304197016996185, 0.6546999653139092, 0.6481096080471731, 0.6625043357613597, 0.654873395768297, 0.6626777662157475, 0.6722164412070759, 0.6758584807492196, 0.6833159902878946, 0.6817551161984045, 0.6770724939299341, 0.6855705861949358, 0.701179327089837, 0.6945889698231009, 0.690426638917794, 0.6959764134582033, 0.6888657648283039, 0.7034339229968782, 0.7010058966354492, 0.7103711411723899, 0.7065556711758585, 0.7105445716267776, 0.7133194588969823, 0.7018730489073881, 0.7089836975372875, 0.7124523066250433, 0.7129725979882068, 0.7072493929934096, 0.7043010752688172, 0.7169614984391259, 0.7114117238987167, 0.7211238293444329, 0.719389524800555, 0.7134928893513701, 0.7131460284425946, 0.7171349288935137, 0.7221644120707597, 0.7166146375303504, 0.7273673257023934, 0.7190426638917794, 0.7124523066250433, 0.7271938952480056, 0.7238987166146376, 0.7167880679847382, 0.7070759625390218, 0.7278876170655567, 0.723551855705862, 0.7289281997918835, 0.7155740548040236, 0.7225112729795352, 0.723551855705862, 0.7263267429760666, 0.7348248352410683, 0.725979882067291, 0.7282344779743323, 0.7206035379812695, 0.7232049947970863, 0.7273673257023934, 0.7315296566077003, 0.7280610475199445, 0.711064862989941, 0.7337842525147416, 0.723551855705862, 0.7277141866111689, 0.7230315643426986, 0.7351716961498439, 0.7261533125216788, 0.7232049947970863 ]" +8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_metric --> 8090585aee4ce9a3a59a5a8fff7a30af_o40 : ai_metric +8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_modelDataPreprocessing = ['Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.'] +8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_safetyRiskAssessment = "https://spdx.org/rdf/3.0.0/terms/AI/SafetyRiskAssessmentType/low" +8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_typeOfModel = ['Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path'] +8090585aee4ce9a3a59a5a8fff7a30af_o41 : spdxId = "https://my-first-aibom.com/gopi" +8090585aee4ce9a3a59a5a8fff7a30af_o42 : created = 2024-05-09 13:50:30+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o42::createdBy --> 8090585aee4ce9a3a59a5a8fff7a30af_o41 : createdBy +8090585aee4ce9a3a59a5a8fff7a30af_o42 : specVersion = "3.0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o41::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o43 : externalIdentifierType = "https://spdx.org/rdf/3.0.0/terms/Core/ExternalIdentifierType/email" +8090585aee4ce9a3a59a5a8fff7a30af_o43 : identifier = "iamironman@616.com" +8090585aee4ce9a3a59a5a8fff7a30af_o41::externalIdentifier --> 8090585aee4ce9a3a59a5a8fff7a30af_o43 : externalIdentifier +8090585aee4ce9a3a59a5a8fff7a30af_o41 : name = "Gopi Krishnan Rajbahadur" +8090585aee4ce9a3a59a5a8fff7a30af_o44 : created = 2020-07-27 00:00:00+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o44 : createdBy = ['https://pypi.org/user/jaraco/'] +8090585aee4ce9a3a59a5a8fff7a30af_o44 : specVersion = "3.0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o45 : spdxId = "https://my-first-aibom.com/word-model-trained-on" +8090585aee4ce9a3a59a5a8fff7a30af_o45::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o46 : spdxId = "https://my-first-aibom.com/word-model" +8090585aee4ce9a3a59a5a8fff7a30af_o46 : comment = "Word level handwriting recognition model" +8090585aee4ce9a3a59a5a8fff7a30af_o46 : creationInfo = ":_creationinfo" +8090585aee4ce9a3a59a5a8fff7a30af_o46 : name = "word-model" +8090585aee4ce9a3a59a5a8fff7a30af_o46 : releaseTime = 2023-09-07 00:00:00+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o46 : suppliedBy = "https://github.com/githubharald" +8090585aee4ce9a3a59a5a8fff7a30af_o46 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/application" +8090585aee4ce9a3a59a5a8fff7a30af_o46 : software_downloadLocation = "https://www.dropbox.com/s/mya8hw6jyzqm0a3/word-model.zip?dl=1" +8090585aee4ce9a3a59a5a8fff7a30af_o46 : software_packageVersion = "0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_autonomyType = "https://spdx.org/rdf/3.0.0/terms/Core/PresenceType/no" +8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_domain = ['image recognition, optical character recognition, handwriting recognition'] +8090585aee4ce9a3a59a5a8fff7a30af_o47 : key = "cnn_kernel_vals" +8090585aee4ce9a3a59a5a8fff7a30af_o47 : value = "[5, 5, 3, 3, 3]" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o47 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o48 : key = "cnn_nfeature_vals" +8090585aee4ce9a3a59a5a8fff7a30af_o48 : value = "[1, 32, 64, 128, 128, 256]" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o48 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o49 : key = "cnn_stride_vals" +8090585aee4ce9a3a59a5a8fff7a30af_o49 : value = "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o49 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o50 : key = "cnn_pool_vals" +8090585aee4ce9a3a59a5a8fff7a30af_o50 : value = "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o50 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o51 : key = "cnn_num_layers" +8090585aee4ce9a3a59a5a8fff7a30af_o51 : value = "5" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o51 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o52 : key = "cnn_activation" +8090585aee4ce9a3a59a5a8fff7a30af_o52 : value = "relu" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o52 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o53 : key = "cnn_padding" +8090585aee4ce9a3a59a5a8fff7a30af_o53 : value = "SAME" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o53 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o54 : key = "cnn_pooling_layer_padding" +8090585aee4ce9a3a59a5a8fff7a30af_o54 : value = "VALID" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o54 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o55 : key = "cnn_kernal_stddev" +8090585aee4ce9a3a59a5a8fff7a30af_o55 : value = "0.1" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o55 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o56 : key = "cnn_conv2d_strides" +8090585aee4ce9a3a59a5a8fff7a30af_o56 : value = "(1,1,1,1)" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o56 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o57 : key = "rnn_num_layers" +8090585aee4ce9a3a59a5a8fff7a30af_o57 : value = "2" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o57 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o58 : key = "rnn_hidden_layers" +8090585aee4ce9a3a59a5a8fff7a30af_o58 : value = "256" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o58 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o59 : key = "rnn_LSTM_state_is_tuple" +8090585aee4ce9a3a59a5a8fff7a30af_o59 : value = "True" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o59 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o60 : key = "rnn_MultiRNNCell_state_is_tuple" +8090585aee4ce9a3a59a5a8fff7a30af_o60 : value = "True" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o60 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o61 : key = "rnn_filters_sttdev" +8090585aee4ce9a3a59a5a8fff7a30af_o61 : value = "0.1" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o61 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o62 : key = "rnn_output_rate" +8090585aee4ce9a3a59a5a8fff7a30af_o62 : value = "1" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o62 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o63 : key = "rnn_output_padding" +8090585aee4ce9a3a59a5a8fff7a30af_o63 : value = "SAME" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o63 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o64 : key = "loss" +8090585aee4ce9a3a59a5a8fff7a30af_o64 : value = "CTCLoss" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o64 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o65 : key = "Decode" +8090585aee4ce9a3a59a5a8fff7a30af_o65 : value = "CTCDecode" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o65 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o66 : key = "beam_serach_decoder_beam_width" +8090585aee4ce9a3a59a5a8fff7a30af_o66 : value = "50" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o66 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o67 : key = "beam_search_scoring_mode" +8090585aee4ce9a3a59a5a8fff7a30af_o67 : value = "Words" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o67 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o68 : key = "beam_search_smoothing" +8090585aee4ce9a3a59a5a8fff7a30af_o68 : value = "0.1" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o68 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o69 : key = "beam_search_encoding" +8090585aee4ce9a3a59a5a8fff7a30af_o69 : value = "UTF-8" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o69 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o70 : key = "optimizer" +8090585aee4ce9a3a59a5a8fff7a30af_o70 : value = "RMSprop" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o70 : ai_hyperparameter +8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_informationAboutApplication = "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset." +8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_informationAboutTraining = "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long." +8090585aee4ce9a3a59a5a8fff7a30af_o71 : key = "charErrorRates" +8090585aee4ce9a3a59a5a8fff7a30af_o71 : value = "[ 0.9838042269187987, 0.8809788654060067, 0.5203559510567297, 0.33205784204671857, 0.29054505005561737, 0.2439599555061179, 0.2181979977753059, 0.20262513904338153, 0.18593993325917688, 0.18740823136818688, 0.17259176863181314, 0.1646273637374861, 0.16347052280311458, 0.15830923248053394, 0.14696329254727475, 0.1495884315906563, 0.14197997775305896, 0.1457174638487208, 0.14189098998887653, 0.137174638487208, 0.13490545050055616, 0.13152391546162404, 0.13094549499443828, 0.1332146829810901, 0.13090100111234707, 0.1254282536151279, 0.12525027808676306, 0.12529477196885427, 0.12596218020022246, 0.12596218020022246, 0.12182424916573971, 0.12262513904338153, 0.11942157953281424, 0.12031145717463848, 0.11839822024471636, 0.11661846496106786, 0.12195773081201335, 0.11853170189099, 0.11608453837597331, 0.11719688542825361, 0.12048943270300334, 0.12088987764182425, 0.11599555061179088, 0.11781979977753058, 0.11506117908787541, 0.11546162402669632, 0.11692992213570634, 0.11790878754171301, 0.11612903225806452, 0.11412680756395996, 0.11688542825361513, 0.11101223581757508, 0.11568409343715239, 0.12017797552836484, 0.11350389321468297, 0.11541713014460511, 0.1181757508342603, 0.11875417130144605, 0.11105672969966629, 0.11350389321468297, 0.11234705228031146, 0.11688542825361513, 0.11461624026696329, 0.11154616240266964, 0.11359288097886541, 0.10914349276974417, 0.11283648498331479, 0.11332591768631813, 0.11394883203559511, 0.11492769744160178, 0.11119021134593993, 0.11145717463848721, 0.11265850945494994, 0.11804226918798665, 0.11092324805339265, 0.11648498331479422, 0.1135483870967742, 0.11599555061179088, 0.11154616240266964, 0.11279199110122358, 0.11421579532814238 ]" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_metric --> 8090585aee4ce9a3a59a5a8fff7a30af_o71 : ai_metric +8090585aee4ce9a3a59a5a8fff7a30af_o72 : key = "wordAccuracies" +8090585aee4ce9a3a59a5a8fff7a30af_o72 : value = "[ 0.061394380853277836, 0.10353798126951093, 0.2443635102323968, 0.3935137010058966, 0.449531737773153, 0.5071106486298994, 0.5483870967741935, 0.5613943808532779, 0.5872355185570586, 0.591918140825529, 0.6122095039889005, 0.6184530003468609, 0.620013874436351, 0.6304197016996185, 0.6546999653139092, 0.6481096080471731, 0.6625043357613597, 0.654873395768297, 0.6626777662157475, 0.6722164412070759, 0.6758584807492196, 0.6833159902878946, 0.6817551161984045, 0.6770724939299341, 0.6855705861949358, 0.701179327089837, 0.6945889698231009, 0.690426638917794, 0.6959764134582033, 0.6888657648283039, 0.7034339229968782, 0.7010058966354492, 0.7103711411723899, 0.7065556711758585, 0.7105445716267776, 0.7133194588969823, 0.7018730489073881, 0.7089836975372875, 0.7124523066250433, 0.7129725979882068, 0.7072493929934096, 0.7043010752688172, 0.7169614984391259, 0.7114117238987167, 0.7211238293444329, 0.719389524800555, 0.7134928893513701, 0.7131460284425946, 0.7171349288935137, 0.7221644120707597, 0.7166146375303504, 0.7273673257023934, 0.7190426638917794, 0.7124523066250433, 0.7271938952480056, 0.7238987166146376, 0.7167880679847382, 0.7070759625390218, 0.7278876170655567, 0.723551855705862, 0.7289281997918835, 0.7155740548040236, 0.7225112729795352, 0.723551855705862, 0.7263267429760666, 0.7348248352410683, 0.725979882067291, 0.7282344779743323, 0.7206035379812695, 0.7232049947970863, 0.7273673257023934, 0.7315296566077003, 0.7280610475199445, 0.711064862989941, 0.7337842525147416, 0.723551855705862, 0.7277141866111689, 0.7230315643426986, 0.7351716961498439, 0.7261533125216788, 0.7232049947970863 ]" +8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_metric --> 8090585aee4ce9a3a59a5a8fff7a30af_o72 : ai_metric +8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_modelDataPreprocessing = ['Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.'] +8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_safetyRiskAssessment = "https://spdx.org/rdf/3.0.0/terms/AI/SafetyRiskAssessmentType/low" +8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_typeOfModel = ['Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path'] +8090585aee4ce9a3a59a5a8fff7a30af_o46 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o45::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o45 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/trainedOn" +8090585aee4ce9a3a59a5a8fff7a30af_o73 : spdxId = "https://my-first-aibom.com/IAMdataset" +8090585aee4ce9a3a59a5a8fff7a30af_o73 : comment = "The IAM Handwriting Database contains forms of handwritten English text which can be used to train and test handwritten text recognizers and to perform writer identification and verification experiments." +8090585aee4ce9a3a59a5a8fff7a30af_o73 : creationInfo = ":_creationinfo" +8090585aee4ce9a3a59a5a8fff7a30af_o73 : name = "IAMdataset" +8090585aee4ce9a3a59a5a8fff7a30af_o73 : builtTime = 1999-09-20 00:00:00+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o73 : originatedBy = ['U. Marti and H. Bunke.'] +8090585aee4ce9a3a59a5a8fff7a30af_o73 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data" +8090585aee4ce9a3a59a5a8fff7a30af_o73 : software_downloadLocation = "https://fki.tic.heia-fr.ch/databases/iam-handwriting-database" +8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_confidentialityLevel = "https://spdx.org/rdf/3.0.0/terms/Dataset/ConfidentialityLevelType/clear" +8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_dataCollectionProcess = "It was decided to use the Lancaster - Oslo/Bergen corpus (LOB), a collection of 500 English texts, each consisting of about 2,000 words as a basis of our database. The LOB corpus is the British pendant to the Brown corpus, which has a structure similar to that of the\n LOB corpus. Then, we split the texts in the corpus into fragments of about three to six sentences with at least 50 words each. These text fragments were printed onto forms and we asked a number of persons to write the text printed on the forms by hand. We extracted the sentences of each text fragment from the corpus and generated a LATEX document containing the text and the structure of the form. The formatted documents were printed by a HP Laserjet 4000TN at a resolution of 600 dpi. Each form consists of four parts. The first part comprises the title “Sentence Database” and a number assigned to the text. The first character of this number shows which category the text belongs to,\n and the following two digits identify the text number. For example in Fig. 1, M01 indicates that the text on the form is extracted from text “01“ in the text category “Science fiction“. The next three digits show with which sentence the text starts. In the second part of the form, the text the individual persons were asked to write is printed. The third part of the form is a blank zone where the writers have to put in their handwriting. In the last part, the writer can voluntarily enter his or her name. All four parts are separated from each other by a horizontal line. This makes it easy to automatically extract the individual parts from a form. It was decided that the writers had to use rulers. These guiding lines, with 1.5 cm space between them, were printed on a separate sheet of paper which\n was put under the form. The writers were asked to use their every day writing in order to get the most natural and unconstrained way of writing. We also told the writers to stop writing, if there was not enough space left on the form to write the whole text. No restrictions were imposed on the writing instrument. Hence, text produced with a number of different writing instruments is included in the database (ballpoint pens, ink pens, and pencils, all with various stroke widths). The filled forms were scanned with a HP-Scanjet 6100 connected to a Sun Ultra 1. The software used to scan the data is xvscan version 1.62. It is an add-on to the wellknown image tool xv. The resolution was set to 300 dpi at a grey-level resolution of 8 bits. The images were saved in TIFF-format with LZW compression. Each form was\n completely scanned, including the printed and handwritten text. To create the label files, the text of a form was copied twice into the label file, once for the machine-printed text and once for the handwritten text. Then the line feeds were filled in manually. In some cases corrections were necessary, because the handwritten text did not exactly correspond to the printed text. These corrections include deletions, insertions, and changes of words so as to make the text in the label file of each form identical to the handwritten text. All corrections were done manually, but they did not take a long. Typically, only approximately 30s of manual processing time for the generation of the label files and the correction of errors were spent\n on each document, which is less than the time required for scanning." +8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_dataPreprocessing = ["First, the skew of the document is corrected. Then the positions of the three horizontal lines are computed by a projection method. Given this positional information the handwriting is extracted. Next, the handwritten text is segmented into text lines. Finally, each text line\n is segmented into individual words. To find the first horizontal line, the form is scanned top-down in the middle of the image. The first black pixel found is assumed to belong to the first horizontal line.\n By following the line to the left and to the right, the end points of the line are found. Once the left and right end of the first horizontal line has been determined, its angle is used to correct the skew of the whole document by a rotation. Then, the form is segmented into its four main parts (see Sect. 2). This is a relatively easy task because the four parts are separated from each other by very long\n horizontal lines, which are easy to detect by horizontal projection. To make the projection algorithm more robust, not only the horizontal projection profile is considered, but also the value of the longest horizontal black run in each row. A horizontal line separating two parts from each other is characterized by a value in the horizontal grey-value projection histogram greater than a threshold t and a value of the longest horizontal black run greater than a threshold t\n (see Fig. 5). After all three horizontal lines have been found, we are able to extract the part of the form that contains the handwriting. Over the whole database the handwritten zone was automatically extracted by means of this procedure without any\n error. The next step in preprocessing is to cut the text into\n individual lines. For this purpose a histogram of the horizontal black/white transitions is used. In this histogram we look for local minima. If the value at a local minimum is zero, a cut has been found that does not touch any word. If the value is greater than zero, we have found a position where we can horizontally cut the image with a minimal number of intersections with strokes belonging to words of the previous or the following text line. To handle intersections of this kind a method based on the center of gravity is used. If the center of gravity of the connected component that is cut is in the range of the\n previous (the following) text line, the connected component is assumed to belong to that text line. If the center of gravity is near the cutting line, the component is cut into two parts, one belonging to the previous and one to the following text line. With this method we could extract almost all text lines correctly. Only in about 1.2% (113 of 9157) of the lines did errors occur. The 113 segmentation errors can be classified into acceptable and serious errors. An acceptable error is defined as one where only single punctuation marks or i-dots are assigned to the wrong line, but no cut component. By contrast, parts of letters or words assigned to the wrong text line are considered serious errors. There were 52 acceptable and 61serious errors out of a total of 113. The correction of these errors is left to\n the user of the database. That is, no attempts were made\n to include any manual corrections of the segmentation errors in the database. To segment the text lines into single words, a method\n similar to those described in the paper 'External word segmentation of off-line handwritten text lines.'' and the paper 'Gap metrics for\n word separation in handwritten lines' is used. Because a word can be split into several components, the goal is to cluster the connected components of a text line image into words. First, the convex hull and the center of gravity of each connected component in a line of text is\n computed. Then for each pair of connected components, c1 and c2, the straight line segment s that connects the center of gravity of c1 with the center of gravity of c2 is considered. The distance d between the two points where s intersects the convex hull of c1 and c2 is determined. This distance d is assigned to s as a weight. A graphical illustration is shown in Fig. 7. By means of this procedure, a completely connected and weighted graph is obtained, where each node corresponds to a connected component in the image and the weight on an edge represents the distance between two connected components. Given such a graph, its minimum spanning tree is computed. Finally, all distances that occur as weights on the edges of the minimum spanning tree are clustered into two groups, namely, intra-word and inter-word distance. For this purpose, Otsu's thresholding algorithm is used, which yields a threshold t. Any two connected components, c1\n and c2, that are linked by an edge in the minimum spanning tree with a weight d ≤ t are considered to be part of the same word. By contrast, if the weight d is larger than t, c1 and c2 are regarded as belonging to two different words. Applied on 541 text lines with 3,899 words,\n a correct word extraction of 94.92%, with 3.62% of the words over- and 1.46% undersegmented, was achieved. The primary goal of the preprocessing and segmentation procedures described in this section is to support the labeling of the text. However, these procedures can be\n integrated in any recognizer as well. All procedures have been implemented in C++ and can be compiled under Unix/Solaris and Linux. To actually run the procedures only the TIFF library for image read and write, but no other software utilities are needed."] +8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_datasetAvailability = "https://spdx.org/rdf/3.0.0/terms/Dataset/DatasetAvailabilityType/registration" +8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_datasetSize = 4620000000 +8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_datasetType = ['https://spdx.org/rdf/3.0.0/terms/Dataset/DatasetType/image'] +8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_intendedUse = "For line level or word level character recognition" +8090585aee4ce9a3a59a5a8fff7a30af_o74 : key = "printer" +8090585aee4ce9a3a59a5a8fff7a30af_o74 : value = "HP Laserjet 4000TN" +8090585aee4ce9a3a59a5a8fff7a30af_o73::dataset_sensor --> 8090585aee4ce9a3a59a5a8fff7a30af_o74 : dataset_sensor +8090585aee4ce9a3a59a5a8fff7a30af_o75 : key = "scanner" +8090585aee4ce9a3a59a5a8fff7a30af_o75 : value = "HP-Scanjet 6100" +8090585aee4ce9a3a59a5a8fff7a30af_o73::dataset_sensor --> 8090585aee4ce9a3a59a5a8fff7a30af_o75 : dataset_sensor +8090585aee4ce9a3a59a5a8fff7a30af_o45::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o73 : to +8090585aee4ce9a3a59a5a8fff7a30af_o76 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/data/line" +8090585aee4ce9a3a59a5a8fff7a30af_o76 : comment = "An example image to test the model's line level character recognition capability" +8090585aee4ce9a3a59a5a8fff7a30af_o76::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o76 : name = "/data/line.png" +8090585aee4ce9a3a59a5a8fff7a30af_o76 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o76 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o76 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data" +8090585aee4ce9a3a59a5a8fff7a30af_o76 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o77 : created = 2021-01-05 00:00:00+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o77 : createdBy = ['https://pypi.org/user/charlesr.harris/', 'https://pypi.org/user/matthew.brett/', 'https://pypi.org/user/mattip/', 'https://pypi.org/user/rgommers/', 'https://pypi.org/user/teoliphant/'] +8090585aee4ce9a3a59a5a8fff7a30af_o77 : specVersion = "3.0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o78 : spdxId = "https://my-first-aibom.com/word-model-tested-on" +8090585aee4ce9a3a59a5a8fff7a30af_o78::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o46 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o78::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o78 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/testedOn" +8090585aee4ce9a3a59a5a8fff7a30af_o78::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o73 : to +8090585aee4ce9a3a59a5a8fff7a30af_o79 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/LICENSE" +8090585aee4ce9a3a59a5a8fff7a30af_o79 : comment = "License of the software" +8090585aee4ce9a3a59a5a8fff7a30af_o79::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o79 : name = "/master/LICENSE.md" +8090585aee4ce9a3a59a5a8fff7a30af_o79 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o79 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o79 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" +8090585aee4ce9a3a59a5a8fff7a30af_o79 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o80 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/data" +8090585aee4ce9a3a59a5a8fff7a30af_o80 : comment = "This directory contains all the data and examples required to train the simpleHTR AI model" +8090585aee4ce9a3a59a5a8fff7a30af_o80::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o80 : name = "/data" +8090585aee4ce9a3a59a5a8fff7a30af_o80 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o80 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data" +8090585aee4ce9a3a59a5a8fff7a30af_o80 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/directory" +8090585aee4ce9a3a59a5a8fff7a30af_o81 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src- contains" +8090585aee4ce9a3a59a5a8fff7a30af_o81::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o82 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src" +8090585aee4ce9a3a59a5a8fff7a30af_o82 : comment = "This directory contains all the source code files that is required for simpleHTR application" +8090585aee4ce9a3a59a5a8fff7a30af_o82::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o82 : name = "/src" +8090585aee4ce9a3a59a5a8fff7a30af_o82 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o82 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source" +8090585aee4ce9a3a59a5a8fff7a30af_o82 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/directory" +8090585aee4ce9a3a59a5a8fff7a30af_o82 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o81::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o81 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" +8090585aee4ce9a3a59a5a8fff7a30af_o83 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src/main" +8090585aee4ce9a3a59a5a8fff7a30af_o83 : comment = "This file is the main entry point for execution of the Handwriting recognition application. " +8090585aee4ce9a3a59a5a8fff7a30af_o83::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o83 : name = "/src/main.py" +8090585aee4ce9a3a59a5a8fff7a30af_o83 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o83 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source'] +8090585aee4ce9a3a59a5a8fff7a30af_o83 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/executable" +8090585aee4ce9a3a59a5a8fff7a30af_o83 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o81::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o83 : to +8090585aee4ce9a3a59a5a8fff7a30af_o84 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src/create_lmdb" +8090585aee4ce9a3a59a5a8fff7a30af_o84 : comment = "This file is to store images into lmdb as pickled grayscale images" +8090585aee4ce9a3a59a5a8fff7a30af_o84::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o84 : name = "/src/create_lmdb.py" +8090585aee4ce9a3a59a5a8fff7a30af_o84 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o84 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source'] +8090585aee4ce9a3a59a5a8fff7a30af_o84 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/executable" +8090585aee4ce9a3a59a5a8fff7a30af_o84 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o81::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o84 : to +8090585aee4ce9a3a59a5a8fff7a30af_o85 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src/dataloader_iam" +8090585aee4ce9a3a59a5a8fff7a30af_o85 : comment = "Loads data which corresponds to IAM format" +8090585aee4ce9a3a59a5a8fff7a30af_o85::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o85 : name = "/src/dataloader_iam.py" +8090585aee4ce9a3a59a5a8fff7a30af_o85 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o85 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source'] +8090585aee4ce9a3a59a5a8fff7a30af_o85 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/executable" +8090585aee4ce9a3a59a5a8fff7a30af_o85 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o81::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o85 : to +8090585aee4ce9a3a59a5a8fff7a30af_o86 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src/model" +8090585aee4ce9a3a59a5a8fff7a30af_o86 : comment = "Source code for the AI model that is used in this application" +8090585aee4ce9a3a59a5a8fff7a30af_o86::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o86 : name = "/src/model.py" +8090585aee4ce9a3a59a5a8fff7a30af_o86 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o86 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/executable'] +8090585aee4ce9a3a59a5a8fff7a30af_o86 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o86 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o81::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o86 : to +8090585aee4ce9a3a59a5a8fff7a30af_o87 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src/preprocessor" +8090585aee4ce9a3a59a5a8fff7a30af_o87 : comment = "Source code for preprocessing the data that is used for training and testing the model" +8090585aee4ce9a3a59a5a8fff7a30af_o87::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o87 : name = "/src/preprocessor.py" +8090585aee4ce9a3a59a5a8fff7a30af_o87 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o87 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/executable'] +8090585aee4ce9a3a59a5a8fff7a30af_o87 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source" +8090585aee4ce9a3a59a5a8fff7a30af_o87 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o81::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o87 : to +8090585aee4ce9a3a59a5a8fff7a30af_o88 : spdxId = "https://my-first-aibom.com/SimpleHTR" +8090585aee4ce9a3a59a5a8fff7a30af_o88::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o88 : name = "simpleHTR" +8090585aee4ce9a3a59a5a8fff7a30af_o88 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o88 : software_downloadLocation = "https://github.com/githubharald/SimpleHTR/tree/master" +8090585aee4ce9a3a59a5a8fff7a30af_o89 : spdxId = "https://pypi.org/project/opencv-python/4.4.0.46/" +8090585aee4ce9a3a59a5a8fff7a30af_o90 : created = 2020-11-02 00:00:00+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o90 : createdBy = ['https://pypi.org/user/andrey.senyaev/', 'https://pypi.org/user/asmorkalov/', 'https://pypi.org/user/sergregory/', 'https://pypi.org/user/skvark/'] +8090585aee4ce9a3a59a5a8fff7a30af_o90 : specVersion = "3.0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o89::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o90 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o89 : description = "Pre-built CPU-only OpenCV packages for Python." +8090585aee4ce9a3a59a5a8fff7a30af_o89 : name = "opencv-python" +8090585aee4ce9a3a59a5a8fff7a30af_o89 : originatedBy = ['https://pypi.org/user/andrey.senyaev/', 'https://pypi.org/user/asmorkalov/', 'https://pypi.org/user/sergregory/', 'https://pypi.org/user/skvark/'] +8090585aee4ce9a3a59a5a8fff7a30af_o89 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" +8090585aee4ce9a3a59a5a8fff7a30af_o89 : software_downloadLocation = "https://pypi.org/project/opencv-python/4.4.0.46/" +8090585aee4ce9a3a59a5a8fff7a30af_o89 : software_homePage = "https://github.com/opencv/opencv-python" +8090585aee4ce9a3a59a5a8fff7a30af_o89 : software_packageVersion = "4.4.0.46" +8090585aee4ce9a3a59a5a8fff7a30af_o91 : created = 2020-12-14 00:00:00+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o91 : createdBy = ['https://pypi.org/user/mihaimaruseac/', 'https://pypi.org/user/rishikasinha/', 'https://pypi.org/user/rostam/', 'https://pypi.org/user/tf-nightly/'] +8090585aee4ce9a3a59a5a8fff7a30af_o91 : specVersion = "3.0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o92 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model" +8090585aee4ce9a3a59a5a8fff7a30af_o92 : comment = "This directory contains several images required for documentation" +8090585aee4ce9a3a59a5a8fff7a30af_o92::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o92 : name = "/model" +8090585aee4ce9a3a59a5a8fff7a30af_o92 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o92 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library'] +8090585aee4ce9a3a59a5a8fff7a30af_o92 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o92 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/directory" +8090585aee4ce9a3a59a5a8fff7a30af_o93 : spdxId = "https://my-first-aibom.com/BOM1" +8090585aee4ce9a3a59a5a8fff7a30af_o93::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o93 : element = ['TO BE ADDED LATER'] +8090585aee4ce9a3a59a5a8fff7a30af_o93::rootElement --> 8090585aee4ce9a3a59a5a8fff7a30af_o88 : rootElement +8090585aee4ce9a3a59a5a8fff7a30af_o93 : software_sbomType = ['https://spdx.org/rdf/3.0.0/terms/Software/SbomType/analyzed'] +8090585aee4ce9a3a59a5a8fff7a30af_o94 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/doc/decoder_comparision" +8090585aee4ce9a3a59a5a8fff7a30af_o94 : comment = "An image that shows documentation related information for simpleHTR options" +8090585aee4ce9a3a59a5a8fff7a30af_o94::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o94 : name = "/doc/decoder_comparision.png" +8090585aee4ce9a3a59a5a8fff7a30af_o94 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o94 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o94 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" +8090585aee4ce9a3a59a5a8fff7a30af_o94 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o95 : spdxId = "https://pypi.org/project/editdistance/0.5.2/" +8090585aee4ce9a3a59a5a8fff7a30af_o96 : created = 2018-09-17 00:00:00+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o96 : createdBy = ['https://pypi.org/user/aflc/'] +8090585aee4ce9a3a59a5a8fff7a30af_o96 : specVersion = "3.0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o95::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o96 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o95 : description = "This library simply implements Levenshtein distance with C++ and Cython." +8090585aee4ce9a3a59a5a8fff7a30af_o95 : name = "editdistance" +8090585aee4ce9a3a59a5a8fff7a30af_o95 : originatedBy = ['https://pypi.org/user/aflc/'] +8090585aee4ce9a3a59a5a8fff7a30af_o95 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" +8090585aee4ce9a3a59a5a8fff7a30af_o95 : software_downloadLocation = "https://pypi.org/project/editdistance/0.5.2/" +8090585aee4ce9a3a59a5a8fff7a30af_o95 : software_homePage = "https://github.com/roy-ht/editdistance" +8090585aee4ce9a3a59a5a8fff7a30af_o95 : software_packageVersion = "0.5.2" +8090585aee4ce9a3a59a5a8fff7a30af_o97 : spdxId = "https://pypi.org/project/matplotlib/3.2.1/" +8090585aee4ce9a3a59a5a8fff7a30af_o97 : creationInfo = "_:creationinfo_of_matplotlib" +8090585aee4ce9a3a59a5a8fff7a30af_o97 : description = "Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python." +8090585aee4ce9a3a59a5a8fff7a30af_o97 : name = "lmdb" +8090585aee4ce9a3a59a5a8fff7a30af_o97 : originatedBy = ['https://pypi.org/org/matplotlib/'] +8090585aee4ce9a3a59a5a8fff7a30af_o97 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" +8090585aee4ce9a3a59a5a8fff7a30af_o97 : software_downloadLocation = "https://pypi.org/project/matplotlib/3.2.1/" +8090585aee4ce9a3a59a5a8fff7a30af_o97 : software_homePage = "https://matplotlib.org/" +8090585aee4ce9a3a59a5a8fff7a30af_o97 : software_packageVersion = "3.2.1" +8090585aee4ce9a3a59a5a8fff7a30af_o98 : spdxId = "https://my-first-aibom.com/SimpleHTR-contains" +8090585aee4ce9a3a59a5a8fff7a30af_o98::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o88 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o98::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o98 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" +8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o82 : to +8090585aee4ce9a3a59a5a8fff7a30af_o99 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/doc" +8090585aee4ce9a3a59a5a8fff7a30af_o99 : comment = "This directory contains several images required for documentation" +8090585aee4ce9a3a59a5a8fff7a30af_o99::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o99 : name = "/doc" +8090585aee4ce9a3a59a5a8fff7a30af_o99 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o99 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" +8090585aee4ce9a3a59a5a8fff7a30af_o99 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/directory" +8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o99 : to +8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o92 : to +8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o80 : to +8090585aee4ce9a3a59a5a8fff7a30af_o100 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/.gitignore" +8090585aee4ce9a3a59a5a8fff7a30af_o100 : comment = "The git ignore file for the directory" +8090585aee4ce9a3a59a5a8fff7a30af_o100::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o100 : name = "/master/.gitignore" +8090585aee4ce9a3a59a5a8fff7a30af_o100 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o100 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/other" +8090585aee4ce9a3a59a5a8fff7a30af_o100 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o100 : to +8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o79 : to +8090585aee4ce9a3a59a5a8fff7a30af_o101 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/README" +8090585aee4ce9a3a59a5a8fff7a30af_o101 : comment = "The overall documentation and getting started of the document" +8090585aee4ce9a3a59a5a8fff7a30af_o101::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o101 : name = "/master/README.md" +8090585aee4ce9a3a59a5a8fff7a30af_o101 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o101 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o101 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" +8090585aee4ce9a3a59a5a8fff7a30af_o101 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o101 : to +8090585aee4ce9a3a59a5a8fff7a30af_o102 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/requirements" +8090585aee4ce9a3a59a5a8fff7a30af_o102 : comment = "Lists the external package dependencies that are required to be satisfied for the application to execute" +8090585aee4ce9a3a59a5a8fff7a30af_o102::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o102 : name = "/master/requirements.txt" +8090585aee4ce9a3a59a5a8fff7a30af_o102 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o102 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o102 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/requirement" +8090585aee4ce9a3a59a5a8fff7a30af_o102 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o102 : to +8090585aee4ce9a3a59a5a8fff7a30af_o103 : spdxId = "https://my-first-aibom.com/SimpleHTR-depends-on" +8090585aee4ce9a3a59a5a8fff7a30af_o103::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o88 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o103::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o103 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/dependsOn" +8090585aee4ce9a3a59a5a8fff7a30af_o104 : spdxId = "https://pypi.org/project/tensorflow/2.4.0/" +8090585aee4ce9a3a59a5a8fff7a30af_o104::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o91 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o104 : description = "TensorFlow is an open source software library for high performance numerical computation. Its flexible architecture allows easy deployment of computation across a variety of platforms (CPUs, GPUs, TPUs), and from desktops to clusters of servers to mobile and edge devices." +8090585aee4ce9a3a59a5a8fff7a30af_o104 : name = "tensorflow" +8090585aee4ce9a3a59a5a8fff7a30af_o104 : originatedBy = ['https://pypi.org/user/jaraco/'] +8090585aee4ce9a3a59a5a8fff7a30af_o104 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" +8090585aee4ce9a3a59a5a8fff7a30af_o104 : software_downloadLocation = "https://pypi.org/project/tensorflow/2.4.0/" +8090585aee4ce9a3a59a5a8fff7a30af_o104 : software_homePage = "https://www.tensorflow.org/" +8090585aee4ce9a3a59a5a8fff7a30af_o104 : software_packageVersion = "2.4.0" +8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o104 : to +8090585aee4ce9a3a59a5a8fff7a30af_o105 : spdxId = "https://pypi.org/project/path/15.0.0/" +8090585aee4ce9a3a59a5a8fff7a30af_o105::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o44 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o105 : description = "path (aka path pie, formerly path.py) implements path objects as first-class entities, allowing common operations on files to be invoked on those path objects directly" +8090585aee4ce9a3a59a5a8fff7a30af_o105 : name = "path" +8090585aee4ce9a3a59a5a8fff7a30af_o105 : originatedBy = ['https://pypi.org/user/jaraco/'] +8090585aee4ce9a3a59a5a8fff7a30af_o105 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" +8090585aee4ce9a3a59a5a8fff7a30af_o105 : software_downloadLocation = "https://pypi.org/project/path/15.0.0/" +8090585aee4ce9a3a59a5a8fff7a30af_o105 : software_homePage = "https://github.com/jaraco/path" +8090585aee4ce9a3a59a5a8fff7a30af_o105 : software_packageVersion = "15.0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o105 : to +8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o89 : to +8090585aee4ce9a3a59a5a8fff7a30af_o106 : spdxId = "https://pypi.org/project/numpy/1.19.5/" +8090585aee4ce9a3a59a5a8fff7a30af_o106 : creationInfo = "_:creationinfo_of_matplotlib" +8090585aee4ce9a3a59a5a8fff7a30af_o106 : description = "NumPy is the fundamental package for scientific computing with Python." +8090585aee4ce9a3a59a5a8fff7a30af_o106 : name = "numpy" +8090585aee4ce9a3a59a5a8fff7a30af_o106 : originatedBy = ['https://pypi.org/user/charlesr.harris/', 'https://pypi.org/user/matthew.brett/', 'https://pypi.org/user/mattip/', 'https://pypi.org/user/rgommers/', 'https://pypi.org/user/teoliphant/'] +8090585aee4ce9a3a59a5a8fff7a30af_o106 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" +8090585aee4ce9a3a59a5a8fff7a30af_o106 : software_downloadLocation = "https://pypi.org/project/numpy/1.19.5/" +8090585aee4ce9a3a59a5a8fff7a30af_o106 : software_homePage = "https://numpy.org/" +8090585aee4ce9a3a59a5a8fff7a30af_o106 : software_packageVersion = "1.19.5" +8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o106 : to +8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o97 : to +8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o11 : to +8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o95 : to +8090585aee4ce9a3a59a5a8fff7a30af_o107 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/doc-contains" +8090585aee4ce9a3a59a5a8fff7a30af_o107::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o99 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o107::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o107 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" +8090585aee4ce9a3a59a5a8fff7a30af_o107::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o94 : to +8090585aee4ce9a3a59a5a8fff7a30af_o107::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o10 : to +8090585aee4ce9a3a59a5a8fff7a30af_o108 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/doc/htr" +8090585aee4ce9a3a59a5a8fff7a30af_o108 : comment = "An image that shows documentation related information for simpleHTR options" +8090585aee4ce9a3a59a5a8fff7a30af_o108::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o108 : name = "/doc/htr.png" +8090585aee4ce9a3a59a5a8fff7a30af_o108 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o108 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o108 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" +8090585aee4ce9a3a59a5a8fff7a30af_o108 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o107::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o108 : to +8090585aee4ce9a3a59a5a8fff7a30af_o109 : spdxId = "https://spdx.org/spdxdocs/CustomLicense-c63547c2-62e0-48ec-b98d-ff1b917d67db" +8090585aee4ce9a3a59a5a8fff7a30af_o109::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o109 : expandedlicensing_isFsfLibre = False +8090585aee4ce9a3a59a5a8fff7a30af_o109 : expandedlicensing_isOsiApproved = False +8090585aee4ce9a3a59a5a8fff7a30af_o109 : simplelicensing_licenseText = "This database may be used for non-commercial research purpose only. If you publish material based on this database, we request you to include a reference to paper. U. Marti and H. Bunke. The IAM-database: An English Sentence Database for Off-line Handwriting Recognition. Int. Journal on Document Analysis and Recognition, Volume 5, pages 39 - 46, 2002." +8090585aee4ce9a3a59a5a8fff7a30af_o110 : spdxId = "https://spdx.org/spdxdocs/Relationship/declaredLicense-2c9563dc-baa1-4385-be02-ad671976a8aa" +8090585aee4ce9a3a59a5a8fff7a30af_o110::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o73 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o110::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o110 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/hasDeclaredLicense" +8090585aee4ce9a3a59a5a8fff7a30af_o110::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o109 : to +8090585aee4ce9a3a59a5a8fff7a30af_o111 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model-contains" +8090585aee4ce9a3a59a5a8fff7a30af_o111::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o92 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o111::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o111 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" +8090585aee4ce9a3a59a5a8fff7a30af_o111::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o4 : to +8090585aee4ce9a3a59a5a8fff7a30af_o112 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model" +8090585aee4ce9a3a59a5a8fff7a30af_o112 : comment = "This file is not present at the source repo in VCS, but the users of the application are required to download it from the specified download location and present make it a part of the ./model/ directory" +8090585aee4ce9a3a59a5a8fff7a30af_o112::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o112 : description = "The simpleHTR application uses two AI models which is distributed as a Zip file. This model is a word -level handwriting recognition model" +8090585aee4ce9a3a59a5a8fff7a30af_o112 : name = "word-model" +8090585aee4ce9a3a59a5a8fff7a30af_o112 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o112 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/archive'] +8090585aee4ce9a3a59a5a8fff7a30af_o112 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o112 : software_downloadLocation = "https://www.dropbox.com/s/7xwkcilho10rthn/word-model.zip?dl=1" +8090585aee4ce9a3a59a5a8fff7a30af_o111::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o112 : to +8090585aee4ce9a3a59a5a8fff7a30af_o113 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/wordCharList" +8090585aee4ce9a3a59a5a8fff7a30af_o113 : comment = "Configuration/parameter file for the beam search decoder of the model" +8090585aee4ce9a3a59a5a8fff7a30af_o113::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o113 : name = "/model/wordCharList.txt" +8090585aee4ce9a3a59a5a8fff7a30af_o113 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o113 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o113 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/configuration" +8090585aee4ce9a3a59a5a8fff7a30af_o113 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o111::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o113 : to +8090585aee4ce9a3a59a5a8fff7a30af_o114 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/.gitignore" +8090585aee4ce9a3a59a5a8fff7a30af_o114 : comment = "The gitignore file for the directory" +8090585aee4ce9a3a59a5a8fff7a30af_o114::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o114 : name = "/model/.gitignore" +8090585aee4ce9a3a59a5a8fff7a30af_o114 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o114 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/other" +8090585aee4ce9a3a59a5a8fff7a30af_o114 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o111::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o114 : to +8090585aee4ce9a3a59a5a8fff7a30af_o115 : spdxId = "https://my-first-aibom.com/line-model-tested-on" +8090585aee4ce9a3a59a5a8fff7a30af_o115::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o14 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o115::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o115 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/testedOn" +8090585aee4ce9a3a59a5a8fff7a30af_o115::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o73 : to +8090585aee4ce9a3a59a5a8fff7a30af_o116 : spdxId = "https://spdx.org/spdxdocs/Relationship/concludedLicense-7ea6e28f-eead-4b56-8376-282e2d31397b" +8090585aee4ce9a3a59a5a8fff7a30af_o116::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o88 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o116::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o116 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/hasConcludedLicense" +8090585aee4ce9a3a59a5a8fff7a30af_o116 : to = ['MIT'] +8090585aee4ce9a3a59a5a8fff7a30af_o117 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model-contains" +8090585aee4ce9a3a59a5a8fff7a30af_o117::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o112 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o117::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o117 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" +8090585aee4ce9a3a59a5a8fff7a30af_o118 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/charList" +8090585aee4ce9a3a59a5a8fff7a30af_o118 : comment = "Configuration/parameter file for the beam search decoder of the model" +8090585aee4ce9a3a59a5a8fff7a30af_o118::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o118 : name = "/model/word-model/CharList.txt" +8090585aee4ce9a3a59a5a8fff7a30af_o118 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o118 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/configuration'] +8090585aee4ce9a3a59a5a8fff7a30af_o118 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o118 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o118 : to +8090585aee4ce9a3a59a5a8fff7a30af_o119 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/checkpoint" +8090585aee4ce9a3a59a5a8fff7a30af_o119 : comment = "Saved checkpoint of the model" +8090585aee4ce9a3a59a5a8fff7a30af_o119::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o119 : name = "/model/word-model/checkpoint" +8090585aee4ce9a3a59a5a8fff7a30af_o119 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o119 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o119 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o119 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o119 : to +8090585aee4ce9a3a59a5a8fff7a30af_o120 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.data-00000-of-00001" +8090585aee4ce9a3a59a5a8fff7a30af_o120 : comment = "Actual values of all variables that make up the word level handwriting recognition AI model" +8090585aee4ce9a3a59a5a8fff7a30af_o120::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o120 : name = "/model/word-model/snapshot-33.data-00000-of-00001" +8090585aee4ce9a3a59a5a8fff7a30af_o120 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o120 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o120 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o120 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o120 : to +8090585aee4ce9a3a59a5a8fff7a30af_o121 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.index" +8090585aee4ce9a3a59a5a8fff7a30af_o121 : comment = "The name and shape of all the variables that make up the word level handwriting recognition AI model thier actual data is stored in /model/word-model/snapshot-33.index" +8090585aee4ce9a3a59a5a8fff7a30af_o121::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o121 : name = "/model/word-model/snapshot-33.index" +8090585aee4ce9a3a59a5a8fff7a30af_o121 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o121 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o121 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o121 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o121 : to +8090585aee4ce9a3a59a5a8fff7a30af_o122 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.meta" +8090585aee4ce9a3a59a5a8fff7a30af_o122 : comment = "Its a file storing all the information required to restore a training or information process including the graph that describes the data flow and additional annotations that describes the variables, input pipelines and other relevant information" +8090585aee4ce9a3a59a5a8fff7a30af_o122::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o122 : name = "/model/word-model/snapshot-33.meta" +8090585aee4ce9a3a59a5a8fff7a30af_o122 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o122 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o122 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" +8090585aee4ce9a3a59a5a8fff7a30af_o122 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o122 : to +8090585aee4ce9a3a59a5a8fff7a30af_o123 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/summary.json" +8090585aee4ce9a3a59a5a8fff7a30af_o123 : comment = "Records the character level error rates of each letter in a json format" +8090585aee4ce9a3a59a5a8fff7a30af_o123::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o123 : name = "/model/word-model/summary.json" +8090585aee4ce9a3a59a5a8fff7a30af_o123 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o123 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o123 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/evidence" +8090585aee4ce9a3a59a5a8fff7a30af_o123 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o123 : to +8090585aee4ce9a3a59a5a8fff7a30af_o124 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/data-contains" +8090585aee4ce9a3a59a5a8fff7a30af_o124::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o80 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o124::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o124 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" +8090585aee4ce9a3a59a5a8fff7a30af_o125 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/data/corpus" +8090585aee4ce9a3a59a5a8fff7a30af_o125 : comment = "The data corpus extracted from IAM dataset and this data is used to train the underlying simpleHTR AI model" +8090585aee4ce9a3a59a5a8fff7a30af_o125::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o125 : name = "/data/corpus.txt" +8090585aee4ce9a3a59a5a8fff7a30af_o125 : originatedBy = ['https://github.com/githubharald'] +8090585aee4ce9a3a59a5a8fff7a30af_o125 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] +8090585aee4ce9a3a59a5a8fff7a30af_o125 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data" +8090585aee4ce9a3a59a5a8fff7a30af_o125 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" +8090585aee4ce9a3a59a5a8fff7a30af_o124::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o125 : to +8090585aee4ce9a3a59a5a8fff7a30af_o124::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o76 : to +8090585aee4ce9a3a59a5a8fff7a30af_o124::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o13 : to +8090585aee4ce9a3a59a5a8fff7a30af_o126 : created = 2020-03-18 00:00:00+00:00 +8090585aee4ce9a3a59a5a8fff7a30af_o126 : createdBy = ['https://pypi.org/org/matplotlib/'] +8090585aee4ce9a3a59a5a8fff7a30af_o126 : specVersion = "3.0.0" +8090585aee4ce9a3a59a5a8fff7a30af_o127 : spdxId = "https://my-first-aibom.com/document1" +8090585aee4ce9a3a59a5a8fff7a30af_o127::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o127 : profileConformance = ['https://spdx.org/rdf/3.0.0/terms/Core/ProfileIdentifierType/core', 'https://spdx.org/rdf/3.0.0/terms/Core/ProfileIdentifierType/software', 'https://spdx.org/rdf/3.0.0/terms/Core/ProfileIdentifierType/ai', 'https://spdx.org/rdf/3.0.0/terms/Core/ProfileIdentifierType/dataset'] +8090585aee4ce9a3a59a5a8fff7a30af_o127::rootElement --> 8090585aee4ce9a3a59a5a8fff7a30af_o93 : rootElement +8090585aee4ce9a3a59a5a8fff7a30af_o128 : spdxId = "https://spdx.org/spdxdocs/Relationship/concludedLicense-3bcfa4ce-6a65-46e8-bed1-18985211bb9e" +8090585aee4ce9a3a59a5a8fff7a30af_o128::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o73 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o128::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o128 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/hasConcludedLicense" +8090585aee4ce9a3a59a5a8fff7a30af_o128::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o109 : to +8090585aee4ce9a3a59a5a8fff7a30af_o129 : spdxId = "https://my-first-aibom.com/line-model-trained-on" +8090585aee4ce9a3a59a5a8fff7a30af_o129::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o14 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o129::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o129 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/trainedOn" +8090585aee4ce9a3a59a5a8fff7a30af_o129::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o73 : to +8090585aee4ce9a3a59a5a8fff7a30af_o130 : spdxId = "https://spdx.org/spdxdocs/Relationship/declaredLicense-6f9cae4f-b015-473b-a87c-4a330c589331" +8090585aee4ce9a3a59a5a8fff7a30af_o130::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo +8090585aee4ce9a3a59a5a8fff7a30af_o88 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o130::from : from +8090585aee4ce9a3a59a5a8fff7a30af_o130 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/hasDeclaredLicense" +8090585aee4ce9a3a59a5a8fff7a30af_o130 : to = ['MIT'] +@enduml From 218b9bc0d5a083676db1e89e7d8ebd57d83def4d Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Thu, 6 Jun 2024 05:51:12 +0100 Subject: [PATCH 05/11] Remove extra space Signed-off-by: Arthit Suriyawongkul --- ai/simpleHTR-example.json | 2 +- ai/simpleHTR-example.json.puml | 849 --------------------------------- 2 files changed, 1 insertion(+), 850 deletions(-) delete mode 100644 ai/simpleHTR-example.json.puml diff --git a/ai/simpleHTR-example.json b/ai/simpleHTR-example.json index d6e52db..a2f83f5 100644 --- a/ai/simpleHTR-example.json +++ b/ai/simpleHTR-example.json @@ -146,7 +146,7 @@ }, { "type": "Relationship", - "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src- contains", + "spdxId": "https://github.com/githubharald/SimpleHTR/tree/master/src-contains", "creationInfo": "_:creationinfo_of_package", "relationshipType": "contains", "from": "https://github.com/githubharald/SimpleHTR/tree/master/src", diff --git a/ai/simpleHTR-example.json.puml b/ai/simpleHTR-example.json.puml deleted file mode 100644 index 60e769b..0000000 --- a/ai/simpleHTR-example.json.puml +++ /dev/null @@ -1,849 +0,0 @@ -@startuml -Package "simpleHTR-example.json" as 8090585aee4ce9a3a59a5a8fff7a30af { -object "/model/line-model/summary.json\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o1 -object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o2 -object "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o3 -object "line-model\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o4 -object "/model/line-model/CharList.txt\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o5 -object "/model/line-model/checkpoint\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o6 -object "/model/line-model/snapshot-13.data-00000-of-00001\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o7 -object "/model/line-model/snapshot-13.index\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o8 -object "/model/line-model/snapshot-13.meta\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o9 -object "/doc/graphics.svg\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o10 -object "lmdb\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o11 -object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o12 -object "/data/word.png\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o13 -object "line-model\nai_AIPackage" as 8090585aee4ce9a3a59a5a8fff7a30af_o14 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o15 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o16 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o17 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o18 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o19 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o20 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o21 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o22 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o23 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o24 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o25 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o26 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o27 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o28 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o29 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o30 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o31 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o32 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o33 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o34 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o35 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o36 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o37 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o38 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o39 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o40 -object "Gopi Krishnan Rajbahadur\nPerson" as 8090585aee4ce9a3a59a5a8fff7a30af_o41 -object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o42 -object "ExternalIdentifier" as 8090585aee4ce9a3a59a5a8fff7a30af_o43 -object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o44 -object "https://my-first-aibom.com/word-model-trained-on\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o45 -object "word-model\nai_AIPackage" as 8090585aee4ce9a3a59a5a8fff7a30af_o46 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o47 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o48 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o49 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o50 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o51 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o52 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o53 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o54 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o55 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o56 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o57 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o58 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o59 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o60 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o61 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o62 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o63 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o64 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o65 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o66 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o67 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o68 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o69 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o70 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o71 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o72 -object "IAMdataset\ndataset_DatasetPackage" as 8090585aee4ce9a3a59a5a8fff7a30af_o73 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o74 -object "DictionaryEntry" as 8090585aee4ce9a3a59a5a8fff7a30af_o75 -object "/data/line.png\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o76 -object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o77 -object "https://my-first-aibom.com/word-model-tested-on\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o78 -object "/master/LICENSE.md\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o79 -object "/data\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o80 -object "https://github.com/githubharald/SimpleHTR/tree/master/src- contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o81 -object "/src\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o82 -object "/src/main.py\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o83 -object "/src/create_lmdb.py\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o84 -object "/src/dataloader_iam.py\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o85 -object "/src/model.py\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o86 -object "/src/preprocessor.py\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o87 -object "simpleHTR\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o88 -object "opencv-python\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o89 -object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o90 -object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o91 -object "/model\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o92 -object "https://my-first-aibom.com/BOM1\nsoftware_Sbom" as 8090585aee4ce9a3a59a5a8fff7a30af_o93 -object "/doc/decoder_comparision.png\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o94 -object "editdistance\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o95 -object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o96 -object "lmdb\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o97 -object "https://my-first-aibom.com/SimpleHTR-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o98 -object "/doc\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o99 -object "/master/.gitignore\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o100 -object "/master/README.md\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o101 -object "/master/requirements.txt\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o102 -object "https://my-first-aibom.com/SimpleHTR-depends-on\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o103 -object "tensorflow\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o104 -object "path\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o105 -object "numpy\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o106 -object "https://github.com/githubharald/SimpleHTR/tree/master/doc-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o107 -object "/doc/htr.png\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o108 -object "https://spdx.org/spdxdocs/CustomLicense-c63547c2-62e0-48ec-b98d-ff1b917d67db\nexpandedlicensing_CustomLicense" as 8090585aee4ce9a3a59a5a8fff7a30af_o109 -object "https://spdx.org/spdxdocs/Relationship/declaredLicense-2c9563dc-baa1-4385-be02-ad671976a8aa\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o110 -object "https://github.com/githubharald/SimpleHTR/tree/master/model-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o111 -object "word-model\nsoftware_Package" as 8090585aee4ce9a3a59a5a8fff7a30af_o112 -object "/model/wordCharList.txt\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o113 -object "/model/.gitignore\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o114 -object "https://my-first-aibom.com/line-model-tested-on\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o115 -object "https://spdx.org/spdxdocs/Relationship/concludedLicense-7ea6e28f-eead-4b56-8376-282e2d31397b\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o116 -object "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o117 -object "/model/word-model/CharList.txt\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o118 -object "/model/word-model/checkpoint\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o119 -object "/model/word-model/snapshot-33.data-00000-of-00001\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o120 -object "/model/word-model/snapshot-33.index\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o121 -object "/model/word-model/snapshot-33.meta\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o122 -object "/model/word-model/summary.json\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o123 -object "https://github.com/githubharald/SimpleHTR/tree/master/data-contains\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o124 -object "/data/corpus.txt\nsoftware_File" as 8090585aee4ce9a3a59a5a8fff7a30af_o125 -object "CreationInfo" as 8090585aee4ce9a3a59a5a8fff7a30af_o126 -object "https://my-first-aibom.com/document1\nSpdxDocument" as 8090585aee4ce9a3a59a5a8fff7a30af_o127 -object "https://spdx.org/spdxdocs/Relationship/concludedLicense-3bcfa4ce-6a65-46e8-bed1-18985211bb9e\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o128 -object "https://my-first-aibom.com/line-model-trained-on\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o129 -object "https://spdx.org/spdxdocs/Relationship/declaredLicense-6f9cae4f-b015-473b-a87c-4a330c589331\nRelationship" as 8090585aee4ce9a3a59a5a8fff7a30af_o130 -} -8090585aee4ce9a3a59a5a8fff7a30af_o1 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/summary.json" -8090585aee4ce9a3a59a5a8fff7a30af_o1 : comment = "Records the character level error rates of each letter in a json format" -8090585aee4ce9a3a59a5a8fff7a30af_o2 : created = 2023-08-07 00:00:00+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o2 : createdBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o2 : specVersion = "3.0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o1::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o1 : name = "/model/line-model/summary.json" -8090585aee4ce9a3a59a5a8fff7a30af_o1 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o1 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o1 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/evidence" -8090585aee4ce9a3a59a5a8fff7a30af_o1 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o3 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model-contains" -8090585aee4ce9a3a59a5a8fff7a30af_o3::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o4 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model" -8090585aee4ce9a3a59a5a8fff7a30af_o4 : comment = "This file is not present at the source repo in VCS, but the users of the application are required to download it from the specified download location and present make it a part of the ./model/ directory" -8090585aee4ce9a3a59a5a8fff7a30af_o4::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o4 : description = "The simpleHTR application uses two AI models which is distributed as a Zip file. This model is a line-level handwriting recognition model" -8090585aee4ce9a3a59a5a8fff7a30af_o4 : name = "line-model" -8090585aee4ce9a3a59a5a8fff7a30af_o4 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o4 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/archive'] -8090585aee4ce9a3a59a5a8fff7a30af_o4 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o4 : software_downloadLocation = "https://www.dropbox.com/s/7xwkcilho10rthn/line-model.zip?dl=1" -8090585aee4ce9a3a59a5a8fff7a30af_o4 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o3::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o3 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" -8090585aee4ce9a3a59a5a8fff7a30af_o5 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/charList" -8090585aee4ce9a3a59a5a8fff7a30af_o5 : comment = "Configuration/parameter file for the beam search decoder of the model" -8090585aee4ce9a3a59a5a8fff7a30af_o5::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o5 : name = "/model/line-model/CharList.txt" -8090585aee4ce9a3a59a5a8fff7a30af_o5 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o5 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/configuration'] -8090585aee4ce9a3a59a5a8fff7a30af_o5 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o5 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o5 : to -8090585aee4ce9a3a59a5a8fff7a30af_o6 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/checkpoint" -8090585aee4ce9a3a59a5a8fff7a30af_o6 : comment = "Saved checkpoint of the model" -8090585aee4ce9a3a59a5a8fff7a30af_o6::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o6 : name = "/model/line-model/checkpoint" -8090585aee4ce9a3a59a5a8fff7a30af_o6 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o6 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o6 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o6 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o6 : to -8090585aee4ce9a3a59a5a8fff7a30af_o7 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.data-00000-of-00001" -8090585aee4ce9a3a59a5a8fff7a30af_o7 : comment = "Actual values of all variables that make up the line level handwriting recognition AI model" -8090585aee4ce9a3a59a5a8fff7a30af_o7::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o7 : name = "/model/line-model/snapshot-13.data-00000-of-00001" -8090585aee4ce9a3a59a5a8fff7a30af_o7 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o7 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o7 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o7 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o7 : to -8090585aee4ce9a3a59a5a8fff7a30af_o8 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.index" -8090585aee4ce9a3a59a5a8fff7a30af_o8 : comment = "The name and shape of all the variables that make up the line level handwriting recognition AI model thier actual data is stored in /model/line-model/snapshot-13.index" -8090585aee4ce9a3a59a5a8fff7a30af_o8::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o8 : name = "/model/line-model/snapshot-13.index" -8090585aee4ce9a3a59a5a8fff7a30af_o8 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o8 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o8 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o8 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o8 : to -8090585aee4ce9a3a59a5a8fff7a30af_o9 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model/snapshot-13.meta" -8090585aee4ce9a3a59a5a8fff7a30af_o9 : comment = "Its a file storing all the information required to restore a training or information process including the graph that describes the data flow and additional annotations that describes the variables, input pipelines and other relevant information" -8090585aee4ce9a3a59a5a8fff7a30af_o9::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o9 : name = "/model/line-model/snapshot-13.meta" -8090585aee4ce9a3a59a5a8fff7a30af_o9 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o9 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o9 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o9 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o9 : to -8090585aee4ce9a3a59a5a8fff7a30af_o3::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o1 : to -8090585aee4ce9a3a59a5a8fff7a30af_o10 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/doc/graphics" -8090585aee4ce9a3a59a5a8fff7a30af_o10 : comment = "An image that shows documentation related information for simpleHTR options" -8090585aee4ce9a3a59a5a8fff7a30af_o10::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o10 : name = "/doc/graphics.svg" -8090585aee4ce9a3a59a5a8fff7a30af_o10 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o10 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o10 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" -8090585aee4ce9a3a59a5a8fff7a30af_o10 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o11 : spdxId = "https://pypi.org/project/lmdb/1.0.0/" -8090585aee4ce9a3a59a5a8fff7a30af_o12 : created = 2020-08-28 00:00:00+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o12 : createdBy = ['https://pypi.org/user/dw/', 'https://pypi.org/user/jnwatson/'] -8090585aee4ce9a3a59a5a8fff7a30af_o12 : specVersion = "3.0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o11::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o12 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o11 : description = "This is a universal Python binding for the LMDB ‘Lightning’ Database." -8090585aee4ce9a3a59a5a8fff7a30af_o11 : name = "lmdb" -8090585aee4ce9a3a59a5a8fff7a30af_o11 : originatedBy = ['https://pypi.org/user/dw/', 'https://pypi.org/user/jnwatson/'] -8090585aee4ce9a3a59a5a8fff7a30af_o11 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" -8090585aee4ce9a3a59a5a8fff7a30af_o11 : software_downloadLocation = "https://pypi.org/project/lmdb/1.0.0/" -8090585aee4ce9a3a59a5a8fff7a30af_o11 : software_homePage = "https://github.com/jnwatson/py-lmdb/" -8090585aee4ce9a3a59a5a8fff7a30af_o11 : software_packageVersion = "1.0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o13 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/data/word" -8090585aee4ce9a3a59a5a8fff7a30af_o13 : comment = "An example image to test the model's word level character recognition capability" -8090585aee4ce9a3a59a5a8fff7a30af_o13::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o13 : name = "/data/word.png" -8090585aee4ce9a3a59a5a8fff7a30af_o13 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o13 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o13 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data" -8090585aee4ce9a3a59a5a8fff7a30af_o13 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o14 : spdxId = "https://my-first-aibom.com/line-model" -8090585aee4ce9a3a59a5a8fff7a30af_o14 : comment = "Line level handwriting recognition model" -8090585aee4ce9a3a59a5a8fff7a30af_o14 : creationInfo = ":_creationinfo" -8090585aee4ce9a3a59a5a8fff7a30af_o14 : name = "line-model" -8090585aee4ce9a3a59a5a8fff7a30af_o14 : releaseTime = 2023-09-07 00:00:00+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o14 : suppliedBy = "https://github.com/githubharald" -8090585aee4ce9a3a59a5a8fff7a30af_o14 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/application" -8090585aee4ce9a3a59a5a8fff7a30af_o14 : software_downloadLocation = "https://www.dropbox.com/s/mya8hw6jyzqm0a3/word-model.zip?dl=1" -8090585aee4ce9a3a59a5a8fff7a30af_o14 : software_packageVersion = "0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_autonomyType = "https://spdx.org/rdf/3.0.0/terms/Core/PresenceType/no" -8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_domain = ['image recognition, optical character recognition, handwriting recognition'] -8090585aee4ce9a3a59a5a8fff7a30af_o15 : key = "cnn_kernel_vals" -8090585aee4ce9a3a59a5a8fff7a30af_o15 : value = "[5, 5, 3, 3, 3]" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o15 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o16 : key = "cnn_nfeature_vals" -8090585aee4ce9a3a59a5a8fff7a30af_o16 : value = "[1, 32, 64, 128, 128, 256]" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o16 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o17 : key = "cnn_stride_vals" -8090585aee4ce9a3a59a5a8fff7a30af_o17 : value = "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o17 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o18 : key = "cnn_pool_vals" -8090585aee4ce9a3a59a5a8fff7a30af_o18 : value = "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o18 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o19 : key = "cnn_num_layers" -8090585aee4ce9a3a59a5a8fff7a30af_o19 : value = "5" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o19 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o20 : key = "cnn_activation" -8090585aee4ce9a3a59a5a8fff7a30af_o20 : value = "relu" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o20 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o21 : key = "cnn_padding" -8090585aee4ce9a3a59a5a8fff7a30af_o21 : value = "SAME" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o21 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o22 : key = "cnn_pooling_layer_padding" -8090585aee4ce9a3a59a5a8fff7a30af_o22 : value = "VALID" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o22 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o23 : key = "cnn_kernal_stddev" -8090585aee4ce9a3a59a5a8fff7a30af_o23 : value = "0.1" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o23 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o24 : key = "cnn_conv2d_strides" -8090585aee4ce9a3a59a5a8fff7a30af_o24 : value = "(1,1,1,1)" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o24 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o25 : key = "rnn_num_layers" -8090585aee4ce9a3a59a5a8fff7a30af_o25 : value = "2" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o25 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o26 : key = "rnn_hidden_layers" -8090585aee4ce9a3a59a5a8fff7a30af_o26 : value = "256" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o26 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o27 : key = "rnn_LSTM_state_is_tuple" -8090585aee4ce9a3a59a5a8fff7a30af_o27 : value = "True" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o27 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o28 : key = "rnn_MultiRNNCell_state_is_tuple" -8090585aee4ce9a3a59a5a8fff7a30af_o28 : value = "True" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o28 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o29 : key = "rnn_filters_sttdev" -8090585aee4ce9a3a59a5a8fff7a30af_o29 : value = "0.1" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o29 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o30 : key = "rnn_output_rate" -8090585aee4ce9a3a59a5a8fff7a30af_o30 : value = "1" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o30 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o31 : key = "rnn_output_padding" -8090585aee4ce9a3a59a5a8fff7a30af_o31 : value = "SAME" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o31 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o32 : key = "loss" -8090585aee4ce9a3a59a5a8fff7a30af_o32 : value = "CTCLoss" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o32 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o33 : key = "Decode" -8090585aee4ce9a3a59a5a8fff7a30af_o33 : value = "CTCDecode" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o33 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o34 : key = "beam_serach_decoder_beam_width" -8090585aee4ce9a3a59a5a8fff7a30af_o34 : value = "50" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o34 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o35 : key = "beam_search_scoring_mode" -8090585aee4ce9a3a59a5a8fff7a30af_o35 : value = "Words" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o35 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o36 : key = "beam_search_smoothing" -8090585aee4ce9a3a59a5a8fff7a30af_o36 : value = "0.1" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o36 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o37 : key = "beam_search_encoding" -8090585aee4ce9a3a59a5a8fff7a30af_o37 : value = "UTF-8" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o37 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o38 : key = "optimizer" -8090585aee4ce9a3a59a5a8fff7a30af_o38 : value = "RMSprop" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o38 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_informationAboutApplication = "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset." -8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_informationAboutTraining = "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long." -8090585aee4ce9a3a59a5a8fff7a30af_o39 : key = "charErrorRates" -8090585aee4ce9a3a59a5a8fff7a30af_o39 : value = "[ 0.9838042269187987, 0.8809788654060067, 0.5203559510567297, 0.33205784204671857, 0.29054505005561737, 0.2439599555061179, 0.2181979977753059, 0.20262513904338153, 0.18593993325917688, 0.18740823136818688, 0.17259176863181314, 0.1646273637374861, 0.16347052280311458, 0.15830923248053394, 0.14696329254727475, 0.1495884315906563, 0.14197997775305896, 0.1457174638487208, 0.14189098998887653, 0.137174638487208, 0.13490545050055616, 0.13152391546162404, 0.13094549499443828, 0.1332146829810901, 0.13090100111234707, 0.1254282536151279, 0.12525027808676306, 0.12529477196885427, 0.12596218020022246, 0.12596218020022246, 0.12182424916573971, 0.12262513904338153, 0.11942157953281424, 0.12031145717463848, 0.11839822024471636, 0.11661846496106786, 0.12195773081201335, 0.11853170189099, 0.11608453837597331, 0.11719688542825361, 0.12048943270300334, 0.12088987764182425, 0.11599555061179088, 0.11781979977753058, 0.11506117908787541, 0.11546162402669632, 0.11692992213570634, 0.11790878754171301, 0.11612903225806452, 0.11412680756395996, 0.11688542825361513, 0.11101223581757508, 0.11568409343715239, 0.12017797552836484, 0.11350389321468297, 0.11541713014460511, 0.1181757508342603, 0.11875417130144605, 0.11105672969966629, 0.11350389321468297, 0.11234705228031146, 0.11688542825361513, 0.11461624026696329, 0.11154616240266964, 0.11359288097886541, 0.10914349276974417, 0.11283648498331479, 0.11332591768631813, 0.11394883203559511, 0.11492769744160178, 0.11119021134593993, 0.11145717463848721, 0.11265850945494994, 0.11804226918798665, 0.11092324805339265, 0.11648498331479422, 0.1135483870967742, 0.11599555061179088, 0.11154616240266964, 0.11279199110122358, 0.11421579532814238 ]" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_metric --> 8090585aee4ce9a3a59a5a8fff7a30af_o39 : ai_metric -8090585aee4ce9a3a59a5a8fff7a30af_o40 : key = "wordAccuracies" -8090585aee4ce9a3a59a5a8fff7a30af_o40 : value = "[ 0.061394380853277836, 0.10353798126951093, 0.2443635102323968, 0.3935137010058966, 0.449531737773153, 0.5071106486298994, 0.5483870967741935, 0.5613943808532779, 0.5872355185570586, 0.591918140825529, 0.6122095039889005, 0.6184530003468609, 0.620013874436351, 0.6304197016996185, 0.6546999653139092, 0.6481096080471731, 0.6625043357613597, 0.654873395768297, 0.6626777662157475, 0.6722164412070759, 0.6758584807492196, 0.6833159902878946, 0.6817551161984045, 0.6770724939299341, 0.6855705861949358, 0.701179327089837, 0.6945889698231009, 0.690426638917794, 0.6959764134582033, 0.6888657648283039, 0.7034339229968782, 0.7010058966354492, 0.7103711411723899, 0.7065556711758585, 0.7105445716267776, 0.7133194588969823, 0.7018730489073881, 0.7089836975372875, 0.7124523066250433, 0.7129725979882068, 0.7072493929934096, 0.7043010752688172, 0.7169614984391259, 0.7114117238987167, 0.7211238293444329, 0.719389524800555, 0.7134928893513701, 0.7131460284425946, 0.7171349288935137, 0.7221644120707597, 0.7166146375303504, 0.7273673257023934, 0.7190426638917794, 0.7124523066250433, 0.7271938952480056, 0.7238987166146376, 0.7167880679847382, 0.7070759625390218, 0.7278876170655567, 0.723551855705862, 0.7289281997918835, 0.7155740548040236, 0.7225112729795352, 0.723551855705862, 0.7263267429760666, 0.7348248352410683, 0.725979882067291, 0.7282344779743323, 0.7206035379812695, 0.7232049947970863, 0.7273673257023934, 0.7315296566077003, 0.7280610475199445, 0.711064862989941, 0.7337842525147416, 0.723551855705862, 0.7277141866111689, 0.7230315643426986, 0.7351716961498439, 0.7261533125216788, 0.7232049947970863 ]" -8090585aee4ce9a3a59a5a8fff7a30af_o14::ai_metric --> 8090585aee4ce9a3a59a5a8fff7a30af_o40 : ai_metric -8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_modelDataPreprocessing = ['Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.'] -8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_safetyRiskAssessment = "https://spdx.org/rdf/3.0.0/terms/AI/SafetyRiskAssessmentType/low" -8090585aee4ce9a3a59a5a8fff7a30af_o14 : ai_typeOfModel = ['Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path'] -8090585aee4ce9a3a59a5a8fff7a30af_o41 : spdxId = "https://my-first-aibom.com/gopi" -8090585aee4ce9a3a59a5a8fff7a30af_o42 : created = 2024-05-09 13:50:30+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o42::createdBy --> 8090585aee4ce9a3a59a5a8fff7a30af_o41 : createdBy -8090585aee4ce9a3a59a5a8fff7a30af_o42 : specVersion = "3.0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o41::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o43 : externalIdentifierType = "https://spdx.org/rdf/3.0.0/terms/Core/ExternalIdentifierType/email" -8090585aee4ce9a3a59a5a8fff7a30af_o43 : identifier = "iamironman@616.com" -8090585aee4ce9a3a59a5a8fff7a30af_o41::externalIdentifier --> 8090585aee4ce9a3a59a5a8fff7a30af_o43 : externalIdentifier -8090585aee4ce9a3a59a5a8fff7a30af_o41 : name = "Gopi Krishnan Rajbahadur" -8090585aee4ce9a3a59a5a8fff7a30af_o44 : created = 2020-07-27 00:00:00+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o44 : createdBy = ['https://pypi.org/user/jaraco/'] -8090585aee4ce9a3a59a5a8fff7a30af_o44 : specVersion = "3.0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o45 : spdxId = "https://my-first-aibom.com/word-model-trained-on" -8090585aee4ce9a3a59a5a8fff7a30af_o45::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o46 : spdxId = "https://my-first-aibom.com/word-model" -8090585aee4ce9a3a59a5a8fff7a30af_o46 : comment = "Word level handwriting recognition model" -8090585aee4ce9a3a59a5a8fff7a30af_o46 : creationInfo = ":_creationinfo" -8090585aee4ce9a3a59a5a8fff7a30af_o46 : name = "word-model" -8090585aee4ce9a3a59a5a8fff7a30af_o46 : releaseTime = 2023-09-07 00:00:00+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o46 : suppliedBy = "https://github.com/githubharald" -8090585aee4ce9a3a59a5a8fff7a30af_o46 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/application" -8090585aee4ce9a3a59a5a8fff7a30af_o46 : software_downloadLocation = "https://www.dropbox.com/s/mya8hw6jyzqm0a3/word-model.zip?dl=1" -8090585aee4ce9a3a59a5a8fff7a30af_o46 : software_packageVersion = "0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_autonomyType = "https://spdx.org/rdf/3.0.0/terms/Core/PresenceType/no" -8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_domain = ['image recognition, optical character recognition, handwriting recognition'] -8090585aee4ce9a3a59a5a8fff7a30af_o47 : key = "cnn_kernel_vals" -8090585aee4ce9a3a59a5a8fff7a30af_o47 : value = "[5, 5, 3, 3, 3]" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o47 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o48 : key = "cnn_nfeature_vals" -8090585aee4ce9a3a59a5a8fff7a30af_o48 : value = "[1, 32, 64, 128, 128, 256]" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o48 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o49 : key = "cnn_stride_vals" -8090585aee4ce9a3a59a5a8fff7a30af_o49 : value = "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o49 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o50 : key = "cnn_pool_vals" -8090585aee4ce9a3a59a5a8fff7a30af_o50 : value = "[(2, 2), (2, 2), (1, 2), (1, 2), (1, 2)]" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o50 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o51 : key = "cnn_num_layers" -8090585aee4ce9a3a59a5a8fff7a30af_o51 : value = "5" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o51 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o52 : key = "cnn_activation" -8090585aee4ce9a3a59a5a8fff7a30af_o52 : value = "relu" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o52 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o53 : key = "cnn_padding" -8090585aee4ce9a3a59a5a8fff7a30af_o53 : value = "SAME" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o53 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o54 : key = "cnn_pooling_layer_padding" -8090585aee4ce9a3a59a5a8fff7a30af_o54 : value = "VALID" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o54 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o55 : key = "cnn_kernal_stddev" -8090585aee4ce9a3a59a5a8fff7a30af_o55 : value = "0.1" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o55 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o56 : key = "cnn_conv2d_strides" -8090585aee4ce9a3a59a5a8fff7a30af_o56 : value = "(1,1,1,1)" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o56 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o57 : key = "rnn_num_layers" -8090585aee4ce9a3a59a5a8fff7a30af_o57 : value = "2" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o57 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o58 : key = "rnn_hidden_layers" -8090585aee4ce9a3a59a5a8fff7a30af_o58 : value = "256" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o58 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o59 : key = "rnn_LSTM_state_is_tuple" -8090585aee4ce9a3a59a5a8fff7a30af_o59 : value = "True" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o59 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o60 : key = "rnn_MultiRNNCell_state_is_tuple" -8090585aee4ce9a3a59a5a8fff7a30af_o60 : value = "True" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o60 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o61 : key = "rnn_filters_sttdev" -8090585aee4ce9a3a59a5a8fff7a30af_o61 : value = "0.1" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o61 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o62 : key = "rnn_output_rate" -8090585aee4ce9a3a59a5a8fff7a30af_o62 : value = "1" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o62 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o63 : key = "rnn_output_padding" -8090585aee4ce9a3a59a5a8fff7a30af_o63 : value = "SAME" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o63 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o64 : key = "loss" -8090585aee4ce9a3a59a5a8fff7a30af_o64 : value = "CTCLoss" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o64 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o65 : key = "Decode" -8090585aee4ce9a3a59a5a8fff7a30af_o65 : value = "CTCDecode" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o65 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o66 : key = "beam_serach_decoder_beam_width" -8090585aee4ce9a3a59a5a8fff7a30af_o66 : value = "50" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o66 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o67 : key = "beam_search_scoring_mode" -8090585aee4ce9a3a59a5a8fff7a30af_o67 : value = "Words" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o67 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o68 : key = "beam_search_smoothing" -8090585aee4ce9a3a59a5a8fff7a30af_o68 : value = "0.1" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o68 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o69 : key = "beam_search_encoding" -8090585aee4ce9a3a59a5a8fff7a30af_o69 : value = "UTF-8" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o69 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o70 : key = "optimizer" -8090585aee4ce9a3a59a5a8fff7a30af_o70 : value = "RMSprop" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_hyperparameter --> 8090585aee4ce9a3a59a5a8fff7a30af_o70 : ai_hyperparameter -8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_informationAboutApplication = "Offline Handwritten Text Recognition (HTR) systems transcribe text contained in scanned images into digital text, an example is shown in Fig. 1. We will build a Neural Network (NN) which is trained on word-images from the IAM dataset." -8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_informationAboutTraining = "We use a NN for our task. It consists of convolutional NN (CNN) layers, recurrent NN (RNN) layers and a final Connectionist Temporal Classification (CTC) layer. CNN: the input image is fed into the CNN layers. These layers are trained to extract relevant features from the image. Each layer consists of three operation. First, the convolution operation, which applies a filter kernel of size 5×5 in the first two layers and 3×3 in the last three layers to the input. Then, the non-linear RELU function is applied. Finally, a pooling layer summarizes image regions and outputs a downsized version of the input. While the image height is downsized by 2 in each layer, feature maps (channels) are added, so that the output feature map (or sequence) has a size of 32×256. RNN the feature sequence contains 256 features per time-step, the RNN propagates relevant information through this sequence. The popular Long Short-Term Memory (LSTM) implementation of RNNs is used, as it is able to propagate information through longer distances and provides more robust training-characteristics than vanilla RNN. The RNN output sequence is mapped to a matrix of size 32×80. The IAM dataset consists of 79 different characters, further one additional character is needed for the CTC operation (CTC blank label), therefore there are 80 entries for each of the 32 time-steps. CTC while training the NN, the CTC is given the RNN output matrix and the ground truth text and it computes the loss value. While inferring, the CTC is only given the matrix and it decodes it into the final text. Both the ground truth text and the recognized text can be at most 32 characters long." -8090585aee4ce9a3a59a5a8fff7a30af_o71 : key = "charErrorRates" -8090585aee4ce9a3a59a5a8fff7a30af_o71 : value = "[ 0.9838042269187987, 0.8809788654060067, 0.5203559510567297, 0.33205784204671857, 0.29054505005561737, 0.2439599555061179, 0.2181979977753059, 0.20262513904338153, 0.18593993325917688, 0.18740823136818688, 0.17259176863181314, 0.1646273637374861, 0.16347052280311458, 0.15830923248053394, 0.14696329254727475, 0.1495884315906563, 0.14197997775305896, 0.1457174638487208, 0.14189098998887653, 0.137174638487208, 0.13490545050055616, 0.13152391546162404, 0.13094549499443828, 0.1332146829810901, 0.13090100111234707, 0.1254282536151279, 0.12525027808676306, 0.12529477196885427, 0.12596218020022246, 0.12596218020022246, 0.12182424916573971, 0.12262513904338153, 0.11942157953281424, 0.12031145717463848, 0.11839822024471636, 0.11661846496106786, 0.12195773081201335, 0.11853170189099, 0.11608453837597331, 0.11719688542825361, 0.12048943270300334, 0.12088987764182425, 0.11599555061179088, 0.11781979977753058, 0.11506117908787541, 0.11546162402669632, 0.11692992213570634, 0.11790878754171301, 0.11612903225806452, 0.11412680756395996, 0.11688542825361513, 0.11101223581757508, 0.11568409343715239, 0.12017797552836484, 0.11350389321468297, 0.11541713014460511, 0.1181757508342603, 0.11875417130144605, 0.11105672969966629, 0.11350389321468297, 0.11234705228031146, 0.11688542825361513, 0.11461624026696329, 0.11154616240266964, 0.11359288097886541, 0.10914349276974417, 0.11283648498331479, 0.11332591768631813, 0.11394883203559511, 0.11492769744160178, 0.11119021134593993, 0.11145717463848721, 0.11265850945494994, 0.11804226918798665, 0.11092324805339265, 0.11648498331479422, 0.1135483870967742, 0.11599555061179088, 0.11154616240266964, 0.11279199110122358, 0.11421579532814238 ]" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_metric --> 8090585aee4ce9a3a59a5a8fff7a30af_o71 : ai_metric -8090585aee4ce9a3a59a5a8fff7a30af_o72 : key = "wordAccuracies" -8090585aee4ce9a3a59a5a8fff7a30af_o72 : value = "[ 0.061394380853277836, 0.10353798126951093, 0.2443635102323968, 0.3935137010058966, 0.449531737773153, 0.5071106486298994, 0.5483870967741935, 0.5613943808532779, 0.5872355185570586, 0.591918140825529, 0.6122095039889005, 0.6184530003468609, 0.620013874436351, 0.6304197016996185, 0.6546999653139092, 0.6481096080471731, 0.6625043357613597, 0.654873395768297, 0.6626777662157475, 0.6722164412070759, 0.6758584807492196, 0.6833159902878946, 0.6817551161984045, 0.6770724939299341, 0.6855705861949358, 0.701179327089837, 0.6945889698231009, 0.690426638917794, 0.6959764134582033, 0.6888657648283039, 0.7034339229968782, 0.7010058966354492, 0.7103711411723899, 0.7065556711758585, 0.7105445716267776, 0.7133194588969823, 0.7018730489073881, 0.7089836975372875, 0.7124523066250433, 0.7129725979882068, 0.7072493929934096, 0.7043010752688172, 0.7169614984391259, 0.7114117238987167, 0.7211238293444329, 0.719389524800555, 0.7134928893513701, 0.7131460284425946, 0.7171349288935137, 0.7221644120707597, 0.7166146375303504, 0.7273673257023934, 0.7190426638917794, 0.7124523066250433, 0.7271938952480056, 0.7238987166146376, 0.7167880679847382, 0.7070759625390218, 0.7278876170655567, 0.723551855705862, 0.7289281997918835, 0.7155740548040236, 0.7225112729795352, 0.723551855705862, 0.7263267429760666, 0.7348248352410683, 0.725979882067291, 0.7282344779743323, 0.7206035379812695, 0.7232049947970863, 0.7273673257023934, 0.7315296566077003, 0.7280610475199445, 0.711064862989941, 0.7337842525147416, 0.723551855705862, 0.7277141866111689, 0.7230315643426986, 0.7351716961498439, 0.7261533125216788, 0.7232049947970863 ]" -8090585aee4ce9a3a59a5a8fff7a30af_o46::ai_metric --> 8090585aee4ce9a3a59a5a8fff7a30af_o72 : ai_metric -8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_modelDataPreprocessing = ['Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.'] -8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_safetyRiskAssessment = "https://spdx.org/rdf/3.0.0/terms/AI/SafetyRiskAssessmentType/low" -8090585aee4ce9a3a59a5a8fff7a30af_o46 : ai_typeOfModel = ['Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path'] -8090585aee4ce9a3a59a5a8fff7a30af_o46 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o45::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o45 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/trainedOn" -8090585aee4ce9a3a59a5a8fff7a30af_o73 : spdxId = "https://my-first-aibom.com/IAMdataset" -8090585aee4ce9a3a59a5a8fff7a30af_o73 : comment = "The IAM Handwriting Database contains forms of handwritten English text which can be used to train and test handwritten text recognizers and to perform writer identification and verification experiments." -8090585aee4ce9a3a59a5a8fff7a30af_o73 : creationInfo = ":_creationinfo" -8090585aee4ce9a3a59a5a8fff7a30af_o73 : name = "IAMdataset" -8090585aee4ce9a3a59a5a8fff7a30af_o73 : builtTime = 1999-09-20 00:00:00+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o73 : originatedBy = ['U. Marti and H. Bunke.'] -8090585aee4ce9a3a59a5a8fff7a30af_o73 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data" -8090585aee4ce9a3a59a5a8fff7a30af_o73 : software_downloadLocation = "https://fki.tic.heia-fr.ch/databases/iam-handwriting-database" -8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_confidentialityLevel = "https://spdx.org/rdf/3.0.0/terms/Dataset/ConfidentialityLevelType/clear" -8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_dataCollectionProcess = "It was decided to use the Lancaster - Oslo/Bergen corpus (LOB), a collection of 500 English texts, each consisting of about 2,000 words as a basis of our database. The LOB corpus is the British pendant to the Brown corpus, which has a structure similar to that of the\n LOB corpus. Then, we split the texts in the corpus into fragments of about three to six sentences with at least 50 words each. These text fragments were printed onto forms and we asked a number of persons to write the text printed on the forms by hand. We extracted the sentences of each text fragment from the corpus and generated a LATEX document containing the text and the structure of the form. The formatted documents were printed by a HP Laserjet 4000TN at a resolution of 600 dpi. Each form consists of four parts. The first part comprises the title “Sentence Database” and a number assigned to the text. The first character of this number shows which category the text belongs to,\n and the following two digits identify the text number. For example in Fig. 1, M01 indicates that the text on the form is extracted from text “01“ in the text category “Science fiction“. The next three digits show with which sentence the text starts. In the second part of the form, the text the individual persons were asked to write is printed. The third part of the form is a blank zone where the writers have to put in their handwriting. In the last part, the writer can voluntarily enter his or her name. All four parts are separated from each other by a horizontal line. This makes it easy to automatically extract the individual parts from a form. It was decided that the writers had to use rulers. These guiding lines, with 1.5 cm space between them, were printed on a separate sheet of paper which\n was put under the form. The writers were asked to use their every day writing in order to get the most natural and unconstrained way of writing. We also told the writers to stop writing, if there was not enough space left on the form to write the whole text. No restrictions were imposed on the writing instrument. Hence, text produced with a number of different writing instruments is included in the database (ballpoint pens, ink pens, and pencils, all with various stroke widths). The filled forms were scanned with a HP-Scanjet 6100 connected to a Sun Ultra 1. The software used to scan the data is xvscan version 1.62. It is an add-on to the wellknown image tool xv. The resolution was set to 300 dpi at a grey-level resolution of 8 bits. The images were saved in TIFF-format with LZW compression. Each form was\n completely scanned, including the printed and handwritten text. To create the label files, the text of a form was copied twice into the label file, once for the machine-printed text and once for the handwritten text. Then the line feeds were filled in manually. In some cases corrections were necessary, because the handwritten text did not exactly correspond to the printed text. These corrections include deletions, insertions, and changes of words so as to make the text in the label file of each form identical to the handwritten text. All corrections were done manually, but they did not take a long. Typically, only approximately 30s of manual processing time for the generation of the label files and the correction of errors were spent\n on each document, which is less than the time required for scanning." -8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_dataPreprocessing = ["First, the skew of the document is corrected. Then the positions of the three horizontal lines are computed by a projection method. Given this positional information the handwriting is extracted. Next, the handwritten text is segmented into text lines. Finally, each text line\n is segmented into individual words. To find the first horizontal line, the form is scanned top-down in the middle of the image. The first black pixel found is assumed to belong to the first horizontal line.\n By following the line to the left and to the right, the end points of the line are found. Once the left and right end of the first horizontal line has been determined, its angle is used to correct the skew of the whole document by a rotation. Then, the form is segmented into its four main parts (see Sect. 2). This is a relatively easy task because the four parts are separated from each other by very long\n horizontal lines, which are easy to detect by horizontal projection. To make the projection algorithm more robust, not only the horizontal projection profile is considered, but also the value of the longest horizontal black run in each row. A horizontal line separating two parts from each other is characterized by a value in the horizontal grey-value projection histogram greater than a threshold t and a value of the longest horizontal black run greater than a threshold t\n (see Fig. 5). After all three horizontal lines have been found, we are able to extract the part of the form that contains the handwriting. Over the whole database the handwritten zone was automatically extracted by means of this procedure without any\n error. The next step in preprocessing is to cut the text into\n individual lines. For this purpose a histogram of the horizontal black/white transitions is used. In this histogram we look for local minima. If the value at a local minimum is zero, a cut has been found that does not touch any word. If the value is greater than zero, we have found a position where we can horizontally cut the image with a minimal number of intersections with strokes belonging to words of the previous or the following text line. To handle intersections of this kind a method based on the center of gravity is used. If the center of gravity of the connected component that is cut is in the range of the\n previous (the following) text line, the connected component is assumed to belong to that text line. If the center of gravity is near the cutting line, the component is cut into two parts, one belonging to the previous and one to the following text line. With this method we could extract almost all text lines correctly. Only in about 1.2% (113 of 9157) of the lines did errors occur. The 113 segmentation errors can be classified into acceptable and serious errors. An acceptable error is defined as one where only single punctuation marks or i-dots are assigned to the wrong line, but no cut component. By contrast, parts of letters or words assigned to the wrong text line are considered serious errors. There were 52 acceptable and 61serious errors out of a total of 113. The correction of these errors is left to\n the user of the database. That is, no attempts were made\n to include any manual corrections of the segmentation errors in the database. To segment the text lines into single words, a method\n similar to those described in the paper 'External word segmentation of off-line handwritten text lines.'' and the paper 'Gap metrics for\n word separation in handwritten lines' is used. Because a word can be split into several components, the goal is to cluster the connected components of a text line image into words. First, the convex hull and the center of gravity of each connected component in a line of text is\n computed. Then for each pair of connected components, c1 and c2, the straight line segment s that connects the center of gravity of c1 with the center of gravity of c2 is considered. The distance d between the two points where s intersects the convex hull of c1 and c2 is determined. This distance d is assigned to s as a weight. A graphical illustration is shown in Fig. 7. By means of this procedure, a completely connected and weighted graph is obtained, where each node corresponds to a connected component in the image and the weight on an edge represents the distance between two connected components. Given such a graph, its minimum spanning tree is computed. Finally, all distances that occur as weights on the edges of the minimum spanning tree are clustered into two groups, namely, intra-word and inter-word distance. For this purpose, Otsu's thresholding algorithm is used, which yields a threshold t. Any two connected components, c1\n and c2, that are linked by an edge in the minimum spanning tree with a weight d ≤ t are considered to be part of the same word. By contrast, if the weight d is larger than t, c1 and c2 are regarded as belonging to two different words. Applied on 541 text lines with 3,899 words,\n a correct word extraction of 94.92%, with 3.62% of the words over- and 1.46% undersegmented, was achieved. The primary goal of the preprocessing and segmentation procedures described in this section is to support the labeling of the text. However, these procedures can be\n integrated in any recognizer as well. All procedures have been implemented in C++ and can be compiled under Unix/Solaris and Linux. To actually run the procedures only the TIFF library for image read and write, but no other software utilities are needed."] -8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_datasetAvailability = "https://spdx.org/rdf/3.0.0/terms/Dataset/DatasetAvailabilityType/registration" -8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_datasetSize = 4620000000 -8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_datasetType = ['https://spdx.org/rdf/3.0.0/terms/Dataset/DatasetType/image'] -8090585aee4ce9a3a59a5a8fff7a30af_o73 : dataset_intendedUse = "For line level or word level character recognition" -8090585aee4ce9a3a59a5a8fff7a30af_o74 : key = "printer" -8090585aee4ce9a3a59a5a8fff7a30af_o74 : value = "HP Laserjet 4000TN" -8090585aee4ce9a3a59a5a8fff7a30af_o73::dataset_sensor --> 8090585aee4ce9a3a59a5a8fff7a30af_o74 : dataset_sensor -8090585aee4ce9a3a59a5a8fff7a30af_o75 : key = "scanner" -8090585aee4ce9a3a59a5a8fff7a30af_o75 : value = "HP-Scanjet 6100" -8090585aee4ce9a3a59a5a8fff7a30af_o73::dataset_sensor --> 8090585aee4ce9a3a59a5a8fff7a30af_o75 : dataset_sensor -8090585aee4ce9a3a59a5a8fff7a30af_o45::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o73 : to -8090585aee4ce9a3a59a5a8fff7a30af_o76 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/data/line" -8090585aee4ce9a3a59a5a8fff7a30af_o76 : comment = "An example image to test the model's line level character recognition capability" -8090585aee4ce9a3a59a5a8fff7a30af_o76::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o76 : name = "/data/line.png" -8090585aee4ce9a3a59a5a8fff7a30af_o76 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o76 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o76 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data" -8090585aee4ce9a3a59a5a8fff7a30af_o76 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o77 : created = 2021-01-05 00:00:00+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o77 : createdBy = ['https://pypi.org/user/charlesr.harris/', 'https://pypi.org/user/matthew.brett/', 'https://pypi.org/user/mattip/', 'https://pypi.org/user/rgommers/', 'https://pypi.org/user/teoliphant/'] -8090585aee4ce9a3a59a5a8fff7a30af_o77 : specVersion = "3.0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o78 : spdxId = "https://my-first-aibom.com/word-model-tested-on" -8090585aee4ce9a3a59a5a8fff7a30af_o78::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o46 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o78::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o78 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/testedOn" -8090585aee4ce9a3a59a5a8fff7a30af_o78::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o73 : to -8090585aee4ce9a3a59a5a8fff7a30af_o79 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/LICENSE" -8090585aee4ce9a3a59a5a8fff7a30af_o79 : comment = "License of the software" -8090585aee4ce9a3a59a5a8fff7a30af_o79::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o79 : name = "/master/LICENSE.md" -8090585aee4ce9a3a59a5a8fff7a30af_o79 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o79 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o79 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" -8090585aee4ce9a3a59a5a8fff7a30af_o79 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o80 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/data" -8090585aee4ce9a3a59a5a8fff7a30af_o80 : comment = "This directory contains all the data and examples required to train the simpleHTR AI model" -8090585aee4ce9a3a59a5a8fff7a30af_o80::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o80 : name = "/data" -8090585aee4ce9a3a59a5a8fff7a30af_o80 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o80 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data" -8090585aee4ce9a3a59a5a8fff7a30af_o80 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/directory" -8090585aee4ce9a3a59a5a8fff7a30af_o81 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src- contains" -8090585aee4ce9a3a59a5a8fff7a30af_o81::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o82 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src" -8090585aee4ce9a3a59a5a8fff7a30af_o82 : comment = "This directory contains all the source code files that is required for simpleHTR application" -8090585aee4ce9a3a59a5a8fff7a30af_o82::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o82 : name = "/src" -8090585aee4ce9a3a59a5a8fff7a30af_o82 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o82 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source" -8090585aee4ce9a3a59a5a8fff7a30af_o82 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/directory" -8090585aee4ce9a3a59a5a8fff7a30af_o82 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o81::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o81 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" -8090585aee4ce9a3a59a5a8fff7a30af_o83 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src/main" -8090585aee4ce9a3a59a5a8fff7a30af_o83 : comment = "This file is the main entry point for execution of the Handwriting recognition application. " -8090585aee4ce9a3a59a5a8fff7a30af_o83::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o83 : name = "/src/main.py" -8090585aee4ce9a3a59a5a8fff7a30af_o83 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o83 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source'] -8090585aee4ce9a3a59a5a8fff7a30af_o83 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/executable" -8090585aee4ce9a3a59a5a8fff7a30af_o83 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o81::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o83 : to -8090585aee4ce9a3a59a5a8fff7a30af_o84 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src/create_lmdb" -8090585aee4ce9a3a59a5a8fff7a30af_o84 : comment = "This file is to store images into lmdb as pickled grayscale images" -8090585aee4ce9a3a59a5a8fff7a30af_o84::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o84 : name = "/src/create_lmdb.py" -8090585aee4ce9a3a59a5a8fff7a30af_o84 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o84 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source'] -8090585aee4ce9a3a59a5a8fff7a30af_o84 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/executable" -8090585aee4ce9a3a59a5a8fff7a30af_o84 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o81::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o84 : to -8090585aee4ce9a3a59a5a8fff7a30af_o85 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src/dataloader_iam" -8090585aee4ce9a3a59a5a8fff7a30af_o85 : comment = "Loads data which corresponds to IAM format" -8090585aee4ce9a3a59a5a8fff7a30af_o85::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o85 : name = "/src/dataloader_iam.py" -8090585aee4ce9a3a59a5a8fff7a30af_o85 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o85 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source'] -8090585aee4ce9a3a59a5a8fff7a30af_o85 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/executable" -8090585aee4ce9a3a59a5a8fff7a30af_o85 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o81::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o85 : to -8090585aee4ce9a3a59a5a8fff7a30af_o86 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src/model" -8090585aee4ce9a3a59a5a8fff7a30af_o86 : comment = "Source code for the AI model that is used in this application" -8090585aee4ce9a3a59a5a8fff7a30af_o86::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o86 : name = "/src/model.py" -8090585aee4ce9a3a59a5a8fff7a30af_o86 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o86 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/executable'] -8090585aee4ce9a3a59a5a8fff7a30af_o86 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o86 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o81::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o86 : to -8090585aee4ce9a3a59a5a8fff7a30af_o87 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/src/preprocessor" -8090585aee4ce9a3a59a5a8fff7a30af_o87 : comment = "Source code for preprocessing the data that is used for training and testing the model" -8090585aee4ce9a3a59a5a8fff7a30af_o87::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o87 : name = "/src/preprocessor.py" -8090585aee4ce9a3a59a5a8fff7a30af_o87 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o87 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/executable'] -8090585aee4ce9a3a59a5a8fff7a30af_o87 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/source" -8090585aee4ce9a3a59a5a8fff7a30af_o87 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o81::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o87 : to -8090585aee4ce9a3a59a5a8fff7a30af_o88 : spdxId = "https://my-first-aibom.com/SimpleHTR" -8090585aee4ce9a3a59a5a8fff7a30af_o88::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o88 : name = "simpleHTR" -8090585aee4ce9a3a59a5a8fff7a30af_o88 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o88 : software_downloadLocation = "https://github.com/githubharald/SimpleHTR/tree/master" -8090585aee4ce9a3a59a5a8fff7a30af_o89 : spdxId = "https://pypi.org/project/opencv-python/4.4.0.46/" -8090585aee4ce9a3a59a5a8fff7a30af_o90 : created = 2020-11-02 00:00:00+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o90 : createdBy = ['https://pypi.org/user/andrey.senyaev/', 'https://pypi.org/user/asmorkalov/', 'https://pypi.org/user/sergregory/', 'https://pypi.org/user/skvark/'] -8090585aee4ce9a3a59a5a8fff7a30af_o90 : specVersion = "3.0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o89::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o90 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o89 : description = "Pre-built CPU-only OpenCV packages for Python." -8090585aee4ce9a3a59a5a8fff7a30af_o89 : name = "opencv-python" -8090585aee4ce9a3a59a5a8fff7a30af_o89 : originatedBy = ['https://pypi.org/user/andrey.senyaev/', 'https://pypi.org/user/asmorkalov/', 'https://pypi.org/user/sergregory/', 'https://pypi.org/user/skvark/'] -8090585aee4ce9a3a59a5a8fff7a30af_o89 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" -8090585aee4ce9a3a59a5a8fff7a30af_o89 : software_downloadLocation = "https://pypi.org/project/opencv-python/4.4.0.46/" -8090585aee4ce9a3a59a5a8fff7a30af_o89 : software_homePage = "https://github.com/opencv/opencv-python" -8090585aee4ce9a3a59a5a8fff7a30af_o89 : software_packageVersion = "4.4.0.46" -8090585aee4ce9a3a59a5a8fff7a30af_o91 : created = 2020-12-14 00:00:00+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o91 : createdBy = ['https://pypi.org/user/mihaimaruseac/', 'https://pypi.org/user/rishikasinha/', 'https://pypi.org/user/rostam/', 'https://pypi.org/user/tf-nightly/'] -8090585aee4ce9a3a59a5a8fff7a30af_o91 : specVersion = "3.0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o92 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model" -8090585aee4ce9a3a59a5a8fff7a30af_o92 : comment = "This directory contains several images required for documentation" -8090585aee4ce9a3a59a5a8fff7a30af_o92::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o92 : name = "/model" -8090585aee4ce9a3a59a5a8fff7a30af_o92 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o92 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library'] -8090585aee4ce9a3a59a5a8fff7a30af_o92 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o92 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/directory" -8090585aee4ce9a3a59a5a8fff7a30af_o93 : spdxId = "https://my-first-aibom.com/BOM1" -8090585aee4ce9a3a59a5a8fff7a30af_o93::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o93 : element = ['TO BE ADDED LATER'] -8090585aee4ce9a3a59a5a8fff7a30af_o93::rootElement --> 8090585aee4ce9a3a59a5a8fff7a30af_o88 : rootElement -8090585aee4ce9a3a59a5a8fff7a30af_o93 : software_sbomType = ['https://spdx.org/rdf/3.0.0/terms/Software/SbomType/analyzed'] -8090585aee4ce9a3a59a5a8fff7a30af_o94 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/doc/decoder_comparision" -8090585aee4ce9a3a59a5a8fff7a30af_o94 : comment = "An image that shows documentation related information for simpleHTR options" -8090585aee4ce9a3a59a5a8fff7a30af_o94::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o94 : name = "/doc/decoder_comparision.png" -8090585aee4ce9a3a59a5a8fff7a30af_o94 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o94 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o94 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" -8090585aee4ce9a3a59a5a8fff7a30af_o94 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o95 : spdxId = "https://pypi.org/project/editdistance/0.5.2/" -8090585aee4ce9a3a59a5a8fff7a30af_o96 : created = 2018-09-17 00:00:00+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o96 : createdBy = ['https://pypi.org/user/aflc/'] -8090585aee4ce9a3a59a5a8fff7a30af_o96 : specVersion = "3.0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o95::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o96 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o95 : description = "This library simply implements Levenshtein distance with C++ and Cython." -8090585aee4ce9a3a59a5a8fff7a30af_o95 : name = "editdistance" -8090585aee4ce9a3a59a5a8fff7a30af_o95 : originatedBy = ['https://pypi.org/user/aflc/'] -8090585aee4ce9a3a59a5a8fff7a30af_o95 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" -8090585aee4ce9a3a59a5a8fff7a30af_o95 : software_downloadLocation = "https://pypi.org/project/editdistance/0.5.2/" -8090585aee4ce9a3a59a5a8fff7a30af_o95 : software_homePage = "https://github.com/roy-ht/editdistance" -8090585aee4ce9a3a59a5a8fff7a30af_o95 : software_packageVersion = "0.5.2" -8090585aee4ce9a3a59a5a8fff7a30af_o97 : spdxId = "https://pypi.org/project/matplotlib/3.2.1/" -8090585aee4ce9a3a59a5a8fff7a30af_o97 : creationInfo = "_:creationinfo_of_matplotlib" -8090585aee4ce9a3a59a5a8fff7a30af_o97 : description = "Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python." -8090585aee4ce9a3a59a5a8fff7a30af_o97 : name = "lmdb" -8090585aee4ce9a3a59a5a8fff7a30af_o97 : originatedBy = ['https://pypi.org/org/matplotlib/'] -8090585aee4ce9a3a59a5a8fff7a30af_o97 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" -8090585aee4ce9a3a59a5a8fff7a30af_o97 : software_downloadLocation = "https://pypi.org/project/matplotlib/3.2.1/" -8090585aee4ce9a3a59a5a8fff7a30af_o97 : software_homePage = "https://matplotlib.org/" -8090585aee4ce9a3a59a5a8fff7a30af_o97 : software_packageVersion = "3.2.1" -8090585aee4ce9a3a59a5a8fff7a30af_o98 : spdxId = "https://my-first-aibom.com/SimpleHTR-contains" -8090585aee4ce9a3a59a5a8fff7a30af_o98::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o88 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o98::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o98 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" -8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o82 : to -8090585aee4ce9a3a59a5a8fff7a30af_o99 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/doc" -8090585aee4ce9a3a59a5a8fff7a30af_o99 : comment = "This directory contains several images required for documentation" -8090585aee4ce9a3a59a5a8fff7a30af_o99::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o99 : name = "/doc" -8090585aee4ce9a3a59a5a8fff7a30af_o99 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o99 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" -8090585aee4ce9a3a59a5a8fff7a30af_o99 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/directory" -8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o99 : to -8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o92 : to -8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o80 : to -8090585aee4ce9a3a59a5a8fff7a30af_o100 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/.gitignore" -8090585aee4ce9a3a59a5a8fff7a30af_o100 : comment = "The git ignore file for the directory" -8090585aee4ce9a3a59a5a8fff7a30af_o100::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o100 : name = "/master/.gitignore" -8090585aee4ce9a3a59a5a8fff7a30af_o100 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o100 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/other" -8090585aee4ce9a3a59a5a8fff7a30af_o100 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o100 : to -8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o79 : to -8090585aee4ce9a3a59a5a8fff7a30af_o101 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/README" -8090585aee4ce9a3a59a5a8fff7a30af_o101 : comment = "The overall documentation and getting started of the document" -8090585aee4ce9a3a59a5a8fff7a30af_o101::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o101 : name = "/master/README.md" -8090585aee4ce9a3a59a5a8fff7a30af_o101 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o101 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o101 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" -8090585aee4ce9a3a59a5a8fff7a30af_o101 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o101 : to -8090585aee4ce9a3a59a5a8fff7a30af_o102 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/requirements" -8090585aee4ce9a3a59a5a8fff7a30af_o102 : comment = "Lists the external package dependencies that are required to be satisfied for the application to execute" -8090585aee4ce9a3a59a5a8fff7a30af_o102::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o102 : name = "/master/requirements.txt" -8090585aee4ce9a3a59a5a8fff7a30af_o102 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o102 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o102 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/requirement" -8090585aee4ce9a3a59a5a8fff7a30af_o102 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o98::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o102 : to -8090585aee4ce9a3a59a5a8fff7a30af_o103 : spdxId = "https://my-first-aibom.com/SimpleHTR-depends-on" -8090585aee4ce9a3a59a5a8fff7a30af_o103::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o88 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o103::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o103 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/dependsOn" -8090585aee4ce9a3a59a5a8fff7a30af_o104 : spdxId = "https://pypi.org/project/tensorflow/2.4.0/" -8090585aee4ce9a3a59a5a8fff7a30af_o104::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o91 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o104 : description = "TensorFlow is an open source software library for high performance numerical computation. Its flexible architecture allows easy deployment of computation across a variety of platforms (CPUs, GPUs, TPUs), and from desktops to clusters of servers to mobile and edge devices." -8090585aee4ce9a3a59a5a8fff7a30af_o104 : name = "tensorflow" -8090585aee4ce9a3a59a5a8fff7a30af_o104 : originatedBy = ['https://pypi.org/user/jaraco/'] -8090585aee4ce9a3a59a5a8fff7a30af_o104 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" -8090585aee4ce9a3a59a5a8fff7a30af_o104 : software_downloadLocation = "https://pypi.org/project/tensorflow/2.4.0/" -8090585aee4ce9a3a59a5a8fff7a30af_o104 : software_homePage = "https://www.tensorflow.org/" -8090585aee4ce9a3a59a5a8fff7a30af_o104 : software_packageVersion = "2.4.0" -8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o104 : to -8090585aee4ce9a3a59a5a8fff7a30af_o105 : spdxId = "https://pypi.org/project/path/15.0.0/" -8090585aee4ce9a3a59a5a8fff7a30af_o105::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o44 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o105 : description = "path (aka path pie, formerly path.py) implements path objects as first-class entities, allowing common operations on files to be invoked on those path objects directly" -8090585aee4ce9a3a59a5a8fff7a30af_o105 : name = "path" -8090585aee4ce9a3a59a5a8fff7a30af_o105 : originatedBy = ['https://pypi.org/user/jaraco/'] -8090585aee4ce9a3a59a5a8fff7a30af_o105 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" -8090585aee4ce9a3a59a5a8fff7a30af_o105 : software_downloadLocation = "https://pypi.org/project/path/15.0.0/" -8090585aee4ce9a3a59a5a8fff7a30af_o105 : software_homePage = "https://github.com/jaraco/path" -8090585aee4ce9a3a59a5a8fff7a30af_o105 : software_packageVersion = "15.0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o105 : to -8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o89 : to -8090585aee4ce9a3a59a5a8fff7a30af_o106 : spdxId = "https://pypi.org/project/numpy/1.19.5/" -8090585aee4ce9a3a59a5a8fff7a30af_o106 : creationInfo = "_:creationinfo_of_matplotlib" -8090585aee4ce9a3a59a5a8fff7a30af_o106 : description = "NumPy is the fundamental package for scientific computing with Python." -8090585aee4ce9a3a59a5a8fff7a30af_o106 : name = "numpy" -8090585aee4ce9a3a59a5a8fff7a30af_o106 : originatedBy = ['https://pypi.org/user/charlesr.harris/', 'https://pypi.org/user/matthew.brett/', 'https://pypi.org/user/mattip/', 'https://pypi.org/user/rgommers/', 'https://pypi.org/user/teoliphant/'] -8090585aee4ce9a3a59a5a8fff7a30af_o106 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/library" -8090585aee4ce9a3a59a5a8fff7a30af_o106 : software_downloadLocation = "https://pypi.org/project/numpy/1.19.5/" -8090585aee4ce9a3a59a5a8fff7a30af_o106 : software_homePage = "https://numpy.org/" -8090585aee4ce9a3a59a5a8fff7a30af_o106 : software_packageVersion = "1.19.5" -8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o106 : to -8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o97 : to -8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o11 : to -8090585aee4ce9a3a59a5a8fff7a30af_o103::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o95 : to -8090585aee4ce9a3a59a5a8fff7a30af_o107 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/doc-contains" -8090585aee4ce9a3a59a5a8fff7a30af_o107::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o99 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o107::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o107 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" -8090585aee4ce9a3a59a5a8fff7a30af_o107::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o94 : to -8090585aee4ce9a3a59a5a8fff7a30af_o107::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o10 : to -8090585aee4ce9a3a59a5a8fff7a30af_o108 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/doc/htr" -8090585aee4ce9a3a59a5a8fff7a30af_o108 : comment = "An image that shows documentation related information for simpleHTR options" -8090585aee4ce9a3a59a5a8fff7a30af_o108::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o108 : name = "/doc/htr.png" -8090585aee4ce9a3a59a5a8fff7a30af_o108 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o108 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o108 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/documentation" -8090585aee4ce9a3a59a5a8fff7a30af_o108 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o107::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o108 : to -8090585aee4ce9a3a59a5a8fff7a30af_o109 : spdxId = "https://spdx.org/spdxdocs/CustomLicense-c63547c2-62e0-48ec-b98d-ff1b917d67db" -8090585aee4ce9a3a59a5a8fff7a30af_o109::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o109 : expandedlicensing_isFsfLibre = False -8090585aee4ce9a3a59a5a8fff7a30af_o109 : expandedlicensing_isOsiApproved = False -8090585aee4ce9a3a59a5a8fff7a30af_o109 : simplelicensing_licenseText = "This database may be used for non-commercial research purpose only. If you publish material based on this database, we request you to include a reference to paper. U. Marti and H. Bunke. The IAM-database: An English Sentence Database for Off-line Handwriting Recognition. Int. Journal on Document Analysis and Recognition, Volume 5, pages 39 - 46, 2002." -8090585aee4ce9a3a59a5a8fff7a30af_o110 : spdxId = "https://spdx.org/spdxdocs/Relationship/declaredLicense-2c9563dc-baa1-4385-be02-ad671976a8aa" -8090585aee4ce9a3a59a5a8fff7a30af_o110::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o73 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o110::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o110 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/hasDeclaredLicense" -8090585aee4ce9a3a59a5a8fff7a30af_o110::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o109 : to -8090585aee4ce9a3a59a5a8fff7a30af_o111 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model-contains" -8090585aee4ce9a3a59a5a8fff7a30af_o111::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o92 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o111::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o111 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" -8090585aee4ce9a3a59a5a8fff7a30af_o111::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o4 : to -8090585aee4ce9a3a59a5a8fff7a30af_o112 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model" -8090585aee4ce9a3a59a5a8fff7a30af_o112 : comment = "This file is not present at the source repo in VCS, but the users of the application are required to download it from the specified download location and present make it a part of the ./model/ directory" -8090585aee4ce9a3a59a5a8fff7a30af_o112::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o112 : description = "The simpleHTR application uses two AI models which is distributed as a Zip file. This model is a word -level handwriting recognition model" -8090585aee4ce9a3a59a5a8fff7a30af_o112 : name = "word-model" -8090585aee4ce9a3a59a5a8fff7a30af_o112 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o112 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/archive'] -8090585aee4ce9a3a59a5a8fff7a30af_o112 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o112 : software_downloadLocation = "https://www.dropbox.com/s/7xwkcilho10rthn/word-model.zip?dl=1" -8090585aee4ce9a3a59a5a8fff7a30af_o111::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o112 : to -8090585aee4ce9a3a59a5a8fff7a30af_o113 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/wordCharList" -8090585aee4ce9a3a59a5a8fff7a30af_o113 : comment = "Configuration/parameter file for the beam search decoder of the model" -8090585aee4ce9a3a59a5a8fff7a30af_o113::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o113 : name = "/model/wordCharList.txt" -8090585aee4ce9a3a59a5a8fff7a30af_o113 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o113 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o113 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/configuration" -8090585aee4ce9a3a59a5a8fff7a30af_o113 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o111::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o113 : to -8090585aee4ce9a3a59a5a8fff7a30af_o114 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/.gitignore" -8090585aee4ce9a3a59a5a8fff7a30af_o114 : comment = "The gitignore file for the directory" -8090585aee4ce9a3a59a5a8fff7a30af_o114::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o114 : name = "/model/.gitignore" -8090585aee4ce9a3a59a5a8fff7a30af_o114 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o114 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/other" -8090585aee4ce9a3a59a5a8fff7a30af_o114 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o111::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o114 : to -8090585aee4ce9a3a59a5a8fff7a30af_o115 : spdxId = "https://my-first-aibom.com/line-model-tested-on" -8090585aee4ce9a3a59a5a8fff7a30af_o115::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o14 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o115::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o115 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/testedOn" -8090585aee4ce9a3a59a5a8fff7a30af_o115::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o73 : to -8090585aee4ce9a3a59a5a8fff7a30af_o116 : spdxId = "https://spdx.org/spdxdocs/Relationship/concludedLicense-7ea6e28f-eead-4b56-8376-282e2d31397b" -8090585aee4ce9a3a59a5a8fff7a30af_o116::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o88 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o116::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o116 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/hasConcludedLicense" -8090585aee4ce9a3a59a5a8fff7a30af_o116 : to = ['MIT'] -8090585aee4ce9a3a59a5a8fff7a30af_o117 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model-contains" -8090585aee4ce9a3a59a5a8fff7a30af_o117::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o112 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o117::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o117 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" -8090585aee4ce9a3a59a5a8fff7a30af_o118 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/charList" -8090585aee4ce9a3a59a5a8fff7a30af_o118 : comment = "Configuration/parameter file for the beam search decoder of the model" -8090585aee4ce9a3a59a5a8fff7a30af_o118::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o118 : name = "/model/word-model/CharList.txt" -8090585aee4ce9a3a59a5a8fff7a30af_o118 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o118 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/configuration'] -8090585aee4ce9a3a59a5a8fff7a30af_o118 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o118 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o118 : to -8090585aee4ce9a3a59a5a8fff7a30af_o119 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/checkpoint" -8090585aee4ce9a3a59a5a8fff7a30af_o119 : comment = "Saved checkpoint of the model" -8090585aee4ce9a3a59a5a8fff7a30af_o119::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o119 : name = "/model/word-model/checkpoint" -8090585aee4ce9a3a59a5a8fff7a30af_o119 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o119 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o119 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o119 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o119 : to -8090585aee4ce9a3a59a5a8fff7a30af_o120 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.data-00000-of-00001" -8090585aee4ce9a3a59a5a8fff7a30af_o120 : comment = "Actual values of all variables that make up the word level handwriting recognition AI model" -8090585aee4ce9a3a59a5a8fff7a30af_o120::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o120 : name = "/model/word-model/snapshot-33.data-00000-of-00001" -8090585aee4ce9a3a59a5a8fff7a30af_o120 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o120 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o120 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o120 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o120 : to -8090585aee4ce9a3a59a5a8fff7a30af_o121 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.index" -8090585aee4ce9a3a59a5a8fff7a30af_o121 : comment = "The name and shape of all the variables that make up the word level handwriting recognition AI model thier actual data is stored in /model/word-model/snapshot-33.index" -8090585aee4ce9a3a59a5a8fff7a30af_o121::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o121 : name = "/model/word-model/snapshot-33.index" -8090585aee4ce9a3a59a5a8fff7a30af_o121 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o121 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o121 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o121 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o121 : to -8090585aee4ce9a3a59a5a8fff7a30af_o122 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/snapshot-33.meta" -8090585aee4ce9a3a59a5a8fff7a30af_o122 : comment = "Its a file storing all the information required to restore a training or information process including the graph that describes the data flow and additional annotations that describes the variables, input pipelines and other relevant information" -8090585aee4ce9a3a59a5a8fff7a30af_o122::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o122 : name = "/model/word-model/snapshot-33.meta" -8090585aee4ce9a3a59a5a8fff7a30af_o122 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o122 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o122 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/model" -8090585aee4ce9a3a59a5a8fff7a30af_o122 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o122 : to -8090585aee4ce9a3a59a5a8fff7a30af_o123 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model/summary.json" -8090585aee4ce9a3a59a5a8fff7a30af_o123 : comment = "Records the character level error rates of each letter in a json format" -8090585aee4ce9a3a59a5a8fff7a30af_o123::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o123 : name = "/model/word-model/summary.json" -8090585aee4ce9a3a59a5a8fff7a30af_o123 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o123 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data', 'https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o123 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/evidence" -8090585aee4ce9a3a59a5a8fff7a30af_o123 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o117::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o123 : to -8090585aee4ce9a3a59a5a8fff7a30af_o124 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/data-contains" -8090585aee4ce9a3a59a5a8fff7a30af_o124::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o80 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o124::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o124 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/contains" -8090585aee4ce9a3a59a5a8fff7a30af_o125 : spdxId = "https://github.com/githubharald/SimpleHTR/tree/master/data/corpus" -8090585aee4ce9a3a59a5a8fff7a30af_o125 : comment = "The data corpus extracted from IAM dataset and this data is used to train the underlying simpleHTR AI model" -8090585aee4ce9a3a59a5a8fff7a30af_o125::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o125 : name = "/data/corpus.txt" -8090585aee4ce9a3a59a5a8fff7a30af_o125 : originatedBy = ['https://github.com/githubharald'] -8090585aee4ce9a3a59a5a8fff7a30af_o125 : software_additionalPurpose = ['https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/file'] -8090585aee4ce9a3a59a5a8fff7a30af_o125 : software_primaryPurpose = "https://spdx.org/rdf/3.0.0/terms/Software/SoftwarePurpose/data" -8090585aee4ce9a3a59a5a8fff7a30af_o125 : software_fileKind = "https://spdx.org/rdf/3.0.0/terms/Software/FileKindType/file" -8090585aee4ce9a3a59a5a8fff7a30af_o124::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o125 : to -8090585aee4ce9a3a59a5a8fff7a30af_o124::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o76 : to -8090585aee4ce9a3a59a5a8fff7a30af_o124::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o13 : to -8090585aee4ce9a3a59a5a8fff7a30af_o126 : created = 2020-03-18 00:00:00+00:00 -8090585aee4ce9a3a59a5a8fff7a30af_o126 : createdBy = ['https://pypi.org/org/matplotlib/'] -8090585aee4ce9a3a59a5a8fff7a30af_o126 : specVersion = "3.0.0" -8090585aee4ce9a3a59a5a8fff7a30af_o127 : spdxId = "https://my-first-aibom.com/document1" -8090585aee4ce9a3a59a5a8fff7a30af_o127::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o127 : profileConformance = ['https://spdx.org/rdf/3.0.0/terms/Core/ProfileIdentifierType/core', 'https://spdx.org/rdf/3.0.0/terms/Core/ProfileIdentifierType/software', 'https://spdx.org/rdf/3.0.0/terms/Core/ProfileIdentifierType/ai', 'https://spdx.org/rdf/3.0.0/terms/Core/ProfileIdentifierType/dataset'] -8090585aee4ce9a3a59a5a8fff7a30af_o127::rootElement --> 8090585aee4ce9a3a59a5a8fff7a30af_o93 : rootElement -8090585aee4ce9a3a59a5a8fff7a30af_o128 : spdxId = "https://spdx.org/spdxdocs/Relationship/concludedLicense-3bcfa4ce-6a65-46e8-bed1-18985211bb9e" -8090585aee4ce9a3a59a5a8fff7a30af_o128::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o73 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o128::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o128 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/hasConcludedLicense" -8090585aee4ce9a3a59a5a8fff7a30af_o128::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o109 : to -8090585aee4ce9a3a59a5a8fff7a30af_o129 : spdxId = "https://my-first-aibom.com/line-model-trained-on" -8090585aee4ce9a3a59a5a8fff7a30af_o129::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o2 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o14 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o129::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o129 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/trainedOn" -8090585aee4ce9a3a59a5a8fff7a30af_o129::to --> 8090585aee4ce9a3a59a5a8fff7a30af_o73 : to -8090585aee4ce9a3a59a5a8fff7a30af_o130 : spdxId = "https://spdx.org/spdxdocs/Relationship/declaredLicense-6f9cae4f-b015-473b-a87c-4a330c589331" -8090585aee4ce9a3a59a5a8fff7a30af_o130::creationInfo --> 8090585aee4ce9a3a59a5a8fff7a30af_o42 : creationInfo -8090585aee4ce9a3a59a5a8fff7a30af_o88 <-- 8090585aee4ce9a3a59a5a8fff7a30af_o130::from : from -8090585aee4ce9a3a59a5a8fff7a30af_o130 : relationshipType = "https://spdx.org/rdf/3.0.0/terms/Core/RelationshipType/hasDeclaredLicense" -8090585aee4ce9a3a59a5a8fff7a30af_o130 : to = ['MIT'] -@enduml From 74b7c5f11f5044470b0b1a9bb104f971ccb074c8 Mon Sep 17 00:00:00 2001 From: Joshua Watt Date: Mon, 10 Jun 2024 13:31:46 -0600 Subject: [PATCH 06/11] github actions: Fix workflow Fixes the github actions workflow to correctly validates SPDX 2 and SPDX 3 documents, and fixes example-13 to conform to the validation Signed-off-by: Joshua Watt --- .github/workflows/pull_request.yml | 48 +++++++++++++++++-- .../example13/spdx-3.0/example-13-spdx-3.json | 20 ++++---- 2 files changed, 53 insertions(+), 15 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 82ffa6e..43a9474 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -1,18 +1,56 @@ name: SPDX validation -on: pull_request +on: + - pull_request + - push jobs: SPDX_Validation: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Setup + + - name: Look for files that are not checked + run: | + find . \( -name '*.spdx' -o -name '*.json' \) \ + -not -path './presentations/*' \ + -not -path './tools-java/*' \ + -not -path '*/spdx2.2/*' \ + -not -path '*/spdx2.3/*' \ + -not -path '*/spdx-3.0/*' | tee flist.txt + + test "$(cat flist.txt | wc -l)" = "0" + + - name: Update apt + run: | + sudo apt update -y + + - name: Setup Java tools run: | sudo apt install -y default-jdk maven git clone https://github.com/spdx/tools-java.git && cd tools-java export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") mvn clean install && cd .. - - - name: Validate SPDX Documents + + - name: Setup Python tools + run: | + python3 -m pip install -U pip + python3 -m pip install \ + check-jsonschema \ + pyshacl + + - name: Validate SPDX 2.2 & SPDX 2.3 Documents run: | - find . -name *.spdx -o -name *.json -exec echo {} \; -exec java -jar tools-java/target/tools-java-*-jar-with-dependencies.jar Verify {} \; + find . \( -path '*/spdx2.2/*' -o -path '*/spdx2.3/*' \) \( -name *.spdx -o -name *.json \) \ + -exec echo {} \; \ + -exec java -jar tools-java/target/tools-java-*-jar-with-dependencies.jar Verify {} \; + + - name: Validate SPDX 3.0 Documents + run: | + SPDX30_SCHEMA_URL="https://spdx.org/schema/3.0.0/spdx-json-schema.json" + SPDX30_SHACL_URL="https://spdx.org/rdf/3.0.0/spdx-model.ttl" + + for f in $(find . -type f -path '*/spdx-3.0/*.json'); do + echo "Checking $f..." + check-jsonschema -v --schemafile $SPDX30_SCHEMA_URL $f + pyshacl -s $SPDX30_SHACL_URL -e $SPDX30_SHACL_URL $f + done diff --git a/software/example13/spdx-3.0/example-13-spdx-3.json b/software/example13/spdx-3.0/example-13-spdx-3.json index fe2b391..225f23c 100644 --- a/software/example13/spdx-3.0/example-13-spdx-3.json +++ b/software/example13/spdx-3.0/example-13-spdx-3.json @@ -6,7 +6,7 @@ "spdxId": "urn:jane-doe-1@acme.com-4fe40e24-20e3-11ee-be56-0242ac120002", "creationInfo": "_:creationinfo", "name": "Application Owner Jane Doe", - "externalIdentifiers": [ + "externalIdentifier": [ { "type": "ExternalIdentifier", "externalIdentifierType": "email", @@ -25,11 +25,11 @@ "spdxId": "urn:github.com-indutny-c4fe40e24-20e3-11ee-be56-0242ac120002", "creationInfo": "_:creationinfo", "name": "Fedor Indutny", - "externalIdentifiers": [ + "externalIdentifier": [ { "type": "ExternalIdentifier", "externalIdentifierType": "other", - "identifierLocator": "https://github.com/indutny" + "identifier": "https://github.com/indutny" } ] }, @@ -91,11 +91,11 @@ "software_packageVersion": "6.5.2", "suppliedBy": "urn:github.com-indutny-c4fe40e24-20e3-11ee-be56-0242ac120002", "software_primaryPurpose": "library", - "externalIdentifiers": [ + "externalIdentifier": [ { "type": "ExternalIdentifier", "externalIdentifierType": "other", - "identifierLocator": "https://github.com/indutny/elliptic/releases/tag/v6.5.2" + "identifier": "https://github.com/indutny/elliptic/releases/tag/v6.5.2" } ] @@ -122,7 +122,7 @@ "spdxId": "urn:acme-relationship-1-4fe40e24-20e3-11ee-be56-0242ac120002", "creationInfo": "_:creationinfo", "from": "urn:product-acme-application-1.3-4fe40e24-20e3-11ee-be56-0242ac120002", - "to": "urn:jane-doe-1@acme.com-4fe40e24-20e3-11ee-be56-0242ac120002", + "to": ["urn:jane-doe-1@acme.com-4fe40e24-20e3-11ee-be56-0242ac120002"], "relationshipType": "availableFrom" }, { @@ -130,7 +130,7 @@ "spdxId": "urn:acme-relationship-2-4fe40e24-20e3-11ee-be56-0242ac120002", "creationInfo": "_:creationinfo", "from": "urn:product-acme-application-1.3-4fe40e24-20e3-11ee-be56-0242ac120002", - "to": "urn:npm-elliptic-6.5.2-4fe40e24-20e3-11ee-be56-0242ac120002", + "to": ["urn:npm-elliptic-6.5.2-4fe40e24-20e3-11ee-be56-0242ac120002"], "relationshipType": "contains" }, { @@ -138,15 +138,15 @@ "spdxId": "urn:acme-relationship-3-4fe40e24-20e3-11ee-be56-0242ac120002", "creationInfo": "_:creationinfo", "from": "urn:product-acme-application-1.3-4fe40e24-20e3-11ee-be56-0242ac120002", - "to": "urn:container-alpine-latest-sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a-4fe40e24-20e3-11ee-be56-0242ac120002", - "relationshipType": "depends_on" + "to": ["urn:container-alpine-latest-sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a-4fe40e24-20e3-11ee-be56-0242ac120002"], + "relationshipType": "dependsOn" }, { "type": "Relationship", "spdxId": "urn:acme-relationship-4-4fe40e24-20e3-11ee-be56-0242ac120002", "creationInfo": "_:creationinfo", "from": "urn:container-alpine-latest-sha256:69665d02cb32192e52e07644d76bc6f25abeb5410edc1c7a81a10ba3f0efb90a-4fe40e24-20e3-11ee-be56-0242ac120002", - "to": "urn:openssl-3.0.4-4fe40e24-20e3-11ee-be56-0242ac120002", + "to": ["urn:openssl-3.0.4-4fe40e24-20e3-11ee-be56-0242ac120002"], "relationshipType": "contains" } ] From fe1b9b667cdb20c83bdc882e7deb88a62a567248 Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Mon, 17 Jun 2024 01:26:58 +0100 Subject: [PATCH 07/11] Fix to: cardinality --- ai/simpleHTR-example.json | 58 ++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/ai/simpleHTR-example.json b/ai/simpleHTR-example.json index a2f83f5..c2ab657 100644 --- a/ai/simpleHTR-example.json +++ b/ai/simpleHTR-example.json @@ -151,9 +151,9 @@ "relationshipType": "contains", "from": "https://github.com/githubharald/SimpleHTR/tree/master/src", "to": [ - "https://github.com/githubharald/SimpleHTR/tree/master/src/main", "https://github.com/githubharald/SimpleHTR/tree/master/src/create_lmdb", "https://github.com/githubharald/SimpleHTR/tree/master/src/dataloader_iam", + "https://github.com/githubharald/SimpleHTR/tree/master/src/main", "https://github.com/githubharald/SimpleHTR/tree/master/src/model", "https://github.com/githubharald/SimpleHTR/tree/master/src/preprocessor" ] @@ -530,10 +530,10 @@ "relationshipType": "contains", "from": "https://github.com/githubharald/SimpleHTR/tree/master/model", "to": [ + "https://github.com/githubharald/SimpleHTR/tree/master/model/.gitignore", "https://github.com/githubharald/SimpleHTR/tree/master/model/line-model", "https://github.com/githubharald/SimpleHTR/tree/master/model/word-model", - "https://github.com/githubharald/SimpleHTR/tree/master/model/wordCharList", - "https://github.com/githubharald/SimpleHTR/tree/master/model/.gitignore" + "https://github.com/githubharald/SimpleHTR/tree/master/model/wordCharList" ] }, { @@ -669,14 +669,14 @@ "relationshipType": "contains", "from": "https://my-first-aibom.com/SimpleHTR", "to": [ - "https://github.com/githubharald/SimpleHTR/tree/master/src", - "https://github.com/githubharald/SimpleHTR/tree/master/doc", - "https://github.com/githubharald/SimpleHTR/tree/master/model", - "https://github.com/githubharald/SimpleHTR/tree/master/data", "https://github.com/githubharald/SimpleHTR/tree/master/.gitignore", "https://github.com/githubharald/SimpleHTR/tree/master/LICENSE", "https://github.com/githubharald/SimpleHTR/tree/master/README", - "https://github.com/githubharald/SimpleHTR/tree/master/requirements" + "https://github.com/githubharald/SimpleHTR/tree/master/data", + "https://github.com/githubharald/SimpleHTR/tree/master/doc", + "https://github.com/githubharald/SimpleHTR/tree/master/model", + "https://github.com/githubharald/SimpleHTR/tree/master/requirements", + "https://github.com/githubharald/SimpleHTR/tree/master/src" ] }, { @@ -866,13 +866,13 @@ "relationshipType": "dependsOn", "from": "https://my-first-aibom.com/SimpleHTR", "to": [ - "https://pypi.org/project/tensorflow/2.4.0/", - "https://pypi.org/project/path/15.0.0/", - "https://pypi.org/project/opencv-python/4.4.0.46/", - "https://pypi.org/project/numpy/1.19.5/", - "https://pypi.org/project/matplotlib/3.2.1/", + "https://pypi.org/project/editdistance/0.5.2/", "https://pypi.org/project/lmdb/1.0.0/", - "https://pypi.org/project/editdistance/0.5.2/" + "https://pypi.org/project/matplotlib/3.2.1/", + "https://pypi.org/project/numpy/1.19.5/", + "https://pypi.org/project/opencv-python/4.4.0.46/", + "https://pypi.org/project/path/15.0.0/", + "https://pypi.org/project/tensorflow/2.4.0/" ] }, { @@ -1035,13 +1035,13 @@ "relationshipType": "dependsOn", "from": "https://my-first-aibom.com/SimpleHTR", "to": [ - "https://pypi.org/project/tensorflow/2.4.0/", - "https://pypi.org/project/path/15.0.0/", - "https://pypi.org/project/opencv-python/4.4.0.46/", - "https://pypi.org/project/numpy/1.19.5/", - "https://pypi.org/project/matplotlib/3.2.1/", + "https://pypi.org/project/editdistance/0.5.2/", "https://pypi.org/project/lmdb/1.0.0/", - "https://pypi.org/project/editdistance/0.5.2/" + "https://pypi.org/project/matplotlib/3.2.1/", + "https://pypi.org/project/numpy/1.19.5/", + "https://pypi.org/project/opencv-python/4.4.0.46/", + "https://pypi.org/project/path/15.0.0/", + "https://pypi.org/project/tensorflow/2.4.0/" ] }, { @@ -1295,7 +1295,9 @@ "creationInfo": "_:creationinfo", "relationshipType": "hasDeclaredLicense", "from": "https://my-first-aibom.com/IAMdataset", - "to": "https://spdx.org/spdxdocs/CustomLicense-c63547c2-62e0-48ec-b98d-ff1b917d67db" + "to": [ + "https://spdx.org/spdxdocs/CustomLicense-c63547c2-62e0-48ec-b98d-ff1b917d67db" + ] }, { "type": "Relationship", @@ -1303,7 +1305,9 @@ "creationInfo": "_:creationinfo", "relationshipType": "hasConcludedLicense", "from": "https://my-first-aibom.com/IAMdataset", - "to": "https://spdx.org/spdxdocs/CustomLicense-c63547c2-62e0-48ec-b98d-ff1b917d67db" + "to": [ + "https://spdx.org/spdxdocs/CustomLicense-c63547c2-62e0-48ec-b98d-ff1b917d67db" + ] }, { "type": "Relationship", @@ -1311,7 +1315,9 @@ "creationInfo": "_:creationinfo", "relationshipType": "hasDeclaredLicense", "from": "https://my-first-aibom.com/SimpleHTR", - "to": "MIT" + "to": [ + "MIT" + ] }, { "type": "Relationship", @@ -1319,7 +1325,9 @@ "creationInfo": "_:creationinfo", "relationshipType": "hasConcludedLicense", "from": "https://my-first-aibom.com/SimpleHTR", - "to": "MIT" + "to": [ + "MIT" + ] } ] -} \ No newline at end of file +} From 822cee05b613d3284d526a8fe7691631b9e1fb06 Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Mon, 17 Jun 2024 02:42:54 +0100 Subject: [PATCH 08/11] Fix cardinality --- ai/simpleHTR-example.json | 70 ++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/ai/simpleHTR-example.json b/ai/simpleHTR-example.json index c2ab657..65016fe 100644 --- a/ai/simpleHTR-example.json +++ b/ai/simpleHTR-example.json @@ -111,8 +111,8 @@ ], "software_primaryPurpose": "model", "software_additionalPurpose": [ - "source", - "executable" + "executable", + "source" ], "comment": "Source code for the AI model that is used in this application", "software_fileKind": "file" @@ -887,7 +887,11 @@ "software_primaryPurpose": "application", "comment": "Word level handwriting recognition model", "ai_autonomyType": "no", - "ai_domain": "image recognition, optical character recognition, handwriting recognition", + "ai_domain": [ + "handwriting recognition", + "image recognition", + "optical character recognition" + ], "ai_hyperparameter": [ { "type": "DictionaryEntry", @@ -1024,9 +1028,14 @@ "value": "[ 0.061394380853277836, 0.10353798126951093, 0.2443635102323968, 0.3935137010058966, 0.449531737773153, 0.5071106486298994, 0.5483870967741935, 0.5613943808532779, 0.5872355185570586, 0.591918140825529, 0.6122095039889005, 0.6184530003468609, 0.620013874436351, 0.6304197016996185, 0.6546999653139092, 0.6481096080471731, 0.6625043357613597, 0.654873395768297, 0.6626777662157475, 0.6722164412070759, 0.6758584807492196, 0.6833159902878946, 0.6817551161984045, 0.6770724939299341, 0.6855705861949358, 0.701179327089837, 0.6945889698231009, 0.690426638917794, 0.6959764134582033, 0.6888657648283039, 0.7034339229968782, 0.7010058966354492, 0.7103711411723899, 0.7065556711758585, 0.7105445716267776, 0.7133194588969823, 0.7018730489073881, 0.7089836975372875, 0.7124523066250433, 0.7129725979882068, 0.7072493929934096, 0.7043010752688172, 0.7169614984391259, 0.7114117238987167, 0.7211238293444329, 0.719389524800555, 0.7134928893513701, 0.7131460284425946, 0.7171349288935137, 0.7221644120707597, 0.7166146375303504, 0.7273673257023934, 0.7190426638917794, 0.7124523066250433, 0.7271938952480056, 0.7238987166146376, 0.7167880679847382, 0.7070759625390218, 0.7278876170655567, 0.723551855705862, 0.7289281997918835, 0.7155740548040236, 0.7225112729795352, 0.723551855705862, 0.7263267429760666, 0.7348248352410683, 0.725979882067291, 0.7282344779743323, 0.7206035379812695, 0.7232049947970863, 0.7273673257023934, 0.7315296566077003, 0.7280610475199445, 0.711064862989941, 0.7337842525147416, 0.723551855705862, 0.7277141866111689, 0.7230315643426986, 0.7351716961498439, 0.7261533125216788, 0.7232049947970863 ]" } ], - "ai_modelDataPreprocessing": "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.", + "ai_modelDataPreprocessing": [ + "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32.", + "Then, we copy the image into a (white) target image of size 128*32." + ], "ai_safetyRiskAssessment": "low", - "ai_typeOfModel": "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" + "ai_typeOfModel": [ + "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" + ] }, { "type": "Relationship", @@ -1056,7 +1065,11 @@ "software_primaryPurpose": "application", "comment": "Line level handwriting recognition model", "ai_autonomyType": "no", - "ai_domain": "image recognition, optical character recognition, handwriting recognition", + "ai_domain": [ + "handwriting recognition", + "image recognition", + "optical character recognition" + ], "ai_hyperparameter": [ { "type": "DictionaryEntry", @@ -1193,9 +1206,26 @@ "value": "[ 0.061394380853277836, 0.10353798126951093, 0.2443635102323968, 0.3935137010058966, 0.449531737773153, 0.5071106486298994, 0.5483870967741935, 0.5613943808532779, 0.5872355185570586, 0.591918140825529, 0.6122095039889005, 0.6184530003468609, 0.620013874436351, 0.6304197016996185, 0.6546999653139092, 0.6481096080471731, 0.6625043357613597, 0.654873395768297, 0.6626777662157475, 0.6722164412070759, 0.6758584807492196, 0.6833159902878946, 0.6817551161984045, 0.6770724939299341, 0.6855705861949358, 0.701179327089837, 0.6945889698231009, 0.690426638917794, 0.6959764134582033, 0.6888657648283039, 0.7034339229968782, 0.7010058966354492, 0.7103711411723899, 0.7065556711758585, 0.7105445716267776, 0.7133194588969823, 0.7018730489073881, 0.7089836975372875, 0.7124523066250433, 0.7129725979882068, 0.7072493929934096, 0.7043010752688172, 0.7169614984391259, 0.7114117238987167, 0.7211238293444329, 0.719389524800555, 0.7134928893513701, 0.7131460284425946, 0.7171349288935137, 0.7221644120707597, 0.7166146375303504, 0.7273673257023934, 0.7190426638917794, 0.7124523066250433, 0.7271938952480056, 0.7238987166146376, 0.7167880679847382, 0.7070759625390218, 0.7278876170655567, 0.723551855705862, 0.7289281997918835, 0.7155740548040236, 0.7225112729795352, 0.723551855705862, 0.7263267429760666, 0.7348248352410683, 0.725979882067291, 0.7282344779743323, 0.7206035379812695, 0.7232049947970863, 0.7273673257023934, 0.7315296566077003, 0.7280610475199445, 0.711064862989941, 0.7337842525147416, 0.723551855705862, 0.7277141866111689, 0.7230315643426986, 0.7351716961498439, 0.7261533125216788, 0.7232049947970863 ]" } ], - "ai_modelDataPreprocessing": "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32. Then, we copy the image into a (white) target image of size 128×32.", + "ai_modelDataPreprocessing": [ + "Usually, the images from the dataset do not have exactly this size, therefore we resize it (without distortion) until it either has a width of 128 or a height of 32.", + "Then, we copy the image into a (white) target image of size 128*32." + ], "ai_safetyRiskAssessment": "low", - "ai_typeOfModel": "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" + "ai_typeOfModel": [ + "Deep Neural network composed of CNN and RNN layers with CTC loss and CTC Decoder which can use either word beam search or best path" + ] + }, + { + "type": "Person", + "spdxId": "https://spdx.org/spdxdocs/Person2-29791633-ba83-413d-a888-f96a9f450ca1", + "creationInfo": "_:creationinfo", + "name": "U. Marti" + }, + { + "type": "Person", + "spdxId": "https://spdx.org/spdxdocs/Person3-384c284c-4da8-4a0c-a9ef-fcbfa4a4083d", + "creationInfo": "_:creationinfo", + "name": "H. Bunke." }, { "type": "dataset_DatasetPackage", @@ -1203,16 +1233,26 @@ "creationInfo": ":_creationinfo", "name": "IAMdataset", "builtTime": "1999-09-20T00:00:00Z", - "originatedBy": "U. Marti and H. Bunke.", + "originatedBy": [ + "https://spdx.org/spdxdocs/Person2-29791633-ba83-413d-a888-f96a9f450ca1", + "https://spdx.org/spdxdocs/Person3-384c284c-4da8-4a0c-a9ef-fcbfa4a4083d" + ], "software_downloadLocation": "https://fki.tic.heia-fr.ch/databases/iam-handwriting-database", "software_primaryPurpose": "data", "comment": "The IAM Handwriting Database contains forms of handwritten English text which can be used to train and test handwritten text recognizers and to perform writer identification and verification experiments.", "dataset_confidentialityLevel": "clear", "dataset_dataCollectionProcess": "It was decided to use the Lancaster - Oslo/Bergen corpus (LOB), a collection of 500 English texts, each consisting of about 2,000 words as a basis of our database. The LOB corpus is the British pendant to the Brown corpus, which has a structure similar to that of the\n LOB corpus. Then, we split the texts in the corpus into fragments of about three to six sentences with at least 50 words each. These text fragments were printed onto forms and we asked a number of persons to write the text printed on the forms by hand. We extracted the sentences of each text fragment from the corpus and generated a LATEX document containing the text and the structure of the form. The formatted documents were printed by a HP Laserjet 4000TN at a resolution of 600 dpi. Each form consists of four parts. The first part comprises the title “Sentence Database” and a number assigned to the text. The first character of this number shows which category the text belongs to,\n and the following two digits identify the text number. For example in Fig. 1, M01 indicates that the text on the form is extracted from text “01“ in the text category “Science fiction“. The next three digits show with which sentence the text starts. In the second part of the form, the text the individual persons were asked to write is printed. The third part of the form is a blank zone where the writers have to put in their handwriting. In the last part, the writer can voluntarily enter his or her name. All four parts are separated from each other by a horizontal line. This makes it easy to automatically extract the individual parts from a form. It was decided that the writers had to use rulers. These guiding lines, with 1.5 cm space between them, were printed on a separate sheet of paper which\n was put under the form. The writers were asked to use their every day writing in order to get the most natural and unconstrained way of writing. We also told the writers to stop writing, if there was not enough space left on the form to write the whole text. No restrictions were imposed on the writing instrument. Hence, text produced with a number of different writing instruments is included in the database (ballpoint pens, ink pens, and pencils, all with various stroke widths). The filled forms were scanned with a HP-Scanjet 6100 connected to a Sun Ultra 1. The software used to scan the data is xvscan version 1.62. It is an add-on to the wellknown image tool xv. The resolution was set to 300 dpi at a grey-level resolution of 8 bits. The images were saved in TIFF-format with LZW compression. Each form was\n completely scanned, including the printed and handwritten text. To create the label files, the text of a form was copied twice into the label file, once for the machine-printed text and once for the handwritten text. Then the line feeds were filled in manually. In some cases corrections were necessary, because the handwritten text did not exactly correspond to the printed text. These corrections include deletions, insertions, and changes of words so as to make the text in the label file of each form identical to the handwritten text. All corrections were done manually, but they did not take a long. Typically, only approximately 30s of manual processing time for the generation of the label files and the correction of errors were spent\n on each document, which is less than the time required for scanning.", - "dataset_dataPreprocessing": "First, the skew of the document is corrected. Then the positions of the three horizontal lines are computed by a projection method. Given this positional information the handwriting is extracted. Next, the handwritten text is segmented into text lines. Finally, each text line\n is segmented into individual words. To find the first horizontal line, the form is scanned top-down in the middle of the image. The first black pixel found is assumed to belong to the first horizontal line.\n By following the line to the left and to the right, the end points of the line are found. Once the left and right end of the first horizontal line has been determined, its angle is used to correct the skew of the whole document by a rotation. Then, the form is segmented into its four main parts (see Sect. 2). This is a relatively easy task because the four parts are separated from each other by very long\n horizontal lines, which are easy to detect by horizontal projection. To make the projection algorithm more robust, not only the horizontal projection profile is considered, but also the value of the longest horizontal black run in each row. A horizontal line separating two parts from each other is characterized by a value in the horizontal grey-value projection histogram greater than a threshold t and a value of the longest horizontal black run greater than a threshold t\n (see Fig. 5). After all three horizontal lines have been found, we are able to extract the part of the form that contains the handwriting. Over the whole database the handwritten zone was automatically extracted by means of this procedure without any\n error. The next step in preprocessing is to cut the text into\n individual lines. For this purpose a histogram of the horizontal black/white transitions is used. In this histogram we look for local minima. If the value at a local minimum is zero, a cut has been found that does not touch any word. If the value is greater than zero, we have found a position where we can horizontally cut the image with a minimal number of intersections with strokes belonging to words of the previous or the following text line. To handle intersections of this kind a method based on the center of gravity is used. If the center of gravity of the connected component that is cut is in the range of the\n previous (the following) text line, the connected component is assumed to belong to that text line. If the center of gravity is near the cutting line, the component is cut into two parts, one belonging to the previous and one to the following text line. With this method we could extract almost all text lines correctly. Only in about 1.2% (113 of 9157) of the lines did errors occur. The 113 segmentation errors can be classified into acceptable and serious errors. An acceptable error is defined as one where only single punctuation marks or i-dots are assigned to the wrong line, but no cut component. By contrast, parts of letters or words assigned to the wrong text line are considered serious errors. There were 52 acceptable and 61serious errors out of a total of 113. The correction of these errors is left to\n the user of the database. That is, no attempts were made\n to include any manual corrections of the segmentation errors in the database. To segment the text lines into single words, a method\n similar to those described in the paper 'External word segmentation of off-line handwritten text lines.'' and the paper 'Gap metrics for\n word separation in handwritten lines' is used. Because a word can be split into several components, the goal is to cluster the connected components of a text line image into words. First, the convex hull and the center of gravity of each connected component in a line of text is\n computed. Then for each pair of connected components, c1 and c2, the straight line segment s that connects the center of gravity of c1 with the center of gravity of c2 is considered. The distance d between the two points where s intersects the convex hull of c1 and c2 is determined. This distance d is assigned to s as a weight. A graphical illustration is shown in Fig. 7. By means of this procedure, a completely connected and weighted graph is obtained, where each node corresponds to a connected component in the image and the weight on an edge represents the distance between two connected components. Given such a graph, its minimum spanning tree is computed. Finally, all distances that occur as weights on the edges of the minimum spanning tree are clustered into two groups, namely, intra-word and inter-word distance. For this purpose, Otsu's thresholding algorithm is used, which yields a threshold t. Any two connected components, c1\n and c2, that are linked by an edge in the minimum spanning tree with a weight d ≤ t are considered to be part of the same word. By contrast, if the weight d is larger than t, c1 and c2 are regarded as belonging to two different words. Applied on 541 text lines with 3,899 words,\n a correct word extraction of 94.92%, with 3.62% of the words over- and 1.46% undersegmented, was achieved. The primary goal of the preprocessing and segmentation procedures described in this section is to support the labeling of the text. However, these procedures can be\n integrated in any recognizer as well. All procedures have been implemented in C++ and can be compiled under Unix/Solaris and Linux. To actually run the procedures only the TIFF library for image read and write, but no other software utilities are needed.", + "dataset_dataPreprocessing": [ + "First, the skew of the document is corrected.", + "Then the positions of the three horizontal lines are computed by a projection method. Given this positional information the handwriting is extracted.", + "Next, the handwritten text is segmented into text lines.", + "Finally, each text line is segmented into individual words. To find the first horizontal line, the form is scanned top-down in the middle of the image. The first black pixel found is assumed to belong to the first horizontal line.\n By following the line to the left and to the right, the end points of the line are found. Once the left and right end of the first horizontal line has been determined, its angle is used to correct the skew of the whole document by a rotation. Then, the form is segmented into its four main parts (see Sect. 2). This is a relatively easy task because the four parts are separated from each other by very long\n horizontal lines, which are easy to detect by horizontal projection. To make the projection algorithm more robust, not only the horizontal projection profile is considered, but also the value of the longest horizontal black run in each row. A horizontal line separating two parts from each other is characterized by a value in the horizontal grey-value projection histogram greater than a threshold t and a value of the longest horizontal black run greater than a threshold t\n (see Fig. 5). After all three horizontal lines have been found, we are able to extract the part of the form that contains the handwriting. Over the whole database the handwritten zone was automatically extracted by means of this procedure without any\n error. The next step in preprocessing is to cut the text into\n individual lines. For this purpose a histogram of the horizontal black/white transitions is used. In this histogram we look for local minima. If the value at a local minimum is zero, a cut has been found that does not touch any word. If the value is greater than zero, we have found a position where we can horizontally cut the image with a minimal number of intersections with strokes belonging to words of the previous or the following text line. To handle intersections of this kind a method based on the center of gravity is used. If the center of gravity of the connected component that is cut is in the range of the\n previous (the following) text line, the connected component is assumed to belong to that text line. If the center of gravity is near the cutting line, the component is cut into two parts, one belonging to the previous and one to the following text line. With this method we could extract almost all text lines correctly. Only in about 1.2% (113 of 9157) of the lines did errors occur. The 113 segmentation errors can be classified into acceptable and serious errors. An acceptable error is defined as one where only single punctuation marks or i-dots are assigned to the wrong line, but no cut component. By contrast, parts of letters or words assigned to the wrong text line are considered serious errors. There were 52 acceptable and 61serious errors out of a total of 113. The correction of these errors is left to\n the user of the database. That is, no attempts were made\n to include any manual corrections of the segmentation errors in the database. To segment the text lines into single words, a method\n similar to those described in the paper 'External word segmentation of off-line handwritten text lines.'' and the paper 'Gap metrics for\n word separation in handwritten lines' is used. Because a word can be split into several components, the goal is to cluster the connected components of a text line image into words. First, the convex hull and the center of gravity of each connected component in a line of text is\n computed. Then for each pair of connected components, c1 and c2, the straight line segment s that connects the center of gravity of c1 with the center of gravity of c2 is considered. The distance d between the two points where s intersects the convex hull of c1 and c2 is determined. This distance d is assigned to s as a weight. A graphical illustration is shown in Fig. 7. By means of this procedure, a completely connected and weighted graph is obtained, where each node corresponds to a connected component in the image and the weight on an edge represents the distance between two connected components. Given such a graph, its minimum spanning tree is computed. Finally, all distances that occur as weights on the edges of the minimum spanning tree are clustered into two groups, namely, intra-word and inter-word distance. For this purpose, Otsu's thresholding algorithm is used, which yields a threshold t. Any two connected components, c1\n and c2, that are linked by an edge in the minimum spanning tree with a weight d ≤ t are considered to be part of the same word. By contrast, if the weight d is larger than t, c1 and c2 are regarded as belonging to two different words. Applied on 541 text lines with 3,899 words,\n a correct word extraction of 94.92%, with 3.62% of the words over- and 1.46% undersegmented, was achieved. The primary goal of the preprocessing and segmentation procedures described in this section is to support the labeling of the text. However, these procedures can be\n integrated in any recognizer as well. All procedures have been implemented in C++ and can be compiled under Unix/Solaris and Linux. To actually run the procedures only the TIFF library for image read and write, but no other software utilities are needed." + ], "dataset_datasetAvailability": "registration", "dataset_datasetSize": 4620000000, - "dataset_datasetType": "image", + "dataset_datasetType": [ + "image" + ], "dataset_intendedUse": "For line level or word level character recognition", "dataset_sensor": [ { @@ -1275,7 +1315,7 @@ "https://my-first-aibom.com/SimpleHTR" ], "element": [ - "TO BE ADDED LATER" + "https://spdx.org/spdxdocs/Element-TO-BE-ADDED-LATER" ], "software_sbomType": [ "analyzed" @@ -1316,7 +1356,7 @@ "relationshipType": "hasDeclaredLicense", "from": "https://my-first-aibom.com/SimpleHTR", "to": [ - "MIT" + "https://spdx.org/licenses/MIT" ] }, { @@ -1326,8 +1366,8 @@ "relationshipType": "hasConcludedLicense", "from": "https://my-first-aibom.com/SimpleHTR", "to": [ - "MIT" + "https://spdx.org/licenses/MIT" ] } ] -} +} \ No newline at end of file From 6013a14b9408cc12d19f95c85393c9e757bf861a Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Mon, 17 Jun 2024 03:16:00 +0100 Subject: [PATCH 09/11] Add required license relationships for AIPackage --- ai/simpleHTR-example.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/ai/simpleHTR-example.json b/ai/simpleHTR-example.json index 65016fe..14e79b4 100644 --- a/ai/simpleHTR-example.json +++ b/ai/simpleHTR-example.json @@ -1368,6 +1368,26 @@ "to": [ "https://spdx.org/licenses/MIT" ] + }, + { + "type": "Relationship", + "spdxId": "https://spdx.org/spdxdocs/Relationship/declaredLicense-df2e0abe-a280-48bf-9b6f-684fdeaf4b1b", + "creationInfo": "_:creationinfo", + "relationshipType": "hasDeclaredLicense", + "from": "https://my-first-aibom.com/word-model", + "to": [ + "https://spdx.org/licenses/MIT" + ] + }, + { + "type": "Relationship", + "spdxId": "https://spdx.org/spdxdocs/Relationship/concludedLicense-c338f658-4fef-4608-bdd9-c000f78718e1", + "creationInfo": "_:creationinfo", + "relationshipType": "hasConcludedLicense", + "from": "https://my-first-aibom.com/word-model", + "to": [ + "https://spdx.org/licenses/MIT" + ] } ] } \ No newline at end of file From c5d737be2e13d64d3e12082001b938e6575e0d58 Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Mon, 17 Jun 2024 09:49:00 +0100 Subject: [PATCH 10/11] Fix creationInfo value ":_creationinfo" -> "_:creationinfo" --- ai/simpleHTR-example.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ai/simpleHTR-example.json b/ai/simpleHTR-example.json index 14e79b4..e90989d 100644 --- a/ai/simpleHTR-example.json +++ b/ai/simpleHTR-example.json @@ -878,7 +878,7 @@ { "type": "ai_AIPackage", "spdxId": "https://my-first-aibom.com/word-model", - "creationInfo": ":_creationinfo", + "creationInfo": "_:creationinfo", "name": "word-model", "releaseTime": "2023-09-07T00:00:00Z", "suppliedBy": "https://github.com/githubharald", @@ -1056,7 +1056,7 @@ { "type": "ai_AIPackage", "spdxId": "https://my-first-aibom.com/line-model", - "creationInfo": ":_creationinfo", + "creationInfo": "_:creationinfo", "name": "line-model", "releaseTime": "2023-09-07T00:00:00Z", "suppliedBy": "https://github.com/githubharald", @@ -1230,7 +1230,7 @@ { "type": "dataset_DatasetPackage", "spdxId": "https://my-first-aibom.com/IAMdataset", - "creationInfo": ":_creationinfo", + "creationInfo": "_:creationinfo", "name": "IAMdataset", "builtTime": "1999-09-20T00:00:00Z", "originatedBy": [ From 0d53c40c849d1d282ab6b08fc8f44c98259a5bbf Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Mon, 17 Jun 2024 11:26:28 +0100 Subject: [PATCH 11/11] JSON Schema validation passed Passed both ajv and check-jsonschema --- ai/{simpleHTR-example.json => simpleHTR.spdx3.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ai/{simpleHTR-example.json => simpleHTR.spdx3.json} (100%) diff --git a/ai/simpleHTR-example.json b/ai/simpleHTR.spdx3.json similarity index 100% rename from ai/simpleHTR-example.json rename to ai/simpleHTR.spdx3.json