From fa61b3bffedc0c5b65de69c1a550c7c07d437faa Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Wed, 9 Jan 2019 19:31:46 +0100 Subject: [PATCH] Update IDF to e931fe9 and add esp-face (#2291) * Update IDF to e931fe9 and add esp-face * Fix PIO builds fail because of sketch size * Fix example build failing for Arduino --- boards.txt | 3 + .../CameraWebServer/CameraWebServer.ino | 4 +- .../Camera/CameraWebServer/app_httpd.cpp | 345 ++++++++++++- .../Camera/CameraWebServer/camera_index.h | 462 +++++++++--------- platform.txt | 4 +- tools/build.py | 1 + tools/partitions/huge_app.csv | 6 + tools/platformio-build.py | 6 +- tools/sdk/bin/bootloader_qout_40m.bin | Bin 17680 -> 17680 bytes tools/sdk/bin/bootloader_qout_80m.bin | Bin 17664 -> 17664 bytes tools/sdk/include/bt/esp_gap_ble_api.h | 2 +- tools/sdk/include/config/sdkconfig.h | 2 + tools/sdk/include/esp-face/dl_lib.h | 336 +++++++++++++ .../include/esp-face/dl_lib_coefgetter_if.h | 47 ++ tools/sdk/include/esp-face/dl_lib_matrix.h | 216 ++++++++ tools/sdk/include/esp-face/dl_lib_matrix3d.h | 420 ++++++++++++++++ tools/sdk/include/esp-face/dl_lib_matrix3dq.h | 119 +++++ tools/sdk/include/esp-face/dl_lib_matrixq.h | 359 ++++++++++++++ tools/sdk/include/esp-face/fd_forward.h | 64 +++ tools/sdk/include/esp-face/fr_flash.h | 45 ++ tools/sdk/include/esp-face/fr_forward.h | 116 +++++ tools/sdk/include/esp-face/frmn.h | 28 ++ tools/sdk/include/esp-face/image_util.h | 275 +++++++++++ tools/sdk/include/esp-face/mtmn.h | 99 ++++ tools/sdk/include/esp32/esp_attr.h | 2 + .../esp_https_server/esp_https_server.h | 12 + tools/sdk/include/fb_gfx/fb_gfx.h | 44 ++ tools/sdk/include/lwip/arch/sys_arch.h | 20 +- tools/sdk/include/lwip/lwip/api.h | 9 - tools/sdk/include/lwip/sys_arch.h | 20 +- tools/sdk/lib/libapp_trace.a | Bin 23000 -> 23000 bytes tools/sdk/lib/libapp_update.a | Bin 77222 -> 77222 bytes tools/sdk/lib/libasio.a | Bin 2004696 -> 2004696 bytes tools/sdk/lib/libbootloader_support.a | Bin 308294 -> 308294 bytes tools/sdk/lib/libbt.a | Bin 13129006 -> 13130114 bytes tools/sdk/lib/libcoap.a | Bin 458066 -> 458066 bytes tools/sdk/lib/libcoexist.a | Bin 45304 -> 45304 bytes tools/sdk/lib/libconsole.a | Bin 401616 -> 401616 bytes tools/sdk/lib/libcore.a | Bin 6724 -> 6724 bytes tools/sdk/lib/libcxx.a | Bin 63624 -> 63624 bytes tools/sdk/lib/libdl_lib.a | Bin 0 -> 641850 bytes tools/sdk/lib/libdriver.a | Bin 2479858 -> 2479858 bytes tools/sdk/lib/libesp-tls.a | Bin 80236 -> 80236 bytes tools/sdk/lib/libesp32-camera.a | Bin 482444 -> 482788 bytes tools/sdk/lib/libesp32.a | Bin 1338820 -> 1340192 bytes tools/sdk/lib/libesp_adc_cal.a | Bin 39920 -> 39920 bytes tools/sdk/lib/libesp_event.a | Bin 88654 -> 88654 bytes tools/sdk/lib/libesp_http_client.a | Bin 181314 -> 181530 bytes tools/sdk/lib/libesp_http_server.a | Bin 255858 -> 255858 bytes tools/sdk/lib/libesp_https_ota.a | Bin 20518 -> 20518 bytes tools/sdk/lib/libesp_https_server.a | Bin 32984 -> 32984 bytes tools/sdk/lib/libesp_ringbuf.a | Bin 118268 -> 118268 bytes tools/sdk/lib/libespnow.a | Bin 46530 -> 46530 bytes tools/sdk/lib/libethernet.a | Bin 164444 -> 164444 bytes tools/sdk/lib/libexpat.a | Bin 1219082 -> 1219082 bytes tools/sdk/lib/libface_detection.a | Bin 0 -> 35660 bytes tools/sdk/lib/libface_recognition.a | Bin 0 -> 53802 bytes tools/sdk/lib/libfatfs.a | Bin 466476 -> 466476 bytes tools/sdk/lib/libfb_gfx.a | Bin 0 -> 22804 bytes tools/sdk/lib/libfd_coefficients.a | Bin 0 -> 360000 bytes tools/sdk/lib/libfr_coefficients.a | Bin 0 -> 1229838 bytes tools/sdk/lib/libfreemodbus.a | Bin 247040 -> 247040 bytes tools/sdk/lib/libfreertos.a | Bin 535988 -> 535988 bytes tools/sdk/lib/libfrmn.a | Bin 0 -> 76668 bytes tools/sdk/lib/libheap.a | Bin 236234 -> 236234 bytes tools/sdk/lib/libimage_util.a | Bin 0 -> 48310 bytes tools/sdk/lib/libjsmn.a | Bin 21694 -> 21694 bytes tools/sdk/lib/libjson.a | Bin 300090 -> 300090 bytes tools/sdk/lib/liblib.a | 1 + tools/sdk/lib/liblibsodium.a | Bin 1814296 -> 1814296 bytes tools/sdk/lib/liblog.a | Bin 41348 -> 41348 bytes tools/sdk/lib/liblwip.a | Bin 3295892 -> 3295156 bytes tools/sdk/lib/libmbedtls.a | Bin 3430756 -> 3430756 bytes tools/sdk/lib/libmdns.a | Bin 676268 -> 676268 bytes tools/sdk/lib/libmesh.a | Bin 883212 -> 883212 bytes tools/sdk/lib/libmicro-ecc.a | Bin 155340 -> 155340 bytes tools/sdk/lib/libmqtt.a | Bin 177780 -> 177780 bytes tools/sdk/lib/libmtmn.a | Bin 0 -> 27132 bytes tools/sdk/lib/libnet80211.a | Bin 1012204 -> 1013540 bytes tools/sdk/lib/libnewlib.a | Bin 134510 -> 134510 bytes tools/sdk/lib/libnghttp.a | Bin 1560590 -> 1560590 bytes tools/sdk/lib/libnvs_flash.a | Bin 840512 -> 840512 bytes tools/sdk/lib/libopenssl.a | Bin 288624 -> 288624 bytes tools/sdk/lib/libpp.a | Bin 477730 -> 477166 bytes tools/sdk/lib/libprotobuf-c.a | Bin 329210 -> 329210 bytes tools/sdk/lib/libprotocomm.a | Bin 424886 -> 424886 bytes tools/sdk/lib/libpthread.a | Bin 122114 -> 123322 bytes tools/sdk/lib/libsdmmc.a | Bin 255528 -> 255528 bytes tools/sdk/lib/libsmartconfig.a | Bin 104474 -> 104474 bytes tools/sdk/lib/libsmartconfig_ack.a | Bin 22294 -> 22294 bytes tools/sdk/lib/libsoc.a | Bin 232708 -> 232708 bytes tools/sdk/lib/libspi_flash.a | Bin 223100 -> 223100 bytes tools/sdk/lib/libspiffs.a | Bin 590326 -> 590326 bytes tools/sdk/lib/libtcp_transport.a | Bin 145892 -> 145892 bytes tools/sdk/lib/libtcpip_adapter.a | Bin 134932 -> 134932 bytes tools/sdk/lib/libulp.a | Bin 37430 -> 37430 bytes tools/sdk/lib/libunity.a | Bin 174150 -> 174150 bytes tools/sdk/lib/libvfs.a | Bin 243510 -> 243510 bytes tools/sdk/lib/libwear_levelling.a | Bin 235920 -> 235920 bytes tools/sdk/lib/libwifi_provisioning.a | Bin 147522 -> 147522 bytes tools/sdk/lib/libwpa.a | Bin 158180 -> 158180 bytes tools/sdk/lib/libwpa2.a | Bin 25158 -> 25158 bytes tools/sdk/lib/libwpa_supplicant.a | Bin 3099006 -> 3099006 bytes tools/sdk/lib/libwps.a | Bin 53020 -> 53020 bytes tools/sdk/lib/libxtensa-debug-module.a | Bin 12130 -> 12130 bytes tools/sdk/sdkconfig | 3 + 106 files changed, 2794 insertions(+), 276 deletions(-) create mode 100644 tools/partitions/huge_app.csv create mode 100644 tools/sdk/include/esp-face/dl_lib.h create mode 100644 tools/sdk/include/esp-face/dl_lib_coefgetter_if.h create mode 100644 tools/sdk/include/esp-face/dl_lib_matrix.h create mode 100644 tools/sdk/include/esp-face/dl_lib_matrix3d.h create mode 100644 tools/sdk/include/esp-face/dl_lib_matrix3dq.h create mode 100644 tools/sdk/include/esp-face/dl_lib_matrixq.h create mode 100644 tools/sdk/include/esp-face/fd_forward.h create mode 100644 tools/sdk/include/esp-face/fr_flash.h create mode 100644 tools/sdk/include/esp-face/fr_forward.h create mode 100644 tools/sdk/include/esp-face/frmn.h create mode 100644 tools/sdk/include/esp-face/image_util.h create mode 100644 tools/sdk/include/esp-face/mtmn.h create mode 100644 tools/sdk/include/fb_gfx/fb_gfx.h create mode 100644 tools/sdk/lib/libdl_lib.a create mode 100644 tools/sdk/lib/libface_detection.a create mode 100644 tools/sdk/lib/libface_recognition.a create mode 100644 tools/sdk/lib/libfb_gfx.a create mode 100644 tools/sdk/lib/libfd_coefficients.a create mode 100644 tools/sdk/lib/libfr_coefficients.a create mode 100644 tools/sdk/lib/libfrmn.a create mode 100644 tools/sdk/lib/libimage_util.a create mode 100644 tools/sdk/lib/liblib.a create mode 100644 tools/sdk/lib/libmtmn.a diff --git a/boards.txt b/boards.txt index 6cf8ee74..9949c241 100644 --- a/boards.txt +++ b/boards.txt @@ -44,6 +44,9 @@ esp32.menu.PartitionScheme.minimal.build.partitions=minimal esp32.menu.PartitionScheme.no_ota=No OTA (Large APP) esp32.menu.PartitionScheme.no_ota.build.partitions=no_ota esp32.menu.PartitionScheme.no_ota.upload.maximum_size=2097152 +esp32.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA) +esp32.menu.PartitionScheme.huge_app.build.partitions=huge_app +esp32.menu.PartitionScheme.huge_app.upload.maximum_size=3145728 esp32.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (Large APPS with OTA) esp32.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs esp32.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080 diff --git a/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino b/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino index 19b91610..0b20604b 100644 --- a/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino +++ b/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino @@ -124,7 +124,7 @@ void setup() { //drop down frame size for higher initial frame rate sensor_t * s = esp_camera_sensor_get(); - s->set_framesize(s, FRAMESIZE_CIF); + s->set_framesize(s, FRAMESIZE_QVGA); WiFi.begin(ssid, password); @@ -144,5 +144,5 @@ void setup() { void loop() { // put your main code here, to run repeatedly: - + delay(10000); } diff --git a/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp b/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp index a78767b5..2b454f4a 100644 --- a/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp +++ b/libraries/ESP32/examples/Camera/CameraWebServer/app_httpd.cpp @@ -18,6 +18,23 @@ #include "camera_index.h" #include "Arduino.h" +#include "fb_gfx.h" +#include "fd_forward.h" +#include "dl_lib.h" +#include "fr_forward.h" + +#define ENROLL_CONFIRM_TIMES 5 +#define FACE_ID_SAVE_NUMBER 7 + +#define FACE_COLOR_WHITE 0x00FFFFFF +#define FACE_COLOR_BLACK 0x00000000 +#define FACE_COLOR_RED 0x000000FF +#define FACE_COLOR_GREEN 0x0000FF00 +#define FACE_COLOR_BLUE 0x00FF0000 +#define FACE_COLOR_YELLOW (FACE_COLOR_RED | FACE_COLOR_GREEN) +#define FACE_COLOR_CYAN (FACE_COLOR_BLUE | FACE_COLOR_GREEN) +#define FACE_COLOR_PURPLE (FACE_COLOR_BLUE | FACE_COLOR_RED) + typedef struct { size_t size; //number of values used for filtering size_t index; //current value index @@ -40,6 +57,12 @@ static ra_filter_t ra_filter; httpd_handle_t stream_httpd = NULL; httpd_handle_t camera_httpd = NULL; +static mtmn_config_t mtmn_config = {0}; +static int8_t detection_enabled = 0; +static int8_t recognition_enabled = 0; +static int8_t is_enrolling = 0; +static face_id_list id_list = {0}; + static ra_filter_t * ra_filter_init(ra_filter_t * filter, size_t sample_size){ memset(filter, 0, sizeof(ra_filter_t)); @@ -68,6 +91,119 @@ static int ra_filter_run(ra_filter_t * filter, int value){ return filter->sum / filter->count; } +static void rgb_print(dl_matrix3du_t *image_matrix, uint32_t color, const char * str){ + fb_data_t fb; + fb.width = image_matrix->w; + fb.height = image_matrix->h; + fb.data = image_matrix->item; + fb.bytes_per_pixel = 3; + fb.format = FB_BGR888; + fb_gfx_print(&fb, (fb.width - (strlen(str) * 14)) / 2, 10, color, str); +} + +static int rgb_printf(dl_matrix3du_t *image_matrix, uint32_t color, const char *format, ...){ + char loc_buf[64]; + char * temp = loc_buf; + int len; + va_list arg; + va_list copy; + va_start(arg, format); + va_copy(copy, arg); + len = vsnprintf(loc_buf, sizeof(loc_buf), format, arg); + va_end(copy); + if(len >= sizeof(loc_buf)){ + temp = (char*)malloc(len+1); + if(temp == NULL) { + return 0; + } + } + vsnprintf(temp, len+1, format, arg); + va_end(arg); + rgb_print(image_matrix, color, temp); + if(len > 64){ + free(temp); + } + return len; +} + +static void draw_face_boxes(dl_matrix3du_t *image_matrix, box_array_t *boxes, int face_id){ + int x, y, w, h, i; + uint32_t color = FACE_COLOR_YELLOW; + if(face_id < 0){ + color = FACE_COLOR_RED; + } else if(face_id > 0){ + color = FACE_COLOR_GREEN; + } + fb_data_t fb; + fb.width = image_matrix->w; + fb.height = image_matrix->h; + fb.data = image_matrix->item; + fb.bytes_per_pixel = 3; + fb.format = FB_BGR888; + for (i = 0; i < boxes->len; i++){ + // rectangle box + x = (int)boxes->box[i].box_p[0]; + y = (int)boxes->box[i].box_p[1]; + w = (int)boxes->box[i].box_p[2] - x + 1; + h = (int)boxes->box[i].box_p[3] - y + 1; + fb_gfx_drawFastHLine(&fb, x, y, w, color); + fb_gfx_drawFastHLine(&fb, x, y+h-1, w, color); + fb_gfx_drawFastVLine(&fb, x, y, h, color); + fb_gfx_drawFastVLine(&fb, x+w-1, y, h, color); +#if 0 + // landmark + int x0, y0, j; + for (j = 0; j < 10; j+=2) { + x0 = (int)boxes->landmark[i].landmark_p[j]; + y0 = (int)boxes->landmark[i].landmark_p[j+1]; + fb_gfx_fillRect(&fb, x0, y0, 3, 3, color); + } +#endif + } +} + +static int run_face_recognition(dl_matrix3du_t *image_matrix, box_array_t *net_boxes){ + dl_matrix3du_t *aligned_face = NULL; + int matched_id = 0; + + aligned_face = dl_matrix3du_alloc(1, FACE_WIDTH, FACE_HEIGHT, 3); + if(!aligned_face){ + Serial.println("Could not allocate face recognition buffer"); + return matched_id; + } + if (align_face(net_boxes, image_matrix, aligned_face) == ESP_OK){ + if (is_enrolling == 1){ + int8_t left_sample_face = enroll_face(&id_list, aligned_face); + + if(left_sample_face == (ENROLL_CONFIRM_TIMES - 1)){ + Serial.printf("Enrolling Face ID: %d\n", id_list.tail); + } + Serial.printf("Enrolling Face ID: %d sample %d\n", id_list.tail, ENROLL_CONFIRM_TIMES - left_sample_face); + rgb_printf(image_matrix, FACE_COLOR_CYAN, "ID[%u] Sample[%u]", id_list.tail, ENROLL_CONFIRM_TIMES - left_sample_face); + if (left_sample_face == 0){ + is_enrolling = 0; + Serial.printf("Enrolled Face ID: %d\n", id_list.tail); + } + } else { + matched_id = recognize_face(&id_list, aligned_face); + if (matched_id >= 0) { + Serial.printf("Match Face ID: %u\n", matched_id); + rgb_printf(image_matrix, FACE_COLOR_GREEN, "Hello Subject %u", matched_id); + } else { + Serial.println("No Match Found"); + rgb_print(image_matrix, FACE_COLOR_RED, "Intruder Alert!"); + matched_id = -1; + } + } + } else { + Serial.println("Face Not Aligned"); + //rgb_print(image_matrix, FACE_COLOR_YELLOW, "Human Detected"); + } + + dl_matrix3du_free(aligned_face); + return matched_id; +} + static size_t jpg_encode_stream(void * arg, size_t index, const void* data, size_t len){ jpg_chunking_t *j = (jpg_chunking_t *)arg; if(!index){ @@ -87,7 +223,7 @@ static esp_err_t capture_handler(httpd_req_t *req){ fb = esp_camera_fb_get(); if (!fb) { - Serial.printf("Camera capture failed"); + Serial.println("Camera capture failed"); httpd_resp_send_500(req); return ESP_FAIL; } @@ -95,19 +231,73 @@ static esp_err_t capture_handler(httpd_req_t *req){ httpd_resp_set_type(req, "image/jpeg"); httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg"); - size_t fb_len = 0; - if(fb->format == PIXFORMAT_JPEG){ - fb_len = fb->len; - res = httpd_resp_send(req, (const char *)fb->buf, fb->len); - } else { - jpg_chunking_t jchunk = {req, 0}; - res = frame2jpg_cb(fb, 80, jpg_encode_stream, &jchunk)?ESP_OK:ESP_FAIL; - httpd_resp_send_chunk(req, NULL, 0); - fb_len = jchunk.len; + size_t out_len, out_width, out_height; + uint8_t * out_buf; + bool s; + bool detected = false; + int face_id = 0; + if(!detection_enabled || fb->width > 400){ + size_t fb_len = 0; + if(fb->format == PIXFORMAT_JPEG){ + fb_len = fb->len; + res = httpd_resp_send(req, (const char *)fb->buf, fb->len); + } else { + jpg_chunking_t jchunk = {req, 0}; + res = frame2jpg_cb(fb, 80, jpg_encode_stream, &jchunk)?ESP_OK:ESP_FAIL; + httpd_resp_send_chunk(req, NULL, 0); + fb_len = jchunk.len; + } + esp_camera_fb_return(fb); + int64_t fr_end = esp_timer_get_time(); + Serial.printf("JPG: %uB %ums\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start)/1000)); + return res; } + + dl_matrix3du_t *image_matrix = dl_matrix3du_alloc(1, fb->width, fb->height, 3); + if (!image_matrix) { + esp_camera_fb_return(fb); + Serial.println("dl_matrix3du_alloc failed"); + httpd_resp_send_500(req); + return ESP_FAIL; + } + + out_buf = image_matrix->item; + out_len = fb->width * fb->height * 3; + out_width = fb->width; + out_height = fb->height; + + s = fmt2rgb888(fb->buf, fb->len, fb->format, out_buf); esp_camera_fb_return(fb); + if(!s){ + dl_matrix3du_free(image_matrix); + Serial.println("to rgb888 failed"); + httpd_resp_send_500(req); + return ESP_FAIL; + } + + box_array_t *net_boxes = face_detect(image_matrix, &mtmn_config); + + if (net_boxes){ + detected = true; + if(recognition_enabled){ + face_id = run_face_recognition(image_matrix, net_boxes); + } + draw_face_boxes(image_matrix, net_boxes, face_id); + free(net_boxes->box); + free(net_boxes->landmark); + free(net_boxes); + } + + jpg_chunking_t jchunk = {req, 0}; + s = fmt2jpg_cb(out_buf, out_len, out_width, out_height, PIXFORMAT_RGB888, 90, jpg_encode_stream, &jchunk); + dl_matrix3du_free(image_matrix); + if(!s){ + Serial.println("JPEG compression failed"); + return ESP_FAIL; + } + int64_t fr_end = esp_timer_get_time(); - Serial.printf("JPG: %uB %ums", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start)/1000)); + Serial.printf("FACE: %uB %ums %s%d\n", (uint32_t)(jchunk.len), (uint32_t)((fr_end - fr_start)/1000), detected?"DETECTED ":"", face_id); return res; } @@ -117,6 +307,14 @@ static esp_err_t stream_handler(httpd_req_t *req){ size_t _jpg_buf_len = 0; uint8_t * _jpg_buf = NULL; char * part_buf[64]; + dl_matrix3du_t *image_matrix = NULL; + bool detected = false; + int face_id = 0; + int64_t fr_start = 0; + int64_t fr_ready = 0; + int64_t fr_face = 0; + int64_t fr_recognize = 0; + int64_t fr_encode = 0; static int64_t last_frame = 0; if(!last_frame) { @@ -129,22 +327,76 @@ static esp_err_t stream_handler(httpd_req_t *req){ } while(true){ + detected = false; + face_id = 0; fb = esp_camera_fb_get(); if (!fb) { - Serial.printf("Camera capture failed"); + Serial.println("Camera capture failed"); res = ESP_FAIL; } else { - if(fb->format != PIXFORMAT_JPEG){ - bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len); - esp_camera_fb_return(fb); - fb = NULL; - if(!jpeg_converted){ - Serial.printf("JPEG compression failed"); - res = ESP_FAIL; + fr_start = esp_timer_get_time(); + fr_ready = fr_start; + fr_face = fr_start; + fr_encode = fr_start; + fr_recognize = fr_start; + if(!detection_enabled || fb->width > 400){ + if(fb->format != PIXFORMAT_JPEG){ + bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len); + esp_camera_fb_return(fb); + fb = NULL; + if(!jpeg_converted){ + Serial.println("JPEG compression failed"); + res = ESP_FAIL; + } + } else { + _jpg_buf_len = fb->len; + _jpg_buf = fb->buf; } } else { - _jpg_buf_len = fb->len; - _jpg_buf = fb->buf; + + image_matrix = dl_matrix3du_alloc(1, fb->width, fb->height, 3); + + if (!image_matrix) { + Serial.println("dl_matrix3du_alloc failed"); + res = ESP_FAIL; + } else { + if(!fmt2rgb888(fb->buf, fb->len, fb->format, image_matrix->item)){ + Serial.println("fmt2rgb888 failed"); + res = ESP_FAIL; + } else { + fr_ready = esp_timer_get_time(); + box_array_t *net_boxes = NULL; + if(detection_enabled){ + net_boxes = face_detect(image_matrix, &mtmn_config); + } + fr_face = esp_timer_get_time(); + fr_recognize = fr_face; + if (net_boxes || fb->format != PIXFORMAT_JPEG){ + if(net_boxes){ + detected = true; + if(recognition_enabled){ + face_id = run_face_recognition(image_matrix, net_boxes); + } + fr_recognize = esp_timer_get_time(); + draw_face_boxes(image_matrix, net_boxes, face_id); + free(net_boxes->box); + free(net_boxes->landmark); + free(net_boxes); + } + if(!fmt2jpg(image_matrix->item, fb->width*fb->height*3, fb->width, fb->height, PIXFORMAT_RGB888, 90, &_jpg_buf, &_jpg_buf_len)){ + Serial.println("fmt2jpg failed"); + res = ESP_FAIL; + } + esp_camera_fb_return(fb); + fb = NULL; + } else { + _jpg_buf = fb->buf; + _jpg_buf_len = fb->len; + } + fr_encode = esp_timer_get_time(); + } + dl_matrix3du_free(image_matrix); + } } } if(res == ESP_OK){ @@ -170,14 +422,22 @@ static esp_err_t stream_handler(httpd_req_t *req){ } int64_t fr_end = esp_timer_get_time(); + int64_t ready_time = (fr_ready - fr_start)/1000; + int64_t face_time = (fr_face - fr_ready)/1000; + int64_t recognize_time = (fr_recognize - fr_face)/1000; + int64_t encode_time = (fr_encode - fr_recognize)/1000; + int64_t process_time = (fr_encode - fr_start)/1000; + int64_t frame_time = fr_end - last_frame; last_frame = fr_end; frame_time /= 1000; uint32_t avg_frame_time = ra_filter_run(&ra_filter, frame_time); - Serial.printf("MJPG: %uB %ums (%.1ffps), AVG: %ums (%.1ffps)" - ,(uint32_t)(_jpg_buf_len), + Serial.printf("MJPG: %uB %ums (%.1ffps), AVG: %ums (%.1ffps), %u+%u+%u+%u=%u %s%d\n", + (uint32_t)(_jpg_buf_len), (uint32_t)frame_time, 1000.0 / (uint32_t)frame_time, - avg_frame_time, 1000.0 / avg_frame_time + avg_frame_time, 1000.0 / avg_frame_time, + (uint32_t)ready_time, (uint32_t)face_time, (uint32_t)recognize_time, (uint32_t)encode_time, (uint32_t)process_time, + (detected)?"DETECTED ":"", face_id ); } @@ -247,6 +507,19 @@ static esp_err_t cmd_handler(httpd_req_t *req){ else if(!strcmp(variable, "special_effect")) res = s->set_special_effect(s, val); else if(!strcmp(variable, "wb_mode")) res = s->set_wb_mode(s, val); else if(!strcmp(variable, "ae_level")) res = s->set_ae_level(s, val); + else if(!strcmp(variable, "face_detect")) { + detection_enabled = val; + if(!detection_enabled) { + recognition_enabled = 0; + } + } + else if(!strcmp(variable, "face_enroll")) is_enrolling = val; + else if(!strcmp(variable, "face_recognize")) { + recognition_enabled = val; + if(recognition_enabled){ + detection_enabled = val; + } + } else { res = -1; } @@ -286,9 +559,13 @@ static esp_err_t status_handler(httpd_req_t *req){ p+=sprintf(p, "\"wpc\":%u,", s->status.wpc); p+=sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); p+=sprintf(p, "\"lenc\":%u,", s->status.lenc); + p+=sprintf(p, "\"vflip\":%u,", s->status.vflip); p+=sprintf(p, "\"hmirror\":%u,", s->status.hmirror); p+=sprintf(p, "\"dcw\":%u,", s->status.dcw); - p+=sprintf(p, "\"colorbar\":%u", s->status.colorbar); + p+=sprintf(p, "\"colorbar\":%u,", s->status.colorbar); + p+=sprintf(p, "\"face_detect\":%u,", detection_enabled); + p+=sprintf(p, "\"face_enroll\":%u,", is_enrolling); + p+=sprintf(p, "\"face_recognize\":%u", recognition_enabled); *p++ = '}'; *p++ = 0; httpd_resp_set_type(req, "application/json"); @@ -342,7 +619,21 @@ void startCameraServer(){ ra_filter_init(&ra_filter, 20); - Serial.printf("Starting web server on port: '%d'", config.server_port); + + mtmn_config.min_face = 80; + mtmn_config.pyramid = 0.7; + mtmn_config.p_threshold.score = 0.6; + mtmn_config.p_threshold.nms = 0.7; + mtmn_config.r_threshold.score = 0.7; + mtmn_config.r_threshold.nms = 0.7; + mtmn_config.r_threshold.candidate_number = 4; + mtmn_config.o_threshold.score = 0.7; + mtmn_config.o_threshold.nms = 0.4; + mtmn_config.o_threshold.candidate_number = 1; + + face_id_init(&id_list, FACE_ID_SAVE_NUMBER, ENROLL_CONFIRM_TIMES); + + Serial.printf("Starting web server on port: '%d'\n", config.server_port); if (httpd_start(&camera_httpd, &config) == ESP_OK) { httpd_register_uri_handler(camera_httpd, &index_uri); httpd_register_uri_handler(camera_httpd, &cmd_uri); @@ -352,7 +643,7 @@ void startCameraServer(){ config.server_port += 1; config.ctrl_port += 1; - Serial.printf("Starting stream server on port: '%d'", config.server_port); + Serial.printf("Starting stream server on port: '%d'\n", config.server_port); if (httpd_start(&stream_httpd, &config) == ESP_OK) { httpd_register_uri_handler(stream_httpd, &stream_uri); } diff --git a/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h b/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h index e2da7277..346ea41c 100644 --- a/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h +++ b/libraries/ESP32/examples/Camera/CameraWebServer/camera_index.h @@ -1,233 +1,233 @@ - -//File: index.html.gz, Size: 3635 -#define index_html_gz_len 3635 +//File: index.html.gz, Size: 3663 +#define index_html_gz_len 3663 const uint8_t index_html_gz[] = { - 0x1F, 0x8B, 0x08, 0x08, 0x8A, 0xF8, 0xFE, 0x5B, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, - 0x68, 0x74, 0x6D, 0x6C, 0x00, 0xDD, 0x5C, 0xFD, 0x72, 0xDA, 0xB8, 0x16, 0xFF, 0x7F, 0x9F, 0xC2, - 0x71, 0x77, 0x8B, 0x3D, 0x6B, 0x08, 0x10, 0x92, 0xA6, 0x26, 0x90, 0x0D, 0x84, 0xB6, 0x3B, 0xD3, - 0xAF, 0x6D, 0xF6, 0xEE, 0xEE, 0xCC, 0xCE, 0x4E, 0x2B, 0x6C, 0x19, 0xD4, 0x18, 0x8B, 0xDA, 0x72, - 0x80, 0xB2, 0x7E, 0x8E, 0xFB, 0x40, 0xF7, 0xC5, 0xEE, 0x91, 0x64, 0x1B, 0x9B, 0x8F, 0x10, 0xA0, - 0x85, 0x4E, 0x9B, 0x19, 0x90, 0xE5, 0xA3, 0xA3, 0x73, 0xCE, 0xEF, 0x7C, 0x48, 0xC6, 0xEA, 0xC5, - 0x91, 0x4D, 0x2D, 0x36, 0x19, 0x62, 0xA5, 0xCF, 0x06, 0x6E, 0xF3, 0x87, 0x0B, 0xF9, 0xA5, 0xC0, - 0xBF, 0x8B, 0x3E, 0x46, 0xB6, 0x6C, 0x8A, 0xCB, 0x01, 0x66, 0x48, 0xB1, 0xFA, 0xC8, 0x0F, 0x30, - 0x6B, 0xA8, 0x21, 0x73, 0x8A, 0xE7, 0xEA, 0xFC, 0x6D, 0x0F, 0x0D, 0x70, 0x43, 0xBD, 0x23, 0x78, - 0x34, 0xA4, 0x3E, 0x53, 0x15, 0x8B, 0x7A, 0x0C, 0x7B, 0x40, 0x3E, 0x22, 0x36, 0xEB, 0x37, 0x6C, - 0x7C, 0x47, 0x2C, 0x5C, 0x14, 0x17, 0x06, 0xF1, 0x08, 0x23, 0xC8, 0x2D, 0x06, 0x16, 0x72, 0x71, - 0xA3, 0x92, 0xE5, 0xC5, 0x08, 0x73, 0x71, 0xB3, 0x73, 0xF3, 0xF6, 0xA4, 0xAA, 0xBC, 0xF9, 0xA3, - 0x5A, 0x3B, 0x2B, 0x5F, 0x1C, 0xCB, 0xBE, 0x19, 0x4D, 0xC0, 0x26, 0xFC, 0xBA, 0x4B, 0xED, 0xC9, - 0xD4, 0x81, 0x69, 0x8A, 0x0E, 0x1A, 0x10, 0x77, 0x62, 0x5E, 0xF9, 0xC0, 0xD4, 0x78, 0x81, 0xDD, - 0x3B, 0xCC, 0x88, 0x85, 0x8C, 0x00, 0x79, 0x41, 0x31, 0xC0, 0x3E, 0x71, 0xEA, 0x5D, 0x64, 0xDD, - 0xF6, 0x7C, 0x1A, 0x7A, 0xB6, 0xF9, 0xA8, 0x72, 0xCE, 0xFF, 0xEA, 0x16, 0x75, 0xA9, 0x6F, 0x3E, - 0xEA, 0x3C, 0xE3, 0x7F, 0x75, 0xC1, 0x27, 0x20, 0x9F, 0xB1, 0x59, 0x39, 0x1B, 0x8E, 0xA3, 0x7E, - 0x75, 0x9A, 0xE9, 0x39, 0x87, 0x9E, 0x00, 0x5B, 0x8C, 0x50, 0xAF, 0x34, 0x40, 0xC4, 0x9B, 0xDA, - 0x24, 0x18, 0xBA, 0x68, 0x62, 0x3A, 0x2E, 0x1E, 0x47, 0x8F, 0x06, 0xD8, 0x0B, 0x8D, 0xDC, 0x7D, - 0xDE, 0x5F, 0xB4, 0x89, 0x2F, 0xFB, 0x4C, 0x98, 0x2A, 0x1C, 0x78, 0x92, 0x30, 0x1D, 0xEB, 0x51, - 0x0F, 0xD7, 0x05, 0xE1, 0xC8, 0x47, 0x43, 0xB8, 0xE4, 0x5F, 0xF5, 0x01, 0xF1, 0xA4, 0x91, 0xCC, - 0x93, 0x5A, 0x79, 0x38, 0xCE, 0x09, 0x7E, 0x72, 0xC6, 0xFF, 0xEA, 0x43, 0x64, 0xDB, 0xC4, 0xEB, - 0x99, 0xE7, 0xFC, 0x36, 0xF5, 0x6D, 0xEC, 0x17, 0x7D, 0x64, 0x93, 0x30, 0x30, 0x6B, 0xD0, 0x33, - 0x40, 0x7E, 0x0F, 0x78, 0x30, 0x3A, 0x34, 0x8B, 0x95, 0xF2, 0xAC, 0xC3, 0x27, 0xBD, 0x3E, 0x33, - 0x79, 0x4F, 0xF4, 0x28, 0xC6, 0x26, 0xA7, 0x46, 0x46, 0x14, 0x21, 0x08, 0x72, 0x49, 0xCF, 0x2B, - 0x12, 0x86, 0x07, 0x81, 0x19, 0x30, 0x1F, 0x33, 0xAB, 0x1F, 0x39, 0xA4, 0x17, 0xFA, 0x78, 0x9A, - 0x08, 0x50, 0x8E, 0x79, 0x43, 0xA3, 0x38, 0xC2, 0xDD, 0x5B, 0xC2, 0x8A, 0xF1, 0x64, 0x5D, 0xEC, - 0x50, 0x1F, 0xA7, 0x04, 0xC5, 0xAE, 0x4B, 0xAD, 0xDB, 0x62, 0xC0, 0x90, 0xCF, 0x16, 0x89, 0x91, - 0xC3, 0xB0, 0x3F, 0x4F, 0x8B, 0x41, 0xE1, 0x05, 0xCA, 0x84, 0x41, 0x7C, 0x49, 0x3C, 0x97, 0x78, - 0x78, 0x15, 0x5B, 0xC9, 0x21, 0x4F, 0x2A, 0xFA, 0x62, 0x35, 0x14, 0x32, 0xE8, 0xA5, 0x16, 0x10, - 0x93, 0xD6, 0xA5, 0xE1, 0x2B, 0xE5, 0xF2, 0x4F, 0xF5, 0x3E, 0x16, 0xF6, 0x42, 0x21, 0xA3, 0xF7, - 0x1B, 0x99, 0xFB, 0xC6, 0x2F, 0x03, 0x6C, 0x13, 0xA4, 0x68, 0x33, 0xF0, 0x94, 0xF3, 0x32, 0x58, - 0x5A, 0x57, 0x90, 0x67, 0x2B, 0x1A, 0xF5, 0x09, 0x58, 0x1B, 0x09, 0x57, 0x70, 0xA1, 0x07, 0xDC, - 0x7E, 0x88, 0xF5, 0xE9, 0x3A, 0x18, 0x62, 0x8F, 0x58, 0x0D, 0xC4, 0x12, 0x0D, 0x06, 0x68, 0x5C, - 0xCC, 0x68, 0xC1, 0x2F, 0x63, 0x4D, 0x20, 0xD4, 0x2C, 0x0D, 0x3A, 0xEF, 0xFA, 0x4A, 0x51, 0xE1, - 0xAE, 0xA5, 0xC7, 0xEA, 0x0A, 0x15, 0x33, 0xEA, 0x7E, 0x2F, 0x28, 0x27, 0x11, 0xFB, 0xA8, 0x1B, - 0x32, 0x46, 0xBD, 0x60, 0x8D, 0x99, 0x3F, 0x86, 0x01, 0x23, 0xCE, 0xA4, 0x18, 0x83, 0x62, 0x06, - 0x43, 0x04, 0xF9, 0xAA, 0x8B, 0xD9, 0x08, 0x63, 0x08, 0x5D, 0x0F, 0xDD, 0x01, 0xDC, 0xBD, 0x9E, - 0x8B, 0xA7, 0x56, 0xE8, 0x07, 0x90, 0x39, 0x86, 0x94, 0x00, 0xA5, 0x5F, 0xCF, 0x01, 0x90, 0x25, - 0x2C, 0x5A, 0xDD, 0x29, 0x0D, 0x19, 0x17, 0x09, 0x44, 0xA4, 0xC0, 0x8F, 0xB0, 0x09, 0xB4, 0xA4, - 0xD9, 0xCB, 0x89, 0xCD, 0xCB, 0x73, 0x63, 0x4C, 0xAB, 0x8F, 0xAD, 0x5B, 0x6C, 0xFF, 0x9C, 0x4F, - 0x17, 0x22, 0xD5, 0x94, 0x88, 0x37, 0x0C, 0x59, 0x91, 0x27, 0x84, 0xE1, 0x1A, 0x7D, 0x84, 0x25, - 0xE2, 0x29, 0xAA, 0xD5, 0xD4, 0x67, 0xCD, 0xD3, 0xE1, 0x58, 0x29, 0xE7, 0x18, 0x35, 0x5D, 0xD4, - 0xC5, 0x6E, 0xCA, 0x2E, 0x36, 0xA2, 0xF4, 0xA7, 0xD8, 0x09, 0x32, 0xD9, 0x23, 0x93, 0xA1, 0x6A, - 0x4F, 0x7E, 0xCA, 0x31, 0x52, 0x44, 0xDB, 0xC8, 0x75, 0x05, 0xD8, 0x05, 0x18, 0x64, 0x42, 0x84, - 0x9E, 0x91, 0x59, 0x89, 0x4A, 0x3E, 0xF2, 0x7A, 0x18, 0x00, 0x1C, 0x1B, 0x49, 0x33, 0x93, 0x52, - 0x97, 0x4D, 0x6F, 0x96, 0x15, 0x10, 0x3B, 0x92, 0x40, 0x2E, 0x78, 0x7C, 0xA2, 0x56, 0x86, 0xBA, - 0x52, 0x4D, 0x73, 0x23, 0x18, 0x3A, 0x67, 0x0A, 0x9E, 0x35, 0xE7, 0x10, 0x8C, 0x2B, 0x81, 0xE3, - 0xE4, 0xEB, 0x84, 0xE3, 0x9C, 0x94, 0x4F, 0x6A, 0x73, 0xD1, 0xCF, 0xE7, 0xC9, 0xD7, 0x8A, 0x7A, - 0x8A, 0x71, 0x2C, 0xA0, 0xD9, 0xA7, 0x77, 0xD8, 0x9F, 0xE6, 0x59, 0xD5, 0x9E, 0xD6, 0xEC, 0xE4, - 0x3E, 0x02, 0xBF, 0xBC, 0xC3, 0x79, 0x82, 0x6A, 0xC5, 0xAA, 0x56, 0x62, 0x82, 0x12, 0x68, 0x88, - 0xBA, 0x2E, 0xB6, 0x13, 0x57, 0xB3, 0xB1, 0x83, 0x42, 0x97, 0xE5, 0xA4, 0x43, 0x65, 0xFE, 0x17, - 0x09, 0x5B, 0xFF, 0xCD, 0xCB, 0x78, 0x43, 0xD8, 0xF2, 0x9F, 0x69, 0x12, 0x20, 0x68, 0x38, 0xC4, - 0x08, 0xFA, 0x2C, 0x2C, 0x4B, 0xCD, 0x62, 0x72, 0x13, 0x6E, 0xB1, 0xA4, 0xC0, 0xCC, 0x99, 0x27, - 0x09, 0xFF, 0xC5, 0xB9, 0x4C, 0x87, 0x5A, 0x61, 0x30, 0x73, 0xF2, 0x25, 0x14, 0x66, 0x22, 0x4E, - 0xE0, 0x12, 0x61, 0xC6, 0xD0, 0xF3, 0xB8, 0x6E, 0x45, 0xE6, 0xC3, 0xC4, 0xD3, 0x25, 0x42, 0x2D, - 0xE2, 0x93, 0x15, 0x31, 0x2E, 0xD7, 0x79, 0x50, 0xCA, 0x29, 0xD6, 0x4A, 0x40, 0x61, 0x1E, 0x25, - 0x26, 0x7B, 0x80, 0x3C, 0xAC, 0x1F, 0x0E, 0xBA, 0xD3, 0x78, 0x78, 0x05, 0x62, 0x43, 0x32, 0xF0, - 0x7B, 0x5D, 0xA4, 0x95, 0x8D, 0xB2, 0x71, 0x02, 0x1F, 0x7A, 0xCE, 0x60, 0x52, 0xE4, 0x6A, 0x75, - 0xA1, 0xFA, 0x9E, 0xCE, 0xD7, 0xEB, 0xD8, 0x81, 0xE6, 0xB4, 0x59, 0x85, 0x4F, 0xAE, 0x70, 0x57, - 0x4A, 0xDC, 0xE1, 0x57, 0x18, 0x7C, 0x9D, 0x51, 0x17, 0xED, 0xB5, 0xD4, 0x10, 0x03, 0xFA, 0xB9, - 0x28, 0xE3, 0xEF, 0x60, 0x58, 0x64, 0x44, 0xD8, 0x37, 0x0E, 0xCB, 0xE5, 0x09, 0xB6, 0xB4, 0x45, - 0x59, 0x49, 0xF4, 0x2E, 0xCA, 0x6C, 0x02, 0x6C, 0x3C, 0x28, 0x21, 0x3E, 0x94, 0x92, 0xFA, 0x42, - 0xCF, 0xAA, 0xB9, 0x1D, 0xE2, 0xBA, 0x45, 0x97, 0x8E, 0xE6, 0xB2, 0x47, 0xCE, 0xCE, 0xF3, 0x76, - 0x9D, 0x37, 0xFF, 0xBD, 0xBC, 0x43, 0xF0, 0xB9, 0xAF, 0xC0, 0x7B, 0xFF, 0x41, 0x34, 0x03, 0xE5, - 0x9E, 0x20, 0x59, 0x67, 0xD1, 0x07, 0x0C, 0x5D, 0x34, 0x98, 0xCC, 0x91, 0x51, 0x29, 0x18, 0x11, - 0x58, 0x89, 0xCD, 0x15, 0xA3, 0x21, 0x0D, 0x88, 0x58, 0xE6, 0xF9, 0xD8, 0x45, 0x3C, 0xC9, 0x2F, - 0x96, 0xE1, 0xB9, 0xE2, 0x91, 0xB9, 0x95, 0xF0, 0x94, 0x65, 0xF4, 0x61, 0x4B, 0x87, 0x92, 0xCC, - 0x00, 0xB1, 0xBF, 0x0A, 0xE3, 0xE5, 0x92, 0x7B, 0xCE, 0xB6, 0xD5, 0x7B, 0x7D, 0x38, 0x76, 0xDC, - 0x9E, 0x8F, 0x27, 0x09, 0x5B, 0x23, 0xFE, 0x36, 0xE5, 0x4A, 0x6F, 0x79, 0x8D, 0x16, 0x7E, 0x2D, - 0xB5, 0x2E, 0xD5, 0x82, 0x68, 0x6E, 0xC8, 0xA2, 0x45, 0x92, 0x05, 0x96, 0xAA, 0x2E, 0x40, 0x9F, - 0x06, 0x9B, 0x30, 0x4D, 0x1C, 0x83, 0xBC, 0xE9, 0x62, 0x87, 0x89, 0x85, 0x37, 0xCF, 0x8E, 0x27, - 0x39, 0x0F, 0x29, 0xCE, 0xAA, 0xB7, 0xC4, 0x33, 0x5D, 0x3F, 0x25, 0xB6, 0x59, 0x46, 0xCB, 0x7D, - 0x6A, 0x39, 0x79, 0x22, 0x78, 0x92, 0x62, 0x85, 0x7A, 0xD0, 0x33, 0x90, 0x01, 0x0C, 0x4A, 0xE0, - 0xBF, 0xB4, 0xEA, 0x19, 0x5F, 0x3F, 0xAF, 0xBE, 0x15, 0xC5, 0xCB, 0x9E, 0x85, 0x90, 0x48, 0x4A, - 0x6C, 0xC6, 0x0B, 0x6A, 0x73, 0x98, 0xCD, 0x70, 0x5F, 0x58, 0x79, 0xC0, 0x6A, 0x6B, 0x80, 0x20, - 0x59, 0x72, 0x13, 0xC2, 0x36, 0x13, 0x74, 0x5B, 0x34, 0xEF, 0x6C, 0x79, 0x56, 0x39, 0xE3, 0x9B, - 0xBD, 0x92, 0xE5, 0xD2, 0x20, 0x83, 0x03, 0xEA, 0x82, 0x24, 0x21, 0xC3, 0x75, 0xB9, 0xA4, 0x3B, - 0x8D, 0x8D, 0x7A, 0xBA, 0x3C, 0xEC, 0x32, 0x18, 0x64, 0xA1, 0xC9, 0x4B, 0x56, 0xE1, 0x7B, 0x9D, - 0xEC, 0x2A, 0x8A, 0xE1, 0x31, 0xD4, 0x37, 0xBE, 0x6F, 0x31, 0x2D, 0x2C, 0xDC, 0x2C, 0x1B, 0x06, - 0x95, 0xC5, 0x25, 0x58, 0x54, 0xEA, 0x13, 0xDB, 0xC6, 0x5E, 0x6E, 0x73, 0x1C, 0xCD, 0x76, 0xFC, - 0xC7, 0xF1, 0x96, 0x5F, 0x5E, 0xCC, 0x9E, 0x4E, 0x5C, 0xF0, 0x67, 0x00, 0xD9, 0x27, 0x03, 0x72, - 0xC9, 0xAF, 0x58, 0x2E, 0x0A, 0x82, 0x86, 0xCA, 0xF7, 0xE2, 0x99, 0x87, 0x0B, 0x82, 0xC4, 0x26, - 0x77, 0x0A, 0xB1, 0x1B, 0xAA, 0x4B, 0x7B, 0x74, 0xEE, 0x9E, 0xB8, 0x2F, 0x16, 0xC3, 0x0A, 0xA0, - 0xDA, 0x50, 0x73, 0xCB, 0x72, 0x55, 0x8C, 0x9A, 0x75, 0xA9, 0xCD, 0xC7, 0x8F, 0x9E, 0x3E, 0x79, - 0x72, 0x56, 0x7F, 0xEC, 0x75, 0x83, 0x61, 0xFC, 0xF9, 0xBB, 0xB8, 0x05, 0x8B, 0x5E, 0xC6, 0x60, - 0x21, 0x1A, 0x5C, 0x1C, 0x0B, 0x6E, 0x73, 0x12, 0x1C, 0x83, 0x08, 0x2B, 0x84, 0x8A, 0x63, 0x63, - 0x99, 0x5C, 0x09, 0x49, 0x00, 0x4E, 0xDA, 0x45, 0xFE, 0x12, 0x12, 0x41, 0x26, 0x7C, 0x5A, 0x11, - 0x29, 0x4D, 0x15, 0x9E, 0xDD, 0xA5, 0xE3, 0x79, 0xD1, 0x85, 0x36, 0xB1, 0xDB, 0xC7, 0x54, 0xD8, - 0x5E, 0xC5, 0x10, 0x86, 0x89, 0xE1, 0x7C, 0x33, 0xB2, 0x82, 0x26, 0x95, 0x2F, 0x36, 0x7B, 0x66, - 0xFD, 0x2F, 0xA7, 0x76, 0x7C, 0x34, 0xC0, 0xDC, 0xDB, 0xE3, 0xCE, 0xD5, 0x6C, 0xE6, 0x21, 0x48, - 0x47, 0xAA, 0xCD, 0x77, 0x58, 0x38, 0x2E, 0xC0, 0xBB, 0xD4, 0xAC, 0x0B, 0x5C, 0x64, 0x08, 0xE6, - 0xE7, 0x57, 0x13, 0x11, 0xE3, 0x15, 0x75, 0x11, 0x09, 0x7F, 0x59, 0x23, 0x90, 0x60, 0x47, 0x87, - 0xC2, 0xB3, 0xEE, 0x90, 0x1B, 0x82, 0x69, 0x2B, 0x65, 0xB5, 0xF9, 0x9F, 0xBF, 0x9E, 0x5F, 0x69, - 0x10, 0x64, 0xE5, 0x71, 0xA5, 0x5A, 0x2E, 0xEB, 0x17, 0xC7, 0x92, 0x64, 0x63, 0x5E, 0x4F, 0xD5, - 0xE6, 0x8D, 0x60, 0x55, 0x3D, 0x07, 0x56, 0xE5, 0x6A, 0x6D, 0x7B, 0x56, 0xE7, 0x6A, 0x53, 0x70, - 0x02, 0x26, 0xE3, 0x27, 0x67, 0xE7, 0xDB, 0x33, 0x7A, 0x02, 0x32, 0xFD, 0x01, 0x9C, 0xCE, 0x41, - 0xBB, 0xB3, 0x5D, 0x94, 0x3B, 0x53, 0x9B, 0x9C, 0xCF, 0x59, 0xAD, 0x3C, 0xAE, 0x9D, 0xEF, 0xC0, - 0xE7, 0x54, 0x8D, 0xB7, 0x92, 0xDC, 0x65, 0x93, 0x96, 0xDA, 0x6C, 0xFF, 0xFA, 0x4C, 0xAB, 0x81, - 0x8C, 0xD5, 0xA7, 0x67, 0xDB, 0xF3, 0xAE, 0xA9, 0xCD, 0xDF, 0xB8, 0x90, 0x27, 0x55, 0x60, 0x54, - 0xDB, 0x41, 0xC8, 0x13, 0xB5, 0xF9, 0x42, 0x70, 0x02, 0x2E, 0xE3, 0xCA, 0x93, 0x1D, 0x44, 0x02, - 0xF7, 0xFA, 0x4D, 0x70, 0x02, 0xFF, 0xE2, 0xEE, 0xF5, 0x40, 0x4E, 0x90, 0x28, 0x85, 0x69, 0xEE, - 0x89, 0xD3, 0xC5, 0xEC, 0x93, 0xBB, 0x7D, 0x5F, 0x18, 0x7F, 0x0A, 0x21, 0xA7, 0xB3, 0xC9, 0xC6, - 0x41, 0x1C, 0x8F, 0x03, 0x95, 0x64, 0xE3, 0x61, 0xF1, 0x9B, 0x91, 0x24, 0x7D, 0x4A, 0xA0, 0x36, - 0x2B, 0xE5, 0x35, 0x1A, 0x88, 0xB1, 0xD9, 0x2C, 0x28, 0x06, 0xE7, 0x14, 0x50, 0x15, 0x60, 0x25, - 0x62, 0x58, 0x19, 0xA0, 0x31, 0xF8, 0xE8, 0x89, 0x9A, 0x89, 0xEB, 0xAD, 0x52, 0xC4, 0x12, 0x69, - 0xD1, 0x58, 0x6D, 0x9E, 0x9D, 0xAC, 0xB3, 0xF7, 0x0E, 0x70, 0x74, 0x45, 0x05, 0xF7, 0x70, 0x10, - 0x6C, 0x8C, 0xC8, 0x6C, 0xA8, 0xDA, 0x6C, 0xA5, 0xED, 0x5D, 0x70, 0x29, 0x56, 0x77, 0xC0, 0x25, - 0x23, 0x8E, 0x84, 0xA6, 0x58, 0x8D, 0xA1, 0xA9, 0xAA, 0xB3, 0x88, 0xF8, 0x92, 0xC0, 0xAC, 0x93, - 0x76, 0x17, 0x5C, 0x78, 0x11, 0xF7, 0x51, 0xC0, 0x36, 0x46, 0x25, 0x19, 0x08, 0x69, 0x2D, 0x6E, - 0x1D, 0x0C, 0x91, 0x54, 0x94, 0xEF, 0x00, 0x8F, 0x00, 0xB1, 0xD0, 0x17, 0x4F, 0xDF, 0x37, 0x46, - 0x64, 0x36, 0x14, 0xEA, 0x61, 0xDA, 0x3E, 0x18, 0x2A, 0x19, 0x71, 0xBE, 0x07, 0x5C, 0x86, 0xD8, - 0x22, 0xC8, 0x7D, 0x8F, 0x1D, 0x07, 0x4A, 0xD6, 0xE6, 0xD8, 0xE4, 0x86, 0x03, 0x3E, 0xF2, 0x5A, - 0xE9, 0x88, 0xEB, 0x8D, 0xD7, 0x88, 0x73, 0xEC, 0xBE, 0xD4, 0x42, 0xB1, 0xBC, 0x7C, 0xDD, 0xF2, - 0x9A, 0xA6, 0x72, 0x6E, 0xB9, 0x42, 0xA8, 0x00, 0x13, 0xDC, 0x13, 0x7B, 0xBE, 0xAD, 0x79, 0x54, - 0xD5, 0xE6, 0x73, 0x1F, 0x4D, 0xC4, 0xCF, 0xB0, 0xBB, 0x2C, 0x7A, 0xDE, 0x61, 0x5B, 0xF9, 0x1D, - 0x36, 0x72, 0xBB, 0xAC, 0xC0, 0x9E, 0xFB, 0x18, 0x7B, 0xBB, 0x71, 0x39, 0x85, 0x62, 0x06, 0x8D, - 0xDD, 0x98, 0xC0, 0x82, 0xF5, 0x06, 0x0F, 0x09, 0xFA, 0x16, 0x16, 0x5C, 0x68, 0xD4, 0xDD, 0x38, - 0x2C, 0x60, 0x8C, 0xDA, 0xBC, 0xFA, 0xB3, 0xB5, 0x71, 0x92, 0x92, 0x0F, 0x9F, 0x1E, 0xE2, 0xE1, - 0x32, 0x3B, 0xC5, 0x02, 0xAA, 0x0B, 0x9B, 0xCD, 0xE5, 0x91, 0xF3, 0xD0, 0x0D, 0xE7, 0x12, 0xBD, - 0x12, 0x01, 0xC5, 0xF3, 0x19, 0x35, 0xA3, 0xE6, 0xC3, 0x74, 0xFC, 0x7A, 0x19, 0x0C, 0x84, 0x78, - 0xDF, 0x43, 0x64, 0xF3, 0xBA, 0x92, 0x0C, 0x14, 0x48, 0x29, 0xCF, 0xA1, 0xB5, 0x2F, 0xB8, 0xE4, - 0xB4, 0x07, 0xC3, 0x2C, 0xD6, 0xFA, 0xD0, 0xC0, 0x81, 0x20, 0x03, 0x6A, 0x6F, 0xFE, 0x38, 0x22, - 0x1E, 0xA7, 0x36, 0x01, 0xB5, 0x57, 0xD0, 0xD8, 0xB8, 0xCA, 0x24, 0x0C, 0xBE, 0x72, 0x79, 0xB9, - 0x0A, 0x19, 0xDD, 0xA5, 0xB2, 0xDC, 0x84, 0x9E, 0x37, 0xD9, 0xA5, 0xAC, 0xB4, 0x5D, 0x1A, 0xDA, - 0xDB, 0x73, 0x80, 0x9A, 0xF2, 0xC6, 0x71, 0x88, 0xB5, 0x7D, 0x55, 0x82, 0x8A, 0xF2, 0x82, 0x0E, - 0x1E, 0x38, 0xFE, 0x2B, 0x67, 0x71, 0x6C, 0x6D, 0x9E, 0x20, 0xB0, 0x05, 0x28, 0x76, 0xDA, 0xCA, - 0x4D, 0xE7, 0xF5, 0xCD, 0x9B, 0x77, 0xFB, 0xC9, 0x0E, 0x30, 0xE7, 0x81, 0x12, 0x03, 0xD7, 0xF6, - 0xD0, 0x39, 0x01, 0x84, 0xA8, 0x6E, 0x83, 0x53, 0x55, 0x02, 0x75, 0x7D, 0xF3, 0x76, 0x5F, 0x28, - 0x55, 0x0F, 0x07, 0x53, 0xF5, 0x5B, 0xC0, 0xE9, 0xBD, 0x8B, 0xEF, 0xB0, 0xBB, 0x05, 0x56, 0x72, - 0x20, 0xC7, 0x4B, 0x79, 0xC9, 0x5B, 0x07, 0xDB, 0xC8, 0xA5, 0xA2, 0x7C, 0x07, 0xDB, 0x38, 0xF0, - 0x8A, 0xF7, 0x42, 0xE8, 0x6D, 0x82, 0x47, 0x8E, 0x54, 0x9B, 0x9D, 0xF1, 0x90, 0x06, 0xA1, 0xFF, - 0xC0, 0x82, 0xBA, 0x1C, 0x91, 0x5D, 0x9E, 0x0C, 0xCE, 0x44, 0x91, 0x88, 0x24, 0x8F, 0x06, 0xF9, - 0x93, 0xFD, 0x14, 0x93, 0x6A, 0xB9, 0xF6, 0x45, 0x51, 0xE1, 0xCC, 0xBF, 0x26, 0x30, 0xBD, 0x2D, - 0xEA, 0x4E, 0x8F, 0xD7, 0x9D, 0xE7, 0xED, 0xFD, 0xA4, 0xB2, 0xDE, 0xC1, 0x0A, 0x4E, 0xEF, 0xA0, - 0x05, 0x47, 0x91, 0xBF, 0x76, 0xA6, 0x30, 0x6D, 0xB9, 0x89, 0x88, 0x07, 0xC2, 0xDE, 0x79, 0x9B, - 0x0D, 0x44, 0xF6, 0xA1, 0xFA, 0x78, 0x97, 0xD0, 0x49, 0xC4, 0xC8, 0x47, 0xCE, 0xC9, 0x2C, 0x6E, - 0x4E, 0xBF, 0x68, 0xD4, 0x9C, 0xAC, 0x95, 0x76, 0x97, 0xA0, 0xE1, 0x9A, 0x58, 0x98, 0xB8, 0xFC, - 0xA5, 0xC7, 0x4D, 0x01, 0xC9, 0x8C, 0x95, 0x98, 0x28, 0x6D, 0x79, 0xB5, 0x0B, 0x36, 0xD5, 0x5D, - 0xB0, 0xC9, 0x4A, 0x94, 0x87, 0xE7, 0xEC, 0x2B, 0x55, 0x9A, 0x4A, 0xF5, 0xFC, 0x6B, 0xC2, 0xD3, - 0x1D, 0x6E, 0x9E, 0xD3, 0x60, 0x8C, 0xDA, 0x6C, 0xBD, 0xDD, 0x4F, 0x4E, 0xE3, 0x93, 0x3D, 0x30, - 0xA7, 0xED, 0x94, 0xC1, 0x84, 0x52, 0x87, 0x5E, 0x8A, 0x8D, 0xB6, 0x40, 0x63, 0xC4, 0x05, 0xFF, - 0x73, 0x4F, 0x68, 0x8C, 0x1E, 0x8E, 0xC6, 0x17, 0xAE, 0x30, 0xA3, 0x6F, 0x01, 0x1F, 0x1F, 0x8D, - 0xDE, 0xF7, 0x06, 0x68, 0x63, 0x8C, 0xE2, 0x71, 0x6A, 0xF3, 0x1D, 0x1A, 0x29, 0xCF, 0x5F, 0x5D, - 0xED, 0x05, 0xAB, 0x64, 0xD2, 0xC3, 0xE0, 0x95, 0xAA, 0x7C, 0x68, 0xCC, 0x5C, 0xEC, 0x6D, 0x1E, - 0x54, 0x7C, 0x90, 0xDA, 0x7C, 0x89, 0xBD, 0x40, 0x69, 0x53, 0x3F, 0x3E, 0x76, 0xB4, 0x17, 0xD4, - 0xC4, 0xCC, 0x87, 0x81, 0x4C, 0x2A, 0x7D, 0x68, 0xBC, 0xFA, 0x03, 0xE2, 0xFB, 0xD4, 0xDF, 0x18, - 0xB2, 0x78, 0x9C, 0xDA, 0x7C, 0x51, 0x7C, 0x25, 0x5A, 0x7B, 0x81, 0x2B, 0x99, 0xF5, 0x30, 0x88, - 0xA5, 0x3A, 0x1F, 0x1A, 0x34, 0xDB, 0x1A, 0x6D, 0x0C, 0x18, 0x8C, 0x51, 0x9B, 0xD7, 0xED, 0x3F, - 0x15, 0xED, 0x9A, 0x8E, 0x3C, 0xFE, 0x36, 0x99, 0xD2, 0x79, 0xAD, 0xEF, 0x05, 0x35, 0x3E, 0xF5, - 0x61, 0x10, 0x13, 0x4A, 0x1F, 0x1A, 0x2D, 0xF1, 0x66, 0x69, 0x17, 0x6D, 0x1E, 0x63, 0xC9, 0x40, - 0xFE, 0x42, 0x05, 0xB4, 0x94, 0x16, 0xDA, 0x4F, 0x94, 0xA5, 0xF3, 0xEE, 0x63, 0x25, 0x38, 0x53, - 0xF2, 0xD0, 0x38, 0x39, 0xC8, 0xC2, 0xEF, 0x6D, 0xCC, 0xB6, 0xF9, 0x35, 0x3F, 0x33, 0x56, 0x6D, - 0x3E, 0x83, 0x0B, 0xE5, 0x5A, 0x5C, 0xEC, 0xAB, 0x8E, 0x65, 0xE7, 0xDF, 0x07, 0x6A, 0x39, 0x7D, - 0xBF, 0x09, 0xE0, 0x60, 0xD5, 0x40, 0x7B, 0xDE, 0x56, 0x2F, 0xE9, 0xE6, 0x86, 0xC7, 0xF0, 0xBD, - 0x93, 0xD7, 0xFB, 0x05, 0x70, 0x26, 0xC4, 0xDE, 0x30, 0xCC, 0xE8, 0xBD, 0x0F, 0x18, 0x93, 0x37, - 0xDC, 0xC5, 0x5E, 0x53, 0x1E, 0x6C, 0x5D, 0x87, 0x94, 0x24, 0x93, 0xCF, 0x03, 0x30, 0x2B, 0x06, - 0x8C, 0xB8, 0xAE, 0xDA, 0x7C, 0x8E, 0x99, 0x72, 0xC3, 0x9B, 0x17, 0xC7, 0x92, 0xE0, 0xE1, 0x5C, - 0xE2, 0xB7, 0xC8, 0xF9, 0x61, 0x64, 0x34, 0x50, 0x9B, 0x37, 0xFC, 0x64, 0x2E, 0xF0, 0xE2, 0x57, - 0x9B, 0x33, 0x13, 0x46, 0xC4, 0x9E, 0x4F, 0x41, 0xA8, 0x14, 0xA4, 0xF8, 0xFC, 0xA3, 0xAA, 0x24, - 0xAD, 0x4C, 0x5F, 0xB3, 0x23, 0x88, 0x15, 0xEE, 0x65, 0xEB, 0xA7, 0xE3, 0x3F, 0xED, 0x59, 0xAB, - 0x7F, 0x01, 0xBC, 0x38, 0xF6, 0xD0, 0x12, 0x73, 0xAF, 0x40, 0xE1, 0x42, 0x1E, 0x8D, 0x5E, 0xC1, - 0x2A, 0x7D, 0x43, 0x5F, 0x58, 0x62, 0x76, 0x48, 0x23, 0x55, 0x6B, 0xEE, 0xF0, 0x46, 0xF2, 0x14, - 0xF0, 0x61, 0x41, 0x2B, 0x8E, 0x71, 0xC4, 0xF5, 0x90, 0x37, 0x53, 0xF3, 0xFF, 0xEF, 0xBF, 0xEB, - 0x7C, 0x86, 0x0C, 0x7A, 0x19, 0xC1, 0x54, 0x25, 0xF0, 0xAD, 0x86, 0xBA, 0xEA, 0x7D, 0xFF, 0x15, - 0x9A, 0x1F, 0x2F, 0x53, 0x7D, 0x8E, 0x78, 0x89, 0xAD, 0x2F, 0x02, 0xCB, 0x27, 0x43, 0xD6, 0xFC, - 0xC1, 0xA6, 0x56, 0x38, 0xC0, 0x1E, 0x2B, 0x21, 0xDB, 0xEE, 0xDC, 0x41, 0xE3, 0x25, 0x09, 0x18, - 0x06, 0x2B, 0x68, 0x85, 0xEB, 0x37, 0xAF, 0xDA, 0xF2, 0xDC, 0xC3, 0x4B, 0x8A, 0x6C, 0x6C, 0x17, - 0x0C, 0x27, 0xF4, 0x04, 0x1F, 0x4D, 0x9F, 0x26, 0x4D, 0xA5, 0xAB, 0xB5, 0xF4, 0xA9, 0x0B, 0x4E, - 0xDB, 0xAE, 0xCB, 0xF4, 0xA0, 0xB5, 0x4A, 0x3C, 0xC6, 0xF5, 0xA9, 0x85, 0x02, 0x5C, 0x48, 0x02, - 0xBD, 0x60, 0xB6, 0x1B, 0xAD, 0x52, 0xBC, 0xF6, 0xB9, 0xAC, 0xF0, 0x53, 0x34, 0xA0, 0xF4, 0x6D, - 0x5D, 0x10, 0x89, 0xE7, 0x54, 0x05, 0x53, 0xB4, 0xE5, 0x2F, 0xBE, 0x45, 0xEA, 0x61, 0x39, 0x44, - 0x3C, 0x0D, 0xCB, 0x12, 0x4B, 0xCF, 0x4A, 0xA8, 0xC3, 0xEE, 0x80, 0x30, 0x4E, 0x59, 0xA8, 0x14, - 0x62, 0xAA, 0x38, 0x95, 0x98, 0x3E, 0x66, 0xA1, 0xEF, 0xD5, 0x23, 0x00, 0x36, 0x60, 0xCA, 0x75, - 0xE3, 0xC3, 0x8F, 0x53, 0x2B, 0x3A, 0x16, 0x6F, 0x50, 0x52, 0xF7, 0xF2, 0x0E, 0xF9, 0x8D, 0x1F, - 0xA7, 0xAD, 0x12, 0xB1, 0xA3, 0xC7, 0x30, 0x07, 0xB4, 0xDB, 0xD1, 0x87, 0xBA, 0xC3, 0x8F, 0xF1, - 0x6B, 0xD7, 0x7A, 0x89, 0xF5, 0xB1, 0xA7, 0x75, 0x1A, 0xCD, 0x29, 0x1F, 0x4D, 0x5D, 0x5C, 0x72, - 0x69, 0x4F, 0xFB, 0xE0, 0xE3, 0x4F, 0x21, 0x06, 0x66, 0x8C, 0x2A, 0x3F, 0x4E, 0xAF, 0x23, 0xC5, - 0x21, 0x1E, 0x09, 0xFA, 0xD8, 0x36, 0x94, 0x80, 0x21, 0x16, 0x06, 0x26, 0x74, 0x77, 0x4A, 0xB2, - 0x1D, 0x7D, 0xD0, 0x23, 0x3D, 0x82, 0x69, 0x14, 0xAB, 0x91, 0x5A, 0xD9, 0xA5, 0x96, 0x78, 0x4F, - 0xB0, 0x44, 0x7D, 0xD2, 0x23, 0x5E, 0x5D, 0xCA, 0x86, 0x1B, 0x2D, 0x98, 0x09, 0xCC, 0xC3, 0x5D, - 0x8A, 0x03, 0xC0, 0xD1, 0xD0, 0x0A, 0xD2, 0x0F, 0x0B, 0x7A, 0x64, 0x38, 0x0B, 0x04, 0x3E, 0x1E, - 0xD0, 0x3B, 0x9C, 0xA5, 0xE9, 0x2D, 0x67, 0x92, 0xC4, 0x67, 0x41, 0x37, 0x5A, 0xE9, 0x01, 0xE6, - 0xC6, 0x51, 0x39, 0x32, 0xFA, 0x2B, 0x99, 0xAE, 0x18, 0x53, 0x89, 0x0C, 0xD2, 0xD0, 0x5A, 0x46, - 0xDB, 0xB8, 0xD6, 0x61, 0xE4, 0x75, 0xE3, 0x48, 0xF3, 0x42, 0xD7, 0x3D, 0x6A, 0x5C, 0xEB, 0xFF, - 0xFE, 0x7B, 0x5D, 0xE7, 0x4E, 0xD0, 0xA9, 0xCF, 0x10, 0x6F, 0x34, 0x1A, 0xD2, 0x15, 0x2E, 0xC1, - 0x90, 0x29, 0xF6, 0x46, 0xBB, 0x71, 0x74, 0xD4, 0x36, 0xD2, 0xEB, 0x46, 0x5B, 0x37, 0xC5, 0x7D, - 0x01, 0xB4, 0x11, 0x7F, 0x43, 0xAF, 0x71, 0xFD, 0xF8, 0x71, 0xE7, 0xA8, 0xD1, 0x68, 0x5F, 0x72, - 0x17, 0x33, 0x8F, 0xE0, 0x52, 0x2B, 0x20, 0x6C, 0x49, 0xBE, 0xC4, 0xBE, 0x6C, 0x5F, 0x62, 0xED, - 0x4E, 0x37, 0x1D, 0xFE, 0x51, 0x40, 0xBD, 0xEC, 0x0D, 0xCD, 0xD1, 0x98, 0x6E, 0x60, 0x2D, 0xD0, - 0x81, 0x39, 0xE6, 0x6D, 0x47, 0xB4, 0x0B, 0xC9, 0xAB, 0x2E, 0x19, 0x5A, 0x47, 0x1B, 0xEB, 0x26, - 0xE6, 0x1F, 0x85, 0x7C, 0xE1, 0x48, 0x68, 0x60, 0xDE, 0xF6, 0x65, 0x5F, 0xF3, 0x74, 0xB3, 0x07, - 0x1F, 0xBA, 0x1E, 0xD5, 0x53, 0x38, 0xC1, 0x1B, 0xFC, 0xC9, 0x8D, 0xF0, 0x58, 0xEA, 0x5F, 0xB9, - 0xAE, 0x56, 0x90, 0xC7, 0xBA, 0x0A, 0x7A, 0x09, 0x2A, 0x51, 0x07, 0xF1, 0x68, 0x10, 0x36, 0xA6, - 0x9E, 0xE5, 0x12, 0xEB, 0xB6, 0xA1, 0x71, 0xC3, 0x61, 0x08, 0x11, 0x79, 0xE0, 0xF4, 0x35, 0xB5, - 0xB1, 0x1E, 0x45, 0x20, 0x9E, 0xF0, 0x3B, 0xE9, 0xA1, 0xD2, 0x7D, 0x3E, 0xC4, 0x3E, 0x98, 0xC6, - 0x1C, 0x84, 0x99, 0xF4, 0x68, 0xA5, 0x55, 0xFA, 0x18, 0xF0, 0x20, 0x8C, 0x96, 0x90, 0xDC, 0x27, - 0x5A, 0xBE, 0xC6, 0x66, 0x64, 0x6C, 0x83, 0x50, 0x44, 0x03, 0x50, 0xFE, 0x6E, 0x83, 0xBE, 0xFF, - 0x18, 0x47, 0x15, 0xEE, 0xBA, 0x7A, 0xEC, 0x9D, 0x1F, 0x67, 0xEE, 0x0B, 0x75, 0xAA, 0xE3, 0x62, - 0xDE, 0x6C, 0x4D, 0x7E, 0x05, 0xE7, 0x92, 0x99, 0x0B, 0xDC, 0xE4, 0x76, 0x1D, 0xCD, 0x2C, 0xBD, - 0x02, 0xB5, 0xBB, 0x9A, 0x3A, 0xAD, 0x84, 0x40, 0x36, 0x58, 0x4D, 0x96, 0x2B, 0x75, 0x40, 0xEA, - 0xAD, 0x26, 0xCD, 0x14, 0x32, 0x20, 0xA4, 0xAB, 0x09, 0xB3, 0xE9, 0x1B, 0x28, 0x87, 0x12, 0xAC, - 0x11, 0xF1, 0x6C, 0x3A, 0x82, 0x98, 0xA6, 0x43, 0x0D, 0x44, 0x2A, 0x11, 0x0F, 0x74, 0x78, 0xF1, - 0xFB, 0xAB, 0x97, 0x8D, 0x42, 0xB6, 0xC0, 0x16, 0x22, 0xE3, 0x93, 0x1C, 0xF0, 0xB1, 0xC4, 0xF3, - 0x38, 0x87, 0xF2, 0xE7, 0x82, 0x79, 0x5E, 0x29, 0x70, 0x40, 0x39, 0xC5, 0x07, 0xF0, 0xC1, 0xDB, - 0x05, 0x0E, 0x74, 0x98, 0x32, 0xA8, 0xBB, 0x79, 0x37, 0xE1, 0xF3, 0xCD, 0x98, 0x41, 0xE6, 0x42, - 0x43, 0x80, 0x1F, 0x5F, 0xBE, 0xB7, 0xBA, 0x90, 0xAD, 0xAE, 0x11, 0xC3, 0x25, 0x8F, 0x8E, 0xC0, - 0x0D, 0x24, 0xE7, 0xC8, 0xA0, 0x8B, 0xE3, 0xB1, 0xB8, 0x31, 0xC8, 0xDF, 0x90, 0xB0, 0xB6, 0xF2, - 0xD3, 0x83, 0xB3, 0x67, 0x44, 0xAB, 0xB7, 0x2E, 0x61, 0xB8, 0xF9, 0x09, 0xB8, 0x1B, 0x5E, 0x7E, - 0x74, 0x17, 0x82, 0x20, 0x32, 0xB6, 0xF2, 0xB3, 0x34, 0x16, 0xFA, 0x3C, 0xE1, 0x0B, 0x76, 0x3C, - 0xB6, 0x53, 0x4F, 0xF3, 0x57, 0x83, 0xC3, 0xE3, 0x5B, 0x37, 0x82, 0x7B, 0x09, 0x32, 0x3F, 0xD7, - 0x01, 0x2D, 0xBB, 0xC7, 0xC9, 0xE6, 0x7F, 0x4C, 0x2A, 0xE8, 0x75, 0x3F, 0x2F, 0x17, 0xA8, 0xE9, - 0xEB, 0x86, 0x9F, 0x56, 0xAC, 0x15, 0x19, 0x25, 0x8A, 0x25, 0x0F, 0xEF, 0x11, 0x0C, 0x73, 0xC9, - 0xEF, 0xEE, 0x25, 0xC8, 0xFE, 0x50, 0x0F, 0xB2, 0x84, 0x0B, 0xB2, 0x84, 0xBA, 0x11, 0xA6, 0xB2, - 0xA4, 0x69, 0x2F, 0x99, 0x7D, 0x74, 0x0F, 0xF3, 0x24, 0xE1, 0xE9, 0xC6, 0x78, 0x35, 0x55, 0xEE, - 0xBD, 0x3B, 0x10, 0x60, 0xB4, 0x20, 0xC0, 0x48, 0x37, 0x46, 0xA9, 0x00, 0x69, 0xCA, 0x4C, 0x04, - 0x98, 0xAC, 0x09, 0x3F, 0xB9, 0xA1, 0x02, 0x19, 0x3E, 0xAF, 0x21, 0x9C, 0x25, 0x5F, 0xDD, 0xB8, - 0xBA, 0x87, 0x36, 0x39, 0x38, 0x08, 0xB2, 0x5E, 0x2D, 0xC8, 0x7A, 0xA5, 0x1B, 0xA7, 0x17, 0x57, - 0xB2, 0x90, 0x40, 0xF2, 0x26, 0xDA, 0x84, 0x67, 0x34, 0x83, 0x68, 0x9F, 0xF9, 0x37, 0x38, 0xEF, - 0x64, 0x6E, 0x48, 0x9C, 0x57, 0xD3, 0x41, 0x97, 0x1A, 0x72, 0xB1, 0xCF, 0xB4, 0xC2, 0x5B, 0x17, - 0xC3, 0x2A, 0x23, 0x7E, 0x95, 0x4F, 0x69, 0xFF, 0xFA, 0x4C, 0xA1, 0xBE, 0x22, 0x8E, 0xAD, 0x2B, - 0x7E, 0x7A, 0xEC, 0x51, 0x91, 0x27, 0x93, 0x15, 0xCC, 0xFF, 0xAF, 0x07, 0x70, 0x29, 0x85, 0xF5, - 0x49, 0xA0, 0x38, 0x98, 0x1F, 0x0A, 0xC0, 0x47, 0x1C, 0x7B, 0x4A, 0x6C, 0x25, 0x96, 0x42, 0x37, - 0xF9, 0x95, 0xD6, 0xD5, 0x26, 0xBA, 0x71, 0x34, 0x49, 0x2C, 0x0A, 0x52, 0xF2, 0xDA, 0x92, 0x8A, - 0x08, 0x32, 0x7E, 0x3E, 0x88, 0x8C, 0x9F, 0x73, 0x32, 0x7E, 0x06, 0xC0, 0x66, 0x11, 0xD0, 0x97, - 0x12, 0x82, 0x1A, 0x65, 0x3D, 0xAE, 0x85, 0x50, 0xBA, 0xEA, 0xD9, 0x65, 0x66, 0xBC, 0xA8, 0x94, - 0x57, 0xF2, 0x0C, 0xF0, 0xC5, 0xB1, 0xFC, 0xFF, 0xCB, 0xFE, 0x0F, 0x86, 0xED, 0x24, 0xF8, 0xD7, - 0x4C, 0x00, 0x00 + 0x1F, 0x8B, 0x08, 0x08, 0x60, 0x15, 0x36, 0x5C, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x68, 0x74, 0x6D, 0x6C, 0x00, 0xDD, 0x5C, 0xEB, 0x72, 0x9B, 0xC8, 0x12, 0xFE, 0x7F, 0x9E, 0x02, + 0x93, 0xDD, 0x08, 0x6A, 0x91, 0x2C, 0xC9, 0x8A, 0xE3, 0x20, 0x0B, 0x1F, 0x5B, 0x76, 0x92, 0xAD, + 0xCA, 0x6D, 0xE3, 0x3D, 0xBB, 0x5B, 0xB5, 0xB5, 0x95, 0x8C, 0x60, 0x90, 0x26, 0x46, 0x8C, 0x02, + 0x83, 0x2E, 0xD1, 0xF2, 0x1C, 0xE7, 0x81, 0xCE, 0x8B, 0x9D, 0x9E, 0x19, 0x40, 0xA0, 0x8B, 0x65, + 0x49, 0x89, 0x94, 0x5A, 0xBB, 0xCA, 0x1A, 0xA0, 0xBB, 0xA7, 0xBB, 0xBF, 0xBE, 0x0C, 0x88, 0xF1, + 0xF9, 0x91, 0x43, 0x6D, 0x36, 0x19, 0x60, 0xA5, 0xC7, 0xFA, 0x9E, 0xF5, 0xAF, 0x73, 0xF9, 0xA1, + 0xC0, 0xCF, 0x79, 0x0F, 0x23, 0x47, 0x0E, 0xC5, 0x61, 0x1F, 0x33, 0xA4, 0xD8, 0x3D, 0x14, 0x84, + 0x98, 0xB5, 0xD4, 0x88, 0xB9, 0xE5, 0x33, 0x75, 0xFE, 0xB2, 0x8F, 0xFA, 0xB8, 0xA5, 0x0E, 0x09, + 0x1E, 0x0D, 0x68, 0xC0, 0x54, 0xC5, 0xA6, 0x3E, 0xC3, 0x3E, 0x90, 0x8F, 0x88, 0xC3, 0x7A, 0x2D, + 0x07, 0x0F, 0x89, 0x8D, 0xCB, 0xE2, 0xC0, 0x20, 0x3E, 0x61, 0x04, 0x79, 0xE5, 0xD0, 0x46, 0x1E, + 0x6E, 0xD5, 0xF2, 0xB2, 0x18, 0x61, 0x1E, 0xB6, 0x6E, 0x6E, 0xDF, 0x9D, 0xD4, 0x95, 0xB7, 0xBF, + 0xD5, 0x1B, 0xA7, 0xD5, 0xF3, 0x63, 0x79, 0x6E, 0x46, 0x13, 0xB2, 0x09, 0x3F, 0xEE, 0x50, 0x67, + 0x32, 0x75, 0x61, 0x9A, 0xB2, 0x8B, 0xFA, 0xC4, 0x9B, 0x98, 0x97, 0x01, 0x08, 0x35, 0x5E, 0x62, + 0x6F, 0x88, 0x19, 0xB1, 0x91, 0x11, 0x22, 0x3F, 0x2C, 0x87, 0x38, 0x20, 0x6E, 0xB3, 0x83, 0xEC, + 0xBB, 0x6E, 0x40, 0x23, 0xDF, 0x31, 0x1F, 0xD5, 0xCE, 0xF8, 0x6F, 0xD3, 0xA6, 0x1E, 0x0D, 0xCC, + 0x47, 0x37, 0xCF, 0xF9, 0x6F, 0x53, 0xC8, 0x09, 0xC9, 0x17, 0x6C, 0xD6, 0x4E, 0x07, 0xE3, 0xB8, + 0x57, 0x9F, 0xE6, 0xCE, 0x9C, 0xC1, 0x99, 0x10, 0xDB, 0x8C, 0x50, 0xBF, 0xD2, 0x47, 0xC4, 0x9F, + 0x3A, 0x24, 0x1C, 0x78, 0x68, 0x62, 0xBA, 0x1E, 0x1E, 0xC7, 0x8F, 0xFA, 0xD8, 0x8F, 0x8C, 0xC2, + 0x75, 0x7E, 0xBE, 0xEC, 0x90, 0x40, 0x9E, 0x33, 0x61, 0xAA, 0xA8, 0xEF, 0x4B, 0xC2, 0x8C, 0xD7, + 0xA7, 0x3E, 0x6E, 0x0A, 0xC2, 0x51, 0x80, 0x06, 0x70, 0xC8, 0x3F, 0x9A, 0x7D, 0xE2, 0x4B, 0x27, + 0x99, 0x27, 0x8D, 0xEA, 0x60, 0x5C, 0x50, 0xFC, 0xE4, 0x94, 0xFF, 0x36, 0x07, 0xC8, 0x71, 0x88, + 0xDF, 0x35, 0xCF, 0xF8, 0x65, 0x1A, 0x38, 0x38, 0x28, 0x07, 0xC8, 0x21, 0x51, 0x68, 0x36, 0xE0, + 0x4C, 0x1F, 0x05, 0x5D, 0x90, 0xC1, 0xE8, 0xC0, 0x2C, 0xD7, 0xAA, 0xB3, 0x13, 0x01, 0xE9, 0xF6, + 0x98, 0xC9, 0xCF, 0xC4, 0x8F, 0x12, 0x6C, 0x0A, 0x66, 0xE4, 0x54, 0x11, 0x8A, 0x20, 0x8F, 0x74, + 0xFD, 0x32, 0x61, 0xB8, 0x1F, 0x9A, 0x21, 0x0B, 0x30, 0xB3, 0x7B, 0xB1, 0x4B, 0xBA, 0x51, 0x80, + 0xA7, 0xA9, 0x02, 0xD5, 0x44, 0x36, 0x0C, 0xCA, 0x23, 0xDC, 0xB9, 0x23, 0xAC, 0x9C, 0x4C, 0xD6, + 0xC1, 0x2E, 0x0D, 0x70, 0x46, 0x50, 0xEE, 0x78, 0xD4, 0xBE, 0x2B, 0x87, 0x0C, 0x05, 0x6C, 0x91, + 0x18, 0xB9, 0x0C, 0x07, 0xF3, 0xB4, 0x18, 0x0C, 0x5E, 0xA0, 0x4C, 0x05, 0x24, 0x87, 0xC4, 0xF7, + 0x88, 0x8F, 0x57, 0x89, 0x95, 0x12, 0x8A, 0xA4, 0xE2, 0x5C, 0x62, 0x86, 0x42, 0xFA, 0xDD, 0xCC, + 0x03, 0x62, 0xD2, 0xA6, 0x74, 0x7C, 0xAD, 0x5A, 0xFD, 0xB1, 0xD9, 0xC3, 0xC2, 0x5F, 0x28, 0x62, + 0xF4, 0x7E, 0x27, 0xF3, 0xD8, 0xF8, 0x77, 0x1F, 0x3B, 0x04, 0x29, 0xDA, 0x0C, 0x3C, 0xE5, 0xAC, + 0x0A, 0x9E, 0xD6, 0x15, 0xE4, 0x3B, 0x8A, 0x46, 0x03, 0x02, 0xDE, 0x46, 0x22, 0x14, 0x3C, 0x38, + 0x03, 0x61, 0x3F, 0xC0, 0xFA, 0x74, 0x1D, 0x0C, 0x49, 0x44, 0xAC, 0x06, 0x62, 0x89, 0x05, 0x7D, + 0x34, 0x2E, 0xE7, 0xAC, 0xE0, 0x87, 0x89, 0x25, 0x90, 0x6A, 0xB6, 0x06, 0x27, 0x87, 0x3D, 0xA5, + 0xAC, 0xF0, 0xD0, 0xD2, 0x13, 0x73, 0x85, 0x89, 0x39, 0x73, 0xFF, 0x29, 0x28, 0xA7, 0x19, 0xFB, + 0xA8, 0x13, 0x31, 0x46, 0xFD, 0x70, 0x8D, 0x9B, 0x3F, 0x45, 0x21, 0x23, 0xEE, 0xA4, 0x9C, 0x80, + 0x62, 0x86, 0x03, 0x04, 0xF5, 0xAA, 0x83, 0xD9, 0x08, 0x63, 0x48, 0x5D, 0x1F, 0x0D, 0x01, 0xEE, + 0x6E, 0xD7, 0xC3, 0x53, 0x3B, 0x0A, 0x42, 0xA8, 0x1C, 0x03, 0x4A, 0x80, 0x32, 0x68, 0x16, 0x00, + 0xC8, 0x13, 0x96, 0xED, 0xCE, 0x94, 0x46, 0x8C, 0xAB, 0x04, 0x2A, 0x52, 0x90, 0x47, 0xD8, 0x04, + 0x46, 0xD2, 0xED, 0xD5, 0xD4, 0xE7, 0xD5, 0x39, 0x1E, 0xD3, 0xEE, 0x61, 0xFB, 0x0E, 0x3B, 0x3F, + 0x15, 0xCB, 0x85, 0x28, 0x35, 0x15, 0xE2, 0x0F, 0x22, 0x56, 0xE6, 0x05, 0x61, 0xB0, 0xC6, 0x1E, + 0xE1, 0x89, 0x64, 0x8A, 0x7A, 0x3D, 0x8B, 0x59, 0xF3, 0xC9, 0x60, 0xAC, 0x54, 0x0B, 0x82, 0x2C, + 0x0F, 0x75, 0xB0, 0x97, 0x89, 0x4B, 0x9C, 0x28, 0xE3, 0x29, 0x09, 0x82, 0x5C, 0xF5, 0xC8, 0x55, + 0xA8, 0xC6, 0xD3, 0x1F, 0x0B, 0x82, 0x14, 0x31, 0x36, 0x0A, 0xA7, 0x42, 0xEC, 0x01, 0x0C, 0xB2, + 0x20, 0xC2, 0x99, 0x91, 0x59, 0x8B, 0x2B, 0x01, 0xF2, 0xBB, 0x18, 0x00, 0x1C, 0x1B, 0xE9, 0x30, + 0x57, 0x52, 0x97, 0x4D, 0x6F, 0x56, 0x15, 0x50, 0x3B, 0x96, 0x40, 0x2E, 0x44, 0x7C, 0x6A, 0x56, + 0x8E, 0xBA, 0x56, 0xCF, 0x6A, 0x23, 0x38, 0xBA, 0xE0, 0x0A, 0x5E, 0x35, 0xE7, 0x10, 0x4C, 0x3A, + 0x81, 0xEB, 0x16, 0xFB, 0x84, 0xEB, 0x9E, 0x54, 0x4F, 0x1A, 0x73, 0xD9, 0xCF, 0xE7, 0x29, 0xF6, + 0x8A, 0x66, 0x86, 0x71, 0xA2, 0xA0, 0xD9, 0xA3, 0x43, 0x1C, 0x4C, 0x8B, 0xA2, 0x1A, 0xCF, 0x1A, + 0x4E, 0x7A, 0x1D, 0x41, 0x5C, 0x0E, 0x71, 0x91, 0xA0, 0x5E, 0xB3, 0xEB, 0xB5, 0x84, 0xA0, 0x02, + 0x16, 0xA2, 0x8E, 0x87, 0x9D, 0x34, 0xD4, 0x1C, 0xEC, 0xA2, 0xC8, 0x63, 0x05, 0xED, 0x50, 0x95, + 0xFF, 0xC6, 0xC2, 0xD7, 0x7F, 0xF2, 0x36, 0xDE, 0x12, 0xBE, 0xFC, 0x6B, 0x9A, 0x26, 0x08, 0x1A, + 0x0C, 0x30, 0x82, 0x73, 0x36, 0x96, 0xAD, 0x66, 0xB1, 0xB8, 0x89, 0xB0, 0x58, 0xD2, 0x60, 0xE6, + 0xDC, 0x93, 0xA6, 0xFF, 0xE2, 0x5C, 0xA6, 0x4B, 0xED, 0x28, 0x9C, 0x05, 0xF9, 0x12, 0x0A, 0x33, + 0x55, 0x27, 0xF4, 0x88, 0x70, 0x63, 0xE4, 0xFB, 0xDC, 0xB6, 0x32, 0x0B, 0x60, 0xE2, 0xE9, 0x12, + 0xA5, 0x16, 0xF1, 0xC9, 0xAB, 0x98, 0xB4, 0xEB, 0x22, 0x28, 0xD5, 0x0C, 0x6B, 0x25, 0xA4, 0x30, + 0x8F, 0x92, 0x90, 0x3D, 0x40, 0x1F, 0xD6, 0x8B, 0xFA, 0x9D, 0x69, 0xC2, 0x5E, 0x83, 0xDC, 0x90, + 0x02, 0x82, 0x6E, 0x07, 0x69, 0x55, 0xA3, 0x6A, 0x9C, 0xC0, 0x1F, 0xBD, 0xE0, 0x30, 0xA9, 0x72, + 0xBD, 0xBE, 0xD0, 0x7D, 0x9F, 0xCC, 0xF7, 0xEB, 0x24, 0x80, 0xE6, 0xAC, 0x59, 0x85, 0x4F, 0xA1, + 0x71, 0xD7, 0x2A, 0x3C, 0xE0, 0x57, 0x38, 0x7C, 0x9D, 0x53, 0x17, 0xFD, 0xB5, 0xD4, 0x11, 0x7D, + 0xFA, 0xA5, 0x2C, 0xF3, 0xEF, 0x60, 0x58, 0xE4, 0x54, 0xD8, 0x37, 0x0E, 0xCB, 0xF5, 0x09, 0xB7, + 0xF4, 0x45, 0x55, 0x49, 0xED, 0x2E, 0xCB, 0x6A, 0x02, 0x62, 0x7C, 0x68, 0x21, 0x01, 0xB4, 0x92, + 0xE6, 0xC2, 0x99, 0x55, 0x73, 0xBB, 0xC4, 0xF3, 0xCA, 0x1E, 0x1D, 0xCD, 0x55, 0x8F, 0x82, 0x9F, + 0xE7, 0xFD, 0x3A, 0xEF, 0xFE, 0x7B, 0x65, 0x47, 0x10, 0x73, 0xDF, 0x40, 0xF6, 0xFE, 0x93, 0x68, + 0x06, 0xCA, 0x3D, 0x49, 0xB2, 0xCE, 0xA3, 0x0F, 0x60, 0x5D, 0x74, 0x98, 0xAC, 0x91, 0x71, 0x25, + 0x1C, 0x11, 0x58, 0x89, 0xCD, 0x35, 0xA3, 0x01, 0x0D, 0x89, 0x58, 0xE6, 0x05, 0xD8, 0x43, 0xBC, + 0xC8, 0x2F, 0xB6, 0xE1, 0xB9, 0xE6, 0x91, 0xBB, 0x94, 0xCA, 0x94, 0x6D, 0xF4, 0x61, 0x4B, 0x87, + 0x8A, 0xAC, 0x00, 0x49, 0xBC, 0x0A, 0xE7, 0x15, 0x8A, 0x7B, 0xC1, 0xB7, 0xF5, 0x7B, 0x63, 0x38, + 0x09, 0xDC, 0x6E, 0x80, 0x27, 0xA9, 0x58, 0x23, 0xF9, 0x34, 0xE5, 0x4A, 0x6F, 0x79, 0x8F, 0x16, + 0x71, 0x2D, 0xAD, 0xAE, 0x34, 0xC2, 0x78, 0x8E, 0x65, 0xD1, 0x23, 0xE9, 0x02, 0x4B, 0x55, 0x17, + 0xA0, 0xCF, 0x92, 0x4D, 0xB8, 0x26, 0xC9, 0x41, 0x3E, 0xF4, 0xB0, 0xCB, 0xC4, 0xC2, 0x9B, 0x57, + 0xC7, 0x93, 0x42, 0x84, 0x94, 0x67, 0xDD, 0x5B, 0xE2, 0x99, 0xAD, 0x9F, 0x52, 0xDF, 0x2C, 0xA3, + 0xE5, 0x31, 0xB5, 0x9C, 0x3C, 0x55, 0x3C, 0x2D, 0xB1, 0xC2, 0x3C, 0x38, 0xD3, 0x97, 0x09, 0x0C, + 0x46, 0xE0, 0x3F, 0xB4, 0xFA, 0x29, 0x5F, 0x3F, 0xAF, 0xBE, 0x14, 0x27, 0xCB, 0x9E, 0x85, 0x94, + 0x48, 0x5B, 0x6C, 0x2E, 0x0A, 0x1A, 0x73, 0x98, 0xCD, 0x70, 0x5F, 0x58, 0x79, 0xC0, 0x6A, 0xAB, + 0x8F, 0xA0, 0x58, 0x72, 0x17, 0xC2, 0x6D, 0x26, 0xD8, 0xB6, 0xE8, 0xDE, 0xD9, 0xF2, 0xAC, 0x76, + 0xCA, 0x6F, 0xF6, 0x2A, 0xB6, 0x47, 0xC3, 0x1C, 0x0E, 0xA8, 0x03, 0x9A, 0x44, 0x0C, 0x37, 0xE5, + 0x92, 0xEE, 0x49, 0xE2, 0xD4, 0x27, 0xCB, 0xD3, 0x2E, 0x87, 0x41, 0x1E, 0x9A, 0xA2, 0x66, 0x35, + 0x7E, 0xAF, 0x93, 0x5F, 0x45, 0x31, 0x3C, 0x86, 0xFE, 0xC6, 0xEF, 0x5B, 0x4C, 0x1B, 0x8B, 0x30, + 0xCB, 0xA7, 0x41, 0x6D, 0x71, 0x09, 0x16, 0x57, 0x7A, 0xC4, 0x71, 0xB0, 0x5F, 0xB8, 0x39, 0x8E, + 0x67, 0x77, 0xFC, 0xC7, 0xC9, 0x2D, 0xBF, 0x3C, 0x98, 0x3D, 0x9D, 0x38, 0xE7, 0xCF, 0x00, 0xF2, + 0x4F, 0x06, 0xE4, 0x92, 0x5F, 0xB1, 0x3D, 0x14, 0x86, 0x2D, 0x95, 0xDF, 0x8B, 0xE7, 0x1E, 0x2E, + 0x08, 0x12, 0x87, 0x0C, 0x15, 0xE2, 0xB4, 0x54, 0x8F, 0x76, 0xE9, 0xDC, 0x35, 0x71, 0x5D, 0x2C, + 0x86, 0x15, 0x40, 0xB5, 0xA5, 0x16, 0x96, 0xE5, 0xAA, 0xE0, 0x9A, 0x9D, 0x52, 0xAD, 0xC7, 0x8F, + 0x9E, 0x3D, 0x7D, 0x7A, 0xDA, 0x7C, 0xEC, 0x77, 0xC2, 0x41, 0xF2, 0xF7, 0x57, 0x71, 0x09, 0x16, + 0xBD, 0x8C, 0xC1, 0x42, 0x34, 0x3C, 0x3F, 0x16, 0xD2, 0xE6, 0x34, 0x38, 0x06, 0x15, 0x56, 0x28, + 0x95, 0xE4, 0xC6, 0x32, 0xBD, 0x52, 0x92, 0x10, 0x82, 0xB4, 0x83, 0x82, 0x25, 0x24, 0x82, 0x4C, + 0xC4, 0xB4, 0x22, 0x4A, 0x9A, 0x2A, 0x22, 0xBB, 0x43, 0xC7, 0xF3, 0xAA, 0x0B, 0x6B, 0x92, 0xB0, + 0x4F, 0xA8, 0xB0, 0xB3, 0x4A, 0x20, 0xB0, 0x09, 0x76, 0x7E, 0x33, 0xB2, 0x82, 0x26, 0xD3, 0x2F, + 0x71, 0x7B, 0x6E, 0xFD, 0x2F, 0xA7, 0x76, 0x03, 0xD4, 0xC7, 0x3C, 0xDA, 0x93, 0x93, 0xAB, 0xC5, + 0xCC, 0x43, 0x90, 0x71, 0xAA, 0xD6, 0x7B, 0x2C, 0x02, 0x17, 0xE0, 0x5D, 0xEA, 0xD6, 0x05, 0x29, + 0x32, 0x05, 0x8B, 0xF3, 0xAB, 0xA9, 0x8A, 0xC9, 0x8A, 0xBA, 0x8C, 0x44, 0xBC, 0xAC, 0x51, 0x48, + 0x88, 0xA3, 0x03, 0x11, 0x59, 0x43, 0xE4, 0x45, 0xE0, 0xDA, 0x5A, 0x55, 0xB5, 0xFE, 0xF3, 0xC7, + 0x8B, 0x4B, 0x0D, 0x92, 0xAC, 0x3A, 0xAE, 0xD5, 0xAB, 0x55, 0xFD, 0xFC, 0x58, 0x92, 0x6C, 0x2C, + 0xEB, 0x99, 0x6A, 0xDD, 0x0A, 0x51, 0xF5, 0x33, 0x10, 0x55, 0xAD, 0x37, 0xB6, 0x17, 0x75, 0xA6, + 0x5A, 0x42, 0x12, 0x08, 0x19, 0x3F, 0x3D, 0x3D, 0xDB, 0x5E, 0xD0, 0x53, 0xD0, 0xE9, 0x37, 0x90, + 0x74, 0x06, 0xD6, 0x9D, 0xEE, 0x62, 0xDC, 0xA9, 0x6A, 0x71, 0x39, 0xA7, 0x8D, 0xEA, 0xB8, 0x71, + 0xB6, 0x83, 0x9C, 0x27, 0x6A, 0x72, 0x2B, 0xC9, 0x43, 0x36, 0x1D, 0xA9, 0x56, 0xFB, 0xE7, 0xE7, + 0x5A, 0x03, 0x74, 0xAC, 0x3F, 0x3B, 0xDD, 0x5E, 0x76, 0x43, 0xB5, 0x7E, 0xE1, 0x4A, 0x9E, 0xD4, + 0x41, 0x50, 0x63, 0x07, 0x25, 0x4F, 0x54, 0xEB, 0xA5, 0x90, 0x04, 0x52, 0xC6, 0xB5, 0xA7, 0x3B, + 0xA8, 0x04, 0xE1, 0xF5, 0x8B, 0x90, 0x04, 0xF1, 0xC5, 0xC3, 0xEB, 0x81, 0x92, 0xA0, 0x50, 0x0A, + 0xD7, 0xDC, 0x93, 0xA7, 0x8B, 0xD5, 0xA7, 0x70, 0xF9, 0xBE, 0x34, 0xFE, 0x1C, 0x41, 0x4D, 0x67, + 0x93, 0x8D, 0x93, 0x38, 0xE1, 0x03, 0x93, 0xE4, 0xE0, 0x61, 0xF9, 0x9B, 0xD3, 0x24, 0x7B, 0x4A, + 0xA0, 0x5A, 0xB5, 0xEA, 0x1A, 0x0B, 0x04, 0x6F, 0xBE, 0x0A, 0x0A, 0xE6, 0x82, 0x01, 0xAA, 0x02, + 0xA2, 0x44, 0x0E, 0x2B, 0x7D, 0x34, 0x86, 0x18, 0x3D, 0x51, 0x73, 0x79, 0xBD, 0x55, 0x89, 0x58, + 0xA2, 0x2D, 0x1A, 0xAB, 0xD6, 0xE9, 0xC9, 0x3A, 0x7F, 0xEF, 0x00, 0x47, 0x47, 0x74, 0x70, 0x1F, + 0x87, 0xE1, 0xC6, 0x88, 0xCC, 0x58, 0x55, 0xEB, 0x2A, 0x1B, 0xEF, 0x82, 0x4B, 0xB9, 0xBE, 0x03, + 0x2E, 0x39, 0x75, 0x24, 0x34, 0xE5, 0x7A, 0x02, 0x4D, 0x5D, 0x9D, 0x65, 0xC4, 0xD7, 0x04, 0x66, + 0x9D, 0xB6, 0xBB, 0xE0, 0xC2, 0x9B, 0x78, 0x80, 0x42, 0xB6, 0x31, 0x2A, 0x29, 0x23, 0x94, 0xB5, + 0x64, 0x74, 0x30, 0x44, 0x32, 0x55, 0xFE, 0x01, 0x78, 0x84, 0x88, 0x45, 0x81, 0x78, 0xFA, 0xBE, + 0x31, 0x22, 0x33, 0x56, 0xE8, 0x87, 0xD9, 0xF8, 0x60, 0xA8, 0xE4, 0xD4, 0xF9, 0x27, 0xE0, 0x32, + 0xC0, 0x36, 0x41, 0xDE, 0x07, 0xEC, 0xBA, 0xD0, 0xB2, 0x36, 0xC7, 0xA6, 0xC0, 0x0E, 0xF8, 0xC8, + 0x63, 0xE5, 0x46, 0x1C, 0x6F, 0xBC, 0x46, 0x9C, 0x13, 0xF7, 0xB5, 0x16, 0x8A, 0xD5, 0xE5, 0xEB, + 0x96, 0x37, 0x34, 0xD3, 0x73, 0xCB, 0x15, 0x42, 0x0D, 0x84, 0xE0, 0xAE, 0xB8, 0xE7, 0xDB, 0x5A, + 0x46, 0x5D, 0xB5, 0x5E, 0x04, 0x68, 0x22, 0xBE, 0x86, 0xDD, 0x65, 0xD1, 0xF3, 0x1E, 0x3B, 0xCA, + 0xAF, 0x70, 0x23, 0xB7, 0xCB, 0x0A, 0xEC, 0x45, 0x80, 0xB1, 0xBF, 0x9B, 0x94, 0x27, 0xD0, 0xCC, + 0x60, 0xB0, 0x9B, 0x10, 0x58, 0xB0, 0xDE, 0xE2, 0x01, 0x41, 0xDF, 0xC3, 0x82, 0x0B, 0x8D, 0x3A, + 0x1B, 0xA7, 0x05, 0xF0, 0xA8, 0xD6, 0xE5, 0xEF, 0x57, 0x1B, 0x17, 0x29, 0xF9, 0xF0, 0xE9, 0x21, + 0x11, 0x2E, 0xAB, 0x53, 0xA2, 0xA0, 0xBA, 0x70, 0xB3, 0xB9, 0x3C, 0x73, 0x1E, 0x7A, 0xC3, 0xB9, + 0xC4, 0xAE, 0x54, 0x41, 0xF1, 0x7C, 0x46, 0xCD, 0x99, 0xF9, 0x30, 0x1B, 0xBF, 0x5D, 0x05, 0x03, + 0x25, 0x3E, 0x74, 0x11, 0xD9, 0xBC, 0xAF, 0xA4, 0x8C, 0x02, 0x29, 0xE5, 0x05, 0x8C, 0xF6, 0x05, + 0x97, 0x9C, 0xF6, 0x60, 0x98, 0x25, 0x56, 0x1F, 0x1A, 0x38, 0x50, 0xA4, 0x4F, 0x9D, 0xCD, 0x1F, + 0x47, 0x24, 0x7C, 0xAA, 0x05, 0xA8, 0xBD, 0x86, 0xC1, 0xC6, 0x5D, 0x26, 0x15, 0xF0, 0x8D, 0xDB, + 0xCB, 0x65, 0xC4, 0xE8, 0x2E, 0x9D, 0xE5, 0x36, 0xF2, 0xFD, 0xC9, 0x2E, 0x6D, 0xA5, 0xED, 0xD1, + 0xC8, 0xD9, 0x5E, 0x02, 0xF4, 0x94, 0xB7, 0xAE, 0x4B, 0xEC, 0xED, 0xBB, 0x12, 0x74, 0x94, 0x97, + 0xB4, 0xFF, 0x40, 0xFE, 0x6F, 0x5C, 0xC5, 0xB1, 0xBD, 0x79, 0x81, 0xC0, 0x36, 0xA0, 0x78, 0xD3, + 0x56, 0x6E, 0x6F, 0xDE, 0xDC, 0xBE, 0x7D, 0xBF, 0x9F, 0xEA, 0x00, 0x73, 0x1E, 0xA8, 0x30, 0x70, + 0x6B, 0x0F, 0x5D, 0x13, 0x40, 0x89, 0xFA, 0x36, 0x38, 0xD5, 0x25, 0x50, 0xD7, 0xB7, 0xEF, 0xF6, + 0x85, 0x52, 0xFD, 0x70, 0x30, 0xD5, 0xBF, 0x07, 0x9C, 0x3E, 0x78, 0x78, 0x88, 0xBD, 0x2D, 0xB0, + 0x92, 0x8C, 0x1C, 0x2F, 0xE5, 0x15, 0x1F, 0x1D, 0xEC, 0x46, 0x2E, 0x53, 0xE5, 0x1F, 0x70, 0x1B, + 0x07, 0x51, 0xF1, 0x41, 0x28, 0xBD, 0x4D, 0xF2, 0x48, 0x4E, 0xD5, 0xBA, 0x19, 0x0F, 0x68, 0x18, + 0x05, 0x0F, 0x6C, 0xA8, 0xCB, 0x11, 0xD9, 0xE5, 0xC9, 0xE0, 0x4C, 0x15, 0x89, 0x48, 0xFA, 0x68, + 0x90, 0x3F, 0xD9, 0xCF, 0x30, 0xA9, 0x57, 0x1B, 0x5F, 0x15, 0x15, 0x2E, 0xFC, 0x5B, 0x02, 0xD3, + 0xDD, 0xA2, 0xEF, 0x74, 0x79, 0xDF, 0x79, 0xD1, 0xDE, 0x4F, 0x29, 0xEB, 0x1E, 0xAC, 0xE1, 0x74, + 0x0F, 0xDA, 0x70, 0x14, 0xF9, 0x6D, 0x67, 0x06, 0xD3, 0x96, 0x37, 0x11, 0x09, 0x23, 0xDC, 0x3B, + 0x6F, 0x73, 0x03, 0x91, 0x7F, 0xA8, 0x3E, 0xDE, 0x25, 0x75, 0x52, 0x35, 0x8A, 0x99, 0x73, 0x32, + 0xCB, 0x9B, 0x27, 0x5F, 0x35, 0x6B, 0x4E, 0xD6, 0x6A, 0xBB, 0x4B, 0xD2, 0x70, 0x4B, 0x6C, 0x4C, + 0x3C, 0xFE, 0xD2, 0xE3, 0xA6, 0x80, 0xE4, 0x78, 0x25, 0x26, 0x4A, 0x5B, 0x1E, 0xED, 0x82, 0x4D, + 0x7D, 0x17, 0x6C, 0xF2, 0x1A, 0x15, 0xE1, 0x39, 0xFD, 0x46, 0x9D, 0xA6, 0x56, 0x3F, 0xFB, 0x96, + 0xF0, 0x74, 0x06, 0x9B, 0xD7, 0x34, 0xE0, 0x51, 0xAD, 0xAB, 0x77, 0xFB, 0xA9, 0x69, 0x7C, 0xB2, + 0x07, 0xD6, 0xB4, 0x9D, 0x2A, 0x98, 0x30, 0xEA, 0xD0, 0x4B, 0xB1, 0xD1, 0x16, 0x68, 0x8C, 0xB8, + 0xE2, 0xBF, 0xEF, 0x09, 0x8D, 0xD1, 0xC3, 0xD1, 0xF8, 0xCA, 0x1D, 0x66, 0xF4, 0x3D, 0xE0, 0x13, + 0xA0, 0xD1, 0x87, 0x6E, 0x1F, 0x6D, 0x8C, 0x51, 0xC2, 0xA7, 0x5A, 0xEF, 0xD1, 0x48, 0x79, 0xF1, + 0xFA, 0x72, 0x2F, 0x58, 0xA5, 0x93, 0x1E, 0x06, 0xAF, 0xCC, 0xE4, 0x43, 0x63, 0xE6, 0x61, 0x7F, + 0xF3, 0xA4, 0xE2, 0x4C, 0xAA, 0xF5, 0x0A, 0xFB, 0xA1, 0xD2, 0xA6, 0x41, 0xB2, 0xED, 0x68, 0x2F, + 0xA8, 0x89, 0x99, 0x0F, 0x03, 0x99, 0x34, 0xFA, 0xD0, 0x78, 0xF5, 0xFA, 0x24, 0x08, 0x68, 0xB0, + 0x31, 0x64, 0x09, 0x9F, 0x6A, 0xBD, 0x2C, 0xBF, 0x16, 0xA3, 0xBD, 0xC0, 0x95, 0xCE, 0x7A, 0x18, + 0xC4, 0x32, 0x9B, 0x0F, 0x0D, 0xDA, 0xD0, 0xF5, 0xC8, 0x60, 0x63, 0xC8, 0x04, 0x97, 0x6A, 0xFD, + 0x56, 0x7E, 0x0E, 0x9F, 0x7B, 0x81, 0x4B, 0xCE, 0x78, 0x18, 0xB0, 0x12, 0x6B, 0x0F, 0x0D, 0x95, + 0x63, 0x8F, 0x36, 0x06, 0x0A, 0x78, 0x54, 0xEB, 0xBA, 0xFD, 0xBB, 0xA2, 0x5D, 0xD3, 0x91, 0xCF, + 0x5F, 0xFC, 0x53, 0x6E, 0xDE, 0xE8, 0x7B, 0x41, 0x8C, 0x4F, 0x7D, 0x18, 0xBC, 0x84, 0xD1, 0x87, + 0x46, 0x4B, 0xBC, 0x04, 0xDC, 0x41, 0x9B, 0x97, 0xC3, 0x94, 0x91, 0xBF, 0xFB, 0x02, 0x23, 0xE5, + 0x0A, 0xED, 0xA7, 0x20, 0x66, 0xF3, 0xEE, 0x63, 0xD1, 0x3E, 0x33, 0xF2, 0xD0, 0x38, 0xB9, 0xC8, + 0xC6, 0x1F, 0x1C, 0xCC, 0xB6, 0x79, 0xF1, 0x22, 0xC7, 0xAB, 0x5A, 0xCF, 0xE1, 0x40, 0xB9, 0x16, + 0x07, 0xFB, 0x5A, 0x72, 0xE4, 0xE7, 0xDF, 0x07, 0x6A, 0x05, 0x7B, 0xBF, 0x0B, 0xE0, 0x60, 0x81, + 0x47, 0xBB, 0xFE, 0x56, 0xEF, 0x53, 0x17, 0xD8, 0x13, 0xF8, 0xDE, 0xCB, 0xE3, 0xFD, 0x02, 0x38, + 0x53, 0x62, 0x6F, 0x18, 0xE6, 0xEC, 0xDE, 0x07, 0x8C, 0xE9, 0x66, 0x04, 0xF1, 0x58, 0x40, 0xEE, + 0x41, 0x5E, 0x87, 0x94, 0x24, 0x93, 0x8F, 0x6E, 0x30, 0x2B, 0x87, 0x8C, 0x78, 0x9E, 0x6A, 0xBD, + 0xC0, 0x4C, 0xB9, 0xE5, 0xC3, 0xF3, 0x63, 0x49, 0xF0, 0x70, 0x29, 0xC9, 0x0B, 0xFF, 0x7C, 0xDF, + 0x38, 0xEA, 0xAB, 0xD6, 0x2D, 0xDF, 0x44, 0x0D, 0xB2, 0xF8, 0xD1, 0xE6, 0xC2, 0x84, 0x13, 0xB1, + 0x1F, 0x50, 0x50, 0x2A, 0x03, 0x29, 0xD9, 0xAA, 0xAA, 0x2A, 0xE9, 0x28, 0x77, 0xCE, 0xBA, 0x11, + 0xC4, 0x0A, 0x8F, 0xB2, 0xF5, 0xD3, 0xF1, 0x6F, 0x61, 0xED, 0xD5, 0x5F, 0xD6, 0x9E, 0x1F, 0xFB, + 0x68, 0x89, 0xBB, 0x57, 0xA0, 0x70, 0x2E, 0x77, 0xB1, 0xAF, 0x10, 0x95, 0x6D, 0xA6, 0x10, 0x9E, + 0x98, 0xED, 0xA7, 0xC9, 0xCC, 0x9A, 0xDB, 0x67, 0x93, 0x3E, 0xB0, 0x7D, 0x58, 0xD2, 0x8A, 0x1D, + 0x37, 0x49, 0x3F, 0xE4, 0xC3, 0xCC, 0xFD, 0xFF, 0xFB, 0xEF, 0xBA, 0x98, 0x21, 0xFD, 0x6E, 0x4E, + 0x31, 0x55, 0x09, 0x03, 0xBB, 0xA5, 0xAE, 0xDA, 0x9A, 0xB1, 0xC2, 0xF2, 0xE3, 0x65, 0xA6, 0xCF, + 0x11, 0x2F, 0xF1, 0xF5, 0x79, 0x68, 0x07, 0x64, 0xC0, 0xAC, 0x7F, 0x39, 0xD4, 0x8E, 0xFA, 0xD8, + 0x67, 0x15, 0xE4, 0x38, 0x37, 0x43, 0x18, 0xBC, 0x22, 0x21, 0xC3, 0xE0, 0x05, 0xAD, 0x74, 0xFD, + 0xF6, 0x75, 0x5B, 0x6E, 0x51, 0x79, 0x45, 0x91, 0x83, 0x9D, 0x92, 0xE1, 0x46, 0xBE, 0x90, 0xA3, + 0xE9, 0xD3, 0x74, 0xA8, 0x74, 0xB4, 0x2B, 0x7D, 0xEA, 0x41, 0xD0, 0xB6, 0x9B, 0xB2, 0x3C, 0x68, + 0x57, 0x15, 0x9E, 0xE3, 0xFA, 0xD4, 0x46, 0x21, 0x2E, 0xA5, 0x89, 0x5E, 0x32, 0xDB, 0xAD, 0xAB, + 0x4A, 0xB2, 0xF6, 0xB9, 0xA8, 0xF1, 0x0D, 0x4F, 0x60, 0xF4, 0x5D, 0x53, 0x10, 0x89, 0x47, 0x8A, + 0x25, 0x53, 0x8C, 0xE5, 0x97, 0xF3, 0x65, 0xEA, 0x63, 0xC9, 0x22, 0x1E, 0x5C, 0xE6, 0x89, 0x65, + 0x64, 0xA5, 0xD4, 0x51, 0xA7, 0x4F, 0x18, 0xA7, 0x2C, 0xD5, 0x4A, 0x09, 0x55, 0x52, 0x4A, 0xCC, + 0x00, 0xB3, 0x28, 0xF0, 0x9B, 0x31, 0x00, 0x1B, 0x32, 0xE5, 0xBA, 0xF5, 0xF1, 0x87, 0xA9, 0x1D, + 0x1F, 0x8B, 0x97, 0x5D, 0xA9, 0x77, 0x31, 0x44, 0x41, 0xEB, 0x87, 0xE9, 0x55, 0x85, 0x38, 0xF1, + 0x63, 0x98, 0x03, 0xC6, 0xED, 0xF8, 0x63, 0xD3, 0xE5, 0xFF, 0x71, 0x41, 0xBB, 0xD6, 0x2B, 0xAC, + 0x87, 0x7D, 0xED, 0xA6, 0x65, 0x4D, 0x39, 0x37, 0xF5, 0x70, 0xC5, 0xA3, 0x5D, 0xED, 0x63, 0x80, + 0x3F, 0x47, 0x18, 0x84, 0x31, 0xAA, 0xFC, 0x30, 0xBD, 0x8E, 0x15, 0x97, 0xF8, 0x24, 0xEC, 0x61, + 0xC7, 0x50, 0x42, 0x86, 0x58, 0x14, 0x9A, 0x70, 0xFA, 0xA6, 0x22, 0xC7, 0xF1, 0x47, 0x3D, 0xD6, + 0x63, 0x98, 0x46, 0xB1, 0x5B, 0x99, 0x97, 0x3D, 0x6A, 0x8B, 0x57, 0x3A, 0x2B, 0x34, 0x20, 0x5D, + 0xE2, 0x37, 0xA5, 0x6E, 0xB8, 0x75, 0x05, 0x33, 0x81, 0x7B, 0x78, 0x48, 0x71, 0x00, 0x38, 0x1A, + 0x5A, 0x49, 0xC6, 0x61, 0x49, 0x8F, 0x0D, 0x77, 0x81, 0x20, 0xC0, 0x7D, 0x3A, 0xC4, 0x79, 0x9A, + 0xEE, 0x72, 0x21, 0x69, 0x7E, 0x96, 0x74, 0xE3, 0x2A, 0xDB, 0x6B, 0xDE, 0x3A, 0xAA, 0xC6, 0x46, + 0x6F, 0xA5, 0xD0, 0x15, 0x3C, 0xB5, 0xD8, 0x20, 0x2D, 0xED, 0xCA, 0x68, 0x1B, 0xD7, 0x3A, 0x70, + 0x5E, 0xB7, 0x8E, 0x34, 0x3F, 0xF2, 0xBC, 0xA3, 0xD6, 0xB5, 0xFE, 0xF7, 0xDF, 0xD7, 0x4D, 0x1E, + 0x04, 0x37, 0xCD, 0x19, 0xE2, 0xAD, 0x56, 0x4B, 0x86, 0xC2, 0x05, 0x38, 0x32, 0xC3, 0xDE, 0x68, + 0xB7, 0x8E, 0x8E, 0xDA, 0x46, 0x76, 0xDC, 0x6A, 0xEB, 0xA6, 0xB8, 0x2E, 0x80, 0x36, 0x92, 0x4F, + 0x38, 0x6B, 0x5C, 0x3F, 0x7E, 0x7C, 0x73, 0xD4, 0x6A, 0xB5, 0x2F, 0x78, 0x88, 0x99, 0x47, 0x70, + 0xA8, 0x95, 0x10, 0xB6, 0xA5, 0x5C, 0xE2, 0x5C, 0xB4, 0x2F, 0xB0, 0x36, 0xD4, 0x4D, 0x97, 0xFF, + 0x29, 0xA1, 0x6E, 0xFE, 0x82, 0xE6, 0x6A, 0x4C, 0x37, 0xB0, 0x16, 0xEA, 0x20, 0x1C, 0xF3, 0xB1, + 0x2B, 0xC6, 0xA5, 0xF4, 0xAD, 0xA4, 0x1C, 0xAD, 0xAB, 0x8D, 0x75, 0x13, 0xF3, 0x3F, 0xA5, 0x62, + 0xE3, 0x48, 0x69, 0x60, 0xDE, 0xF6, 0x45, 0x4F, 0xF3, 0x75, 0xB3, 0x0B, 0x7F, 0x74, 0x3D, 0x6E, + 0x66, 0x70, 0x42, 0x34, 0x04, 0x93, 0x5B, 0x11, 0xB1, 0x34, 0xB8, 0xF4, 0x3C, 0xAD, 0x24, 0x77, + 0xE0, 0x95, 0xF4, 0x0A, 0x74, 0xA2, 0x1B, 0xC4, 0xB3, 0x41, 0xF8, 0x98, 0xFA, 0xB6, 0x47, 0xEC, + 0xBB, 0x96, 0xC6, 0x1D, 0x87, 0x21, 0x45, 0xE4, 0xDE, 0xE0, 0x37, 0xD4, 0xC1, 0x7A, 0x1C, 0x83, + 0x7A, 0x22, 0xEE, 0x64, 0x84, 0xCA, 0xF0, 0xF9, 0x98, 0xC4, 0x60, 0x96, 0x73, 0x90, 0x66, 0x32, + 0xA2, 0x95, 0xAB, 0xCA, 0xA7, 0x90, 0x27, 0x61, 0xBC, 0x84, 0xE4, 0x3E, 0xD5, 0x8A, 0x3D, 0x36, + 0xA7, 0x63, 0x1B, 0x94, 0x22, 0x1A, 0x80, 0xF2, 0x67, 0x1B, 0xEC, 0xFD, 0xCB, 0x38, 0xAA, 0xF1, + 0xD0, 0xD5, 0x93, 0xE8, 0xFC, 0x34, 0x0B, 0x5F, 0xE8, 0x53, 0x37, 0x1E, 0xE6, 0xC3, 0xAB, 0xC9, + 0xCF, 0x10, 0x5C, 0xB2, 0x72, 0x41, 0x98, 0xDC, 0xAD, 0xA3, 0x99, 0x95, 0x57, 0xA0, 0xF6, 0x56, + 0x53, 0x67, 0x9D, 0x10, 0xC8, 0xFA, 0xAB, 0xC9, 0x0A, 0xAD, 0x0E, 0x48, 0xFD, 0xD5, 0xA4, 0xB9, + 0x46, 0x06, 0x84, 0x74, 0x35, 0x61, 0xBE, 0x7C, 0x03, 0xE5, 0x40, 0x82, 0x35, 0x22, 0xBE, 0x43, + 0x47, 0x90, 0xD3, 0x74, 0xA0, 0x81, 0x4A, 0x15, 0xE2, 0x83, 0x0D, 0x2F, 0x7F, 0x7D, 0xFD, 0xAA, + 0x55, 0xCA, 0x37, 0xD8, 0x52, 0x6C, 0x7C, 0x96, 0x0C, 0x9F, 0x2A, 0xBC, 0x8E, 0x73, 0x28, 0x7F, + 0x2A, 0x99, 0x67, 0xB5, 0x12, 0x07, 0x94, 0x53, 0x7C, 0x84, 0x18, 0xBC, 0x5B, 0x90, 0x40, 0x07, + 0x99, 0x80, 0xA6, 0x57, 0x0C, 0x13, 0x3E, 0xDF, 0x4C, 0x18, 0x54, 0x2E, 0x34, 0x00, 0xF8, 0xF1, + 0xC5, 0x07, 0xBB, 0x03, 0xD5, 0xEA, 0x1A, 0x31, 0x5C, 0xF1, 0xE9, 0x08, 0xC2, 0x40, 0x4A, 0x8E, + 0x0D, 0xBA, 0xC8, 0x8F, 0xC5, 0x85, 0x7E, 0xF1, 0x82, 0x84, 0xF5, 0xAA, 0x38, 0x3D, 0x04, 0x7B, + 0x4E, 0xB5, 0xE6, 0xD5, 0x05, 0xB0, 0x9B, 0x9F, 0x41, 0xBA, 0xE1, 0x17, 0xB9, 0x3B, 0x90, 0x04, + 0xB1, 0xB1, 0x55, 0x9C, 0x65, 0xB9, 0xD0, 0xE3, 0x05, 0x5F, 0x88, 0xE3, 0xB9, 0x9D, 0x45, 0x5A, + 0xB0, 0x1A, 0x1C, 0x9E, 0xDF, 0xBA, 0x11, 0xDE, 0x4B, 0x90, 0xFB, 0x66, 0x15, 0x68, 0xD9, 0x3D, + 0x41, 0x36, 0xFF, 0xBD, 0x5F, 0x49, 0x6F, 0x06, 0x45, 0xBD, 0xC0, 0xCC, 0x40, 0x37, 0x82, 0xAC, + 0x63, 0xAD, 0xA8, 0x28, 0x71, 0xA2, 0x79, 0x74, 0x8F, 0x62, 0x98, 0x6B, 0x3E, 0xBC, 0x97, 0x20, + 0xFF, 0x4E, 0x05, 0xE8, 0x12, 0x2D, 0xE8, 0x12, 0xE9, 0x46, 0x94, 0xE9, 0x92, 0x95, 0xBD, 0x74, + 0xF6, 0xD1, 0x3D, 0xC2, 0xD3, 0x82, 0xA7, 0x1B, 0xE3, 0xD5, 0x54, 0x85, 0x57, 0x24, 0x41, 0x81, + 0xD1, 0x82, 0x02, 0x23, 0xDD, 0x18, 0x65, 0x0A, 0x64, 0x25, 0x33, 0x55, 0x60, 0xB2, 0x26, 0xFD, + 0xE4, 0x0D, 0x15, 0xE8, 0xF0, 0x65, 0x0D, 0xE1, 0xAC, 0xF8, 0xEA, 0xC6, 0xE5, 0x3D, 0xB4, 0xE9, + 0x1E, 0x4F, 0xD0, 0xF5, 0x72, 0x41, 0xD7, 0x4B, 0xDD, 0x78, 0x72, 0x7E, 0x29, 0x1B, 0x09, 0x14, + 0x6F, 0xA2, 0x4D, 0x78, 0x45, 0x33, 0x88, 0xF6, 0x85, 0x7F, 0x42, 0xF0, 0x4E, 0xE6, 0x58, 0x92, + 0xBA, 0x9A, 0x31, 0x5D, 0x68, 0xC8, 0xC3, 0x01, 0xD3, 0x4A, 0xEF, 0x3C, 0x0C, 0xAB, 0x8C, 0xE4, + 0xAD, 0x4B, 0xA5, 0xFD, 0xF3, 0x73, 0x85, 0x06, 0x8A, 0xF8, 0x0F, 0x03, 0x4A, 0x90, 0xED, 0x50, + 0x55, 0xE4, 0x26, 0x72, 0x05, 0xF3, 0x7F, 0xCB, 0x01, 0x21, 0xA5, 0xB0, 0x1E, 0x09, 0x15, 0x17, + 0xF3, 0xFD, 0x1B, 0xF8, 0x88, 0x63, 0x4F, 0x89, 0xA3, 0x24, 0x5A, 0xE8, 0x26, 0x3F, 0xD2, 0x3A, + 0xDA, 0x44, 0x37, 0x8E, 0x26, 0xA9, 0x47, 0x41, 0x4B, 0xDE, 0x5B, 0x32, 0x15, 0x41, 0xC7, 0x2F, + 0x07, 0xD1, 0xF1, 0x4B, 0x41, 0xC7, 0x2F, 0x00, 0xD8, 0x2C, 0x03, 0x7A, 0x52, 0x43, 0x30, 0xA3, + 0xAA, 0x27, 0xBD, 0x10, 0x5A, 0x57, 0x33, 0xBF, 0xCC, 0x4C, 0x16, 0x95, 0xF2, 0x48, 0x6E, 0xD7, + 0x3E, 0x3F, 0x16, 0xFF, 0x6A, 0xEE, 0xFF, 0x81, 0x09, 0x07, 0x8B, 0x81, 0x4E, 0x00, 0x00 }; diff --git a/platform.txt b/platform.txt index f351df79..6587caa6 100644 --- a/platform.txt +++ b/platform.txt @@ -22,7 +22,7 @@ compiler.warning_flags.all=-Wall -Werror=all -Wextra compiler.path={runtime.tools.xtensa-esp32-elf-gcc.path}/bin/ compiler.sdk.path={runtime.platform.path}/tools/sdk -compiler.cpreprocessor.flags=-DESP_PLATFORM -DMBEDTLS_CONFIG_FILE="mbedtls/esp_config.h" -DHAVE_CONFIG_H "-I{compiler.sdk.path}/include/config" "-I{compiler.sdk.path}/include/app_trace" "-I{compiler.sdk.path}/include/app_update" "-I{compiler.sdk.path}/include/asio" "-I{compiler.sdk.path}/include/bootloader_support" "-I{compiler.sdk.path}/include/bt" "-I{compiler.sdk.path}/include/coap" "-I{compiler.sdk.path}/include/console" "-I{compiler.sdk.path}/include/driver" "-I{compiler.sdk.path}/include/esp-tls" "-I{compiler.sdk.path}/include/esp32" "-I{compiler.sdk.path}/include/esp_adc_cal" "-I{compiler.sdk.path}/include/esp_event" "-I{compiler.sdk.path}/include/esp_http_client" "-I{compiler.sdk.path}/include/esp_http_server" "-I{compiler.sdk.path}/include/esp_https_ota" "-I{compiler.sdk.path}/include/esp_https_server" "-I{compiler.sdk.path}/include/esp_ringbuf" "-I{compiler.sdk.path}/include/ethernet" "-I{compiler.sdk.path}/include/expat" "-I{compiler.sdk.path}/include/fatfs" "-I{compiler.sdk.path}/include/freemodbus" "-I{compiler.sdk.path}/include/freertos" "-I{compiler.sdk.path}/include/heap" "-I{compiler.sdk.path}/include/idf_test" "-I{compiler.sdk.path}/include/jsmn" "-I{compiler.sdk.path}/include/json" "-I{compiler.sdk.path}/include/libsodium" "-I{compiler.sdk.path}/include/log" "-I{compiler.sdk.path}/include/lwip" "-I{compiler.sdk.path}/include/mbedtls" "-I{compiler.sdk.path}/include/mdns" "-I{compiler.sdk.path}/include/micro-ecc" "-I{compiler.sdk.path}/include/mqtt" "-I{compiler.sdk.path}/include/newlib" "-I{compiler.sdk.path}/include/nghttp" "-I{compiler.sdk.path}/include/nvs_flash" "-I{compiler.sdk.path}/include/openssl" "-I{compiler.sdk.path}/include/protobuf-c" "-I{compiler.sdk.path}/include/protocomm" "-I{compiler.sdk.path}/include/pthread" "-I{compiler.sdk.path}/include/sdmmc" "-I{compiler.sdk.path}/include/smartconfig_ack" "-I{compiler.sdk.path}/include/soc" "-I{compiler.sdk.path}/include/spi_flash" "-I{compiler.sdk.path}/include/spiffs" "-I{compiler.sdk.path}/include/tcp_transport" "-I{compiler.sdk.path}/include/tcpip_adapter" "-I{compiler.sdk.path}/include/ulp" "-I{compiler.sdk.path}/include/unity" "-I{compiler.sdk.path}/include/vfs" "-I{compiler.sdk.path}/include/wear_levelling" "-I{compiler.sdk.path}/include/wifi_provisioning" "-I{compiler.sdk.path}/include/wpa_supplicant" "-I{compiler.sdk.path}/include/xtensa-debug-module" "-I{compiler.sdk.path}/include/esp32-camera" +compiler.cpreprocessor.flags=-DESP_PLATFORM -DMBEDTLS_CONFIG_FILE="mbedtls/esp_config.h" -DHAVE_CONFIG_H "-I{compiler.sdk.path}/include/config" "-I{compiler.sdk.path}/include/app_trace" "-I{compiler.sdk.path}/include/app_update" "-I{compiler.sdk.path}/include/asio" "-I{compiler.sdk.path}/include/bootloader_support" "-I{compiler.sdk.path}/include/bt" "-I{compiler.sdk.path}/include/coap" "-I{compiler.sdk.path}/include/console" "-I{compiler.sdk.path}/include/driver" "-I{compiler.sdk.path}/include/esp-tls" "-I{compiler.sdk.path}/include/esp32" "-I{compiler.sdk.path}/include/esp_adc_cal" "-I{compiler.sdk.path}/include/esp_event" "-I{compiler.sdk.path}/include/esp_http_client" "-I{compiler.sdk.path}/include/esp_http_server" "-I{compiler.sdk.path}/include/esp_https_ota" "-I{compiler.sdk.path}/include/esp_https_server" "-I{compiler.sdk.path}/include/esp_ringbuf" "-I{compiler.sdk.path}/include/ethernet" "-I{compiler.sdk.path}/include/expat" "-I{compiler.sdk.path}/include/fatfs" "-I{compiler.sdk.path}/include/freemodbus" "-I{compiler.sdk.path}/include/freertos" "-I{compiler.sdk.path}/include/heap" "-I{compiler.sdk.path}/include/idf_test" "-I{compiler.sdk.path}/include/jsmn" "-I{compiler.sdk.path}/include/json" "-I{compiler.sdk.path}/include/libsodium" "-I{compiler.sdk.path}/include/log" "-I{compiler.sdk.path}/include/lwip" "-I{compiler.sdk.path}/include/mbedtls" "-I{compiler.sdk.path}/include/mdns" "-I{compiler.sdk.path}/include/micro-ecc" "-I{compiler.sdk.path}/include/mqtt" "-I{compiler.sdk.path}/include/newlib" "-I{compiler.sdk.path}/include/nghttp" "-I{compiler.sdk.path}/include/nvs_flash" "-I{compiler.sdk.path}/include/openssl" "-I{compiler.sdk.path}/include/protobuf-c" "-I{compiler.sdk.path}/include/protocomm" "-I{compiler.sdk.path}/include/pthread" "-I{compiler.sdk.path}/include/sdmmc" "-I{compiler.sdk.path}/include/smartconfig_ack" "-I{compiler.sdk.path}/include/soc" "-I{compiler.sdk.path}/include/spi_flash" "-I{compiler.sdk.path}/include/spiffs" "-I{compiler.sdk.path}/include/tcp_transport" "-I{compiler.sdk.path}/include/tcpip_adapter" "-I{compiler.sdk.path}/include/ulp" "-I{compiler.sdk.path}/include/unity" "-I{compiler.sdk.path}/include/vfs" "-I{compiler.sdk.path}/include/wear_levelling" "-I{compiler.sdk.path}/include/wifi_provisioning" "-I{compiler.sdk.path}/include/wpa_supplicant" "-I{compiler.sdk.path}/include/xtensa-debug-module" "-I{compiler.sdk.path}/include/esp32-camera" "-I{compiler.sdk.path}/include/esp-face" "-I{compiler.sdk.path}/include/fb_gfx" compiler.c.cmd=xtensa-esp32-elf-gcc compiler.c.flags=-std=gnu99 -Os -g3 -fstack-protector -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -mlongcalls -nostdlib -Wpointer-arith {compiler.warning_flags} -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -Wno-old-style-declaration -MMD -c @@ -35,7 +35,7 @@ compiler.S.flags=-c -g3 -x assembler-with-cpp -MMD -mlongcalls compiler.c.elf.cmd=xtensa-esp32-elf-gcc compiler.c.elf.flags=-nostdlib "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" -T esp32_out.ld -T esp32.common.ld -T esp32.rom.ld -T esp32.peripherals.ld -T esp32.rom.spiram_incompatible_fns.ld -u ld_include_panic_highint_hdl -u call_user_start_cpu0 -Wl,--gc-sections -Wl,-static -Wl,--undefined=uxTopUsedPriority -u __cxa_guard_dummy -u __cxx_fatal_exception -compiler.c.elf.libs=-lgcc -lopenssl -lbtdm_app -lfatfs -lwps -lcoexist -lwear_levelling -lesp_http_client -lprotobuf-c -lhal -lnewlib -ldriver -lbootloader_support -lpp -lfreemodbus -lmesh -lsmartconfig -ljsmn -lwpa -lethernet -lphy -lapp_trace -lconsole -lulp -lwpa_supplicant -lfreertos -lbt -lmicro-ecc -lesp32-camera -lcxx -lxtensa-debug-module -ltcp_transport -lmdns -lvfs -lesp_ringbuf -lsoc -lcore -lsdmmc -llibsodium -lcoap -ltcpip_adapter -lprotocomm -lesp_event -lc_nano -lesp-tls -lasio -lrtc -lspi_flash -lwpa2 -lwifi_provisioning -lesp32 -lapp_update -lnghttp -lspiffs -lunity -lesp_https_server -lespnow -lnvs_flash -lesp_adc_cal -llog -lsmartconfig_ack -lexpat -lm -lmqtt -lc -lheap -lmbedtls -llwip -lnet80211 -lesp_http_server -lpthread -ljson -lesp_https_ota -lstdc++ +compiler.c.elf.libs=-lgcc -lopenssl -lbtdm_app -lfatfs -lwps -lcoexist -lwear_levelling -lesp_http_client -lprotobuf-c -lhal -lnewlib -ldriver -lbootloader_support -lpp -lfreemodbus -lmesh -lsmartconfig -ljsmn -lwpa -lethernet -lphy -lfrmn -lapp_trace -lfr_coefficients -lconsole -lulp -lwpa_supplicant -lfreertos -lbt -lmicro-ecc -lesp32-camera -lcxx -lxtensa-debug-module -ltcp_transport -lmdns -lvfs -lmtmn -lesp_ringbuf -lsoc -lcore -lfb_gfx -lsdmmc -llibsodium -lcoap -ltcpip_adapter -lprotocomm -lesp_event -limage_util -lc_nano -lesp-tls -lasio -lrtc -lspi_flash -lwpa2 -lwifi_provisioning -lesp32 -lface_recognition -lapp_update -lnghttp -llib -lspiffs -lface_detection -lunity -lesp_https_server -lespnow -lnvs_flash -lesp_adc_cal -llog -ldl_lib -lsmartconfig_ack -lexpat -lfd_coefficients -lm -lmqtt -lc -lheap -lmbedtls -llwip -lnet80211 -lesp_http_server -lpthread -ljson -lesp_https_ota -lstdc++ compiler.as.cmd=xtensa-esp32-elf-as diff --git a/tools/build.py b/tools/build.py index dde5a2e9..28bb453a 100755 --- a/tools/build.py +++ b/tools/build.py @@ -46,6 +46,7 @@ def compile(tmp_dir, sketch, tools_dir, hardware_dir, ide_path, f, args): # Debug=Serial,DebugLevel=Core____ cmd += '-fqbn=espressif:esp32:{board_name}:' \ 'FlashFreq={flash_freq},' \ + 'PartitionScheme=huge_app,' \ 'UploadSpeed=921600'.format(**vars(args)) cmd += ' ' cmd += '-ide-version=10607 ' diff --git a/tools/partitions/huge_app.csv b/tools/partitions/huge_app.csv new file mode 100644 index 00000000..7c1c548d --- /dev/null +++ b/tools/partitions/huge_app.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x300000, +eeprom, data, 0x99, 0x310000,0x1000, +spiffs, data, spiffs, 0x311000,0xEF000, diff --git a/tools/platformio-build.py b/tools/platformio-build.py index 63c390c7..41344ee5 100644 --- a/tools/platformio-build.py +++ b/tools/platformio-build.py @@ -152,6 +152,8 @@ env.Append( join(FRAMEWORK_DIR, "tools", "sdk", "include", "wpa_supplicant"), join(FRAMEWORK_DIR, "tools", "sdk", "include", "xtensa-debug-module"), join(FRAMEWORK_DIR, "tools", "sdk", "include", "esp32-camera"), + join(FRAMEWORK_DIR, "tools", "sdk", "include", "esp-face"), + join(FRAMEWORK_DIR, "tools", "sdk", "include", "fb_gfx"), join(FRAMEWORK_DIR, "cores", env.BoardConfig().get("build.core")) ], @@ -161,7 +163,7 @@ env.Append( ], LIBS=[ - "-lgcc", "-lopenssl", "-lbtdm_app", "-lfatfs", "-lwps", "-lcoexist", "-lwear_levelling", "-lesp_http_client", "-lprotobuf-c", "-lhal", "-lnewlib", "-ldriver", "-lbootloader_support", "-lpp", "-lfreemodbus", "-lmesh", "-lsmartconfig", "-ljsmn", "-lwpa", "-lethernet", "-lphy", "-lapp_trace", "-lconsole", "-lulp", "-lwpa_supplicant", "-lfreertos", "-lbt", "-lmicro-ecc", "-lesp32-camera", "-lcxx", "-lxtensa-debug-module", "-ltcp_transport", "-lmdns", "-lvfs", "-lesp_ringbuf", "-lsoc", "-lcore", "-lsdmmc", "-llibsodium", "-lcoap", "-ltcpip_adapter", "-lprotocomm", "-lesp_event", "-lc_nano", "-lesp-tls", "-lasio", "-lrtc", "-lspi_flash", "-lwpa2", "-lwifi_provisioning", "-lesp32", "-lapp_update", "-lnghttp", "-lspiffs", "-lunity", "-lesp_https_server", "-lespnow", "-lnvs_flash", "-lesp_adc_cal", "-llog", "-lsmartconfig_ack", "-lexpat", "-lm", "-lmqtt", "-lc", "-lheap", "-lmbedtls", "-llwip", "-lnet80211", "-lesp_http_server", "-lpthread", "-ljson", "-lesp_https_ota", "-lstdc++" + "-lgcc", "-lopenssl", "-lbtdm_app", "-lfatfs", "-lwps", "-lcoexist", "-lwear_levelling", "-lesp_http_client", "-lprotobuf-c", "-lhal", "-lnewlib", "-ldriver", "-lbootloader_support", "-lpp", "-lfreemodbus", "-lmesh", "-lsmartconfig", "-ljsmn", "-lwpa", "-lethernet", "-lphy", "-lfrmn", "-lapp_trace", "-lfr_coefficients", "-lconsole", "-lulp", "-lwpa_supplicant", "-lfreertos", "-lbt", "-lmicro-ecc", "-lesp32-camera", "-lcxx", "-lxtensa-debug-module", "-ltcp_transport", "-lmdns", "-lvfs", "-lmtmn", "-lesp_ringbuf", "-lsoc", "-lcore", "-lfb_gfx", "-lsdmmc", "-llibsodium", "-lcoap", "-ltcpip_adapter", "-lprotocomm", "-lesp_event", "-limage_util", "-lc_nano", "-lesp-tls", "-lasio", "-lrtc", "-lspi_flash", "-lwpa2", "-lwifi_provisioning", "-lesp32", "-lface_recognition", "-lapp_update", "-lnghttp", "-llib", "-lspiffs", "-lface_detection", "-lunity", "-lesp_https_server", "-lespnow", "-lnvs_flash", "-lesp_adc_cal", "-llog", "-ldl_lib", "-lsmartconfig_ack", "-lexpat", "-lfd_coefficients", "-lm", "-lmqtt", "-lc", "-lheap", "-lmbedtls", "-llwip", "-lnet80211", "-lesp_http_server", "-lpthread", "-ljson", "-lesp_https_ota", "-lstdc++" ], LIBSOURCE_DIRS=[ @@ -207,7 +209,7 @@ env.Prepend(LIBS=libs) # fwpartitions_dir = join(FRAMEWORK_DIR, "tools", "partitions") -partitions_csv = env.BoardConfig().get("build.partitions", "default.csv") +partitions_csv = env.BoardConfig().get("build.partitions", "huge_app.csv") env.Replace( PARTITIONS_TABLE_CSV=abspath( join(fwpartitions_dir, partitions_csv) if isfile( diff --git a/tools/sdk/bin/bootloader_qout_40m.bin b/tools/sdk/bin/bootloader_qout_40m.bin index 06b6f0f44b430d9b2ace88eac47cf6e416add3d4..99b549af03a565cbf92da5454df4798c37712eec 100644 GIT binary patch delta 50 zcmbQx#WB#r9{8$8Gaiy0ylnp I_vzqY0CGtiO#lD@ diff --git a/tools/sdk/bin/bootloader_qout_80m.bin b/tools/sdk/bin/bootloader_qout_80m.bin index 7c8f376f9f776a24cb75e55b38ffb59345a1d664..dc2dd530f2197ed927ed7cbdac7227eb11aa3dfb 100644 GIT binary patch delta 50 zcmZqZVr=MQ-0;toQEKyl(+7Nty}~KcrT&kl}Czw`km4BNM?ZRq4(2l_EgV1 HeQ`Yi8^9MS delta 50 zcmZqZVr=MQ-0;tok!$mR(+7NtbJc^tcivmA=ovI~O>+*w by in->h in size, matrix. + */ + void dl_fully_connect_layer(const dl_matrix2d_t *in, + const dl_matrix2d_t *weight, + const dl_matrix2d_t *bias, + dl_matrix2d_t *out); + + /** + * @brief Pre-calculate the sqrtvari variable for the batch_normalize function. + * The sqrtvari matrix depends on the variance and epsilon values, which normally are constant. Hence, + * this matrix only needs to be calculated once. This function does that. + * + * @param + * @return + */ + void dl_batch_normalize_get_sqrtvar(const dl_matrix2d_t *variance, + fptp_t epsilon, + dl_matrix2d_t *out); + + /** + * @brief Batch-normalize a matrix + * + * @param m The matrix to normalize + * @param offset Offset matrix + * @param scale Scale matrix + * @param mean Mean matrix + * @param sqrtvari Matrix precalculated using dl_batch_normalize_get_sqrtvar + * @return + */ + void dl_batch_normalize(dl_matrix2d_t *m, + const dl_matrix2d_t *offset, + const dl_matrix2d_t *scale, + const dl_matrix2d_t *mean, + const dl_matrix2d_t *sqrtvari); + + /** + * @brief Do a basic LSTM layer pass. + * + * @warning Returns state_h pointer, so do not free result. + + * @param in Input vector + * @param state_c Internal state of the LSTM network + * @param state_h Internal state (previous output values) of the LSTM network + * @param weights Weights for the neurons + * @param bias Bias for the neurons. Can be NULL if no bias is required + * @return Output values of the neurons + */ + dl_matrix2d_t *dl_basic_lstm_layer(const dl_matrix2d_t *in, + dl_matrix2d_t *state_c, + dl_matrix2d_t *state_h, + const dl_matrix2d_t *weight, + const dl_matrix2d_t *bias); + + /** + * @brief Do a basic LSTM layer pass, partial quantized version. + * This LSTM function accepts 16-bit fixed-point weights and 32-bit float-point bias. + * + * @warning Returns state_h pointer, so do not free result. + + * @param in Input vector + * @param state_c Internal state of the LSTM network + * @param state_h Internal state (previous output values) of the LSTM network + * @param weights Weights for the neurons, need to be quantised + * @param bias Bias for the neurons. Can be NULL if no bias is required + * @return Output values of the neurons + */ + dl_matrix2d_t *dl_basic_lstm_layer_quantised_weights(const dl_matrix2d_t *in, + dl_matrix2d_t *state_c, + dl_matrix2d_t *state_h, + const dl_matrix2dq_t *weight, + const dl_matrix2d_t *bias); + + /** + * @brief Do a fully-connected layer pass, fully-quantized version. + * + * @param in Input vector + * @param weight Weights of the neurons + * @param bias Bias values of the neurons. Can be NULL if no bias is needed. + * @param shift Number of bits to shift the result back by. See dl_lib_matrixq.h for more info + * @return Output values of the neurons + */ + void dl_fully_connect_layer_q(const dl_matrix2dq_t *in, + const dl_matrix2dq_t *weight, + const dl_matrix2dq_t *bias, + dl_matrix2dq_t *out, + int shift); + + /** + * @brief Do a basic LSTM layer pass, fully-quantized version + * + * @warning Returns state_h pointer, so do not free result. + + * @param in Input vector + * @param state_c Internal state of the LSTM network + * @param state_h Internal state (previous output values) of the LSTM network + * @param weights Weights for the neurons + * @param bias Bias for the neurons. Can be NULL if no bias is required + * @param shift Number of bits to shift the result back by. See dl_lib_matrixq.h for more info + * @return Output values of the neurons + */ + dl_matrix2dq_t *dl_basic_lstm_layer_q(const dl_matrix2dq_t *in, + dl_matrix2dq_t *state_c, + dl_matrix2dq_t *state_h, + const dl_matrix2dq_t *weight, + const dl_matrix2dq_t *bias, + int shift); + + /** + * @brief Batch-normalize a matrix, fully-quantized version + * + * @param m The matrix to normalize + * @param offset Offset matrix + * @param scale Scale matrix + * @param mean Mean matrix + * @param sqrtvari Matrix precalculated using dl_batch_normalize_get_sqrtvar + * @param shift Number of bits to shift the result back by. See dl_lib_matrixq.h for more info + * @return + */ + void dl_batch_normalize_q(dl_matrix2dq_t *m, + const dl_matrix2dq_t *offset, + const dl_matrix2dq_t *scale, + const dl_matrix2dq_t *mean, + const dl_matrix2dq_t *sqrtvari, + int shift); + + /** + * @brief Does a relu (Rectifier Linear Unit) operation on a fixed-point number + * This accepts and returns fixed-point 32-bit number with the last 15 bits being the bits after the decimal + * point. (Equivalent to a mantissa in a quantized matrix with exponent -15.) + * + * @param in Fixed-point input + * @param clip If value is higher than this, it will be clipped to this value + * @return Relu output + */ + qtp_t dl_relu_q_op(qtp_t in, + qtp_t clip); + + /** + * @brief Does a ReLu operation on a matrix, quantized version + * + * @param in Input matrix + * @param clip If values are higher than this, they will be clipped to this value + * @param out Output matrix. Can be the same as the input matrix; if so, output results overwrite the input. + */ + void dl_relu_q(const dl_matrix2dq_t *in, + fptp_t clip, + dl_matrix2dq_t *out); + + /** + * @brief Does a sigmoid operation on a fixed-point number. + * This accepts and returns a fixed-point 32-bit number with the last 15 bits being the bits after the decimal + * point. (Equivalent to a mantissa in a quantized matrix with exponent -15.) + * + * @param in Fixed-point input + * @return Sigmoid output + */ + int dl_sigmoid_op_q(const int in); + + /** + * @brief Does a sigmoid operation on a matrix, quantized version + * + * @param in Input matrix + * @param out Output matrix. Can be the same as the input matrix; if so, output results overwrite the input. + */ + void dl_sigmoid_q(const dl_matrix2dq_t *in, + dl_matrix2dq_t *out); + + /** + * @brief Does a tanh operation on a matrix, quantized version + * + * @param in Input matrix + * @param out Output matrix. Can be the same as the input matrix; if so, output results overwrite the input. + */ + void dl_tanh_q(const dl_matrix2dq_t *in, + dl_matrix2dq_t *out); + + /** + * @brief Do a basic CNN layer pass. + * + * @Warning This just supports the single channel input image, and the output is single row matrix. + That is to say, the height of output is 1, and the weight of output is out_channels*out_image_width*out_image_height + * + * @param in Input single channel image + * @param weight Weights of the neurons, weight->w = out_channels, weight->h = filter_width*filter_height + * @param bias Bias for the CNN layer. + * @param filter_height The height of convolution kernel + * @param filter_width The width of convolution kernel + * @param out_channels The number of output channels of convolution kernel + * @param stride_x The step length of the convolution window in x(width) direction + * @param stride_y The step length of the convolution window in y(height) direction + * @param pad One of `"VALID"` or `"SAME"`, 0 is "VALID" and the other is "SAME" + * @param out The result of CNN layer, out->h=1. + * @return The result of CNN layer. + */ + dl_matrix2d_t *dl_basic_conv_layer(const dl_matrix2d_t *in, + const dl_matrix2d_t *weight, + const dl_matrix2d_t *bias, + int filter_width, + int filter_height, + const int out_channels, + const int stride_x, + const int stride_y, + padding_state pad, + const dl_matrix2d_t *out); + + /** + * @brief Do a basic CNN layer pass, quantised wersion. + * + * @Warning This just supports the single channel input image, and the output is single row matrix. + That is to say, the height of output is 1, and the weight of output is out_channels*out_image_width*out_image_height + * + * @param in Input single channel image + * @param weight Weights of the neurons, weight->w = out_channels, weight->h = filter_width*filter_height, + * @param bias Bias of the neurons. + * @param filter_height The height of convolution kernel + * @param filter_width The width of convolution kernel + * @param out_channels The number of output channels of convolution kernel + * @param stride_x The step length of the convolution window in x(width) direction + * @param stride_y The step length of the convolution window in y(height) direction + * @param pad One of `"VALID"` or `"SAME"`, 0 is "VALID" and the other is "SAME" + * @param out The result of CNN layer, out->h=1 + * @return The result of CNN layer + */ + dl_matrix2d_t *dl_basic_conv_layer_quantised_weight(const dl_matrix2d_t *in, + const dl_matrix2dq_t *weight, + const dl_matrix2d_t *bias, + int filter_width, + int filter_height, + const int out_channels, + const int stride_x, + const int stride_y, + padding_state pad, + const dl_matrix2d_t *out); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/tools/sdk/include/esp-face/dl_lib_coefgetter_if.h b/tools/sdk/include/esp-face/dl_lib_coefgetter_if.h new file mode 100644 index 00000000..3fa532ce --- /dev/null +++ b/tools/sdk/include/esp-face/dl_lib_coefgetter_if.h @@ -0,0 +1,47 @@ +#ifndef DL_LIB_COEFGETTER_IF_H +#define DL_LIB_COEFGETTER_IF_H + +#include "dl_lib_matrix.h" +#include "dl_lib_matrixq.h" +#include "dl_lib_matrix3d.h" +#include "dl_lib_matrix3dq.h" + +//Set this if the coefficient requested is a batch-normalization popvar matrix which needs to be preprocessed by +//dl_batch_normalize_get_sqrtvar first. +#define COEF_GETTER_HINT_BNVAR (1<<0) + +/* +This struct describes the basic information of model data: +word_num: the number of wake words or speech commands +word_list: the name list of wake words or speech commands +thres_list: the threshold list of wake words or speech commands +info_str: the string used to reflect the version and information of model data + which consist of the architecture of network, the version of model data, wake words and their threshold +*/ +typedef struct { + int word_num; + char **word_list; + int *win_list; + float *thresh_list; + char *info_str; +} model_info_t; + +/* +This struct describes a generic coefficient getter: a way to get the constant coefficients needed for a neural network. +For the two getters, the name describes the name of the coefficient matrix, usually the same as the Numpy filename the +coefficient was originally stored in. The arg argument can be used to optionally pass an additional user-defined argument +to the getter (e.g. the directory to look for files in the case of the Numpy file loader getter). The hint argument +is a bitwise OR of the COEF_GETTER_HINT_* flags or 0 when none is needed. Use the free_f/free_q functions to release the +memory for the returned matrices, when applicable. +*/ +typedef struct { + const dl_matrix2d_t* (*getter_f)(const char *name, void *arg, int hint); + const dl_matrix2dq_t* (*getter_q)(const char *name, void *arg, int hint); + const dl_matrix3d_t* (*getter_3d)(const char *name, void *arg, int hint); + const dl_matrix3dq_t* (*getter_3dq)(const char *name, void *arg, int hint); + void (*free_f)(const dl_matrix2d_t *m); + void (*free_q)(const dl_matrix2dq_t *m); + const model_info_t* (*getter_info)(void *arg); +} model_coeff_getter_t; + +#endif diff --git a/tools/sdk/include/esp-face/dl_lib_matrix.h b/tools/sdk/include/esp-face/dl_lib_matrix.h new file mode 100644 index 00000000..41964a24 --- /dev/null +++ b/tools/sdk/include/esp-face/dl_lib_matrix.h @@ -0,0 +1,216 @@ +#ifndef DL_LIB_MATRIX_H +#define DL_LIB_MATRIX_H + +typedef float fptp_t; + + +//Flags for matrices +#define DL_MF_FOREIGNDATA (1<<0) /*< Matrix *item data actually points to another matrix and should not be freed */ + +//'Normal' float matrix +typedef struct { + int w; /*< Width */ + int h; /*< Height */ + int stride; /*< Row stride, essentially how many items to skip to get to the same position in the next row */ + int flags; /*< Flags. OR of DL_MF_* values */ + fptp_t *item; /*< Pointer to item array */ +} dl_matrix2d_t; + +//Macro to quickly access the raw items in a matrix +#define DL_ITM(m, x, y) m->item[(x)+(y)*m->stride] + + +//#define DL_ITM3D(m, n, x, y, z) (m)->item[(n) * (m)->stride * (m)->c + (z) * (m)->stride + (y) * (m)->w + (x)] + +/** + * @brief Allocate a matrix + * + * @param w Width of the matrix + * @param h Height of the matrix + * @return The matrix, or NULL if out of memory + */ +dl_matrix2d_t *dl_matrix_alloc(int w, int h); + + +/** + * @brief Free a matrix + * Frees the matrix structure and (if it doesn't have the DL_MF_FOREIGNDATA flag set) the m->items space as well. + * + * @param m Matrix to free + */ +void dl_matrix_free(dl_matrix2d_t *m); + +/** + * @brief Zero out the matrix + * Sets all entries in the matrix to 0. + * + * @param m Matrix to zero + */ +void dl_matrix_zero(dl_matrix2d_t *m); + +/** + * @brief Generate a new matrix using a range of items from an existing matrix. + * When using this, the data of the new matrix is not allocated/copied but it re-uses a pointer + * to the existing data. Changing the data in the resulting matrix, as a result, will also change + * the data in the existing matrix that has been sliced. + * + * @param x X-offset of the origin of the returned matrix within the sliced matrix + * @param y Y-offset of the origin of the returned matrix within the sliced matrix + * @param w Width of the resulting matrix + * @param h Height of the resulting matrix + * @param in Old matrix (with foreign data) to re-use. Passing NULL will allocate a new matrix. + * @return The resulting slice matrix, or NULL if out of memory + */ +dl_matrix2d_t *dl_matrix_slice(const dl_matrix2d_t *src, int x, int y, int w, int h, dl_matrix2d_t *in); + +/** + * @brief select a range of items from an existing matrix and flatten them into one dimension. + * + * @Warning The results are flattened in row-major order. + * + * @param x X-offset of the origin of the returned matrix within the sliced matrix + * @param y Y-offset of the origin of the returned matrix within the sliced matrix + * @param w Width of the resulting matrix + * @param h Height of the resulting matrix + * @param in Old matrix to re-use. Passing NULL will allocate a new matrix. + * @return The resulting flatten matrix, or NULL if out of memory + */ +dl_matrix2d_t *dl_matrix_flatten(const dl_matrix2d_t *src, int x, int y, int w, int h, dl_matrix2d_t *in); + +/** + * @brief Generate a matrix from existing floating-point data + * + * @param w Width of resulting matrix + * @param h Height of resulting matrix + * @param data Data to populate matrix with + * @return A newaly allocated matrix populated with the given input data, or NULL if out of memory. + */ +dl_matrix2d_t *dl_matrix_from_data(int w, int h, int stride, const void *data); + + +/** + * @brief Multiply a pair of matrices item-by-item: res=a*b + * + * @param a First multiplicand + * @param b Second multiplicand + * @param res Multiplicated data. Can be equal to a or b to overwrite that. + */ +void dl_matrix_mul(const dl_matrix2d_t *a, const dl_matrix2d_t *b, dl_matrix2d_t *res); + +/** + * @brief Do a dotproduct of two matrices : res=a.b + * + * @param a First multiplicand + * @param b Second multiplicand + * @param res Dotproduct data. *Must* be a *different* matrix from a or b! + */ +void dl_matrix_dot(const dl_matrix2d_t *a, const dl_matrix2d_t *b, dl_matrix2d_t *res); + +/** + * @brief Add a pair of matrices item-by-item: res=a-b + * + * @param a First matrix + * @param b Second matrix + * @param res Added data. Can be equal to a or b to overwrite that. + */ +void dl_matrix_add(const dl_matrix2d_t *a, const dl_matrix2d_t *b, dl_matrix2d_t *out); + + +/** + * @brief Divide a pair of matrices item-by-item: res=a/b + * + * @param a First matrix + * @param b Second matrix + * @param res Divided data. Can be equal to a or b to overwrite that. + */ +void dl_matrix_div(const dl_matrix2d_t *a, const dl_matrix2d_t *b, dl_matrix2d_t *out); + +/** + * @brief Subtract a matrix from another, item-by-item: res=a-b + * + * @param a First matrix + * @param b Second matrix + * @param res Subtracted data. Can be equal to a or b to overwrite that. + */ +void dl_matrix_sub(const dl_matrix2d_t *a, const dl_matrix2d_t *b, dl_matrix2d_t *out); + +/** + * @brief Add a constant to every item of the matrix + * + * @param subj Matrix to add the constant to + * @param add The constant + */ +void dl_matrix_add_const(dl_matrix2d_t *subj, const fptp_t add); + + +/** + * @brief Concatenate the rows of two matrices into a new matrix + * + * @param a First matrix + * @param b Second matrix + * @return A newly allocated array with as avlues a|b + */ +dl_matrix2d_t *dl_matrix_concat(const dl_matrix2d_t *a, const dl_matrix2d_t *b); + + +/** + * @brief Print the contents of a matrix to stdout. Used for debugging. + * + * @param a The matrix to print. + */ +void dl_printmatrix(const dl_matrix2d_t *a); + +/** + * @brief Return the average square error given a correct and a test matrix. + * + * ...Well, more or less. If anything, it gives an indication of the error between + * the two. Check the code for the exact implementation. + * + * @param a First of the two matrices to compare + * @param b Second of the two matrices to compare + * @return value indicating the relative difference between matrices + */ +float dl_matrix_get_avg_sq_err(const dl_matrix2d_t *a, const dl_matrix2d_t *b); + + + +/** + * @brief Check if two matrices have the same shape, that is, the same amount of rows and columns + * + * @param a First of the two matrices to compare + * @param b Second of the two matrices to compare + * @return true if the two matrices are shaped the same, false otherwise. + */ +int dl_matrix_same_shape(const dl_matrix2d_t *a, const dl_matrix2d_t *b); + + +/** + * @brief Get a specific item from the matrix + * + * Please use these for external matrix access instead of DL_ITM + * + * @param m Matrix to access + * @param x Column address + * @param y Row address + * @return Value in that position + */ +inline static fptp_t dl_matrix_get(const dl_matrix2d_t *m, const int x, const int y) { + return DL_ITM(m, x, y); +} + +/** + * @brief Set a specific item in the matrix to the given value + * + * Please use these for external matrix access instead of DL_ITM + * + * @param m Matrix to access + * @param x Column address + * @param y Row address + * @param val Value to write to that position + */ +inline static void dl_matrix_set(dl_matrix2d_t *m, const int x, const int y, fptp_t val) { + DL_ITM(m, x, y)=val; +} + +#endif + diff --git a/tools/sdk/include/esp-face/dl_lib_matrix3d.h b/tools/sdk/include/esp-face/dl_lib_matrix3d.h new file mode 100644 index 00000000..fc304e25 --- /dev/null +++ b/tools/sdk/include/esp-face/dl_lib_matrix3d.h @@ -0,0 +1,420 @@ +#pragma once + +typedef float fptp_t; +typedef uint8_t uc_t; + +typedef enum +{ + DL_C_IMPL = 0, + DL_XTENSA_IMPL = 1 +} dl_conv_mode; + +typedef enum +{ + INPUT_UINT8 = 0, + INPUT_FLOAT = 1, +} dl_op_type; + +typedef enum +{ + PADDING_VALID = 0, + PADDING_SAME = 1, +} dl_padding_type; + +/* + * Matrix for 3d + * @Warning: the sequence of variables is fixed, cannot be modified, otherwise there will be errors in esp_dsp_dot_float + */ +typedef struct +{ + /******* fix start *******/ + int w; // Width + int h; // Height + int c; // Channel + int n; // Number, to record filter's out_channels. input and output must be 1 + int stride; + fptp_t *item; + /******* fix end *******/ +} dl_matrix3d_t; + +typedef struct +{ + int w; // Width + int h; // Height + int c; // Channel + int n; // Number, to record filter's out_channels. input and output must be 1 + int stride; + uc_t *item; +} dl_matrix3du_t; + +typedef struct +{ + int stride_x; + int stride_y; + dl_padding_type padding; + dl_conv_mode mode; + dl_op_type type; +} dl_matrix3d_conv_config_t; + +/* + * @brief Allocate a 3D matrix with float items, the access sequence is NHWC + * + * @param n Number of matrix3d, for filters it is out channels, for others it is 1 + * @param w Width of matrix3d + * @param h Height of matrix3d + * @param c Channel of matrix3d + * @return 3d matrix + */ +dl_matrix3d_t *dl_matrix3d_alloc(int n, int w, int h, int c); + +/* + * @brief Allocate a 3D matrix with 8-bits items, the access sequence is NHWC + * + * @param n Number of matrix3d, for filters it is out channels, for others it is 1 + * @param w Width of matrix3d + * @param h Height of matrix3d + * @param c Channel of matrix3d + * @return 3d matrix + */ +dl_matrix3du_t *dl_matrix3du_alloc(int n, int w, int h, int c); + +/* + * @brief Free a matrix3d + * + * @param m matrix3d with float items + */ +void dl_matrix3d_free(dl_matrix3d_t *m); + +/* + * @brief Free a matrix3d + * + * @param m matrix3d with 8-bits items + */ +void dl_matrix3du_free(dl_matrix3du_t *m); + +/** + * @brief Do a relu (Rectifier Linear Unit) operation, update the input matrix3d + * + * @param in Floating point input matrix3d + * @param clip If value is higher than this, it will be clipped to this value + */ +void dl_matrix3d_relu(dl_matrix3d_t *m, fptp_t clip); + +/** + * @brief Do a leaky relu (Rectifier Linear Unit) operation, update the input matrix3d + * + * @param in Floating point input matrix3d + * @param clip If value is higher than this, it will be clipped to this value + * @param alpha If value is less than zero, it will be updated by multiplying this factor + */ +void dl_matrix3d_leaky_relu(dl_matrix3d_t *m, fptp_t clip, fptp_t alpha); + +/** + * @brief Do a softmax operation on a matrix3d + * + * @param in Input matrix3d + */ +void dl_matrix3d_softmax(dl_matrix3d_t *m); + +/** + * @brief Do a general fully connected layer pass, dimension is (number, width, height, channel) + * + * @param in Input matrix3d, size is (1, w, 1, 1) + * @param filter Weights of the neurons, size is (1, w, h, 1) + * @param bias Bias for the fc layer, size is (1, 1, 1, h) + * @return The result of fc layer, size is (1, 1, 1, h) + */ +dl_matrix3d_t *dl_matrix3d_fc(dl_matrix3d_t *in, + dl_matrix3d_t *filter, + dl_matrix3d_t *bias); + +/** + * @brief Copy a range of float items from an existing matrix to a preallocated matrix + * + * @param dst The destination slice matrix + * @param src The source matrix to slice + * @param x X-offset of the origin of the returned matrix within the sliced matrix + * @param y Y-offset of the origin of the returned matrix within the sliced matrix + * @param w Width of the resulting matrix + * @param h Height of the resulting matrix + */ +void dl_matrix3d_slice_copy(dl_matrix3d_t *dst, + dl_matrix3d_t *src, + int x, + int y, + int w, + int h); + +/** + * @brief Copy a range of 8-bits items from an existing matrix to a preallocated matrix + * + * @param dst The destination slice matrix + * @param src The source matrix to slice + * @param x X-offset of the origin of the returned matrix within the sliced matrix + * @param y Y-offset of the origin of the returned matrix within the sliced matrix + * @param w Width of the resulting matrix + * @param h Height of the resulting matrix + */ +void dl_matrix3du_slice_copy(dl_matrix3du_t *dst, + dl_matrix3du_t *src, + int x, + int y, + int w, + int h); + +/** + * @brief Do a general CNN layer pass, dimension is (number, width, height, channel) + * + * @param in Input matrix3d + * @param filter Weights of the neurons + * @param bias Bias for the CNN layer + * @param stride_x The step length of the convolution window in x(width) direction + * @param stride_y The step length of the convolution window in y(height) direction + * @param padding One of VALID or SAME + * @param mode Do convolution using C implement or xtensa implement, 0 or 1, with respect + * If ESP_PLATFORM is not defined, this value is not used. Default is 0 + * @return The result of CNN layer + */ +dl_matrix3d_t *dl_matrix3d_conv(dl_matrix3d_t *in, + dl_matrix3d_t *filter, + dl_matrix3d_t *bias, + int stride_x, + int stride_y, + int padding, + int mode); + +/** + * @brief Do a general CNN layer pass, dimension is (number, width, height, channel) + * + * @param in Input matrix3d + * @param filter Weights of the neurons + * @param bias Bias for the CNN layer + * @param stride_x The step length of the convolution window in x(width) direction + * @param stride_y The step length of the convolution window in y(height) direction + * @param padding One of VALID or SAME + * @param mode Do convolution using C implement or xtensa implement, 0 or 1, with respect + * If ESP_PLATFORM is not defined, this value is not used. Default is 0 + * @return The result of CNN layer + */ +dl_matrix3d_t *dl_matrix3du_conv(dl_matrix3du_t *in, + dl_matrix3d_t *filter, + dl_matrix3d_t *bias, + int stride_x, + int stride_y, + int padding, + int mode); + +/** + * @brief Do a depthwise CNN layer pass, dimension is (number, width, height, channel) + * + * @param in Input matrix3d + * @param filter Weights of the neurons + * @param stride_x The step length of the convolution window in x(width) direction + * @param stride_y The step length of the convolution window in y(height) direction + * @param padding One of VALID or SAME + * @param mode Do convolution using C implement or xtensa implement, 0 or 1, with respect + * If ESP_PLATFORM is not defined, this value is not used. Default is 0 + * @return The result of depthwise CNN layer + */ +dl_matrix3d_t *dl_matrix3d_depthwise_conv(dl_matrix3d_t *in, + dl_matrix3d_t *filter, + int stride_x, + int stride_y, + int padding, + int mode); + +/** + * @brief Do a mobilenet block forward, dimension is (number, width, height, channel) + * + * @param in Input matrix3d + * @param filter Weights of the neurons + * @param stride_x The step length of the convolution window in x(width) direction + * @param stride_y The step length of the convolution window in y(height) direction + * @param padding One of VALID or SAME + * @param mode Do convolution using C implement or xtensa implement, 0 or 1, with respect + * If ESP_PLATFORM is not defined, this value is not used. Default is 0 + * @return The result of depthwise CNN layer + */ +dl_matrix3d_t *dl_matrix3d_mobilenet(void *in, + dl_matrix3d_t *dilate, + dl_matrix3d_t *depthwise, + dl_matrix3d_t *compress, + dl_matrix3d_t *bias, + dl_matrix3d_t *prelu, + dl_matrix3d_conv_config_t *config); + +/** + * @brief Do a global average pooling layer pass, dimension is (number, width, height, channel) + * + * @param in Input matrix3d + * + * @return The result of global average pooling layer + */ +dl_matrix3d_t *dl_matrix3d_global_pool(dl_matrix3d_t *in); + +/** + * @brief Do a batch normalization operation, update the input matrix3d: input = input * scale + offset + * + * @param m Input matrix3d + * @param scale scale matrix3d, scale = gamma/((moving_variance+sigma)^(1/2)) + * @param Offset Offset matrix3d, offset = beta-(moving_mean*gamma/((moving_variance+sigma)^(1/2))) + */ +void dl_matrix3d_batch_normalize(dl_matrix3d_t *m, + dl_matrix3d_t *scale, + dl_matrix3d_t *offset); + +/** + * @brief Add a pair of matrix3d item-by-item: res=in_1+in_2 + * + * @param in_1 First Floating point input matrix3d + * @param in_2 Second Floating point input matrix3d + * + * @return Added data + */ +dl_matrix3d_t *dl_matrix3d_add(dl_matrix3d_t *in_1, dl_matrix3d_t *in_2); + +/** + * @brief Do a standard relu operation, update the input matrix3d + * + * @param m Floating point input matrix3d + */ +void dl_matrix3d_relu_std(dl_matrix3d_t *m); + +/** + * @brief Concatenate the channels of two matrix3ds into a new matrix3d + * + * @param in_1 First Floating point input matrix3d + * @param in_2 Second Floating point input matrix3d + * + * @return A newly allocated matrix3d with as avlues in_1|in_2 + */ +dl_matrix3d_t *dl_matrix3d_concat(dl_matrix3d_t *in_1, dl_matrix3d_t *in_2); + +/** + * @brief Concatenate the channels of four matrix3ds into a new matrix3d + * + * @param in_1 First Floating point input matrix3d + * @param in_2 Second Floating point input matrix3d + * @param in_3 Third Floating point input matrix3d + * @param in_4 Fourth Floating point input matrix3d + * + * @return A newly allocated matrix3d with as avlues in_1|in_2|in_3|in_4 + */ +dl_matrix3d_t *dl_matrix3d_concat_4(dl_matrix3d_t *in_1, + dl_matrix3d_t *in_2, + dl_matrix3d_t *in_3, + dl_matrix3d_t *in_4); + +/** + * @brief Concatenate the channels of eight matrix3ds into a new matrix3d + * + * @param in_1 First Floating point input matrix3d + * @param in_2 Second Floating point input matrix3d + * @param in_3 Third Floating point input matrix3d + * @param in_4 Fourth Floating point input matrix3d + * @param in_5 Fifth Floating point input matrix3d + * @param in_6 Sixth Floating point input matrix3d + * @param in_7 Seventh Floating point input matrix3d + * @param in_8 eighth Floating point input matrix3d + * + * @return A newly allocated matrix3d with as avlues in_1|in_2|in_3|in_4|in_5|in_6|in_7|in_8 + */ +dl_matrix3d_t *dl_matrix3d_concat_8(dl_matrix3d_t *in_1, + dl_matrix3d_t *in_2, + dl_matrix3d_t *in_3, + dl_matrix3d_t *in_4, + dl_matrix3d_t *in_5, + dl_matrix3d_t *in_6, + dl_matrix3d_t *in_7, + dl_matrix3d_t *in_8); + +/** + * @brief Do a mobilefacenet block forward, dimension is (number, width, height, channel) + * + * @param in Input matrix3d + * @param pw Weights of the pointwise conv layer + * @param pw_bn_scale The scale params of the batch_normalize layer after the pointwise conv layer + * @param pw_bn_offset The offset params of the batch_normalize layer after the pointwise conv layer + * @param dw Weights of the depthwise conv layer + * @param dw_bn_scale The scale params of the batch_normalize layer after the depthwise conv layer + * @param dw_bn_offset The offset params of the batch_normalize layer after the depthwise conv layer + * @param pw_linear Weights of the pointwise linear conv layer + * @param pw_linear_bn_scale The scale params of the batch_normalize layer after the pointwise linear conv layer + * @param pw_linear_bn_offset The offset params of the batch_normalize layer after the pointwise linear conv layer + * @param stride_x The step length of the convolution window in x(width) direction + * @param stride_y The step length of the convolution window in y(height) direction + * @param padding One of VALID or SAME + * @param mode Do convolution using C implement or xtensa implement, 0 or 1, with respect + * If ESP_PLATFORM is not defined, this value is not used. Default is 0 + * @return The result of a mobilefacenet block + */ +dl_matrix3d_t *dl_matrix3d_mobilefaceblock(void *in, + dl_matrix3d_t *pw, + dl_matrix3d_t *pw_bn_scale, + dl_matrix3d_t *pw_bn_offset, + dl_matrix3d_t *dw, + dl_matrix3d_t *dw_bn_scale, + dl_matrix3d_t *dw_bn_offset, + dl_matrix3d_t *pw_linear, + dl_matrix3d_t *pw_linear_bn_scale, + dl_matrix3d_t *pw_linear_bn_offset, + int stride_x, + int stride_y, + int padding, + int mode, + int shortcut); + +/** + * @brief Do a mobilefacenet block forward with 1x1 split conv, dimension is (number, width, height, channel) + * + * @param in Input matrix3d + * @param pw_1 Weights of the pointwise conv layer 1 + * @param pw_2 Weights of the pointwise conv layer 2 + * @param pw_bn_scale The scale params of the batch_normalize layer after the pointwise conv layer + * @param pw_bn_offset The offset params of the batch_normalize layer after the pointwise conv layer + * @param dw Weights of the depthwise conv layer + * @param dw_bn_scale The scale params of the batch_normalize layer after the depthwise conv layer + * @param dw_bn_offset The offset params of the batch_normalize layer after the depthwise conv layer + * @param pw_linear_1 Weights of the pointwise linear conv layer 1 + * @param pw_linear_2 Weights of the pointwise linear conv layer 2 + * @param pw_linear_bn_scale The scale params of the batch_normalize layer after the pointwise linear conv layer + * @param pw_linear_bn_offset The offset params of the batch_normalize layer after the pointwise linear conv layer + * @param stride_x The step length of the convolution window in x(width) direction + * @param stride_y The step length of the convolution window in y(height) direction + * @param padding One of VALID or SAME + * @param mode Do convolution using C implement or xtensa implement, 0 or 1, with respect + * If ESP_PLATFORM is not defined, this value is not used. Default is 0 + * @return The result of a mobilefacenet block + */ +dl_matrix3d_t *dl_matrix3d_mobilefaceblock_split(void *in, + dl_matrix3d_t *pw_1, + dl_matrix3d_t *pw_2, + dl_matrix3d_t *pw_bn_scale, + dl_matrix3d_t *pw_bn_offset, + dl_matrix3d_t *dw, + dl_matrix3d_t *dw_bn_scale, + dl_matrix3d_t *dw_bn_offset, + dl_matrix3d_t *pw_linear_1, + dl_matrix3d_t *pw_linear_2, + dl_matrix3d_t *pw_linear_bn_scale, + dl_matrix3d_t *pw_linear_bn_offset, + int stride_x, + int stride_y, + int padding, + int mode, + int shortcut); +/** + * @brief Print the matrix3d items + * + * @param m dl_matrix3d_t to be printed + * @param message name of matrix + */ +void dl_matrix3d_print(dl_matrix3d_t *m, char *message); + +/** + * @brief Print the matrix3du items + * + * @param m dl_matrix3du_t to be printed + * @param message name of matrix + */ +void dl_matrix3du_print(dl_matrix3du_t *m, char *message); diff --git a/tools/sdk/include/esp-face/dl_lib_matrix3dq.h b/tools/sdk/include/esp-face/dl_lib_matrix3dq.h new file mode 100644 index 00000000..08bb8949 --- /dev/null +++ b/tools/sdk/include/esp-face/dl_lib_matrix3dq.h @@ -0,0 +1,119 @@ +#pragma once +#include "dl_lib_matrix3d.h" + +typedef int16_t qtp_t; + +/* + * Matrix for 3d + * @Warning: the sequence of variables is fixed, cannot be modified, otherwise there will be errors in esp_dsp_dot_float + */ +typedef struct +{ + /******* fix start *******/ + int w; // Width + int h; // Height + int c; // Channel + int n; // Number, to record filter's out_channels. input and output must be 1 + int stride; + int exponent; + qtp_t *item; + /******* fix end *******/ +} dl_matrix3dq_t; + +#define DL_QTP_SHIFT 15 +#define DL_QTP_RANGE ((1<itemq[(y)+(x)*m->stride] +#define DL_QTP_EXP_NA 255 //non-applicable exponent because matrix is null + +#define DL_SHIFT_AUTO 32 + +/* + * @brief Allocate a 3D matrix + * + * @param n,w,h,c number, width, height, channel + * @return 3d matrix + */ +dl_matrix3dq_t *dl_matrix3dq_alloc(int n, int w, int h, int c, int e); + +/* + * @brief Free a 3D matrix + * + * @param m matrix + */ +void dl_matrix3dq_free(dl_matrix3dq_t *m); + +/** + * @brief Zero out the matrix + * Sets all entries in the matrix to 0. + * + * @param m Matrix to zero + */ + + dl_matrix3d_t *dl_matrix3d_from_matrixq(dl_matrix3dq_t *m); + dl_matrix3dq_t *dl_matrixq_from_matrix3d_qmf(dl_matrix3d_t *m,int exponent); + dl_matrix3dq_t *dl_matrixq_from_matrix3d(dl_matrix3d_t *m); +/** + * @brief Copy a range of items from an existing matrix to a preallocated matrix + * + * @param in Old matrix (with foreign data) to re-use. Passing NULL will allocate a new matrix. + * @param x X-offset of the origin of the returned matrix within the sliced matrix + * @param y Y-offset of the origin of the returned matrix within the sliced matrix + * @param w Width of the resulting matrix + * @param h Height of the resulting matrix + * @return The resulting slice matrix + */ +void dl_matrix3dq_slice_copy (dl_matrix3dq_t *dst, dl_matrix3dq_t *src, int x, int y, int w, int h); + + +/** + * @brief Do a general CNN layer pass, dimension is (number, width, height, channel) + * + * @param in Input image + * @param filter Weights of the neurons + * @param bias Bias for the CNN layer. + * @param stride_x The step length of the convolution window in x(width) direction + * @param stride_y The step length of the convolution window in y(height) direction + * @param padding One of VALID or SAME + * @param mode Do convolution using C implement or xtensa implement, 0 or 1, with respect. + * If ESP_PLATFORM is not defined, this value is not used. + * @return The result of CNN layer. + */ +dl_matrix3dq_t *dl_matrix3dq_fc (dl_matrix3dq_t *in, dl_matrix3dq_t *filter, dl_matrix3dq_t *bias, int exponent,int mode); + +dl_matrix3dq_t *dl_matrix3dq_conv (dl_matrix3dq_t *in, dl_matrix3dq_t *filter, dl_matrix3dq_t *bias, + int stride_x, int stride_y, int padding, int exponent, int mode); +dl_matrix3dq_t *dl_matrix3dq_conv_normal (dl_matrix3dq_t *in, dl_matrix3dq_t *filter, dl_matrix3dq_t *bias, + int stride_x, int stride_y, int padding, int exponent, int mode); + +/** + * @brief Print the matrix3d items + * + * @param m dl_matrix3d_t to be printed + * @param message name of matrix + */ +void dl_matrix3dq_print (dl_matrix3dq_t *m, char *message); + +dl_matrix3dq_t *dl_matrix3dq_depthwise_conv (dl_matrix3dq_t *in, dl_matrix3dq_t *filter, + int stride_x, int stride_y, int padding, int exponent, int mode); + +void dl_matrix3dq_relu (dl_matrix3dq_t *m, fptp_t clip); + + + +dl_matrix3dq_t *dl_matrix3dq_global_pool (dl_matrix3dq_t *in); +void dl_matrix3dq_batch_normalize (dl_matrix3dq_t *m, dl_matrix3dq_t *scale, dl_matrix3dq_t *offset); +dl_matrix3dq_t *dl_matrix3dq_add (dl_matrix3dq_t *in_1, dl_matrix3dq_t *in_2, int exponent); +void dl_matrix3dq_relu_std (dl_matrix3dq_t *m); +dl_matrix3dq_t *dl_matrix3dq_mobilefaceblock (void *in, dl_matrix3dq_t *pw, dl_matrix3dq_t *pw_bn_scale,dl_matrix3dq_t *pw_bn_offset, + dl_matrix3dq_t *dw, dl_matrix3dq_t *dw_bn_scale,dl_matrix3dq_t *dw_bn_offset, + dl_matrix3dq_t *pw_linear, dl_matrix3dq_t *pw_linear_bn_scale,dl_matrix3dq_t *pw_linear_bn_offset, + int pw_exponent,int dw_exponent,int pw_linear_exponent,int stride_x, int stride_y, int padding, int mode, int shortcut); + +dl_matrix3dq_t *dl_matrix3dq_concat(dl_matrix3dq_t *in_1, dl_matrix3dq_t *in_2); +dl_matrix3dq_t *dl_matrix3dq_concat_4(dl_matrix3dq_t *in_1, dl_matrix3dq_t *in_2, dl_matrix3dq_t *in_3, dl_matrix3dq_t *in_4); +dl_matrix3dq_t *dl_matrix3dq_concat_8(dl_matrix3dq_t *in_1, dl_matrix3dq_t *in_2, dl_matrix3dq_t *in_3, dl_matrix3dq_t *in_4, dl_matrix3dq_t *in_5, dl_matrix3dq_t *in_6, dl_matrix3dq_t *in_7, dl_matrix3dq_t *in_8); + +dl_matrix3dq_t *dl_matrix3dq_mobilefaceblock_split (void *in, dl_matrix3dq_t *pw_1, dl_matrix3dq_t *pw_2, dl_matrix3dq_t *pw_bn_scale,dl_matrix3dq_t *pw_bn_offset, + dl_matrix3dq_t *dw, dl_matrix3dq_t *dw_bn_scale,dl_matrix3dq_t *dw_bn_offset, + dl_matrix3dq_t *pw_linear_1, dl_matrix3dq_t *pw_linear_2, dl_matrix3dq_t *pw_linear_bn_scale,dl_matrix3dq_t *pw_linear_bn_offset, + int pw_exponent,int dw_exponent,int pw_linear_exponent,int stride_x, int stride_y, int padding, int mode, int shortcut); diff --git a/tools/sdk/include/esp-face/dl_lib_matrixq.h b/tools/sdk/include/esp-face/dl_lib_matrixq.h new file mode 100644 index 00000000..a2ff3e38 --- /dev/null +++ b/tools/sdk/include/esp-face/dl_lib_matrixq.h @@ -0,0 +1,359 @@ +#ifndef DL_LIB_MATRIXQ_H +#define DL_LIB_MATRIXQ_H + +#include +#include "dl_lib_matrix.h" + +typedef int16_t qtp_t; + +//Quantized matrix. Uses fixed numbers and has the storage for the rows/columns inverted +//for easy use as a multiplicand without stressing out the flash cache too much. +typedef struct { + int w; + int h; + int stride; //Normally equals h, not w! + int flags; + int exponent; //The values in items should be multiplied by pow(2,exponent) to get the real values. + qtp_t *itemq; +} dl_matrix2dq_t; + +#define DL_QTP_SHIFT 15 +#define DL_QTP_RANGE ((1<itemq[(y)+(x)*m->stride] +#define DL_QTP_EXP_NA 255 //non-applicable exponent because matrix is null + +#define DL_SHIFT_AUTO 32 + +/** + * @info About quantized matrices and shift values + * + * Grab a coffee (or tea, or hot water) and sit down when you read this for the first + * time. Quantized matrices can speed up your operations, but come with some quirks, and + * it's good to understand how they work before using them. + * + * The data in the quantized matrix type is stored similarily to floating-point types: + * when storing a real value, the value is stored as a mantissa (base number) and an + * exponent. The 'real' value that can be re-derived from those two numbers is something + * similar to mantissa*2^exponent. Up to this point, there's not that much difference from + * the standard floating point implementations like e.g. IEEE-754. + * + * The difference with respect to quantized matrices is that for a quantized matrix, it is + * assumed all values stored have more-or-less the same order of magnitude. This allows the + * matrix to only store all the mantissas, while the exponents are shared; there is only one + * exponent for the entire matrix. This makes it quicker to handle matrix operations - the + * logic to fix the exponents only needs to happen once, while the rest can be done in simple + * integer arithmetic. It also nets us some memory savings - while normally a floating point + * number is 32-bit, storing only 16-bit mantissas as the matrix items almost halves the + * memory requirements. + * + * While most of the details of handling the intricacies of the quantized matrixes are done + * transparently by the code in dl_lib_matrixq.c, some implementation details leak out, + * specifically in places where addition/subtraction/division happens. + * + * The problem is that the routines do not know what the size of the resulting operation is. For + * instance, when adding two matrices of numbers, the resulting numbers *could* be large enough + * to overflow the mantissa of the result if the exponent is the same. However, if by default we + * assume the mantissas needs to be scaled back, we may lose precision. + * + * In order to counter this, all operations that have this issue have a ``shift`` argument. If + * the argument is zero, the routine will be conservative, that is, increase the exponent of + * the result to such an extent it's mathematically impossible a value in the result will exceed + * the maximum value that can be stored. However, when this argument is larger than zero, the + * algorithm will hold back on this scaling by the indicated amount of bits, preserving precision + * but increasing the chance of some of the calculated values not fitting in the mantissa anymore. + * If this happens, the value will be clipped to the largest (or, for negative values, smallest) + * value possible. (Neural networks usually are okay with this happening for a limited amount + * of matrix indices). + * + * For deciding on these shift values, it is recommended to start with a shift value of one, then + * use dl_matrixq_check_sanity on the result. If this indicates clipping, lower the shift value. + * If it indicates bits are under-used, increase it. Note that for adding and subtraction, only + * shift values of 0 or 1 make sense; these routines will error out if you try to do something + * else. + * + * For neural networks and other noise-tolerant applications, note that even when + * dl_matrixq_check_sanity does not indicate any problems, twiddling with the shift value may lead + * to slightly improved precision. Feel free to experiment. + **/ + + +/** + * @brief Allocate a matrix + * + * @param w Width of the matrix + * @param h Height of the matrix + * @return The matrix, or NULL if out of memory + */ +dl_matrix2dq_t *dl_matrixq_alloc(int w, int h); + +/** + * @brief Convert a floating-point matrix to a quantized matrix + * + * @param m Floating-point matrix to convert + * @param out Quantized matrix to re-use. If NULL, allocate a new one. + * @Return The quantized version of the floating-point matrix + */ +dl_matrix2dq_t *dl_matrixq_from_matrix2d(const dl_matrix2d_t *m, dl_matrix2dq_t *out); + + +/** + * TODO: DESCRIBE THIS FUNCTION + */ +dl_matrix2dq_t *dl_matrixq_from_matrix2d_by_qmf(const dl_matrix2d_t *m, dl_matrix2dq_t *out, int m_bit, int f_bit); + + +/** + * @brief Convert a quantized matrix to a floating-point one. + * + * @param m Floating-point matrix to convert + * @param out Quantized matrix to re-use. If NULL, allocate a new one. + * @Return The quantized version of the floating-point matrix + **/ +dl_matrix2d_t *dl_matrix2d_from_matrixq(const dl_matrix2dq_t *m, dl_matrix2d_t *out); + + +/** + * @brief Free a quantized matrix + * Frees the matrix structure and (if it doesn't have the DL_MF_FOREIGNDATA flag set) the m->items space as well. + * + * @param m Matrix to free + */ +void dl_matrixq_free(dl_matrix2dq_t *m); + +/** + * @brief Zero out the matrix + * Sets all entries in the matrix to 0. + * + * @param m Matrix to zero + */ +void dl_matrixq_zero(dl_matrix2dq_t *m); + + +/** + * @brief Do a dotproduct of two quantized matrices : res=a.b, Result is a fixed-point matrix. + * + * @param a First multiplicand + * @param b Second multiplicand + * @param res Dotproduct data. *Must* be a *different* matrix from a or b! + * @param shift Shift ratio + */ +void dl_matrixq_dot(const dl_matrix2dq_t *a, const dl_matrix2dq_t *b, dl_matrix2dq_t *res, int shift); + +/** + * @brief Do a dotproduct of two quantized matrices: res=a.b, Result is a floating-point matrix. + * + * @param a First multiplicand + * @param b Second multiplicand + * @param res Dotproduct data. *Must* be a *different* matrix from a or b! + */ +void dl_matrixq_dot_matrix_out(const dl_matrix2dq_t *a, const dl_matrix2dq_t *b, dl_matrix2d_t *res); + +/** + * @brief Do a dotproduct of two quantized matrices : res=a.b. This always uses the simple & stupid C algo for the dot product. + * + * Result is a fixed-point matrix. + * + * Use this only if you expect something is wrong with the accelerated routines that dl_matrixq_dot calls; this function can be + * much slower than dl_matrixq_dot . + * + * @param a First multiplicand + * @param b Second multiplicand + * @param res Dotproduct data. *Must* be a *different* matrix from a or b! + * @param shift Shift ratio + */ +void dl_matrixq_dot_c_impl(const dl_matrix2dq_t *a, const dl_matrix2dq_t *b, dl_matrix2dq_t *res, int shift); + +/** + * @brief Do a dotproduct of two quantized matrices : res=a.b. This always uses the simple & stupid C algo for the dot product. + * + * Result is a floating-point matrix. + * + * Use this only if you expect something is wrong with the accelerated routines that dl_matrixq_dot_matrix_out calls; this function can be + * much slower than dl_matrixq_dot_matrix_out. + * + * @param a First multiplicand + * @param b Second multiplicand + * @param res Dotproduct data. *Must* be a *different* matrix from a or b! + */ +void dl_matrixq_dot_matrix_out_c_impl(const dl_matrix2dq_t *a, const dl_matrix2dq_t *b, dl_matrix2d_t *res); + +/** + * @brief Do a dotproduct of a floating point and a quantized matrix. Result is a floating-point matrix. + * + * @param a First multiplicand; float matrix + * @param b Second multiplicand; quantized matrix + * @param res Dotproduct data; float matrix. *Must* be a *different* matrix from a or b! + */ +void dl_matrix_matrixq_dot(const dl_matrix2d_t *a, const dl_matrix2dq_t *b, dl_matrix2d_t *res); + + +/** + * @brief Print the contents of a quantized matrix to stdout. Used for debugging. + * + * @param a The matrix to print. + */ +void dl_printmatrixq(const dl_matrix2dq_t *a); + + +/** + * @brief Add a pair of quantizedmatrices item-by-item: res=a-b + * + * @param a First matrix + * @param b Second matrix + * @param res Added data. Can be equal to a or b to overwrite that. + * @param shift Shift value. Only 0 or 1 makes sense here. + */ +void dl_matrixq_add(const dl_matrix2dq_t *a, const dl_matrix2dq_t *b, dl_matrix2dq_t *res, int shift); + +/** + * @brief Generate a new matrix using a range of items from an existing matrix. + * When using this, the data of the new matrix is not allocated/copied but it re-uses a pointer + * to the existing data. Changing the data in the resulting matrix, as a result, will also change + * the data in the existing matrix that has been sliced. + * + * @Warning In contrast to the floating point equivalent of this function, the fixed-point version + * of this has the issue that as soon as the output exponent of one of the slices changes, the data + * in the sliced matrix gets corrupted (because the exponent of that matrix is still the same.) If you + * use this function, either treat the slices as read-only, or assume the sliced matrix contains + * garbage after modifying the data in one of the slices. + * + * @param x X-offset of the origin of the returned matrix within the sliced matrix + * @param y Y-offset of the origin of the returned matrix within the sliced matrix + * @param w Width of the resulting matrix + * @param h Height of the resulting matrix + * @param in Old matrix (with foreign data) to re-use. Passing NULL will allocate a new matrix. + * @return The resulting slice matrix, or NULL if out of memory + */ +dl_matrix2dq_t *dl_matrixq_slice(const dl_matrix2dq_t *src, int x, int y, int w, int h, dl_matrix2dq_t *in); + +/** + * @brief select a range of items from an existing matrix and flatten them into one dimension. + * + * @Warning The results are flattened in row-major order. + * + * @param x X-offset of the origin of the returned matrix within the sliced matrix + * @param y Y-offset of the origin of the returned matrix within the sliced matrix + * @param w Width of the resulting matrix + * @param h Height of the resulting matrix + * @param in Old matrix to re-use. Passing NULL will allocate a new matrix. + * @return The resulting flatten matrix, or NULL if out of memory + */ +dl_matrix2dq_t *dl_matrixq_flatten(const dl_matrix2dq_t *src, int x, int y, int w, int h, dl_matrix2dq_t *in); + +/** + * @brief Subtract a quantized matrix from another, item-by-item: res=a-b + * + * @param a First matrix + * @param b Second matrix + * @param res Subtracted data. Can be equal to a or b to overwrite that. + * @param shift Shift value. Only 0 or 1 makes sense here. + */ +void dl_matrixq_sub(const dl_matrix2dq_t *a, const dl_matrix2dq_t *b, dl_matrix2dq_t *res, int shift); + +/** + * @brief Multiply a pair of quantized matrices item-by-item: res=a*b + * + * @param a First multiplicand + * @param b Second multiplicand + * @param res Multiplicated data. Can be equal to a or b to overwrite that matrix. + */ +void dl_matrixq_mul(const dl_matrix2dq_t *a, const dl_matrix2dq_t *b, dl_matrix2dq_t *res); + +/** + * @brief Divide a pair of quantized matrices item-by-item: res=a/b + * + * @param a First matrix + * @param b Second matrix + * @param res Divided data. Can be equal to a or b to overwrite that. + */ +void dl_matrixq_div(const dl_matrix2dq_t *a, const dl_matrix2dq_t *b, dl_matrix2dq_t *out, int shift); + +/** + * @brief Check if two quantized matrices have the same shape, that is, the same amount of + * rows and columns + * + * @param a First of the two matrices to compare + * @param b Second of the two matrices to compare + * @return true if the two matrices are shaped the same, false otherwise. + */ +int dl_matrixq_same_shape(const dl_matrix2dq_t *a, const dl_matrix2dq_t *b); + +/** + * @brief Concatenate the rows of two quantized matrices into a new matrix + * + * @param a First matrix + * @param b Second matrix + * @return A newly allocated quantized matrix with as values a|b + */ +dl_matrix2dq_t *dl_matrixq_concat(const dl_matrix2dq_t *a, const dl_matrix2dq_t *b); + +/** + * @brief Add a constant to every item of the quantized matrix + * + * @param subj Matrix to add the constant to + * @param add The constant + */ +void dl_matrixq_add_const(dl_matrix2dq_t *subj, const fptp_t add, int shift); + +/** + * @brief Check the sanity of a quantized matrix + * + * Due to the nature of quantized matrices, depending on the calculations a quantized + * matrix is the result of and the shift values chosen in those calculations, a quantized + * matrix may have an exponent and mantissas that lead to a loss of precision, either because + * most significant mantissa bits are unused, or because a fair amount of mantissas are + * clipped. This function checks if this is the case and will report a message to stdout + * if significant loss of precision is detected. + * + * @param m The quantized matrix to check + * @param name A string to be displayed in the message if the sanity check fails + * @return True if matrix is sane, false otherwise + **/ + +int dl_matrixq_check_sanity(dl_matrix2dq_t *m, const char *name); + +/** + * @brief re-adjust the exponent of the matrix to fit the mantissa better + * + * This function will shift up all the data in the mantissas so there are no + * most-significant bits that are unused in all mantissas. It will also adjust + * the exponent to keep the actua values in the matrix the same. + * + * Some operations done on a matrix, especially operations that re-use the + * result of earlier operations done in the same way, can lead to the loss of + * data because the exponent of the quantized matrix is never re-adjusted. You + * can do that implicitely by calling this function. + * + * @param m The matrix to re-adjust +**/ +void dl_matrixq_readjust_exp(dl_matrix2dq_t *m); + + + +/** + * @brief Get the floating-point value of a specific item from the quantized matrix + * + * @param m Matrix to access + * @param x Column address + * @param y Row address + * @return Value in that position + */ +fptp_t dl_matrixq_get(const dl_matrix2dq_t *m, const int x, const int y); + +/** + * @brief Set a specific item in the quantized matrix to the given + * floating-point value + * + * @warning If the given value is more than the exponent in the quantized matrix + * allows for, all mantissas in the matrix will be shifted down to make the value + * 'fit'. If, however, the exponent is such that the value would result in a + * quantized mantissa of 0, nothing is done. + * + * @param m Matrix to access + * @param x Column address + * @param y Row address + * @param val Value to write to that position + */ +void dl_matrixq_set(dl_matrix2dq_t *m, const int x, const int y, fptp_t val); + +#endif diff --git a/tools/sdk/include/esp-face/fd_forward.h b/tools/sdk/include/esp-face/fd_forward.h new file mode 100644 index 00000000..f990653d --- /dev/null +++ b/tools/sdk/include/esp-face/fd_forward.h @@ -0,0 +1,64 @@ +/* + * ESPRESSIF MIT License + * + * Copyright (c) 2018 + * + * Permission is hereby granted for use on ESPRESSIF SYSTEMS products only, in which case, + * it is free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is furnished + * to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +#pragma once + +#if __cplusplus +extern "C" +{ +#endif + +#include "image_util.h" +#include "dl_lib.h" +#include "mtmn.h" + + static inline mtmn_config_t mtmn_init_config() + { + mtmn_config_t mtmn_config; + mtmn_config.min_face = 80; + mtmn_config.pyramid = 0.7; + mtmn_config.p_threshold.score = 0.6; + mtmn_config.p_threshold.nms = 0.7; + mtmn_config.r_threshold.score = 0.6; + mtmn_config.r_threshold.nms = 0.7; + mtmn_config.r_threshold.candidate_number = 4; + mtmn_config.o_threshold.score = 0.6; + mtmn_config.o_threshold.nms = 0.4; + mtmn_config.o_threshold.candidate_number = 1; + + return mtmn_config; + } + + /** + * @brief Do MTMN face detection, return box and landmark infomation. + * + * @param image_matrix Image matrix, rgb888 format + * @param config Configuration of MTMN i.e. score threshold, nms threshold, candidate number threshold, pyramid, min face size + * @return box_array_t* A list of boxes and score. + */ + box_array_t *face_detect(dl_matrix3du_t *image_matrix, + mtmn_config_t *config); + +#if __cplusplus +} +#endif diff --git a/tools/sdk/include/esp-face/fr_flash.h b/tools/sdk/include/esp-face/fr_flash.h new file mode 100644 index 00000000..f42df90d --- /dev/null +++ b/tools/sdk/include/esp-face/fr_flash.h @@ -0,0 +1,45 @@ +#pragma once + +#if __cplusplus +extern "C" +{ +#endif + +#include "fr_forward.h" + +#define FR_FLASH_TYPE 32 +#define FR_FLASH_SUBTYPE 32 +#define FR_FLASH_PARTITION_NAME "fr" +#define FR_FLASH_INFO_FLAG 12138 + + /** + * @brief Produce face id according to the input aligned face, and save it to dest_id and flash. + * + * @param l Face id list + * @param aligned_face An aligned face + * @return -2 Flash partition not found + * @return 0 Enrollment finish + * @return >=1 The left piece of aligned faces should be input + */ + int8_t enroll_face_id_to_flash(face_id_list *l, + dl_matrix3du_t *aligned_face); + + /** + * @brief Read the enrolled face IDs from the flash. + * + * @param l Face id list + * @return int8_t The number of IDs remaining in flash + */ + int8_t read_face_id_from_flash(face_id_list *l); + + /** + * @brief Delete the enrolled face IDs in the flash. + * + * @param l Face id list + * @return int8_t The number of IDs remaining in flash + */ + int8_t delete_face_id_in_flash(face_id_list *l); + +#if __cplusplus +} +#endif diff --git a/tools/sdk/include/esp-face/fr_forward.h b/tools/sdk/include/esp-face/fr_forward.h new file mode 100644 index 00000000..32f20881 --- /dev/null +++ b/tools/sdk/include/esp-face/fr_forward.h @@ -0,0 +1,116 @@ +#pragma once + +#if __cplusplus +extern "C" +{ +#endif + +#include "image_util.h" +#include "dl_lib.h" +#include "frmn.h" + +#define FACE_WIDTH 56 +#define FACE_HEIGHT 56 +#define FACE_ID_SIZE 512 +#define FACE_REC_THRESHOLD 0.5 + +#define LEFT_EYE_X 0 +#define LEFT_EYE_Y 1 +#define RIGHT_EYE_X 6 +#define RIGHT_EYE_Y 7 +#define NOSE_X 4 +#define NOSE_Y 5 + +#define EYE_DIST_SET 16.5f +#define NOSE_EYE_RATIO_THRES_MIN 0.49f +#define NOSE_EYE_RATIO_THRES_MAX 2.04f + +#define FLASH_INFO_FLAG 12138 +#define FLASH_PARTITION_NAME "fr" + +/** + * @brief HTTP Client events data + */ + typedef struct + { + uint8_t head; /*!< head index of the id list */ + uint8_t tail; /*!< tail index of the id list */ + uint8_t count; /*!< number of enrolled ids */ + uint8_t size; /*!< max len of id list */ + uint8_t confirm_times; /*!< images needed for one enrolling */ + dl_matrix3d_t **id_list; /*!< stores face id vectors */ + } face_id_list; + + + /** + * @brief Initialize face id list + * + * @param l Face id list + * @param size Size of list, one list contains one vector + * @param confirm_times Enroll times for one id + * @return dl_matrix3du_t* Size: 1xFACE_WIDTHxFACE_HEIGHTx3 + */ + void face_id_init(face_id_list *l, uint8_t size, uint8_t confirm_times); + + /** + * @brief Alloc memory for aligned face. + * + * @return dl_matrix3du_t* Size: 1xFACE_WIDTHxFACE_HEIGHTx3 + */ + dl_matrix3du_t *aligned_face_alloc(); + + /** + * @brief Align detected face to average face according to landmark + * + * @param onet_boxes Output of MTMN with box and landmark + * @param src Image matrix, rgb888 format + * @param dest Output image + * @return ESP_OK Input face is good for recognition + * @return ESP_FAIL Input face is not good for recognition + */ + int8_t align_face(box_array_t *onet_boxes, + dl_matrix3du_t *src, + dl_matrix3du_t *dest); + + /** + * @brief Add src_id to dest_id + * + * @param dest_id + * @param src_id + */ + void add_face_id(dl_matrix3d_t *dest_id, + dl_matrix3d_t *src_id); + + /** + * @brief Match face with the id_list, and return matched_id. + * + * @param algined_face An aligned face + * @param id_list An ID list + * @return int8_t Matched face id + */ + int8_t recognize_face(face_id_list *l, + dl_matrix3du_t *algined_face); + + /** + * @brief Produce face id according to the input aligned face, and save it to dest_id. + * + * @param l face id list + * @param aligned_face An aligned face + * @param enroll_confirm_times Confirm times for each face id enrollment + * @return -1 Wrong input enroll_confirm_times + * @return 0 Enrollment finish + * @return >=1 The left piece of aligned faces should be input + */ + int8_t enroll_face(face_id_list *l, + dl_matrix3du_t *aligned_face); + + /** + * @brief Alloc memory for aligned face. + * + * @param l face id list + * @return uint8_t left count + */ + uint8_t delete_face(face_id_list *l); +#if __cplusplus +} +#endif diff --git a/tools/sdk/include/esp-face/frmn.h b/tools/sdk/include/esp-face/frmn.h new file mode 100644 index 00000000..b96b3070 --- /dev/null +++ b/tools/sdk/include/esp-face/frmn.h @@ -0,0 +1,28 @@ +#pragma once + +#if __cplusplus +extern "C" +{ +#endif + +#include "dl_lib.h" + + /** + * @brief + * + * @param in + * @return dl_matrix3d_t* + */ + dl_matrix3d_t *frmn(dl_matrix3d_t *in); + + /** + * @brief + * + * @param in + * @return dl_matrix3dq_t* + */ + dl_matrix3dq_t *frmn_q(dl_matrix3dq_t *in, dl_conv_mode mode); + +#if __cplusplus +} +#endif diff --git a/tools/sdk/include/esp-face/image_util.h b/tools/sdk/include/esp-face/image_util.h new file mode 100644 index 00000000..c401cb71 --- /dev/null +++ b/tools/sdk/include/esp-face/image_util.h @@ -0,0 +1,275 @@ +/* + * ESPRESSIF MIT License + * + * Copyright (c) 2018 + * + * Permission is hereby granted for use on ESPRESSIF SYSTEMS products only, in which case, + * it is free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is furnished + * to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +#pragma once +#ifdef __cplusplus +extern "C" +{ +#endif +#include +#include "mtmn.h" + +#define MAX_VALID_COUNT_PER_IMAGE (30) + +#define DL_IMAGE_MIN(A, B) ((A) < (B) ? (A) : (B)) +#define DL_IMAGE_MAX(A, B) ((A) < (B) ? (B) : (A)) + +#define IMAGE_WIDTH 320 +#define IMAGE_HEIGHT 240 + +#define RGB565_MASK_RED 0xF800 +#define RGB565_MASK_GREEN 0x07E0 +#define RGB565_MASK_BLUE 0x001F + + typedef struct + { + fptp_t landmark_p[10]; + } landmark_t; + + typedef struct + { + fptp_t box_p[4]; + } box_t; + + typedef struct tag_box_list + { + box_t *box; + landmark_t *landmark; + int len; + } box_array_t; + + typedef struct tag_image_box + { + struct tag_image_box *next; + fptp_t score; + box_t box; + box_t offset; + landmark_t landmark; + } image_box_t; + + typedef struct tag_image_list + { + image_box_t *head; + image_box_t *origin_head; + int len; + } image_list_t; + + static inline void image_get_width_and_height(box_t *box, float *w, float *h) + { + *w = box->box_p[2] - box->box_p[0] + 1; + *h = box->box_p[3] - box->box_p[1] + 1; + } + + static inline void image_get_area(box_t *box, float *area) + { + float w, h; + image_get_width_and_height(box, &w, &h); + *area = w * h; + } + + static inline void image_calibrate_by_offset(image_list_t *image_list) + { + for (image_box_t *head = image_list->head; head; head = head->next) + { + float w, h; + image_get_width_and_height(&(head->box), &w, &h); + head->box.box_p[0] = DL_IMAGE_MAX(0, head->box.box_p[0] + head->offset.box_p[0] * w); + head->box.box_p[1] = DL_IMAGE_MAX(0, head->box.box_p[1] + head->offset.box_p[1] * w); + head->box.box_p[2] += head->offset.box_p[2] * w; + if (head->box.box_p[2] > IMAGE_WIDTH) + { + head->box.box_p[2] = IMAGE_WIDTH - 1; + head->box.box_p[0] = IMAGE_WIDTH - w; + } + head->box.box_p[3] += head->offset.box_p[3] * h; + if (head->box.box_p[3] > IMAGE_HEIGHT) + { + head->box.box_p[3] = IMAGE_HEIGHT - 1; + head->box.box_p[1] = IMAGE_HEIGHT - h; + } + } + } + + static inline void image_landmark_calibrate(image_list_t *image_list) + { + for (image_box_t *head = image_list->head; head; head = head->next) + { + float w, h; + image_get_width_and_height(&(head->box), &w, &h); + head->landmark.landmark_p[0] = head->box.box_p[0] + head->landmark.landmark_p[0] * w; + head->landmark.landmark_p[1] = head->box.box_p[1] + head->landmark.landmark_p[1] * h; + + head->landmark.landmark_p[2] = head->box.box_p[0] + head->landmark.landmark_p[2] * w; + head->landmark.landmark_p[3] = head->box.box_p[1] + head->landmark.landmark_p[3] * h; + + head->landmark.landmark_p[4] = head->box.box_p[0] + head->landmark.landmark_p[4] * w; + head->landmark.landmark_p[5] = head->box.box_p[1] + head->landmark.landmark_p[5] * h; + + head->landmark.landmark_p[6] = head->box.box_p[0] + head->landmark.landmark_p[6] * w; + head->landmark.landmark_p[7] = head->box.box_p[1] + head->landmark.landmark_p[7] * h; + + head->landmark.landmark_p[8] = head->box.box_p[0] + head->landmark.landmark_p[8] * w; + head->landmark.landmark_p[9] = head->box.box_p[1] + head->landmark.landmark_p[9] * h; + } + } + + static inline void image_rect2sqr(box_array_t *boxes, int width, int height) + { + for (int i = 0; i < boxes->len; i++) + { + box_t *box = &(boxes->box[i]); + float w, h; + image_get_width_and_height(box, &w, &h); + float l = DL_IMAGE_MAX(w, h); + + box->box_p[0] = DL_IMAGE_MAX(0, box->box_p[0] + 0.5 * (w - l)); + box->box_p[1] = DL_IMAGE_MAX(0, box->box_p[1] + 0.5 * (h - l)); + box->box_p[2] = box->box_p[0] + l - 1; + if (box->box_p[2] > width) + { + box->box_p[2] = width - 1; + box->box_p[0] = width - l; + } + box->box_p[3] = box->box_p[1] + l - 1; + if (box->box_p[3] > height) + { + box->box_p[3] = height - 1; + box->box_p[1] = height - l; + } + } + } + + static inline void rgb565_to_888(uint16_t in, uint8_t *dst) + { /*{{{*/ + dst[0] = (in & RGB565_MASK_BLUE) << 3; // blue + dst[1] = (in & RGB565_MASK_GREEN) >> 3; // green + dst[2] = (in & RGB565_MASK_RED) >> 8; // red + } /*}}}*/ + + static inline void rgb888_to_565(uint16_t *in, uint8_t r, uint8_t g, uint8_t b) + { /*{{{*/ + uint16_t rgb565 = 0; + rgb565 = ((r >> 3) << 11); + rgb565 |= ((g >> 2) << 5); + rgb565 |= (b >> 3); + *in = rgb565; + } /*}}}*/ + + /** + * @brief + * + * @param score + * @param offset + * @param width + * @param height + * @param p_net_size + * @param score_threshold + * @param scale + * @return image_list_t* + */ + image_list_t *image_get_valid_boxes(fptp_t *score, + fptp_t *offset, + int width, + int height, + int p_net_size, + fptp_t score_threshold, + fptp_t scale); + /** + * @brief + * + * @param image_sorted_list + * @param insert_list + */ + void image_sort_insert_by_score(image_list_t *image_sorted_list, const image_list_t *insert_list); + + /** + * @brief + * + * @param image_list + * @param nms_threshold + * @param same_area + */ + void image_nms_process(image_list_t *image_list, fptp_t nms_threshold, int same_area); + + /** + * @brief + * + * @param dst_image + * @param src_image + * @param dst_w + * @param dst_h + * @param dst_c + * @param src_w + * @param src_h + */ + void image_resize_linear(uint8_t *dst_image, uint8_t *src_image, int dst_w, int dst_h, int dst_c, int src_w, int src_h); + + /** + * @brief + * + * @param corp_image + * @param src_image + * @param rotate_angle + * @param ratio + * @param center + */ + void image_cropper(dl_matrix3du_t *corp_image, dl_matrix3du_t *src_image, float rotate_angle, float ratio, float *center); + + /** + * @brief + * + * @param m + * @param bmp + * @param count + */ + void transform_input_image(uint8_t *m, uint16_t *bmp, int count); + + /** + * @brief + * + * @param bmp + * @param m + * @param count + */ + void transform_output_image(uint16_t *bmp, uint8_t *m, int count); + + /** + * @brief + * + * @param buf + * @param boxes + * @param width + */ + void draw_rectangle_rgb565(uint16_t *buf, box_array_t *boxes, int width); + + /** + * @brief + * + * @param buf + * @param boxes + * @param width + */ + void draw_rectangle_rgb888(uint8_t *buf, box_array_t *boxes, int width); +#ifdef __cplusplus +} +#endif diff --git a/tools/sdk/include/esp-face/mtmn.h b/tools/sdk/include/esp-face/mtmn.h new file mode 100644 index 00000000..4b031c9f --- /dev/null +++ b/tools/sdk/include/esp-face/mtmn.h @@ -0,0 +1,99 @@ +/* + * ESPRESSIF MIT License + * + * Copyright (c) 2018 + * + * Permission is hereby granted for use on ESPRESSIF SYSTEMS products only, in which case, + * it is free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is furnished + * to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif +#include "dl_lib.h" + + typedef enum + { + PNET = 0, /// P-Net + RNET = 1, /// R-Net + ONET = 2, /// O-Net + } net_type_en; + + typedef struct + { + float score; /// score threshold for filter candidates by score + float nms; /// nms threshold for nms process + int candidate_number; /// candidate number limitation for each net + } threshold_config_t; + + typedef struct + { + net_type_en net_type; /// net type + char *file_name; /// net name + int w; /// net width + int h; /// net height + threshold_config_t threshold; /// threshold of net + } net_config_t; + + typedef struct + { + float min_face; /// the minimum size of face can be detected + float pyramid; /// the pyramid scale + threshold_config_t p_threshold; /// score, nms and candidate threshold of pnet + threshold_config_t r_threshold; /// score, nms and candidate threshold of rnet + threshold_config_t o_threshold; /// score, nms and candidate threshold of onet + } mtmn_config_t; + + typedef struct + { + dl_matrix3d_t *category; + dl_matrix3d_t *offset; + dl_matrix3d_t *landmark; + } mtmn_net_t; + + /** + * @brief Forward the pnet process, coarse detection + * + * @param in Image matrix, rgb888 format, size is 320x240 + * @return Scores for every pixel, and box offset with respect. + */ + mtmn_net_t *pnet(dl_matrix3du_t *in); + + /** + * @brief Forward the rnet process, fine determine the boxes from pnet + * + * @param in Image matrix, rgb888 format + * @param threshold Score threshold to detect human face + * @return Scores for every box, and box offset with respect. + */ + mtmn_net_t *rnet_with_score_verify(dl_matrix3du_t *in, float threshold); + + /** + * @brief Forward the onet process, fine determine the boxes from rnet + * + * @param in Image matrix, rgb888 format + * @param threshold Score threshold to detect human face + * @return Scores for every box, box offset, and landmark with respect. + */ + mtmn_net_t *onet_with_score_verify(dl_matrix3du_t *in, float threshold); + +#ifdef __cplusplus +} +#endif diff --git a/tools/sdk/include/esp32/esp_attr.h b/tools/sdk/include/esp32/esp_attr.h index e820d892..c9e3879e 100644 --- a/tools/sdk/include/esp32/esp_attr.h +++ b/tools/sdk/include/esp32/esp_attr.h @@ -14,6 +14,8 @@ #ifndef __ESP_ATTR_H__ #define __ESP_ATTR_H__ +#include "sdkconfig.h" + #define ROMFN_ATTR //Normally, the linker script will put all code and rodata in flash, diff --git a/tools/sdk/include/esp_https_server/esp_https_server.h b/tools/sdk/include/esp_https_server/esp_https_server.h index 2b7343e7..19c326ed 100644 --- a/tools/sdk/include/esp_https_server/esp_https_server.h +++ b/tools/sdk/include/esp_https_server/esp_https_server.h @@ -19,6 +19,10 @@ #include "esp_err.h" #include "esp_http_server.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef enum { HTTPD_SSL_TRANSPORT_SECURE, // SSL Enabled HTTPD_SSL_TRANSPORT_INSECURE // SSL disabled @@ -92,6 +96,10 @@ typedef struct httpd_ssl_config httpd_ssl_config_t; .open_fn = NULL, \ .close_fn = NULL, \ }, \ + .cacert_pem = NULL, \ + .cacert_len = 0, \ + .prvtkey_pem = NULL, \ + .prvtkey_len = 0, \ .transport_mode = HTTPD_SSL_TRANSPORT_SECURE, \ .port_secure = 443, \ .port_insecure = 80, \ @@ -114,4 +122,8 @@ esp_err_t httpd_ssl_start(httpd_handle_t *handle, httpd_ssl_config_t *config); */ void httpd_ssl_stop(httpd_handle_t handle); +#ifdef __cplusplus +} +#endif + #endif // _ESP_HTTPS_SERVER_H_ diff --git a/tools/sdk/include/fb_gfx/fb_gfx.h b/tools/sdk/include/fb_gfx/fb_gfx.h new file mode 100644 index 00000000..079ff7bf --- /dev/null +++ b/tools/sdk/include/fb_gfx/fb_gfx.h @@ -0,0 +1,44 @@ +// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#ifndef _FB_GFX_H_ +#define _FB_GFX_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + typedef enum { + FB_RGB888, FB_BGR888, FB_RGB565, FB_BGR565 + } fb_format_t; + + typedef struct { + int width; + int height; + int bytes_per_pixel; + fb_format_t format; + uint8_t * data; + } fb_data_t; + + void fb_gfx_fillRect (fb_data_t *fb, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color); + void fb_gfx_drawFastHLine(fb_data_t *fb, int32_t x, int32_t y, int32_t w, uint32_t color); + void fb_gfx_drawFastVLine(fb_data_t *fb, int32_t x, int32_t y, int32_t h, uint32_t color); + uint8_t fb_gfx_putc (fb_data_t *fb, int32_t x, int32_t y, uint32_t color, unsigned char c); + uint32_t fb_gfx_print (fb_data_t *fb, int32_t x, int32_t y, uint32_t color, const char * str); + uint32_t fb_gfx_printf (fb_data_t *fb, int32_t x, int32_t y, uint32_t color, const char *format, ...); + +#ifdef __cplusplus +} +#endif + +#endif /* _FB_GFX_H_ */ diff --git a/tools/sdk/include/lwip/arch/sys_arch.h b/tools/sdk/include/lwip/arch/sys_arch.h index bfa2ad6c..9638fdfd 100644 --- a/tools/sdk/include/lwip/arch/sys_arch.h +++ b/tools/sdk/include/lwip/arch/sys_arch.h @@ -62,7 +62,25 @@ typedef struct sys_mbox_s { #endif #define sys_mbox_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE ) -#define sys_mbox_set_invalid( x ) ( ( *x ) = NULL ) + +/* Define the sys_mbox_set_invalid() to empty to support lock-free mbox in ESP LWIP. + * + * The basic idea about the lock-free mbox is that the mbox should always be valid unless + * no socket APIs are using the socket and the socket is closed. ESP LWIP achieves this by + * following two changes to official LWIP: + * 1. Postpone the deallocation of mbox to netconn_free(), in other words, free the mbox when + * no one is using the socket. + * 2. Define the sys_mbox_set_invalid() to empty if the mbox is not actually freed. + + * The second change is necessary. Consider a common scenario: the application task calls + * recv() to receive packets from the socket, the sys_mbox_valid() returns true. Because there + * is no lock for the mbox, the LWIP CORE can call sys_mbox_set_invalid() to set the mbox at + * anytime and the thread-safe issue may happen. + * + * However, if the sys_mbox_set_invalid() is not called after sys_mbox_free(), e.g. in netconn_alloc(), + * we need to initialize the mbox to invalid explicitly since sys_mbox_set_invalid() now is empty. + */ +#define sys_mbox_set_invalid( x ) #define sys_sem_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE ) #define sys_sem_set_invalid( x ) ( ( *x ) = NULL ) diff --git a/tools/sdk/include/lwip/lwip/api.h b/tools/sdk/include/lwip/lwip/api.h index 5ad6235e..a4fed9bb 100644 --- a/tools/sdk/include/lwip/lwip/api.h +++ b/tools/sdk/include/lwip/lwip/api.h @@ -233,15 +233,6 @@ struct netconn { by the application thread */ sys_mbox_t acceptmbox; #endif /* LWIP_TCP */ - -#if ESP_THREAD_SAFE - /** point to the same mbox as recvmbox */ - sys_mbox_t recvmbox_ref; -#if LWIP_TCP - /** point to the same mbox as acceptmbox */ - sys_mbox_t acceptmbox_ref; -#endif -#endif /** only used for socket layer */ #if LWIP_SOCKET int socket; diff --git a/tools/sdk/include/lwip/sys_arch.h b/tools/sdk/include/lwip/sys_arch.h index bfa2ad6c..9638fdfd 100644 --- a/tools/sdk/include/lwip/sys_arch.h +++ b/tools/sdk/include/lwip/sys_arch.h @@ -62,7 +62,25 @@ typedef struct sys_mbox_s { #endif #define sys_mbox_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE ) -#define sys_mbox_set_invalid( x ) ( ( *x ) = NULL ) + +/* Define the sys_mbox_set_invalid() to empty to support lock-free mbox in ESP LWIP. + * + * The basic idea about the lock-free mbox is that the mbox should always be valid unless + * no socket APIs are using the socket and the socket is closed. ESP LWIP achieves this by + * following two changes to official LWIP: + * 1. Postpone the deallocation of mbox to netconn_free(), in other words, free the mbox when + * no one is using the socket. + * 2. Define the sys_mbox_set_invalid() to empty if the mbox is not actually freed. + + * The second change is necessary. Consider a common scenario: the application task calls + * recv() to receive packets from the socket, the sys_mbox_valid() returns true. Because there + * is no lock for the mbox, the LWIP CORE can call sys_mbox_set_invalid() to set the mbox at + * anytime and the thread-safe issue may happen. + * + * However, if the sys_mbox_set_invalid() is not called after sys_mbox_free(), e.g. in netconn_alloc(), + * we need to initialize the mbox to invalid explicitly since sys_mbox_set_invalid() now is empty. + */ +#define sys_mbox_set_invalid( x ) #define sys_sem_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE ) #define sys_sem_set_invalid( x ) ( ( *x ) = NULL ) diff --git a/tools/sdk/lib/libapp_trace.a b/tools/sdk/lib/libapp_trace.a index 3f4021752363efb3b830ec716a20ff8a09f87e8d..e11c4a854713e393b6949267dab6089fe70377e9 100644 GIT binary patch delta 84 zcmcbyneoPE#tG8w<_0Ea76zspl|mVzY?IA(jD{RA&g42qvCU^V7uzEVNN(=;l!2)* Oom|H#vH4UW9|r*M`4<=f delta 84 zcmcbyneoPE#tG8wW(J1l=H_M_l|mU|?9FwIh8!@?n`PN;mI>1A<_0Ea76v98mBg7~?8y#Hn=Q<&42`XfOci_@% delta 115 zcmZ2>n`PN;mI>1AW(J1l=H_M_mBg7~?8y#Hn=LG@jEt;I%^0A-B{f;W$U?!$z|aCL wQf91Ytecctl4z)FXl$mNZfTyHnw*wsn6z1&xl9PjB(dgwqTBb0GQJQ805{$oQ~&?~ diff --git a/tools/sdk/lib/libasio.a b/tools/sdk/lib/libasio.a index fb498cc70e44fd453801047f41954faf5039a41d..7e6d007f80d7ce6e78b1c6cd8baa6bff1fb93b87 100644 GIT binary patch delta 149 zcmcbyw(7>(stMBU<_0Ea7KR2Jl^)K9v75Q(v~$g2Z0DN8)Xp`Bxt(hcOFP#b)^@Hr zZ0%fg*xR}0aI|yH;cVxc!`03;hr69?4o^GR9Nu=WIehJ0bNJi2<_NTN%@J(pnj_TC zHAlFeYmP`e*BsGyt~p}uTyw(stMBUW(J1l<`za9l^)K9v75Q(v~$g2Z0DN8)Xp`Bxt(hcOFP#b)^@Hr zZ0%fg*xR}0aI|yH;cVxc!`03;hr69?4o^GR9Nu=WIehJ0bNJi2<_NTN%@J(pnj_TC zHAlFeYmP`e*BsGyt~p}uTyw&$qLb>i__} CSxPYg delta 242 zcmX^1Lg?5Fp$XD#W(J1l=H?p}ZP?i%Ota|=EEvT$SFs% z`FBbc4wMnbemcQHq;g=v}Y@PtWx`($$#vjC{R?dRKB%5?xH;z`B; diff --git a/tools/sdk/lib/libbt.a b/tools/sdk/lib/libbt.a index 9fefa58c6f9f8f337ec9cc0fd3d5707767967af5..234f40ea72a3b6f1b8d3152162d7c9d9b7f1f2e2 100644 GIT binary patch delta 56531 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 delta 56672 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 diff --git a/tools/sdk/lib/libcoap.a b/tools/sdk/lib/libcoap.a index 397808cfa5d3650952ac317196851f9116eb75cf..1d75b943635584894032352efb7c2861f8d751f8 100644 GIT binary patch delta 298 zcmccgOZw6;=?T*8<_0Ea76z6ZmE5_YY?I9eT&0>&j_KqAF7eIGCRr{h0^Jox9x#FF z340jDH{U)WC&>meZ1ew{Zabmu>G69QCAKF|W=xU*sW&t?vY2#BeEZ|ojAa5)CEMfo zFkTV|$(mUhm`^U?l4uXO!ni%)3RB`FnCPTi65B7NF~8jo6PR4UCAR&R9E)%lRKx=8 yjCSsoEZezPvO4ji2yf5c#+nB6s|8r^yNj&GvQR~qU=h3bto>~$BCkr>GTH%GpY&g23v@y*O8SuQ97-4#Y2Y!I!} zo009CR*eh=d%afqzB z+2jH)iS~dijN1dQFeOfcDw+KMrsVbuY0Pi8BPkQxeoKx;xC^QTY*9P+N|x>1D_Na* skwv#>Z(~h^c@$)U*!Fi9S&d~;%(8pW+TR8hF`rz(CAR%lDO*N60OP1!F8}}l diff --git a/tools/sdk/lib/libcoexist.a b/tools/sdk/lib/libcoexist.a index 4fea67bd7509cfee6603e7e7fcf54b25302d43b0..d1372840e514ffacd3896e4a8c1246b296abab1d 100644 GIT binary patch delta 148 zcmezIkm<)mrU}yQW~K&~29|~!m3Fei*pvUw5nKF&m5I@K^H26?;>g0A|H$hrpa^(4 oDBGY2bkzK2LlIce%q)y7F!{i=155^`o13PW!mZr=Z_Y1a031~`{r~^~ delta 148 zcmezIkm<)mrU}yQrWS?<7G@S3m3Fei*pvUw5nKF&m5I@4^H26?;>g0A|H$hrpa^(4 oDBGY2bkzK2LlIce%q)y7F!{i=155#jH#bc$gOSZ~V0WVe6nXMLFq<(Y4P^q2LW5&$|#9Y6p8 diff --git a/tools/sdk/lib/libcore.a b/tools/sdk/lib/libcore.a index 2175439413366c4648a542cfa1f7718710179e94..013845438020a0c54b6d56fe41b27dab9a1c2fd9 100644 GIT binary patch delta 30 fcmX?Na>QhUG`pFpfu(_^;Y6jIFy>|^Mkh%Cj>8Be delta 30 fcmX?Na>QhUG`p#Vp@D^&#YCl>Fy>|^Mkh%Ck4p$I diff --git a/tools/sdk/lib/libcxx.a b/tools/sdk/lib/libcxx.a index 08318cf97b5acdc5b6239d9708068dec2364a4e6..4ad1ff025a4fbb81fcf12d467e40d176a3e1f99a 100644 GIT binary patch delta 52 zcmeD9$lURfd4e>%xq*q9g@M^brI%2q>0~}bvCSHc_x0Hza+3ua#W$-MrW^+Vri~9P delta 48 ucmeD9$lURfd4e>%nSr6Xxw-j7rI&0F=44(&@y!~H_w`{?oB0f@jspO2q7Hii diff --git a/tools/sdk/lib/libdl_lib.a b/tools/sdk/lib/libdl_lib.a new file mode 100644 index 0000000000000000000000000000000000000000..352d61934c57b899e3d0c3374cd14b69e68f3399 GIT binary patch literal 641850 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