Plumerai Familiar Face Identification API¶
This document describes the API for the Familiar Face Identification functionality.
Note that the software is built with either the Automatic Enrollment option or the Manual Enrollment option enabled. This page provides documentation for both options, but at runtime only one of the two will be available.
FaceIdentification¶
get_face_id¶
Retrieve the face ID that belongs to a person box.
Retrieves the face ID given a person box from the most recent video frame. This function has three possible return values:
FACE_ID_UNIDENTIFIED
when the provided box is not ofCLASS_PERSON
or when a face is not yet identified, e.g. the face is not fully visible.FACE_ID_NOT_IN_LIBRARY
when the face is visible but not found in the library, e.g. when a stranger is in view.- Any integer face-ID provided previously to
FaceEnrollmentManual::add_embedding
when a familiar face is identified. This function should not be called directly after restoring from a previous state throughVideoIntelligence::restore_state
.
This function should not be called with results of VideoIntelligence::single_image
calls.
Arguments:
- person_box: A box from the most recent video frame with
class_id
equal toDetectionClass::CLASS_PERSON
.
Returns:
- An integer face-ID as provided when calling
FaceEnrollmentManual::add_embedding
when a face is identified,FACE_ID_UNIDENTIFIED
orFACE_ID_NOT_IN_LIBRARY
when it is not identified successfully, orFACE_ID_UNIDENTIFIED
when the provided box is not a valid person box.
get_person_box_from_face_box¶
ErrorCode get_person_box_from_face_box(
const BoxPrediction& face_box, BoxPrediction* result_person_box) const;
Retrieve a person box corresponding to a face box.
This function should not be called with results of VideoIntelligence::single_image
calls.
Arguments:
- face_box: The target face to find a match for. This has to be a box from the most recent video frame.
- result_person_box: The resulting box, only valid if the return value is true (see below). The caller needs to allocate memory for this box prior to calling this function.
Returns:
- Returns
SUCCESS
in case a match was found. ReturnsNO_BOX_MATCH
if it was not possible to uniquely match a face box to a person box. ReturnsINVALID_BOX
in case of invalid arguments.
get_face_box_from_person_box¶
ErrorCode get_face_box_from_person_box(const BoxPrediction& person_box,
BoxPrediction* result_face_box) const;
Retrieve a face box corresponding to a person box.
This function should not be called with results of VideoIntelligence::single_image
calls.
Arguments:
- person_box: The target person to find a match for. This has to be a box from the most recent video frame.
- result_face_box: The resulting box, only valid if the return value is true (see below). The caller needs to allocate memory for this box prior to calling this function.
Returns:
- Returns
SUCCESS
in case a match was found. ReturnsNO_BOX_MATCH
if it was not possible to uniquely match a face box to a person box. ReturnsINVALID_BOX
in case of invalid arguments.
embedding_version¶
Returns a version number for the face embedding data used by the face identification logic.
This version can be used to check if the face embedding data generated with one version of the Plumerai software are compatible with those generated by another version of the Plumerai software.
Returns:
- The version number of the face embedding data.
FaceEnrollmentAutomatic¶
configure_face_snapshots¶
Configure the face snapshots for automatic enrollment.
By default, face snapshots are disabled.
Calling this function will invalidate any stored face snapshots of faces that are already enrolled. Trying to retrieve those face snapshots will return uninitialized data.
Arguments:
- settings: See
FaceSnapshotSettings
for more details.
Returns:
- Returns
SUCCESS
on success, orINVALID_ARGUMENT
when the provided settings are not valid.
get_face_snapshot¶
Return a snapshot of an automatically enrolled face.
Note that UNKNOWN_FACE_ID
can be returned when a face id that was previously valid is overwritten with a new entry.
Arguments:
- face_id: A non-negative integer face-id.
- face_snapshot_data: The pointer to the stored snapshot data is returned via this output argument.
Returns:
- Returns
SUCCESS
on success,UNKNOWN_FACE_ID
when the specified face id could not be found, orFACE_SNAPSHOTS_DISABLED
when face snapshots were not configured usingconfigure_face_snapshots
.
get_face_ids¶
ErrorCode get_face_ids(int* face_ids, std::size_t* num_face_ids) const;
ErrorCode get_face_ids(std::vector<int>& face_ids) const;
Return the face ids of all automatically enrolled faces.
This list of face ids is not related to the faces currently in view. The face ids returned by this function are all faces that have ever been enrolled into the face library. To retrieve information about the faces currently in view, use FaceIdentification::get_face_id
.
The caller must provide a buffer of size at least max_library_size
integers.
Arguments:
- face_ids: A pointer to a user-allocated list that receives the enrolled face ids. It must hold at least
max_library_size
integers. - num_face_ids: An output parameter that receives the number of returned values.
Returns:
- Returns
SUCCESS
on success.
tag_face_id¶
Tag a face id as 'important' to prevent it from being overwritten.
When the face library is full and a new face is encountered, the algorithm will overwrite the oldest face in the library that is not tagged as important. A typical use-case of this is to tag a face as important when the user has named them in a front-end application.
When all entries in the face library are tagged as important and a new face is encountered, then no new faces will be enrolled.
By default, an automatically enrolled face is not tagged as important. However, library entries created by restore_embedding_data
are automatically tagged as important.
Note that UNKNOWN_FACE_ID
can be returned when a face id that was previously valid is overwritten with a new entry.
Arguments:
- face_id: A non-negative integer face-id.
- important: Whether to tag the face as important or to remove a previously applied tag.
Returns:
- Returns
SUCCESS
on success,UNKNOWN_FACE_ID
when the specified face id could not be found.
remove_embedding¶
Remove a face embedding from the face library for any VideoIntelligence::process_frame
calls that follow.
Note that UNKNOWN_FACE_ID
can be returned when a face id that was previously valid is overwritten with a new entry.
Arguments:
- face_id: A non-negative integer face-id.
Returns:
- Returns
SUCCESS
on success,UNKNOWN_FACE_ID
on failure.
remove_all_embeddings¶
Remove all face embeddings from the face library.
Returns:
- Returns
SUCCESS
on success.
get_embedding_data¶
ErrorCode get_embedding_data(const int face_id,
std::vector<std::uint8_t>& embedding_data,
bool include_face_snapshot) const;
Get the face embedding data for a face-ID, for persistent storage.
This can for example be used to store the face library when a device shuts down and restore it later when it reboots.
This embedding data can change during any VideoIntelligence::process_frame
call.
Note that UNKNOWN_FACE_ID
can be returned when a face id that was previously valid is overwritten with a new entry.
The caller must provide a buffer of size at least embedding_size
bytes.
Arguments:
- face_id: A non-negative integer face-id.
- embedding_data: A pointer to a user-allocated list that receives the embedding data. It must hold at least
embedding_size
bytes. - include_face_snapshot: Whether to include the face snapshot in the embedding data. This snapshot is stored as raw RGB data.
Returns:
- Returns
SUCCESS
on success,UNKNOWN_FACE_ID
when the specified face id could not be found, orINTERNAL_ERROR
in case of an unexpected error.
restore_embedding_data¶
ErrorCode restore_embedding_data(
const int face_id, const std::vector<std::uint8_t>& embedding_data);
Restore the face embedding data for a face-ID, from persistent storage.
When the specified face_id
does not yet exist then it will be created. When the specified face_id
already exists, the internal embedding data will be overwritten with new embedding data. If the new embedding data is corrupt, this will result in removal of the existing face embedding data.
If a new face_id
was created, this function will automatically tag it as 'important', see also tag_face_id
.
If the embedding data does not include a face snapshot, then the face snapshot data for this face id will contain uninitialized data. If the embedding data includes a face snapshot, then configure_face_snapshots
must have been called first, with enabled
set to true
and the same height
and width
as the stored data. If the height and width do not match, then STATE_SETTINGS_MISMATCH
is returned.
Arguments:
- face_id: A non-negative integer face-id.
- embedding_data: The embedding data to restore.
Returns:
- Returns
SUCCESS
on success, orFACE_LIBRARY_FULL
when the face library is full, orSTATE_CORRUPT
when the embedding data was corrupted. If the height and width of an included face snapshot do not match, thenSTATE_SETTINGS_MISMATCH
is returned.
merge_embeddings¶
Merge two entries of the face library.
If a single person is enrolled twice in the face library, this function can be used to merge their enrollments back to a single one. After calling this function face_id_src
is no longer valid and face_id_dst
will be updated with the additional information from face_id_src
.
Arguments:
- face_id_dst: A non-negative integer face-id.
- face_id_src: A non-negative integer face-id, must be different from
face_id_dst
.
Returns:
- Returns
SUCCESS
on success,UNKNOWN_FACE_ID
when either of the face ids could not be found, orINTERNAL_ERROR
in case of an unexpected error.
max_face_library_size¶
Returns the maximum size of the face library.
When the library is full and new faces are detected, they will overwrite older faces, except for faces that are tagged as important using tag_face_id
. When all faces are tagged as important, new faces will not be added to the library beyond this maximum size.
Returns:
- The maximum size of the face library.
FaceEnrollmentManual¶
embedding_size¶
Returns the size of the face embeddings obtained from finish_enrollment
and required by add_embedding
.
Returns:
- The size of the face embeddings.
max_face_library_size¶
Returns the maximum size of the face library.
When the library is full, add_embedding
will return FACE_LIBRARY_FULL
and won't be able to add new embeddings, until FaceEnrollmentManual::remove_embedding
is called.
Returns:
- The maximum size of the face library.
start_enrollment¶
This starts the enrollment procedure for a new face.
During subsequent calls to VideoIntelligence::process_frame
or VideoIntelligence::single_image
, face embeddings will be computed. During enrollment there should be a single face in the image, or in the optional Region
specified by region_of_interest
(not available in the C API), ideally clearly and completely visible. The enrollment procedure can be finalized by calling finish_enrollment
.
Arguments:
- region_of_interest: This can be set to a region of interest in the image. Only faces that have overlap with this region will be used for enrollment. The default
Region
is the entire image.
Returns:
- Returns
ENROLLMENT_IN_PROGRESS
if the enrollment procedure was started successfully, otherwise returnsALREADY_ENROLLING
.
Example:
auto pvi = plumerai::VideoIntelligence(height, width);
auto ec = pvi.face_enrollment_manual().start_enrollment();
if (ec != plumerai::ErrorCode::ENROLLMENT_IN_PROGRESS) {
printf("ERROR: start_enrollment returned %d\n", ec);
}
// Process the face images
for (size_t i = 0; i < num_images; ++i) {
ec = pvi.single_image(image, height, width);
if (ec != plumerai::ErrorCode::ENROLLMENT_IN_PROGRESS) {
// The image might be rejected if the face is not clearly visible
printf("Warning, face image %d rejected: %d\n", i, ec);
}
}
int8_t embedding[FaceEnrollmentManual::embedding_size()];
ec = pvi.face_enrollment_manual().finish_enrollment(embedding);
if (ec != plumerai::ErrorCode::SUCCESS) {
printf("Error: %s\n", plumerai::error_code_string(error_code));
}
finish_enrollment¶
ErrorCode finish_enrollment(std::int8_t* face_embedding);
ErrorCode finish_enrollment(std::vector<std::int8_t>& face_embedding);
Finalize the face enrollment procedure started by start_enrollment
and obtain the face embedding.
The caller must provide a buffer of size embedding_size
.
The application is responsible for storing this embedding on persistent storage and passing it to add_embedding
every time an instance of this class is created. The face enrollment procedure does not automatically call add_embedding
.
For an example, see the example under start_enrollment
above.
On some platforms, a version that uses std::vector
is available.
Arguments:
- face_embedding: The resulting face embedding if the result is
SUCCESS
orLOW_QUALITY_ENROLLMENT
.
Returns:
- Returns
SUCCESS
when enrollment was successful. Otherwise, returns one ofNOT_ENROLLING
,ENROLLMENT_FAILED
,LOW_QUALITY_ENROLLMENT
. See the enum for more information.
add_embedding¶
ErrorCode add_embedding(const std::int8_t* face_embedding,
std::size_t face_embedding_size, int face_id);
ErrorCode add_embedding(const std::vector<std::int8_t>& face_embedding,
int face_id);
Add a face embedding to the face library for any VideoIntelligence::process_frame
calls that follow.
A second embedding for the same face id will overwrite the previous one. When calling FaceIdentification::get_face_id
on a detected person box, it will use the face_id
provided here as return value.
On some platforms, a version that uses std::vector
is available.
Arguments:
- face_embedding: A face embedding as obtained from
finish_enrollment
. - face_embedding_size: Only used in the case when
face_embedding
is a raw pointer: the size of the face embedding data. - face_id: An integer face-id, is not allowed to be equal to
FACE_ID_UNIDENTIFIED
orFACE_ID_NOT_IN_LIBRARY
.
Returns:
- Returns
SUCCESS
on success,INVALID_FACE_ID
,FACE_LIBRARY_FULL
, orINVALID_EMBEDDING
on failure.
Example:
auto pvi = plumerai::VideoIntelligence(height, width);
std::vector<std::int8_t> face_embedding = ...;
// Add with face-id 3
auto error_code =
pvi.face_enrollment_manual().add_embedding(face_embedding, 3);
if (error_code != plumerai::ErrorCode::SUCCESS) {
printf("Error: %s\n", plumerai::error_code_string(error_code));
}
get_face_ids¶
Return the face ids of all enrolled faces.
This list of face ids is not related to the faces currently in view. The face ids returned by this function are all faces that have ever been enrolled into the face library. To retrieve information about the faces currently in view, use FaceIdentification::get_face_id
.
The caller must provide a buffer of size at least max_library_size
integers.
Arguments:
- face_ids: A pointer to a user-allocated list that receives the enrolled face ids. It must hold at least
max_library_size
integers. - num_face_ids: An output parameter that receives the number of returned values.
Returns:
- Returns
SUCCESS
on success.
remove_embedding¶
Remove a face embedding from the face library for any VideoIntelligence::process_frame
calls that follow.
Arguments:
- face_id: An integer face-id, previously used in
add_embedding
.
Returns:
- Returns
SUCCESS
on success,INVALID_FACE_ID
on failure.
remove_all_embeddings¶
Remove all face embeddings from the face library.
Returns:
- Returns
SUCCESS
on success.
Region¶
struct Region {
float y_min = 0.0f; // top coordinate between 0 and 1 in height dimension
float x_min = 0.0f; // left coordinate between 0 and 1 in width dimension
float y_max = 1.0f; // bottom coordinate between 0 and 1 in height dimension
float x_max = 1.0f; // right coordinate between 0 and 1 in width dimension
};
A structure representing a region of the input image. Coordinates are between 0 and 1, the origin is at the top-left.
Constants¶
If the face-identification model is not confident about a face, it will output FACE_ID_UNIDENTIFIED
. If the model is confident that a face is not in the face library, it will output FACE_ID_NOT_IN_LIBRARY
.