# Human Face Recognition Models
## Model list
[supported]: https://img.shields.io/badge/-supported-green "supported"
| Chip | MFN_S8_V1 | MBF_S8_V1 |
|----------|------------------------|------------------------|
| ESP32-S3 | ![alt text][supported] | ![alt text][supported] |
| ESP32-P4 | ![alt text][supported] | ![alt text][supported] |
## Model Latency
| name | input(h*w*c) | preprocess(us) | model(us) | postprocess(us) |
|--------------|---------------|----------------|-----------|-----------------|
| mfn_s8_v1_s3 | 112 * 112 * 3 | 8380 | 248803 | 80 |
| mfn_s8_v1_p4 | 112 * 112 * 3 | 5198 | 93003 | 51 |
| mbf_s8_v1_s3 | 112 * 112 * 3 | 8386 | 1072427 | 81 |
| mbf_s8_v1_p4 | 112 * 112 * 3 | 5197 | 188221 | 52 |
## Model Metrics
| Model | Params(M) | GFLOPs | TAR@FAR=1E-4 on IJB-C(%) |
|-----------|-----------|--------|--------------------------|
| mfn_s8_v1 | 1.2 | 0.46 | 90.03 |
| mbf_s8_v1 | 3.4 | 0.90 | 93.94 |
## Model Usage
``HumanFaceFeat`` accepts a ``HumanFaceFeat::model_type_t`` parameter. It has a default value determined by [model type](#model-type) option in menuconfig.
### How to New `HumanFaceFeat`
#### Only One Model
```cpp
HumanFaceFeat *feat = new HumanFaceFeat();
```
#### Mutiple Models
```cpp
// use MFN_S8_V1
HumanFaceFeat *feat = new HumanFaceFeat(HumanFaceFeat::MFN_S8_V1);
// use MBF_S8_V1
// HumanFaceFeat *feat = new HumanFaceFeat(HumanFaceFeat::MBF_S8_V1);
```
> [!NOTE]
> If mutiple models is enabled in menuconfig, the default value is the first one. Pass in an explicit parameter to ``HumanFaceFeat`` to use one of them.
# Configurable Options in Menuconfig
See [Kconfig](Kconfig).
## Model Type
- CONFIG_HUMAN_FACE_FEAT_MFN_S8_V1
- CONFIG_HUMAN_FACE_FEAT_MBF_S8_V1
These options determines which models will be enabled.
> [!NOTE]
> - If model location is set to FLASH partition or FLASH rodata, only the selected model type will be flashed.
> - If model location is set to be in sdcard, all models will be selected automatically.
## Model Location
- CONFIG_HUMAN_FACE_FEAT_MODEL_IN_FLASH_RODATA
- CONFIG_HUMAN_FACE_FEAT_MODEL_IN_FLASH_PARTITION
- CONFIG_HUMAN_FACE_FEAT_MODEL_IN_SDCARD
This component supports to [load model](https://docs.espressif.com/projects/esp-dl/en/latest/tutorials/how_to_load_test_profile_model.html) from three different locations.
> [!NOTE]
> If model location is set to FLASH partition, `partition.csv` must contain a partition named `human_face_feat`, and the partition should be big enough to hold the model file.
## SDCard Directory
- CONFIG_HUMAN_FACE_FEAT_MODEL_SDCARD_DIR
When model locates in sdcard, you can change the model directory relative to the sdcard mount point.
The default value of this option is `models/s3` for ESP32S3 and `models/p4` for ESP32P4.
When using default value, just copy [models](models) folder to sdcard root directory.
> [!NOTE]
> Do not change the model name when copy the models to sdcard.
# Human Face Recognizer
This component also contains `HumanFaceRecognizer`. It's a integration of `HumanFaceFeat` and `dl::recognition::DataBase`. If you want to enroll/recognize a human face, in addition to `HumanFaceRecognizer`, you also need `HumanFaceDetect`. See [How to New HumanFaceDetect](https://github.com/espressif/esp-dl/blob/master/models/human_face_detect/README.md#how-to-new-humanfacedetect).
## How to New Human Face Recognizer
See [How to New HumanFaceFeat](#how-to-new-humanfacefeat), create a feature extractor first. Then pass it into `HumanFaceRecognizer`.
```cpp
HumanFaceRecognizer *human_face_recognizer = new HumanFaceRecognizer(feat, "path/to/database");
```
## How to Enroll a Human Face
```cpp
dl::image::img_t img = {.data=DATA, .width=WIDTH, .height=HEIGHT, .pix_type=PIX_TYPE};
human_face_recognizer->enroll(img, human_face_detect->run(img));
```
More details, see [`dl::image::img_t`](https://github.com/espressif/esp-dl/blob/master/esp-dl/vision/image/dl_image_define.hpp).
## How to Recognize a Human Face
```cpp
dl::image::img_t img = {.data=DATA, .width=WIDTH, .height=HEIGHT, .pix_type=PIX_TYPE};
std::vector<dl::recognition::result_t> res = human_face_recognizer->recognize(img, human_face_detect->run(img));
```
More details, see [`dl::image::img_t`](https://github.com/espressif/esp-dl/blob/master/esp-dl/vision/image/dl_image_define.hpp) and [`dl::recognition::result_t`](https://github.com/espressif/esp-dl/blob/master/esp-dl/vision/recognition/dl_recognition_define.hpp).
## How to Delete Featrue in Database
### Delete all Features
```cpp
human_face_recognizer->clear_all_feats();
```
### Delete Last Feature
```cpp
human_face_recognizer->delete_last_feat();
```
### Delete Feature by Index
```cpp
human_face_recognizer->delete_feat(index);
```
bf2ee2cbdc18dd43d415ced66a75c6fc0b8247a3
idf.py add-dependency "espressif/human_face_recognition^0.2.1"