License Plate Recognition (LPR)
Frigate can recognize license plates on vehicles and automatically add the detected characters to the recognized_license_plate
field or a known name as a sub_label
to tracked objects of type car
. A common use case may be to read the license plates of cars pulling into a driveway or cars passing by on a street.
LPR works best when the license plate is clearly visible to the camera. For moving vehicles, Frigate continuously refines the recognition process, keeping the most confident result. However, LPR does not run on stationary vehicles.
When a plate is recognized, the recognized name is:
- Added as a
sub_label
(if known) or therecognized_license_plate
field (if unknown) to a tracked object. - Viewable in the Review Item Details pane in Review (sub labels).
- Viewable in the Tracked Object Details pane in Explore (sub labels and recognized license plates).
- Filterable through the More Filters menu in Explore.
- Published via the
frigate/events
MQTT topic as asub_label
(known) orrecognized_license_plate
(unknown) for thecar
tracked object.
Model Requirements
Users running a Frigate+ model (or any custom model that natively detects license plates) should ensure that license_plate
is added to the list of objects to track either globally or for a specific camera. This will improve the accuracy and performance of the LPR model.
Users without a model that detects license plates can still run LPR. Frigate uses a lightweight YOLOv9 license plate detection model that runs on your CPU. In this case, you should not define license_plate
in your list of objects to track.
In the default mode, Frigate's LPR needs to first detect a car
before it can recognize a license plate. If you're using a dedicated LPR camera and have a zoomed-in view where a car
will not be detected, you can still run LPR, but the configuration parameters will differ from the default mode. See the Dedicated LPR Cameras section below.
Minimum System Requirements
License plate recognition works by running AI models locally on your system. The models are relatively lightweight and run on your CPU. At least 4GB of RAM is required.
Configuration
License plate recognition is disabled by default. Enable it in your config file:
lpr:
enabled: True
Like other enrichments in Frigate, LPR must be enabled globally to use the feature. You can disable it for specific cameras at the camera level:
cameras:
driveway:
...
lpr:
enabled: False
For non-dedicated LPR cameras, ensure that your camera is configured to detect objects of type car
, and that a car is actually being detected by Frigate. Otherwise, LPR will not run.
Like the other real-time processors in Frigate, license plate recognition runs on the camera stream defined by the detect
role in your config. To ensure optimal performance, select a suitable resolution for this stream in your camera's firmware that fits your specific scene and requirements.
Advanced Configuration
Fine-tune the LPR feature using these optional parameters:
Detection
detection_threshold
: License plate object detection confidence score required before recognition runs.- Default:
0.7
- Note: This is field only applies to the standalone license plate detection model,
threshold
andmin_score
object filters should be used for models like Frigate+ that have license plate detection built in.
- Default:
min_area
: Defines the minimum area (in pixels) a license plate must be before recognition runs.- Default:
1000
pixels. Note: this is intentionally set very low as it is an area measurement (length x width). For reference, 1000 pixels represents a ~32x32 pixel square in your camera image. - Depending on the resolution of your camera's
detect
stream, you can increase this value to ignore small or distant plates.
- Default:
Recognition
recognition_threshold
: Recognition confidence score required to add the plate to the object as arecognized_license_plate
and/orsub_label
.- Default:
0.9
.
- Default:
min_plate_length
: Specifies the minimum number of characters a detected license plate must have to be added as arecognized_license_plate
and/orsub_label
to an object.- Use this to filter out short, incomplete, or incorrect detections.
format
: A regular expression defining the expected format of detected plates. Plates that do not match this format will be discarded."^[A-Z]{1,3} [A-Z]{1,2} [0-9]{1,4}$"
matches plates like "B AB 1234" or "M X 7""^[A-Z]{2}[0-9]{2} [A-Z]{3}$"
matches plates like "AB12 XYZ" or "XY68 ABC"- Websites like https://regex101.com/ can help test regular expressions for your plates.
Matching
known_plates
: List of strings or regular expressions that assign custom asub_label
tocar
objects when a recognized plate matches a known value.- These labels appear in the UI, filters, and notifications.
- Unknown plates are still saved but are added to the
recognized_license_plate
field rather than thesub_label
.
match_distance
: Allows for minor variations (missing/incorrect characters) when matching a detected plate to a known plate.- For example, setting
match_distance: 1
allows a plateABCDE
to matchABCBE
orABCD
. - This parameter will not operate on known plates that are defined as regular expressions. You should define the full string of your plate in
known_plates
in order to usematch_distance
.
- For example, setting
Image Enhancement
enhancement
: A value between 0 and 10 that adjusts the level of image enhancement applied to captured license plates before they are processed for recognition. This preprocessing step can sometimes improve accuracy but may also have the opposite effect.- Default:
0
(no enhancement) - Higher values increase contrast, sharpen details, and reduce noise, but excessive enhancement can blur or distort characters, actually making them much harder for Frigate to recognize.
- This setting is best adjusted at the camera level if running LPR on multiple cameras.
- If Frigate is already recognizing plates correctly, leave this setting at the default of
0
. However, if you're experiencing frequent character issues or incomplete plates and you can already easily read the plates yourself, try increasing the value gradually, starting at 5 and adjusting as needed. To preview how different enhancement levels affect your plates, use thedebug_save_plates
configuration option (see below).
- Default:
Debugging
debug_save_plates
: Set toTrue
to save captured text on plates for debugging. These images are stored in/media/frigate/clips/lpr
, organized into subdirectories by<camera>/<event_id>
, and named based on the capture timestamp.- These saved images are not full plates but rather the specific areas of text detected on the plates. It is normal for the text detection model to sometimes find multiple areas of text on the plate. Use them to analyze what text Frigate recognized and how image enhancement affects detection.
- Note: Frigate does not automatically delete these debug images. Once LPR is functioning correctly, you should disable this option and manually remove the saved files to free up storage.
Configuration Examples
These configuration parameters are available at the global level of your config. The only optional parameters that should be set at the camera level are enabled
, min_area
, and enhancement
.
lpr:
enabled: True
min_area: 1500 # Ignore plates with an area (length x width) smaller than 1500 pixels
min_plate_length: 4 # Only recognize plates with 4 or more characters
known_plates:
Wife's Car:
- "ABC-1234"
- "ABC-I234" # Accounts for potential confusion between the number one (1) and capital letter I
Johnny:
- "J*N-*234" # Matches JHN-1234 and JMN-I234, but also note that "*" matches any number of characters
Sally:
- "[S5]LL 1234" # Matches both SLL 1234 and 5LL 1234
Work Trucks:
- "EMP-[0-9]{3}[A-Z]" # Matches plates like EMP-123A, EMP-456Z
lpr:
enabled: True
min_area: 4000 # Run recognition on larger plates only (4000 pixels represents a 63x63 pixel square in your image)
recognition_threshold: 0.85
format: "^[A-Z]{2} [A-Z][0-9]{4}$" # Only recognize plates that are two letters, followed by a space, followed by a single letter and 4 numbers
match_distance: 1 # Allow one character variation in plate matching
known_plates:
Delivery Van:
- "RJ K5678"
- "UP A1234"
Supervisor:
- "MN D3163"
If you want to detect cars on cameras but don't want to use resources to run LPR on those cars, you should disable LPR for those specific cameras.
cameras:
side_yard:
lpr:
enabled: False
...
Dedicated LPR Cameras
Dedicated LPR cameras are single-purpose cameras with powerful optical zoom to capture license plates on distant vehicles, often with fine-tuned settings to capture plates at night.
Users can configure Frigate's LPR in two different ways depending on whether they are using a Frigate+ model:
Using a Frigate+ Model
Users running a Frigate+ model (or any model that natively detects license_plate
) can take advantage of license_plate
detection. This allows license plates to be treated as standard objects in dedicated LPR mode, meaning that alerts, detections, snapshots, zones, and other Frigate features work as usual, and plates are detected efficiently through your configured object detector.
An example configuration for a dedicated LPR camera using a Frigate+ model:
# LPR global configuration
lpr:
enabled: True
# Dedicated LPR camera configuration
cameras:
dedicated_lpr_camera:
type: "lpr" # required to use dedicated LPR camera mode
detect:
enabled: True
fps: 5 # increase to 10 if vehicles move quickly across your frame
min_initialized: 2
width: 1920
height: 1080
objects:
track:
- license_plate
filters:
license_plate:
threshold: 0.7
motion:
threshold: 30
contour_area: 60 # use an increased value to tune out small motion changes
improve_contrast: false
mask: 0.704,0.007,0.709,0.052,0.989,0.055,0.993,0.001 # ensure your camera's timestamp is masked
record:
enabled: True # disable recording if you only want snapshots
snapshots:
enabled: True
review:
detections:
labels:
- license_plate
With this setup:
- License plates are treated as normal objects in Frigate.
- Scores, alerts, detections, snapshots, zones, and object masks work as expected.
- Snapshots will have license plate bounding boxes on them.
- The
frigate/events
MQTT topic will publish tracked object updates. - Debug view will display
license_plate
bounding boxes. - If you are using a Frigate+ model and want to submit images from your dedicated LPR camera for model training and fine-tuning, annotate both the
car
and thelicense_plate
in the snapshots on the Frigate+ website, even if the car is barely visible.
Using the Secondary LPR Pipeline (Without Frigate+)
If you are not running a Frigate+ model, you can use Frigate’s built-in secondary dedicated LPR pipeline. In this mode, Frigate bypasses the standard object detection pipeline and runs a local license plate detector model on the full frame whenever motion activity occurs.
An example configuration for a dedicated LPR camera using the secondary pipeline:
# LPR global configuration
lpr:
enabled: True
detection_threshold: 0.7 # change if necessary
# Dedicated LPR camera configuration
cameras:
dedicated_lpr_camera:
type: "lpr" # required to use dedicated LPR camera mode
lpr:
enabled: True
enhancement: 3 # optional, enhance the image before trying to recognize characters
ffmpeg: ...
detect:
enabled: False # disable Frigate's standard object detection pipeline
fps: 5 # increase if necessary, though high values may slow down Frigate's enrichments pipeline and use considerable CPU
width: 1920
height: 1080
objects:
track: [] # required when not using a Frigate+ model for dedicated LPR mode
motion:
threshold: 30
contour_area: 60 # use an increased value here to tune out small motion changes
improve_contrast: false
mask: 0.704,0.007,0.709,0.052,0.989,0.055,0.993,0.001 # ensure your camera's timestamp is masked
record:
enabled: True # disable recording if you only want snapshots
review:
detections:
enabled: True
retain:
default: 7
With this setup:
- The standard object detection pipeline is bypassed. Any detected license plates on dedicated LPR cameras are treated similarly to manual events in Frigate. You must not specify
license_plate
as an object to track. - The license plate detector runs on the full frame whenever motion is detected and processes frames according to your detect
fps
setting. - Review items will always be classified as a
detection
. - Snapshots will always be saved.
- Zones and object masks are not used.
- The
frigate/events
MQTT topic will not publish tracked object updates, thoughfrigate/reviews
will if recordings are enabled. - License plate snapshots are saved at the highest-scoring moment and appear in Explore.
- Debug view will not show
license_plate
bounding boxes.
Summary
Feature | Native license_plate detecting Model (like Frigate+) | Secondary Pipeline (without native model or Frigate+) |
---|---|---|
License Plate Detection | Uses license_plate as a tracked object | Runs a dedicated LPR pipeline |
FPS Setting | 5 (increase for fast-moving cars) | 5 (increase for fast-moving cars, but it may use much more CPU) |
Object Detection | Standard Frigate+ detection applies | Bypasses standard object detection |
Zones & Object Masks | Supported | Not supported |
Debug View | May show license_plate bounding boxes | May not show license_plate bounding boxes |
MQTT frigate/events | Publishes tracked object updates | Does not publish tracked object updates |
Explore | Recognized plates available in More Filters | Recognized plates available in More Filters |
By selecting the appropriate configuration, users can optimize their dedicated LPR cameras based on whether they are using a Frigate+ model or the secondary LPR pipeline.
Best practices for using Dedicated LPR camera mode
- Tune your motion detection and increase the
contour_area
until you see only larger motion boxes being created as cars pass through the frame (likely somewhere between 50-90 for a 1920x1080 detect stream). Increasing thecontour_area
filters out small areas of motion and will prevent excessive resource use from looking for license plates in frames that don't even have a car passing through it. - Disable the
improve_contrast
motion setting, especially if you are running LPR at night and the frame is mostly dark. This will prevent small pixel changes and smaller areas of motion from triggering license plate detection. - Ensure your camera's timestamp is covered with a motion mask so that it's not incorrectly detected as a license plate.
- For non-Frigate+ users, you may need to change your camera settings for a clearer image or decrease your global
recognition_threshold
config if your plates are not being accurately recognized at night. - The secondary pipeline mode runs a local AI model on your CPU to detect plates. Increasing detect
fps
will increase CPU usage proportionally.
FAQ
Why isn't my license plate being detected and recognized?
Ensure that:
- Your camera has a clear, human-readable, well-lit view of the plate. If you can't read the plate's characters, Frigate certainly won't be able to, even if the model is recognizing a
license_plate
. This may require changing video size, quality, or frame rate settings on your camera, depending on your scene and how fast the vehicles are traveling. - The plate is large enough in the image (try adjusting
min_area
) or increasing the resolution of your camera's stream. - Your
enhancement
level (if you've changed it from the default of0
) is not too high. Too much enhancement will run too much denoising and cause the plate characters to become blurry and unreadable.
If you are using a Frigate+ model or a custom model that detects license plates, ensure that license_plate
is added to your list of objects to track.
If you are using the free model that ships with Frigate, you should not add license_plate
to the list of objects to track.
Recognized plates will show as object labels in the debug view and will appear in the "Recognized License Plates" select box in the More Filters popout in Explore.
If you are still having issues detecting plates, start with a basic configuration and see the debugging tips below.
Can I run LPR without detecting car
objects?
In normal LPR mode, Frigate requires a car
to be detected first before recognizing a license plate. If you have a dedicated LPR camera, you can change the camera type
to "lpr"
to use the Dedicated LPR Camera algorithm. This comes with important caveats, though. See the Dedicated LPR Cameras section above.
How can I improve detection accuracy?
- Use high-quality cameras with good resolution.
- Adjust
detection_threshold
andrecognition_threshold
values. - Define a
format
regex to filter out invalid detections.
Does LPR work at night?
Yes, but performance depends on camera quality, lighting, and infrared capabilities. Make sure your camera can capture clear images of plates at night.
How can I match known plates with minor variations?
Use match_distance
to allow small character mismatches. Alternatively, define multiple variations in known_plates
.
How do I debug LPR issues?
-
View MQTT messages for
frigate/events
to verify detected plates. -
If you are using a Frigate+ model or a model that detects license plates, watch the debug view (Settings --> Debug) to ensure that
license_plate
is being detected with acar
. -
Watch the debug view to see plates recognized in real-time. For non-dedicated LPR cameras, the
car
label will change to the recognized plate when LPR is enabled and working. -
Adjust
detection_threshold
andrecognition_threshold
settings per the suggestions above. -
Enable
debug_save_plates
to save images of detected text on plates to the clips directory (/media/frigate/clips/lpr
). -
Enable debug logs for LPR by adding
frigate.data_processing.common.license_plate: debug
to yourlogger
configuration. These logs are very verbose, so only enable this when necessary.logger:
default: info
logs:
frigate.data_processing.common.license_plate: debug
Will LPR slow down my system?
LPR runs on the CPU, so performance impact depends on your hardware. Ensure you have at least 4GB RAM and a capable CPU for optimal results. If you are running the Dedicated LPR Camera mode, resource usage will be higher compared to users who run a model that natively detects license plates. Tune your motion detection settings for your dedicated LPR camera so that the license plate detection model runs only when necessary.