Troubleshooting

This page starts with the general checks that apply to every problem. The problems follow, grouped into reading results, status codes, language models, the image stream, and modules and settings. Do the general checks first, then find your symptom.

All addresses are relative to hdvisionsystems/lumiscan-text-reader/.

General checks

  • Read output/status-code and output/status-text of the operation, for a reading <module>/read-text/output/status-code and <module>/read-text/output/status-text. The sign of the status code tells you whether it worked: greater than 0 is success, 0 means the operation has not run since the application started, less than 0 means it failed and produced nothing. The codes are listed in Execution Status.

  • A failed write to execute answers with a status code only (over REST, a bare 400). Read output/status-text afterwards: it starts with ok: or error: and gives the reason.

  • Read the application log. On ctrlX OS, read it in the ctrlX Logbook or with journalctl; on a PC, in the application’s console output. The log has the same text as output/status-text; when several inputs are wrong, each one gets its own warning line.

  • Check what the reading actually used: language, engine and layout in output/result. They are not always the inputs you set.

  • Check that the image source runs on the same device as the Text Reader - the same ctrlX CORE or ctrlX IPC, or the same PC. Remote Data Layer access is not supported.

  • Check the image quality. No setting recovers text the camera did not capture: characters at least 20 pixels tall (30 or more for small or noisy print), good contrast, text in focus and not glared out, text roughly upright unless you use an orientation-detecting layout. See Requirements.

  • Check the licence. On ctrlX OS, the application shuts down shortly after starting if the licence is missing; the reason is written to the system log. A module that no licence on the device covers is refused with status -11. See Requirements.

  • Problems that all LumiScan apps share - an app or module missing from the tree, a node that is "not found", a method call that is refused, a stream that delivers nothing - are described in Troubleshooting of the LumiScan Keryx manual.

Reading results

Problem: Status code 1, but no words

Symptoms

output/status-code is 1 (OK), but output/result has word_count 0.

Possible causes
  • Nothing readable is in the image: an empty carrier, a part turned the wrong way, or a label out of frame. This is the normal answer, not an error.

  • The marking is outside the crop. A marking that drifts outside the crop reads as nothing.

  • The marking is not in focus, or not the right way up.

  • input/min-score filters out every word. words[] is filtered by min-score; text is not.

  • A colour image in which a photograph or other colourful scenery shares the frame with the text, see Problem: The reading is empty although the text is clearly visible in a colour image.

Diagnostic procedure
  1. Check text in output/result. If text is not empty but word_count is 0, the words were filtered: compare the word scores with min_score in the result, which is the threshold that was applied.

  2. Check that the marking is inside input/crop/startX, input/crop/startY, input/crop/width and input/crop/height. image_width and image_height in the result show the region that was read.

  3. Check in the camera image that the marking is in focus and the right way up.

  4. If the image is a colour image and you can see the text, continue with Problem: The reading is empty although the text is clearly visible in a colour image.

Resolution
  • If there is no text in the image: this is a valid result. Branch on word_count, not on the status code, to decide whether a part carried text.

  • If the marking is outside the crop: make the crop large enough to cover the whole range the part can occupy, then read again.

  • If the marking is out of focus or not the right way up: correct the camera set-up. For text whose orientation really varies, use an orientation-detecting layout (AUTO_OSD or SPARSE_OSD).

  • If input/min-score filters out every word: set the threshold again as described in Reading Accurately, step 5.

If the problem persists

Send the information listed under Information for support to support, together with output/status-text, the content of output/result and the values of the read-text/input/ nodes.

Problem: The reading is empty although the text is clearly visible in a colour image

Symptoms

A colour frame in which a photograph or other colourful scenery shares the image with the text comes back with no words at all, while output/status-code reports success (1). The text is not garbled - the reading is empty.

Possible causes
  • The engine reduces a colour image before reading it, and with colourful scenery in the frame this loses the text. The size of the text is not the cause. No input/layout and no input/engine rescues this case.

Diagnostic procedure
  1. Check that pixel-type of the image node is a colour format (for example RGB8 or BGR8).

  2. Check input/preprocess. Its default is NONE.

  3. Check whether a rectangle can separate the text from the scenery.

Resolution
  • If a rectangle can separate the text from the scenery: crop to the text first with input/crop. Cropping fixes this case in colour.

  • If the text and the scenery cannot be separated by a rectangle (for example a label on a patterned part, or a screen photographed whole):

    1. Set input/preprocess to GRAYSCALE and read again.

    2. Only if GRAYSCALE did not help, try BINARIZE_OTSU.

Neither setting invents text: on a frame with no text in it, all three settings return nothing.

If the problem persists

Send the information listed under Information for support to support, together with output/status-text, the values of input/crop and input/preprocess, and the pixel format of the image.

Problem: Digits are read as letters (O for 0, S for 5)

Symptoms

Characters are substituted between character classes, for example O for 0 or S for 5. Other typical substitutions are I/1/l, B/8 and Z/2.

Possible causes
  • An unfamiliar character is substituted rather than rejected, and the default input/characters/mode ALL_SYMBOLS permits every class.

Diagnostic procedure
  1. Read input/characters/mode, input/characters/allow and input/characters/deny. Expected for a restricted marking: a mode other than ALL_SYMBOLS.

Resolution
  • If the character set is not restricted: set input/characters/mode to match the marking:

    • numeric part or batch number: DIGITS;

    • upper-case alphanumeric code: UPPERCASE_LETTERS with input/characters/allow = 0123456789;

    • date code with separators: DIGITS with allow = /-.;

    • fixed alphabet: CUSTOM with allow set to exactly that alphabet.

An empty character set - CUSTOM with an empty allow, or a deny that removes everything the mode selected - is refused with status code -2.

If the problem persists

Send the information listed under Information for support to support, together with the values of input/characters/mode, allow and deny, and output/result.

Problem: The reading contains extra words from the background

Symptoms

output/result contains words that are not part of the marking, picked out of the background - edges of the part, shadows, the conveyor. These words usually have a low words[].score.

Possible causes
  • input/crop is loose or not set. All zero reads the whole image.

  • input/layout looks for more structure than the marking has.

  • input/min-score is 0 (the default), which reports everything.

Diagnostic procedure
  1. Check input/crop, and image_width and image_height in the result: they show the region that was read.

  2. Check layout in the result.

  3. Check the words[].score of the extra words and min_score in the result. Spurious words usually sit below 0.5.

Resolution
  • If the crop is loose: tighten input/crop around where the text will be. This is the most effective setting, and it also makes reading faster.

  • If the layout does not match: set input/layout to the marking, for example SINGLE_LINE for one line of print.

  • If input/min-score is too low:

    1. Run known-good parts with min-score at 0.

    2. Note mean_score and the individual word scores in the result.

    3. Set input/min-score between the noise (usually below 0.5) and the correct readings (usually well above 0.8), closer to the correct readings.

min-score filters words[] only; text is always the engine’s full output. Check word_count rather than text when you need to know whether the reading was good.

If the problem persists

Send the information listed under Information for support to support, together with output/result and the values of input/crop, input/layout and input/min-score.

Problem: Dot-matrix or laser-etched marking reads badly

Symptoms

A dot-matrix or laser-etched marking is read badly, while printed text reads well.

Possible causes
  • These markings defeat the LSTM engine more often than printed text.

  • Lighting, contrast or focus are poor. No setting fixes them.

Diagnostic procedure
  1. Check engine in the result: the engine that was actually used.

  2. Check the image against the image quality rules in Requirements: character height, contrast, focus and glare.

Resolution
  • If the engine is the cause: set input/engine to LEGACY and compare the readings.

  • If the image quality is poor: fix the lighting and the focus.

If the problem persists

Send the information listed under Information for support to support, together with output/result and the value of input/engine.

Problem: Reading is too slow

Symptoms

The call to read-text/execute takes too long for your cycle. Reading is synchronous: the call returns when the read has finished.

Possible causes
  • The engine is given too much image. Reading time is driven mostly by how much image the engine is given.

  • The AUTO_OSD or SPARSE_OSD layout is used. These layouts load a second model and work out the orientation first.

Diagnostic procedure
  1. Check input/crop, and image_width and image_height in the result.

  2. Check layout in the result.

Resolution
  • If the engine is given too much image: tighten input/crop around the label. A tight crop is both faster and more accurate than the whole frame.

  • If an _OSD layout is used: use a layout without orientation detection, unless the orientation really varies.

If the problem persists

Send the information listed under Information for support to support, together with the values of input/crop and input/layout and the image size.

Status codes

Problem: Status code -2 (a setting is unusable)

Symptoms

output/status-code is -2 (Invalid input). output/status-text starts with error: and names every offending node and what it expected, for example min-score must be between 0 and 1, got 1.5 or error: crop/startX + crop/width (100 + 900 = 1000) exceeds the image width 640.

Possible causes
  • A required node is left empty.

  • An unknown value in input/engine, input/layout, input/preprocess or input/characters/mode.

  • A value out of range, for example input/min-score outside 0 to 1.

  • An empty character set: CUSTOM with an empty allow, or a deny that removes everything the mode selected.

  • A language with no model installed. The message names every directory searched and what is available, for example error: invalid input: language 'fra' has no fra.traineddata in any model directory ('<tessdata-dir>', '<shipped dir>'); available: eng, osd. Upload fra.traineddata to '<tessdata-dir>' - the file name is the language code.

  • A layout with orientation detection without osd.traineddata beside the language model, see Problem: A reading with AUTO_OSD or SPARSE_OSD is refused ("also needs osd.traineddata beside …​").

  • A crop that does not fit the image. It is refused, not trimmed to fit.

  • An image address that points at this application itself.

  • For system/set-tessdata-dir: input/tessdata-dir is empty.

Diagnostic procedure
  1. Read output/status-text. A run checks every setting and reports all the problems at once.

  2. Read the application log: each wrong input has its own warning line.

Resolution
  • If a value is unknown, out of range or empty: correct each node named in output/status-text. The accepted values are listed in Data Layer Reference.

  • If the character set is empty: set input/characters/allow, or remove characters from input/characters/deny, so that the set is not empty.

  • If the language has no model: upload <language>.traineddata into the directory system/tessdata-dir names, without renaming it, or set input/language to a code on system/languages. See Language Models.

  • If the crop does not fit: change input/crop so that startX + width and startY + height are inside the image.

  • If the image address points at this application: set input/input-image-address to the image node of the camera application.

  • If input/tessdata-dir is empty: write a directory to system/set-tessdata-dir/input/tessdata-dir, then write to system/set-tessdata-dir/execute.

Then run the operation again and check that output/status-code is 1.

If the problem persists

Send the information listed under Information for support to support, together with the full output/status-text and the values of the read-text/input/ nodes.

Problem: Status code -3 (image cannot be read)

Symptoms

output/status-code is -3 (Image read failed), and the result is empty.

Possible causes
  • A wrong image address in input/input-image-address. This is almost always the cause.

  • The source application is not running on the same device, or it has not captured an image.

  • The image node is missing, empty or inconsistent.

  • The image uses an unsupported pixel format.

Diagnostic procedure
  1. Check input/input-image-address, for example hdvisionsystems/lumiscan-cam-driver/camera1/output/image.

  2. Check that the image node has the children data, width, height and pixel-type, and that data holds pixel data.

  3. Check that pixel-type is one of Mono8, Mono12, RGB8, RGB12, BGR8, BGR12, BayerGR8, BayerGR12, BayerRG8 or BayerRG12.

  4. Check that the source application runs on the same device - the same ctrlX CORE or ctrlX IPC, or the same PC - and delivers images.

  5. Read output/status-text for the reason.

Resolution
  • If the address is wrong: correct input/input-image-address and read again.

  • If the source application is not running or has not captured an image: start it on the same device, capture an image, then read again.

  • If the image node is empty or inconsistent: capture a new image with the source application, then read again.

  • If the pixel format is not supported: use an image source that delivers one of the supported pixel formats.

If the problem persists

Send the information listed under Information for support to support, together with input/input-image-address, output/status-text and the pixel-type, width and height of the image node.

Problem: Status code -7 (OCR engine could not start)

Symptoms

output/status-code is -7 (Algorithm failed). The result is empty, and the reason is in output/status-text.

Possible causes
  • The OCR engine could not start, usually because of the language model directory.

  • A language model could not be loaded, for example a model whose upload is still in progress. This happens when a read follows right after a model was replaced.

Diagnostic procedure
  1. Read output/status-text for the reason.

  2. Check that system/languages is not empty. system/languages is refreshed only at startup, by set-tessdata-dir and by refresh-languages: write to system/refresh-languages/execute to update it.

  3. Check system/tessdata-dirs: every directory searched, in order.

  4. Check whether a model upload was in progress when the read failed.

Resolution
  • If an upload was in progress: read again once the upload has completed. That read loads the new model.

  • If the reason names the language model directory: check the directories on system/tessdata-dirs against the reason in output/status-text. If you changed the upload directory with system/set-tessdata-dir, check that it is the directory that holds your models.

If the problem persists

Send the information listed under Information for support to support, together with the full output/status-text and the values of system/tessdata-dir, system/tessdata-dirs and system/languages.

Language models

Problem: A reading with AUTO_OSD or SPARSE_OSD is refused ("also needs osd.traineddata beside …​")

Symptoms

A reading is refused with output/status-code -2 and the message

error: invalid input: layout AUTO_OSD also needs osd.traineddata beside 'deu.traineddata' in '<tessdata-dir>'; copy it from '<shipped dir>', or choose a layout that does not detect orientation
Possible causes
  • The AUTO_OSD and SPARSE_OSD layouts need osd.traineddata in the same directory as the language model, not merely somewhere on the search path. Tesseract resolves one directory per run. For example, deu.traineddata was uploaded on its own.

Diagnostic procedure
  1. Check input/layout. Expected for this message: AUTO_OSD or SPARSE_OSD.

  2. Check whether the directory named in the message holds osd.traineddata beside the language model.

Resolution
  • If you need orientation detection: upload osd.traineddata into the same directory as your model. The message names the shipped directory to copy it from. Then read again.

  • If you do not need orientation detection: use a layout that does not detect orientation, such as the default SINGLE_BLOCK.

If the problem persists

Send the information listed under Information for support to support, together with the full message and the values of system/tessdata-dirs and system/languages.

Problem: An uploaded model does not appear on system/languages

Symptoms

You uploaded a .traineddata file, but its language code is not listed on system/languages.

Possible causes
  • system/languages is a listing. It is refreshed only at startup, by set-tessdata-dir and by refresh-languages.

  • The file is not in the directory system/tessdata-dir names, or it was renamed. The file name is the language code.

Diagnostic procedure
  1. Check that the file is in the directory named on system/tessdata-dir.

  2. Check that the file name is unchanged, exactly as the Tesseract project publishes it (for example deu.traineddata, chi_sim.traineddata).

Resolution
  • If the listing is not refreshed: write to system/refresh-languages/execute, then read system/languages. You do not need this in order to read: an uploaded model is usable on the very next read-text.

  • If the file is in another directory or was renamed: upload it again, without renaming, into the directory system/tessdata-dir names.

osd appears in the list but is not a language: setting input/language to osd does not read anything.

If the problem persists

Send the information listed under Information for support to support, together with the values of system/tessdata-dir, system/tessdata-dirs and system/languages and the name of the uploaded file.

Problem: The text is read in another language than input/language

Symptoms

language in output/result is not the language set in input/language, and output/status-text contains a NOTE, for example

ok: 4 word(s), mean score 0.91 (eng, SINGLE_BLOCK) - NOTE: language 'deu' is not installed, read with 'eng' instead
Possible causes
  • The language model disappeared between the language check and the read - someone pulled the USB stick, for example. The engine then reads with eng.

Diagnostic procedure
  1. Compare language in output/result with input/language.

  2. Read output/status-text for the NOTE.

  3. Check that the model file is still in its directory (see system/tessdata-dirs).

Resolution
  • If the model disappeared: make the model available again in its directory, for example insert the USB stick again or upload the model again. A model you upload is usable on the very next read-text. Then read again and check language in output/result.

Read language in output/result, not input/language, when you need to know how a result was produced. If the language is not installed at all, the reading is refused with -2, see Problem: Status code -2 (a setting is unusable). For the image stream, see Problem: A stream frame fails with "the frame was read with 'eng' instead and its result dropped".

If the problem persists

Send the information listed under Information for support to support, together with output/status-text, output/result and the values of input/language, system/tessdata-dirs and system/languages.

Image stream

Problem: read-text answers -1 (busy) while the stream runs

Symptoms

While the image stream (experimental) runs, a call of read-text/execute is refused:

  • output/status-code is -1 (Busy);

  • the write answers DL_TOO_MANY_OPERATIONS (ctrlX OS) or TooManyOperations (PC);

  • nothing is done, and output/result keeps its value.

system/remove-module also answers busy (-1) while a frame of that module is read.

Possible causes
  • The stream and read-text share the module’s one recognition engine and never run at the same time on one module. With a camera streaming, this happens often.

Diagnostic procedure
  1. Read control/subscribe/output/stream/active of the module. true means the stream runs.

Resolution
  • If you need read-text while the stream runs: call read-text/execute again, or stop the stream first:

    1. Set control/subscribe/input/enable to false and write to control/subscribe/execute. The frame being read is finished first.

    2. Check that control/subscribe/output/stream/active is false.

    3. Call read-text/execute.

  • If you want to remove the module: stop the stream first, then call system/remove-module/execute.

Other modules are not affected: each module has its own lock, its own engine and its own stream.

If the problem persists

Send the information listed under Information for support to support, together with the values of control/subscribe/output/stream/active and the counters under control/subscribe/output/stream/statistics/.

Problem: A stream frame fails with "the frame was read with 'eng' instead and its result dropped"

Symptoms

A frame of the image stream (experimental) gives no result. control/subscribe/output/stream/statistics/failed-frames grows, and control/subscribe/output/stream/last-failure and the log say, for example:

a frame of 'hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream' failed: language 'deu' is no longer installed; the frame was read with 'eng' instead and its result dropped
Possible causes
  • The language model disappeared between the language check and the read, so the engine read with eng. read-text publishes such a reading with a NOTE in its status-text, but the stream drops it, because its settings hash names the model that was asked for.

Diagnostic procedure
  1. Read control/subscribe/output/stream/last-failure.

  2. Check control/subscribe/output/stream/statistics/failed-frames.

  3. Check that the model file for input/language is still in its directory (see system/tessdata-dirs).

Resolution
  • If the model disappeared: make the model for input/language available in its directory again. A model you upload is used from the next frame on. Keep it available while the stream runs - do not remove the USB stick it is on, for example.

If the problem persists

Send the information listed under Information for support to support, together with control/subscribe/output/stream/last-failure, the counters under control/subscribe/output/stream/statistics/ and the values of input/language and system/tessdata-dirs.

Modules and settings

Problem: My settings or modules are gone after a restart

Symptoms

After a restart of the application, a module is missing from system/modules, a module is back with its default inputs, or a module that streamed before does not stream.

Possible causes
  • The module list was not saved with system/save-current-modules. Nothing survives a restart until it is saved; the module list and each module’s settings are saved separately.

  • The module’s settings were not saved with system/save-module-inputs.

  • The image stream’s mode and source are saved by control/subscribe/execute in the module’s <module-id>.json, but they come back only if the module list is saved too.

  • <module-id>.json contains comments. The module’s inputs are then not restored at start; the log reports the file as unreadable.

  • A setting whose node no longer exists after a software update is skipped, with a log entry.

Diagnostic procedure
  1. Read system/modules.

  2. Check the log for a module file reported as unreadable, or for skipped settings.

  3. Check that <module-id>.json exists in the configuration directory: on ctrlX OS /var/snap/rexroth-solutions/common/solutions/activeConfiguration/lumiscan-text-reader; on a PC (Windows) %APP_RESOURCE_DIR%\etc\lumiscan-text-reader, or without APP_RESOURCE_DIR C:\ProgramData\HD Vision Systems GmbH\LumiScan Vision Suite\lumiscan-text-read\etc\lumiscan-text-reader.

Resolution
  • If the module’s settings were not saved:

    1. Set system/save-module-inputs/input/module-id, for example module-1.

    2. Write to system/save-module-inputs/execute.

    3. Check that system/save-module-inputs/output/status-code is 1.

  • If the module list was not saved: write to system/save-current-modules/execute. The stream mode and source of a module come back after a restart only if the module list is saved too.

  • If <module-id>.json contains comments: remove the comments from the file. Changes made to the file by hand take effect at the next start.

A directory chosen with system/set-tessdata-dir is saved automatically.

If the problem persists

Send the information listed under Information for support to support, together with the content of system/modules, the files in the configuration directory and the log of the start.

Information for support

If a problem persists, send the following information to support:

  • The version of LumiScan Text Reader.

  • The platform: ctrlX OS on a ctrlX CORE or ctrlX IPC, with the ctrlX OS version; or a PC with Windows 11 or Ubuntu 24.04 and LumiScan Keryx.

  • The application log: on ctrlX OS from the ctrlX Logbook or journalctl, on a PC the application’s console output.

  • The date and time of the error.

  • The Data Layer status: which Data Layer you use (ctrlX Data Layer or LumiScan Keryx; on a PC, the Data Layer address), the output/status-code and output/status-text of the operation that failed and, for a refused write, the result of the write. For the image stream, also control/subscribe/output/stream/last-failure and the counters under control/subscribe/output/stream/statistics/.

  • The configuration: the values of the read-text/input/ nodes, system/modules, system/tessdata-dir, system/tessdata-dirs and system/languages, and the files in the configuration directory (the module files <module-id>.json).

Contact HD Vision Systems customer success at customer.success@hdvisionsystems.com or +49 6221 6721905. For licences, contact licenses@hdvisionsystems.com.