Изменение структуры биометрической базы данных¶
В некоторых случаях вам может потребоваться применить новую структурную схему к биометрической базе данных Tarantool, например, при обновлении до последней версии продукта или если необходимо усовершенствовать структуру базы данных, добавив в нее дополнительные параметры, расширенные метаданные лиц и т. д.
В этом разделе:
О структуре биометрической базы данных¶
В FindFace Security структура базы данных задается через файл tnt_schema.lua
.
Структура представляет собой набор полей, каждое из которых описывается следующими параметрами:
- id: id поля;
- name: название поля, должно совпадать с названием соответствующего параметра лица;
- field_type: тип данных;
- default: значение по умолчанию. Если значение по умолчанию больше ‘1e14 – 1’, то его следует записывать в виде строки, т. е.
“123123..”
вместо123123..
.
Используемый по умолчанию файл tnt_schema.lua
приведен ниже:
meta_scheme = {
-- internal.normalized_id:
{
default = '',
field_type = 'string',
id = 1,
name = 'normalized_id',
},
-- internal.feat:
{
default = '',
field_type = 'string',
id = 2,
name = 'feat',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:acknowledged:
{
default = 0,
field_type = 'unsigned',
id = 3,
name = 'm:acknowledged',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:acknowledged_by:
{
default = 0,
field_type = 'unsigned',
id = 4,
name = 'm:acknowledged_by',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:acknowledged_date:
{
default = 0,
field_type = 'unsigned',
id = 5,
name = 'm:acknowledged_date',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:acknowledged_reaction:
{
default = '',
field_type = 'string',
id = 6,
name = 'm:acknowledged_reaction',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:camera:
{
default = 0,
field_type = 'unsigned',
id = 7,
name = 'm:camera',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:camera_group:
{
default = 0,
field_type = 'unsigned',
id = 8,
name = 'm:camera_group',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:confidence:
{
default = "10000000000000000000",
field_type = 'unsigned',
id = 9,
name = 'm:confidence',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:created_date:
{
default = 0,
field_type = 'unsigned',
id = 10,
name = 'm:created_date',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:episode:
{
default = 0,
field_type = 'unsigned',
id = 11,
name = 'm:episode',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:episode_open:
{
default = 0,
field_type = 'unsigned',
id = 12,
name = 'm:episode_open',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_age:
{
default = "10000000000000000000",
field_type = 'unsigned',
id = 13,
name = 'm:f_age',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_beard_class:
{
default = '',
field_type = 'string',
id = 14,
name = 'm:f_beard_class',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_beard_score:
{
default = "10000000000000000000",
field_type = 'unsigned',
id = 15,
name = 'm:f_beard_score',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_emotions_class:
{
default = '',
field_type = 'string',
id = 16,
name = 'm:f_emotions_class',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_emotions_score:
{
default = "10000000000000000000",
field_type = 'unsigned',
id = 17,
name = 'm:f_emotions_score',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_gender_class:
{
default = '',
field_type = 'string',
id = 18,
name = 'm:f_gender_class',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_gender_score:
{
default = "10000000000000000000",
field_type = 'unsigned',
id = 19,
name = 'm:f_gender_score',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_glasses_class:
{
default = '',
field_type = 'string',
id = 20,
name = 'm:f_glasses_class',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_glasses_score:
{
default = "10000000000000000000",
field_type = 'unsigned',
id = 21,
name = 'm:f_glasses_score',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_liveness_class:
{
default = '',
field_type = 'string',
id = 22,
name = 'm:f_liveness_class',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_liveness_score:
{
default = "10000000000000000000",
field_type = 'unsigned',
id = 23,
name = 'm:f_liveness_score',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_medmask_class:
{
default = '',
field_type = 'string',
id = 24,
name = 'm:f_medmask_class',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_medmask_score:
{
default = "10000000000000000000",
field_type = 'unsigned',
id = 25,
name = 'm:f_medmask_score',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_race_class:
{
default = '',
field_type = 'string',
id = 26,
name = 'm:f_race_class',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:f_race_score:
{
default = "10000000000000000000",
field_type = 'unsigned',
id = 27,
name = 'm:f_race_score',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:thumbnail:
{
default = '',
field_type = 'string',
id = 28,
name = 'm:thumbnail',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:frame:
{
default = '',
field_type = 'string',
id = 29,
name = 'm:frame',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:frame_coords_bottom:
{
default = 0,
field_type = 'unsigned',
id = 30,
name = 'm:frame_coords_bottom',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:frame_coords_left:
{
default = 0,
field_type = 'unsigned',
id = 31,
name = 'm:frame_coords_left',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:frame_coords_right:
{
default = 0,
field_type = 'unsigned',
id = 32,
name = 'm:frame_coords_right',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:frame_coords_top:
{
default = 0,
field_type = 'unsigned',
id = 33,
name = 'm:frame_coords_top',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:pk:
{
default = 0,
field_type = 'unsigned',
id = 34,
name = 'm:pk',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:matched:
{
default = 0,
field_type = 'unsigned',
id = 35,
name = 'm:matched',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:matched_dossier:
{
default = 0,
field_type = 'unsigned',
id = 36,
name = 'm:matched_dossier',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:matched_face:
{
default = 0,
field_type = 'unsigned',
id = 37,
name = 'm:matched_face',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:matched_lists:
{
default = {},
field_type = 'set[unsigned]',
id = 38,
name = 'm:matched_lists',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:normalized_photo:
{
default = '',
field_type = 'string',
id = 39,
name = 'm:normalized_photo',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:quality:
{
default = "10000000000000000000",
field_type = 'unsigned',
id = 40,
name = 'm:quality',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:scores:
{
default = '',
field_type = 'string',
id = 41,
name = 'm:scores',
},
-- <class 'ffsecurity.entities_tnt.event.models.ListEvent'>.m:video_source:
{
default = 0,
field_type = 'unsigned',
id = 42,
name = 'm:video_source',
},
-- <class 'ffsecurity.entities_tnt.dossier_face.models.DossierFace'>.m:dossier:
{
default = 0,
field_type = 'unsigned',
id = 43,
name = 'm:dossier',
},
-- <class 'ffsecurity.entities_tnt.dossier_face.models.DossierFace'>.m:modified_date:
{
default = 0,
field_type = 'unsigned',
id = 44,
name = 'm:modified_date',
},
-- <class 'ffsecurity.entities_tnt.dossier_face.models.DossierFace'>.m:source_photo:
{
default = '',
field_type = 'string',
id = 45,
name = 'm:source_photo',
},
-- <class 'ffsecurity.entities_tnt.dossier_face.models.DossierFace'>.m:source_photo_name:
{
default = '',
field_type = 'string',
id = 46,
name = 'm:source_photo_name',
},
}
-- Fields referenced by multiple models: m:frame_coords_left, m:frame_coords_right, m:frame_coords_top, m:pk, m:created_date, m:frame_coords_bottom, m:thumbnail
meta_indexes = {'m:episode', 'm:episode_open'}
Изменение структуры¶
Для изменения структуры базы данных выполните следующие действия:
Остановите сервис
findface-security
.sudo systemctl stop findface-security.service
Создайте резервную копию биометрической базы данных в любой выбранной директории, например,
/tmp/dump
.Совет
Подробнее см. Резервное копирование и восстановление хранилищ данных.
mkdir -p /tmp/dump cd /tmp/dump sudo findface-storage-api-dump -config /etc/findface-sf-api.ini
Подготовьте файл
tnt_schema.lua
с новой структурой базы данных.Измените структуру базы данных с помощью подготовленного файла
tnt_schema.lua
.sudo findface-security make_tnt_schema | sudo tee /etc/ffsecurity/tnt_schema.lua
Откройте файл конфигурации Tarantool. Убедитесь, что перед секцией
FindFace.start
добавлена строкаdofile("/etc/ffsecurity/tnt_schema.lua")
, а переменнаяmeta_scheme=meta_scheme
определена в параметрахFindFace.start
.sudo vi /etc/tarantool/instances.enabled/<shard_00N>.lua dofile("/etc/ffsecurity/tnt_schema.lua") FindFace.start("127.0.0.1", 8101, { license_ntls_server="127.0.0.1:3133", meta_scheme = meta_scheme })
Удалите базу данных Tarantool (базу по умолчанию или шарды).
sudo rm -f /opt/ntech/var/lib/tarantool/default/{index,snapshots,xlogs}/* sudo rm -f /opt/ntech/var/lib/tarantool/shard-001/{index,snapshots,xlogs}/* ... sudo rm -f /opt/ntech/var/lib/tarantool/shard-00N/{index,snapshots,xlogs}/*
Восстановите базу данных Tarantool из резервной копии.
Важно
Если некоторые прежние поля отсутствуют в новой структуре базы данных, сначала потребуется вручную удалить соответствующие данные из резервной копии.
cd /tmp/dump for x in *.json; do curl -X POST "http://127.0.0.1:18411/v2/galleries/${x%%.json}"; done for x in *.json; do sudo findface-storage-api-restore -config /etc/findface-sf-api.ini < "$x"; done
Запустите сервис
findface-security
.sudo systemctl start findface-security.service