# Benchmarking

Drive Rekor Scout® on all CPU cores to benchmark speed for various video resolutions.

## Example Benchmarks

Benchmarks demonstrating the power of Rekor Scout are presented below. If you find yourself thinking, “These numbers look too good to be true”, we understand. Don't take our word for it.

[‍Try it out](#installation) yourself!

### Plate number accuracy

| Benchmark            | License plate state identified | Correct in 1 of 10 estimates | Correct on 1st estimate |
| -------------------- | ------------------------------ | ---------------------------- | ----------------------- |
| OpenALPR Open Source | 0.00%                          | 65.69%                       | 42.16%                  |
| **Rekor Scout®**     | **96.83%**                     | **100.00%**                  | **99.02%**              |

### CPU hardware video performance

Benchmarks were conducted using version 4.1.13 of the Rekor Scout Agent.

<table><thead><tr><th valign="top">System Profile</th><th valign="top">720p</th><th valign="top">1080p</th><th valign="top">4K</th><th valign="top">AWS Instance Type</th></tr></thead><tbody><tr><td valign="top">I7-6700 CPU@3.40GHZ</td><td valign="top">17.3 FPS</td><td valign="top">11.7 FPS</td><td valign="top">6.9 FPS</td><td valign="top"> </td></tr><tr><td valign="top">i7- 870 CPU@ 2.93GHz</td><td valign="top">26.2 FPS</td><td valign="top">16.0 FPS</td><td valign="top">8.8 FPS</td><td valign="top"> </td></tr><tr><td valign="top">i7-9750H CPU @2.60GHz</td><td valign="top">28.4 FPS</td><td valign="top">19.7 FPS</td><td valign="top">4.2 FPS</td><td valign="top"> </td></tr><tr><td valign="top">Xeon E5506  CPU@ 2.13GHz</td><td valign="top">29.5 FPS</td><td valign="top">19.9 FPS</td><td valign="top">10.8 FPS</td><td valign="top"> </td></tr><tr><td valign="top">Xeon Platinum 8275CL CPU @ 3.00GHz</td><td valign="top">105.5 FPS</td><td valign="top">66.2 FPS</td><td valign="top">29.2 FPS</td><td valign="top">c5.2xlarge</td></tr><tr><td valign="top">Xeon Platinum 8488C</td><td valign="top">129.2 FPS</td><td valign="top">81.3 FPS</td><td valign="top">36.6 FPS</td><td valign="top">c5n.2xlarge</td></tr><tr><td valign="top">Intel Xeon CPU E5-2686 v4 @ 2.30GHz</td><td valign="top">31.4 FPS</td><td valign="top">19.6 FPS</td><td valign="top">8.7 FPS</td><td valign="top">t2.large</td></tr><tr><td valign="top">Intel Xeon Platinum 8151 CPU @ 3.40GHz</td><td valign="top">31.1 FPS</td><td valign="top">18.9 FPS</td><td valign="top">8.2 FPS</td><td valign="top">z1d.large</td></tr><tr><td valign="top">AMD EPYC 7571</td><td valign="top">15.1 FPS</td><td valign="top">9.6 FPS</td><td valign="top">4.9 FPS</td><td valign="top">t3a.large</td></tr><tr><td valign="top">Intel Xeon Platinum 8124M CPU @ 3.00GHz</td><td valign="top">148.7 FPS</td><td valign="top">112.3 FPS</td><td valign="top">70.9 FPS</td><td valign="top">c5.9xlarge</td></tr><tr><td valign="top">Intel Xeon Platinum 8175M CPU @ 2.50GHz</td><td valign="top">88.2 FPS</td><td valign="top">57.2 FPS</td><td valign="top">26.2 FPS</td><td valign="top">m5.2xlarge</td></tr><tr><td valign="top">Intel Xeon Platinum 8259CL CPU @ 2.50GHz</td><td valign="top">23.8 FPS</td><td valign="top">14.6 FPS</td><td valign="top">6.4 FPS</td><td valign="top">t3.large</td></tr><tr><td valign="top">Intel Xeon CPU E5-2666 v3 @ 2.90GHz</td><td valign="top">24.7 FPS</td><td valign="top">15.0 FPS</td><td valign="top">6.7 FPS</td><td valign="top">c4.large</td></tr><tr><td valign="top">Intel Xeon CPU E7-8880 v3 @ 2.30GHz</td><td valign="top">36.2 FPS</td><td valign="top">22.3 FPS</td><td valign="top">10.3 FPS</td><td valign="top">x1e.xlarge</td></tr><tr><td valign="top">Intel Xeon Platinum 8175M CPU @ 2.50GHz</td><td valign="top">124.3 FPS</td><td valign="top">87.2 FPS</td><td valign="top">44.6 FPS</td><td valign="top">m5.4xlarge</td></tr></tbody></table>

### NVIDIA GPU video performance

Benchmarks were conducted using version 4.1.13 of the Rekor Scout Agent with [NVIDIA GPU Acceleration](https://docs.rekor.ai/scout/agent/configuration/nvidia-gpu-acceleration) enabled.

<table><thead><tr><th valign="top">System Profile</th><th valign="top">720p</th><th valign="top">1080p</th><th valign="top">4K</th></tr></thead><tbody><tr><td valign="top">GTX 1660 Ti </td><td valign="top">41.2 FPS</td><td valign="top">28.7 FPS</td><td valign="top">8.2 FPS</td></tr><tr><td valign="top">T400</td><td valign="top">26.6 FPS</td><td valign="top">16.1  FPS</td><td valign="top">8.8 FPS</td></tr><tr><td valign="top">NVIDIA Jetson Xavier NX</td><td valign="top">20.1 FPS</td><td valign="top">13.2 FPS</td><td valign="top">6.8 FPS</td></tr></tbody></table>

## Prerequisites

* Rekor Scout® Basic or Pro license/subscription
* Ubuntu 22.04, Ubuntu 20.04, Ubuntu 18.04, Windows 10, or Windows 11
* Python (2 or 3)

## Installation

{% tabs %}
{% tab title="Generic" %}

1. Download the [Vehicle Recognition SDK](https://app.gitbook.com/s/bRuDdZ6Vi4jTT1jtrZdm/vehicle-recognition-sdk)
2. Clone this repository `git clone https://github.com/openalpr/speed_benchmark.git`
3. Install the Python requirements `pip install -r requirements.txt`
   {% endtab %}

{% tab title="Docker" %}

```
docker run -it --rm -v /etc/openalpr:/etc/openalpr/ openalpr/commercial-agent /bin/bash
apt update && apt install -y curl python-pip git
git clone https://github.com/openalpr/speed_benchmark.git
cd speed_benchmark/
pip install -r requirements.txt
bash <(curl https://deb.openalpr.com/install)  # Select SDK
```

{% endtab %}
{% endtabs %}

## Usage

1. View all command line options by running `python speed_benchmark.py -h`
2. Select your desired resolution(s) - `vga, 720p, 1080p, and/or 4k`
3. Benchmark using the default flags (1 stream and no minimum CPU threshold) by running `python speed_benchmark.py`
4. Check the average CPU utilization (see sample output below). Resolutions with utilization of less than 95% are bottlenecked on decoding the video stream (typical for higher resolutions). These should be rerun with additional streams for a better estimate of maximum performance
5. Set the `--thres` to a non-zero value. This causes the program to add streams until the threshold CPU utilization is achieved. We recommend using `90 < thres < 95`. On large systems where the CPU utilization for a single stream is much lower than your desired threshold, you can reduce the granularity of the search by setting `--steps > 1`
6. Estimate the number of cameras for a given total FPS value by using the following per-camera rules of thumb
   * **Low Speed** (under 25 mph): 5-10 fps
   * **Medium Speed** (25-45 mph): 10-15 fps
   * **High Speed** (over 45 mph): 15-30 fps

## Sample Output

Using default options

```
user@ubuntu:~/git/speed-bench$ python speed_benchmark.py
Initializing...
	Operating system: Linux
	CPU model: Intel Core i7-8750H CPU @ 2.20GHz
	OpenALPR version: 2.7.101
	Runtime data: /usr/share/openalpr/runtime_data
	OpenALPR configuration: /usr/share/openalpr/config/openalpr.defaults.conf
Downloading benchmark videos...
	Downloaded vga
	Downloaded 720p
	Downloaded 1080p
	Downloaded 4k
Testing with 1 stream(s)...
	Processing vga
	Processing 720p
	Processing 1080p
	Processing 4k
	Lowest average CPU usage 81.4%
+---------------------------------------------------------+
|        OpenALPR Speed: 1 stream(s) on 12 threads        |
+------------+-----------+-----------+-----------+--------+
| Resolution | Total FPS | CPU (Avg) | CPU (Max) | Frames |
+------------+-----------+-----------+-----------+--------+
|    vga     |    52.9   |    81.4   |    99.4   |  479   |
|    720p    |    49.6   |    84.9   |    99.5   |  479   |
|   1080p    |    44.4   |    88.8   |   100.0   |  479   |
|     4k     |    23.8   |    93.7   |   100.0   |  479   |
+------------+-----------+-----------+-----------+--------+
Saving results to /home/user/git/speed_benchmark/speed-bench-20190618.csv
```

Starting with 3 streams and incrementing by 2 each time 95% CPU utilization is not achieved

```
user@ubuntu:~/git/speed-bench$ python speed_benchmark.py --thres 95 --streams 3 --step 2
Initializing...
	Operating system: Linux
	CPU model: Intel Core i7-8750H CPU @ 2.20GHz
	OpenALPR version: 2.7.101
	Runtime data: /usr/share/openalpr/runtime_data
	OpenALPR configuration: /usr/share/openalpr/config/openalpr.defaults.conf
Downloading benchmark videos...
	Found local vga
	Found local 720p
	Found local 1080p
	Found local 4k
Testing with 3 stream(s)...
	Processing vga
	Processing 720p
	Processing 1080p
	Processing 4k
	Lowest average CPU usage 93.2%
Testing with 5 stream(s)...
	Processing vga
	Processing 720p
	Processing 1080p
	Processing 4k
	Lowest average CPU usage 95.3%
+---------------------------------------------------------+
|        OpenALPR Speed: 5 stream(s) on 12 threads        |
+------------+-----------+-----------+-----------+--------+
| Resolution | Total FPS | CPU (Avg) | CPU (Max) | Frames |
+------------+-----------+-----------+-----------+--------+
|    vga     |    66.5   |    95.3   |   100.0   |  479   |
|    720p    |    61.3   |    96.2   |   100.0   |  479   |
|   1080p    |    54.1   |    97.3   |   100.0   |  479   |
|     4k     |    29.5   |    99.2   |   100.0   |  479   |
+------------+-----------+-----------+-----------+--------+
Saving results to /home/user/git/speed_benchmark/speed-bench-20190618.csv
```
