Engine Changelog

0.11.4 (2018-11-28)

Artifacts

Daemon:

Clients:

Implemented enhancements

Frontal pose

Frontal pose is now a string instead of an enum. This way, it is possible not to specify a value when using the Search API to search for both FRONTAL and NON_FRONTAL poses.

Face recognition training performance

Retraining face recognition models on identity updates should be faster than before.

Bug fixes

Face training

Fixed an issue with identities sometimes not being retrained properly.

Windows Temp directory

Fixed an issue with Tensorflow spamming the Temp directory with DLLs when the Engine reboots.

Crash on startup

Set the "no DB" mode as the default mode, so that the Engine won't crash on startup without a Postgres DB running. To run with a Database, re-enable it in the configuration file.

0.11.3 (2018-11-20)

Artifacts

Daemon:

Clients:

Implemented enhancements

Sharpness and frontal pose for face recognition

Face recognition now returns the sharpness and frontal pose of a detected face. The sharpness is a value between 0.0 and 1.0, and represents how clear a face is. Using sharper faces for training will yield better results. The frontal pose can be either FRONTAL or NON_FRONTAL. FRONTAL faces are faces that are facing the camera directly. Searching of faces has been updated with this parameter (minSharpness and frontalPose).

Recognized Identity ID

Face results now also return an optional "Recognized Identity ID".

Bug fixes

Performance

Calls to the Classification endpoint will be more efficient when no exclusion zones are provided.

Removals

Summary

The old Summary API was removed.

HTTP Server

The HTTP mode was removed.

0.11.2 (2018-11-08)

Artifacts

Daemon:

Clients:

Implemented enhancements

Normalized bounding boxes

Detection and Face Recognition will now return not only bounding_box (unchanged), but also normalized_bounding_box. Normalized bounding box's coordinates are double values between 0.0 and 1.0.

C++ Client structure

The C++ Client files are now delivered in separate folders:

  • lib for libava_engine_client.a
  • playground for code examples
  • include for the rest

Bug fixes

Windows GPU Setup

Fixed an issue with the GPU Setup sometimes causing an Error 2755 on Windows.

Config file location

Fixed a bug where the config file (conf/application.conf) sometimes could not be found.

List faces ordering

When we reach the limit for the list faces endpoint, we will now return the most recent faces instead of the oldest ones. In that scenario, you should now handle pagination by decreasing end instead of increasing start to fetch all faces for a given period of time.

0.11.1 (2018-11-01)

Artifacts

Daemon:

Clients:

Implemented enhancements

List cluster sets

Requests can now specify start, end and limit to handle pagination.

Responses will return not only the list of cluster sets, but also the parameters from the request (group_id, custom_id, start, end and limit).

Clustering errors

Clustering errors will now return code NOT_FOUND if a given Face ID doesn't exist or INVALID_ARGUMENT if a Face doesn't belong to the right Group, instead of generic UNKNOWN errors.

Bug fixes

No DB mode

Fixed a bug sometimes causing the Engine to crash at startup in "No DB" mode.

0.11.0 (2018-10-29)

Artifacts

Daemon:

Clients:

Implemented enhancements

Database migration

The Engine now works with a Postgres database instead of SQLite. The database configuration now has 3 parameters: enabled (boolean), auto-migrate (boolean) and url (string).

In case auto-migrate is set to false, the Engine comes with an external DB Migrator tool. It is located in bin/migrate-db[.bat].

Exclusion zones

Zones can now be excluded from every classification, detection and face recognition calls. Refer to the API specification for more information about the format.

Pay attention to the fact that these changes came with breaking changes to the Search API responses.

Cover image

It is now possible to flag one of the faces of an identity as the cover image of this person. Look for updates to AddIdentityRequest and UpdateIdentityRequest to find out more about this feature.

gRPC responses

gRPC responses now contain more details than before and include a gRPC Status. See the list of gRPC Status codes for more information.

Cluster computing

The API to compute a cluster has changed: instead of clustering just the last 1000 faces for a group, it now takes a list of faces to cluster. This is a breaking change. Refer to the API reference for more information about this endpoint.

Max faces per identity

The default value of max faces per identity is now back to 50 instead of 1000. It can be customized in the clustering config.

Uptime service

Engine status will now be logged every 15 seconds.

Mock face detector

A mock face detector can now be used. This can be useful for local developments. Just change face-detector's type to mock in the config to use it.

Bug fixes

Update identity

An UpdateIdentityRequest can now ask to re-add faces that were already assigned to this identity. No changes will be performed by doing so, but at least the request won't get rejected anymore.

0.10.1 (2018-10-12)

Artifacts

Daemon:

Clients:

Implemented enhancements:

List faces API

A new API endpoint to list all faces for a given group ID was added. See the API reference for more information about this endpoint.

Renamed parameters in search and summary

Parameters before and after have been renamed start and end. Pay attention to the fact that before actually corresponds to the new end parameter.

Identity update

The name field is now optional when updating an existing Identity.

0.10.0 (2018-10-10)

Artifacts

Daemon:

Clients:

Implemented enhancements:

Groups

We've removed the Groups resource and the CRUD api's around it. GroupId is still a required field on face recognition API's, but you no longer need to create a group beforehand.

Config

Configuration is now done via a file, not via CLI args. The file lives as conf/application.conf.

0.9.2 (2018-10-04)

Artifacts

Daemon:

Clients:

Implemented enhancements:

Windows GPU installer

The NVIDIA Graphics Card Drivers are now an optional feature that can be selected during the setup, disabled by default. It is also possible to choose not to install the CUDA and cuDNN various features individually.

0.9.1 (2018-09-28)

Artifacts

Daemon:

Clients:

Bug fixes:

  • Max number of faces per identity now defaults to 1000, rather than 20.

0.9.0 (2018-09-27)

Artifacts

Daemon:

Clients:

Implemented enhancements:

Groups

We've added a concept to the Face Recognition feature called Groups. Groups allow segmenting a set of identities. An example use would be if your product had two physical locations. You don't want one locations identities to mix with the others. You can use Groups to separate your identities. See the examples for how this is used.

Persistence

We've added a persistence parameter to all the analytic calls. It used to be a boolean flag, should_save which controlled whether images were saved in the DB and disk. It's now possible to save the image, save the image AND the result, or save nothing. The are 3 possible values: SAVE_ALL, SAVE_RESULT and SAVE_NOTHING. See the examples for how this is used.

Clustering CRUD API's

We've added functions around Clustering CRUD. You can now list and get individual cluster sets.

Bug fixes:

  • No longer allow creation of identity without face_ids: #787
  • Fixed issue in search where a searching for images without specifying a query gives no results : #783

0.8.1 (2018-09-06)

Artifacts:

Daemon:

Clients:

Implemented enhancements:

Linux installer

The linux version now comes with a *.deb package. This Debian package installs and sets up the Daemon as a SystemV service.

Renamed CLI arguments

  • --retentionPeriod was renamed --retention-period
  • --httpPort was renamed --http-port

0.8.0 (2018-09-04)

Artifacts:

Daemon:

Clients:

Bug fixes:

  • GPU Usage fraction now default to 0.7. We found 0.9 is far too high a default.

Implemented enhancements:

Simplification of API

We've removed the following concepts:

  • Initialization. The Engine now loads everything at startup. When the Engine is up, it's now good to be used. Previously you had to turn features on before being able to use them.
  • Feeds. We've removed the need to create Feeds to use the API. The analytics functions still take in a feed_id, so that they can be searched on.

Retention is global

Due to removing feeds, retention is now globally configured. Use the --retentionPeriod flag to control it.

HTTP Server

The Engine now experimentally supports being called via HTTP, as well as the usual gRPC calls. Because the API is primarily RPC based, every method is a POST. We don't have documentation around this feature yet (i.e. routes etc). If you are interested in using it, let us know and we can get you some more info. This feature is behind a flag. To enable it, use the --http and --httpPort flags.

CUDA

The Windows GPU installer now bundles CUDA and CUDNN.


0.7.5 (2018-08-21)

Artifacts:

Daemon:

Clients:

Implemented enhancements:

C++ Client

A timeout in milliseconds can now be specified when creating the client.


0.7.4 (2018-08-16)

Artifacts:

Daemon:

Clients:

Bug fixes:

Downgraded GRPC to version 1.10.1.


0.7.2 (2018-08-06)

Artifacts:

Daemon:

Clients:

Implemented enhancements:

Auto day/night model selection

The Classification feature will now choose between a day and night model, depending on the contents of the image. This change should work transparently.

Retention

A per feed configurable retention period has been implemented. After N days have elapsed, images older than that will be deleted. This feature is behind a feature flag for now. Enable it with --retention on the command line when starting the daemon.


0.7.1 (2018-07-31)

Artifacts:

Daemon:

Clients:

Bug fixes:

  • JS Client: Deadlines are now configurable per request: #14
  • Daemon logging is back to how it used to be with a log line for each gRPC request: #16

0.7.0 (2018-07-23)

Artifacts:

Daemon:

Clients:

Breaking changes:

This is a large release, with several breaking changes. You will need to:

  • Delete your database

The API has changed significantly (this is a beta product apologies in advance). There are no docs at this stage, so your best port of call is the example code, and asking on Slack.

Implemented enhancements:

Face recognition:

Face recognition feature has been completed. Check the example apps to see how this works. There is support for face-clustering to help you train the system, however it's still in beta, and the API is likely to change.

Detection:

Detection has been added. You will get bounding boxes around images.

Car classification

Car classification is now supported. Just enable the feature with the car class.

Batching

We now support automatic batching for classification. We ingest images via a queue, and push them into the classifier in batches if it's not busy. The client doesn't need to batch calls - the daemon does it for you. You won't see a speed increase, but you will see less drop off if you have many cameras (4+).

should_save parameter

There is an optional should_save parameter on feature detect calls, that tells the daemon to not save the result.

Search and summary of results

You can now search previous results for interesting events. The search works across classification, detection and face-rec result. Check the example applications for info on the search DSL.

Misc

  • Initializing features API has changed. It now takes in explicitly named arguments, instead of a map<string, FeatureArguments>
  • ImageItems now contain a feed_id
  • We've removed the AnalyticsResult type. We used to share this type across all results (classification, face-recognition etc). Each feature now returns it's own type.

CLI changes

  • There is a new flag no-ml. This flag will use dummy ML implementations, and return random results. Really only useful for testing.
  • See ava-engine --help for more details

0.6.0-rc2 (2018-05-30)

Artifacts:

Daemon:

Clients:

Breaking changes:

This is a large release, with several breaking changes. You will need to:

  • Delete your database

The API has changed significantly (this is a beta product apologies in advance). There are no docs at this stage, so your best port of call is the example code, and asking on Slack.

Implemented enhancements:

Model encryption:

  • Our models are now encrypted. This change should be transparent and shouldn't require additional work on your end. That said, we recommend you rm -rf your models directory.

Feeds:

  • The API now has a concept of 'Feeds'. A Feed is any image data source (e.g. camera or NVR)

  • The end goal is for us to provide better analytics/insight in the future (e.g. search capabilities on a specific set of cameras)

  • We recommend taking a look at the playground files in for a full example. It describes how to add/remove/list feeds

  • Note that this change will require the database to be destroyed and re-created (rm -rf the sqlite3 database file)

    client = AvaEngineClient()
    
    # Enable features globally, features need to be enabled before it can be used.
    client.initialize({
        'features': {
            'classification': {'classes': ['person']},
        },
    })
    
    # Create Feed entities for cameras you wish use features for.
    feed_id = '1NJdOI_1'
    client.feeds.create(feed_id)
    
    # Enable the feature for the camera
    client.feeds.configure(feed_id, {
        'features': {
            'classification': {
                'classes': ['person'],
            },
        },
    })
    
    # Perform analytics as you normally would but now also specify the `feed_id`.
    client.classification.detect(feed_id, image_blobs, ['person'])
    

Images now persist to storage

  • Every image sent to Ava Engine for analysis now persists onto disk. By default, images are stored in the same directory as the daemon (however, configurable - similar to database/models path)
  • We understand that not everybody will want to persist images, in the future we plan on allowing users to disable this feature

CLI changes

  • We've renamed --model-path to --models-path for consistency
  • See ava-engine --help for more details

API

  • We've removed the GetDetect and plan to replace it with a more generic Search endpoint. We suggest for now you store results from the Detect call if you need refer to the results downstream.
  • Better exception handling, exceptions pass down to client SDKs now have a type (FeatureError, FeedError, AnalyticsError, RepositoryError, ServiceError).

0.5.3 (2018-05-10)

Artifacts:

Daemon:

Clients:

Bug fixes:

  • playground.js and Playground.cc files are now included in the client distribution
  • The ClassificationFeature.h header file was missing in the C++ distribution

0.5.2 (2018-05-09)

Artifacts:

Daemon:

Clients:

Breaking changes:

This is a large release, with several breaking changes. You will need to:

  • Delete your database
  • Upgrade CUDA 9.0 and CUDNN 7.0.5 The API has changed significantly (this is a beta product apologies in advance). There are no docs at this stage, so your best port of call is the example code, and asking on Slack.

Implemented enhancements:

  • CLI args have changed

    Usage:
    ava-engine [options]
    Options:
    -p --port=<port>          Socket port to bind to [default: 50051]
    -d --db-path=<path>       Path to directory to store or read Ava Engine's persistence layer [default: ./ava-engine.db]
    -m --model-path=<path>    Path to directory analytics models [default: ./models]
    -l --license-path=<path>  Path to read license from [default: ./LICENSE]
    --reset-features          Removes previously loaded features before starting the server
    --max-message-size=<s>    Maximum message size for requests and responses in megabytes [default: 10]
    -h --help                 Print help usage information and quit
    
  • We've removed the concept of models from the user facing API.

    The API no longer deals in models. It now deals in "features". The features available are:

    • Classification
    • Detection (not implemented)
    • Face recognition (not implemented)

    You now enable the features you want when instantiating the API, and we take care of the rest.

    All the client libraries (CPP, Python and JS) have been changed to reflect this. Please see the example code in each library.

  • All features now have an optional Feed ID field. This field represents the camera or feed the image is from.

  • Upgrade to Tensorflow 1.7. CUDA 9.0 and CUDNN 7.0.5 now required

Bug fixes:

  • Requests certificate was being stored in temp dir, and being deleted
  • The server allows calling load model many times concurrently without erroring
  • Occasional database error, "no such table: models"
  • When the server crashes (or you kill it), the client reconnects gracefully, but you get errors because the model is not loaded
  • Model downloading occasionally causes DB errors
  • Model loading error: FailedPreconditionError Bad file descriptor