There are several reasons OpenALPR may make mistakes when detecting license plates and reading their characters. Below are some of the most common, with each followed by a troubleshooting guide.

1. Camera settings

Please ensure that you are following our best practices for camera placement and configuration. You may need to re-position the camera and/or adjust settings for optimal results.

2. Available compute power (for Watchman Agent only)

Your camera stream may be high quality, but it is also critical that the computer running the Agent software has enough CPU/GPU power to keep up with the stream. The easiest way to confirm this is by inspecting the Agent's log file

  • Live view from the Agent's configuration utility: View > Agent Log
  • Linux systems: /var/log/alpr.log
  • Windows systems: C:\OpenALPR\Agent\var\log\alpr.log

In the log, there are DEBUG lines which include information on incoming (video) FPS and recognized FPS. For instance, in the following example, the Agent receives a stream with 29.7 FPS and is able to process/recognize 8.67 FPS (30%) of the incoming frames

2018-12-27 15:44:15 alprd 140369679226624: DEBUG - camera 1234: video fps: 29.7 motion: 62.3% rec. fps: 8.67 (30%)

The closer the recognized FPS percentage is to 100, the better; however please ensure that you meet the following minimums based on the speed of traffic you are trying to capture

  • Low Speed (under 25 mph): 5-10 rec. fps
  • Medium Speed (25-45 mph): 10-15 rec. fps
  • High Speed (over 45 mph): 15-30 rec. fps

To increase the Agent's recognized FPS, you can

  1. Decrease the camera FPS if it is above the recommended range for your traffic speed
  2. Use the configuration utility to allocate more CPU cores or manually edit the configuration file
  3. Decrease the stream resolution (do not go below 720p)
  4. Follow our instructions for sizing hardware and consider upgrading if necessary

If you are able to capture a missed detection in a video file, you can also run the software on the offline video to eliminate the possibility of any real-time compute limitations. On Linux machines with a GUI, open a terminal and run "alpr --debug /path/to/video.mp4". If the plate that was missed in real-time is detected here, your issue is likely compute related. 

3. Ambiguous characters

Some characters such as 1/I, B/3/8, D/Q/0/O, M/W, U/V, S/5, etc. can be difficult for the AI engine (and humans) to recognize. Often, the best approach in these cases is to check the candidates field of the JSON response for alternative plate numbers. You can loop through the different candidates for each plate, check common ambiguous characters, and compare the confidence of each candidate to determine how certain the AI engine is of its top candidate. See the following Python code for an example where the "response" variable contains JSON loaded from either the CarCheck API or Watchman/SDK plate group results. Note plate groups only have a single result, so the outer loop can be omitted by jumping straight to response['candidates']
ambiguous_characters = [char for char in '1IB38DQ0OMWUVS5']
for r in response['results']:
    for c in r['candidates']:
        msg = '%s (%d%% confidence)' % (c['plate'], c['confidence'])
        ambig = [char for char in c['plate'] if char in ambiguous_characters]
        if len(ambig) > 0:
            msg += ' has ambiguous character(s): %s' % ', '.join(ambig)
            # Add some other logic to determine best-match

4. False positives

Some common objects such as speed limit signs, billboards, and logos on the side of vans may be wrongly detected as "false positives". Although we try to eliminate as many false positives as possible when training the software, unfortunately it can still be difficult for the AI engine to distinguish non-license plate text from real license plates since they have many of the same features.

If your false positives occur in a consistent location within the camera's field of view, you can add a detection mask to ignore that portion of the image. From the agent's configuration utility select a camera, go to Configure > Detection Mask, and draw the exclusion you would like. For false positives with changing locations, you may try setting a higher minimum plate confidence (the default is 80%) from Configure > Agent Settings > Advanced > plate_groups_min_confidence. It is a good idea to first check the typical confidence level for your results as increasing the threshold might cause you to miss some true positives.

5. Unique plate characteristics (shape, color, stacked characters, etc.)

In rare circumstances, OpenALPR models may be limited by the diversity of our existing dataset. This can happen as new license plate designs are released.

If OpenALPR still does not recognize images after completing troubleshooting steps 1 and 2, you can help us improve future performance by providing corrections through your cloud dashboard. Click on the plate number in your results list, click the underlined number in the popup, type your correction, and press the checkmark. This automatically sends the image and corrected plate number to our annotators who will prepare it for training future releases

Alternatively, you can send a compressed folder of unrecognized images to Depending on your license volume, we may be able to send you an updated model prior to the next release for a consulting fee.