Dynamic Person Creation
You can tailor FindFace Enterprise Server SDK to work in video surveillance and video analytics systems. To do so, harness the Dynamic Person Creation feature.
In this section:
How it works
An image containing a face (for example, extracted from a RTSP video stream by the video face detector) is sent via a
/face POST
request to FindFace Server for identification.When identifying a person, the system uses a face property
person_id
. For each person in the database, the value of this property should be unique.FindFace Server takes the new face and searches for the most similar one in the database (the so-called reference face). If similarity between the faces is equal or exceeds the threshold specified in the
findface-facenapi.ini
configuration file (person_identify_threshold
), the new face is added to the database and assigned the sameperson_id
value as the reference face. It also inherits some other reference face properties. This means that the new face has been identified as belonging to an existing person.If similarity between the faces does not exceed the given threshold, the system considers the new face as unidentified. In this case, the new face is added to the database as belonging to a new person, with a new
person_id
.In either case, FindFace Server returns a response containing the
person_id
value assigned to the added face. This value can be then used in analysis.
Предупреждение
On account of the very logic of dynamic person creation, resembling faces of different people can be identified as belonging to one person and get the same person_id
. To avoid this situation, we recommend you to periodically inspect the person database and manually resolve each identity conflict.
Configure Dynamic Person Creation
By default, dynamic person creation is disabled. This means that all newly added faces are not assigned the person_id property and the system does not discern persons.
To enable dynamic person creation, do the following:
Open the
findface-facenapi.ini
configuration file for editing.sudo vi /etc/findface-facenapi.ini
Edit the settings.
Предупреждение
The
findface-facenapi.ini
content must be correct Python code.Uncomment and edit the line
person_identify = False
. This will enable dynamic person creation.→ person_identify = True
By default, dynamic person creation is performed independently for each camera. To merge person identification results across all cameras, uncomment and edit the line
person_identify_global = False
. This option works well only in small-scale systems with less than 5 cameras. Otherwise, leave it deactivated.→ person_identify_global = True
Uncomment and set the threshold for person identification between 0 and 1.
→ person_identify_threshold = 0.75
Restart the service.
sudo service findface-facenapi restart
REST API Sequence for Person Dataset Analysis
There are many ways to harness the dynamic person creation feature in analytics. A typical REST API sequence to identify a person and then work with their data is the following:
# |
Method |
Description |
---|---|---|
1 |
/face POST |
Add a face to the database and receive a JSON representation of it, including the person_id value. |
2 |
/history/search POST |
Retrieve all events from the history of cameras, related to the person whose person_id was received in the /face POST response. |
Method /face POST
Request
POST /v0/face/ HTTP/1.1
Host: 127.0.0.1
Authorization: Token e93437ccdae66d57a45a5c6d9aa7602e
Content-Type: application/json
Content-Length: [length]
{
"photo": "http://static.findface.pro/sample.jpg"
}
Response
HTTP/1.1 200 OK
Date: Mon, 13 Jun 2016 12:23:56 GMT
Content-Type: application/json
Content-Length: [length]
{
"results": {
"[595, 127, 812, 344]": [
{
"confidence": 1,
"face": {
"friend": false,
"galleries": [
"default"
],
"id": 2,
"meta": "Jack Smith",
"normalized": "http://192.168.113.76:3333/uploads/20170418/1492509569217098.jpeg",
"person_id": 2,
"photo": "http://192.168.113.76:3333/uploads/20170418/14925095692111893.jpeg",
"photo_hash": "53477c4a72f52c6efc951d9c7ece42bc",
"thumbnail": "http://192.168.113.76:3333/uploads/20170418/14925095692159095.jpeg",
"timestamp": "2017-04-18T09:59:29.211000",
"x1": 595,
"x2": 812,
"y1": 127,
"y2": 344
}
}
]
}
}
Method /history/search POST
Request
POST /v0/history/search HTTP/1.1
Host: 127.0.0.1
Authorization: Token e93437ccdae66d57a45a5c6d9aa7602e
Content-Type: application/json
Content-Length: [length]
{
"person_id": 2,
}
Response
HTTP/1.1 200 OK
Date: Mon, 13 Jun 2016 12:23:56 GMT
Content-Type: application/json
Content-Length: [length]
{
"next_page": "/v0/history/search?max_id=4",
"results":[
{
"friend":false,
"meta":"Jack Smith",
"photo_hash":"9fda49f2444f93c33ad8aa914e20e53b",
"cam_id":"12345678123456781234567812345678",
"person_id":2,
"timesamp":"2016-10-11T14:36:27.450000",
"photo":"http://192.168.113.76:3333/uploads/20170418/149250956922566.jpeg",
"id":20146,
"y1":77,
"x1":285,
"x2":552,
"y2":345
},
{
"friend":false,
"meta":"Jack Smith",
"photo_hash":"dc7ac54590729669ca869a18d92cd05e",
"cam_id":"12345678123456781234567812345678",
"person_id":2,
"timesamp":"2016-10-12T12:57:07.509000",
"photo":"http://192.168.113.76:3333/uploads/20170418/14925095692111596.jpeg",
"id":20147,
"x1":236,
"y1":345,
"x2":311,
"y2":419
}
]
}
Other API Methods to Work with Persons
Add and change person_id
To add or change the person_id
value for a particular face, use the method PUT /face/id/<face_id>
.
Предупреждение
Since the person_id
property is assigned only to newly added faces, old faces in the database are excluded from the person identification process. Use the method PUT /face/id/<face_id>
to solve the problem.
Request
PUT /v0/face/id/5/ HTTP/1.1
Host: 127.0.0.1
Authorization: Token e93437ccdae66d57a45a5c6d9aa7602e
Content-Type: application/json
Content-Length: [length]
{
"person_id": "4"
}
Response
HTTP/1.1 200 OK
Date: Mon, 13 Jun 2016 12:23:56 GMT
Content-Type: application/json
Content-Length: [length]
{
"id": 5,
"meta": "Jane Richardson",
"person_id": "4",
"photo": "http://static.findface.pro/sample2.jpg",
"photo_hash": "dc7ac54590729669ca869a18d92cd05e",
"timestamp": "2016-06-13T11:06:42.075754",
"x1": 225,
"x2": 307,
"y1": 345,
"y2": 428
}
Retrieve person history
To retrieve all events from the history of cameras, related to the person with a given person_id
, you can use the method GET /person/history/id/<person_id>
(equally with /history/search POST
).
Request
GET v0/person/history/id/2001 HTTP/1.1
Host: 127.0.0.1
Authorization: Token e93437ccdae66d57a45a5c6d9aa7602e
Content-Type: application/json
Content-Length: [length]
{
"cam_ids": [1, 25, 26, 27],
"start": "2016-06-13T11:00:00.000000",
"end": "2016-06-14T11:00:00.000000"
}
Response
HTTP/1.1 200 OK
Date: Mon, 13 Jun 2016 12:23:56 GMT
Content-Type: application/json
Content-Length: [length]
{
"results":
[
{
"person_id": 2001,
"face_id": 240344,
"cam_id": 25,
"meta": "Sam Berry",
"screenshot":"https://static.findface.pro/57726179d6946f02f3763824/dc7ac54590729669ca869a18d92cd05e_thumb.j
pg",
"timestamp": "2016-06-13T11:06:42.075754",
},
{
"person_id": 2001,
"face_id": 240422,
"cam_id": 25,
"meta": "Sam Berry",
"screenshot": "https://static.findface.pro/57726179
d6946f02f3763824/dc7ac54590729669ca869a18d92cd05e_thumb.j
pg",
"timestamp": "2016-06-13T11:08:44.073452",
}
]
}
List persons
To get the list of all existing persons, use the method GET /persons
.
Request
GET /v0/persons HTTP/1.1
Host: 127.0.0.1
Authorization: Token e93437ccdae66d57a45a5c6d9aa7602e
Response
HTTP/1.1 200 OK
Date: Mon, 13 Jun 2016 12:23:56 GMT
Content-Type: application/json
Content-Length: [length]
{
"results": [
{
"id": 2,
"meta": ""
}
]
}