Note
Go to the end to download the full example code.
Efficient online eye tracking with a lightweight spatiotemporal network and event cameras
1. Introduction
Event cameras are biologically inspired sensors that output asynchronous streams of per-pixel brightness changes, rather than fixed-rate frames. This modality is especially well suited for high-speed, low-power applications like real-time eye tracking on embedded hardware. Traditional deep learning models, however, are often ill-suited for exploiting the unique characteristics of event data — particularly they lack the tools to leverage their temporal precision and sparsity.
This tutorial presents a lightweight spatiotemporal neural network architecture designed specifically for online inference on event camera data. The model is:
Causal and streaming-capable, using FIFO buffering for minimal-latency inference.
Highly efficient, with a small compute and memory footprint.
Accurate, achieving state-of-the-art results on a competitive eye tracking benchmark.
Further optimizable via activation sparsification, maintaining performance while reducing computational load.
The following sections outline the architecture, dataset characteristics, evaluation results, buffering mechanism, and advanced optimization strategies.
2. Network architecture
The proposed architecture is a stack of spatiotemporal convolutional blocks, each consisting of a temporal convolution followed by a spatial convolution. These are designed to extract both fine-grained temporal features and local spatial structure from event-based input tensors. The figure below shows the details of the model architecture.

2.1 Key design features
Causal Temporal Convolutions
Temporal convolutions are strictly causal—output at time t depends only on input at time ≤ t. This property is critical for real-time, online inference, allowing inference from the first received frame from the sensor.
Factorized 3D Convolution Scheme
Our spatiotemporal blocks perform temporal convolutions first, followed by spatial convolutions. Decomposing the 3D convolutions into temporal and spatial layers greatly reduces computation (in much the same way that depthwise separable layers do for 2D convolutions).
Depthwise-Separable Convolutions (DWS)
Both temporal and spatial layers can optionally be configured as depthwise-separable to further reduce computation with minimal loss in accuracy.
No Residual Connections
To conserve memory and simplify deployment on edge devices, residual connections are omitted. Since the model has a reduced number of layers, they are not critical to achieve SOTA performance.
Detection Head
A lightweight head, inspired by CenterNet Zhou et al. 2019, predicts a confidence score and local spatial offsets for the pupil position over a coarse spatial grid. The predicted position of the pupil can then be reconstructed.
2.2 Instantiating the spatiotemporal blocks
QuantizeML and Akida Models natively work with Tensorflow/Keras layers: akida_models has all the necessary functions to instantiate a network based on spatiotemporal layers as well as training pipelines available to train models on the jester dataset, the dvs128 dataset or this dataset.
In this tutorial, we’ll use PyTorch and introduce the tenns_modules package which is available to create Akida compatible spatiotemporal blocks. The package contains a spatio-temporal block composed of a spatial and a temporal block.
The code below shows how to instantiate the simple 10 layers architecture we used to track the pupil coordinates in time using the tenns_modules package.
# Show how to load and create the model
import torch
import torch.nn as nn
from tenns_modules import SpatioTemporalBlock
from torchinfo import summary
n_depthwise_layers = 4
channels = [2, 8, 16, 32, 48, 64, 80, 96, 112, 128, 256]
t_kernel_size = 5 # can vary from 1 to 10
s_kernel_size = 3 # can vary in [1, 3, 5, 7] (1 only when depthwise is False)
class TennSt(nn.Module):
def __init__(self, channels, t_kernel_size, s_kernel_size, n_depthwise_layers):
super().__init__()
depthwises = [False] * (10 - n_depthwise_layers) + [True] * n_depthwise_layers
self.backbone = nn.Sequential()
for i in range(0, len(depthwises), 2):
in_channels, med_channels, out_channels = channels[i], channels[i + 1], channels[i + 2]
t_depthwise, s_depthwise = depthwises[i], depthwises[i]
self.backbone.append(
SpatioTemporalBlock(in_channels=in_channels, med_channels=med_channels,
out_channels=out_channels, t_kernel_size=t_kernel_size,
s_kernel_size=s_kernel_size, s_stride=2, bias=False,
t_depthwise=t_depthwise, s_depthwise=s_depthwise))
self.head = nn.Sequential(
SpatioTemporalBlock(channels[-1], channels[-1], channels[-1],
t_kernel_size=t_kernel_size, s_kernel_size=s_kernel_size,
t_depthwise=False, s_depthwise=False),
nn.Conv3d(channels[-1], 3, 1)
)
def forward(self, input):
return self.head((self.backbone(input)))
model = TennSt(channels, t_kernel_size, s_kernel_size, n_depthwise_layers)
summary(model, input_size=(1, 2, 50, 96, 128), depth=4, verbose=0)
====================================================================================================
Layer (type:depth-idx) Output Shape Param #
====================================================================================================
TennSt [1, 3, 50, 3, 4] --
├─Sequential: 1-1 [1, 256, 50, 3, 4] --
│ └─SpatioTemporalBlock: 2-1 [1, 16, 50, 48, 64] --
│ │ └─Sequential: 3-1 [1, 16, 50, 48, 64] --
│ │ │ └─TemporalBlock: 4-1 [1, 8, 50, 96, 128] 96
│ │ │ └─SpatialBlock: 4-2 [1, 16, 50, 48, 64] 1,184
│ └─SpatioTemporalBlock: 2-2 [1, 48, 50, 24, 32] --
│ │ └─Sequential: 3-2 [1, 48, 50, 24, 32] --
│ │ │ └─TemporalBlock: 4-3 [1, 32, 50, 48, 64] 2,624
│ │ │ └─SpatialBlock: 4-4 [1, 48, 50, 24, 32] 13,920
│ └─SpatioTemporalBlock: 2-3 [1, 80, 50, 12, 16] --
│ │ └─Sequential: 3-3 [1, 80, 50, 12, 16] --
│ │ │ └─TemporalBlock: 4-5 [1, 64, 50, 24, 32] 15,488
│ │ │ └─SpatialBlock: 4-6 [1, 80, 50, 12, 16] 46,240
│ └─SpatioTemporalBlock: 2-4 [1, 112, 50, 6, 8] --
│ │ └─Sequential: 3-4 [1, 112, 50, 6, 8] --
│ │ │ └─TemporalBlock: 4-7 [1, 96, 50, 12, 16] 8,432
│ │ │ └─SpatialBlock: 4-8 [1, 112, 50, 6, 8] 12,032
│ └─SpatioTemporalBlock: 2-5 [1, 256, 50, 3, 4] --
│ │ └─Sequential: 3-5 [1, 256, 50, 3, 4] --
│ │ │ └─TemporalBlock: 4-9 [1, 128, 50, 6, 8] 15,376
│ │ │ └─SpatialBlock: 4-10 [1, 256, 50, 3, 4] 34,688
├─Sequential: 1-2 [1, 3, 50, 3, 4] --
│ └─SpatioTemporalBlock: 2-6 [1, 256, 50, 3, 4] --
│ │ └─Sequential: 3-6 [1, 256, 50, 3, 4] --
│ │ │ └─TemporalBlock: 4-11 [1, 256, 50, 3, 4] 328,448
│ │ │ └─SpatialBlock: 4-12 [1, 256, 50, 3, 4] 590,592
│ └─Conv3d: 2-7 [1, 3, 50, 3, 4] 771
====================================================================================================
Total params: 1,069,891
Trainable params: 1,069,891
Non-trainable params: 0
Total mult-adds (Units.GIGABYTES): 2.90
====================================================================================================
Input size (MB): 4.92
Forward/backward pass size (MB): 330.56
Params size (MB): 4.28
Estimated Total Size (MB): 339.76
====================================================================================================
3. Dataset and preprocessing
The model is trained and evaluated on the AIS 2024 Event-Based Eye Tracking Challenge Dataset, which contains recordings from 13 participants, captured using 480×640-resolution event camera. Each participant has between 2 and 6 recording sessions. The ground truth pupil (x- and y-) coordinates are provided at a resolution of 100Hz. The evaluation of the predictions is done at 20Hz at a resolution of 60x80 when the eyes are opened.
The video below shows you an example of the reconstructed frames (note that the video has been sped up). The ground truth pupil location is represented by a cross: the cross is green when the eye is opened and it turns red when the eye closes.
3.1 Preprocessing
The following preprocessing is applied to the event data:
temporal augmentations (for training only)
spatial downsampling (by 5) and event binning to create segments with fixed temporal length
spatial affine transforms
frames where the eye is labeled as closed are ignored during training
3.1.1 Event binning
Events are represented as 4-tuples: (polarity, x, y, timestamp). These are converted into tensors of shape (P=2, T, H, W) using causal event volume binning, a method that preserves temporal fidelity while avoiding future context. Binning uses a causal triangle kernel to approximate each event’s influence over space and time, as you can see from the graph below.

3.1.2 Augmentation
To improve generalization in a data-limited regime, the following transforms are applied to the events (and the corresponding pupil coordinates) during training only:
Spatial affine transforms are applied such as scaling, rotation, translation.
Temporal augmentations including random time scaling and flipping (with polarity inversion).
Random temporal flip with probability 0.5 is applied to the time and polarity dimension.
These transforms are applied to each segment independently (but not varied within a segment). For better legibility, the dataset was preprocessed offline and made available for evaluation purposes only.
3.2 Evaluation metric
For the competition, the primary metric for model evaluation was the “p10” accuracy: the percentage of predictions falling within 10 pixels of the ground truth (i.e. if the predicted pupil center falls within the blue dashed circle in the figure below). We can also consider more stringent measures, such as a p3 accuracy (3 pixels); or simpler linear measures, such as the Euclidean distance (L2).

4. Model training & evaluation
4.1 Training details
The following hyperparameters were used for training:
batch size of 32
50 event frames per segment
200 epochs
AdamW optimizer with base LR of 0.002 and weight decay of 0.005
learning rate scheduler with linear warm up (for 2.5% of total epochs) and a cosine decay
Note
We don’t train the model here as it requires access to a GPU but rather load a pre-trained model for convenience.
# Load the pretrained weights in our model
from akida_models import fetch_file
ckpt_file = fetch_file(
fname="tenn_spatiotemporal_eye.ckpt",
origin="https://data.brainchip.com/models/AkidaV2/tenn_spatiotemporal/tenn_spatiotemporal_eye.ckpt",
cache_subdir='models')
checkpoint = torch.load(ckpt_file, map_location="cpu")
new_state_dict = {k.replace('model._orig_mod.', ''): v for k, v in checkpoint["state_dict"].items()}
model.load_state_dict(new_state_dict)
_ = model.eval().cpu()
Downloading data from https://data.brainchip.com/models/AkidaV2/tenn_spatiotemporal/tenn_spatiotemporal_eye.ckpt.
0/12939568 [..............................] - ETA: 0s
212992/12939568 [..............................] - ETA: 3s
1089536/12939568 [=>............................] - ETA: 1s
2097152/12939568 [===>..........................] - ETA: 0s
3227648/12939568 [======>.......................] - ETA: 0s
4374528/12939568 [=========>....................] - ETA: 0s
5554176/12939568 [===========>..................] - ETA: 0s
6692864/12939568 [==============>...............] - ETA: 0s
7897088/12939568 [=================>............] - ETA: 0s
9019392/12939568 [===================>..........] - ETA: 0s
10166272/12939568 [======================>.......] - ETA: 0s
11362304/12939568 [=========================>....] - ETA: 0s
12550144/12939568 [============================>.] - ETA: 0s
12939568/12939568 [==============================] - 1s 0us/step
Download complete.
4.2 Evaluation
The preprocessed test data have been set aside and can be loaded from the archive available online.
Note
To optimize storage and reduce processing time, only the first 400 frames from each test file have been mirrored on the dataset server. This subset is representative and sufficient for evaluation purposes in this tutorial.
import numpy as np
samples = fetch_file("https://data.brainchip.com/dataset-mirror/eye_tracking_ais2024_cvpr/eye_tracking_preprocessed_400frames_test.npz",
fname="eye_tracking_preprocessed_400frames_test.npz")
data = np.load(samples, allow_pickle=True)
events, centers = data["events"], data["centers"]
Downloading data from https://data.brainchip.com/dataset-mirror/eye_tracking_ais2024_cvpr/eye_tracking_preprocessed_400frames_test.npz.
0/57049038 [..............................] - ETA: 0s
237568/57049038 [..............................] - ETA: 12s
983040/57049038 [..............................] - ETA: 5s
1966080/57049038 [>.............................] - ETA: 4s
2981888/57049038 [>.............................] - ETA: 3s
3981312/57049038 [=>............................] - ETA: 3s
4849664/57049038 [=>............................] - ETA: 3s
5750784/57049038 [==>...........................] - ETA: 3s
6832128/57049038 [==>...........................] - ETA: 2s
7913472/57049038 [===>..........................] - ETA: 2s
9109504/57049038 [===>..........................] - ETA: 2s
10305536/57049038 [====>.........................] - ETA: 2s
11501568/57049038 [=====>........................] - ETA: 2s
12648448/57049038 [=====>........................] - ETA: 2s
13860864/57049038 [======>.......................] - ETA: 2s
15024128/57049038 [======>.......................] - ETA: 2s
16203776/57049038 [=======>......................] - ETA: 2s
17383424/57049038 [========>.....................] - ETA: 1s
18530304/57049038 [========>.....................] - ETA: 1s
19726336/57049038 [=========>....................] - ETA: 1s
20840448/57049038 [=========>....................] - ETA: 1s
22052864/57049038 [==========>...................] - ETA: 1s
23199744/57049038 [===========>..................] - ETA: 1s
24346624/57049038 [===========>..................] - ETA: 1s
25559040/57049038 [============>.................] - ETA: 1s
26763264/57049038 [=============>................] - ETA: 1s
27951104/57049038 [=============>................] - ETA: 1s
29130752/57049038 [==============>...............] - ETA: 1s
30294016/57049038 [==============>...............] - ETA: 1s
31440896/57049038 [===============>..............] - ETA: 1s
32669696/57049038 [================>.............] - ETA: 1s
33865728/57049038 [================>.............] - ETA: 1s
35045376/57049038 [=================>............] - ETA: 1s
36274176/57049038 [==================>...........] - ETA: 0s
37421056/57049038 [==================>...........] - ETA: 0s
38649856/57049038 [===================>..........] - ETA: 0s
39845888/57049038 [===================>..........] - ETA: 0s
41041920/57049038 [====================>.........] - ETA: 0s
42221568/57049038 [=====================>........] - ETA: 0s
43450368/57049038 [=====================>........] - ETA: 0s
44597248/57049038 [======================>.......] - ETA: 0s
45858816/57049038 [=======================>......] - ETA: 0s
46989312/57049038 [=======================>......] - ETA: 0s
48234496/57049038 [========================>.....] - ETA: 0s
49397760/57049038 [========================>.....] - ETA: 0s
50642944/57049038 [=========================>....] - ETA: 0s
51838976/57049038 [==========================>...] - ETA: 0s
53002240/57049038 [==========================>...] - ETA: 0s
54231040/57049038 [===========================>..] - ETA: 0s
55369728/57049038 [============================>.] - ETA: 0s
56819712/57049038 [============================>.] - ETA: 0s
57049038/57049038 [==============================] - 3s 0us/step
Download complete.
To evaluate the model, we pass the data through our spatiotemporal model. Once we have the output, we need to post process the model’s output to reconstruct the predicted pupil coordinates in the prediction space (60, 80).
def process_detector_prediction(pred):
"""Post-processing of model predictions to extract the predicted pupil coordinates for a model
that has a centernet like head.
Args:
preds (torch.Tensor): shape (B, C, T, H, W)
Returns:
torch tensor of (B, 2) containing the x and y predicted coordinates
"""
torch_device = pred.device
batch_size, _, frames, height, width = pred.shape
# Extract the center heatmap, and the x and y offset maps
pred_pupil, pred_x_mod, pred_y_mod = pred.moveaxis(1, 0)
pred_x_mod = torch.sigmoid(pred_x_mod)
pred_y_mod = torch.sigmoid(pred_y_mod)
# Find the stronger peak in the center heatmap and it's coordinates
pupil_ind = pred_pupil.flatten(-2, -1).argmax(-1) # (batch, frames)
pupil_ind_x = pupil_ind % width
pupil_ind_y = pupil_ind // width
# Reconstruct the predicted offset
batch_range = torch.arange(batch_size, device=torch_device).repeat_interleave(frames)
frames_range = torch.arange(frames, device=torch_device).repeat(batch_size)
pred_x_mod = pred_x_mod[batch_range, frames_range, pupil_ind_y.flatten(), pupil_ind_x.flatten()]
pred_y_mod = pred_y_mod[batch_range, frames_range, pupil_ind_y.flatten(), pupil_ind_x.flatten()]
# Express the coordinates in size agnostic terms (between 0 and 1)
x = (pupil_ind_x + pred_x_mod.view(batch_size, frames)) / width
y = (pupil_ind_y + pred_y_mod.view(batch_size, frames)) / height
return torch.stack([x, y], dim=1)
def compute_distance(pred, center):
"""Computes the L2 distance for a prediction and center matrice
Args:
pred: torch tensor of shape (2, T)
center: torch tensor of shape (2, T)
"""
height, width = 60, 80
pred = pred.detach().clone()
center = center.detach().clone()
pred[0, :] *= width
pred[1, :] *= height
center[0, :] *= width
center[1, :] *= height
l2_distances = torch.norm(center - pred, dim=0)
return l2_distances
def pretty_print_results(collected_distances):
"""Prints the distance and accuracy within different pixel tolerance.
By default, only the results at 20Hz will be printed (to be compatible with the
metrics of the challenge). To print the results computed on the whole trial,
use downsample=False. In practice, this changes very little to the final performance
of the model.
"""
for t in [10, 5, 3, 1]:
p_acc = (collected_distances < t).sum() / collected_distances.size
print(f'- p{t}: {p_acc:.3f}')
print(f'- Euc. Dist: {collected_distances.mean():.3f} ')
# Get the model device to propagate the events properly
torch_device = next(model.parameters()).device
# Compute the distances across all 9 trials
collected_l2_distances = np.zeros((0,))
for trial_idx, event in enumerate(events):
center = torch.from_numpy(centers[trial_idx]).float().to(torch_device)
event = torch.from_numpy(event).unsqueeze(0).float().to(torch_device)
pred = model(event)
pred = process_detector_prediction(pred).squeeze(0)
l2_distances = compute_distance(pred, center)
collected_l2_distances = np.concatenate((collected_l2_distances, l2_distances), axis=0)
pretty_print_results(collected_l2_distances)
- p10: 0.991
- p5: 0.979
- p3: 0.931
- p1: 0.362
- Euc. Dist: 1.601
5. Official competition results
The results for the competition are on the test set (labels are not available). The main metric in the challenge was the p10. Using this metric, our model ranked 3rd (see table below copied from the original challenge survey paper).
However, other metrics were reported in the original challenge survey: the accuracy within 5 (p5), 3 (p3) or 1 pixel (p1), as well as metrics directly measuring the distance between ground truth and predicted pupil location (L2 and L1, i.e. smaller values are better). On these more stringent metrics, our model outperforms the other models on all the other metrics.
Team |
Rank |
p10 private (primary) |
p10 🡑 |
p5 🡑 |
p3 🡑 |
p1 🡑 |
L2 🡓 |
L1 🡓 |
---|---|---|---|---|---|---|---|---|
USTCEventGroup |
1 |
99.58 |
99.42 |
97.05 |
90.73 |
33.75 |
1.67 |
2.11 |
FreeEvs |
2 |
99.27 |
99.26 |
94.31 |
83.83 |
23.91 |
2.03 |
2.56 |
Brainchip |
3 |
99.16 |
99.00 |
97.79 |
94.58 |
45.50 |
1.44 |
1.82 |
Go Sparse |
4 |
98.74 |
99.00 |
77.20 |
47.97 |
7.32 |
3.51 |
4.63 |
MeMo |
4 |
98.74 |
99.05 |
89.36 |
50.87 |
6.53 |
3.2 |
4.04 |
The best metric in class is highlighted in bold, 🡑 means higher values are best, 🡓 means lower values are best.
The code below shows an inference on the model using the test dataset. Note that the results below differ from the challenge metrics reported above because our submission model was trained on both the train and validation data to achieve the best possible performance (as allowed by the rules), but the model below that was used for the ablation studies was trained on the train set only.
6. Ablation studies and efficiency optimization
Figure reproduced from the original paper.

6.1 Ablation studies
To test the robustness of our design choices, we performed a series of ablation studies. To provide a baseline model for the ablation study, we trained a model on the ‘train’ split only and tested it on the validation dataset. This model gets a p10 of 0.963 and an l2 distance of 2.79.
This showed that:
Removing spatial affine augmentation reduces performance dramatically (from 0.963 → 0.588).
Causal event binning performs equivalently to other methods while enabling streaming inference.
Larger temporal kernels (e.g., size 5 vs. 3) offer small but consistent improvements in accuracy.
Using only batch normalization (BN) layers gave a small improvement over group norm (GN) only or a mix of BN/GN(96.9 vs 96.0 or 96.3).
For more details you can refer to the paper.
6.2 Efficiency-accuracy trade-offs
In certain environments, such as edge or low-power devices, the balance between model size and computational demand often matters more than achieving state-of-the-art accuracy. This section explores the trade-off between maximizing accuracy and maintaining model efficiency along 3 axis.
6.2.1 Spatial resolution
We looked at how reducing input image size affects model performance (see figure 3.A). Even with an input size of 60 x 80 (downsampling by a factor of 8), the model still performs almost as well as with our default setting (downsampling by a factor of 5), while requiring only a third of the computation.
6.2.2 Depthwise separable convolutions
From the outset, we decided to further decompose our factorized convolutions into depthwise and pointwise convolutions (similar to depthwise separable convolutions introduced in MobileNet V1). We explored how these impacted model performance (see figure 3.B): as the number of separable convolutions used increases, the MACs of the model decrease, with a relatively small impact on the validation distance. When no separable layers are used, the final validation distance is 2.6 vs. 3.1 when all layers are separable. Our baseline model had the last 4 layers configured as separable. Changing just 2 more to separable could lead to a reduction of almost 30% in compute, with almost no impact on performance (compare the turquoise with green lines on the figure 3.B).
The combination of these techniques results in a highly efficient model with a computational cost of just 55M MACs/frame, and even less when sparsity is exploited.
6.2.3 Activity regularization
Event camera data is inherently sparse. However, intermediate layers in a neural network may still produce dense activations unless explicitly regularized. When measuring the baseline sparsity in the network, we found it to be on average 50% (about what one would expect given ReLU activation functions), much of which may not be informative given the very high spatial sparsity of the input to the network. By applying L1 regularization to ReLU activations during training, the model is encouraged to silence unnecessary activations. We applied 5 different levels of regularization to our model: figure 3.C shows how the average distance varies depending on the regularization strength while figure 3.D shows how the sparse aware MACs (i.e. MACs multiplied by the model’s mean sparsity per layer) is affected by regularization. We can see that over 90% activation sparsity is achievable with a negligible performance degradation (p10 remains >0.96).
This is especially interesting because Akida is an event based hardware: it is capable of skipping zero operations. In such hardware, high level of activation sparsity can translate into ~5× speedups.
Warning
Based on these ablation studies, the model made available through the model zoo has been optimized for the inference on Akida Hardware (downsampling by a factor of 6, use of depthwise separable convolutions), so the number of parameters and accuracy reported differ.
7. FIFO buffering for streaming inference
7.1 Key mechanism
Each temporal convolutional layer maintains a fixed-length FIFO buffer of its input history (equal to the kernel size). At each time step:
The buffer is updated with the newest frame.
A dot product is computed between the buffer contents and the kernel weights.
The result is passed through normalization and spatial convolution.
This approach mimics the operation of a sliding temporal convolution but avoids recomputation and memory redundancy, ensuring minimal latency and efficient real-time processing. For more details of this approach, see the tutorial that introduced spatiotemporal models.

7.2 Exporting to ONNX
The transformation to buffer mode is done during quantization step (see dedicated section below). The first step is to export the model to ONNX format. This is made very easy using the tenns_modules package and the export_to_onnx function.
from tenns_modules import export_to_onnx
# Using a batch size of 10 to export with a dynamic batch size
onnx_checkpoint_path = "tenns_modules_onnx.onnx"
export_to_onnx(model, (10, 2, 50, 96, 128), out_path=onnx_checkpoint_path)
[torch.onnx] Obtain model graph for `TennSt([...]` with `torch.export.export(..., strict=False)`...
[torch.onnx] Obtain model graph for `TennSt([...]` with `torch.export.export(..., strict=False)`... ✅
[torch.onnx] Run decomposition...
[torch.onnx] Run decomposition... ✅
[torch.onnx] Translate the graph into ONNX...
[torch.onnx] Translate the graph into ONNX... ✅
Model exported to tenns_modules_onnx.onnx.
Load the ONNX model that was automatically saved
import onnx
model = onnx.load(onnx_checkpoint_path)
8. Quantization and conversion to Akida
8.1 Quantization
To be deployable on Akida, the model needs to be quantized. This can easily be done using the QuantizeML package. For more details on the quantization scheme with the ONNX package see this example on off-the-shelf model quantization.
from quantizeml.models import quantize
from quantizeml.layers import QuantizationParams
# Retrieve calibration samples:
samples = fetch_file("https://data.brainchip.com/dataset-mirror/samples/eye_tracking/eye_tracking_onnx_samples_bs100.npz",
fname="eye_tracking_onnx_samples_bs100.npz")
# Define quantization parameters and load quantization samples
qparams = QuantizationParams(per_tensor_activations=True, input_dtype='int8')
data = np.load(samples)
samples = np.concatenate([data[item] for item in data.files])
# Quantize the model
model_quant = quantize(model, qparams=qparams, epochs=1, batch_size=100, samples=samples)
Downloading data from https://data.brainchip.com/dataset-mirror/samples/eye_tracking/eye_tracking_onnx_samples_bs100.npz.
0/44009403 [..............................] - ETA: 0s
204800/44009403 [..............................] - ETA: 12s
950272/44009403 [..............................] - ETA: 4s
1941504/44009403 [>.............................] - ETA: 3s
2826240/44009403 [>.............................] - ETA: 3s
3825664/44009403 [=>............................] - ETA: 2s
4907008/44009403 [==>...........................] - ETA: 2s
6053888/44009403 [===>..........................] - ETA: 2s
7356416/44009403 [====>.........................] - ETA: 2s
8536064/44009403 [====>.........................] - ETA: 1s
9904128/44009403 [=====>........................] - ETA: 1s
11403264/44009403 [======>.......................] - ETA: 1s
12877824/44009403 [=======>......................] - ETA: 1s
14303232/44009403 [========>.....................] - ETA: 1s
15785984/44009403 [=========>....................] - ETA: 1s
17268736/44009403 [==========>...................] - ETA: 1s
18751488/44009403 [===========>..................] - ETA: 1s
20234240/44009403 [============>.................] - ETA: 1s
21364736/44009403 [=============>................] - ETA: 1s
23945216/44009403 [===============>..............] - ETA: 0s
25174016/44009403 [================>.............] - ETA: 0s
26353664/44009403 [================>.............] - ETA: 0s
27705344/44009403 [=================>............] - ETA: 0s
29171712/44009403 [==================>...........] - ETA: 0s
30408704/44009403 [===================>..........] - ETA: 0s
31514624/44009403 [====================>.........] - ETA: 0s
32972800/44009403 [=====================>........] - ETA: 0s
34250752/44009403 [======================>.......] - ETA: 0s
35364864/44009403 [=======================>......] - ETA: 0s
36839424/44009403 [========================>.....] - ETA: 0s
37953536/44009403 [========================>.....] - ETA: 0s
39247872/44009403 [=========================>....] - ETA: 0s
40706048/44009403 [==========================>...] - ETA: 0s
41820160/44009403 [===========================>..] - ETA: 0s
43196416/44009403 [============================>.] - ETA: 0s
44009403/44009403 [==============================] - 2s 0us/step
Download complete.
Applied 17 of general pattern rewrite rules.
Calibrating with 50/50.0 samples
Note
During this step, the model is also bufferized, meaning that the FIFOs of the temporal convolutions are automatically created and initialized from the 3D convolutions.
8.2 ONNX model evaluation
This model can be evaluated using the same process as before with a few differences:
We need to pass each frame to the model independently (i.e. the model now has a 4-D input shape (B, C, H, W) - batch, channels, height, width).
The post processing function needs to be modified to use numpy functions (instead of torch)
Once all frames from a given trial have been passed through, the FIFO buffers of the temporal convolutions need to be reset using the reset_buffers available from QuantizeML.
def custom_process_detector_prediction(pred):
""" Post-processing of the model's output heatmap.
Reconstructs the predicted x- and y- center location using numpy functions to post-process
the output of a ONNX model.
"""
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# Pred shape is (batch, channels, height, width)
batch_size, _, height, width = pred.shape
# Split channels - reshape to move frames dimension after batch
# Now (batch, height, width, channels)
pred = np.moveaxis(pred, 1, -1)
pred_pupil = pred[..., 0]
pred_x_mod = sigmoid(pred[..., 1])
pred_y_mod = sigmoid(pred[..., 2])
# Find pupil location
pred_pupil_flat = pred_pupil.reshape(batch_size, -1)
pupil_ind = np.argmax(pred_pupil_flat, axis=-1)
pupil_ind_x = pupil_ind % width
pupil_ind_y = pupil_ind // width
# Get the learned x- y- offset
batch_idx = np.repeat(np.arange(batch_size)[:, None], 1, axis=1)
x_mods = pred_x_mod[batch_idx, pupil_ind_y, pupil_ind_x]
y_mods = pred_y_mod[batch_idx, pupil_ind_y, pupil_ind_x]
# Calculate final coordinates
x = (pupil_ind_x + x_mods) / width
y = (pupil_ind_y + y_mods) / height
return np.stack([x, y], axis=1)
Create the inference session for the ONNX model and evaluate
from onnxruntime import InferenceSession, SessionOptions
from onnxruntime_extensions import get_library_path
from quantizeml.onnx_support.quantization import ONNXModel
sess_options = SessionOptions()
sess_options.register_custom_ops_library(get_library_path())
model_quant = ONNXModel(model_quant)
session = InferenceSession(model_quant.serialized, sess_options=sess_options,
providers=['CPUExecutionProvider'])
from quantizeml.onnx_support.layers.buffertempconv import reset_buffers
from tqdm import tqdm
# And then evaluate the model
collected_l2_distances = []
for trial_idx, event in enumerate(events):
center = centers[trial_idx]
for frame_idx in tqdm(range(event.shape[1])):
frame = event[:, frame_idx, ...][None, ...].astype(np.float32)
pred = session.run(None, {model_quant.input[0].name: frame})[0]
pred = custom_process_detector_prediction(pred).squeeze()
y_pred_x = pred[0] * 80
y_pred_y = pred[1] * 60
center_x = center[0, frame_idx] * 80
center_y = center[1, frame_idx] * 60
collected_l2_distances.append(np.sqrt(np.square(
center_x - y_pred_x) + np.square(center_y - y_pred_y)))
# Reset FIFOs between each file
reset_buffers(model_quant)
0%| | 0/400 [00:00<?, ?it/s]
0%| | 2/400 [00:00<00:25, 15.84it/s]
1%|▏ | 5/400 [00:00<00:20, 19.31it/s]
2%|▏ | 8/400 [00:00<00:19, 20.39it/s]
3%|▎ | 11/400 [00:00<00:18, 20.89it/s]
4%|▎ | 14/400 [00:00<00:18, 21.16it/s]
4%|▍ | 17/400 [00:00<00:17, 21.32it/s]
5%|▌ | 20/400 [00:00<00:17, 21.42it/s]
6%|▌ | 23/400 [00:01<00:17, 21.45it/s]
6%|▋ | 26/400 [00:01<00:17, 21.51it/s]
7%|▋ | 29/400 [00:01<00:17, 21.54it/s]
8%|▊ | 32/400 [00:01<00:17, 21.55it/s]
9%|▉ | 35/400 [00:01<00:16, 21.56it/s]
10%|▉ | 38/400 [00:01<00:16, 21.58it/s]
10%|█ | 41/400 [00:01<00:16, 21.58it/s]
11%|█ | 44/400 [00:02<00:16, 21.57it/s]
12%|█▏ | 47/400 [00:02<00:16, 21.56it/s]
12%|█▎ | 50/400 [00:02<00:16, 21.56it/s]
13%|█▎ | 53/400 [00:02<00:16, 21.57it/s]
14%|█▍ | 56/400 [00:02<00:15, 21.57it/s]
15%|█▍ | 59/400 [00:02<00:15, 21.57it/s]
16%|█▌ | 62/400 [00:02<00:15, 21.55it/s]
16%|█▋ | 65/400 [00:03<00:15, 21.52it/s]
17%|█▋ | 68/400 [00:03<00:15, 21.49it/s]
18%|█▊ | 71/400 [00:03<00:15, 21.49it/s]
18%|█▊ | 74/400 [00:03<00:15, 21.50it/s]
19%|█▉ | 77/400 [00:03<00:15, 21.51it/s]
20%|██ | 80/400 [00:03<00:14, 21.51it/s]
21%|██ | 83/400 [00:03<00:14, 21.50it/s]
22%|██▏ | 86/400 [00:04<00:14, 21.49it/s]
22%|██▏ | 89/400 [00:04<00:14, 21.48it/s]
23%|██▎ | 92/400 [00:04<00:14, 21.47it/s]
24%|██▍ | 95/400 [00:04<00:14, 21.48it/s]
24%|██▍ | 98/400 [00:04<00:14, 21.49it/s]
25%|██▌ | 101/400 [00:04<00:13, 21.49it/s]
26%|██▌ | 104/400 [00:04<00:13, 21.50it/s]
27%|██▋ | 107/400 [00:05<00:13, 21.49it/s]
28%|██▊ | 110/400 [00:05<00:13, 21.48it/s]
28%|██▊ | 113/400 [00:05<00:13, 21.48it/s]
29%|██▉ | 116/400 [00:05<00:13, 21.47it/s]
30%|██▉ | 119/400 [00:05<00:13, 21.46it/s]
30%|███ | 122/400 [00:05<00:12, 21.45it/s]
31%|███▏ | 125/400 [00:05<00:12, 21.46it/s]
32%|███▏ | 128/400 [00:05<00:12, 21.49it/s]
33%|███▎ | 131/400 [00:06<00:12, 21.48it/s]
34%|███▎ | 134/400 [00:06<00:12, 21.50it/s]
34%|███▍ | 137/400 [00:06<00:12, 21.52it/s]
35%|███▌ | 140/400 [00:06<00:12, 21.52it/s]
36%|███▌ | 143/400 [00:06<00:11, 21.53it/s]
36%|███▋ | 146/400 [00:06<00:11, 21.54it/s]
37%|███▋ | 149/400 [00:06<00:11, 21.53it/s]
38%|███▊ | 152/400 [00:07<00:11, 21.52it/s]
39%|███▉ | 155/400 [00:07<00:11, 21.50it/s]
40%|███▉ | 158/400 [00:07<00:11, 21.50it/s]
40%|████ | 161/400 [00:07<00:11, 21.50it/s]
41%|████ | 164/400 [00:07<00:10, 21.50it/s]
42%|████▏ | 167/400 [00:07<00:10, 21.51it/s]
42%|████▎ | 170/400 [00:07<00:10, 21.51it/s]
43%|████▎ | 173/400 [00:08<00:10, 21.51it/s]
44%|████▍ | 176/400 [00:08<00:10, 21.50it/s]
45%|████▍ | 179/400 [00:08<00:10, 21.48it/s]
46%|████▌ | 182/400 [00:08<00:10, 21.48it/s]
46%|████▋ | 185/400 [00:08<00:10, 21.47it/s]
47%|████▋ | 188/400 [00:08<00:09, 21.46it/s]
48%|████▊ | 191/400 [00:08<00:09, 21.47it/s]
48%|████▊ | 194/400 [00:09<00:09, 21.47it/s]
49%|████▉ | 197/400 [00:09<00:09, 21.46it/s]
50%|█████ | 200/400 [00:09<00:09, 21.44it/s]
51%|█████ | 203/400 [00:09<00:09, 21.44it/s]
52%|█████▏ | 206/400 [00:09<00:09, 21.45it/s]
52%|█████▏ | 209/400 [00:09<00:08, 21.45it/s]
53%|█████▎ | 212/400 [00:09<00:08, 21.45it/s]
54%|█████▍ | 215/400 [00:10<00:08, 21.46it/s]
55%|█████▍ | 218/400 [00:10<00:08, 21.43it/s]
55%|█████▌ | 221/400 [00:10<00:08, 21.43it/s]
56%|█████▌ | 224/400 [00:10<00:08, 21.42it/s]
57%|█████▋ | 227/400 [00:10<00:08, 21.40it/s]
57%|█████▊ | 230/400 [00:10<00:07, 21.38it/s]
58%|█████▊ | 233/400 [00:10<00:07, 21.37it/s]
59%|█████▉ | 236/400 [00:11<00:07, 21.36it/s]
60%|█████▉ | 239/400 [00:11<00:07, 21.32it/s]
60%|██████ | 242/400 [00:11<00:07, 21.31it/s]
61%|██████▏ | 245/400 [00:11<00:07, 21.31it/s]
62%|██████▏ | 248/400 [00:11<00:07, 21.31it/s]
63%|██████▎ | 251/400 [00:11<00:06, 21.31it/s]
64%|██████▎ | 254/400 [00:11<00:06, 21.30it/s]
64%|██████▍ | 257/400 [00:11<00:06, 21.31it/s]
65%|██████▌ | 260/400 [00:12<00:06, 21.29it/s]
66%|██████▌ | 263/400 [00:12<00:06, 21.29it/s]
66%|██████▋ | 266/400 [00:12<00:06, 21.29it/s]
67%|██████▋ | 269/400 [00:12<00:06, 21.29it/s]
68%|██████▊ | 272/400 [00:12<00:06, 21.29it/s]
69%|██████▉ | 275/400 [00:12<00:05, 21.29it/s]
70%|██████▉ | 278/400 [00:12<00:05, 21.30it/s]
70%|███████ | 281/400 [00:13<00:05, 21.29it/s]
71%|███████ | 284/400 [00:13<00:05, 21.29it/s]
72%|███████▏ | 287/400 [00:13<00:05, 21.29it/s]
72%|███████▎ | 290/400 [00:13<00:05, 21.28it/s]
73%|███████▎ | 293/400 [00:13<00:05, 21.28it/s]
74%|███████▍ | 296/400 [00:13<00:04, 21.29it/s]
75%|███████▍ | 299/400 [00:13<00:04, 21.28it/s]
76%|███████▌ | 302/400 [00:14<00:04, 21.28it/s]
76%|███████▋ | 305/400 [00:14<00:04, 21.26it/s]
77%|███████▋ | 308/400 [00:14<00:04, 21.27it/s]
78%|███████▊ | 311/400 [00:14<00:04, 21.25it/s]
78%|███████▊ | 314/400 [00:14<00:04, 21.27it/s]
79%|███████▉ | 317/400 [00:14<00:03, 21.30it/s]
80%|████████ | 320/400 [00:14<00:03, 21.30it/s]
81%|████████ | 323/400 [00:15<00:03, 21.30it/s]
82%|████████▏ | 326/400 [00:15<00:03, 21.29it/s]
82%|████████▏ | 329/400 [00:15<00:03, 21.30it/s]
83%|████████▎ | 332/400 [00:15<00:03, 21.30it/s]
84%|████████▍ | 335/400 [00:15<00:03, 21.31it/s]
84%|████████▍ | 338/400 [00:15<00:02, 21.30it/s]
85%|████████▌ | 341/400 [00:15<00:02, 21.30it/s]
86%|████████▌ | 344/400 [00:16<00:02, 21.31it/s]
87%|████████▋ | 347/400 [00:16<00:02, 21.29it/s]
88%|████████▊ | 350/400 [00:16<00:02, 21.30it/s]
88%|████████▊ | 353/400 [00:16<00:02, 21.31it/s]
89%|████████▉ | 356/400 [00:16<00:02, 21.31it/s]
90%|████████▉ | 359/400 [00:16<00:01, 21.31it/s]
90%|█████████ | 362/400 [00:16<00:01, 21.31it/s]
91%|█████████▏| 365/400 [00:17<00:01, 21.31it/s]
92%|█████████▏| 368/400 [00:17<00:01, 21.27it/s]
93%|█████████▎| 371/400 [00:17<00:01, 21.25it/s]
94%|█████████▎| 374/400 [00:17<00:01, 21.24it/s]
94%|█████████▍| 377/400 [00:17<00:01, 21.22it/s]
95%|█████████▌| 380/400 [00:17<00:00, 21.23it/s]
96%|█████████▌| 383/400 [00:17<00:00, 21.22it/s]
96%|█████████▋| 386/400 [00:18<00:00, 21.21it/s]
97%|█████████▋| 389/400 [00:18<00:00, 21.21it/s]
98%|█████████▊| 392/400 [00:18<00:00, 21.21it/s]
99%|█████████▉| 395/400 [00:18<00:00, 21.21it/s]
100%|█████████▉| 398/400 [00:18<00:00, 21.21it/s]
100%|██████████| 400/400 [00:18<00:00, 21.37it/s]
0%| | 0/400 [00:00<?, ?it/s]
1%| | 3/400 [00:00<00:18, 21.22it/s]
2%|▏ | 6/400 [00:00<00:18, 21.19it/s]
2%|▏ | 9/400 [00:00<00:18, 21.18it/s]
3%|▎ | 12/400 [00:00<00:18, 21.16it/s]
4%|▍ | 15/400 [00:00<00:18, 21.17it/s]
4%|▍ | 18/400 [00:00<00:18, 21.17it/s]
5%|▌ | 21/400 [00:00<00:17, 21.17it/s]
6%|▌ | 24/400 [00:01<00:17, 21.17it/s]
7%|▋ | 27/400 [00:01<00:17, 21.17it/s]
8%|▊ | 30/400 [00:01<00:17, 21.17it/s]
8%|▊ | 33/400 [00:01<00:17, 21.15it/s]
9%|▉ | 36/400 [00:01<00:17, 21.17it/s]
10%|▉ | 39/400 [00:01<00:17, 21.17it/s]
10%|█ | 42/400 [00:01<00:16, 21.17it/s]
11%|█▏ | 45/400 [00:02<00:16, 21.18it/s]
12%|█▏ | 48/400 [00:02<00:16, 21.17it/s]
13%|█▎ | 51/400 [00:02<00:16, 21.18it/s]
14%|█▎ | 54/400 [00:02<00:16, 21.17it/s]
14%|█▍ | 57/400 [00:02<00:16, 21.17it/s]
15%|█▌ | 60/400 [00:02<00:16, 21.17it/s]
16%|█▌ | 63/400 [00:02<00:15, 21.18it/s]
16%|█▋ | 66/400 [00:03<00:15, 21.18it/s]
17%|█▋ | 69/400 [00:03<00:15, 21.17it/s]
18%|█▊ | 72/400 [00:03<00:15, 21.20it/s]
19%|█▉ | 75/400 [00:03<00:15, 21.20it/s]
20%|█▉ | 78/400 [00:03<00:15, 21.22it/s]
20%|██ | 81/400 [00:03<00:15, 21.23it/s]
21%|██ | 84/400 [00:03<00:14, 21.24it/s]
22%|██▏ | 87/400 [00:04<00:14, 21.24it/s]
22%|██▎ | 90/400 [00:04<00:14, 21.24it/s]
23%|██▎ | 93/400 [00:04<00:14, 21.24it/s]
24%|██▍ | 96/400 [00:04<00:14, 21.22it/s]
25%|██▍ | 99/400 [00:04<00:14, 21.21it/s]
26%|██▌ | 102/400 [00:04<00:14, 21.22it/s]
26%|██▋ | 105/400 [00:04<00:13, 21.19it/s]
27%|██▋ | 108/400 [00:05<00:13, 21.20it/s]
28%|██▊ | 111/400 [00:05<00:13, 21.19it/s]
28%|██▊ | 114/400 [00:05<00:13, 21.19it/s]
29%|██▉ | 117/400 [00:05<00:13, 21.17it/s]
30%|███ | 120/400 [00:05<00:13, 21.18it/s]
31%|███ | 123/400 [00:05<00:13, 21.14it/s]
32%|███▏ | 126/400 [00:05<00:12, 21.12it/s]
32%|███▏ | 129/400 [00:06<00:12, 21.10it/s]
33%|███▎ | 132/400 [00:06<00:12, 21.09it/s]
34%|███▍ | 135/400 [00:06<00:12, 21.08it/s]
34%|███▍ | 138/400 [00:06<00:12, 21.05it/s]
35%|███▌ | 141/400 [00:06<00:12, 21.05it/s]
36%|███▌ | 144/400 [00:06<00:12, 21.05it/s]
37%|███▋ | 147/400 [00:06<00:12, 21.04it/s]
38%|███▊ | 150/400 [00:07<00:11, 21.04it/s]
38%|███▊ | 153/400 [00:07<00:11, 21.04it/s]
39%|███▉ | 156/400 [00:07<00:11, 21.03it/s]
40%|███▉ | 159/400 [00:07<00:11, 21.01it/s]
40%|████ | 162/400 [00:07<00:11, 21.02it/s]
41%|████▏ | 165/400 [00:07<00:11, 21.03it/s]
42%|████▏ | 168/400 [00:07<00:11, 21.00it/s]
43%|████▎ | 171/400 [00:08<00:10, 20.98it/s]
44%|████▎ | 174/400 [00:08<00:10, 20.97it/s]
44%|████▍ | 177/400 [00:08<00:10, 20.97it/s]
45%|████▌ | 180/400 [00:08<00:10, 20.95it/s]
46%|████▌ | 183/400 [00:08<00:10, 20.95it/s]
46%|████▋ | 186/400 [00:08<00:10, 20.95it/s]
47%|████▋ | 189/400 [00:08<00:10, 20.97it/s]
48%|████▊ | 192/400 [00:09<00:09, 20.99it/s]
49%|████▉ | 195/400 [00:09<00:09, 21.00it/s]
50%|████▉ | 198/400 [00:09<00:09, 21.00it/s]
50%|█████ | 201/400 [00:09<00:09, 21.01it/s]
51%|█████ | 204/400 [00:09<00:09, 21.01it/s]
52%|█████▏ | 207/400 [00:09<00:09, 21.02it/s]
52%|█████▎ | 210/400 [00:09<00:09, 21.03it/s]
53%|█████▎ | 213/400 [00:10<00:08, 21.04it/s]
54%|█████▍ | 216/400 [00:10<00:08, 21.04it/s]
55%|█████▍ | 219/400 [00:10<00:08, 21.04it/s]
56%|█████▌ | 222/400 [00:10<00:08, 21.02it/s]
56%|█████▋ | 225/400 [00:10<00:08, 21.03it/s]
57%|█████▋ | 228/400 [00:10<00:08, 21.02it/s]
58%|█████▊ | 231/400 [00:10<00:08, 21.02it/s]
58%|█████▊ | 234/400 [00:11<00:07, 21.04it/s]
59%|█████▉ | 237/400 [00:11<00:07, 21.07it/s]
60%|██████ | 240/400 [00:11<00:07, 21.11it/s]
61%|██████ | 243/400 [00:11<00:07, 21.11it/s]
62%|██████▏ | 246/400 [00:11<00:07, 21.13it/s]
62%|██████▏ | 249/400 [00:11<00:07, 21.15it/s]
63%|██████▎ | 252/400 [00:11<00:06, 21.17it/s]
64%|██████▍ | 255/400 [00:12<00:06, 21.18it/s]
64%|██████▍ | 258/400 [00:12<00:06, 21.19it/s]
65%|██████▌ | 261/400 [00:12<00:06, 21.19it/s]
66%|██████▌ | 264/400 [00:12<00:06, 21.17it/s]
67%|██████▋ | 267/400 [00:12<00:06, 21.18it/s]
68%|██████▊ | 270/400 [00:12<00:06, 21.19it/s]
68%|██████▊ | 273/400 [00:12<00:05, 21.18it/s]
69%|██████▉ | 276/400 [00:13<00:05, 21.19it/s]
70%|██████▉ | 279/400 [00:13<00:05, 21.19it/s]
70%|███████ | 282/400 [00:13<00:05, 21.19it/s]
71%|███████▏ | 285/400 [00:13<00:05, 21.15it/s]
72%|███████▏ | 288/400 [00:13<00:05, 21.17it/s]
73%|███████▎ | 291/400 [00:13<00:05, 21.17it/s]
74%|███████▎ | 294/400 [00:13<00:05, 21.19it/s]
74%|███████▍ | 297/400 [00:14<00:04, 21.20it/s]
75%|███████▌ | 300/400 [00:14<00:04, 21.18it/s]
76%|███████▌ | 303/400 [00:14<00:04, 21.15it/s]
76%|███████▋ | 306/400 [00:14<00:04, 21.13it/s]
77%|███████▋ | 309/400 [00:14<00:04, 21.14it/s]
78%|███████▊ | 312/400 [00:14<00:04, 21.14it/s]
79%|███████▉ | 315/400 [00:14<00:04, 21.16it/s]
80%|███████▉ | 318/400 [00:15<00:03, 21.17it/s]
80%|████████ | 321/400 [00:15<00:03, 21.18it/s]
81%|████████ | 324/400 [00:15<00:03, 21.19it/s]
82%|████████▏ | 327/400 [00:15<00:03, 21.16it/s]
82%|████████▎ | 330/400 [00:15<00:03, 21.13it/s]
83%|████████▎ | 333/400 [00:15<00:03, 21.10it/s]
84%|████████▍ | 336/400 [00:15<00:03, 21.15it/s]
85%|████████▍ | 339/400 [00:16<00:02, 21.19it/s]
86%|████████▌ | 342/400 [00:16<00:02, 21.21it/s]
86%|████████▋ | 345/400 [00:16<00:02, 21.21it/s]
87%|████████▋ | 348/400 [00:16<00:02, 21.22it/s]
88%|████████▊ | 351/400 [00:16<00:02, 21.21it/s]
88%|████████▊ | 354/400 [00:16<00:02, 21.22it/s]
89%|████████▉ | 357/400 [00:16<00:02, 21.23it/s]
90%|█████████ | 360/400 [00:17<00:01, 21.25it/s]
91%|█████████ | 363/400 [00:17<00:01, 21.28it/s]
92%|█████████▏| 366/400 [00:17<00:01, 21.30it/s]
92%|█████████▏| 369/400 [00:17<00:01, 21.29it/s]
93%|█████████▎| 372/400 [00:17<00:01, 21.25it/s]
94%|█████████▍| 375/400 [00:17<00:01, 21.24it/s]
94%|█████████▍| 378/400 [00:17<00:01, 21.23it/s]
95%|█████████▌| 381/400 [00:18<00:00, 21.23it/s]
96%|█████████▌| 384/400 [00:18<00:00, 21.23it/s]
97%|█████████▋| 387/400 [00:18<00:00, 21.23it/s]
98%|█████████▊| 390/400 [00:18<00:00, 21.23it/s]
98%|█████████▊| 393/400 [00:18<00:00, 21.22it/s]
99%|█████████▉| 396/400 [00:18<00:00, 21.21it/s]
100%|█████████▉| 399/400 [00:18<00:00, 21.21it/s]
100%|██████████| 400/400 [00:18<00:00, 21.14it/s]
0%| | 0/400 [00:00<?, ?it/s]
1%| | 3/400 [00:00<00:18, 21.24it/s]
2%|▏ | 6/400 [00:00<00:18, 21.23it/s]
2%|▏ | 9/400 [00:00<00:18, 21.20it/s]
3%|▎ | 12/400 [00:00<00:18, 21.21it/s]
4%|▍ | 15/400 [00:00<00:18, 21.18it/s]
4%|▍ | 18/400 [00:00<00:18, 21.20it/s]
5%|▌ | 21/400 [00:00<00:17, 21.19it/s]
6%|▌ | 24/400 [00:01<00:17, 21.20it/s]
7%|▋ | 27/400 [00:01<00:17, 21.20it/s]
8%|▊ | 30/400 [00:01<00:17, 21.20it/s]
8%|▊ | 33/400 [00:01<00:17, 21.20it/s]
9%|▉ | 36/400 [00:01<00:17, 21.20it/s]
10%|▉ | 39/400 [00:01<00:17, 21.20it/s]
10%|█ | 42/400 [00:01<00:16, 21.20it/s]
11%|█▏ | 45/400 [00:02<00:16, 21.19it/s]
12%|█▏ | 48/400 [00:02<00:16, 21.19it/s]
13%|█▎ | 51/400 [00:02<00:16, 21.18it/s]
14%|█▎ | 54/400 [00:02<00:16, 21.19it/s]
14%|█▍ | 57/400 [00:02<00:16, 21.16it/s]
15%|█▌ | 60/400 [00:02<00:16, 21.18it/s]
16%|█▌ | 63/400 [00:02<00:15, 21.19it/s]
16%|█▋ | 66/400 [00:03<00:15, 21.19it/s]
17%|█▋ | 69/400 [00:03<00:15, 21.19it/s]
18%|█▊ | 72/400 [00:03<00:15, 21.18it/s]
19%|█▉ | 75/400 [00:03<00:15, 21.17it/s]
20%|█▉ | 78/400 [00:03<00:15, 21.15it/s]
20%|██ | 81/400 [00:03<00:15, 21.14it/s]
21%|██ | 84/400 [00:03<00:14, 21.15it/s]
22%|██▏ | 87/400 [00:04<00:14, 21.15it/s]
22%|██▎ | 90/400 [00:04<00:14, 21.15it/s]
23%|██▎ | 93/400 [00:04<00:14, 21.15it/s]
24%|██▍ | 96/400 [00:04<00:14, 21.16it/s]
25%|██▍ | 99/400 [00:04<00:14, 21.12it/s]
26%|██▌ | 102/400 [00:04<00:14, 21.13it/s]
26%|██▋ | 105/400 [00:04<00:13, 21.12it/s]
27%|██▋ | 108/400 [00:05<00:13, 21.11it/s]
28%|██▊ | 111/400 [00:05<00:13, 21.12it/s]
28%|██▊ | 114/400 [00:05<00:13, 21.11it/s]
29%|██▉ | 117/400 [00:05<00:13, 21.12it/s]
30%|███ | 120/400 [00:05<00:13, 21.10it/s]
31%|███ | 123/400 [00:05<00:13, 21.11it/s]
32%|███▏ | 126/400 [00:05<00:12, 21.12it/s]
32%|███▏ | 129/400 [00:06<00:12, 21.12it/s]
33%|███▎ | 132/400 [00:06<00:12, 21.12it/s]
34%|███▍ | 135/400 [00:06<00:12, 21.12it/s]
34%|███▍ | 138/400 [00:06<00:12, 21.11it/s]
35%|███▌ | 141/400 [00:06<00:12, 21.07it/s]
36%|███▌ | 144/400 [00:06<00:12, 21.07it/s]
37%|███▋ | 147/400 [00:06<00:12, 21.02it/s]
38%|███▊ | 150/400 [00:07<00:11, 20.98it/s]
38%|███▊ | 153/400 [00:07<00:11, 20.94it/s]
39%|███▉ | 156/400 [00:07<00:11, 20.92it/s]
40%|███▉ | 159/400 [00:07<00:11, 20.90it/s]
40%|████ | 162/400 [00:07<00:11, 20.87it/s]
41%|████▏ | 165/400 [00:07<00:11, 20.86it/s]
42%|████▏ | 168/400 [00:07<00:11, 20.87it/s]
43%|████▎ | 171/400 [00:08<00:10, 20.86it/s]
44%|████▎ | 174/400 [00:08<00:10, 20.87it/s]
44%|████▍ | 177/400 [00:08<00:10, 20.88it/s]
45%|████▌ | 180/400 [00:08<00:10, 20.90it/s]
46%|████▌ | 183/400 [00:08<00:10, 20.89it/s]
46%|████▋ | 186/400 [00:08<00:10, 20.91it/s]
47%|████▋ | 189/400 [00:08<00:10, 20.92it/s]
48%|████▊ | 192/400 [00:09<00:09, 20.93it/s]
49%|████▉ | 195/400 [00:09<00:09, 20.94it/s]
50%|████▉ | 198/400 [00:09<00:09, 20.94it/s]
50%|█████ | 201/400 [00:09<00:09, 20.95it/s]
51%|█████ | 204/400 [00:09<00:09, 20.93it/s]
52%|█████▏ | 207/400 [00:09<00:09, 20.94it/s]
52%|█████▎ | 210/400 [00:09<00:09, 20.93it/s]
53%|█████▎ | 213/400 [00:10<00:08, 20.93it/s]
54%|█████▍ | 216/400 [00:10<00:08, 20.95it/s]
55%|█████▍ | 219/400 [00:10<00:08, 20.94it/s]
56%|█████▌ | 222/400 [00:10<00:08, 20.94it/s]
56%|█████▋ | 225/400 [00:10<00:08, 20.92it/s]
57%|█████▋ | 228/400 [00:10<00:08, 20.91it/s]
58%|█████▊ | 231/400 [00:10<00:08, 20.92it/s]
58%|█████▊ | 234/400 [00:11<00:07, 20.94it/s]
59%|█████▉ | 237/400 [00:11<00:07, 20.94it/s]
60%|██████ | 240/400 [00:11<00:07, 20.92it/s]
61%|██████ | 243/400 [00:11<00:07, 20.93it/s]
62%|██████▏ | 246/400 [00:11<00:07, 20.90it/s]
62%|██████▏ | 249/400 [00:11<00:07, 20.91it/s]
63%|██████▎ | 252/400 [00:11<00:07, 20.92it/s]
64%|██████▍ | 255/400 [00:12<00:06, 20.94it/s]
64%|██████▍ | 258/400 [00:12<00:06, 20.93it/s]
65%|██████▌ | 261/400 [00:12<00:06, 20.92it/s]
66%|██████▌ | 264/400 [00:12<00:06, 20.89it/s]
67%|██████▋ | 267/400 [00:12<00:06, 20.86it/s]
68%|██████▊ | 270/400 [00:12<00:06, 20.86it/s]
68%|██████▊ | 273/400 [00:12<00:06, 20.87it/s]
69%|██████▉ | 276/400 [00:13<00:05, 20.86it/s]
70%|██████▉ | 279/400 [00:13<00:05, 20.87it/s]
70%|███████ | 282/400 [00:13<00:05, 20.86it/s]
71%|███████▏ | 285/400 [00:13<00:05, 20.87it/s]
72%|███████▏ | 288/400 [00:13<00:05, 20.86it/s]
73%|███████▎ | 291/400 [00:13<00:05, 20.87it/s]
74%|███████▎ | 294/400 [00:13<00:05, 20.87it/s]
74%|███████▍ | 297/400 [00:14<00:04, 20.88it/s]
75%|███████▌ | 300/400 [00:14<00:04, 20.87it/s]
76%|███████▌ | 303/400 [00:14<00:04, 20.87it/s]
76%|███████▋ | 306/400 [00:14<00:04, 20.88it/s]
77%|███████▋ | 309/400 [00:14<00:04, 20.87it/s]
78%|███████▊ | 312/400 [00:14<00:04, 20.88it/s]
79%|███████▉ | 315/400 [00:14<00:04, 20.88it/s]
80%|███████▉ | 318/400 [00:15<00:03, 20.88it/s]
80%|████████ | 321/400 [00:15<00:03, 20.88it/s]
81%|████████ | 324/400 [00:15<00:03, 20.87it/s]
82%|████████▏ | 327/400 [00:15<00:03, 20.88it/s]
82%|████████▎ | 330/400 [00:15<00:03, 20.86it/s]
83%|████████▎ | 333/400 [00:15<00:03, 20.86it/s]
84%|████████▍ | 336/400 [00:15<00:03, 20.87it/s]
85%|████████▍ | 339/400 [00:16<00:02, 20.88it/s]
86%|████████▌ | 342/400 [00:16<00:02, 20.86it/s]
86%|████████▋ | 345/400 [00:16<00:02, 20.90it/s]
87%|████████▋ | 348/400 [00:16<00:02, 20.93it/s]
88%|████████▊ | 351/400 [00:16<00:02, 20.92it/s]
88%|████████▊ | 354/400 [00:16<00:02, 20.93it/s]
89%|████████▉ | 357/400 [00:17<00:02, 20.92it/s]
90%|█████████ | 360/400 [00:17<00:01, 20.91it/s]
91%|█████████ | 363/400 [00:17<00:01, 20.91it/s]
92%|█████████▏| 366/400 [00:17<00:01, 20.88it/s]
92%|█████████▏| 369/400 [00:17<00:01, 20.87it/s]
93%|█████████▎| 372/400 [00:17<00:01, 20.86it/s]
94%|█████████▍| 375/400 [00:17<00:01, 20.87it/s]
94%|█████████▍| 378/400 [00:18<00:01, 20.86it/s]
95%|█████████▌| 381/400 [00:18<00:00, 20.86it/s]
96%|█████████▌| 384/400 [00:18<00:00, 20.87it/s]
97%|█████████▋| 387/400 [00:18<00:00, 20.83it/s]
98%|█████████▊| 390/400 [00:18<00:00, 20.83it/s]
98%|█████████▊| 393/400 [00:18<00:00, 20.82it/s]
99%|█████████▉| 396/400 [00:18<00:00, 20.83it/s]
100%|█████████▉| 399/400 [00:19<00:00, 20.84it/s]
100%|██████████| 400/400 [00:19<00:00, 20.98it/s]
0%| | 0/400 [00:00<?, ?it/s]
1%| | 3/400 [00:00<00:19, 20.88it/s]
2%|▏ | 6/400 [00:00<00:18, 20.85it/s]
2%|▏ | 9/400 [00:00<00:18, 20.85it/s]
3%|▎ | 12/400 [00:00<00:18, 20.84it/s]
4%|▍ | 15/400 [00:00<00:18, 20.85it/s]
4%|▍ | 18/400 [00:00<00:18, 20.85it/s]
5%|▌ | 21/400 [00:01<00:18, 20.87it/s]
6%|▌ | 24/400 [00:01<00:18, 20.88it/s]
7%|▋ | 27/400 [00:01<00:17, 20.87it/s]
8%|▊ | 30/400 [00:01<00:17, 20.88it/s]
8%|▊ | 33/400 [00:01<00:17, 20.86it/s]
9%|▉ | 36/400 [00:01<00:17, 20.85it/s]
10%|▉ | 39/400 [00:01<00:17, 20.86it/s]
10%|█ | 42/400 [00:02<00:17, 20.86it/s]
11%|█▏ | 45/400 [00:02<00:17, 20.85it/s]
12%|█▏ | 48/400 [00:02<00:16, 20.80it/s]
13%|█▎ | 51/400 [00:02<00:16, 20.79it/s]
14%|█▎ | 54/400 [00:02<00:16, 20.76it/s]
14%|█▍ | 57/400 [00:02<00:16, 20.73it/s]
15%|█▌ | 60/400 [00:02<00:16, 20.74it/s]
16%|█▌ | 63/400 [00:03<00:16, 20.75it/s]
16%|█▋ | 66/400 [00:03<00:16, 20.74it/s]
17%|█▋ | 69/400 [00:03<00:15, 20.73it/s]
18%|█▊ | 72/400 [00:03<00:15, 20.74it/s]
19%|█▉ | 75/400 [00:03<00:15, 20.72it/s]
20%|█▉ | 78/400 [00:03<00:15, 20.72it/s]
20%|██ | 81/400 [00:03<00:15, 20.72it/s]
21%|██ | 84/400 [00:04<00:15, 20.73it/s]
22%|██▏ | 87/400 [00:04<00:15, 20.73it/s]
22%|██▎ | 90/400 [00:04<00:14, 20.74it/s]
23%|██▎ | 93/400 [00:04<00:14, 20.74it/s]
24%|██▍ | 96/400 [00:04<00:14, 20.73it/s]
25%|██▍ | 99/400 [00:04<00:14, 20.73it/s]
26%|██▌ | 102/400 [00:04<00:14, 20.72it/s]
26%|██▋ | 105/400 [00:05<00:14, 20.72it/s]
27%|██▋ | 108/400 [00:05<00:14, 20.73it/s]
28%|██▊ | 111/400 [00:05<00:13, 20.73it/s]
28%|██▊ | 114/400 [00:05<00:13, 20.73it/s]
29%|██▉ | 117/400 [00:05<00:13, 20.73it/s]
30%|███ | 120/400 [00:05<00:13, 20.74it/s]
31%|███ | 123/400 [00:05<00:13, 20.74it/s]
32%|███▏ | 126/400 [00:06<00:13, 20.74it/s]
32%|███▏ | 129/400 [00:06<00:13, 20.75it/s]
33%|███▎ | 132/400 [00:06<00:12, 20.73it/s]
34%|███▍ | 135/400 [00:06<00:12, 20.73it/s]
34%|███▍ | 138/400 [00:06<00:12, 20.72it/s]
35%|███▌ | 141/400 [00:06<00:12, 20.72it/s]
36%|███▌ | 144/400 [00:06<00:12, 20.73it/s]
37%|███▋ | 147/400 [00:07<00:12, 20.73it/s]
38%|███▊ | 150/400 [00:07<00:12, 20.72it/s]
38%|███▊ | 153/400 [00:07<00:11, 20.72it/s]
39%|███▉ | 156/400 [00:07<00:11, 20.73it/s]
40%|███▉ | 159/400 [00:07<00:11, 20.69it/s]
40%|████ | 162/400 [00:07<00:11, 20.73it/s]
41%|████▏ | 165/400 [00:07<00:11, 20.82it/s]
42%|████▏ | 168/400 [00:08<00:11, 20.87it/s]
43%|████▎ | 171/400 [00:08<00:10, 20.91it/s]
44%|████▎ | 174/400 [00:08<00:10, 20.95it/s]
44%|████▍ | 177/400 [00:08<00:10, 20.96it/s]
45%|████▌ | 180/400 [00:08<00:10, 20.96it/s]
46%|████▌ | 183/400 [00:08<00:10, 20.97it/s]
46%|████▋ | 186/400 [00:08<00:10, 20.98it/s]
47%|████▋ | 189/400 [00:09<00:10, 20.98it/s]
48%|████▊ | 192/400 [00:09<00:09, 20.97it/s]
49%|████▉ | 195/400 [00:09<00:09, 20.95it/s]
50%|████▉ | 198/400 [00:09<00:09, 20.96it/s]
50%|█████ | 201/400 [00:09<00:09, 20.96it/s]
51%|█████ | 204/400 [00:09<00:09, 20.96it/s]
52%|█████▏ | 207/400 [00:09<00:09, 20.96it/s]
52%|█████▎ | 210/400 [00:10<00:09, 20.96it/s]
53%|█████▎ | 213/400 [00:10<00:08, 20.95it/s]
54%|█████▍ | 216/400 [00:10<00:08, 20.95it/s]
55%|█████▍ | 219/400 [00:10<00:08, 20.95it/s]
56%|█████▌ | 222/400 [00:10<00:08, 20.94it/s]
56%|█████▋ | 225/400 [00:10<00:08, 20.94it/s]
57%|█████▋ | 228/400 [00:10<00:08, 20.93it/s]
58%|█████▊ | 231/400 [00:11<00:08, 20.93it/s]
58%|█████▊ | 234/400 [00:11<00:07, 20.92it/s]
59%|█████▉ | 237/400 [00:11<00:07, 20.92it/s]
60%|██████ | 240/400 [00:11<00:07, 20.92it/s]
61%|██████ | 243/400 [00:11<00:07, 20.92it/s]
62%|██████▏ | 246/400 [00:11<00:07, 20.93it/s]
62%|██████▏ | 249/400 [00:11<00:07, 20.90it/s]
63%|██████▎ | 252/400 [00:12<00:07, 20.90it/s]
64%|██████▍ | 255/400 [00:12<00:06, 20.92it/s]
64%|██████▍ | 258/400 [00:12<00:06, 20.93it/s]
65%|██████▌ | 261/400 [00:12<00:06, 20.94it/s]
66%|██████▌ | 264/400 [00:12<00:06, 20.93it/s]
67%|██████▋ | 267/400 [00:12<00:06, 20.92it/s]
68%|██████▊ | 270/400 [00:12<00:06, 20.92it/s]
68%|██████▊ | 273/400 [00:13<00:06, 20.92it/s]
69%|██████▉ | 276/400 [00:13<00:05, 20.91it/s]
70%|██████▉ | 279/400 [00:13<00:05, 20.90it/s]
70%|███████ | 282/400 [00:13<00:05, 20.91it/s]
71%|███████▏ | 285/400 [00:13<00:05, 20.88it/s]
72%|███████▏ | 288/400 [00:13<00:05, 20.89it/s]
73%|███████▎ | 291/400 [00:13<00:05, 20.91it/s]
74%|███████▎ | 294/400 [00:14<00:05, 20.91it/s]
74%|███████▍ | 297/400 [00:14<00:04, 20.91it/s]
75%|███████▌ | 300/400 [00:14<00:04, 20.91it/s]
76%|███████▌ | 303/400 [00:14<00:04, 20.90it/s]
76%|███████▋ | 306/400 [00:14<00:04, 20.88it/s]
77%|███████▋ | 309/400 [00:14<00:04, 20.89it/s]
78%|███████▊ | 312/400 [00:14<00:04, 20.89it/s]
79%|███████▉ | 315/400 [00:15<00:04, 20.90it/s]
80%|███████▉ | 318/400 [00:15<00:03, 20.89it/s]
80%|████████ | 321/400 [00:15<00:03, 20.87it/s]
81%|████████ | 324/400 [00:15<00:03, 20.87it/s]
82%|████████▏ | 327/400 [00:15<00:03, 20.86it/s]
82%|████████▎ | 330/400 [00:15<00:03, 20.86it/s]
83%|████████▎ | 333/400 [00:15<00:03, 20.86it/s]
84%|████████▍ | 336/400 [00:16<00:03, 20.87it/s]
85%|████████▍ | 339/400 [00:16<00:02, 20.87it/s]
86%|████████▌ | 342/400 [00:16<00:02, 20.90it/s]
86%|████████▋ | 345/400 [00:16<00:02, 20.93it/s]
87%|████████▋ | 348/400 [00:16<00:02, 20.91it/s]
88%|████████▊ | 351/400 [00:16<00:02, 20.90it/s]
88%|████████▊ | 354/400 [00:16<00:02, 20.88it/s]
89%|████████▉ | 357/400 [00:17<00:02, 20.88it/s]
90%|█████████ | 360/400 [00:17<00:01, 20.87it/s]
91%|█████████ | 363/400 [00:17<00:01, 20.87it/s]
92%|█████████▏| 366/400 [00:17<00:01, 20.86it/s]
92%|█████████▏| 369/400 [00:17<00:01, 20.84it/s]
93%|█████████▎| 372/400 [00:17<00:01, 20.78it/s]
94%|█████████▍| 375/400 [00:17<00:01, 20.73it/s]
94%|█████████▍| 378/400 [00:18<00:01, 20.70it/s]
95%|█████████▌| 381/400 [00:18<00:00, 20.68it/s]
96%|█████████▌| 384/400 [00:18<00:00, 20.66it/s]
97%|█████████▋| 387/400 [00:18<00:00, 20.66it/s]
98%|█████████▊| 390/400 [00:18<00:00, 20.66it/s]
98%|█████████▊| 393/400 [00:18<00:00, 20.67it/s]
99%|█████████▉| 396/400 [00:19<00:00, 20.68it/s]
100%|█████████▉| 399/400 [00:19<00:00, 20.67it/s]
100%|██████████| 400/400 [00:19<00:00, 20.83it/s]
0%| | 0/400 [00:00<?, ?it/s]
1%| | 3/400 [00:00<00:19, 20.71it/s]
2%|▏ | 6/400 [00:00<00:19, 20.64it/s]
2%|▏ | 9/400 [00:00<00:19, 19.93it/s]
3%|▎ | 12/400 [00:00<00:19, 20.21it/s]
4%|▍ | 15/400 [00:00<00:18, 20.38it/s]
4%|▍ | 18/400 [00:00<00:18, 20.49it/s]
5%|▌ | 21/400 [00:01<00:18, 20.56it/s]
6%|▌ | 24/400 [00:01<00:18, 20.53it/s]
7%|▋ | 27/400 [00:01<00:18, 20.58it/s]
8%|▊ | 30/400 [00:01<00:17, 20.61it/s]
8%|▊ | 33/400 [00:01<00:17, 20.64it/s]
9%|▉ | 36/400 [00:01<00:17, 20.64it/s]
10%|▉ | 39/400 [00:01<00:17, 20.63it/s]
10%|█ | 42/400 [00:02<00:17, 20.63it/s]
11%|█▏ | 45/400 [00:02<00:17, 20.62it/s]
12%|█▏ | 48/400 [00:02<00:17, 20.61it/s]
13%|█▎ | 51/400 [00:02<00:16, 20.61it/s]
14%|█▎ | 54/400 [00:02<00:16, 20.61it/s]
14%|█▍ | 57/400 [00:02<00:16, 20.64it/s]
15%|█▌ | 60/400 [00:02<00:16, 20.67it/s]
16%|█▌ | 63/400 [00:03<00:16, 20.68it/s]
16%|█▋ | 66/400 [00:03<00:16, 20.68it/s]
17%|█▋ | 69/400 [00:03<00:15, 20.70it/s]
18%|█▊ | 72/400 [00:03<00:15, 20.69it/s]
19%|█▉ | 75/400 [00:03<00:15, 20.70it/s]
20%|█▉ | 78/400 [00:03<00:15, 20.70it/s]
20%|██ | 81/400 [00:03<00:15, 20.72it/s]
21%|██ | 84/400 [00:04<00:15, 20.73it/s]
22%|██▏ | 87/400 [00:04<00:15, 20.76it/s]
22%|██▎ | 90/400 [00:04<00:14, 20.77it/s]
23%|██▎ | 93/400 [00:04<00:14, 20.76it/s]
24%|██▍ | 96/400 [00:04<00:14, 20.78it/s]
25%|██▍ | 99/400 [00:04<00:14, 20.79it/s]
26%|██▌ | 102/400 [00:04<00:14, 20.78it/s]
26%|██▋ | 105/400 [00:05<00:14, 20.79it/s]
27%|██▋ | 108/400 [00:05<00:14, 20.79it/s]
28%|██▊ | 111/400 [00:05<00:13, 20.79it/s]
28%|██▊ | 114/400 [00:05<00:13, 20.78it/s]
29%|██▉ | 117/400 [00:05<00:13, 20.79it/s]
30%|███ | 120/400 [00:05<00:13, 20.78it/s]
31%|███ | 123/400 [00:05<00:13, 20.80it/s]
32%|███▏ | 126/400 [00:06<00:13, 20.77it/s]
32%|███▏ | 129/400 [00:06<00:13, 20.74it/s]
33%|███▎ | 132/400 [00:06<00:12, 20.71it/s]
34%|███▍ | 135/400 [00:06<00:12, 20.69it/s]
34%|███▍ | 138/400 [00:06<00:12, 20.69it/s]
35%|███▌ | 141/400 [00:06<00:12, 20.68it/s]
36%|███▌ | 144/400 [00:06<00:12, 20.68it/s]
37%|███▋ | 147/400 [00:07<00:12, 20.68it/s]
38%|███▊ | 150/400 [00:07<00:12, 20.68it/s]
38%|███▊ | 153/400 [00:07<00:11, 20.67it/s]
39%|███▉ | 156/400 [00:07<00:11, 20.63it/s]
40%|███▉ | 159/400 [00:07<00:11, 20.60it/s]
40%|████ | 162/400 [00:07<00:11, 20.59it/s]
41%|████▏ | 165/400 [00:07<00:11, 20.58it/s]
42%|████▏ | 168/400 [00:08<00:11, 20.55it/s]
43%|████▎ | 171/400 [00:08<00:11, 20.55it/s]
44%|████▎ | 174/400 [00:08<00:10, 20.55it/s]
44%|████▍ | 177/400 [00:08<00:10, 20.53it/s]
45%|████▌ | 180/400 [00:08<00:10, 20.66it/s]
46%|████▌ | 183/400 [00:08<00:10, 20.75it/s]
46%|████▋ | 186/400 [00:09<00:10, 20.82it/s]
47%|████▋ | 189/400 [00:09<00:10, 20.85it/s]
48%|████▊ | 192/400 [00:09<00:09, 20.88it/s]
49%|████▉ | 195/400 [00:09<00:09, 20.91it/s]
50%|████▉ | 198/400 [00:09<00:09, 20.90it/s]
50%|█████ | 201/400 [00:09<00:09, 20.92it/s]
51%|█████ | 204/400 [00:09<00:09, 20.92it/s]
52%|█████▏ | 207/400 [00:10<00:09, 20.93it/s]
52%|█████▎ | 210/400 [00:10<00:09, 20.94it/s]
53%|█████▎ | 213/400 [00:10<00:08, 20.94it/s]
54%|█████▍ | 216/400 [00:10<00:08, 20.93it/s]
55%|█████▍ | 219/400 [00:10<00:08, 20.91it/s]
56%|█████▌ | 222/400 [00:10<00:08, 20.91it/s]
56%|█████▋ | 225/400 [00:10<00:08, 20.93it/s]
57%|█████▋ | 228/400 [00:11<00:08, 20.93it/s]
58%|█████▊ | 231/400 [00:11<00:08, 20.93it/s]
58%|█████▊ | 234/400 [00:11<00:07, 20.92it/s]
59%|█████▉ | 237/400 [00:11<00:07, 20.92it/s]
60%|██████ | 240/400 [00:11<00:07, 20.91it/s]
61%|██████ | 243/400 [00:11<00:07, 20.93it/s]
62%|██████▏ | 246/400 [00:11<00:07, 20.93it/s]
62%|██████▏ | 249/400 [00:12<00:07, 20.93it/s]
63%|██████▎ | 252/400 [00:12<00:07, 20.93it/s]
64%|██████▍ | 255/400 [00:12<00:06, 20.93it/s]
64%|██████▍ | 258/400 [00:12<00:06, 20.94it/s]
65%|██████▌ | 261/400 [00:12<00:06, 20.92it/s]
66%|██████▌ | 264/400 [00:12<00:06, 20.93it/s]
67%|██████▋ | 267/400 [00:12<00:06, 20.93it/s]
68%|██████▊ | 270/400 [00:13<00:06, 20.94it/s]
68%|██████▊ | 273/400 [00:13<00:06, 20.92it/s]
69%|██████▉ | 276/400 [00:13<00:05, 20.91it/s]
70%|██████▉ | 279/400 [00:13<00:05, 20.91it/s]
70%|███████ | 282/400 [00:13<00:05, 20.90it/s]
71%|███████▏ | 285/400 [00:13<00:05, 20.90it/s]
72%|███████▏ | 288/400 [00:13<00:05, 20.91it/s]
73%|███████▎ | 291/400 [00:14<00:05, 20.87it/s]
74%|███████▎ | 294/400 [00:14<00:05, 20.88it/s]
74%|███████▍ | 297/400 [00:14<00:04, 20.89it/s]
75%|███████▌ | 300/400 [00:14<00:04, 20.90it/s]
76%|███████▌ | 303/400 [00:14<00:04, 20.88it/s]
76%|███████▋ | 306/400 [00:14<00:04, 20.89it/s]
77%|███████▋ | 309/400 [00:14<00:04, 20.90it/s]
78%|███████▊ | 312/400 [00:15<00:04, 20.89it/s]
79%|███████▉ | 315/400 [00:15<00:04, 20.90it/s]
80%|███████▉ | 318/400 [00:15<00:03, 20.90it/s]
80%|████████ | 321/400 [00:15<00:03, 20.90it/s]
81%|████████ | 324/400 [00:15<00:03, 20.89it/s]
82%|████████▏ | 327/400 [00:15<00:03, 20.90it/s]
82%|████████▎ | 330/400 [00:15<00:03, 20.90it/s]
83%|████████▎ | 333/400 [00:16<00:03, 20.90it/s]
84%|████████▍ | 336/400 [00:16<00:03, 20.89it/s]
85%|████████▍ | 339/400 [00:16<00:02, 20.90it/s]
86%|████████▌ | 342/400 [00:16<00:02, 20.90it/s]
86%|████████▋ | 345/400 [00:16<00:02, 20.90it/s]
87%|████████▋ | 348/400 [00:16<00:02, 20.89it/s]
88%|████████▊ | 351/400 [00:16<00:02, 20.90it/s]
88%|████████▊ | 354/400 [00:17<00:02, 20.91it/s]
89%|████████▉ | 357/400 [00:17<00:02, 20.90it/s]
90%|█████████ | 360/400 [00:17<00:01, 20.90it/s]
91%|█████████ | 363/400 [00:17<00:01, 20.90it/s]
92%|█████████▏| 366/400 [00:17<00:01, 20.89it/s]
92%|█████████▏| 369/400 [00:17<00:01, 20.89it/s]
93%|█████████▎| 372/400 [00:17<00:01, 20.89it/s]
94%|█████████▍| 375/400 [00:18<00:01, 20.90it/s]
94%|█████████▍| 378/400 [00:18<00:01, 20.90it/s]
95%|█████████▌| 381/400 [00:18<00:00, 20.90it/s]
96%|█████████▌| 384/400 [00:18<00:00, 20.90it/s]
97%|█████████▋| 387/400 [00:18<00:00, 20.91it/s]
98%|█████████▊| 390/400 [00:18<00:00, 21.05it/s]
98%|█████████▊| 393/400 [00:18<00:00, 21.16it/s]
99%|█████████▉| 396/400 [00:19<00:00, 21.20it/s]
100%|█████████▉| 399/400 [00:19<00:00, 21.22it/s]
100%|██████████| 400/400 [00:19<00:00, 20.81it/s]
0%| | 0/400 [00:00<?, ?it/s]
1%| | 3/400 [00:00<00:18, 21.33it/s]
2%|▏ | 6/400 [00:00<00:18, 21.31it/s]
2%|▏ | 9/400 [00:00<00:18, 21.31it/s]
3%|▎ | 12/400 [00:00<00:18, 21.30it/s]
4%|▍ | 15/400 [00:00<00:18, 21.30it/s]
4%|▍ | 18/400 [00:00<00:17, 21.30it/s]
5%|▌ | 21/400 [00:00<00:17, 21.30it/s]
6%|▌ | 24/400 [00:01<00:17, 21.30it/s]
7%|▋ | 27/400 [00:01<00:17, 21.29it/s]
8%|▊ | 30/400 [00:01<00:17, 21.28it/s]
8%|▊ | 33/400 [00:01<00:17, 21.28it/s]
9%|▉ | 36/400 [00:01<00:17, 21.28it/s]
10%|▉ | 39/400 [00:01<00:16, 21.27it/s]
10%|█ | 42/400 [00:01<00:16, 21.28it/s]
11%|█▏ | 45/400 [00:02<00:16, 21.27it/s]
12%|█▏ | 48/400 [00:02<00:16, 21.26it/s]
13%|█▎ | 51/400 [00:02<00:16, 21.25it/s]
14%|█▎ | 54/400 [00:02<00:16, 21.24it/s]
14%|█▍ | 57/400 [00:02<00:16, 21.25it/s]
15%|█▌ | 60/400 [00:02<00:15, 21.25it/s]
16%|█▌ | 63/400 [00:02<00:15, 21.24it/s]
16%|█▋ | 66/400 [00:03<00:15, 21.24it/s]
17%|█▋ | 69/400 [00:03<00:15, 21.24it/s]
18%|█▊ | 72/400 [00:03<00:15, 21.23it/s]
19%|█▉ | 75/400 [00:03<00:15, 21.24it/s]
20%|█▉ | 78/400 [00:03<00:15, 21.25it/s]
20%|██ | 81/400 [00:03<00:15, 21.24it/s]
21%|██ | 84/400 [00:03<00:14, 21.24it/s]
22%|██▏ | 87/400 [00:04<00:14, 21.24it/s]
22%|██▎ | 90/400 [00:04<00:14, 21.24it/s]
23%|██▎ | 93/400 [00:04<00:14, 21.22it/s]
24%|██▍ | 96/400 [00:04<00:14, 21.23it/s]
25%|██▍ | 99/400 [00:04<00:14, 21.23it/s]
26%|██▌ | 102/400 [00:04<00:14, 21.23it/s]
26%|██▋ | 105/400 [00:04<00:13, 21.23it/s]
27%|██▋ | 108/400 [00:05<00:13, 21.23it/s]
28%|██▊ | 111/400 [00:05<00:13, 21.24it/s]
28%|██▊ | 114/400 [00:05<00:13, 21.23it/s]
29%|██▉ | 117/400 [00:05<00:13, 21.23it/s]
30%|███ | 120/400 [00:05<00:13, 21.23it/s]
31%|███ | 123/400 [00:05<00:13, 21.24it/s]
32%|███▏ | 126/400 [00:05<00:12, 21.24it/s]
32%|███▏ | 129/400 [00:06<00:12, 21.25it/s]
33%|███▎ | 132/400 [00:06<00:12, 21.24it/s]
34%|███▍ | 135/400 [00:06<00:12, 21.22it/s]
34%|███▍ | 138/400 [00:06<00:12, 21.23it/s]
35%|███▌ | 141/400 [00:06<00:12, 21.23it/s]
36%|███▌ | 144/400 [00:06<00:12, 21.22it/s]
37%|███▋ | 147/400 [00:06<00:11, 21.22it/s]
38%|███▊ | 150/400 [00:07<00:11, 21.22it/s]
38%|███▊ | 153/400 [00:07<00:11, 21.23it/s]
39%|███▉ | 156/400 [00:07<00:11, 21.20it/s]
40%|███▉ | 159/400 [00:07<00:11, 21.20it/s]
40%|████ | 162/400 [00:07<00:11, 21.21it/s]
41%|████▏ | 165/400 [00:07<00:11, 21.21it/s]
42%|████▏ | 168/400 [00:07<00:10, 21.23it/s]
43%|████▎ | 171/400 [00:08<00:10, 21.24it/s]
44%|████▎ | 174/400 [00:08<00:10, 21.25it/s]
44%|████▍ | 177/400 [00:08<00:10, 21.21it/s]
45%|████▌ | 180/400 [00:08<00:10, 21.21it/s]
46%|████▌ | 183/400 [00:08<00:10, 21.22it/s]
46%|████▋ | 186/400 [00:08<00:10, 21.23it/s]
47%|████▋ | 189/400 [00:08<00:09, 21.23it/s]
48%|████▊ | 192/400 [00:09<00:09, 21.23it/s]
49%|████▉ | 195/400 [00:09<00:09, 21.21it/s]
50%|████▉ | 198/400 [00:09<00:09, 21.21it/s]
50%|█████ | 201/400 [00:09<00:09, 21.25it/s]
51%|█████ | 204/400 [00:09<00:09, 21.34it/s]
52%|█████▏ | 207/400 [00:09<00:09, 21.40it/s]
52%|█████▎ | 210/400 [00:09<00:08, 21.43it/s]
53%|█████▎ | 213/400 [00:10<00:08, 21.45it/s]
54%|█████▍ | 216/400 [00:10<00:08, 21.47it/s]
55%|█████▍ | 219/400 [00:10<00:08, 21.48it/s]
56%|█████▌ | 222/400 [00:10<00:08, 21.49it/s]
56%|█████▋ | 225/400 [00:10<00:08, 21.49it/s]
57%|█████▋ | 228/400 [00:10<00:08, 21.49it/s]
58%|█████▊ | 231/400 [00:10<00:07, 21.49it/s]
58%|█████▊ | 234/400 [00:10<00:07, 21.49it/s]
59%|█████▉ | 237/400 [00:11<00:07, 21.48it/s]
60%|██████ | 240/400 [00:11<00:07, 21.48it/s]
61%|██████ | 243/400 [00:11<00:07, 21.48it/s]
62%|██████▏ | 246/400 [00:11<00:07, 21.42it/s]
62%|██████▏ | 249/400 [00:11<00:07, 21.40it/s]
63%|██████▎ | 252/400 [00:11<00:06, 21.42it/s]
64%|██████▍ | 255/400 [00:11<00:06, 21.43it/s]
64%|██████▍ | 258/400 [00:12<00:06, 21.44it/s]
65%|██████▌ | 261/400 [00:12<00:06, 21.44it/s]
66%|██████▌ | 264/400 [00:12<00:06, 21.40it/s]
67%|██████▋ | 267/400 [00:12<00:06, 21.37it/s]
68%|██████▊ | 270/400 [00:12<00:06, 21.35it/s]
68%|██████▊ | 273/400 [00:12<00:05, 21.34it/s]
69%|██████▉ | 276/400 [00:12<00:05, 21.32it/s]
70%|██████▉ | 279/400 [00:13<00:05, 21.31it/s]
70%|███████ | 282/400 [00:13<00:05, 21.30it/s]
71%|███████▏ | 285/400 [00:13<00:05, 21.28it/s]
72%|███████▏ | 288/400 [00:13<00:05, 21.28it/s]
73%|███████▎ | 291/400 [00:13<00:05, 21.27it/s]
74%|███████▎ | 294/400 [00:13<00:04, 21.27it/s]
74%|███████▍ | 297/400 [00:13<00:04, 21.28it/s]
75%|███████▌ | 300/400 [00:14<00:04, 21.28it/s]
76%|███████▌ | 303/400 [00:14<00:04, 21.28it/s]
76%|███████▋ | 306/400 [00:14<00:04, 21.27it/s]
77%|███████▋ | 309/400 [00:14<00:04, 21.26it/s]
78%|███████▊ | 312/400 [00:14<00:04, 21.26it/s]
79%|███████▉ | 315/400 [00:14<00:03, 21.26it/s]
80%|███████▉ | 318/400 [00:14<00:03, 21.26it/s]
80%|████████ | 321/400 [00:15<00:03, 21.27it/s]
81%|████████ | 324/400 [00:15<00:03, 21.27it/s]
82%|████████▏ | 327/400 [00:15<00:03, 21.24it/s]
82%|████████▎ | 330/400 [00:15<00:03, 21.24it/s]
83%|████████▎ | 333/400 [00:15<00:03, 21.25it/s]
84%|████████▍ | 336/400 [00:15<00:03, 21.25it/s]
85%|████████▍ | 339/400 [00:15<00:02, 21.25it/s]
86%|████████▌ | 342/400 [00:16<00:02, 21.26it/s]
86%|████████▋ | 345/400 [00:16<00:02, 21.26it/s]
87%|████████▋ | 348/400 [00:16<00:02, 21.25it/s]
88%|████████▊ | 351/400 [00:16<00:02, 21.24it/s]
88%|████████▊ | 354/400 [00:16<00:02, 21.25it/s]
89%|████████▉ | 357/400 [00:16<00:02, 21.25it/s]
90%|█████████ | 360/400 [00:16<00:01, 21.21it/s]
91%|█████████ | 363/400 [00:17<00:01, 21.22it/s]
92%|█████████▏| 366/400 [00:17<00:01, 21.23it/s]
92%|█████████▏| 369/400 [00:17<00:01, 21.24it/s]
93%|█████████▎| 372/400 [00:17<00:01, 21.26it/s]
94%|█████████▍| 375/400 [00:17<00:01, 21.29it/s]
94%|█████████▍| 378/400 [00:17<00:01, 21.30it/s]
95%|█████████▌| 381/400 [00:17<00:00, 21.31it/s]
96%|█████████▌| 384/400 [00:18<00:00, 21.32it/s]
97%|█████████▋| 387/400 [00:18<00:00, 21.31it/s]
98%|█████████▊| 390/400 [00:18<00:00, 21.32it/s]
98%|█████████▊| 393/400 [00:18<00:00, 21.31it/s]
99%|█████████▉| 396/400 [00:18<00:00, 21.31it/s]
100%|█████████▉| 399/400 [00:18<00:00, 21.28it/s]
100%|██████████| 400/400 [00:18<00:00, 21.29it/s]
0%| | 0/400 [00:00<?, ?it/s]
1%| | 3/400 [00:00<00:18, 21.21it/s]
2%|▏ | 6/400 [00:00<00:18, 21.20it/s]
2%|▏ | 9/400 [00:00<00:18, 21.22it/s]
3%|▎ | 12/400 [00:00<00:18, 21.20it/s]
4%|▍ | 15/400 [00:00<00:18, 21.21it/s]
4%|▍ | 18/400 [00:00<00:17, 21.24it/s]
5%|▌ | 21/400 [00:00<00:17, 21.25it/s]
6%|▌ | 24/400 [00:01<00:17, 21.24it/s]
7%|▋ | 27/400 [00:01<00:17, 21.25it/s]
8%|▊ | 30/400 [00:01<00:17, 21.26it/s]
8%|▊ | 33/400 [00:01<00:17, 21.26it/s]
9%|▉ | 36/400 [00:01<00:17, 21.23it/s]
10%|▉ | 39/400 [00:01<00:16, 21.24it/s]
10%|█ | 42/400 [00:01<00:16, 21.24it/s]
11%|█▏ | 45/400 [00:02<00:16, 21.24it/s]
12%|█▏ | 48/400 [00:02<00:16, 21.25it/s]
13%|█▎ | 51/400 [00:02<00:16, 21.25it/s]
14%|█▎ | 54/400 [00:02<00:16, 21.23it/s]
14%|█▍ | 57/400 [00:02<00:16, 21.21it/s]
15%|█▌ | 60/400 [00:02<00:16, 21.21it/s]
16%|█▌ | 63/400 [00:02<00:15, 21.21it/s]
16%|█▋ | 66/400 [00:03<00:15, 21.20it/s]
17%|█▋ | 69/400 [00:03<00:15, 21.21it/s]
18%|█▊ | 72/400 [00:03<00:15, 21.18it/s]
19%|█▉ | 75/400 [00:03<00:15, 21.20it/s]
20%|█▉ | 78/400 [00:03<00:15, 21.19it/s]
20%|██ | 81/400 [00:03<00:15, 21.19it/s]
21%|██ | 84/400 [00:03<00:14, 21.20it/s]
22%|██▏ | 87/400 [00:04<00:14, 21.20it/s]
22%|██▎ | 90/400 [00:04<00:14, 21.21it/s]
23%|██▎ | 93/400 [00:04<00:14, 21.20it/s]
24%|██▍ | 96/400 [00:04<00:14, 21.20it/s]
25%|██▍ | 99/400 [00:04<00:14, 21.19it/s]
26%|██▌ | 102/400 [00:04<00:14, 21.20it/s]
26%|██▋ | 105/400 [00:04<00:13, 21.19it/s]
27%|██▋ | 108/400 [00:05<00:13, 21.19it/s]
28%|██▊ | 111/400 [00:05<00:13, 21.19it/s]
28%|██▊ | 114/400 [00:05<00:13, 21.20it/s]
29%|██▉ | 117/400 [00:05<00:13, 21.19it/s]
30%|███ | 120/400 [00:05<00:13, 21.17it/s]
31%|███ | 123/400 [00:05<00:13, 21.16it/s]
32%|███▏ | 126/400 [00:05<00:12, 21.18it/s]
32%|███▏ | 129/400 [00:06<00:12, 21.18it/s]
33%|███▎ | 132/400 [00:06<00:12, 21.17it/s]
34%|███▍ | 135/400 [00:06<00:12, 21.18it/s]
34%|███▍ | 138/400 [00:06<00:12, 21.17it/s]
35%|███▌ | 141/400 [00:06<00:12, 21.16it/s]
36%|███▌ | 144/400 [00:06<00:12, 21.16it/s]
37%|███▋ | 147/400 [00:06<00:11, 21.16it/s]
38%|███▊ | 150/400 [00:07<00:11, 21.16it/s]
38%|███▊ | 153/400 [00:07<00:11, 21.16it/s]
39%|███▉ | 156/400 [00:07<00:11, 21.15it/s]
40%|███▉ | 159/400 [00:07<00:11, 21.15it/s]
40%|████ | 162/400 [00:07<00:11, 21.14it/s]
41%|████▏ | 165/400 [00:07<00:11, 21.15it/s]
42%|████▏ | 168/400 [00:07<00:10, 21.13it/s]
43%|████▎ | 171/400 [00:08<00:10, 21.14it/s]
44%|████▎ | 174/400 [00:08<00:10, 21.14it/s]
44%|████▍ | 177/400 [00:08<00:10, 21.13it/s]
45%|████▌ | 180/400 [00:08<00:10, 21.13it/s]
46%|████▌ | 183/400 [00:08<00:10, 21.12it/s]
46%|████▋ | 186/400 [00:08<00:10, 21.13it/s]
47%|████▋ | 189/400 [00:08<00:09, 21.12it/s]
48%|████▊ | 192/400 [00:09<00:09, 21.11it/s]
49%|████▉ | 195/400 [00:09<00:09, 21.11it/s]
50%|████▉ | 198/400 [00:09<00:09, 21.12it/s]
50%|█████ | 201/400 [00:09<00:09, 21.13it/s]
51%|█████ | 204/400 [00:09<00:09, 21.10it/s]
52%|█████▏ | 207/400 [00:09<00:09, 21.11it/s]
52%|█████▎ | 210/400 [00:09<00:08, 21.12it/s]
53%|█████▎ | 213/400 [00:10<00:08, 21.11it/s]
54%|█████▍ | 216/400 [00:10<00:08, 21.07it/s]
55%|█████▍ | 219/400 [00:10<00:08, 21.08it/s]
56%|█████▌ | 222/400 [00:10<00:08, 21.09it/s]
56%|█████▋ | 225/400 [00:10<00:08, 21.12it/s]
57%|█████▋ | 228/400 [00:10<00:08, 21.16it/s]
58%|█████▊ | 231/400 [00:10<00:07, 21.20it/s]
58%|█████▊ | 234/400 [00:11<00:07, 21.22it/s]
59%|█████▉ | 237/400 [00:11<00:07, 21.24it/s]
60%|██████ | 240/400 [00:11<00:07, 21.25it/s]
61%|██████ | 243/400 [00:11<00:07, 21.25it/s]
62%|██████▏ | 246/400 [00:11<00:07, 21.25it/s]
62%|██████▏ | 249/400 [00:11<00:07, 21.25it/s]
63%|██████▎ | 252/400 [00:11<00:06, 21.24it/s]
64%|██████▍ | 255/400 [00:12<00:06, 21.24it/s]
64%|██████▍ | 258/400 [00:12<00:06, 21.24it/s]
65%|██████▌ | 261/400 [00:12<00:06, 21.24it/s]
66%|██████▌ | 264/400 [00:12<00:06, 21.24it/s]
67%|██████▋ | 267/400 [00:12<00:06, 21.24it/s]
68%|██████▊ | 270/400 [00:12<00:06, 21.23it/s]
68%|██████▊ | 273/400 [00:12<00:05, 21.24it/s]
69%|██████▉ | 276/400 [00:13<00:05, 21.27it/s]
70%|██████▉ | 279/400 [00:13<00:05, 21.30it/s]
70%|███████ | 282/400 [00:13<00:05, 21.32it/s]
71%|███████▏ | 285/400 [00:13<00:05, 21.34it/s]
72%|███████▏ | 288/400 [00:13<00:05, 21.34it/s]
73%|███████▎ | 291/400 [00:13<00:05, 21.33it/s]
74%|███████▎ | 294/400 [00:13<00:04, 21.33it/s]
74%|███████▍ | 297/400 [00:14<00:04, 21.34it/s]
75%|███████▌ | 300/400 [00:14<00:04, 21.34it/s]
76%|███████▌ | 303/400 [00:14<00:04, 21.35it/s]
76%|███████▋ | 306/400 [00:14<00:04, 21.35it/s]
77%|███████▋ | 309/400 [00:14<00:04, 21.34it/s]
78%|███████▊ | 312/400 [00:14<00:04, 21.32it/s]
79%|███████▉ | 315/400 [00:14<00:03, 21.32it/s]
80%|███████▉ | 318/400 [00:14<00:03, 21.32it/s]
80%|████████ | 321/400 [00:15<00:03, 21.33it/s]
81%|████████ | 324/400 [00:15<00:03, 21.32it/s]
82%|████████▏ | 327/400 [00:15<00:03, 21.32it/s]
82%|████████▎ | 330/400 [00:15<00:03, 21.33it/s]
83%|████████▎ | 333/400 [00:15<00:03, 21.31it/s]
84%|████████▍ | 336/400 [00:15<00:03, 21.31it/s]
85%|████████▍ | 339/400 [00:15<00:02, 21.31it/s]
86%|████████▌ | 342/400 [00:16<00:02, 21.30it/s]
86%|████████▋ | 345/400 [00:16<00:02, 21.31it/s]
87%|████████▋ | 348/400 [00:16<00:02, 21.30it/s]
88%|████████▊ | 351/400 [00:16<00:02, 21.30it/s]
88%|████████▊ | 354/400 [00:16<00:02, 21.30it/s]
89%|████████▉ | 357/400 [00:16<00:02, 21.30it/s]
90%|█████████ | 360/400 [00:16<00:01, 21.30it/s]
91%|█████████ | 363/400 [00:17<00:01, 21.30it/s]
92%|█████████▏| 366/400 [00:17<00:01, 21.30it/s]
92%|█████████▏| 369/400 [00:17<00:01, 21.30it/s]
93%|█████████▎| 372/400 [00:17<00:01, 21.29it/s]
94%|█████████▍| 375/400 [00:17<00:01, 21.26it/s]
94%|█████████▍| 378/400 [00:17<00:01, 21.24it/s]
95%|█████████▌| 381/400 [00:17<00:00, 21.23it/s]
96%|█████████▌| 384/400 [00:18<00:00, 21.22it/s]
97%|█████████▋| 387/400 [00:18<00:00, 21.21it/s]
98%|█████████▊| 390/400 [00:18<00:00, 21.21it/s]
98%|█████████▊| 393/400 [00:18<00:00, 21.21it/s]
99%|█████████▉| 396/400 [00:18<00:00, 21.18it/s]
100%|█████████▉| 399/400 [00:18<00:00, 21.19it/s]
100%|██████████| 400/400 [00:18<00:00, 21.22it/s]
0%| | 0/400 [00:00<?, ?it/s]
1%| | 3/400 [00:00<00:18, 21.21it/s]
2%|▏ | 6/400 [00:00<00:18, 21.21it/s]
2%|▏ | 9/400 [00:00<00:18, 21.21it/s]
3%|▎ | 12/400 [00:00<00:18, 21.19it/s]
4%|▍ | 15/400 [00:00<00:18, 21.18it/s]
4%|▍ | 18/400 [00:00<00:18, 21.16it/s]
5%|▌ | 21/400 [00:00<00:17, 21.16it/s]
6%|▌ | 24/400 [00:01<00:17, 21.14it/s]
7%|▋ | 27/400 [00:01<00:17, 21.15it/s]
8%|▊ | 30/400 [00:01<00:17, 21.16it/s]
8%|▊ | 33/400 [00:01<00:17, 21.13it/s]
9%|▉ | 36/400 [00:01<00:17, 21.14it/s]
10%|▉ | 39/400 [00:01<00:17, 21.06it/s]
10%|█ | 42/400 [00:01<00:17, 21.00it/s]
11%|█▏ | 45/400 [00:02<00:16, 20.96it/s]
12%|█▏ | 48/400 [00:02<00:16, 20.92it/s]
13%|█▎ | 51/400 [00:02<00:16, 20.91it/s]
14%|█▎ | 54/400 [00:02<00:16, 20.90it/s]
14%|█▍ | 57/400 [00:02<00:16, 20.89it/s]
15%|█▌ | 60/400 [00:02<00:16, 20.87it/s]
16%|█▌ | 63/400 [00:02<00:16, 20.88it/s]
16%|█▋ | 66/400 [00:03<00:16, 20.86it/s]
17%|█▋ | 69/400 [00:03<00:15, 20.87it/s]
18%|█▊ | 72/400 [00:03<00:15, 20.87it/s]
19%|█▉ | 75/400 [00:03<00:15, 20.87it/s]
20%|█▉ | 78/400 [00:03<00:15, 20.88it/s]
20%|██ | 81/400 [00:03<00:15, 20.87it/s]
21%|██ | 84/400 [00:04<00:15, 20.85it/s]
22%|██▏ | 87/400 [00:04<00:15, 20.86it/s]
22%|██▎ | 90/400 [00:04<00:14, 20.89it/s]
23%|██▎ | 93/400 [00:04<00:14, 20.92it/s]
24%|██▍ | 96/400 [00:04<00:14, 20.94it/s]
25%|██▍ | 99/400 [00:04<00:14, 20.95it/s]
26%|██▌ | 102/400 [00:04<00:14, 20.92it/s]
26%|██▋ | 105/400 [00:05<00:14, 20.93it/s]
27%|██▋ | 108/400 [00:05<00:13, 20.93it/s]
28%|██▊ | 111/400 [00:05<00:13, 20.91it/s]
28%|██▊ | 114/400 [00:05<00:13, 20.91it/s]
29%|██▉ | 117/400 [00:05<00:13, 20.90it/s]
30%|███ | 120/400 [00:05<00:13, 20.85it/s]
31%|███ | 123/400 [00:05<00:13, 20.82it/s]
32%|███▏ | 126/400 [00:06<00:13, 20.82it/s]
32%|███▏ | 129/400 [00:06<00:13, 20.82it/s]
33%|███▎ | 132/400 [00:06<00:12, 20.81it/s]
34%|███▍ | 135/400 [00:06<00:12, 20.81it/s]
34%|███▍ | 138/400 [00:06<00:12, 20.80it/s]
35%|███▌ | 141/400 [00:06<00:12, 20.79it/s]
36%|███▌ | 144/400 [00:06<00:12, 20.79it/s]
37%|███▋ | 147/400 [00:07<00:12, 20.79it/s]
38%|███▊ | 150/400 [00:07<00:12, 20.79it/s]
38%|███▊ | 153/400 [00:07<00:11, 20.78it/s]
39%|███▉ | 156/400 [00:07<00:11, 20.77it/s]
40%|███▉ | 159/400 [00:07<00:11, 20.77it/s]
40%|████ | 162/400 [00:07<00:11, 20.77it/s]
41%|████▏ | 165/400 [00:07<00:11, 20.76it/s]
42%|████▏ | 168/400 [00:08<00:11, 20.76it/s]
43%|████▎ | 171/400 [00:08<00:11, 20.75it/s]
44%|████▎ | 174/400 [00:08<00:10, 20.74it/s]
44%|████▍ | 177/400 [00:08<00:10, 20.75it/s]
45%|████▌ | 180/400 [00:08<00:10, 20.78it/s]
46%|████▌ | 183/400 [00:08<00:10, 20.82it/s]
46%|████▋ | 186/400 [00:08<00:10, 20.81it/s]
47%|████▋ | 189/400 [00:09<00:10, 20.81it/s]
48%|████▊ | 192/400 [00:09<00:09, 20.81it/s]
49%|████▉ | 195/400 [00:09<00:09, 20.79it/s]
50%|████▉ | 198/400 [00:09<00:09, 20.79it/s]
50%|█████ | 201/400 [00:09<00:09, 20.80it/s]
51%|█████ | 204/400 [00:09<00:09, 20.79it/s]
52%|█████▏ | 207/400 [00:09<00:09, 20.78it/s]
52%|█████▎ | 210/400 [00:10<00:09, 20.78it/s]
53%|█████▎ | 213/400 [00:10<00:09, 20.77it/s]
54%|█████▍ | 216/400 [00:10<00:08, 20.78it/s]
55%|█████▍ | 219/400 [00:10<00:08, 20.81it/s]
56%|█████▌ | 222/400 [00:10<00:08, 20.82it/s]
56%|█████▋ | 225/400 [00:10<00:08, 20.85it/s]
57%|█████▋ | 228/400 [00:10<00:08, 20.81it/s]
58%|█████▊ | 231/400 [00:11<00:08, 20.84it/s]
58%|█████▊ | 234/400 [00:11<00:08, 20.68it/s]
59%|█████▉ | 237/400 [00:11<00:07, 20.75it/s]
60%|██████ | 240/400 [00:11<00:07, 20.81it/s]
61%|██████ | 243/400 [00:11<00:07, 20.84it/s]
62%|██████▏ | 246/400 [00:11<00:07, 20.79it/s]
62%|██████▏ | 249/400 [00:11<00:07, 20.91it/s]
63%|██████▎ | 252/400 [00:12<00:07, 21.01it/s]
64%|██████▍ | 255/400 [00:12<00:06, 21.08it/s]
64%|██████▍ | 258/400 [00:12<00:06, 21.12it/s]
65%|██████▌ | 261/400 [00:12<00:06, 21.16it/s]
66%|██████▌ | 264/400 [00:12<00:06, 21.17it/s]
67%|██████▋ | 267/400 [00:12<00:06, 21.18it/s]
68%|██████▊ | 270/400 [00:12<00:06, 21.19it/s]
68%|██████▊ | 273/400 [00:13<00:05, 21.21it/s]
69%|██████▉ | 276/400 [00:13<00:05, 21.21it/s]
70%|██████▉ | 279/400 [00:13<00:05, 21.21it/s]
70%|███████ | 282/400 [00:13<00:05, 21.21it/s]
71%|███████▏ | 285/400 [00:13<00:05, 21.21it/s]
72%|███████▏ | 288/400 [00:13<00:05, 21.21it/s]
73%|███████▎ | 291/400 [00:13<00:05, 21.20it/s]
74%|███████▎ | 294/400 [00:14<00:04, 21.21it/s]
74%|███████▍ | 297/400 [00:14<00:04, 21.22it/s]
75%|███████▌ | 300/400 [00:14<00:04, 21.20it/s]
76%|███████▌ | 303/400 [00:14<00:04, 21.20it/s]
76%|███████▋ | 306/400 [00:14<00:04, 21.21it/s]
77%|███████▋ | 309/400 [00:14<00:04, 21.20it/s]
78%|███████▊ | 312/400 [00:14<00:04, 21.20it/s]
79%|███████▉ | 315/400 [00:15<00:04, 21.21it/s]
80%|███████▉ | 318/400 [00:15<00:03, 21.20it/s]
80%|████████ | 321/400 [00:15<00:03, 21.20it/s]
81%|████████ | 324/400 [00:15<00:03, 21.20it/s]
82%|████████▏ | 327/400 [00:15<00:03, 21.22it/s]
82%|████████▎ | 330/400 [00:15<00:03, 21.22it/s]
83%|████████▎ | 333/400 [00:15<00:03, 21.20it/s]
84%|████████▍ | 336/400 [00:16<00:03, 21.20it/s]
85%|████████▍ | 339/400 [00:16<00:02, 21.19it/s]
86%|████████▌ | 342/400 [00:16<00:02, 21.19it/s]
86%|████████▋ | 345/400 [00:16<00:02, 21.20it/s]
87%|████████▋ | 348/400 [00:16<00:02, 21.19it/s]
88%|████████▊ | 351/400 [00:16<00:02, 21.19it/s]
88%|████████▊ | 354/400 [00:16<00:02, 21.17it/s]
89%|████████▉ | 357/400 [00:17<00:02, 21.18it/s]
90%|█████████ | 360/400 [00:17<00:01, 21.17it/s]
91%|█████████ | 363/400 [00:17<00:01, 21.18it/s]
92%|█████████▏| 366/400 [00:17<00:01, 21.19it/s]
92%|█████████▏| 369/400 [00:17<00:01, 21.20it/s]
93%|█████████▎| 372/400 [00:17<00:01, 21.17it/s]
94%|█████████▍| 375/400 [00:17<00:01, 21.15it/s]
94%|█████████▍| 378/400 [00:18<00:01, 21.15it/s]
95%|█████████▌| 381/400 [00:18<00:00, 21.14it/s]
96%|█████████▌| 384/400 [00:18<00:00, 21.14it/s]
97%|█████████▋| 387/400 [00:18<00:00, 21.17it/s]
98%|█████████▊| 390/400 [00:18<00:00, 21.19it/s]
98%|█████████▊| 393/400 [00:18<00:00, 21.21it/s]
99%|█████████▉| 396/400 [00:18<00:00, 21.21it/s]
100%|█████████▉| 399/400 [00:19<00:00, 21.21it/s]
100%|██████████| 400/400 [00:19<00:00, 21.00it/s]
0%| | 0/400 [00:00<?, ?it/s]
1%| | 3/400 [00:00<00:18, 21.25it/s]
2%|▏ | 6/400 [00:00<00:18, 21.24it/s]
2%|▏ | 9/400 [00:00<00:18, 21.23it/s]
3%|▎ | 12/400 [00:00<00:18, 21.23it/s]
4%|▍ | 15/400 [00:00<00:18, 21.24it/s]
4%|▍ | 18/400 [00:00<00:17, 21.24it/s]
5%|▌ | 21/400 [00:00<00:17, 21.23it/s]
6%|▌ | 24/400 [00:01<00:17, 21.22it/s]
7%|▋ | 27/400 [00:01<00:17, 21.20it/s]
8%|▊ | 30/400 [00:01<00:17, 21.20it/s]
8%|▊ | 33/400 [00:01<00:17, 21.21it/s]
9%|▉ | 36/400 [00:01<00:17, 21.21it/s]
10%|▉ | 39/400 [00:01<00:17, 21.21it/s]
10%|█ | 42/400 [00:01<00:16, 21.22it/s]
11%|█▏ | 45/400 [00:02<00:16, 21.23it/s]
12%|█▏ | 48/400 [00:02<00:16, 21.26it/s]
13%|█▎ | 51/400 [00:02<00:16, 21.28it/s]
14%|█▎ | 54/400 [00:02<00:16, 21.29it/s]
14%|█▍ | 57/400 [00:02<00:16, 21.30it/s]
15%|█▌ | 60/400 [00:02<00:15, 21.33it/s]
16%|█▌ | 63/400 [00:02<00:15, 21.35it/s]
16%|█▋ | 66/400 [00:03<00:15, 21.31it/s]
17%|█▋ | 69/400 [00:03<00:15, 21.32it/s]
18%|█▊ | 72/400 [00:03<00:15, 21.35it/s]
19%|█▉ | 75/400 [00:03<00:15, 21.37it/s]
20%|█▉ | 78/400 [00:03<00:15, 21.38it/s]
20%|██ | 81/400 [00:03<00:14, 21.39it/s]
21%|██ | 84/400 [00:03<00:14, 21.39it/s]
22%|██▏ | 87/400 [00:04<00:14, 21.37it/s]
22%|██▎ | 90/400 [00:04<00:14, 21.34it/s]
23%|██▎ | 93/400 [00:04<00:14, 21.31it/s]
24%|██▍ | 96/400 [00:04<00:14, 21.29it/s]
25%|██▍ | 99/400 [00:04<00:14, 21.28it/s]
26%|██▌ | 102/400 [00:04<00:14, 21.28it/s]
26%|██▋ | 105/400 [00:04<00:13, 21.26it/s]
27%|██▋ | 108/400 [00:05<00:13, 21.26it/s]
28%|██▊ | 111/400 [00:05<00:13, 21.26it/s]
28%|██▊ | 114/400 [00:05<00:13, 21.26it/s]
29%|██▉ | 117/400 [00:05<00:13, 21.26it/s]
30%|███ | 120/400 [00:05<00:13, 21.26it/s]
31%|███ | 123/400 [00:05<00:13, 21.26it/s]
32%|███▏ | 126/400 [00:05<00:12, 21.25it/s]
32%|███▏ | 129/400 [00:06<00:12, 21.25it/s]
33%|███▎ | 132/400 [00:06<00:12, 21.24it/s]
34%|███▍ | 135/400 [00:06<00:12, 21.24it/s]
34%|███▍ | 138/400 [00:06<00:12, 21.24it/s]
35%|███▌ | 141/400 [00:06<00:12, 21.24it/s]
36%|███▌ | 144/400 [00:06<00:12, 21.24it/s]
37%|███▋ | 147/400 [00:06<00:11, 21.23it/s]
38%|███▊ | 150/400 [00:07<00:11, 21.22it/s]
38%|███▊ | 153/400 [00:07<00:11, 21.23it/s]
39%|███▉ | 156/400 [00:07<00:11, 21.23it/s]
40%|███▉ | 159/400 [00:07<00:11, 21.24it/s]
40%|████ | 162/400 [00:07<00:11, 21.24it/s]
41%|████▏ | 165/400 [00:07<00:11, 21.25it/s]
42%|████▏ | 168/400 [00:07<00:10, 21.24it/s]
43%|████▎ | 171/400 [00:08<00:10, 21.24it/s]
44%|████▎ | 174/400 [00:08<00:10, 21.23it/s]
44%|████▍ | 177/400 [00:08<00:10, 21.24it/s]
45%|████▌ | 180/400 [00:08<00:10, 21.24it/s]
46%|████▌ | 183/400 [00:08<00:10, 21.24it/s]
46%|████▋ | 186/400 [00:08<00:10, 21.25it/s]
47%|████▋ | 189/400 [00:08<00:09, 21.22it/s]
48%|████▊ | 192/400 [00:09<00:09, 21.23it/s]
49%|████▉ | 195/400 [00:09<00:09, 21.23it/s]
50%|████▉ | 198/400 [00:09<00:09, 21.24it/s]
50%|█████ | 201/400 [00:09<00:09, 21.24it/s]
51%|█████ | 204/400 [00:09<00:09, 21.23it/s]
52%|█████▏ | 207/400 [00:09<00:09, 21.21it/s]
52%|█████▎ | 210/400 [00:09<00:08, 21.21it/s]
53%|█████▎ | 213/400 [00:10<00:08, 21.22it/s]
54%|█████▍ | 216/400 [00:10<00:08, 21.21it/s]
55%|█████▍ | 219/400 [00:10<00:08, 21.20it/s]
56%|█████▌ | 222/400 [00:10<00:08, 21.21it/s]
56%|█████▋ | 225/400 [00:10<00:08, 21.21it/s]
57%|█████▋ | 228/400 [00:10<00:08, 21.20it/s]
58%|█████▊ | 231/400 [00:10<00:07, 21.20it/s]
58%|█████▊ | 234/400 [00:11<00:07, 21.21it/s]
59%|█████▉ | 237/400 [00:11<00:07, 21.19it/s]
60%|██████ | 240/400 [00:11<00:07, 21.18it/s]
61%|██████ | 243/400 [00:11<00:07, 21.18it/s]
62%|██████▏ | 246/400 [00:11<00:07, 21.14it/s]
62%|██████▏ | 249/400 [00:11<00:07, 21.14it/s]
63%|██████▎ | 252/400 [00:11<00:07, 21.11it/s]
64%|██████▍ | 255/400 [00:12<00:06, 21.11it/s]
64%|██████▍ | 258/400 [00:12<00:06, 21.11it/s]
65%|██████▌ | 261/400 [00:12<00:06, 21.11it/s]
66%|██████▌ | 264/400 [00:12<00:06, 21.11it/s]
67%|██████▋ | 267/400 [00:12<00:06, 21.11it/s]
68%|██████▊ | 270/400 [00:12<00:06, 21.07it/s]
68%|██████▊ | 273/400 [00:12<00:06, 20.94it/s]
69%|██████▉ | 276/400 [00:13<00:05, 20.86it/s]
70%|██████▉ | 279/400 [00:13<00:05, 20.81it/s]
70%|███████ | 282/400 [00:13<00:05, 20.74it/s]
71%|███████▏ | 285/400 [00:13<00:05, 20.71it/s]
72%|███████▏ | 288/400 [00:13<00:05, 20.70it/s]
73%|███████▎ | 291/400 [00:13<00:05, 20.70it/s]
74%|███████▎ | 294/400 [00:13<00:05, 20.68it/s]
74%|███████▍ | 297/400 [00:14<00:04, 20.68it/s]
75%|███████▌ | 300/400 [00:14<00:04, 20.66it/s]
76%|███████▌ | 303/400 [00:14<00:04, 20.66it/s]
76%|███████▋ | 306/400 [00:14<00:04, 20.66it/s]
77%|███████▋ | 309/400 [00:14<00:04, 20.66it/s]
78%|███████▊ | 312/400 [00:14<00:04, 20.66it/s]
79%|███████▉ | 315/400 [00:14<00:04, 20.66it/s]
80%|███████▉ | 318/400 [00:15<00:03, 20.66it/s]
80%|████████ | 321/400 [00:15<00:03, 20.66it/s]
81%|████████ | 324/400 [00:15<00:03, 20.68it/s]
82%|████████▏ | 327/400 [00:15<00:03, 20.71it/s]
82%|████████▎ | 330/400 [00:15<00:03, 20.71it/s]
83%|████████▎ | 333/400 [00:15<00:03, 20.71it/s]
84%|████████▍ | 336/400 [00:15<00:03, 20.69it/s]
85%|████████▍ | 339/400 [00:16<00:02, 20.71it/s]
86%|████████▌ | 342/400 [00:16<00:02, 20.72it/s]
86%|████████▋ | 345/400 [00:16<00:02, 20.73it/s]
87%|████████▋ | 348/400 [00:16<00:02, 20.73it/s]
88%|████████▊ | 351/400 [00:16<00:02, 20.73it/s]
88%|████████▊ | 354/400 [00:16<00:02, 20.73it/s]
89%|████████▉ | 357/400 [00:16<00:02, 20.72it/s]
90%|█████████ | 360/400 [00:17<00:01, 20.72it/s]
91%|█████████ | 363/400 [00:17<00:01, 20.72it/s]
92%|█████████▏| 366/400 [00:17<00:01, 20.73it/s]
92%|█████████▏| 369/400 [00:17<00:01, 20.74it/s]
93%|█████████▎| 372/400 [00:17<00:01, 20.73it/s]
94%|█████████▍| 375/400 [00:17<00:01, 20.74it/s]
94%|█████████▍| 378/400 [00:17<00:01, 20.71it/s]
95%|█████████▌| 381/400 [00:18<00:00, 20.71it/s]
96%|█████████▌| 384/400 [00:18<00:00, 20.72it/s]
97%|█████████▋| 387/400 [00:18<00:00, 20.71it/s]
98%|█████████▊| 390/400 [00:18<00:00, 20.72it/s]
98%|█████████▊| 393/400 [00:18<00:00, 20.72it/s]
99%|█████████▉| 396/400 [00:18<00:00, 20.71it/s]
100%|█████████▉| 399/400 [00:18<00:00, 20.70it/s]
100%|██████████| 400/400 [00:18<00:00, 21.06it/s]
0%| | 0/400 [00:00<?, ?it/s]
1%| | 3/400 [00:00<00:19, 20.71it/s]
2%|▏ | 6/400 [00:00<00:19, 20.70it/s]
2%|▏ | 9/400 [00:00<00:18, 20.72it/s]
3%|▎ | 12/400 [00:00<00:18, 20.72it/s]
4%|▍ | 15/400 [00:00<00:18, 20.73it/s]
4%|▍ | 18/400 [00:00<00:18, 20.73it/s]
5%|▌ | 21/400 [00:01<00:18, 20.73it/s]
6%|▌ | 24/400 [00:01<00:18, 20.72it/s]
7%|▋ | 27/400 [00:01<00:17, 20.73it/s]
8%|▊ | 30/400 [00:01<00:17, 20.73it/s]
8%|▊ | 33/400 [00:01<00:17, 20.73it/s]
9%|▉ | 36/400 [00:01<00:17, 20.73it/s]
10%|▉ | 39/400 [00:01<00:17, 20.74it/s]
10%|█ | 42/400 [00:02<00:17, 20.72it/s]
11%|█▏ | 45/400 [00:02<00:17, 20.73it/s]
12%|█▏ | 48/400 [00:02<00:16, 20.76it/s]
13%|█▎ | 51/400 [00:02<00:16, 20.78it/s]
14%|█▎ | 54/400 [00:02<00:16, 20.76it/s]
14%|█▍ | 57/400 [00:02<00:16, 20.76it/s]
15%|█▌ | 60/400 [00:02<00:16, 20.74it/s]
16%|█▌ | 63/400 [00:03<00:16, 20.72it/s]
16%|█▋ | 66/400 [00:03<00:16, 20.72it/s]
17%|█▋ | 69/400 [00:03<00:15, 20.71it/s]
18%|█▊ | 72/400 [00:03<00:15, 20.71it/s]
19%|█▉ | 75/400 [00:03<00:15, 20.72it/s]
20%|█▉ | 78/400 [00:03<00:15, 20.71it/s]
20%|██ | 81/400 [00:03<00:15, 20.70it/s]
21%|██ | 84/400 [00:04<00:15, 20.72it/s]
22%|██▏ | 87/400 [00:04<00:15, 20.73it/s]
22%|██▎ | 90/400 [00:04<00:14, 20.75it/s]
23%|██▎ | 93/400 [00:04<00:14, 20.75it/s]
24%|██▍ | 96/400 [00:04<00:14, 20.77it/s]
25%|██▍ | 99/400 [00:04<00:14, 20.79it/s]
26%|██▌ | 102/400 [00:04<00:14, 20.81it/s]
26%|██▋ | 105/400 [00:05<00:14, 20.82it/s]
27%|██▋ | 108/400 [00:05<00:14, 20.83it/s]
28%|██▊ | 111/400 [00:05<00:13, 20.83it/s]
28%|██▊ | 114/400 [00:05<00:13, 20.85it/s]
29%|██▉ | 117/400 [00:05<00:13, 20.83it/s]
30%|███ | 120/400 [00:05<00:13, 20.84it/s]
31%|███ | 123/400 [00:05<00:13, 20.83it/s]
32%|███▏ | 126/400 [00:06<00:13, 20.84it/s]
32%|███▏ | 129/400 [00:06<00:13, 20.83it/s]
33%|███▎ | 132/400 [00:06<00:12, 20.84it/s]
34%|███▍ | 135/400 [00:06<00:12, 20.84it/s]
34%|███▍ | 138/400 [00:06<00:12, 20.85it/s]
35%|███▌ | 141/400 [00:06<00:12, 20.84it/s]
36%|███▌ | 144/400 [00:06<00:12, 20.82it/s]
37%|███▋ | 147/400 [00:07<00:12, 20.83it/s]
38%|███▊ | 150/400 [00:07<00:12, 20.83it/s]
38%|███▊ | 153/400 [00:07<00:11, 20.83it/s]
39%|███▉ | 156/400 [00:07<00:11, 20.82it/s]
40%|███▉ | 159/400 [00:07<00:11, 20.80it/s]
40%|████ | 162/400 [00:07<00:11, 20.79it/s]
41%|████▏ | 165/400 [00:07<00:11, 20.78it/s]
42%|████▏ | 168/400 [00:08<00:11, 20.77it/s]
43%|████▎ | 171/400 [00:08<00:11, 20.76it/s]
44%|████▎ | 174/400 [00:08<00:10, 20.75it/s]
44%|████▍ | 177/400 [00:08<00:10, 20.74it/s]
45%|████▌ | 180/400 [00:08<00:10, 20.73it/s]
46%|████▌ | 183/400 [00:08<00:10, 20.71it/s]
46%|████▋ | 186/400 [00:08<00:10, 20.68it/s]
47%|████▋ | 189/400 [00:09<00:10, 20.68it/s]
48%|████▊ | 192/400 [00:09<00:10, 20.69it/s]
49%|████▉ | 195/400 [00:09<00:09, 20.69it/s]
50%|████▉ | 198/400 [00:09<00:09, 20.70it/s]
50%|█████ | 201/400 [00:09<00:09, 20.72it/s]
51%|█████ | 204/400 [00:09<00:09, 20.73it/s]
52%|█████▏ | 207/400 [00:09<00:09, 20.73it/s]
52%|█████▎ | 210/400 [00:10<00:09, 20.75it/s]
53%|█████▎ | 213/400 [00:10<00:09, 20.75it/s]
54%|█████▍ | 216/400 [00:10<00:08, 20.76it/s]
55%|█████▍ | 219/400 [00:10<00:08, 20.76it/s]
56%|█████▌ | 222/400 [00:10<00:08, 20.77it/s]
56%|█████▋ | 225/400 [00:10<00:08, 20.77it/s]
57%|█████▋ | 228/400 [00:10<00:08, 20.75it/s]
58%|█████▊ | 231/400 [00:11<00:08, 20.75it/s]
58%|█████▊ | 234/400 [00:11<00:07, 20.76it/s]
59%|█████▉ | 237/400 [00:11<00:07, 20.75it/s]
60%|██████ | 240/400 [00:11<00:07, 20.76it/s]
61%|██████ | 243/400 [00:11<00:07, 20.76it/s]
62%|██████▏ | 246/400 [00:11<00:07, 20.76it/s]
62%|██████▏ | 249/400 [00:11<00:07, 20.75it/s]
63%|██████▎ | 252/400 [00:12<00:07, 20.75it/s]
64%|██████▍ | 255/400 [00:12<00:06, 20.74it/s]
64%|██████▍ | 258/400 [00:12<00:06, 20.75it/s]
65%|██████▌ | 261/400 [00:12<00:06, 20.75it/s]
66%|██████▌ | 264/400 [00:12<00:06, 20.73it/s]
67%|██████▋ | 267/400 [00:12<00:06, 20.73it/s]
68%|██████▊ | 270/400 [00:13<00:06, 20.72it/s]
68%|██████▊ | 273/400 [00:13<00:06, 20.74it/s]
69%|██████▉ | 276/400 [00:13<00:05, 20.73it/s]
70%|██████▉ | 279/400 [00:13<00:05, 20.72it/s]
70%|███████ | 282/400 [00:13<00:05, 20.72it/s]
71%|███████▏ | 285/400 [00:13<00:05, 20.73it/s]
72%|███████▏ | 288/400 [00:13<00:05, 20.73it/s]
73%|███████▎ | 291/400 [00:14<00:05, 20.72it/s]
74%|███████▎ | 294/400 [00:14<00:05, 20.72it/s]
74%|███████▍ | 297/400 [00:14<00:04, 20.72it/s]
75%|███████▌ | 300/400 [00:14<00:04, 20.71it/s]
76%|███████▌ | 303/400 [00:14<00:04, 20.70it/s]
76%|███████▋ | 306/400 [00:14<00:04, 20.70it/s]
77%|███████▋ | 309/400 [00:14<00:04, 20.70it/s]
78%|███████▊ | 312/400 [00:15<00:04, 20.69it/s]
79%|███████▉ | 315/400 [00:15<00:04, 20.70it/s]
80%|███████▉ | 318/400 [00:15<00:03, 20.69it/s]
80%|████████ | 321/400 [00:15<00:03, 20.67it/s]
81%|████████ | 324/400 [00:15<00:03, 20.65it/s]
82%|████████▏ | 327/400 [00:15<00:03, 20.65it/s]
82%|████████▎ | 330/400 [00:15<00:03, 20.64it/s]
83%|████████▎ | 333/400 [00:16<00:03, 20.62it/s]
84%|████████▍ | 336/400 [00:16<00:03, 20.65it/s]
85%|████████▍ | 339/400 [00:16<00:02, 20.68it/s]
86%|████████▌ | 342/400 [00:16<00:02, 20.70it/s]
86%|████████▋ | 345/400 [00:16<00:02, 20.71it/s]
87%|████████▋ | 348/400 [00:16<00:02, 20.74it/s]
88%|████████▊ | 351/400 [00:16<00:02, 20.77it/s]
88%|████████▊ | 354/400 [00:17<00:02, 20.75it/s]
89%|████████▉ | 357/400 [00:17<00:02, 20.73it/s]
90%|█████████ | 360/400 [00:17<00:01, 20.76it/s]
91%|█████████ | 363/400 [00:17<00:01, 20.78it/s]
92%|█████████▏| 366/400 [00:17<00:01, 20.78it/s]
92%|█████████▏| 369/400 [00:17<00:01, 20.79it/s]
93%|█████████▎| 372/400 [00:17<00:01, 20.79it/s]
94%|█████████▍| 375/400 [00:18<00:01, 20.78it/s]
94%|█████████▍| 378/400 [00:18<00:01, 20.79it/s]
95%|█████████▌| 381/400 [00:18<00:00, 20.79it/s]
96%|█████████▌| 384/400 [00:18<00:00, 20.78it/s]
97%|█████████▋| 387/400 [00:18<00:00, 20.79it/s]
98%|█████████▊| 390/400 [00:18<00:00, 20.78it/s]
98%|█████████▊| 393/400 [00:18<00:00, 20.76it/s]
99%|█████████▉| 396/400 [00:19<00:00, 20.72it/s]
100%|█████████▉| 399/400 [00:19<00:00, 20.72it/s]
100%|██████████| 400/400 [00:19<00:00, 20.75it/s]
0%| | 0/400 [00:00<?, ?it/s]
1%| | 3/400 [00:00<00:19, 20.73it/s]
2%|▏ | 6/400 [00:00<00:19, 20.72it/s]
2%|▏ | 9/400 [00:00<00:18, 20.71it/s]
3%|▎ | 12/400 [00:00<00:18, 20.72it/s]
4%|▍ | 15/400 [00:00<00:18, 20.69it/s]
4%|▍ | 18/400 [00:00<00:18, 20.71it/s]
5%|▌ | 21/400 [00:01<00:18, 20.72it/s]
6%|▌ | 24/400 [00:01<00:18, 20.75it/s]
7%|▋ | 27/400 [00:01<00:17, 20.77it/s]
8%|▊ | 30/400 [00:01<00:17, 20.77it/s]
8%|▊ | 33/400 [00:01<00:17, 20.77it/s]
9%|▉ | 36/400 [00:01<00:17, 20.74it/s]
10%|▉ | 39/400 [00:01<00:17, 20.70it/s]
10%|█ | 42/400 [00:02<00:17, 20.69it/s]
11%|█▏ | 45/400 [00:02<00:17, 20.68it/s]
12%|█▏ | 48/400 [00:02<00:17, 20.67it/s]
13%|█▎ | 51/400 [00:02<00:16, 20.67it/s]
14%|█▎ | 54/400 [00:02<00:16, 20.67it/s]
14%|█▍ | 57/400 [00:02<00:16, 20.65it/s]
15%|█▌ | 60/400 [00:02<00:16, 20.64it/s]
16%|█▌ | 63/400 [00:03<00:16, 20.64it/s]
16%|█▋ | 66/400 [00:03<00:16, 20.65it/s]
17%|█▋ | 69/400 [00:03<00:16, 20.63it/s]
18%|█▊ | 72/400 [00:03<00:15, 20.63it/s]
19%|█▉ | 75/400 [00:03<00:15, 20.64it/s]
20%|█▉ | 78/400 [00:03<00:15, 20.63it/s]
20%|██ | 81/400 [00:03<00:15, 20.64it/s]
21%|██ | 84/400 [00:04<00:15, 20.63it/s]
22%|██▏ | 87/400 [00:04<00:15, 20.63it/s]
22%|██▎ | 90/400 [00:04<00:15, 20.63it/s]
23%|██▎ | 93/400 [00:04<00:14, 20.66it/s]
24%|██▍ | 96/400 [00:04<00:14, 20.72it/s]
25%|██▍ | 99/400 [00:04<00:14, 20.73it/s]
26%|██▌ | 102/400 [00:04<00:14, 20.75it/s]
26%|██▋ | 105/400 [00:05<00:14, 20.77it/s]
27%|██▋ | 108/400 [00:05<00:14, 20.79it/s]
28%|██▊ | 111/400 [00:05<00:13, 20.79it/s]
28%|██▊ | 114/400 [00:05<00:13, 20.81it/s]
29%|██▉ | 117/400 [00:05<00:13, 20.80it/s]
30%|███ | 120/400 [00:05<00:13, 20.80it/s]
31%|███ | 123/400 [00:05<00:13, 20.81it/s]
32%|███▏ | 126/400 [00:06<00:13, 20.82it/s]
32%|███▏ | 129/400 [00:06<00:13, 20.82it/s]
33%|███▎ | 132/400 [00:06<00:12, 20.81it/s]
34%|███▍ | 135/400 [00:06<00:12, 20.81it/s]
34%|███▍ | 138/400 [00:06<00:12, 20.82it/s]
35%|███▌ | 141/400 [00:06<00:12, 20.79it/s]
36%|███▌ | 144/400 [00:06<00:12, 20.79it/s]
37%|███▋ | 147/400 [00:07<00:12, 20.79it/s]
38%|███▊ | 150/400 [00:07<00:12, 20.78it/s]
38%|███▊ | 153/400 [00:07<00:11, 20.78it/s]
39%|███▉ | 156/400 [00:07<00:11, 20.79it/s]
40%|███▉ | 159/400 [00:07<00:11, 20.79it/s]
40%|████ | 162/400 [00:07<00:11, 20.79it/s]
41%|████▏ | 165/400 [00:07<00:11, 20.77it/s]
42%|████▏ | 168/400 [00:08<00:11, 20.75it/s]
43%|████▎ | 171/400 [00:08<00:11, 20.75it/s]
44%|████▎ | 174/400 [00:08<00:10, 20.74it/s]
44%|████▍ | 177/400 [00:08<00:10, 20.74it/s]
45%|████▌ | 180/400 [00:08<00:10, 20.72it/s]
46%|████▌ | 183/400 [00:08<00:10, 20.71it/s]
46%|████▋ | 186/400 [00:08<00:10, 20.70it/s]
47%|████▋ | 189/400 [00:09<00:10, 20.70it/s]
48%|████▊ | 192/400 [00:09<00:10, 20.70it/s]
49%|████▉ | 195/400 [00:09<00:09, 20.70it/s]
50%|████▉ | 198/400 [00:09<00:09, 20.71it/s]
50%|█████ | 201/400 [00:09<00:09, 20.71it/s]
51%|█████ | 204/400 [00:09<00:09, 20.69it/s]
52%|█████▏ | 207/400 [00:09<00:09, 20.72it/s]
52%|█████▎ | 210/400 [00:10<00:09, 20.79it/s]
53%|█████▎ | 213/400 [00:10<00:08, 20.81it/s]
54%|█████▍ | 216/400 [00:10<00:08, 20.83it/s]
55%|█████▍ | 219/400 [00:10<00:08, 20.85it/s]
56%|█████▌ | 222/400 [00:10<00:08, 20.86it/s]
56%|█████▋ | 225/400 [00:10<00:08, 20.83it/s]
57%|█████▋ | 228/400 [00:10<00:08, 20.83it/s]
58%|█████▊ | 231/400 [00:11<00:08, 20.84it/s]
58%|█████▊ | 234/400 [00:11<00:07, 20.85it/s]
59%|█████▉ | 237/400 [00:11<00:07, 20.83it/s]
60%|██████ | 240/400 [00:11<00:07, 20.81it/s]
61%|██████ | 243/400 [00:11<00:07, 20.80it/s]
62%|██████▏ | 246/400 [00:11<00:07, 20.81it/s]
62%|██████▏ | 249/400 [00:12<00:07, 20.82it/s]
63%|██████▎ | 252/400 [00:12<00:07, 20.83it/s]
64%|██████▍ | 255/400 [00:12<00:06, 20.84it/s]
64%|██████▍ | 258/400 [00:12<00:06, 20.85it/s]
65%|██████▌ | 261/400 [00:12<00:06, 20.85it/s]
66%|██████▌ | 264/400 [00:12<00:06, 20.86it/s]
67%|██████▋ | 267/400 [00:12<00:06, 20.84it/s]
68%|██████▊ | 270/400 [00:13<00:06, 20.84it/s]
68%|██████▊ | 273/400 [00:13<00:06, 20.84it/s]
69%|██████▉ | 276/400 [00:13<00:05, 20.82it/s]
70%|██████▉ | 279/400 [00:13<00:05, 20.80it/s]
70%|███████ | 282/400 [00:13<00:05, 20.80it/s]
71%|███████▏ | 285/400 [00:13<00:05, 20.77it/s]
72%|███████▏ | 288/400 [00:13<00:05, 20.59it/s]
73%|███████▎ | 291/400 [00:14<00:05, 20.66it/s]
74%|███████▎ | 294/400 [00:14<00:05, 20.72it/s]
74%|███████▍ | 297/400 [00:14<00:04, 20.76it/s]
75%|███████▌ | 300/400 [00:14<00:04, 20.76it/s]
76%|███████▌ | 303/400 [00:14<00:04, 20.73it/s]
76%|███████▋ | 306/400 [00:14<00:04, 20.68it/s]
77%|███████▋ | 309/400 [00:14<00:04, 20.64it/s]
78%|███████▊ | 312/400 [00:15<00:04, 20.62it/s]
79%|███████▉ | 315/400 [00:15<00:04, 20.61it/s]
80%|███████▉ | 318/400 [00:15<00:03, 20.59it/s]
80%|████████ | 321/400 [00:15<00:03, 20.58it/s]
81%|████████ | 324/400 [00:15<00:03, 20.57it/s]
82%|████████▏ | 327/400 [00:15<00:03, 20.56it/s]
82%|████████▎ | 330/400 [00:15<00:03, 20.56it/s]
83%|████████▎ | 333/400 [00:16<00:03, 20.56it/s]
84%|████████▍ | 336/400 [00:16<00:03, 20.55it/s]
85%|████████▍ | 339/400 [00:16<00:02, 20.52it/s]
86%|████████▌ | 342/400 [00:16<00:02, 20.52it/s]
86%|████████▋ | 345/400 [00:16<00:02, 20.51it/s]
87%|████████▋ | 348/400 [00:16<00:02, 20.49it/s]
88%|████████▊ | 351/400 [00:16<00:02, 20.47it/s]
88%|████████▊ | 354/400 [00:17<00:02, 20.49it/s]
89%|████████▉ | 357/400 [00:17<00:02, 20.47it/s]
90%|█████████ | 360/400 [00:17<00:01, 20.48it/s]
91%|█████████ | 363/400 [00:17<00:01, 20.48it/s]
92%|█████████▏| 366/400 [00:17<00:01, 20.48it/s]
92%|█████████▏| 369/400 [00:17<00:01, 20.48it/s]
93%|█████████▎| 372/400 [00:17<00:01, 20.48it/s]
94%|█████████▍| 375/400 [00:18<00:01, 20.49it/s]
94%|█████████▍| 378/400 [00:18<00:01, 20.49it/s]
95%|█████████▌| 381/400 [00:18<00:00, 20.49it/s]
96%|█████████▌| 384/400 [00:18<00:00, 20.49it/s]
97%|█████████▋| 387/400 [00:18<00:00, 20.51it/s]
98%|█████████▊| 390/400 [00:18<00:00, 20.49it/s]
98%|█████████▊| 393/400 [00:18<00:00, 20.48it/s]
99%|█████████▉| 396/400 [00:19<00:00, 20.48it/s]
100%|█████████▉| 399/400 [00:19<00:00, 20.48it/s]
100%|██████████| 400/400 [00:19<00:00, 20.69it/s]
pretty_print_results(np.array(collected_l2_distances))
- p10: 0.988
- p5: 0.965
- p3: 0.897
- p1: 0.327
- Euc. Dist: 1.823
8.3 Conversion to Akida
The quantized model can be easily converted to Akida using the cnn2snn package. The convert function returns a model in Akida format ready for inference.
from cnn2snn import convert
akida_model = convert(model_quant.model)
akida_model.summary()
Model Summary
_______________________________________________
Input shape Output shape Sequences Layers
===============================================
[96, 128, 2] [3, 4, 3] 1 19
_______________________________________________
_________________________________________________________________________________________________
Layer (type) Output shape Kernel shape
================= SW/ec92b4a7-5b2a-468c-b56e-70865292c4ef-dequantizer (Software) ================
ec92b4a7-5b2a-468c-b56e-70865292c4ef (BufferTempConv) [96, 128, 8] (1, 1, 10, 8)
_________________________________________________________________________________________________
node_Conv_0 (Conv2D) [48, 64, 16] (3, 3, 8, 16)
_________________________________________________________________________________________________
45058267-823c-4595-bab2-5cfa351c743f (BufferTempConv) [48, 64, 32] (1, 1, 80, 32)
_________________________________________________________________________________________________
node_Conv_1 (Conv2D) [24, 32, 48] (3, 3, 32, 48)
_________________________________________________________________________________________________
11d2f8c7-ce4d-466c-9aef-83a6b98af5e5 (BufferTempConv) [24, 32, 64] (1, 1, 240, 64)
_________________________________________________________________________________________________
node_Conv_2 (Conv2D) [12, 16, 80] (3, 3, 64, 80)
_________________________________________________________________________________________________
9152ed94-2122-47d4-aeb8-31a79f981dbd (DepthwiseBufferTempConv) [12, 16, 80] (1, 1, 5, 80)
_________________________________________________________________________________________________
node_Conv_3 (Conv2D) [12, 16, 96] (1, 1, 80, 96)
_________________________________________________________________________________________________
node_Conv_4 (DepthwiseConv2D) [6, 8, 96] (3, 3, 96, 1)
_________________________________________________________________________________________________
node_Conv_5 (Conv2D) [6, 8, 112] (1, 1, 96, 112)
_________________________________________________________________________________________________
c2903284-97a5-4666-99c3-4f408af17d1a (DepthwiseBufferTempConv) [6, 8, 112] (1, 1, 5, 112)
_________________________________________________________________________________________________
node_Conv_6 (Conv2D) [6, 8, 128] (1, 1, 112, 128)
_________________________________________________________________________________________________
node_Conv_7 (DepthwiseConv2D) [3, 4, 128] (3, 3, 128, 1)
_________________________________________________________________________________________________
node_Conv_9 (Conv2D) [3, 4, 256] (1, 1, 128, 256)
_________________________________________________________________________________________________
16397811-68f3-4ced-8708-4b3bdf46000b (BufferTempConv) [3, 4, 256] (1, 1, 1280, 256)
_________________________________________________________________________________________________
node_Conv_10 (Conv2D) [3, 4, 256] (3, 3, 256, 256)
_________________________________________________________________________________________________
node_Conv_11 (Conv2D) [3, 4, 3] (1, 1, 256, 3)
_________________________________________________________________________________________________
dequantizer (Dequantizer) [3, 4, 3] N/A
_________________________________________________________________________________________________
Note
For more information you can refer to the paper available here.
There is also a full training pipeline available in tensorflow/Keras from the akida_models package that reproduces the performance presented in the paper available with the akida_models.tenn_spatiotemporal function.
Total running time of the script: (8 minutes 1.634 seconds)