From d81c668fc7e94312c0853638008fa81806acd33c Mon Sep 17 00:00:00 2001 From: Wentao Wu Date: Thu, 28 Dec 2023 18:28:00 +0800 Subject: [PATCH] k230 canmv docs release v0.3 --- .gitlab-ci.yml | 2 +- ...45\351\227\250\346\214\207\345\215\227.md" | 13 +- ...10\346\234\254\350\257\264\346\230\216.md" | 53 +- zh/api/api.rst | 10 +- ...345\235\227API\346\211\213\345\206\214.md" | 4 +- ...345\235\227API\346\211\213\345\206\214.md" | 4 +- zh/api/cipher/images/canaan-cover.png | Bin 73229 -> 0 bytes zh/api/cipher/images/canaan-lable.png | Bin 4202 -> 0 bytes zh/api/cipher/images/logo.png | Bin 1601 -> 0 bytes ...345\235\227API\346\211\213\345\206\214.md" | 95 + ...345\235\227API\346\211\213\345\206\214.md" | 187 + .../images/k230-canmv-camera-top.png | Bin ...345\235\227API\346\211\213\345\206\214.md" | 171 + ...345\235\227API\346\211\213\345\206\214.md" | 73 + zh/api/machine/images/canaan-cover.png | Bin 73229 -> 0 bytes zh/api/machine/images/canaan-lable.png | Bin 4202 -> 0 bytes zh/api/machine/images/logo.png | Bin 1601 -> 0 bytes ...345\235\227API\346\211\213\345\206\214.md" | 2 +- ...345\235\227API\346\211\213\345\206\214.md" | 119 + zh/api/mpp/images/canaan-cover.png | Bin 73229 -> 0 bytes zh/api/mpp/images/canaan-lable.png | Bin 4202 -> 0 bytes zh/api/mpp/images/logo.png | Bin 1601 -> 0 bytes zh/api/openmv/image.md | 161 + zh/api/stdlib/utime.md | 240 + ...72\344\276\213\350\257\264\346\230\216.md" | 11454 +++++++++++----- zh/example/example.rst | 20 +- zh/example/machine/uart/uart.md | 25 + zh/example/media.rst | 13 + zh/example/omv/April-Tags/find_apriltags.md | 160 + .../omv/April-Tags/find_apriltags_3d_pose.md | 160 + zh/example/omv/Codes/find_barcodes.md | 162 + zh/example/omv/Codes/find_datamatrices.md | 128 + zh/example/omv/Codes/find_qrcodes.md | 127 + .../automatic_grayscale_color_tracking.md | 157 + .../automatic_rgb565_color_tracking.md | 161 + .../black_grayscale_line_following.md | 183 + .../Color-Tracking/image_histogram_info.md | 118 + .../Color-Tracking/image_statistics_info.md | 118 + .../multi_color_code_tracking.md | 153 + .../single_color_code_tracking.md | 147 + zh/example/omv/Drawing/arrow_drawing.md | 117 + zh/example/omv/Drawing/circle_drawing.md | 116 + zh/example/omv/Drawing/cross_drawing.md | 115 + zh/example/omv/Drawing/ellipse_drawing.md | 119 + zh/example/omv/Drawing/flood_fill.md | 115 + zh/example/omv/Drawing/image_drawing.md | 122 + .../omv/Drawing/image_drawing_advanced.md | 195 + .../image_drawing_alpha_blending_test.md | 167 + zh/example/omv/Drawing/keypoints_drawing.md | 116 + zh/example/omv/Drawing/line_drawing.md | 117 + zh/example/omv/Drawing/rectangle_drawing.md | 117 + zh/example/omv/Drawing/text_drawing.md | 118 + zh/example/omv/Feature-Detection/edges.md | 123 + .../omv/Feature-Detection/find_circles.md | 143 + .../omv/Feature-Detection/find_lines.md | 158 + .../omv/Feature-Detection/find_rects.md | 135 + zh/example/omv/Feature-Detection/hog.md | 123 + zh/example/omv/Feature-Detection/keypoints.md | 157 + zh/example/omv/Feature-Detection/lbp.md | 156 + .../linear_regression_fast.md | 142 + .../linear_regression_robust.md | 144 + .../Feature-Detection/template_matching.md | 146 + .../adaptive_histogram_equalization.md | 130 + zh/example/omv/Image-Filters/blur_filter.md | 121 + .../omv/Image-Filters/cartoon_filter.md | 131 + .../Image-Filters/color_bilateral_filter.md | 133 + .../omv/Image-Filters/color_binary_filter.md | 147 + .../omv/Image-Filters/color_light_removal.md | 127 + zh/example/omv/Image-Filters/edge_filter.md | 121 + .../omv/Image-Filters/erode_and_dilate.md | 148 + .../omv/Image-Filters/gamma_correction.md | 123 + .../grayscale_bilateral_filter.md | 134 + .../Image-Filters/grayscale_binary_filter.md | 139 + .../Image-Filters/grayscale_light_removal.md | 127 + .../Image-Filters/histogram_equalization.md | 121 + .../omv/Image-Filters/kernel_filters.md | 127 + .../omv/Image-Filters/lens_correction.md | 123 + zh/example/omv/Image-Filters/linear_polar.md | 123 + zh/example/omv/Image-Filters/log_polar.md | 123 + .../mean_adaptive_threshold_filter.md | 125 + zh/example/omv/Image-Filters/mean_filter.md | 125 + .../median_adaptive_threshold_filter.md | 127 + zh/example/omv/Image-Filters/median_filter.md | 127 + .../midpoint_adaptive_threshold_filter.md | 128 + .../omv/Image-Filters/midpoint_filter.md | 127 + .../mode_adaptive_threshold_filter.md | 125 + zh/example/omv/Image-Filters/mode_filter.md | 125 + zh/example/omv/Image-Filters/negative.md | 121 + .../perspective_and_rotation_correction.md | 171 + .../Image-Filters/perspective_correction.md | 141 + .../omv/Image-Filters/rotation_correction.md | 150 + .../omv/Image-Filters/sharpen_filter.md | 121 + .../omv/Image-Filters/unsharp_filter.md | 121 + .../Image-Filters/vflip_hmirror_transpose.md | 134 + zh/example/omv/Snapshot/emboss_snapshot.md | 89 + zh/example/omv/Snapshot/snapshot.md | 85 + zh/example/omv/find_qrcodes.md | 132 + zh/example/omv/omv.rst | 73 + zh/example/peripheral.rst | 14 + zh/example/socket_network/http_client.md | 48 + zh/example/socket_network/http_server.md | 90 + zh/example/socket_network/network_lan.md | 47 + zh/example/socket_network/tcp_client.md | 45 + zh/example/socket_network/tcp_server.md | 77 + zh/example/socket_network/udp_server.md | 54 + zh/example/socket_network/upd_client.md | 47 + zh/images/Canmv-link-board.png | Bin 136411 -> 96046 bytes ...77\347\224\250\350\257\264\346\230\216.md" | 24 +- ...77\347\224\250\350\257\264\346\230\216.md" | 4 +- zh/userguide/images/ide-2.png | Bin 73143 -> 230351 bytes zh/userguide/images/ide-3.png | Bin 7768 -> 0 bytes zh/userguide/images/ide-4.png | Bin 70573 -> 138361 bytes zh/userguide/images/ide-5.png | Bin 79890 -> 152300 bytes zh/userguide/images/ide-update.png | Bin 0 -> 87088 bytes zh/userguide/images/ide.png | Bin 72636 -> 449341 bytes zh/userguide/images/ide_image.png | Bin 260638 -> 0 bytes 116 files changed, 18627 insertions(+), 3749 deletions(-) delete mode 100755 zh/api/cipher/images/canaan-cover.png delete mode 100755 zh/api/cipher/images/canaan-lable.png delete mode 100755 zh/api/cipher/images/logo.png create mode 100755 "zh/api/extmod/K230_CanMV_network\346\250\241\345\235\227API\346\211\213\345\206\214.md" create mode 100755 "zh/api/extmod/K230_CanMV_socket\346\250\241\345\235\227API\346\211\213\345\206\214.md" rename zh/api/{mpp => }/images/k230-canmv-camera-top.png (100%) create mode 100755 "zh/api/machine/K230_CanMV_UART\346\250\241\345\235\227API\346\211\213\345\206\214.md" create mode 100644 "zh/api/machine/K230_CanMV_machine\346\250\241\345\235\227API\346\211\213\345\206\214.md" delete mode 100755 zh/api/machine/images/canaan-cover.png delete mode 100755 zh/api/machine/images/canaan-lable.png delete mode 100755 zh/api/machine/images/logo.png create mode 100644 "zh/api/mpp/K230_CanMV_PM\346\250\241\345\235\227API\346\211\213\345\206\214.md" delete mode 100755 zh/api/mpp/images/canaan-cover.png delete mode 100755 zh/api/mpp/images/canaan-lable.png delete mode 100755 zh/api/mpp/images/logo.png create mode 100644 zh/api/openmv/image.md create mode 100644 zh/api/stdlib/utime.md create mode 100755 zh/example/machine/uart/uart.md create mode 100755 zh/example/media.rst create mode 100644 zh/example/omv/April-Tags/find_apriltags.md create mode 100644 zh/example/omv/April-Tags/find_apriltags_3d_pose.md create mode 100644 zh/example/omv/Codes/find_barcodes.md create mode 100644 zh/example/omv/Codes/find_datamatrices.md create mode 100644 zh/example/omv/Codes/find_qrcodes.md create mode 100644 zh/example/omv/Color-Tracking/automatic_grayscale_color_tracking.md create mode 100644 zh/example/omv/Color-Tracking/automatic_rgb565_color_tracking.md create mode 100644 zh/example/omv/Color-Tracking/black_grayscale_line_following.md create mode 100644 zh/example/omv/Color-Tracking/image_histogram_info.md create mode 100644 zh/example/omv/Color-Tracking/image_statistics_info.md create mode 100644 zh/example/omv/Color-Tracking/multi_color_code_tracking.md create mode 100644 zh/example/omv/Color-Tracking/single_color_code_tracking.md create mode 100644 zh/example/omv/Drawing/arrow_drawing.md create mode 100644 zh/example/omv/Drawing/circle_drawing.md create mode 100644 zh/example/omv/Drawing/cross_drawing.md create mode 100644 zh/example/omv/Drawing/ellipse_drawing.md create mode 100644 zh/example/omv/Drawing/flood_fill.md create mode 100644 zh/example/omv/Drawing/image_drawing.md create mode 100644 zh/example/omv/Drawing/image_drawing_advanced.md create mode 100644 zh/example/omv/Drawing/image_drawing_alpha_blending_test.md create mode 100644 zh/example/omv/Drawing/keypoints_drawing.md create mode 100644 zh/example/omv/Drawing/line_drawing.md create mode 100644 zh/example/omv/Drawing/rectangle_drawing.md create mode 100644 zh/example/omv/Drawing/text_drawing.md create mode 100644 zh/example/omv/Feature-Detection/edges.md create mode 100644 zh/example/omv/Feature-Detection/find_circles.md create mode 100644 zh/example/omv/Feature-Detection/find_lines.md create mode 100644 zh/example/omv/Feature-Detection/find_rects.md create mode 100644 zh/example/omv/Feature-Detection/hog.md create mode 100644 zh/example/omv/Feature-Detection/keypoints.md create mode 100644 zh/example/omv/Feature-Detection/lbp.md create mode 100644 zh/example/omv/Feature-Detection/linear_regression_fast.md create mode 100644 zh/example/omv/Feature-Detection/linear_regression_robust.md create mode 100644 zh/example/omv/Feature-Detection/template_matching.md create mode 100644 zh/example/omv/Image-Filters/adaptive_histogram_equalization.md create mode 100644 zh/example/omv/Image-Filters/blur_filter.md create mode 100644 zh/example/omv/Image-Filters/cartoon_filter.md create mode 100644 zh/example/omv/Image-Filters/color_bilateral_filter.md create mode 100644 zh/example/omv/Image-Filters/color_binary_filter.md create mode 100644 zh/example/omv/Image-Filters/color_light_removal.md create mode 100644 zh/example/omv/Image-Filters/edge_filter.md create mode 100644 zh/example/omv/Image-Filters/erode_and_dilate.md create mode 100644 zh/example/omv/Image-Filters/gamma_correction.md create mode 100644 zh/example/omv/Image-Filters/grayscale_bilateral_filter.md create mode 100644 zh/example/omv/Image-Filters/grayscale_binary_filter.md create mode 100644 zh/example/omv/Image-Filters/grayscale_light_removal.md create mode 100644 zh/example/omv/Image-Filters/histogram_equalization.md create mode 100644 zh/example/omv/Image-Filters/kernel_filters.md create mode 100644 zh/example/omv/Image-Filters/lens_correction.md create mode 100644 zh/example/omv/Image-Filters/linear_polar.md create mode 100644 zh/example/omv/Image-Filters/log_polar.md create mode 100644 zh/example/omv/Image-Filters/mean_adaptive_threshold_filter.md create mode 100644 zh/example/omv/Image-Filters/mean_filter.md create mode 100644 zh/example/omv/Image-Filters/median_adaptive_threshold_filter.md create mode 100644 zh/example/omv/Image-Filters/median_filter.md create mode 100644 zh/example/omv/Image-Filters/midpoint_adaptive_threshold_filter.md create mode 100644 zh/example/omv/Image-Filters/midpoint_filter.md create mode 100644 zh/example/omv/Image-Filters/mode_adaptive_threshold_filter.md create mode 100644 zh/example/omv/Image-Filters/mode_filter.md create mode 100644 zh/example/omv/Image-Filters/negative.md create mode 100644 zh/example/omv/Image-Filters/perspective_and_rotation_correction.md create mode 100644 zh/example/omv/Image-Filters/perspective_correction.md create mode 100644 zh/example/omv/Image-Filters/rotation_correction.md create mode 100644 zh/example/omv/Image-Filters/sharpen_filter.md create mode 100644 zh/example/omv/Image-Filters/unsharp_filter.md create mode 100644 zh/example/omv/Image-Filters/vflip_hmirror_transpose.md create mode 100644 zh/example/omv/Snapshot/emboss_snapshot.md create mode 100644 zh/example/omv/Snapshot/snapshot.md create mode 100644 zh/example/omv/find_qrcodes.md create mode 100755 zh/example/omv/omv.rst create mode 100755 zh/example/peripheral.rst create mode 100755 zh/example/socket_network/http_client.md create mode 100755 zh/example/socket_network/http_server.md create mode 100755 zh/example/socket_network/network_lan.md create mode 100755 zh/example/socket_network/tcp_client.md create mode 100755 zh/example/socket_network/tcp_server.md create mode 100755 zh/example/socket_network/udp_server.md create mode 100755 zh/example/socket_network/upd_client.md delete mode 100755 zh/userguide/images/ide-3.png create mode 100755 zh/userguide/images/ide-update.png delete mode 100755 zh/userguide/images/ide_image.png diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8542529..e0f604a 100755 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -156,7 +156,7 @@ build-web-docs: script: - git fetch - git checkout dev - - git pull + - git reset --hard origin/dev - python3 preprocess.py - git config --global user.email "auto@canaan-creative.com" - git config --global user.name "GitLab CI" diff --git "a/zh/CanMV-K230\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md" "b/zh/CanMV-K230\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md" index 8177a28..385f5ef 100755 --- "a/zh/CanMV-K230\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md" +++ "b/zh/CanMV-K230\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md" @@ -86,9 +86,9 @@ Linux串口显示如下: ### 4.1 固件获取 -CanMV-K230 固件下载地址: +CanMV-K230 固件下载地址: 或者 -请下载“sysimage-sdcard.img.gz”结尾的gz压缩包,解压得到sysimage-sdcard.img文件,即为CanMV-K230的固件。 +请下载“CanMV-K230_micropython”开头的gz压缩包,解压得到sysimage-sdcard.img文件,即为CanMV-K230的固件。 ### 4.2 固件烧录 @@ -131,9 +131,7 @@ Windows下可通过balena Etcher工具对TF卡进行烧录(balena Etcher工具 ## 5 CanMV-IDE下载 -下载地址 : - -用户也可以选择使用 OpenMV IDE : +下载地址 : ## 6 启动系统 @@ -145,11 +143,8 @@ Windows下可通过balena Etcher工具对TF卡进行烧录(balena Etcher工具 打开CanMV-IDE,连接开发板如下图所示 ![Canmv-link-board](images/Canmv-link-board.png) -点击左下角红框按钮,选择串口,点击OK进行连接。 - -等待下图框消失 +点击左下角红框按钮。 -![canmv_waiting](images/canmv_waiting.png) ![canmv_connect_pass](images/canmv_connect_pass.png) 左下角图标变为绿色三角,即为连接成功。 diff --git "a/zh/CanMV-K230\347\211\210\346\234\254\350\257\264\346\230\216.md" "b/zh/CanMV-K230\347\211\210\346\234\254\350\257\264\346\230\216.md" index 0f03907..dbbce79 100755 --- "a/zh/CanMV-K230\347\211\210\346\234\254\350\257\264\346\230\216.md" +++ "b/zh/CanMV-K230\347\211\210\346\234\254\350\257\264\346\230\216.md" @@ -29,7 +29,7 @@ ### 概述 -本文档主要介绍了K230 CanMV V0.2.0 版本发布相关的内容,包括当前版本支持的硬件、功能、使用限制等。 +本文档主要介绍了K230 CanMV 版本发布相关的内容,包括当前版本支持的硬件、功能、使用限制等。 ### 读者对象 @@ -48,12 +48,14 @@ | 文档版本号 | 修改说明 | 修改者 | 日期 | | --- | --- | --- | --- | | V0.2.0 | 初版 | SDK 部 | 2023-11-23 | +| V0.3.0 | 增强micropython稳定性,新增7个AIdemo,支持IDE图像实时回传 | SDK 部 | 2023-12-28 | ## 1. 版本信息 | 所属产品 | 版本号 | 发布日期 | |----------|--------|----------| | K230 CanMV | V0.2.0 | 2023-11-23 | +| K230 CanMV | V0.3.0 | 2023-12-28 | ## 2. 支持的硬件 @@ -82,30 +84,41 @@ K230平台支持CanMV-K230等主板 | 11 | V0.2.0 | spi | 支持SPI通信 | | | 12 | V0.2.0 | timer | 支持定时器 | | | 13 | V0.2.0 | wdt | 支持看门狗 | | +| 14 | V0.3.0 | omv | 支持openmv相关的算法 | | +| 15 | V0.3.0 | 网络 | 支持有线网络 | | +| 16 | V0.3.0 | 稳定性 | 提升micropython的稳定性 | | +| 17 | V0.3.0 | IDE显示 | IDE可以实时显示图像 | | ### 4.2 AI Demo | ID | 支持版本 | 功能概要 | 功能描述 | 备注 | | --- | --- | --- | --- | --- | -| 1 | V0.2.0 | 人脸检测 | | | -| 2 | V0.2.0 | COCO目标检测 | | | -| 3 | V0.2.0 | yolov8 | | |-seg -| 4 | V0.2.0 | 车牌检测 | | | -| 5 | V0.2.0 | OCR识别 | | | -| 6 | V0.2.0 | 手掌检测 | | | -| 7 | V0.2.0 | 人体检测 | | | -| 8 | V0.2.0 | 人体姿态估计 | | | -| 9 | V0.2.0 | KWS | | | -| 10 | V0.2.0 | 人脸关键点检测 | | | -| 11 | V0.2.0 | 人脸解析 | | | -| 12 | V0.2.0 | 人脸识别 | | | -| 13 | V0.2.0 | OCR检测 | | | -| 14 | V0.2.0 | 车牌识别 | | | -| 15 | V0.2.0 | 人脸姿态角 | | | -| 16 | V0.2.0 | 石头剪刀布 | | | -| 17 | V0.2.0 | 手掌关键点检测 | | | -| 18 | V0.2.0 | 静态手势识别 | | | -| 19 | V0.2.0 | 人脸mesh | | | +| 1 | V0.2.0 | 人脸检测 | 定位人脸 | | +| 2 | V0.2.0 | COCO目标检测 | 定位物体 | | +| 3 | V0.2.0 | yolov8-seg | 分割物体 | | +| 4 | V0.2.0 | 车牌检测 | 定位车牌 | | +| 5 | V0.2.0 | OCR识别 | 识别文字 | | +| 6 | V0.2.0 | 手掌检测 | 定位手掌 | | +| 7 | V0.2.0 | 人体检测 | 定位人体 | | +| 8 | V0.2.0 | 人体姿态估计 | 定位人体关键点 | | +| 9 | V0.2.0 | KWS | 关键词唤醒 | | +| 10 | V0.2.0 | 人脸关键点检测 | 定位人脸106关键点 | | +| 11 | V0.2.0 | 人脸解析 | 人脸不同部位分割 | | +| 12 | V0.2.0 | 人脸识别 | 识别不同人脸 | | +| 13 | V0.2.0 | OCR检测 | 定位文字 | | +| 14 | V0.2.0 | 车牌识别 | 识别车牌内容 | | +| 15 | V0.2.0 | 人脸姿态角 | 推理出人脸旋转角度 | | +| 16 | V0.2.0 | 石头剪刀布 | 剪刀石头布手势游戏 | | +| 17 | V0.2.0 | 手掌关键点检测 | 定位手掌关键点 | | +| 18 | V0.2.0 | 静态手势识别 | 识别手势 | | +| 19 | V0.2.0 | 人脸mesh | 定位3d人脸关键点 | | +| 20 | V0.3.0 | 跌倒检测 | 判断是否摔倒 | | +| 21 | V0.3.0 | 注视估计 | 推理眼镜注视角度 | | +| 22 | V0.3.0 | 动态手势识别 | 识别动态手势 | | +| 23 | V0.3.0 | 单目标跟踪 | 跟踪指定目标 | | +| 24 | V0.3.0 | 隔空放大 | 隔空放大和缩小对应区域图像 | | +| 25 | V0.3.0 | 拼图游戏 | 复现数字华容道拼图游戏 | | +| 26 | V0.3.0 | 基于关键点的手势识别 | 基于关键点的手势识别 | | ## 5. 版本的遗留问题及限制说明 diff --git a/zh/api/api.rst b/zh/api/api.rst index 5ba1ee7..03fcb98 100755 --- a/zh/api/api.rst +++ b/zh/api/api.rst @@ -6,6 +6,8 @@ CanMV API 手册 cipher/K230_CanMV_Hashlib模块API手册.md cipher/K230_CanMV_Ucryptolib模块API手册.md extmod/K230_CanMV_uctypes模块API手册.md + extmod/K230_CanMV_network模块API手册.md + extmod/K230_CanMV_socket模块API手册.md machine/K230_CanMV_ADC模块API手册.md machine/K230_CanMV_FFT模块API手册.md machine/K230_CanMV_GPIO模块API手册.md @@ -15,6 +17,8 @@ CanMV API 手册 machine/K230_CanMV_SPI模块API手册.md machine/K230_CanMV_Timer模块API手册.md machine/K230_CanMV_WDT模块API手册.md + machine/K230_CanMV_UART模块API手册.md + machine/K230_CanMV_machine模块API手册.md mpp/K230_CanMV_Audio模块API手册.md mpp/K230_CanMV_Camera模块API手册.md mpp/K230_CanMV_Display模块API手册.md @@ -22,4 +26,8 @@ CanMV API 手册 mpp/K230_CanMV_MP4模块API手册.md mpp/K230_CanMV_VDEC模块API手册.md mpp/K230_CanMV_VENC模块API手册.md - mpp/K230_CanMV_播放器模块API手册.md \ No newline at end of file + mpp/K230_CanMV_播放器模块API手册.md + mpp/K230_CanMV_PM模块API手册.md + nncase_runtime/K230_CanMV_nncase_runtime_API手册.md + openmv/image.md + stdlib/utime.md diff --git "a/zh/api/cipher/K230_CanMV_Hashlib\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/cipher/K230_CanMV_Hashlib\346\250\241\345\235\227API\346\211\213\345\206\214.md" index fc4e6d6..27826fc 100755 --- "a/zh/api/cipher/K230_CanMV_Hashlib\346\250\241\345\235\227API\346\211\213\345\206\214.md" +++ "b/zh/api/cipher/K230_CanMV_Hashlib\346\250\241\345\235\227API\346\211\213\345\206\214.md" @@ -1,6 +1,6 @@ # K230 CanMV Hashlib 模块API手册 -![cover](images/canaan-cover.png) +![cover](../images/canaan-cover.png) 版权所有©2023北京嘉楠捷思信息技术有限公司 @@ -14,7 +14,7 @@ ## 商标声明 -![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。 +![logo](../images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。 **版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。** 非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。 diff --git "a/zh/api/cipher/K230_CanMV_Ucryptolib\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/cipher/K230_CanMV_Ucryptolib\346\250\241\345\235\227API\346\211\213\345\206\214.md" index ffb8666..018294c 100755 --- "a/zh/api/cipher/K230_CanMV_Ucryptolib\346\250\241\345\235\227API\346\211\213\345\206\214.md" +++ "b/zh/api/cipher/K230_CanMV_Ucryptolib\346\250\241\345\235\227API\346\211\213\345\206\214.md" @@ -1,6 +1,6 @@ # K230 CanMV Ucryptolib 模块API手册 -![cover](images/canaan-cover.png) +![cover](../images/canaan-cover.png) 版权所有©2023北京嘉楠捷思信息技术有限公司 @@ -14,7 +14,7 @@ ## 商标声明 -![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。 +![logo](../images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。 **版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。** 非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。 diff --git a/zh/api/cipher/images/canaan-cover.png b/zh/api/cipher/images/canaan-cover.png deleted file mode 100755 index 031976562d7003b700195222bee17e7a04d0feb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73229 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 ND63!1zjEiv{{n>M$`$|s diff --git a/zh/api/cipher/images/canaan-lable.png b/zh/api/cipher/images/canaan-lable.png deleted file mode 100755 index 009a662e28def2e6f400708c696f9d8f2aa285d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4202 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 AY5)KL diff --git a/zh/api/cipher/images/logo.png b/zh/api/cipher/images/logo.png deleted file mode 100755 index aa4855818ed3bfab6fbcf027f12df65da35adbdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1601 zcmV-H2EO@;P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1=dMKK~z{r?U;E? z6jvO_zbvq@ML-a|P$)%;R1_5OYSU^|Y!v~KXj8P}Q3R=iE!(O!Rj7hT6$l76C5qZ^ zLQpI!TH}GXAR5$o5fqjxE2y9gi-5u&Y=1L5STGVXJAZBWlaOKFoA>s;@B3XdCRzeU z^hUs4jp&I{NS-hX$rHQ_DXnY7@UR^?QC5Zi3sVuZ`y|(6*zhK#nsQc5dLi7uNI|Xi zG2DmPL({26X6{9Z0+Wzmbent9FyTeWw8Nz^|7(qFcYA? zU5R-cbK$XK4~lNy=SCS8ya@U0F%s~xf)y=$<9sya#k1|Pp%bA!w+X?MJOGs%mE{je z$QrhuG*=ys>5jBs0d;35l=OF>oA+(dyN+Cy`6rT=O-J>E2Dmy6fUU@a>*-0^-8xuU z2ysRF2&b;!LvDO9*Q2ALv=R}?hoN}d0%$bw_H@GaoYe^4Ai>eIH)*9NfTa*WemMmR z5mOPqvjCFgS219yJ>>W50Sj|viGvX}%NOw!mv0@9?o9oUU*;9mw_d`Jzw=F&h+t-C+wDUl=Z!~RaW%$R~pA-&H z3K@xePNBZ}IYcBJ1z~v5;iZyDjF2lcbct;gjhR2k55H|)glUsKus^p1XUG#ghS_7x z2g4!Rz8K=j094 zfU!`O2K&|oA~twDRtEb+OYZ%ssSQhJ`y!F7)`zTB95SArr@W>f&JMOHO~otjSvnFW!aKv`rYhY&X0jv(VA5f+@MUZh}|Dp!?3ZhETA1ZXKrvUItq#_aP6-O97G9%;KGrV26hTi#y zGP{CYm_6=pte)e~s0=a1tFh6)z$a=Crhc6bcV|aHBt+WDYe+A=g3zSHpv*uU*6OUA zVx*Rvi>X;D?ZT#?C1BSN2QQQ(`}7S=TYHegj}>{006r8uUo^EKrJxL9Tl1l$>foi1 z&|FL{{1Uon=jcr*%T*ZX*3*T(-y4LI z>}a^V4up)vmdfOCadCh*ZCo4`fNNK)5l?O%HN%@SzZv5Iuojxb%vwZNqca<8N*1;x z`cR6)+3Q15CwqeELPnjID63eGa4=1xFbTp)zx#>~`7d8H6g{8~3}62)&N#0QFywPGeW(s1BK z$dYmyB6b~vlwJ)fdb4jgs-gs}{rzvO51R;kN)YvmHl!ZEf|)+9nBwKkjWis1{ji%| zcoknUbs4$%c}X0aDJur~k3cfLLNaw<9F-P^3h!UYnc%%3Ar}!;%jI3FgcHT2Ra6HK zwzJYbV4(0WPRC-A^E~6Bu^NH + +## 免责声明 + +您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。 + +由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。 + +## 商标声明 + +![logo](C:\Users\wangjianxin\images\logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。 + +**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。** +非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。 + +
+ +## 目录 + +[TOC] + +## 前言 + +### 概述 + +本文档主要介绍network模块API。 + +### 读者对象 + +本文档(本指南)主要适用于以下人员: + +- 技术支持工程师 +- 软件开发工程师 + +### 缩略词定义 + +| 简称 | 说明 | +| ---- | ---- | + +### 修订记录 + +| 文档版本号 | 修改说明 | 修改者 | 日期 | +| ---------- | -------- | ------ | ---------- | +| V1.0 | 初版 | 软件部 | 2023-11-09 | + +## 1. 概述 + +本模块主要用于配置查看网络参数 + +## 2. lan api + +详见:`https://docs.micropython.org/en/latest/library/network.LAN.html` + +This class allows you to control the Ethernet interface. The PHY hardware type is board-specific. + +Example usage: + +```python +import network +nic = network.LAN(0) +print(nic.ifconfig()) + +# now use socket as usual +... +``` + +### 2.1结构体 + +- *class*network.LAN(*id*, ***, *phy_type=*, *phy_addr=*, *ref_clk_mode=*)[¶](https://docs.micropython.org/en/latest/library/network.LAN.html#network.LAN) + + Create a LAN driver object, initialise the LAN module using the given PHY driver name, and return the LAN object.Arguments are:*id* is the number of the Ethernet port, either 0 or 1.*phy_type* is the name of the PHY driver. For most board the on-board PHY has to be used and is the default. Suitable values are port specific.*phy_addr* specifies the address of the PHY interface. As with *phy_type*, the hardwired value has to be used for most boards and that value is the default.*ref_clk_mode* specifies, whether the data clock is provided by the Ethernet controller or the PYH interface. The default value is the one that matches the board. If set to `LAN.OUT` or `Pin.OUT` or `True`, the clock is driven by the Ethernet controller, if set to `LAN.IN` or `Pin.IN` or `False`, the clock is driven by the PHY interface.For example, with the Seeed Arch Mix board you can use:`nic = LAN(0, phy_type=LAN.PHY_LAN8720, phy_addr=1, ref_clk_mode=Pin.IN)` + +### 2.2函数 + +- LAN.active(**[***state***]**)[¶](https://docs.micropython.org/en/latest/library/network.LAN.html#network.LAN.active) + + With a parameter, it sets the interface active if *state* is true, otherwise it sets it inactive. Without a parameter, it returns the state. + +- LAN.isconnected()[¶](https://docs.micropython.org/en/latest/library/network.LAN.html#network.LAN.isconnected) + + Returns `True` if the physical Ethernet link is connected and up. Returns `False` otherwise. + +- LAN.ifconfig(**[***(ip*, *subnet*, *gateway*, *dns)***]**)[¶](https://docs.micropython.org/en/latest/library/network.LAN.html#network.LAN.ifconfig) + + Get/set IP address, subnet mask, gateway and DNS.When called with no arguments, this method returns a 4-tuple with the above information.To set the above values, pass a 4-tuple with the required information. For example:`nic.ifconfig(('192.168.0.4', '255.255.255.0', '192.168.0.1', '8.8.8.8'))` + +- LAN.config(*config_parameters*)[¶](https://docs.micropython.org/en/latest/library/network.LAN.html#network.LAN.config) + + Sets or gets parameters of the LAN interface. The only parameter that can be retrieved is the MAC address, using:`mac = LAN.config("mac")`The parameters that can be set are:`trace=n` sets trace levels; suitable values are:2: trace TX4: trace RX8: full trace`low_power=bool` sets or clears low power mode, valid values being `False` or `True`. diff --git "a/zh/api/extmod/K230_CanMV_socket\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/extmod/K230_CanMV_socket\346\250\241\345\235\227API\346\211\213\345\206\214.md" new file mode 100755 index 0000000..e177b00 --- /dev/null +++ "b/zh/api/extmod/K230_CanMV_socket\346\250\241\345\235\227API\346\211\213\345\206\214.md" @@ -0,0 +1,187 @@ +# K230 CanMV socket 模块API手册 + +![cover](../images/canaan-cover.png) + +版权所有©2023北京嘉楠捷思信息技术有限公司 + +
+ +## 免责声明 + +您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。 + +由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。 + +## 商标声明 + +![logo](../images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。 + +**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。** +非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。 + +
+ +## 目录 + +[TOC] + +## 前言 + +### 概述 + +本文档主要介绍soccket模块API。 + +### 读者对象 + +本文档(本指南)主要适用于以下人员: + +- 技术支持工程师 +- 软件开发工程师 + +### 缩略词定义 + +| 简称 | 说明 | +| ---- | ---- | + +### 修订记录 + +| 文档版本号 | 修改说明 | 修改者 | 日期 | +| ---------- | -------- | ------ | ---------- | +| V1.0 | 初版 | 软件部 | 2023-11-09 | + +## 1. 概述 + +封装socket库,需要通过核间通信调用小核的socket接口。 + +## 2.示例 + +```python +#配置 tcp/udp socket调试工具 +import socket +import time + +PORT=60000 + +def client(): + #获取地址及端口号 对应地址 + ai = socket.getaddrinfo("10.100.228.5", PORT) + #ai = socket.getaddrinfo("10.10.1.94", PORT) + print("Address infos:", ai) + addr = ai[0][-1] + + print("Connect address:", addr) + #建立socket + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) + #连接地址 + s.connect(addr) + + for i in range(10): + str="K230 tcp client send test {0} \r\n".format(i) + print(str) + #print(s.send(str)) + #发送字符串 + print(s.write(str)) + time.sleep(0.2) + #time.sleep(1) + #print(s.recv(4096)) + #print(s.read()) + #延时1秒 + time.sleep(1) + #关闭socket + s.close() + print("end") + + + +#main() +client() +``` + +## 3. api定义 + +详见`https://docs.micropython.org/en/latest/library/socket.html` + +### 3.1定义 + +- *class*socket.socket(*af=AF_INET*, *type=SOCK_STREAM*, *proto=IPPROTO_TCP*, */*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket) + + Create a new socket using the given address family, socket type and protocol number. Note that specifying *proto* in most cases is not required (and not recommended, as some MicroPython ports may omit `IPPROTO_*` constants). Instead, *type* argument will select needed protocol automatically:`# Create STREAM TCP socket socket(AF_INET, SOCK_STREAM) # Create DGRAM UDP socket socket(AF_INET, SOCK_DGRAM)` + +### 3.3函数 + +- socket.close()[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.close) + + Mark the socket closed and release all resources. Once that happens, all future operations on the socket object will fail. The remote end will receive EOF indication if supported by protocol.Sockets are automatically closed when they are garbage-collected, but it is recommended to [`close()`](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.close) them explicitly as soon you finished working with them. + +- socket.bind(*address*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.bind) + + Bind the socket to *address*. The socket must not already be bound. + +- socket.listen(**[***backlog***]**)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.listen) + + Enable a server to accept connections. If *backlog* is specified, it must be at least 0 (if it’s lower, it will be set to 0); and specifies the number of unaccepted connections that the system will allow before refusing new connections. If not specified, a default reasonable value is chosen. + +- socket.accept()[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.accept) + + Accept a connection. The socket must be bound to an address and listening for connections. The return value is a pair (conn, address) where conn is a new socket object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection. + +- socket.connect(*address*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.connect) + + Connect to a remote socket at *address*. + +- socket.send(*bytes*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.send) + + Send data to the socket. The socket must be connected to a remote socket. Returns number of bytes sent, which may be smaller than the length of data (“short write”). + +- socket.sendall(*bytes*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.sendall) + + Send all data to the socket. The socket must be connected to a remote socket. Unlike [`send()`](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.send), this method will try to send all of data, by sending data chunk by chunk consecutively.The behaviour of this method on non-blocking sockets is undefined. Due to this, on MicroPython, it’s recommended to use [`write()`](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.write) method instead, which has the same “no short writes” policy for blocking sockets, and will return number of bytes sent on non-blocking sockets. + +- socket.recv(*bufsize*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.recv) + + Receive data from the socket. The return value is a bytes object representing the data received. The maximum amount of data to be received at once is specified by bufsize. + +- socket.sendto(*bytes*, *address*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.sendto) + + Send data to the socket. The socket should not be connected to a remote socket, since the destination socket is specified by *address*. + +- socket.recvfrom(*bufsize*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.recvfrom) + + Receive data from the socket. The return value is a pair *(bytes, address)* where *bytes* is a bytes object representing the data received and *address* is the address of the socket sending the data. + +- socket.setsockopt(*level*, *optname*, *value*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.setsockopt) + + Set the value of the given socket option. The needed symbolic constants are defined in the socket module (SO_* etc.). The *value* can be an integer or a bytes-like object representing a buffer. + +- socket.settimeout(*value*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.settimeout) + + **Note**: Not every port supports this method, see below.Set a timeout on blocking socket operations. The value argument can be a nonnegative floating point number expressing seconds, or None. If a non-zero value is given, subsequent socket operations will raise an [`OSError`](https://docs.micropython.org/en/latest/library/builtins.html#OSError) exception if the timeout period value has elapsed before the operation has completed. If zero is given, the socket is put in non-blocking mode. If None is given, the socket is put in blocking mode.Not every [MicroPython port](https://docs.micropython.org/en/latest/reference/glossary.html#term-MicroPython-port) supports this method. A more portable and generic solution is to use [`select.poll`](https://docs.micropython.org/en/latest/library/select.html#select.poll) object. This allows to wait on multiple objects at the same time (and not just on sockets, but on generic [`stream`](https://docs.micropython.org/en/latest/reference/glossary.html#term-stream) objects which support polling). Example:`# Instead of: s.settimeout(1.0) # time in seconds s.read(10) # may timeout # Use: poller = select.poll() poller.register(s, select.POLLIN) res = poller.poll(1000) # time in milliseconds if not res: # s is still not ready for input, i.e. operation timed out`Difference to CPythonCPython raises a `socket.timeout` exception in case of timeout, which is an [`OSError`](https://docs.micropython.org/en/latest/library/builtins.html#OSError) subclass. MicroPython raises an OSError directly instead. If you use `except OSError:` to catch the exception, your code will work both in MicroPython and CPython. + +- socket.setblocking(*flag*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.setblocking) + + Set blocking or non-blocking mode of the socket: if flag is false, the socket is set to non-blocking, else to blocking mode.This method is a shorthand for certain [`settimeout()`](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.settimeout) calls:`sock.setblocking(True)` is equivalent to `sock.settimeout(None)``sock.setblocking(False)` is equivalent to `sock.settimeout(0)` + +- socket.makefile(*mode='rb'*, *buffering=0*, */*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.makefile) + + Return a file object associated with the socket. The exact returned type depends on the arguments given to makefile(). The support is limited to binary modes only (‘rb’, ‘wb’, and ‘rwb’). CPython’s arguments: *encoding*, *errors* and *newline* are not supported.Difference to CPythonAs MicroPython doesn’t support buffered streams, values of *buffering* parameter is ignored and treated as if it was 0 (unbuffered).Difference to CPythonClosing the file object returned by makefile() WILL close the original socket as well. + +- socket.read(**[***size***]**)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.read) + + Read up to size bytes from the socket. Return a bytes object. If *size* is not given, it reads all data available from the socket until EOF; as such the method will not return until the socket is closed. This function tries to read as much data as requested (no “short reads”). This may be not possible with non-blocking socket though, and then less data will be returned. + +- socket.readinto(*buf***[**, *nbytes***]**)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.readinto) + + Read bytes into the *buf*. If *nbytes* is specified then read at most that many bytes. Otherwise, read at most *len(buf)* bytes. Just as [`read()`](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.read), this method follows “no short reads” policy.Return value: number of bytes read and stored into *buf*. + +- socket.readline()[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.readline) + + Read a line, ending in a newline character.Return value: the line read. + +- socket.write(*buf*)[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.write) + + Write the buffer of bytes to the socket. This function will try to write all data to a socket (no “short writes”). This may be not possible with a non-blocking socket though, and returned value will be less than the length of *buf*.Return value: number of bytes written. + +- *exception*socket.error[¶](https://docs.micropython.org/en/latest/library/socket.html#socket.socket.error) + + MicroPython does NOT have this exception.Difference to CPythonCPython used to have a `socket.error` exception which is now deprecated, and is an alias of [`OSError`](https://docs.micropython.org/en/latest/library/builtins.html#OSError). In MicroPython, use [`OSError`](https://docs.micropython.org/en/latest/library/builtins.html#OSError) directly. + \ No newline at end of file diff --git a/zh/api/mpp/images/k230-canmv-camera-top.png b/zh/api/images/k230-canmv-camera-top.png similarity index 100% rename from zh/api/mpp/images/k230-canmv-camera-top.png rename to zh/api/images/k230-canmv-camera-top.png diff --git "a/zh/api/machine/K230_CanMV_UART\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_UART\346\250\241\345\235\227API\346\211\213\345\206\214.md" new file mode 100755 index 0000000..966f00e --- /dev/null +++ "b/zh/api/machine/K230_CanMV_UART\346\250\241\345\235\227API\346\211\213\345\206\214.md" @@ -0,0 +1,171 @@ +# K230 CanMV UART 模块API手册 + +![cover](../images/canaan-cover.png) + +版权所有©2023北京嘉楠捷思信息技术有限公司 + +
+ +## 免责声明 + +您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。 + +由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。 + +## 商标声明 + +![logo](../images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。 + +**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。** +非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。 + +
+ +## 目录 + +[TOC] + +## 前言 + +### 概述 + +本文档主要介绍machine模块下的UART类API。 + +### 读者对象 + +本文档(本指南)主要适用于以下人员: + +- 技术支持工程师 +- 软件开发工程师 + +### 缩略词定义 + +| 简称 | 说明 | +| ---- | ---- | + +### 修订记录 + +| 文档版本号 | 修改说明 | 修改者 | 日期 | +| ---------- | -------- | ---------- | ---------- | +| V1.0 | 初版 | 软件部 | 2023-09-17 | + +## 1. 概述 + +K230内部包含五个UART硬件模块,其中UART0被小核sh占用,UART3被大核sh占用,剩余UART1,UART2,UART4可供用户使用。 +UART IO配置参考IOMUX模块。 + +## 2. API描述 + +UART类位于machine模块下 + +### 示例 + +```python +from machine import UART +# UART1: baudrate 115200, 8bits, parity none, one stopbits +u1 = UART(UART.UART1, baudrate=115200, bits=UART.EIGHTBITS, parity=UART.PARITY_NONE, stop=UART.STOPBITS_ONE) +# UART write +u1.write("UART1 test") +# UART read +r = u1.read() +# UART readline +r = u1.readline() +# UART readinto +b = bytearray(8) +r = u1.readinto(b) +``` + +### 构造函数 + +```python +uart = UART(id, baudrate=115200, bits=UART.EIGHTBITS, parity=UART.PARITY_NONE, stop=UART.STOPBITS_ONE) +``` + +【参数】 + +- id: UART号,有效值 UART1、UART2、UART4 +- baudrate: UART波特率,可选参数,默认115200 +- bits: 每个字符的位数,有效值 FIVEBITS、SIXBITS、SEVENBITS、EIGHTBITS,可选参数,默认EIGHTBITS +- parity: 奇偶校验,有效值 PARITY_NONE、PARITY_ODD、PARITY_EVEN,可选参数,默认PARITY_NONE +- stop: 停止位的数目,有效值 STOPBITS_ONE、STOPBITS_TWO,可选参数,默认STOPBITS_ONE + +### init + +```python +UART.init(baudrate=115200, bits=UART.EIGHTBITS, parity=UART.PARITY_NONE, stop=UART.STOPBITS_ONE) +``` + +配置UART + +【参数】 + +参考构造函数 + +【返回值】 + +无 + +### read + +```python +UART.read([nbytes]) +``` + +读取字符。若指定nbytes,则最多读取该数量的字节。否则可读取尽可能多的数据。 + +【参数】 + +- nbytes: 最多读取nbytes字节,可选参数 + +【返回值】 + +一个包括读入字节的字节对象 + +### readline + +```python +UART.readline() +``` + +读取一行,并以一个换行符结束。 + +【参数】 + +无 + +【返回值】 + +一个包括读入字节的字节对象 + +### readinto + +```python +UART.readinto(buf[, nbytes]) +``` + +将字节读取入buf。若指定nbytes,则最多读取该数量的字节。否则,最多读取len(buf)数量的字节。 + +【参数】 + +- buf: 一个buffer对象 +- nbytes: 最多读取nbytes字节,可选参数 + +【返回值】 + +读取并存入buf的字节数 + +### write + +```python +UART.write(buf) +``` + +将字节缓冲区写入UART。 + +【参数】 + +- buf: 一个buffer对象 + +【返回值】 + +写入的字节数 diff --git "a/zh/api/machine/K230_CanMV_machine\346\250\241\345\235\227API\346\211\213\345\206\214.md" "b/zh/api/machine/K230_CanMV_machine\346\250\241\345\235\227API\346\211\213\345\206\214.md" new file mode 100644 index 0000000..e39e03b --- /dev/null +++ "b/zh/api/machine/K230_CanMV_machine\346\250\241\345\235\227API\346\211\213\345\206\214.md" @@ -0,0 +1,73 @@ +# K230 CanMV machine 模块API手册 + +![cover](../images/canaan-cover.png) + +版权所有©2023北京嘉楠捷思信息技术有限公司 + +
+ +## 免责声明 + +您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。 + +由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。 + +## 商标声明 + +![logo](../images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。 + +**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。** +非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。 + +
+ +## 目录 + +[TOC] + +## 前言 + +### 概述 + +本文档主要介绍machine模块下的API。 + +### 读者对象 + +本文档(本指南)主要适用于以下人员: + +- 技术支持工程师 +- 软件开发工程师 + +### 缩略词定义 + +| 简称 | 说明 | +| ---- | ---- | +| | | + +### 修订记录 + +| 文档版本号 | 修改说明 | 修改者 | 日期 | +| ---------- | -------- | ---------- | ---------- | +| V1.0 | 初版 | 软件部 | 2023-09-17 | + +## 1. 概述 + +该machine模块包含与特定板上的硬件相关的特定功能。该模块中的大多数功能允许实现对系统上硬件块的直接且不受限制的访问和控制。如果使用不当,可能会导致主板故障、死机、崩溃,在极端情况下还会导致硬件损坏。 + +## 2. API描述 + +### reset + +```python +machine.reset() +``` + +立即复位SOC + +【参数】 + +无 + +【返回值】 + +无 diff --git a/zh/api/machine/images/canaan-cover.png b/zh/api/machine/images/canaan-cover.png deleted file mode 100755 index 031976562d7003b700195222bee17e7a04d0feb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73229 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 ND63!1zjEiv{{n>M$`$|s diff --git a/zh/api/machine/images/canaan-lable.png b/zh/api/machine/images/canaan-lable.png deleted file mode 100755 index 009a662e28def2e6f400708c696f9d8f2aa285d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4202 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 AY5)KL diff --git a/zh/api/machine/images/logo.png b/zh/api/machine/images/logo.png deleted file mode 100755 index aa4855818ed3bfab6fbcf027f12df65da35adbdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1601 zcmV-H2EO@;P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1=dMKK~z{r?U;E? z6jvO_zbvq@ML-a|P$)%;R1_5OYSU^|Y!v~KXj8P}Q3R=iE!(O!Rj7hT6$l76C5qZ^ zLQpI!TH}GXAR5$o5fqjxE2y9gi-5u&Y=1L5STGVXJAZBWlaOKFoA>s;@B3XdCRzeU z^hUs4jp&I{NS-hX$rHQ_DXnY7@UR^?QC5Zi3sVuZ`y|(6*zhK#nsQc5dLi7uNI|Xi zG2DmPL({26X6{9Z0+Wzmbent9FyTeWw8Nz^|7(qFcYA? zU5R-cbK$XK4~lNy=SCS8ya@U0F%s~xf)y=$<9sya#k1|Pp%bA!w+X?MJOGs%mE{je z$QrhuG*=ys>5jBs0d;35l=OF>oA+(dyN+Cy`6rT=O-J>E2Dmy6fUU@a>*-0^-8xuU z2ysRF2&b;!LvDO9*Q2ALv=R}?hoN}d0%$bw_H@GaoYe^4Ai>eIH)*9NfTa*WemMmR z5mOPqvjCFgS219yJ>>W50Sj|viGvX}%NOw!mv0@9?o9oUU*;9mw_d`Jzw=F&h+t-C+wDUl=Z!~RaW%$R~pA-&H z3K@xePNBZ}IYcBJ1z~v5;iZyDjF2lcbct;gjhR2k55H|)glUsKus^p1XUG#ghS_7x z2g4!Rz8K=j094 zfU!`O2K&|oA~twDRtEb+OYZ%ssSQhJ`y!F7)`zTB95SArr@W>f&JMOHO~otjSvnFW!aKv`rYhY&X0jv(VA5f+@MUZh}|Dp!?3ZhETA1ZXKrvUItq#_aP6-O97G9%;KGrV26hTi#y zGP{CYm_6=pte)e~s0=a1tFh6)z$a=Crhc6bcV|aHBt+WDYe+A=g3zSHpv*uU*6OUA zVx*Rvi>X;D?ZT#?C1BSN2QQQ(`}7S=TYHegj}>{006r8uUo^EKrJxL9Tl1l$>foi1 z&|FL{{1Uon=jcr*%T*ZX*3*T(-y4LI z>}a^V4up)vmdfOCadCh*ZCo4`fNNK)5l?O%HN%@SzZv5Iuojxb%vwZNqca<8N*1;x z`cR6)+3Q15CwqeELPnjID63eGa4=1xFbTp)zx#>~`7d8H6g{8~3}62)&N#0QFywPGeW(s1BK z$dYmyB6b~vlwJ)fdb4jgs-gs}{rzvO51R;kN)YvmHl!ZEf|)+9nBwKkjWis1{ji%| zcoknUbs4$%c}X0aDJur~k3cfLLNaw<9F-P^3h!UYnc%%3Ar}!;%jI3FgcHT2Ra6HK zwzJYbV4(0WPRC-A^E~6Bu^NH + +## 免责声明 + +您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。 + +由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。 + +## 商标声明 + +![logo](../images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。 + +**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。** +非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。 + +
+ +## 目录 + +[TOC] + +## 前言 + +### 概述 + +本文档主要介绍mpp模块下的pm类API。 + +### 读者对象 + +本文档(本指南)主要适用于以下人员: + +- 技术支持工程师 +- 软件开发工程师 + +### 缩略词定义 + +| 简称 | 说明 | +| ---- | ---- | +| | | + +### 修订记录 + +| 文档版本号 | 修改说明 | 修改者 | 日期 | +| ---------- | -------- | ---------- | ---------- | +| V1.0 | 初版 | 软件部 | 2023-09-17 | + +## 1. 概述 + +PM模块是功耗管理模块,具体可参考SDK中关于PM框架的描述([K230_PM框架使用指南.md](https://github.com/kendryte/k230_docs/blob/main/zh/01_software/board/mpp/K230_PM%E6%A1%86%E6%9E%B6%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.md))。micropython中封装了cpu和kpu两部分。 + +## 2. API描述 + +pm类位于mpp模块下,模块内部包含了两个实例化对象cpu, kpu + +### 示例 + +```python +from mpp import pm +# get current cpu freq +pm.cpu.get_freq() +# get cpu support freq list +pm.cpu.list_profiles() +# set cpu freq +pm.cpu.set_profile(1) +``` + +### get_freq + +```python +pm.pm_domain.get_freq() +``` + +获取指定域频率 + +【参数】 + +无 + +【返回值】 + +指定域频率 + +### list_profiles + +```python +pm.pm_domain.list_profiles() +``` + +获取指定域支持的频率列表 + +【参数】 + +无 + +【返回值】 + +指定域支持的频率列表 + +### set_profile + +```python +pm.pm_domain.set_profile(index) +``` + +设置指定域的频率序号 + +【参数】 + +- index: 频率序号 + +【返回值】 + +无 diff --git a/zh/api/mpp/images/canaan-cover.png b/zh/api/mpp/images/canaan-cover.png deleted file mode 100755 index 031976562d7003b700195222bee17e7a04d0feb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73229 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 ND63!1zjEiv{{n>M$`$|s diff --git a/zh/api/mpp/images/canaan-lable.png b/zh/api/mpp/images/canaan-lable.png deleted file mode 100755 index 009a662e28def2e6f400708c696f9d8f2aa285d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4202 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 AY5)KL diff --git a/zh/api/mpp/images/logo.png b/zh/api/mpp/images/logo.png deleted file mode 100755 index aa4855818ed3bfab6fbcf027f12df65da35adbdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1601 zcmV-H2EO@;P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1=dMKK~z{r?U;E? z6jvO_zbvq@ML-a|P$)%;R1_5OYSU^|Y!v~KXj8P}Q3R=iE!(O!Rj7hT6$l76C5qZ^ zLQpI!TH}GXAR5$o5fqjxE2y9gi-5u&Y=1L5STGVXJAZBWlaOKFoA>s;@B3XdCRzeU z^hUs4jp&I{NS-hX$rHQ_DXnY7@UR^?QC5Zi3sVuZ`y|(6*zhK#nsQc5dLi7uNI|Xi zG2DmPL({26X6{9Z0+Wzmbent9FyTeWw8Nz^|7(qFcYA? zU5R-cbK$XK4~lNy=SCS8ya@U0F%s~xf)y=$<9sya#k1|Pp%bA!w+X?MJOGs%mE{je z$QrhuG*=ys>5jBs0d;35l=OF>oA+(dyN+Cy`6rT=O-J>E2Dmy6fUU@a>*-0^-8xuU z2ysRF2&b;!LvDO9*Q2ALv=R}?hoN}d0%$bw_H@GaoYe^4Ai>eIH)*9NfTa*WemMmR z5mOPqvjCFgS219yJ>>W50Sj|viGvX}%NOw!mv0@9?o9oUU*;9mw_d`Jzw=F&h+t-C+wDUl=Z!~RaW%$R~pA-&H z3K@xePNBZ}IYcBJ1z~v5;iZyDjF2lcbct;gjhR2k55H|)glUsKus^p1XUG#ghS_7x z2g4!Rz8K=j094 zfU!`O2K&|oA~twDRtEb+OYZ%ssSQhJ`y!F7)`zTB95SArr@W>f&JMOHO~otjSvnFW!aKv`rYhY&X0jv(VA5f+@MUZh}|Dp!?3ZhETA1ZXKrvUItq#_aP6-O97G9%;KGrV26hTi#y zGP{CYm_6=pte)e~s0=a1tFh6)z$a=Crhc6bcV|aHBt+WDYe+A=g3zSHpv*uU*6OUA zVx*Rvi>X;D?ZT#?C1BSN2QQQ(`}7S=TYHegj}>{006r8uUo^EKrJxL9Tl1l$>foi1 z&|FL{{1Uon=jcr*%T*ZX*3*T(-y4LI z>}a^V4up)vmdfOCadCh*ZCo4`fNNK)5l?O%HN%@SzZv5Iuojxb%vwZNqca<8N*1;x z`cR6)+3Q15CwqeELPnjID63eGa4=1xFbTp)zx#>~`7d8H6g{8~3}62)&N#0QFywPGeW(s1BK z$dYmyB6b~vlwJ)fdb4jgs-gs}{rzvO51R;kN)YvmHl!ZEf|)+9nBwKkjWis1{ji%| zcoknUbs4$%c}X0aDJur~k3cfLLNaw<9F-P^3h!UYnc%%3Ar}!;%jI3FgcHT2Ra6HK zwzJYbV4(0WPRC-A^E~6Bu^NH 注意:直接对这些值执行标准数学运算(+, - )或关系运算符(<,<=,>,> =)将导致无效结果。执行数学运算然后将其结果作为参数传递给ticks_diff()或ticks_add()也将导致后者函数的无效结果。 + +### `ticks_us` + +```python +utime.ticks_us() +``` + +就像上面的`ticks_ms()`一样,但是在几微秒内。 + +### `ticks_cpu` + +```python +utime.ticks_cpu() +``` + +类似于`ticks_ms()`和`ticks_us()`,但系统中的分辨率最高。这通常是CPU时钟,这就是函数以这种方式命名的原因。但它不必是CPU时钟,而是可以使用系统中可用的一些其他定时源(例如,高分辨率定时器)。在`utime`模块级别没有指定此函数的确切时间单位(分辨率),但特定硬件的文档可能提供更具体的信息。此功能用于非常精细的基准测试或非常紧凑的实时循环。避免在便携式代码中使用它。 + +### `ticks_add` + +```python +utime.ticks_add(ticks, delta) +``` + +偏移值按给定数字计算,可以是正数也可以是负数。给定一个ticks值,该函数允许在tick值的模块算术定义之后或之后计算ticks值delta ticks(参见上面的`ticks_ms()`)。ticks参数必须是调用`ticks_ms()`,`ticks_us()`或`ticks_cpu()`函数(或从之前调用`ticks_add()`)的直接结果。但是,delta可以是任意整数或数字表达式。ticks_add()对于计算事件/任务的截止日期非常有用。(注意:你必须使用`ticks_diff()`函数来处理截止日期。) + +例子: + +```python +## Find out what ticks value there was 100ms ago +print(ticks_add(time.ticks_ms(), -100)) + +## Calculate deadline for operation and test for it +deadline = ticks_add(time.ticks_ms(), 200) +while ticks_diff(deadline, time.ticks_ms()) > 0: + do_a_little_of_something() + +## Find out TICKS_MAX used by this port +print(ticks_add(0, -1)) +``` + +### `ticks_diff` + +```python +utime.ticks_diff(ticks1, ticks2) +``` + +测量从`ticks_ms()`,`ticks_us()`或`ticks_cpu()`函数返回的值之间的差异,作为可以回绕的有符号值。 + +参数顺序与减法运算符相同,`ticks_diff(ticks1, ticks2)`与`ticks1 - ticks2`具有相同的含义。但是,`ticks_ms()`等函数返回的值可能会回绕,因此直接使用减法会产生不正确的结果。这就是为什么需要`ticks_diff()`,它实现模块化(或更具体地说,环)算术,即使对于环绕值也能产生正确的结果(只要它们之间不太远,见下文)。该函数返回范围为[-TICKS_PERIOD / 2 .. TICKS_PERIOD / 2-1]的**有符号**值(这是二进制补码有符号二进制整数的典型范围定义)。如果结果是否定的,则意味着ticks1在时间上早于ticks2。否则,这意味着ticks1发生在ticks2之后。如果ticks1和ticks2彼此分开不超过TICKS_PERIOD / 2-1滴答,则仅保留**。如果不成立,将返回不正确的结果。具体来说,如果两个刻度值相隔TICKS_PERIOD / 2-1刻度,则该值将由该函数返回。但是,如果实时滴答的TICKS_PERIOD / 2已在它们之间传递,则该函数将返回-TICKS_PERIOD / 2,即结果值将回绕到可能值的负范围。 + +上述限制的非正式理由:假设您被锁在一个房间内,除了标准的12档时钟外无法监控时间的流逝。然后,如果你现在看表盘,不再看13个小时(例如,如果你长时间睡觉),那么一旦你再看一遍,你可能觉得只有1个小时过去了。为了避免这个错误,请定期查看时钟。您的应用程序也应该这样做。“太长时间睡眠”这个比喻也直接映射到应用程序行为:不要让你的应用程序运行任何单个任务太长时间。分步运行任务,并在两者之间进行计时。 + +`ticks_diff()`旨在适应各种使用模式,其中包括: + +* 超时轮询。在这种情况下,事件的顺序是已知的,你只会处理`ticks_diff()`的正面结果: + +```python +## Wait for GPIO pin to be asserted, but at most 500us +start = time.ticks_us() +while pin.value() == 0: + if time.ticks_diff(time.ticks_us(), start) > 500: + raise TimeoutError +``` + +* 调度事件。在这种情况下,如果事件过期,则ticks_diff()结果可能为负: + +```python +## This code snippet is not optimized +now = time.ticks_ms() +scheduled_time = task.scheduled_time() +if ticks_diff(scheduled_time, now) > 0: + print("Too early, let's nap") + sleep_ms(ticks_diff(scheduled_time, now)) + task.run() +elif ticks_diff(scheduled_time, now) == 0: + print("Right at time!") + task.run() +elif ticks_diff(scheduled_time, now) < 0: + print("Oops, running late, tell task to run faster!") + task.run(run_faster=true) +``` + +> 注意:不要将`time()`值传递给`ticks_diff()`,你应该对它们使用常规的数学运算。但请注意,`time()`可能(也会)溢出。 + +### `time` + +```python +utime.time() +``` + +返回自纪元以来的整数秒数,假设如上所述设置和维护基础RTC。如果未设置 RTC,则此函数返回自特定硬件移植参考时间点以来的秒数(对于没有电池供电的 RTC 的嵌入式电路板,通常自上电或复位后)。如果要开发便携式 MicroPython 应用程序,则不应依赖此函数来提供高于第二的精度。如果你需要更高的精度,使用`ticks_ms()`和`ticks_us()`函数,如果你需要日历时间,`localtime()`没有参数是一个更好的选择。 + +#### 与CPython的区别 + +在 CPython 中,此函数返回自 Unix 纪元(1970-01-01 00:00 UTC)以来的秒数,作为浮点数,通常具有微秒精度。使用 MicroPython,只有 Unix 移植版本使用相同的纪元,如果浮点精度允许,则返回亚秒精度。嵌入式硬件通常没有浮点精度来表示长时间范围和亚秒精度,因此它们使用具有第二精度的整数值。某些嵌入式硬件也缺少电池供电的 RTC,因此返回自上次上电或其他相对硬件特定点(例如复位)以来的秒数。 + +### `ticks` + +```python +time.ticks() +``` + +等同于 `time.ticks_ms` + +### `clock` + +```python +time.clock() +``` + +获取 `clock` 对象 + +#### 返回值 + +`clock` 对象 + +## 类 `clock` + +### 构造函数 + +```python +time.clock() +``` + +### `clock`函数 + +#### `tick` + +```python +clock.tick() +``` + +记录开始时间(ms),与`clock.fps()`搭配使用可以计算`fps` + +#### `fps` + +```python +clock.fps() +``` + +根据上一个调用`clock.tick()`到现在的时间计算出帧率(`fps`) + +比如: + +```python +import time +clock = time.clock() +while True: + clock.tick() + time.sleep(0.1) + print("fps = ",clock.fps()) +``` + +#### `reset` + +```python +clock.reset() +``` + +重置所有标记 + +#### `avg` + +```python +clock.avg() +``` + +根据上一个调用`clock.tick()`到现在的时间计算出每帧消耗的时间 diff --git "a/zh/example/K230_CanMV_AI_Demo\347\244\272\344\276\213\350\257\264\346\230\216.md" "b/zh/example/K230_CanMV_AI_Demo\347\244\272\344\276\213\350\257\264\346\230\216.md" index 98ef584..21c51c7 100755 --- "a/zh/example/K230_CanMV_AI_Demo\347\244\272\344\276\213\350\257\264\346\230\216.md" +++ "b/zh/example/K230_CanMV_AI_Demo\347\244\272\344\276\213\350\257\264\346\230\216.md" @@ -40,9 +40,9 @@ ## 一、概述 -本文档包括19个AI Demo,这些示例程序都实现从摄像头采集数据、kpu推理到显示器展示的流程,应用到了K230 CanMV 平台的多个硬件模块:AI2D,KPU,Camera,Display等。 +本文档包括26个AI Demo,这些示例程序都实现从摄像头采集数据、kpu推理到显示器展示的流程,应用到了K230 CanMV 平台的多个硬件模块:AI2D,KPU,Camera,Display等。 -这些AI Demo分为两种类型:单模型、多模型,涵盖物体、人脸、人手、人体、车牌、OCR等方向;参考该文档,k230用户可以更快上手K230 AI应用的开发,实现预期效果。 +这些AI Demo分为两种类型:单模型、多模型,涵盖物体、人脸、人手、人体、车牌、OCR,KWS等方向;参考该文档,k230用户可以更快上手K230 AI应用的开发,实现预期效果。 更多AI Demo后续即将解锁。 @@ -57,7 +57,13 @@ | 人体检测 | OCR识别 | | 人体姿态估计 | 手掌关键点检测 | | KWS | 静态手势识别 | -| | 人脸mesh | +| 跌倒检测 | 人脸mesh | +| | 注视估计 | +| | 动态手势识别 | +| | 单目标跟踪 | +| | 隔空放大 | +| | 拼图游戏 | +| | 基于关键点的手势识别 | ## 二、AI Demo单模型示例解析 @@ -80,9 +86,9 @@ import gc #垃圾回收模块 | 模块 | 说明 | | ---------------------- | ------------------------------------------------------------ | | image(必选) | 图像模块,主要用于读取、图像绘制元素(框、点等)等操作 | -| media.camera(必选) | [摄像头模块](https://github.com/kendryte/k230_canmv_docs/blob/main/zh/01_software/mpp/K230_CanMV_Camera%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.md) | -| media.display (必选) | [显示模块](https://github.com/kendryte/k230_canmv_docs/blob/main/zh/01_software/mpp/K230_CanMV_Display%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.md) | -| media.media(必选) | [媒体软件抽象模块,主要封装媒体数据链路以及媒体缓冲区](https://github.com/kendryte/k230_canmv_docs/blob/main/zh/01_software/mpp/K230_CanMV_Media%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.md) | +| media.camera(必选) | [摄像头模块](../api/mpp/K230_CanMV_Camera%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.md) | +| media.display (必选) | [显示模块](../api/mpp/K230_CanMV_Display%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.md) | +| media.media(必选) | [媒体软件抽象模块,主要封装媒体数据链路以及媒体缓冲区](../api/mpp/K230_CanMV_Media%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.md) | | nncase_runtime(必选) | nncase运行时模块, 封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 | | aidemo(可选) | 封装部分ai demo相关后处理、复杂画图操作 | | aicube(可选) | 封装基于ai cube训练的检测分割等任务的后处理 | @@ -128,18 +134,18 @@ ScopedTiming 类是一个用来测量代码块执行时间的上下文管理器 #********************for scoped_timing.py******************** class ScopedTiming: def __init__(self, info="", enable_profile=True): - self.info = info - self.enable_profile = enable_profile + self.info = info + self.enable_profile = enable_profile def __enter__(self): - if self.enable_profile: - self.start_time = time.time_ns() - return self + if self.enable_profile: + self.start_time = time.time_ns() + return self def __exit__(self, exc_type, exc_value, traceback): - if self.enable_profile: - elapsed_time = time.time_ns() - self.start_time - print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") + if self.enable_profile: + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") ``` **使用示例:** @@ -163,22 +169,22 @@ import nncase_runtime as nn # 注:此示例仅为基础用法,其它demo可根据实际情况调整 def get_pad_one_side_param(): # 右padding或下padding,获取padding参数 - dst_w = kmodel_input_shape[3] # kmodel输入宽(w) + dst_w = kmodel_input_shape[3] # kmodel输入宽(w) dst_h = kmodel_input_shape[2] # kmodel输入高(h) - + # OUT_RGB888P_WIDTH:原图宽(w) # OUT_RGB888P_HEIGH:原图高(h) # 计算最小的缩放比例,等比例缩放 ratio_w = dst_w / OUT_RGB888P_WIDTH ratio_h = dst_h / OUT_RGB888P_HEIGH if ratio_w < ratio_h: - ratio = ratio_w + ratio = ratio_w else: - ratio = ratio_h + ratio = ratio_h # 计算经过缩放后的新宽和新高 new_w = (int)(ratio * OUT_RGB888P_WIDTH) new_h = (int)(ratio * OUT_RGB888P_HEIGH) - + # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 dw = (dst_w - new_w) / 2 dh = (dst_h - new_h) / 2 @@ -226,10 +232,10 @@ def ai2d_demo(rgb888p_img): #file.write(ai2d_out_data.tobytes()) # (7)删除 ai2d、ai2d_input_tensor、ai2d_output_tensor、ai2d_builder 变量,释放对它所引用对象的内存引用 - del ai2d - del ai2d_input_tensor - del ai2d_output_tensor - del ai2d_builder + del ai2d + del ai2d_input_tensor + del ai2d_output_tensor + del ai2d_builder ``` ##### (2)ai2d示例用法一:ai2d参数固定 @@ -254,44 +260,44 @@ def get_pad_one_side_param(): def ai2d_init(): # 初始化AI2D模块 with ScopedTiming("ai2d_init",debug_mode > 0): - global ai2d - # (1)创建ai2d实例 - ai2d = nn.ai2d() - # (2)设置ai2d参数 - # 设置ai2d输入、输出格式和数据类型 - ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, - nn.ai2d_format.NCHW_FMT, - np.uint8, np.uint8) - # 设置padding参数 - ai2d.set_pad_param(True, get_pad_one_side_param(), 0, rgb_mean) - # 设置resize参数 - ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) - - # (3)创建ai2d输出,用于保存ai2d输出结果 - global ai2d_output_tensor - data = np.ones(kmodel_input_shape, dtype=np.uint8) - ai2d_output_tensor = nn.from_numpy(data) - - # (4)根据ai2d参数构建ai2d_builder,因为ai2d的参数不变,因此只需创建一次ai2d_builder - global ai2d_builder - ai2d_builder = ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], kmodel_input_shape) + global ai2d + # (1)创建ai2d实例 + ai2d = nn.ai2d() + # (2)设置ai2d参数 + # 设置ai2d输入、输出格式和数据类型 + ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + # 设置padding参数 + ai2d.set_pad_param(True, get_pad_one_side_param(), 0, rgb_mean) + # 设置resize参数 + ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + + # (3)创建ai2d输出,用于保存ai2d输出结果 + global ai2d_output_tensor + data = np.ones(kmodel_input_shape, dtype=np.uint8) + ai2d_output_tensor = nn.from_numpy(data) + + # (4)根据ai2d参数构建ai2d_builder,因为ai2d的参数不变,因此只需创建一次ai2d_builder + global ai2d_builder + ai2d_builder = ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], kmodel_input_shape) def ai2d_run(rgb888p_img): with ScopedTiming("ai2d_run",debug_mode > 0): - global ai2d_input_tensor,ai2d_output_tensor - # (1)创建ai2d输入对象,并将对象从numpy转换为tensor - ai2d_input = rgb888p_img.to_numpy_ref() - ai2d_input_tensor = nn.from_numpy(ai2d_input) - - # (2)根据输入,ai2d参数,运行得到ai2d输出,将结果保存到ai2d_output_tensor中 - ai2d_builder.run(ai2d_input_tensor, ai2d_output_tensor) + global ai2d_input_tensor,ai2d_output_tensor + # (1)创建ai2d输入对象,并将对象从numpy转换为tensor + ai2d_input = rgb888p_img.to_numpy_ref() + ai2d_input_tensor = nn.from_numpy(ai2d_input) + + # (2)根据输入,ai2d参数,运行得到ai2d输出,将结果保存到ai2d_output_tensor中 + ai2d_builder.run(ai2d_input_tensor, ai2d_output_tensor) def ai2d_release(): with ScopedTiming("ai2d_release",debug_mode > 0): - global ai2d_input_tensor - # 删除 ai2d_input_tensor 变量,释放对它所引用对象的内存引用 - del ai2d_input_tensor + global ai2d_input_tensor + # 删除 ai2d_input_tensor 变量,释放对它所引用对象的内存引用 + del ai2d_input_tensor ``` **使用示例:** @@ -333,50 +339,50 @@ def get_affine_matrix(bbox): def fld_ai2d_init(): with ScopedTiming("fld_ai2d_init",debug_mode > 0): - #for face landmark - global fld_ai2d - # (1)创建人脸关键点ai2d对象 - fld_ai2d = nn.ai2d() - - global fld_ai2d_output_tensor - # (2)创建人脸关键点ai2d_output_tensor对象 - data = np.ones(fld_kmodel_input_shape, dtype=np.uint8) - fld_ai2d_output_tensor = nn.from_numpy(data) + #for face landmark + global fld_ai2d + # (1)创建人脸关键点ai2d对象 + fld_ai2d = nn.ai2d() + + global fld_ai2d_output_tensor + # (2)创建人脸关键点ai2d_output_tensor对象 + data = np.ones(fld_kmodel_input_shape, dtype=np.uint8) + fld_ai2d_output_tensor = nn.from_numpy(data) def fld_ai2d_run(rgb888p_img,det): # 人脸关键点ai2d运行,rgb888p_img是Image对象,det为人脸检测框 with ScopedTiming("fld_ai2d_run",debug_mode > 0): - global fld_ai2d,fld_ai2d_input_tensor,fld_ai2d_output_tensor - # (1)创建ai2d_input_tensor - # Image对象转换为numpy对象 - ai2d_input = rgb888p_img.to_numpy_ref() - # 将numpy对象转换为ai2d_tensor - fld_ai2d_input_tensor = nn.from_numpy(ai2d_input) + global fld_ai2d,fld_ai2d_input_tensor,fld_ai2d_output_tensor + # (1)创建ai2d_input_tensor + # Image对象转换为numpy对象 + ai2d_input = rgb888p_img.to_numpy_ref() + # 将numpy对象转换为ai2d_tensor + fld_ai2d_input_tensor = nn.from_numpy(ai2d_input) + + # (2)设置ai2d参数 + # 设置ai2d输入、输出格式、数据类型 + fld_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + global matrix_dst + # 根据检测框获取affine参数 + matrix_dst = get_affine_matrix(det) + affine_matrix = [matrix_dst[0][0],matrix_dst[0][1],matrix_dst[0][2], + matrix_dst[1][0],matrix_dst[1][1],matrix_dst[1][2]] + # 设置affine参数 + fld_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,affine_matrix) - # (2)设置ai2d参数 - # 设置ai2d输入、输出格式、数据类型 - fld_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, - nn.ai2d_format.NCHW_FMT, - np.uint8, np.uint8) - global matrix_dst - # 根据检测框获取affine参数 - matrix_dst = get_affine_matrix(det) - affine_matrix = [matrix_dst[0][0],matrix_dst[0][1],matrix_dst[0][2], - matrix_dst[1][0],matrix_dst[1][1],matrix_dst[1][2]] - # 设置affine参数 - fld_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,affine_matrix) - - global fld_ai2d_builder - # (3)根据新的ai2d affine参数,创建新的ai2d_builder对象 - fld_ai2d_builder = fld_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fld_kmodel_input_shape) - # (4)ai2d_builder运行,将结果保存到fld_ai2d_output_tensor - fld_ai2d_builder.run(fld_ai2d_input_tensor, fld_ai2d_output_tensor) + global fld_ai2d_builder + # (3)根据新的ai2d affine参数,创建新的ai2d_builder对象 + fld_ai2d_builder = fld_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fld_kmodel_input_shape) + # (4)ai2d_builder运行,将结果保存到fld_ai2d_output_tensor + fld_ai2d_builder.run(fld_ai2d_input_tensor, fld_ai2d_output_tensor) def fld_ai2d_release(): with ScopedTiming("fld_ai2d_release",debug_mode > 0): - global fld_ai2d_input_tensor,fld_ai2d_builder - del fld_ai2d_input_tensor #删除fld_ai2d_input_tensor变量,释放对它所引用对象的内存引用 - del fld_ai2d_builder #删除fld_ai2d_builder变量,释放对它所引用对象的内存引用 + global fld_ai2d_input_tensor,fld_ai2d_builder + del fld_ai2d_input_tensor #删除fld_ai2d_input_tensor变量,释放对它所引用对象的内存引用 + del fld_ai2d_builder #删除fld_ai2d_builder变量,释放对它所引用对象的内存引用 ``` **使用示例:** @@ -440,12 +446,12 @@ global current_kmodel_obj #当前kpu对象 def kpu_init(kmodel_file): # 初始化kpu对象,并加载kmodel with ScopedTiming("kpu_init",debug_mode > 0): - # (1)初始化kpu对象 - kpu_obj = nn.kpu() - # (2)加载kmodel - kpu_obj.load_kmodel(kmodel_file) - # (3)ai2d初始化,模型输入需要预处理的情况下,kpu需要配合ai2d使用 - ai2d_init() + # (1)初始化kpu对象 + kpu_obj = nn.kpu() + # (2)加载kmodel + kpu_obj.load_kmodel(kmodel_file) + # (3)ai2d初始化,模型输入需要预处理的情况下,kpu需要配合ai2d使用 + ai2d_init() return kpu_obj def kpu_pre_process(rgb888p_img): @@ -453,21 +459,21 @@ def kpu_pre_process(rgb888p_img): # (1)ai2d运行,对原图进行预处理 ai2d_run(rgb888p_img) with ScopedTiming("kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,ai2d_output_tensor - # (2)将ai2d输出tensor设置为kpu模型输入 - current_kmodel_obj.set_input_tensor(0, ai2d_output_tensor) + global current_kmodel_obj,ai2d_output_tensor + # (2)将ai2d输出tensor设置为kpu模型输入 + current_kmodel_obj.set_input_tensor(0, ai2d_output_tensor) def kpu_get_output(): # 获取kpu输出 with ScopedTiming("kpu_get_output",debug_mode > 0): - global current_kmodel_obj - # 获取kpu输出,将输出转换为numpy格式,以便进行后处理 - results = [] - for i in range(current_kmodel_obj.outputs_size()): - data = current_kmodel_obj.get_output_tensor(i) - result = data.to_numpy() - del data #tensor对象用完之后释放内存 - results.append(result) + global current_kmodel_obj + # 获取kpu输出,将输出转换为numpy格式,以便进行后处理 + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + del data #tensor对象用完之后释放内存 + results.append(result) return results def kpu_run(kpu_obj,rgb888p_img): @@ -477,29 +483,28 @@ def kpu_run(kpu_obj,rgb888p_img): # (1)kpu预处理 kpu_pre_process(rgb888p_img) with ScopedTiming("kpu_run",debug_mode > 0): - # (2)kpu运行 - kpu_obj.run() + # (2)kpu运行 + kpu_obj.run() # (3)ai2d释放 ai2d_release() # (4)获取模型输出 results = kpu_get_output() # (5)kpu后处理,获取检测结果 with ScopedTiming("kpu_post",debug_mode > 0): - post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,kmodel_input_shape[2],prior_data,[OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) + post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,kmodel_input_shape[2],prior_data,[OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) # (6)返回人脸检测框 if len(post_ret)==0: - return post_ret + return post_ret else: - return post_ret[0] + return post_ret[0] # kpu释放 -def kpu_deinit(kpu_obj): +def kpu_deinit(): with ScopedTiming("kpu_deinit",debug_mode > 0): - global ai2d,ai2d_output_tensor - del kpu_obj #删除kpu_obj变量,释放对它所引用对象的内存引用 - del ai2d #删除ai2d变量,释放对它所引用对象的内存引用 - del ai2d_output_tensor #删除ai2d_output_tensor变量,释放对它所引用对象的内存引用 + global ai2d,ai2d_output_tensor + del ai2d #删除ai2d变量,释放对它所引用对象的内存引用 + del ai2d_output_tensor #删除ai2d_output_tensor变量,释放对它所引用对象的内存引用 ``` 使用示例: @@ -512,7 +517,10 @@ while True: dets = kpu_run(fd_kmodel,rgb888p_img) # kmodel推理 ...... ...... -kpu_deinit(fd_kmodel) # 释放kmodel +kpu_deinit() # 释放kmodel +global current_kmodel_obj +del current_kmodel_obj +del fd_kmodel ``` #### 1.6 媒体使用 @@ -552,13 +560,13 @@ def camera_start(dev_id): def camera_read(dev_id): # 读取指定设备chn2的一帧图像,即获取一帧AI原图 with ScopedTiming("camera_read",debug_mode >0): - rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) + rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) return rgb888p_img def camera_release_image(dev_id,rgb888p_img): # 释放指定设备chn2一帧图像 with ScopedTiming("camera_release_image",debug_mode >0): - camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) + camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) def camera_stop(dev_id): # 释放sensor @@ -615,31 +623,31 @@ def display_deinit(): def display_draw(dets): # 将检测框画到显示上 with ScopedTiming("display_draw",debug_mode >0): - global draw_img,osd_img - if dets: - # 清空draw_img - draw_img.clear() - - # 画检测框 - for det in dets: - x, y, w, h = map(lambda x: int(round(x, 0)), det[:4]) - x = x * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - y = y * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - w = w * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - h = h * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH - # 先将框画到draw_img,argb - draw_img.draw_rectangle(x,y, w, h, color=(255, 255, 0, 255)) - # 将draw_img拷贝到osd_img - draw_img.copy_to(osd_img) - # 将osd_img显示到hdmi上 - display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) - else: - # 清空draw_img - draw_img.clear() - # 将draw_img拷贝到osd_img - draw_img.copy_to(osd_img) - # 将透明图显示到hdmi上 - display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + global draw_img,osd_img + if dets: + # 清空draw_img + draw_img.clear() + + # 画检测框 + for det in dets: + x, y, w, h = map(lambda x: int(round(x, 0)), det[:4]) + x = x * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + y = y * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + w = w * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + h = h * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH + # 先将框画到draw_img,argb + draw_img.draw_rectangle(x,y, w, h, color=(255, 255, 0, 255)) + # 将draw_img拷贝到osd_img + draw_img.copy_to(osd_img) + # 将osd_img显示到hdmi上 + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + else: + # 清空draw_img + draw_img.clear() + # 将draw_img拷贝到osd_img + draw_img.copy_to(osd_img) + # 将透明图显示到hdmi上 + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) ``` **使用示例:** @@ -685,7 +693,7 @@ def media_init(): # (3)初始化K230 CanMV平台媒体缓冲区 ret = media.buffer_init() if ret: - return ret + return ret global buffer, draw_img, osd_img # (4)构建用于画图的对象 @@ -723,54 +731,57 @@ rgb888p_img = None try: ret = media_init() #媒体初始化(注:媒体初始化必须在camera_start之前,确保media缓冲区已配置完全) if ret: - print("face_detect_test, buffer init failed") - return ret + print("face_detect_test, buffer init failed") + return ret camera_start(CAM_DEV_ID_0) # 启动camera time.sleep(5) # sleep 5s保证camera启动完全,可以拿到正确的图像 while True: - with ScopedTiming("total",1): - # (1)读取一帧图像 - rgb888p_img = camera_read(CAM_DEV_ID_0) - if rgb888p_img == -1: - # 若读取失败,则释放当前帧 - print("face_detect_test, capture_image failed") - camera_release_image(CAM_DEV_ID_0,rgb888p_img) - rgb888p_img = None - continue - - # for rgb888planar - if rgb888p_img.format() == image.RGBP888: - # (2)kpu推理,获取推理结果 - dets = kpu_run(kpu_face_detect,rgb888p_img) - # (3)将推理结果画到原图 - display_draw(dets) - - # (4)释放当前帧 - camera_release_image(CAM_DEV_ID_0,rgb888p_img) - rgb888p_img = None + with ScopedTiming("total",1): + # (1)读取一帧图像 + rgb888p_img = camera_read(CAM_DEV_ID_0) + if rgb888p_img == -1: + # 若读取失败,则释放当前帧 + print("face_detect_test, capture_image failed") + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + continue + + # for rgb888planar + if rgb888p_img.format() == image.RGBP888: + # (2)kpu推理,获取推理结果 + dets = kpu_run(kpu_face_detect,rgb888p_img) + # (3)将推理结果画到原图 + display_draw(dets) + + # (4)释放当前帧 + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None except Exception as e: print(f"An error occurred during buffer used: {e}") finally: # 注:无论程序是否正常停止,确保释放以下资源。保证下次的正确运行 if rgb888p_img is not None: - #先release掉申请的内存,再stop camera - camera_release_image(CAM_DEV_ID_0,rgb888p_img) + #先release掉申请的内存,再stop camera + camera_release_image(CAM_DEV_ID_0,rgb888p_img) # 释放camera资源 camera_stop(CAM_DEV_ID_0) # 释放显示资源 display_deinit() # 释放kpu资源 - kpu_deinit(kpu_face_detect) + kpu_deinit() + global current_kmodel_obj + del current_kmodel_obj + del kpu_face_detect # 垃圾回收 gc.collect() time.sleep(1) # 释放媒体资源 ret = media_deinit() if ret: - print("face_detect_test, buffer_deinit failed") - return ret + print("face_detect_test, buffer_deinit failed") + return ret ``` ### 2.人脸检测 @@ -973,12 +984,11 @@ def kpu_run(kpu_obj,rgb888p_img): return post_ret[0] -def kpu_deinit(kpu_obj): +def kpu_deinit(): # kpu释放 with ScopedTiming("kpu_deinit",debug_mode > 0): global ai2d,ai2d_output_tensor - del kpu_obj #删除kpu_obj变量,释放对它所引用对象的内存引用 - del ai2d #删除ai2d变量,释放对它所引用对象的内存引用 + del ai2d #删除ai2d变量,释放对它所引用对象的内存引用 del ai2d_output_tensor #删除ai2d_output_tensor变量,释放对它所引用对象的内存引用 #********************for media_utils.py******************** @@ -1004,7 +1014,7 @@ def display_draw(dets): for det in dets: x, y, w, h = map(lambda x: int(round(x, 0)), det[:4]) x = x * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - y = y * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + y = y * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH w = w * DISPLAY_WIDTH // OUT_RGB888P_WIDTH h = h * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH draw_img.draw_rectangle(x,y, w, h, color=(255, 255, 0, 255), thickness = 2) @@ -1107,6 +1117,7 @@ def face_detect_inference(): # 启动camera camera_start(CAM_DEV_ID_0) time.sleep(5) + gc_count = 0 while True: with ScopedTiming("total",1): # (1)读取一帧图像 @@ -1128,7 +1139,11 @@ def face_detect_inference(): # (4)释放当前帧 camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None - + if gc_count > 5: + gc.collect() + gc_count = 0 + else: + gc_count += 1 except Exception as e: # 捕捉运行运行中异常,并打印错误 print(f"An error occurred during buffer used: {e}") @@ -1143,7 +1158,10 @@ def face_detect_inference(): # 释放显示资源 display_deinit() # 释放kpu资源 - kpu_deinit(kpu_face_detect) + kpu_deinit() + global current_kmodel_obj + del current_kmodel_obj + del kpu_face_detect # 垃圾回收 gc.collect() time.sleep(1) @@ -1358,7 +1376,7 @@ def ai2d_init(): # ai2d 运行 def ai2d_run(rgb888p_img): with ScopedTiming("ai2d_run",debug_mode > 0): - global ai2d_input_tensor,ai2d_out_tensor + global ai2d_input_tensor,ai2d_out_tensor,ai2d_builder ai2d_input = rgb888p_img.to_numpy_ref() ai2d_input_tensor = nn.from_numpy(ai2d_input) @@ -1424,9 +1442,10 @@ def kpu_run(kpu_obj,rgb888p_img): # kpu 释放内存 def kpu_deinit(kpu_obj): with ScopedTiming("kpu_deinit",debug_mode > 0): - global ai2d,ai2d_out_tensor + global ai2d,ai2d_out_tensor,ai2d_builder del kpu_obj del ai2d + del ai2d_builder del ai2d_out_tensor #media_utils.py @@ -1454,7 +1473,7 @@ def display_draw(dets): w = (x2 - x1) * DISPLAY_WIDTH // OUT_RGB888P_WIDTH h = (y2 - y1) * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT draw_img.draw_rectangle(x1 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH, - y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT, w, h, color=color_four[int(det[5])]) + y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT, w, h, color=color_four[int(det[5])],thickness=4) draw_img.draw_string( int(x1 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) , int(y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT)-50, " " + labels[int(det[5])] + " " + str(round(det[4],2)) , color=color_four[int(det[5])] , scale=4) draw_img.copy_to(osd_img) @@ -1549,6 +1568,8 @@ def ob_detect_inference(): camera_start(CAM_DEV_ID_0) time.sleep(5) + + count = 0 while True: with ScopedTiming("total",1): rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 @@ -1565,7 +1586,12 @@ def ob_detect_inference(): camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - # gc.collect() + + if (count > 5): + gc.collect() + count = 0 + else: + count += 1 except Exception as e: print(f"An error occurred during buffer used: {e}") finally: @@ -1629,6 +1655,29 @@ debug_mode = 0 # debug模式 #标签 多目标分割的所有可识别类别 labels = ["person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"] +#颜色板 用于作图 +color_four = [(255, 220, 20, 60), (255, 119, 11, 32), (255, 0, 0, 142), (255, 0, 0, 230), + (255, 106, 0, 228), (255, 0, 60, 100), (255, 0, 80, 100), (255, 0, 0, 70), + (255, 0, 0, 192), (255, 250, 170, 30), (255, 100, 170, 30), (255, 220, 220, 0), + (255, 175, 116, 175), (255, 250, 0, 30), (255, 165, 42, 42), (255, 255, 77, 255), + (255, 0, 226, 252), (255, 182, 182, 255), (255, 0, 82, 0), (255, 120, 166, 157), + (255, 110, 76, 0), (255, 174, 57, 255), (255, 199, 100, 0), (255, 72, 0, 118), + (255, 255, 179, 240), (255, 0, 125, 92), (255, 209, 0, 151), (255, 188, 208, 182), + (255, 0, 220, 176), (255, 255, 99, 164), (255, 92, 0, 73), (255, 133, 129, 255), + (255, 78, 180, 255), (255, 0, 228, 0), (255, 174, 255, 243), (255, 45, 89, 255), + (255, 134, 134, 103), (255, 145, 148, 174), (255, 255, 208, 186), + (255, 197, 226, 255), (255, 171, 134, 1), (255, 109, 63, 54), (255, 207, 138, 255), + (255, 151, 0, 95), (255, 9, 80, 61), (255, 84, 105, 51), (255, 74, 65, 105), + (255, 166, 196, 102), (255, 208, 195, 210), (255, 255, 109, 65), (255, 0, 143, 149), + (255, 179, 0, 194), (255, 209, 99, 106), (255, 5, 121, 0), (255, 227, 255, 205), + (255, 147, 186, 208), (255, 153, 69, 1), (255, 3, 95, 161), (255, 163, 255, 0), + (255, 119, 0, 170), (255, 0, 182, 199), (255, 0, 165, 120), (255, 183, 130, 88), + (255, 95, 32, 0), (255, 130, 114, 135), (255, 110, 129, 133), (255, 166, 74, 118), + (255, 219, 142, 185), (255, 79, 210, 114), (255, 178, 90, 62), (255, 65, 70, 15), + (255, 127, 167, 115), (255, 59, 105, 106), (255, 142, 108, 45), (255, 196, 172, 0), + (255, 95, 54, 80), (255, 128, 76, 255), (255, 201, 57, 1), (255, 246, 0, 122), + (255, 191, 162, 208)] + #scoped_timing.py 用于debug模式输出程序块运行时间 class ScopedTiming: def __init__(self, info="", enable_profile=True): @@ -1702,7 +1751,7 @@ def ai2d_init(): # ai2d 运行 def ai2d_run(rgb888p_img): with ScopedTiming("ai2d_run",debug_mode > 0): - global ai2d_input_tensor,ai2d_out_tensor + global ai2d_input_tensor,ai2d_out_tensor,ai2d_builder ai2d_input = rgb888p_img.to_numpy_ref() ai2d_input_tensor = nn.from_numpy(ai2d_input) @@ -1770,9 +1819,10 @@ def kpu_run(kpu_obj,rgb888p_img): # kpu 释放内存 def kpu_deinit(kpu_obj): with ScopedTiming("kpu_deinit",debug_mode > 0): - global ai2d,ai2d_out_tensor + global ai2d,ai2d_out_tensor,ai2d_builder del kpu_obj del ai2d + del ai2d_builder del ai2d_out_tensor #media_utils.py @@ -1800,7 +1850,7 @@ def display_draw(seg_res): for i, det in enumerate(dets): x1, y1, w, h = map(lambda x: int(round(x, 0)), det) - draw_img.draw_string( int(x1) , int(y1)-50, " " + labels[int(ids[i])] + " " + str(round(scores[i],2)) , color=(255,0,0,0), scale=4) + draw_img.draw_string( int(x1) , int(y1)-50, " " + labels[int(ids[i])] + " " + str(round(scores[i],2)) , color=color_four[int(ids[i])], scale=4) draw_img.copy_to(osd_img) display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) else: @@ -1894,6 +1944,8 @@ def seg_inference(): camera_start(CAM_DEV_ID_0) time.sleep(5) + + count = 0 while True: with ScopedTiming("total",1): rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 @@ -1910,7 +1962,12 @@ def seg_inference(): camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - #gc.collect() + + if (count > 5): + gc.collect() + count = 0 + else: + count += 1 except Exception as e: print(f"An error occurred during buffer used: {e}") finally: @@ -2016,7 +2073,7 @@ def ai2d_init(): # ai2d 运行 def ai2d_run(rgb888p_img): with ScopedTiming("ai2d_run",debug_mode > 0): - global ai2d_input_tensor,ai2d_out_tensor + global ai2d_input_tensor,ai2d_out_tensor,ai2d_builder ai2d_input = rgb888p_img.to_numpy_ref() ai2d_input_tensor = nn.from_numpy(ai2d_input) @@ -2080,10 +2137,11 @@ def kpu_run(kpu_obj,rgb888p_img): # kpu 释放内存 def kpu_deinit(kpu_obj): with ScopedTiming("kpu_deinit",debug_mode > 0): - global ai2d,ai2d_out_tensor + global ai2d,ai2d_out_tensor,ai2d_builder del kpu_obj del ai2d del ai2d_out_tensor + del ai2d_builder #media_utils.py global draw_img,osd_img #for display 定义全局 作图image对象 @@ -2113,7 +2171,7 @@ def display_draw(dets): point_8[i * 2 + 0] = int(x) point_8[i * 2 + 1] = int(y) for i in range(4): - draw_img.draw_line(point_8[i * 2 + 0],point_8[i * 2 + 1],point_8[(i+1) % 4 * 2 + 0],point_8[(i+1) % 4 * 2 + 1],color=(255, 0, 255, 0),thickness=2) + draw_img.draw_line(point_8[i * 2 + 0],point_8[i * 2 + 1],point_8[(i+1) % 4 * 2 + 0],point_8[(i+1) % 4 * 2 + 1],color=(255, 0, 255, 0),thickness=4) draw_img.copy_to(osd_img) display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) else: @@ -2206,6 +2264,8 @@ def licence_det_inference(): camera_start(CAM_DEV_ID_0) time.sleep(5) + + count = 0 while True: with ScopedTiming("total",1): rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 @@ -2222,7 +2282,12 @@ def licence_det_inference(): camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - # gc.collect() + + if (count > 5): + gc.collect() + count = 0 + else: + count += 1 except Exception as e: print(f"An error occurred during buffer used: {e}") finally: @@ -2563,6 +2628,7 @@ def ocr_det_inference(): camera_start(CAM_DEV_ID_0) time.sleep(5) + count=0 while True: with ScopedTiming("total",1): rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图像 @@ -2579,6 +2645,11 @@ def ocr_det_inference(): camera_release_image(CAM_DEV_ID_0,rgb888p_img) # 释放内存 rgb888p_img = None # gc.collect() + if (count>5): + gc.collect() + count = 0 + else: + count += 1 except Exception as e: print(f"An error occurred during buffer used: {e}") finally: @@ -2626,7 +2697,7 @@ DISPLAY_HEIGHT = 1080 ##ai原图分辨率输入 OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) -OUT_RGB888P_HEIGH = 1080 +OUT_RGB888P_HEIGHT = 1080 #kmodel输入shape kmodel_input_shape = (1,3,512,512) # kmodel输入分辨率 @@ -2635,17 +2706,17 @@ kmodel_input_shape = (1,3,512,512) # kmodel输入分辨率 confidence_threshold = 0.2 # 手掌检测阈值,用于过滤roi nms_threshold = 0.5 # 手掌检测框阈值,用于过滤重复roi kmodel_frame_size = [512,512] # 手掌检测输入图片尺寸 -frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH] # 直接输入图片尺寸 +frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGHT] # 直接输入图片尺寸 strides = [8,16,32] # 输出特征图的尺寸与输入图片尺寸的比 num_classes = 1 # 模型输出类别数 nms_option = False # 是否所有检测框一起做NMS,False则按照不同的类分别应用NMS labels = ["hand"] # 模型输出类别名称 root_dir = '/sdcard/app/tests/' -kmodel_file = root_dir + 'kmodel/hand_det.kmodel' # kmodel文件的路径 +kmodel_file = root_dir + 'kmodel/hand_det.kmodel' # kmodel文件的路径 anchors = [26,27, 53,52, 75,71, 80,99, 106,82, 99,134, 140,113, 161,172, 245,276] #anchor设置 -debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) +debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) #scoped_timing.py 用于debug模式输出程序块运行时间 class ScopedTiming: @@ -2676,7 +2747,7 @@ def ai2d_init(): global ai2d_output_tensor # 计算padding值 ori_w = OUT_RGB888P_WIDTH - ori_h = OUT_RGB888P_HEIGH + ori_h = OUT_RGB888P_HEIGHT width = kmodel_frame_size[0] height = kmodel_frame_size[1] ratiow = float(width) / ori_w @@ -2700,14 +2771,14 @@ def ai2d_init(): np.uint8, np.uint8) ai2d.set_pad_param(True, [0,0,0,0,top,bottom,left,right], 0, [114,114,114]) ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) - ai2d_builder = ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], [1,3,height,width]) + ai2d_builder = ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,height,width]) data = np.ones(kmodel_input_shape, dtype=np.uint8) ai2d_output_tensor = nn.from_numpy(data) # ai2d 运行 def ai2d_run(rgb888p_img): with ScopedTiming("ai2d_run",debug_mode > 0): - global ai2d_input_tensor,ai2d_output_tensor + global ai2d_input_tensor, ai2d_output_tensor, ai2d_builder ai2d_input = rgb888p_img.to_numpy_ref() ai2d_input_tensor = nn.from_numpy(ai2d_input) ai2d_builder.run(ai2d_input_tensor, ai2d_output_tensor) @@ -2772,13 +2843,14 @@ def kpu_run(kpu_obj,rgb888p_img): # kpu 释放内存 def kpu_deinit(kpu_obj): with ScopedTiming("kpu_deinit",debug_mode > 0): - global ai2d, ai2d_output_tensor + global ai2d, ai2d_output_tensor, ai2d_builder del kpu_obj del ai2d del ai2d_output_tensor + del ai2d_builder #media_utils.py -global draw_img,osd_img,masks #for display 定义全局 作图image对象 +global draw_img,osd_img #for display 定义全局 作图image对象 global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 #for display 初始化 @@ -2801,12 +2873,12 @@ def display_draw(dets): for det_box in dets: x1, y1, x2, y2 = det_box[2],det_box[3],det_box[4],det_box[5] w = float(x2 - x1) * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - h = float(y2 - y1) * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH + h = float(y2 - y1) * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT x1 = int(x1 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - y1 = int(y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) + y1 = int(y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) x2 = int(x2 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - y2 = int(y2 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) + y2 = int(y2 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) if (h<(0.1*DISPLAY_HEIGHT)): continue @@ -2814,8 +2886,8 @@ def display_draw(dets): continue if (w<(0.15*DISPLAY_WIDTH) and ((x1<(0.01*DISPLAY_WIDTH)) or (x2>(0.99*DISPLAY_WIDTH)))): continue - draw_img.draw_rectangle(x1 , y1 , int(w) , int(h) , color=(255, 0, 255, 0)) - draw_img.draw_string( x1 , y1-50, " " + labels[det_box[0]] + " " + str(round(det_box[1],2)) , color=(255,0, 255, 0), scale=4) + draw_img.draw_rectangle(x1 , y1 , int(w) , int(h), color=(255, 0, 255, 0), thickness = 2) + draw_img.draw_string( x1 , y1-50, " " + labels[det_box[0]] + " " + str(round(det_box[1],2)), color=(255,0, 255, 0), scale=4) draw_img.copy_to(osd_img) display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) else: @@ -2832,7 +2904,7 @@ def camera_init(dev_id): camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) # set chn2 output rgb88planar - camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) # camera 开启 @@ -2906,6 +2978,7 @@ def hand_detect_inference(): return ret camera_start(CAM_DEV_ID_0) + count = 0 while True: with ScopedTiming("total",1): rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 @@ -2922,7 +2995,12 @@ def hand_detect_inference(): camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - #gc.collect() + if (count>10): + gc.collect() + count = 0 + else: + count += 1 + except Exception as e: print(f"An error occurred during buffer used: {e}") finally: @@ -3051,7 +3129,7 @@ def ai2d_init(): # ai2d 运行 def ai2d_run(rgb888p_img): with ScopedTiming("ai2d_run",debug_mode > 0): - global ai2d_input_tensor,ai2d_output_tensor + global ai2d_input_tensor,ai2d_output_tensor,ai2d_builder ai2d_input = rgb888p_img.to_numpy_ref() ai2d_input_tensor = nn.from_numpy(ai2d_input) ai2d_builder.run(ai2d_input_tensor, ai2d_output_tensor) @@ -3117,9 +3195,10 @@ def kpu_run(kpu_obj,rgb888p_img): # kpu 释放内存 def kpu_deinit(kpu_obj): with ScopedTiming("kpu_deinit",debug_mode > 0): - global ai2d, ai2d_output_tensor + global ai2d, ai2d_output_tensor,ai2d_builder del kpu_obj del ai2d + del ai2d_builder del ai2d_output_tensor #media_utils.py @@ -3159,7 +3238,7 @@ def display_draw(dets): continue if (w<(0.15*DISPLAY_WIDTH) and ((x1<(0.01*DISPLAY_WIDTH)) or (x2>(0.99*DISPLAY_WIDTH)))): continue - draw_img.draw_rectangle(x1 , y1 , int(w) , int(h) , color=(255, 0, 255, 0),thickness = 2) + draw_img.draw_rectangle(x1 , y1 , int(w) , int(h) , color=(255, 0, 255, 0),thickness = 4) draw_img.draw_string( x1 , y1-50, " " + labels[det_box[0]] + " " + str(round(det_box[1],2)) , color=(255,0, 255, 0), scale=4) draw_img.copy_to(osd_img) display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) @@ -3251,6 +3330,8 @@ def person_detect_inference(): return ret camera_start(CAM_DEV_ID_0) + + count = 0 while True: with ScopedTiming("total",total_debug_mode): rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 @@ -3267,7 +3348,12 @@ def person_detect_inference(): camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - # gc.collect() + + if (count > 5): + gc.collect() + count = 0 + else: + count += 1 except Exception as e: print(f"An error occurred during buffer used: {e}") finally: @@ -3405,7 +3491,7 @@ def ai2d_init(): # ai2d 运行 def ai2d_run(rgb888p_img): with ScopedTiming("ai2d_run",debug_mode > 0): - global ai2d_input_tensor,ai2d_out_tensor + global ai2d_input_tensor,ai2d_out_tensor,ai2d_builder ai2d_input = rgb888p_img.to_numpy_ref() ai2d_input_tensor = nn.from_numpy(ai2d_input) @@ -3466,10 +3552,11 @@ def kpu_run(kpu_obj,rgb888p_img): # kpu 释放内存 def kpu_deinit(kpu_obj): with ScopedTiming("kpu_deinit",debug_mode > 0): - global ai2d,ai2d_out_tensor + global ai2d,ai2d_out_tensor,ai2d_builder del kpu_obj del ai2d del ai2d_out_tensor + del ai2d_builder #media_utils.py global draw_img,osd_img #for display 定义全局 作图image对象 @@ -3613,6 +3700,8 @@ def person_kp_detect_inference(): camera_start(CAM_DEV_ID_0) time.sleep(5) + + count = 0 while True: with ScopedTiming("total",1): rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 @@ -3629,7 +3718,12 @@ def person_kp_detect_inference(): camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - #gc.collect() + + if (count > 5): + gc.collect() + count = 0 + else: + count += 1 except Exception as e: print(f"An error occurred during buffer used: {e}") finally: @@ -3827,94 +3921,53 @@ if __name__=="__main__": kws_inference() ``` -## 三、AI Demo多模型示例解析 - -### 1. 人脸关键点检测 +### 11.跌倒检测 ```python -import ulab.numpy as np # 类似python numpy操作,但也会有一些接口不同 -import nncase_runtime as nn # nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 -from media.camera import * # 摄像头模块 -from media.display import * # 显示模块 -from media.media import * # 软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 -import aidemo # aidemo模块,封装ai demo相关后处理、画图操作 -import image # 图像模块,主要用于读取、图像绘制元素(框、点等)等操作 -import time # 时间统计 -import gc # 垃圾回收模块 -import os # 操作系统接口模块 -import math # 数学模块 +import aicube #aicube模块,封装检测分割等任务相关后处理 +from media.camera import * #摄像头模块 +from media.display import * #显示模块 +from media.media import * #软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 +import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 -#********************for config.py******************** -# display分辨率 -DISPLAY_WIDTH = ALIGN_UP(1920, 16) # 显示宽度要求16位对齐 -DISPLAY_HEIGHT = 1080 +import time #时间统计 +import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 -# ai原图分辨率,sensor默认出图为16:9,若需不形变原图,最好按照16:9比例设置宽高 -OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) # ai原图宽度要求16位对齐 -OUT_RGB888P_HEIGH = 1080 +import gc #垃圾回收模块 -# kmodel参数设置 -# 人脸检测kmodel输入shape -fd_kmodel_input_shape = (1,3,320,320) -# 人脸关键点kmodel输入shape -fld_kmodel_input_shape = (1,3,192,192) -# ai原图padding -rgb_mean = [104,117,123] +##config.py +#display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 -#人脸检测kmodel其它参数设置 -confidence_threshold = 0.5 # 人脸检测阈值 -top_k = 5000 -nms_threshold = 0.2 -keep_top_k = 750 -vis_thres = 0.5 -variance = [0.1, 0.2] -anchor_len = 4200 -score_dim = 2 -det_dim = 4 -keypoint_dim = 10 +##ai原图分辨率输入 +OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) +OUT_RGB888P_HEIGHT = 1080 + +#kmodel输入shape +kmodel_input_shape = (1,3,640,640) # kmodel输入分辨率 + +#kmodel相关参数设置 +confidence_threshold = 0.3 # 摔倒检测阈值,用于过滤roi +nms_threshold = 0.45 # 摔倒检测框阈值,用于过滤重复roi +kmodel_frame_size = [640,640] # 摔倒检测输入图片尺寸 +frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGHT] # 直接输入图片尺寸 +strides = [8,16,32] # 输出特征图的尺寸与输入图片尺寸的比 +num_classes = 2 # 模型输出类别数 +nms_option = False # 是否所有检测框一起做NMS,False则按照不同的类分别应用NMS +labels = ["Fall","NoFall"] # 模型输出类别名称 -# 文件配置 -# 人脸检测kmodel root_dir = '/sdcard/app/tests/' -fd_kmodel_file = root_dir + 'kmodel/face_detection_320.kmodel' -# 人脸关键点kmodel -fr_kmodel_file = root_dir + 'kmodel/face_landmark.kmodel' -# anchor文件 -anchors_path = root_dir + 'utils/prior_data_320.bin' -# 调试模型,0:不调试,>0:打印对应级别调试信息 -debug_mode = 0 +kmodel_file = root_dir + 'kmodel/yolov5n-falldown.kmodel' # kmodel文件的路径 +anchors = [10,13, 16,30, 33,23, 30,61, 62,45, 50,119, 116,90, 156,198, 373,326] # anchor设置 -# 人脸关键点不同部位关键点列表 -dict_kp_seq = [ - [43, 44, 45, 47, 46, 50, 51, 49, 48], # left_eyebrow - [97, 98, 99, 100, 101, 105, 104, 103, 102], # right_eyebrow - [35, 36, 33, 37, 39, 42, 40, 41], # left_eye - [89, 90, 87, 91, 93, 96, 94, 95], # right_eye - [34, 88], # pupil - [72, 73, 74, 86], # bridge_nose - [77, 78, 79, 80, 85, 84, 83], # wing_nose - [52, 55, 56, 53, 59, 58, 61, 68, 67, 71, 63, 64], # out_lip - [65, 54, 60, 57, 69, 70, 62, 66], # in_lip - [1, 9, 10, 11, 12, 13, 14, 15, 16, 2, 3, 4, 5, 6, 7, 8, 0, 24, 23, 22, 21, 20, 19, 18, 32, 31, 30, 29, 28, 27, 26, 25, 17] # basin -] +colors = [(255,0, 0, 255), (255,0, 255, 0), (255,255,0, 0), (255,255,0, 255)] # 颜色设置 -# 人脸关键点不同部位(顺序同dict_kp_seq)颜色配置,argb -color_list_for_osd_kp = [ - (255, 0, 255, 0), - (255, 0, 255, 0), - (255, 255, 0, 255), - (255, 255, 0, 255), - (255, 255, 0, 0), - (255, 255, 170, 0), - (255, 255, 255, 0), - (255, 0, 255, 255), - (255, 255, 220, 50), - (255, 30, 30, 255) -] +debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) -#********************for scoped_timing.py******************** -# 时间统计类 +#scoped_timing.py 用于debug模式输出程序块运行时间 class ScopedTiming: def __init__(self, info="", enable_profile=True): self.info = info @@ -3930,374 +3983,163 @@ class ScopedTiming: elapsed_time = time.time_ns() - self.start_time print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") -#********************for ai_utils.py******************** -global current_kmodel_obj #当前kpu对象 -# fd_ai2d: 人脸检测ai2d实例 -# fd_ai2d_input_tensor: 人脸检测ai2d输入 -# fd_ai2d_output_tensor: 人脸检测ai2d输入 -# fd_ai2d_builder: 根据人脸检测ai2d参数,构建的人脸检测ai2d_builder对象 -global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder -# fld_ai2d: 人脸关键点ai2d实例 -# fld_ai2d_input_tensor: 人脸关键点ai2d输入 -# fld_ai2d_output_tensor:人脸关键点ai2d输入 -# fld_ai2d_builder: 根据人脸关键点ai2d参数,构建的人脸关键点ai2d_builder对象 -global fld_ai2d,fld_ai2d_input_tensor,fld_ai2d_output_tensor,fld_ai2d_builder -global matrix_dst #人脸仿射变换矩阵 - -#读取anchor文件,为人脸检测后处理做准备 -print('anchors_path:',anchors_path) -prior_data = np.fromfile(anchors_path, dtype=np.float) -prior_data = prior_data.reshape((anchor_len,det_dim)) - -def get_pad_one_side_param(): - # 右padding或下padding,获取padding参数 - dst_w = fd_kmodel_input_shape[3] # kmodel输入宽(w) - dst_h = fd_kmodel_input_shape[2] # kmodel输入高(h) +#ai_utils.py +global current_kmodel_obj # 定义全局的 kpu 对象 +global ai2d,ai2d_input_tensor,ai2d_output_tensor,ai2d_builder # 定义全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder - # OUT_RGB888P_WIDTH:原图宽(w) - # OUT_RGB888P_HEIGH:原图高(h) - # 计算最小的缩放比例,等比例缩放 - ratio_w = dst_w / OUT_RGB888P_WIDTH - ratio_h = dst_h / OUT_RGB888P_HEIGH - if ratio_w < ratio_h: - ratio = ratio_w - else: - ratio = ratio_h - # 计算经过缩放后的新宽和新高 - new_w = (int)(ratio * OUT_RGB888P_WIDTH) - new_h = (int)(ratio * OUT_RGB888P_HEIGH) - # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 - dw = (dst_w - new_w) / 2 - dh = (dst_h - new_h) / 2 - # 四舍五入,确保padding是整数 - top = (int)(round(0)) - bottom = (int)(round(dh * 2 + 0.1)) - left = (int)(round(0)) - right = (int)(round(dw * 2 - 0.1)) - return [0, 0, 0, 0, top, bottom, left, right] +# ai2d 初始化 +def ai2d_init(): + with ScopedTiming("ai2d_init",debug_mode > 0): + global ai2d + global ai2d_builder + global ai2d_output_tensor + # 计算padding值 + ori_w = OUT_RGB888P_WIDTH + ori_h = OUT_RGB888P_HEIGHT + width = kmodel_frame_size[0] + height = kmodel_frame_size[1] + ratiow = float(width) / ori_w + ratioh = float(height) / ori_h + if ratiow < ratioh: + ratio = ratiow + else: + ratio = ratioh + new_w = int(ratio * ori_w) + new_h = int(ratio * ori_h) + dw = float(width - new_w) / 2 + dh = float(height - new_h) / 2 + top = int(round(dh - 0.1)) + bottom = int(round(dh + 0.1)) + left = int(round(dw - 0.1)) + right = int(round(dw - 0.1)) -def fd_ai2d_init(): - # 人脸检测模型ai2d初始化 - with ScopedTiming("fd_ai2d_init",debug_mode > 0): - # (1)创建人脸检测ai2d对象 - global fd_ai2d - fd_ai2d = nn.ai2d() - # (2)设置人脸检测ai2d参数 - fd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + ai2d = nn.ai2d() + ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) - fd_ai2d.set_pad_param(True, get_pad_one_side_param(), 0, rgb_mean) - fd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) - - #(3)人脸检测ai2d_builder,根据人脸检测ai2d参数、输入输出大小创建ai2d_builder对象 - global fd_ai2d_builder - fd_ai2d_builder = fd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fd_kmodel_input_shape) - - #(4)创建人脸检测ai2d_output_tensor,用于保存人脸检测ai2d输出 - global fd_ai2d_output_tensor - data = np.ones(fd_kmodel_input_shape, dtype=np.uint8) - fd_ai2d_output_tensor = nn.from_numpy(data) + ai2d.set_pad_param(True, [0,0,0,0,top,bottom,left,right], 0, [114,114,114]) + ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) + ai2d_builder = ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,height,width]) + data = np.ones(kmodel_input_shape, dtype=np.uint8) + ai2d_output_tensor = nn.from_numpy(data) -def fd_ai2d_run(rgb888p_img): - # 根据人脸检测ai2d参数,对原图rgb888p_img进行预处理 - with ScopedTiming("fd_ai2d_run",debug_mode > 0): - global fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder - # (1)根据原图构建ai2d_input_tensor对象 +# ai2d 运行 +def ai2d_run(rgb888p_img): + with ScopedTiming("ai2d_run",debug_mode > 0): + global ai2d_input_tensor,ai2d_output_tensor, ai2d_builder ai2d_input = rgb888p_img.to_numpy_ref() - fd_ai2d_input_tensor = nn.from_numpy(ai2d_input) - # (2)运行人脸检测ai2d_builder,将结果保存到人脸检测ai2d_output_tensor中 - fd_ai2d_builder.run(fd_ai2d_input_tensor, fd_ai2d_output_tensor) - -def fd_ai2d_release(): - # 释放人脸检测ai2d_input_tensor - with ScopedTiming("fd_ai2d_release",debug_mode > 0): - global fd_ai2d_input_tensor - del fd_ai2d_input_tensor + ai2d_input_tensor = nn.from_numpy(ai2d_input) + ai2d_builder.run(ai2d_input_tensor, ai2d_output_tensor) +# ai2d 释放内存 +def ai2d_release(): + with ScopedTiming("ai2d_release",debug_mode > 0): + global ai2d_input_tensor + del ai2d_input_tensor -def fd_kpu_init(kmodel_file): - # 初始化人脸检测kpu对象,并加载kmodel - with ScopedTiming("fd_kpu_init",debug_mode > 0): - # 初始化人脸检测kpu对象 +# kpu 初始化 +def kpu_init(kmodel_file): + # init kpu and load kmodel + with ScopedTiming("kpu_init",debug_mode > 0): kpu_obj = nn.kpu() - # 加载人脸检测kmodel kpu_obj.load_kmodel(kmodel_file) - # 初始化人脸检测ai2d - fd_ai2d_init() + + ai2d_init() return kpu_obj -def fd_kpu_pre_process(rgb888p_img): - # 设置人脸检测kpu输入 - # 使用人脸检测ai2d对原图进行预处理(padding,resize) - fd_ai2d_run(rgb888p_img) - with ScopedTiming("fd_kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,fd_ai2d_output_tensor - # 设置人脸检测kpu输入 - current_kmodel_obj.set_input_tensor(0, fd_ai2d_output_tensor) +# kpu 输入预处理 +def kpu_pre_process(rgb888p_img): + ai2d_run(rgb888p_img) + with ScopedTiming("kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,ai2d_output_tensor + # set kpu input + current_kmodel_obj.set_input_tensor(0, ai2d_output_tensor) -def fd_kpu_get_output(): - # 获取人脸检测kpu输出 - with ScopedTiming("fd_kpu_get_output",debug_mode > 0): +# kpu 获得 kmodel 输出 +def kpu_get_output(): + with ScopedTiming("kpu_get_output",debug_mode > 0): global current_kmodel_obj - # 获取模型输出,并将结果转换为numpy,以便进行人脸检测后处理 results = [] for i in range(current_kmodel_obj.outputs_size()): data = current_kmodel_obj.get_output_tensor(i) result = data.to_numpy() - del data - results.append(result) + + result = result.reshape((result.shape[0]*result.shape[1]*result.shape[2]*result.shape[3])) + tmp2 = result.copy() + del result + results.append(tmp2) return results -def fd_kpu_run(kpu_obj,rgb888p_img): +# kpu 运行 +def kpu_run(kpu_obj,rgb888p_img): global current_kmodel_obj current_kmodel_obj = kpu_obj - # (1)原图预处理,并设置模型输入 - fd_kpu_pre_process(rgb888p_img) - # (2)人脸检测kpu推理 - with ScopedTiming("fd kpu_run",debug_mode > 0): - kpu_obj.run() - # (3)释放人脸检测ai2d资源 - fd_ai2d_release() - # (4)获取人俩检测kpu输出 - results = fd_kpu_get_output() - # (5)人脸检测kpu结果后处理 - with ScopedTiming("fd kpu_post",debug_mode > 0): - post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, - [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) - # (6)返回人脸检测框 - if len(post_ret)==0: - return post_ret - else: - return post_ret[0] #0:det,1:landm,2:score - -def fd_kpu_deinit(kpu_obj): - # kpu释放 - with ScopedTiming("fd_kpu_deinit",debug_mode > 0): - global fd_ai2d, fd_ai2d_output_tensor - del kpu_obj #删除人脸检测kpu_obj变量,释放对它所引用对象的内存引用 - del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 - del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 - -###############for face recognition############### -def get_affine_matrix(bbox): - # 获取仿射矩阵,用于将边界框映射到模型输入空间 - with ScopedTiming("get_affine_matrix", debug_mode > 1): - # 从边界框提取坐标和尺寸 - x1, y1, w, h = map(lambda x: int(round(x, 0)), bbox[:4]) - # 计算缩放比例,使得边界框映射到模型输入空间的一部分 - scale_ratio = (fld_kmodel_input_shape[2]) / (max(w, h) * 1.5) - # 计算边界框中心点在模型输入空间的坐标 - cx = (x1 + w / 2) * scale_ratio - cy = (y1 + h / 2) * scale_ratio - # 计算模型输入空间的一半长度 - half_input_len = fld_kmodel_input_shape[2] / 2 - - # 创建仿射矩阵并进行设置 - matrix_dst = np.zeros((2, 3), dtype=np.float) - matrix_dst[0, 0] = scale_ratio - matrix_dst[0, 1] = 0 - matrix_dst[0, 2] = half_input_len - cx - matrix_dst[1, 0] = 0 - matrix_dst[1, 1] = scale_ratio - matrix_dst[1, 2] = half_input_len - cy - return matrix_dst - -def fld_ai2d_init(): - # 人脸关键点ai2d初始化 - with ScopedTiming("fld_ai2d_init",debug_mode > 0): - # (1)创建人脸关键点ai2d对象 - global fld_ai2d - fld_ai2d = nn.ai2d() - - # (2)创建人脸关键点ai2d_output_tensor对象,用于存放ai2d输出 - global fld_ai2d_output_tensor - data = np.ones(fld_kmodel_input_shape, dtype=np.uint8) - fld_ai2d_output_tensor = nn.from_numpy(data) - -def fld_ai2d_run(rgb888p_img,det): - # 人脸关键点ai2d推理 - with ScopedTiming("fld_ai2d_run",debug_mode > 0): - global fld_ai2d,fld_ai2d_input_tensor,fld_ai2d_output_tensor - #(1)根据原图ai2d_input_tensor对象 - ai2d_input = rgb888p_img.to_numpy_ref() - fld_ai2d_input_tensor = nn.from_numpy(ai2d_input) - - # (2)根据新的det设置新的人脸关键点ai2d参数 - fld_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, - nn.ai2d_format.NCHW_FMT, - np.uint8, np.uint8) - global matrix_dst - matrix_dst = get_affine_matrix(det) - affine_matrix = [matrix_dst[0][0],matrix_dst[0][1],matrix_dst[0][2], - matrix_dst[1][0],matrix_dst[1][1],matrix_dst[1][2]] - fld_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,affine_matrix) - - # (3)根据新的人脸关键点ai2d参数,构建人脸关键点ai2d_builder - global fld_ai2d_builder - fld_ai2d_builder = fld_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fld_kmodel_input_shape) - # (4)推理人脸关键点ai2d,将预处理的结果保存到fld_ai2d_output_tensor - fld_ai2d_builder.run(fld_ai2d_input_tensor, fld_ai2d_output_tensor) - -def fld_ai2d_release(): - # 释放人脸关键点ai2d_input_tensor、ai2d_builder - with ScopedTiming("fld_ai2d_release",debug_mode > 0): - global fld_ai2d_input_tensor,fld_ai2d_builder - del fld_ai2d_input_tensor - del fld_ai2d_builder - -def fld_kpu_init(kmodel_file): - # 人脸关键点kpu初始化 - with ScopedTiming("fld_kpu_init",debug_mode > 0): - # 初始化人脸关键点kpu对象 - kpu_obj = nn.kpu() - # 加载人脸关键点kmodel - kpu_obj.load_kmodel(kmodel_file) - # 初始化人脸关键点ai2d - fld_ai2d_init() - return kpu_obj - -def fld_kpu_pre_process(rgb888p_img,det): - # 人脸关键点kpu预处理 - # 人脸关键点ai2d推理,根据det对原图进行预处理 - fld_ai2d_run(rgb888p_img,det) - with ScopedTiming("fld_kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,fld_ai2d_output_tensor - # 将人脸关键点ai2d输出设置为人脸关键点kpu输入 - current_kmodel_obj.set_input_tensor(0, fld_ai2d_output_tensor) - #ai2d_out_data = fld_ai2d_output_tensor.to_numpy() - #with open("/sdcard/app/ai2d_out.bin", "wb") as file: - #file.write(ai2d_out_data.tobytes()) - -def fld_kpu_get_output(): - with ScopedTiming("fld_kpu_get_output",debug_mode > 0): - global current_kmodel_obj - # 获取人脸关键点kpu输出 - data = current_kmodel_obj.get_output_tensor(0) - result = data.to_numpy() - del data - return result - -def fld_kpu_post_process(pred): - # 人脸关键点kpu推理结果后处理 - with ScopedTiming("fld_kpu_post_process",debug_mode > 0): - # (1)将人脸关键点输出变换模型输入 - half_input_len = fld_kmodel_input_shape[2] // 2 - pred = pred.flatten() - for i in range(len(pred)): - pred[i] += (pred[i] + 1) * half_input_len - - # (2)获取仿射矩阵的逆矩阵 - global matrix_dst - matrix_dst_inv = aidemo.invert_affine_transform(matrix_dst) - matrix_dst_inv = matrix_dst_inv.flatten() - - # (3)对每个关键点进行逆变换 - half_out_len = len(pred) // 2 - for kp_id in range(half_out_len): - old_x = pred[kp_id * 2] - old_y = pred[kp_id * 2 + 1] - - # 逆变换公式 - new_x = old_x * matrix_dst_inv[0] + old_y * matrix_dst_inv[1] + matrix_dst_inv[2] - new_y = old_x * matrix_dst_inv[3] + old_y * matrix_dst_inv[4] + matrix_dst_inv[5] - - pred[kp_id * 2] = new_x - pred[kp_id * 2 + 1] = new_y - - return pred - -def fld_kpu_run(kpu_obj,rgb888p_img,det): - # 人脸关键点kpu推理 - global current_kmodel_obj - current_kmodel_obj = kpu_obj - # (1)人脸关键点kpu预处理,设置kpu输入 - fld_kpu_pre_process(rgb888p_img,det) - # (2)人脸关键点kpu推理 - with ScopedTiming("fld_kpu_run",debug_mode > 0): - kpu_obj.run() - # (3)释放人脸关键点ai2d - fld_ai2d_release() - # (4)获取人脸关键点kpu输出 - result = fld_kpu_get_output() - # (5)人脸关键点后处理 - result = fld_kpu_post_process(result) - return result + # (1)原图预处理,并设置模型输入 + kpu_pre_process(rgb888p_img) + # (2)摔倒检测 kpu 运行 + with ScopedTiming("kpu_run",debug_mode > 0): + current_kmodel_obj.run() + # (3)释放摔倒检测 ai2d 资源 + ai2d_release() + # (4)获取摔倒检测 kpu 输出 + results = kpu_get_output() + # (5)摔倒检测 kpu 结果后处理 + dets = aicube.anchorbasedet_post_process( results[0], results[1], results[2], kmodel_frame_size, frame_size, strides, num_classes, confidence_threshold, nms_threshold, anchors, nms_option) + # (6)返回摔倒检测结果 + return dets -def fld_kpu_deinit(kpu_obj): - # 人脸关键点kpu释放 - with ScopedTiming("fld_kpu_deinit",debug_mode > 0): - global fld_ai2d,fld_ai2d_output_tensor - del kpu_obj # 删除kpu_obj变量,释放对它所引用对象的内存引用 - del fld_ai2d # 删除fld_ai2d变量,释放对它所引用对象的内存引用 - del fld_ai2d_output_tensor # 删除fld_ai2d_output_tensor变量,释放对它所引用对象的内存引用 +# kpu 释放内存 +def kpu_deinit(kpu_obj): + with ScopedTiming("kpu_deinit",debug_mode > 0): + global ai2d, ai2d_output_tensor, ai2d_builder + del kpu_obj + del ai2d + del ai2d_output_tensor + del ai2d_builder -#********************for media_utils.py******************** -global draw_img_ulab,draw_img,osd_img #for display -global buffer,media_source,media_sink #for media +#media_utils.py +global draw_img,osd_img #for display 定义全局 作图image对象 +global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 -# for display,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.2 +#for display 初始化 def display_init(): - # 设置使用hdmi进行显示 + # use hdmi for display display.init(LT9611_1920X1080_30FPS) display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) +# display 释放内存 def display_deinit(): - # 释放显示资源 display.deinit() -def display_draw(dets,landmark_preds): - # 在显示器画人脸轮廓 +# display 作图过程 框出所有检测到的行人以及标出是否摔倒的结果 +def display_draw(dets): with ScopedTiming("display_draw",debug_mode >0): - global draw_img_ulab,draw_img,osd_img + global draw_img,osd_img + if dets: draw_img.clear() - for pred in landmark_preds: - # (1)获取单个人脸框对应的人脸关键点 - for sub_part_index in range(len(dict_kp_seq)): - # (2)构建人脸某个区域关键点集 - sub_part = dict_kp_seq[sub_part_index] - face_sub_part_point_set = [] - for kp_index in range(len(sub_part)): - real_kp_index = sub_part[kp_index] - x, y = pred[real_kp_index * 2], pred[real_kp_index * 2 + 1] - - x = int(x * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - y = int(y * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) - face_sub_part_point_set.append((x, y)) - - # (3)画人脸不同区域的轮廓 - if sub_part_index in (9, 6): - color = np.array(color_list_for_osd_kp[sub_part_index],dtype = np.uint8) - face_sub_part_point_set = np.array(face_sub_part_point_set) - - aidemo.polylines(draw_img_ulab, face_sub_part_point_set,False,color,5,8,0) + for det_box in dets: + x1, y1, x2, y2 = det_box[2],det_box[3],det_box[4],det_box[5] + w = float(x2 - x1) * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + h = float(y2 - y1) * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT - elif sub_part_index == 4: - color = color_list_for_osd_kp[sub_part_index] - for kp in face_sub_part_point_set: - x,y = kp[0],kp[1] - draw_img.draw_circle(x,y ,2, color, 1) - else: - color = np.array(color_list_for_osd_kp[sub_part_index],dtype = np.uint8) - face_sub_part_point_set = np.array(face_sub_part_point_set) - aidemo.contours(draw_img_ulab, face_sub_part_point_set,-1,color,2,8) + x1 = int(x1 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) + y1 = int(y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) + x2 = int(x2 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) + y2 = int(y2 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) - # (4)将轮廓结果拷贝到osd + draw_img.draw_rectangle(x1 , y1 , int(w) , int(h) , color=colors[det_box[0]], thickness = 2) + draw_img.draw_string( x1 , y1-20, " " + labels[det_box[0]] + " " + str(round(det_box[1],2)) , color=colors[det_box[0]+2], scale=4) draw_img.copy_to(osd_img) - # (5)将osd显示到屏幕 display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) else: - # (1)清空用来画框的图像 draw_img.clear() - # (2)清空osd draw_img.copy_to(osd_img) - # (3)显示透明图层 display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) -#for camera,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.1 +#for camera 初始化 def camera_init(dev_id): - # camera初始化 camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) # set chn0 output yuv420sp @@ -4305,31 +4147,30 @@ def camera_init(dev_id): camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) # set chn2 output rgb88planar - camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) +# camera 开启 def camera_start(dev_id): - # camera启动 camera.start_stream(dev_id) +# camera 读取图像 def camera_read(dev_id): - # 读取一帧图像 with ScopedTiming("camera_read",debug_mode >0): rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) return rgb888p_img +# camera 图像释放 def camera_release_image(dev_id,rgb888p_img): - # 释放一帧图像 with ScopedTiming("camera_release_image",debug_mode >0): camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) +# camera 结束 def camera_stop(dev_id): - # 停止camera camera.stop_stream(dev_id) -#for media,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.3 +#for media 初始化 def media_init(): - # meida初始化 config = k_vb_config() config.max_pool_cnt = 1 config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT @@ -4347,18 +4188,17 @@ def media_init(): ret = media.buffer_init() if ret: return ret - global buffer, draw_img_ulab,draw_img, osd_img + global buffer, draw_img, osd_img buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) - # 用于画框 - draw_img_ulab = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) - draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_REF,data = draw_img_ulab) - # 用于拷贝画框结果,防止画框过程中发生buffer搬运 + # 图层1,用于画框 + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_MPGC) + # 图层2,用于拷贝画框结果,防止画框过程中发生buffer搬运 osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) return ret +# media 释放内存 def media_deinit(): - # meida资源释放 global buffer,media_source, media_sink media.release_buffer(buffer) media.destroy_link(media_source, media_sink) @@ -4366,115 +4206,104 @@ def media_deinit(): ret = media.buffer_deinit() return ret -#********************for face_detect.py******************** -def face_landmark_inference(): - print("face_landmark_test start") - # 人脸检测kpu初始化 - kpu_face_detect = fd_kpu_init(fd_kmodel_file) - # 人脸关键点kpu初始化 - kpu_face_landmark = fld_kpu_init(fr_kmodel_file) - # camera初始化 - camera_init(CAM_DEV_ID_0) - # 显示初始化 - display_init() +#**********for falldown_detect.py********** +def falldown_detect_inference(): + print("falldown_detect_test start") + kpu_falldown_detect = kpu_init(kmodel_file) # 创建摔倒检测的 kpu 对象 + camera_init(CAM_DEV_ID_0) # 初始化 camera + display_init() # 初始化 display rgb888p_img = None - # 注意:将一定要将一下过程包在try中,用于保证程序停止后,资源释放完毕;确保下次程序仍能正常运行 try: - # 注意:媒体初始化(注:媒体初始化必须在camera_start之前,确保media缓冲区已配置完全) ret = media_init() if ret: - print("face_detect_test, buffer init failed") + print("falldown_detect_test, buffer init failed") return ret - # 启动camera camera_start(CAM_DEV_ID_0) - time.sleep(5) + count = 0 while True: with ScopedTiming("total",1): - # (1)读取一帧图像 - rgb888p_img = camera_read(CAM_DEV_ID_0) - # (2)若读取失败,释放当前帧 + rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 if rgb888p_img == -1: - print("face_detect_test, capture_image failed") + print("falldown_detect_test, capture_image failed") camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None continue - # (3)若读取成功,推理当前帧 + + # for rgb888planar if rgb888p_img.format() == image.RGBP888: - # (3.1)推理当前图像,并获取人脸检测结果 - dets = fd_kpu_run(kpu_face_detect,rgb888p_img) - # (3.2)针对每个人脸框,推理得到对应人脸关键点 - landmark_result = [] - for det in dets: - ret = fld_kpu_run(kpu_face_landmark,rgb888p_img,det) - landmark_result.append(ret) - # (3.3)将人脸关键点画到屏幕上 - display_draw(dets,landmark_result) + dets = kpu_run(kpu_falldown_detect,rgb888p_img) # 执行摔倒检测 kpu 运行 以及 后处理过程 + display_draw(dets) # 将得到的检测结果 绘制到 display - # (4)释放当前帧 - camera_release_image(CAM_DEV_ID_0,rgb888p_img) + camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - #with ScopedTiming("gc collect", debug_mode > 0): - #gc.collect() + if (count>10): + gc.collect() + count = 0 + else: + count += 1 + except Exception as e: - # 捕捉运行运行中异常,并打印错误 print(f"An error occurred during buffer used: {e}") finally: - # 释放当前帧 if rgb888p_img is not None: #先release掉申请的内存再stop camera_release_image(CAM_DEV_ID_0,rgb888p_img) - # 停止camera - camera_stop(CAM_DEV_ID_0) - # 释放显示资源 - display_deinit() - # 释放kpu资源 - fd_kpu_deinit(kpu_face_detect) - fld_kpu_deinit(kpu_face_landmark) - # 垃圾回收 + camera_stop(CAM_DEV_ID_0) # 停止 camera + display_deinit() # 释放 display + kpu_deinit(kpu_falldown_detect) # 释放 kpu gc.collect() - time.sleep(1) - # 释放媒体资源 - ret = media_deinit() + ret = media_deinit() # 释放 整个media if ret: - print("face_landmark_test, buffer_deinit failed") + print("falldown_detect_test, buffer_deinit failed") return ret - print("face_landmark_test end") + print("falldown_detect_test end") return 0 if __name__ == '__main__': - face_landmark_inference() + falldown_detect_inference() ``` -### 2. 人脸识别 +## 三、AI Demo多模型示例解析 -**人脸注册:** +### 1. 人脸关键点检测 ```python -import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 -import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 -import aidemo #aidemo模块,封装ai demo相关后处理、画图操作 -import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 -import time #时间统计 -import gc #垃圾回收模块 -import os #操作系统接口模块 -import math #数学模块 +import ulab.numpy as np # 类似python numpy操作,但也会有一些接口不同 +import nncase_runtime as nn # nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +from media.camera import * # 摄像头模块 +from media.display import * # 显示模块 +from media.media import * # 软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 +import aidemo # aidemo模块,封装ai demo相关后处理、画图操作 +import image # 图像模块,主要用于读取、图像绘制元素(框、点等)等操作 +import time # 时间统计 +import gc # 垃圾回收模块 +import os # 操作系统接口模块 +import math # 数学模块 + #********************for config.py******************** -# kmodel输入shape +# display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) # 显示宽度要求16位对齐 +DISPLAY_HEIGHT = 1080 + +# ai原图分辨率,sensor默认出图为16:9,若需不形变原图,最好按照16:9比例设置宽高 +OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) # ai原图宽度要求16位对齐 +OUT_RGB888P_HEIGH = 1080 + +# kmodel参数设置 # 人脸检测kmodel输入shape fd_kmodel_input_shape = (1,3,320,320) -# 人脸识别kmodel输入shape -fr_kmodel_input_shape = (1,3,112,112) +# 人脸关键点kmodel输入shape +fld_kmodel_input_shape = (1,3,192,192) # ai原图padding rgb_mean = [104,117,123] -#kmodel相关参数设置 -#人脸检测 -confidence_threshold = 0.5 #人脸检测阈值 +#人脸检测kmodel其它参数设置 +confidence_threshold = 0.5 # 人脸检测阈值 top_k = 5000 nms_threshold = 0.2 keep_top_k = 750 @@ -4484,25 +4313,46 @@ anchor_len = 4200 score_dim = 2 det_dim = 4 keypoint_dim = 10 -#人脸识别 -max_register_face = 100 #数据库最多人脸个数 -feature_num = 128 #人脸识别特征维度 # 文件配置 # 人脸检测kmodel root_dir = '/sdcard/app/tests/' fd_kmodel_file = root_dir + 'kmodel/face_detection_320.kmodel' -# 人脸识别kmodel -fr_kmodel_file = root_dir + 'kmodel/face_recognition.kmodel' -# 人脸检测anchor +# 人脸关键点kmodel +fr_kmodel_file = root_dir + 'kmodel/face_landmark.kmodel' +# anchor文件 anchors_path = root_dir + 'utils/prior_data_320.bin' -# 人脸注册数据库 -database_dir = root_dir + 'utils/db/' -# 人脸注册数据库原图 -database_img_dir = root_dir + 'utils/db_img/' # 调试模型,0:不调试,>0:打印对应级别调试信息 debug_mode = 0 +# 人脸关键点不同部位关键点列表 +dict_kp_seq = [ + [43, 44, 45, 47, 46, 50, 51, 49, 48], # left_eyebrow + [97, 98, 99, 100, 101, 105, 104, 103, 102], # right_eyebrow + [35, 36, 33, 37, 39, 42, 40, 41], # left_eye + [89, 90, 87, 91, 93, 96, 94, 95], # right_eye + [34, 88], # pupil + [72, 73, 74, 86], # bridge_nose + [77, 78, 79, 80, 85, 84, 83], # wing_nose + [52, 55, 56, 53, 59, 58, 61, 68, 67, 71, 63, 64], # out_lip + [65, 54, 60, 57, 69, 70, 62, 66], # in_lip + [1, 9, 10, 11, 12, 13, 14, 15, 16, 2, 3, 4, 5, 6, 7, 8, 0, 24, 23, 22, 21, 20, 19, 18, 32, 31, 30, 29, 28, 27, 26, 25, 17] # basin +] + +# 人脸关键点不同部位(顺序同dict_kp_seq)颜色配置,argb +color_list_for_osd_kp = [ + (255, 0, 255, 0), + (255, 0, 255, 0), + (255, 255, 0, 255), + (255, 255, 0, 255), + (255, 255, 0, 0), + (255, 255, 170, 0), + (255, 255, 255, 0), + (255, 0, 255, 255), + (255, 255, 220, 50), + (255, 30, 30, 255) +] + #********************for scoped_timing.py******************** # 时间统计类 class ScopedTiming: @@ -4521,51 +4371,51 @@ class ScopedTiming: print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") #********************for ai_utils.py******************** -global current_kmodel_obj #当前kpu实例 +global current_kmodel_obj #当前kpu对象 # fd_ai2d: 人脸检测ai2d实例 # fd_ai2d_input_tensor: 人脸检测ai2d输入 # fd_ai2d_output_tensor: 人脸检测ai2d输入 # fd_ai2d_builder: 根据人脸检测ai2d参数,构建的人脸检测ai2d_builder对象 global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder -# fr_ai2d: 人脸识别ai2d实例 -# fr_ai2d_input_tensor: 人脸识别ai2d输入 -# fr_ai2d_output_tensor: 人脸识别ai2d输入 -# fr_ai2d_builder: 根据人脸识别ai2d参数,构建的人脸识别ai2d_builder对象 -global fr_ai2d,fr_ai2d_input_tensor,fr_ai2d_output_tensor,fr_ai2d_builder -global valid_register_face #数据库中有效人脸个数 +# fld_ai2d: 人脸关键点ai2d实例 +# fld_ai2d_input_tensor: 人脸关键点ai2d输入 +# fld_ai2d_output_tensor:人脸关键点ai2d输入 +# fld_ai2d_builder: 根据人脸关键点ai2d参数,构建的人脸关键点ai2d_builder对象 +global fld_ai2d,fld_ai2d_input_tensor,fld_ai2d_output_tensor,fld_ai2d_builder +global matrix_dst #人脸仿射变换矩阵 #读取anchor文件,为人脸检测后处理做准备 print('anchors_path:',anchors_path) prior_data = np.fromfile(anchors_path, dtype=np.float) prior_data = prior_data.reshape((anchor_len,det_dim)) -def get_pad_one_side_param(rgb888p_img): +def get_pad_one_side_param(): # 右padding或下padding,获取padding参数 - with ScopedTiming("get_pad_one_side_param", debug_mode > 1): - dst_w = fd_kmodel_input_shape[3] # kmodel输入宽(w) - dst_h = fd_kmodel_input_shape[2] # kmodel输入高(h) - - # 计算最小的缩放比例,等比例缩放 - ratio_w = dst_w / rgb888p_img.shape[3] - ratio_h = dst_h / rgb888p_img.shape[2] - if ratio_w < ratio_h: - ratio = ratio_w - else: - ratio = ratio_h + dst_w = fd_kmodel_input_shape[3] # kmodel输入宽(w) + dst_h = fd_kmodel_input_shape[2] # kmodel输入高(h) - # 计算经过缩放后的新宽和新高 - new_w = (int)(ratio * rgb888p_img.shape[3]) - new_h = (int)(ratio * rgb888p_img.shape[2]) + # OUT_RGB888P_WIDTH:原图宽(w) + # OUT_RGB888P_HEIGH:原图高(h) + # 计算最小的缩放比例,等比例缩放 + ratio_w = dst_w / OUT_RGB888P_WIDTH + ratio_h = dst_h / OUT_RGB888P_HEIGH + if ratio_w < ratio_h: + ratio = ratio_w + else: + ratio = ratio_h + # 计算经过缩放后的新宽和新高 + new_w = (int)(ratio * OUT_RGB888P_WIDTH) + new_h = (int)(ratio * OUT_RGB888P_HEIGH) - # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 - dw = (dst_w - new_w) / 2 - dh = (dst_h - new_h) / 2 - # 四舍五入,确保padding是整数 - top = (int)(round(0)) - bottom = (int)(round(dh * 2 + 0.1)) - left = (int)(round(0)) - right = (int)(round(dw * 2 - 0.1)) - return [0, 0, 0, 0, top, bottom, left, right] + # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 + dw = (dst_w - new_w) / 2 + dh = (dst_h - new_h) / 2 + # 四舍五入,确保padding是整数 + top = (int)(round(0)) + bottom = (int)(round(dh * 2 + 0.1)) + left = (int)(round(0)) + right = (int)(round(dw * 2 - 0.1)) + return [0, 0, 0, 0, top, bottom, left, right] def fd_ai2d_init(): # 人脸检测模型ai2d初始化 @@ -4573,8 +4423,18 @@ def fd_ai2d_init(): # (1)创建人脸检测ai2d对象 global fd_ai2d fd_ai2d = nn.ai2d() + # (2)设置人脸检测ai2d参数 + fd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + fd_ai2d.set_pad_param(True, get_pad_one_side_param(), 0, rgb_mean) + fd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) - #(2)创建人脸检测ai2d_output_tensor,用于保存人脸检测ai2d输出 + #(3)人脸检测ai2d_builder,根据人脸检测ai2d参数、输入输出大小创建ai2d_builder对象 + global fd_ai2d_builder + fd_ai2d_builder = fd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fd_kmodel_input_shape) + + #(4)创建人脸检测ai2d_output_tensor,用于保存人脸检测ai2d输出 global fd_ai2d_output_tensor data = np.ones(fd_kmodel_input_shape, dtype=np.uint8) fd_ai2d_output_tensor = nn.from_numpy(data) @@ -4582,26 +4442,18 @@ def fd_ai2d_init(): def fd_ai2d_run(rgb888p_img): # 根据人脸检测ai2d参数,对原图rgb888p_img进行预处理 with ScopedTiming("fd_ai2d_run",debug_mode > 0): - global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder + global fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder # (1)根据原图构建ai2d_input_tensor对象 - fd_ai2d_input_tensor = nn.from_numpy(rgb888p_img) - # (2)根据新的图像设置新的人脸检测ai2d参数 - fd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, - nn.ai2d_format.NCHW_FMT, - np.uint8, np.uint8) - fd_ai2d.set_pad_param(True, get_pad_one_side_param(rgb888p_img), 0, rgb_mean) - fd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) - # (3)根据新的人脸检测ai2d参数,构建人脸检测ai2d_builder - fd_ai2d_builder = fd_ai2d.build(rgb888p_img.shape, fd_kmodel_input_shape) - # (4)运行人脸检测ai2d_builder,将结果保存到人脸检测ai2d_output_tensor中 + ai2d_input = rgb888p_img.to_numpy_ref() + fd_ai2d_input_tensor = nn.from_numpy(ai2d_input) + # (2)运行人脸检测ai2d_builder,将结果保存到人脸检测ai2d_output_tensor中 fd_ai2d_builder.run(fd_ai2d_input_tensor, fd_ai2d_output_tensor) def fd_ai2d_release(): - # 释放人脸检测ai2d部分资源 + # 释放人脸检测ai2d_input_tensor with ScopedTiming("fd_ai2d_release",debug_mode > 0): - global fd_ai2d_input_tensor,fd_ai2d_builder + global fd_ai2d_input_tensor del fd_ai2d_input_tensor - del fd_ai2d_builder def fd_kpu_init(kmodel_file): @@ -4652,841 +4504,4498 @@ def fd_kpu_run(kpu_obj,rgb888p_img): # (5)人脸检测kpu结果后处理 with ScopedTiming("fd kpu_post",debug_mode > 0): post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, - [rgb888p_img.shape[3],rgb888p_img.shape[2]],results) - # (6)返回人脸关键点 + [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) + # (6)返回人脸检测框 if len(post_ret)==0: return post_ret else: - return post_ret[0],post_ret[1] #0:det,1:landm,2:score + return post_ret[0] #0:det,1:landm,2:score -def fd_kpu_deinit(kpu_obj): +def fd_kpu_deinit(): # kpu释放 with ScopedTiming("fd_kpu_deinit",debug_mode > 0): global fd_ai2d, fd_ai2d_output_tensor - del kpu_obj #删除人脸检测kpu_obj变量,释放对它所引用对象的内存引用 del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 ###############for face recognition############### -# 标准5官 -umeyama_args_112 = [ - 38.2946 , 51.6963 , - 73.5318 , 51.5014 , - 56.0252 , 71.7366 , - 41.5493 , 92.3655 , - 70.7299 , 92.2041 -] - -def svd22(a): - # svd - s = [0.0, 0.0] - u = [0.0, 0.0, 0.0, 0.0] - v = [0.0, 0.0, 0.0, 0.0] - - s[0] = (math.sqrt((a[0] - a[3]) ** 2 + (a[1] + a[2]) ** 2) + math.sqrt((a[0] + a[3]) ** 2 + (a[1] - a[2]) ** 2)) / 2 - s[1] = abs(s[0] - math.sqrt((a[0] - a[3]) ** 2 + (a[1] + a[2]) ** 2)) - v[2] = math.sin((math.atan2(2 * (a[0] * a[1] + a[2] * a[3]), a[0] ** 2 - a[1] ** 2 + a[2] ** 2 - a[3] ** 2)) / 2) if \ - s[0] > s[1] else 0 - v[0] = math.sqrt(1 - v[2] ** 2) - v[1] = -v[2] - v[3] = v[0] - u[0] = -(a[0] * v[0] + a[1] * v[2]) / s[0] if s[0] != 0 else 1 - u[2] = -(a[2] * v[0] + a[3] * v[2]) / s[0] if s[0] != 0 else 0 - u[1] = (a[0] * v[1] + a[1] * v[3]) / s[1] if s[1] != 0 else -u[2] - u[3] = (a[2] * v[1] + a[3] * v[3]) / s[1] if s[1] != 0 else u[0] - v[0] = -v[0] - v[2] = -v[2] - - return u, s, v - - -def image_umeyama_112(src): - # 使用Umeyama算法计算仿射变换矩阵 - SRC_NUM = 5 - SRC_DIM = 2 - src_mean = [0.0, 0.0] - dst_mean = [0.0, 0.0] - - for i in range(0,SRC_NUM * 2,2): - src_mean[0] += src[i] - src_mean[1] += src[i + 1] - dst_mean[0] += umeyama_args_112[i] - dst_mean[1] += umeyama_args_112[i + 1] - - src_mean[0] /= SRC_NUM - src_mean[1] /= SRC_NUM - dst_mean[0] /= SRC_NUM - dst_mean[1] /= SRC_NUM - - src_demean = [[0.0, 0.0] for _ in range(SRC_NUM)] - dst_demean = [[0.0, 0.0] for _ in range(SRC_NUM)] - - for i in range(SRC_NUM): - src_demean[i][0] = src[2 * i] - src_mean[0] - src_demean[i][1] = src[2 * i + 1] - src_mean[1] - dst_demean[i][0] = umeyama_args_112[2 * i] - dst_mean[0] - dst_demean[i][1] = umeyama_args_112[2 * i + 1] - dst_mean[1] - - A = [[0.0, 0.0], [0.0, 0.0]] - for i in range(SRC_DIM): - for k in range(SRC_DIM): - for j in range(SRC_NUM): - A[i][k] += dst_demean[j][i] * src_demean[j][k] - A[i][k] /= SRC_NUM - - T = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] - U, S, V = svd22([A[0][0], A[0][1], A[1][0], A[1][1]]) - - T[0][0] = U[0] * V[0] + U[1] * V[2] - T[0][1] = U[0] * V[1] + U[1] * V[3] - T[1][0] = U[2] * V[0] + U[3] * V[2] - T[1][1] = U[2] * V[1] + U[3] * V[3] - - scale = 1.0 - src_demean_mean = [0.0, 0.0] - src_demean_var = [0.0, 0.0] - for i in range(SRC_NUM): - src_demean_mean[0] += src_demean[i][0] - src_demean_mean[1] += src_demean[i][1] - - src_demean_mean[0] /= SRC_NUM - src_demean_mean[1] /= SRC_NUM - - for i in range(SRC_NUM): - src_demean_var[0] += (src_demean_mean[0] - src_demean[i][0]) * (src_demean_mean[0] - src_demean[i][0]) - src_demean_var[1] += (src_demean_mean[1] - src_demean[i][1]) * (src_demean_mean[1] - src_demean[i][1]) - - src_demean_var[0] /= SRC_NUM - src_demean_var[1] /= SRC_NUM - - scale = 1.0 / (src_demean_var[0] + src_demean_var[1]) * (S[0] + S[1]) - T[0][2] = dst_mean[0] - scale * (T[0][0] * src_mean[0] + T[0][1] * src_mean[1]) - T[1][2] = dst_mean[1] - scale * (T[1][0] * src_mean[0] + T[1][1] * src_mean[1]) - T[0][0] *= scale - T[0][1] *= scale - T[1][0] *= scale - T[1][1] *= scale - return T - -def get_affine_matrix(sparse_points): - # 获取affine变换矩阵 +def get_affine_matrix(bbox): + # 获取仿射矩阵,用于将边界框映射到模型输入空间 with ScopedTiming("get_affine_matrix", debug_mode > 1): - # 使用Umeyama算法计算仿射变换矩阵 - matrix_dst = image_umeyama_112(sparse_points) - matrix_dst = [matrix_dst[0][0],matrix_dst[0][1],matrix_dst[0][2], - matrix_dst[1][0],matrix_dst[1][1],matrix_dst[1][2]] + # 从边界框提取坐标和尺寸 + x1, y1, w, h = map(lambda x: int(round(x, 0)), bbox[:4]) + # 计算缩放比例,使得边界框映射到模型输入空间的一部分 + scale_ratio = (fld_kmodel_input_shape[2]) / (max(w, h) * 1.5) + # 计算边界框中心点在模型输入空间的坐标 + cx = (x1 + w / 2) * scale_ratio + cy = (y1 + h / 2) * scale_ratio + # 计算模型输入空间的一半长度 + half_input_len = fld_kmodel_input_shape[2] / 2 + + # 创建仿射矩阵并进行设置 + matrix_dst = np.zeros((2, 3), dtype=np.float) + matrix_dst[0, 0] = scale_ratio + matrix_dst[0, 1] = 0 + matrix_dst[0, 2] = half_input_len - cx + matrix_dst[1, 0] = 0 + matrix_dst[1, 1] = scale_ratio + matrix_dst[1, 2] = half_input_len - cy return matrix_dst -def fr_ai2d_init(): - with ScopedTiming("fr_ai2d_init",debug_mode > 0): - # (1)人脸识别ai2d初始化 - global fr_ai2d - fr_ai2d = nn.ai2d() +def fld_ai2d_init(): + # 人脸关键点ai2d初始化 + with ScopedTiming("fld_ai2d_init",debug_mode > 0): + # (1)创建人脸关键点ai2d对象 + global fld_ai2d + fld_ai2d = nn.ai2d() - # (2)人脸识别ai2d_output_tensor初始化,用于存放ai2d输出 - global fr_ai2d_output_tensor - data = np.ones(fr_kmodel_input_shape, dtype=np.uint8) - fr_ai2d_output_tensor = nn.from_numpy(data) + # (2)创建人脸关键点ai2d_output_tensor对象,用于存放ai2d输出 + global fld_ai2d_output_tensor + data = np.ones(fld_kmodel_input_shape, dtype=np.uint8) + fld_ai2d_output_tensor = nn.from_numpy(data) -def fr_ai2d_run(rgb888p_img,sparse_points): - # 人脸识别ai2d推理 - with ScopedTiming("fr_ai2d_run",debug_mode > 0): - global fr_ai2d,fr_ai2d_input_tensor,fr_ai2d_output_tensor - #(1)根据原图创建人脸识别ai2d_input_tensor对象 - fr_ai2d_input_tensor = nn.from_numpy(rgb888p_img) - #(2)根据新的人脸关键点设置新的人脸识别ai2d参数 - fr_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, +def fld_ai2d_run(rgb888p_img,det): + # 人脸关键点ai2d推理 + with ScopedTiming("fld_ai2d_run",debug_mode > 0): + global fld_ai2d,fld_ai2d_input_tensor,fld_ai2d_output_tensor + #(1)根据原图ai2d_input_tensor对象 + ai2d_input = rgb888p_img.to_numpy_ref() + fld_ai2d_input_tensor = nn.from_numpy(ai2d_input) + + # (2)根据新的det设置新的人脸关键点ai2d参数 + fld_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) - affine_matrix = get_affine_matrix(sparse_points) - fr_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,affine_matrix) - global fr_ai2d_builder - # (3)根据新的人脸识别ai2d参数,构建识别ai2d_builder - fr_ai2d_builder = fr_ai2d.build(rgb888p_img.shape, fr_kmodel_input_shape) - # (4)推理人脸识别ai2d,将预处理的结果保存到fr_ai2d_output_tensor - fr_ai2d_builder.run(fr_ai2d_input_tensor, fr_ai2d_output_tensor) + global matrix_dst + matrix_dst = get_affine_matrix(det) + affine_matrix = [matrix_dst[0][0],matrix_dst[0][1],matrix_dst[0][2], + matrix_dst[1][0],matrix_dst[1][1],matrix_dst[1][2]] + fld_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,affine_matrix) -def fr_ai2d_release(): - # 释放人脸识别ai2d_input_tensor、ai2d_builder - with ScopedTiming("fr_ai2d_release",debug_mode > 0): - global fr_ai2d_input_tensor,fr_ai2d_builder - del fr_ai2d_input_tensor - del fr_ai2d_builder + # (3)根据新的人脸关键点ai2d参数,构建人脸关键点ai2d_builder + global fld_ai2d_builder + fld_ai2d_builder = fld_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fld_kmodel_input_shape) + # (4)推理人脸关键点ai2d,将预处理的结果保存到fld_ai2d_output_tensor + fld_ai2d_builder.run(fld_ai2d_input_tensor, fld_ai2d_output_tensor) -def fr_kpu_init(kmodel_file): - # 人脸识别kpu初始化 - with ScopedTiming("fr_kpu_init",debug_mode > 0): - # 初始化人脸识别kpu对象 +def fld_ai2d_release(): + # 释放人脸关键点ai2d_input_tensor、ai2d_builder + with ScopedTiming("fld_ai2d_release",debug_mode > 0): + global fld_ai2d_input_tensor,fld_ai2d_builder + del fld_ai2d_input_tensor + del fld_ai2d_builder + +def fld_kpu_init(kmodel_file): + # 人脸关键点kpu初始化 + with ScopedTiming("fld_kpu_init",debug_mode > 0): + # 初始化人脸关键点kpu对象 kpu_obj = nn.kpu() - # 加载人脸识别kmodel + # 加载人脸关键点kmodel kpu_obj.load_kmodel(kmodel_file) - # 初始化人脸识别ai2d - fr_ai2d_init() + # 初始化人脸关键点ai2d + fld_ai2d_init() return kpu_obj -def fr_kpu_pre_process(rgb888p_img,sparse_points): - # 人脸识别kpu预处理 - # 人脸识别ai2d推理,根据关键点对原图进行预处理 - fr_ai2d_run(rgb888p_img,sparse_points) - with ScopedTiming("fr_kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,fr_ai2d_output_tensor - # 将人脸识别ai2d输出设置为人脸识别kpu输入 - current_kmodel_obj.set_input_tensor(0, fr_ai2d_output_tensor) - - #ai2d_out_data = fr_ai2d_output_tensor.to_numpy() - #print('ai2d_out_data.shape:',ai2d_out_data.shape) +def fld_kpu_pre_process(rgb888p_img,det): + # 人脸关键点kpu预处理 + # 人脸关键点ai2d推理,根据det对原图进行预处理 + fld_ai2d_run(rgb888p_img,det) + with ScopedTiming("fld_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,fld_ai2d_output_tensor + # 将人脸关键点ai2d输出设置为人脸关键点kpu输入 + current_kmodel_obj.set_input_tensor(0, fld_ai2d_output_tensor) + #ai2d_out_data = fld_ai2d_output_tensor.to_numpy() #with open("/sdcard/app/ai2d_out.bin", "wb") as file: #file.write(ai2d_out_data.tobytes()) -def fr_kpu_get_output(): - # 获取人脸识别kpu输出 - with ScopedTiming("fr_kpu_get_output",debug_mode > 0): +def fld_kpu_get_output(): + with ScopedTiming("fld_kpu_get_output",debug_mode > 0): global current_kmodel_obj + # 获取人脸关键点kpu输出 data = current_kmodel_obj.get_output_tensor(0) result = data.to_numpy() del data - return result[0] + return result -def fr_kpu_run(kpu_obj,rgb888p_img,sparse_points): - # 人脸识别kpu推理 - global current_kmodel_obj - current_kmodel_obj = kpu_obj - # (1)人脸识别kpu预处理,设置kpu输入 - fr_kpu_pre_process(rgb888p_img,sparse_points) - # (2)人脸识别kpu推理 - with ScopedTiming("fr kpu_run",debug_mode > 0): - kpu_obj.run() - # (3)释放人脸识别ai2d - fr_ai2d_release() - # (4)获取人脸识别kpu输出 - results = fr_kpu_get_output() - return results +def fld_kpu_post_process(pred): + # 人脸关键点kpu推理结果后处理 + with ScopedTiming("fld_kpu_post_process",debug_mode > 0): + # (1)将人脸关键点输出变换模型输入 + half_input_len = fld_kmodel_input_shape[2] // 2 + pred = pred.flatten() + for i in range(len(pred)): + pred[i] += (pred[i] + 1) * half_input_len -def fr_kpu_deinit(kpu_obj): - # 人脸识别kpu相关资源释放 - with ScopedTiming("fr_kpu_deinit",debug_mode > 0): - global fr_ai2d - del kpu_obj - del fr_ai2d + # (2)获取仿射矩阵的逆矩阵 + global matrix_dst + matrix_dst_inv = aidemo.invert_affine_transform(matrix_dst) + matrix_dst_inv = matrix_dst_inv.flatten() -#********************for face_detect.py******************** -def image2rgb888array(img): #4维 - # 将Image转换为rgb888格式 - with ScopedTiming("fr_kpu_deinit",debug_mode > 0): - img_data_rgb888=img.to_rgb888() - # hwc,rgb888 - img_hwc=img_data_rgb888.to_numpy_ref() - shape=img_hwc.shape - img_tmp = img_hwc.reshape((shape[0] * shape[1], shape[2])) - img_tmp_trans = img_tmp.transpose() - img_res=img_tmp_trans.copy() - # chw,rgb888 - img_return=img_res.reshape((1,shape[2],shape[0],shape[1])) - return img_return - -def face_registration_inference(): - print("face_registration_test start") - # 人脸检测kpu初始化 - kpu_face_detect = fd_kpu_init(fd_kmodel_file) - # 人脸识别kpu初始化 - kpu_face_reg = fr_kpu_init(fr_kmodel_file) - try: - # 获取图像列表 - img_list = os.listdir(database_img_dir) - for img_file in img_list: - with ScopedTiming("total",1): - # (1)读取一张图像 - full_img_file = database_img_dir + img_file - print(full_img_file) - img = image.Image(full_img_file) - rgb888p_img_ndarry = image2rgb888array(img) + # (3)对每个关键点进行逆变换 + half_out_len = len(pred) // 2 + for kp_id in range(half_out_len): + old_x = pred[kp_id * 2] + old_y = pred[kp_id * 2 + 1] - #(2)推理得到人脸检测kpu,得到人脸检测框、人脸五点 - dets,landms = fd_kpu_run(kpu_face_detect,rgb888p_img_ndarry) - if dets: - if dets.shape[0] == 1: - #(3)若是只检测到一张人脸,则将该人脸注册到数据库 - db_i_name = img_file.split('.')[0] - for landm in landms: - reg_result = fr_kpu_run(kpu_face_reg,rgb888p_img_ndarry,landm) - #print('\nwrite bin:',database_dir+'{}.bin'.format(db_i_name)) - with open(database_dir+'{}.bin'.format(db_i_name), "wb") as file: - file.write(reg_result.tobytes()) - else: - print('Only one person in a picture when you sign up') - else: - print('No person detected') + # 逆变换公式 + new_x = old_x * matrix_dst_inv[0] + old_y * matrix_dst_inv[1] + matrix_dst_inv[2] + new_y = old_x * matrix_dst_inv[3] + old_y * matrix_dst_inv[4] + matrix_dst_inv[5] - gc.collect() - except Exception as e: - print(f"An error occurred during buffer used: {e}") - finally: - # 释放kpu资源 - fd_kpu_deinit(kpu_face_detect) - fr_kpu_deinit(kpu_face_reg) - # 垃圾回收 - gc.collect() - time.sleep(1) + pred[kp_id * 2] = new_x + pred[kp_id * 2 + 1] = new_y - print("face_registration_test end") - return 0 + return pred -if __name__ == '__main__': - face_registration_inference() -``` +def fld_kpu_run(kpu_obj,rgb888p_img,det): + # 人脸关键点kpu推理 + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)人脸关键点kpu预处理,设置kpu输入 + fld_kpu_pre_process(rgb888p_img,det) + # (2)人脸关键点kpu推理 + with ScopedTiming("fld_kpu_run",debug_mode > 0): + kpu_obj.run() + # (3)释放人脸关键点ai2d + fld_ai2d_release() + # (4)获取人脸关键点kpu输出 + result = fld_kpu_get_output() + # (5)人脸关键点后处理 + result = fld_kpu_post_process(result) + return result -**人脸识别:** +def fld_kpu_deinit(): + # 人脸关键点kpu释放 + with ScopedTiming("fld_kpu_deinit",debug_mode > 0): + global fld_ai2d,fld_ai2d_output_tensor + del fld_ai2d # 删除fld_ai2d变量,释放对它所引用对象的内存引用 + del fld_ai2d_output_tensor # 删除fld_ai2d_output_tensor变量,释放对它所引用对象的内存引用 -```python -import ulab.numpy as np # 类似python numpy操作,但也会有一些接口不同 -import nncase_runtime as nn # nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 -from media.camera import * # 摄像头模块 -from media.display import * # 显示模块 -from media.media import * # 软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 -import aidemo # aidemo模块,封装ai demo相关后处理、画图操作 -import image # 图像模块,主要用于读取、图像绘制元素(框、点等)等操作 -import time # 时间统计 -import gc # 垃圾回收模块 -import os # 操作系统接口模块 -import math # 数学模块 +#********************for media_utils.py******************** +global draw_img_ulab,draw_img,osd_img #for display +global buffer,media_source,media_sink #for media -#********************for config.py******************** -# display分辨率 -DISPLAY_WIDTH = ALIGN_UP(1920, 16) # 显示宽度要求16位对齐 -DISPLAY_HEIGHT = 1080 +# for display,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.2 +def display_init(): + # 设置使用hdmi进行显示 + display.init(LT9611_1920X1080_30FPS) + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) -# ai原图分辨率,sensor默认出图为16:9,若需不形变原图,最好按照16:9比例设置宽高 -OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) # ai原图宽度要求16位对齐 -OUT_RGB888P_HEIGH = 1080 +def display_deinit(): + # 释放显示资源 + display.deinit() -# kmodel输入shape -# 人脸检测kmodel输入shape -fd_kmodel_input_shape = (1,3,320,320) -# 人脸识别kmodel输入shape -fr_kmodel_input_shape = (1,3,112,112) -# ai原图padding -rgb_mean = [104,117,123] +def display_draw(dets,landmark_preds): + # 在显示器画人脸轮廓 + with ScopedTiming("display_draw",debug_mode >0): + global draw_img_ulab,draw_img,osd_img + if dets: + draw_img.clear() + for pred in landmark_preds: + # (1)获取单个人脸框对应的人脸关键点 + for sub_part_index in range(len(dict_kp_seq)): + # (2)构建人脸某个区域关键点集 + sub_part = dict_kp_seq[sub_part_index] + face_sub_part_point_set = [] + for kp_index in range(len(sub_part)): + real_kp_index = sub_part[kp_index] + x, y = pred[real_kp_index * 2], pred[real_kp_index * 2 + 1] -#kmodel相关参数设置 -#人脸检测 -confidence_threshold = 0.5 #人脸检测阈值 -top_k = 5000 -nms_threshold = 0.2 -keep_top_k = 750 -vis_thres = 0.5 -variance = [0.1, 0.2] -anchor_len = 4200 -score_dim = 2 -det_dim = 4 -keypoint_dim = 10 -#人脸识别 -max_register_face = 100 # 数据库最多人脸个数 -feature_num = 128 # 人脸识别特征维度 -face_recognition_threshold = 0.75 # 人脸识别阈值 + x = int(x * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) + y = int(y * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) + face_sub_part_point_set.append((x, y)) -#文件配置 -# 人脸检测kmodel -root_dir = '/sdcard/app/tests/' -fd_kmodel_file = root_dir + 'kmodel/face_detection_320.kmodel' -# 人脸识别kmodel -fr_kmodel_file = root_dir + 'kmodel/face_recognition.kmodel' -# 人脸检测anchor -anchors_path = root_dir + 'utils/prior_data_320.bin' -# 人脸数据库 -database_dir = root_dir + 'utils/db/' -# 调试模型,0:不调试,>0:打印对应级别调试信息 -debug_mode = 0 + # (3)画人脸不同区域的轮廓 + if sub_part_index in (9, 6): + color = np.array(color_list_for_osd_kp[sub_part_index],dtype = np.uint8) + face_sub_part_point_set = np.array(face_sub_part_point_set) -#********************for scoped_timing.py******************** -# 时间统计类 -class ScopedTiming: - def __init__(self, info="", enable_profile=True): - self.info = info - self.enable_profile = enable_profile + aidemo.polylines(draw_img_ulab, face_sub_part_point_set,False,color,5,8,0) - def __enter__(self): - if self.enable_profile: - self.start_time = time.time_ns() - return self + elif sub_part_index == 4: + color = color_list_for_osd_kp[sub_part_index] + for kp in face_sub_part_point_set: + x,y = kp[0],kp[1] + draw_img.draw_circle(x,y ,2, color, 1) + else: + color = np.array(color_list_for_osd_kp[sub_part_index],dtype = np.uint8) + face_sub_part_point_set = np.array(face_sub_part_point_set) + aidemo.contours(draw_img_ulab, face_sub_part_point_set,-1,color,2,8) - def __exit__(self, exc_type, exc_value, traceback): - if self.enable_profile: - elapsed_time = time.time_ns() - self.start_time - print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") + # (4)将轮廓结果拷贝到osd + draw_img.copy_to(osd_img) + # (5)将osd显示到屏幕 + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + else: + # (1)清空用来画框的图像 + draw_img.clear() + # (2)清空osd + draw_img.copy_to(osd_img) + # (3)显示透明图层 + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) -#********************for ai_utils.py******************** -global current_kmodel_obj #当前kpu实例 -# fd_ai2d: 人脸检测ai2d实例 -# fd_ai2d_input_tensor: 人脸检测ai2d输入 -# fd_ai2d_output_tensor: 人脸检测ai2d输入 -# fd_ai2d_builder: 根据人脸检测ai2d参数,构建的人脸检测ai2d_builder对象 -global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder -# fr_ai2d: 人脸识别ai2d实例 -# fr_ai2d_input_tensor: 人脸识别ai2d输入 -# fr_ai2d_output_tensor: 人脸识别ai2d输入 -# fr_ai2d_builder: 根据人脸识别ai2d参数,构建的人脸识别ai2d_builder对象 -global fr_ai2d,fr_ai2d_input_tensor,fr_ai2d_output_tensor,fr_ai2d_builder -# valid_register_face: 数据库中有效人脸个数 -# db_name: 数据库人名列表 -# db_data: 数据库特征列表 -global valid_register_face,db_name,db_data +#for camera,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.1 +def camera_init(dev_id): + # camera初始化 + camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) -#读取anchor文件,为人脸检测后处理做准备 -print('anchors_path:',anchors_path) -prior_data = np.fromfile(anchors_path, dtype=np.float) -prior_data = prior_data.reshape((anchor_len,det_dim)) + # set chn0 output yuv420sp + camera.set_outsize(dev_id, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) -def get_pad_one_side_param(): - # 右padding或下padding,获取padding参数 - dst_w = fd_kmodel_input_shape[3] # kmodel输入宽(w) - dst_h = fd_kmodel_input_shape[2] # kmodel输入高(h) + # set chn2 output rgb88planar + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) - # OUT_RGB888P_WIDTH:原图宽(w) - # OUT_RGB888P_HEIGH:原图高(h) - # 计算最小的缩放比例,等比例缩放 - ratio_w = dst_w / OUT_RGB888P_WIDTH - ratio_h = dst_h / OUT_RGB888P_HEIGH - if ratio_w < ratio_h: - ratio = ratio_w - else: - ratio = ratio_h - # 计算经过缩放后的新宽和新高 - new_w = (int)(ratio * OUT_RGB888P_WIDTH) - new_h = (int)(ratio * OUT_RGB888P_HEIGH) +def camera_start(dev_id): + # camera启动 + camera.start_stream(dev_id) - # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 +def camera_read(dev_id): + # 读取一帧图像 + with ScopedTiming("camera_read",debug_mode >0): + rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) + return rgb888p_img + +def camera_release_image(dev_id,rgb888p_img): + # 释放一帧图像 + with ScopedTiming("camera_release_image",debug_mode >0): + camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) + +def camera_stop(dev_id): + # 停止camera + camera.stop_stream(dev_id) + +#for media,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.3 +def media_init(): + # meida初始化 + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + + ret = media.buffer_config(config) + + global media_source, media_sink + media_source = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + media_sink = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + media.create_link(media_source, media_sink) + + # 初始化多媒体buffer + ret = media.buffer_init() + if ret: + return ret + global buffer, draw_img_ulab,draw_img, osd_img + buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # 用于画框 + draw_img_ulab = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_REF,data = draw_img_ulab) + # 用于拷贝画框结果,防止画框过程中发生buffer搬运 + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, + phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) + return ret + +def media_deinit(): + # meida资源释放 + global buffer,media_source, media_sink + media.release_buffer(buffer) + media.destroy_link(media_source, media_sink) + + ret = media.buffer_deinit() + return ret + +#********************for face_detect.py******************** +def face_landmark_inference(): + print("face_landmark_test start") + # 人脸检测kpu初始化 + kpu_face_detect = fd_kpu_init(fd_kmodel_file) + # 人脸关键点kpu初始化 + kpu_face_landmark = fld_kpu_init(fr_kmodel_file) + # camera初始化 + camera_init(CAM_DEV_ID_0) + # 显示初始化 + display_init() + + rgb888p_img = None + # 注意:将一定要将一下过程包在try中,用于保证程序停止后,资源释放完毕;确保下次程序仍能正常运行 + try: + # 注意:媒体初始化(注:媒体初始化必须在camera_start之前,确保media缓冲区已配置完全) + ret = media_init() + if ret: + print("face_detect_test, buffer init failed") + return ret + + # 启动camera + camera_start(CAM_DEV_ID_0) + time.sleep(5) + gc_count = 0 + while True: + with ScopedTiming("total",1): + # (1)读取一帧图像 + rgb888p_img = camera_read(CAM_DEV_ID_0) + # (2)若读取失败,释放当前帧 + if rgb888p_img == -1: + print("face_detect_test, capture_image failed") + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + continue + # (3)若读取成功,推理当前帧 + if rgb888p_img.format() == image.RGBP888: + # (3.1)推理当前图像,并获取人脸检测结果 + dets = fd_kpu_run(kpu_face_detect,rgb888p_img) + # (3.2)针对每个人脸框,推理得到对应人脸关键点 + landmark_result = [] + for det in dets: + ret = fld_kpu_run(kpu_face_landmark,rgb888p_img,det) + landmark_result.append(ret) + # (3.3)将人脸关键点画到屏幕上 + display_draw(dets,landmark_result) + + # (4)释放当前帧 + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + if gc_count > 5: + gc.collect() + gc_count = 0 + else: + gc_count += 1 + except Exception as e: + # 捕捉运行运行中异常,并打印错误 + print(f"An error occurred during buffer used: {e}") + finally: + # 释放当前帧 + if rgb888p_img is not None: + #先release掉申请的内存再stop + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + + # 停止camera + camera_stop(CAM_DEV_ID_0) + # 释放显示资源 + display_deinit() + # 释放kpu资源 + fd_kpu_deinit() + fld_kpu_deinit() + global current_kmodel_obj + del current_kmodel_obj + del kpu_face_detect + del kpu_face_landmark + # 垃圾回收 + gc.collect() + time.sleep(1) + # 释放媒体资源 + ret = media_deinit() + if ret: + print("face_landmark_test, buffer_deinit failed") + return ret + + print("face_landmark_test end") + return 0 + +if __name__ == '__main__': + face_landmark_inference() +``` + +### 2. 人脸识别 + +**人脸注册:** + +```python +import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 +import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +import aidemo #aidemo模块,封装ai demo相关后处理、画图操作 +import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 +import time #时间统计 +import gc #垃圾回收模块 +import os #操作系统接口模块 +import math #数学模块 + +#********************for config.py******************** +# kmodel输入shape +# 人脸检测kmodel输入shape +fd_kmodel_input_shape = (1,3,320,320) +# 人脸识别kmodel输入shape +fr_kmodel_input_shape = (1,3,112,112) +# ai原图padding +rgb_mean = [104,117,123] + +#kmodel相关参数设置 +#人脸检测 +confidence_threshold = 0.5 #人脸检测阈值 +top_k = 5000 +nms_threshold = 0.2 +keep_top_k = 750 +vis_thres = 0.5 +variance = [0.1, 0.2] +anchor_len = 4200 +score_dim = 2 +det_dim = 4 +keypoint_dim = 10 +#人脸识别 +max_register_face = 100 #数据库最多人脸个数 +feature_num = 128 #人脸识别特征维度 + +# 文件配置 +# 人脸检测kmodel +root_dir = '/sdcard/app/tests/' +fd_kmodel_file = root_dir + 'kmodel/face_detection_320.kmodel' +# 人脸识别kmodel +fr_kmodel_file = root_dir + 'kmodel/face_recognition.kmodel' +# 人脸检测anchor +anchors_path = root_dir + 'utils/prior_data_320.bin' +# 人脸注册数据库 +database_dir = root_dir + 'utils/db/' +# 人脸注册数据库原图 +database_img_dir = root_dir + 'utils/db_img/' +# 调试模型,0:不调试,>0:打印对应级别调试信息 +debug_mode = 0 + +#********************for scoped_timing.py******************** +# 时间统计类 +class ScopedTiming: + def __init__(self, info="", enable_profile=True): + self.info = info + self.enable_profile = enable_profile + + def __enter__(self): + if self.enable_profile: + self.start_time = time.time_ns() + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.enable_profile: + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") + +#********************for ai_utils.py******************** +global current_kmodel_obj #当前kpu实例 +# fd_ai2d: 人脸检测ai2d实例 +# fd_ai2d_input_tensor: 人脸检测ai2d输入 +# fd_ai2d_output_tensor: 人脸检测ai2d输入 +# fd_ai2d_builder: 根据人脸检测ai2d参数,构建的人脸检测ai2d_builder对象 +global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder +# fr_ai2d: 人脸识别ai2d实例 +# fr_ai2d_input_tensor: 人脸识别ai2d输入 +# fr_ai2d_output_tensor: 人脸识别ai2d输入 +# fr_ai2d_builder: 根据人脸识别ai2d参数,构建的人脸识别ai2d_builder对象 +global fr_ai2d,fr_ai2d_input_tensor,fr_ai2d_output_tensor,fr_ai2d_builder +global valid_register_face #数据库中有效人脸个数 + +#读取anchor文件,为人脸检测后处理做准备 +print('anchors_path:',anchors_path) +prior_data = np.fromfile(anchors_path, dtype=np.float) +prior_data = prior_data.reshape((anchor_len,det_dim)) + +def get_pad_one_side_param(rgb888p_img): + # 右padding或下padding,获取padding参数 + with ScopedTiming("get_pad_one_side_param", debug_mode > 1): + dst_w = fd_kmodel_input_shape[3] # kmodel输入宽(w) + dst_h = fd_kmodel_input_shape[2] # kmodel输入高(h) + + # 计算最小的缩放比例,等比例缩放 + ratio_w = dst_w / rgb888p_img.shape[3] + ratio_h = dst_h / rgb888p_img.shape[2] + if ratio_w < ratio_h: + ratio = ratio_w + else: + ratio = ratio_h + + # 计算经过缩放后的新宽和新高 + new_w = (int)(ratio * rgb888p_img.shape[3]) + new_h = (int)(ratio * rgb888p_img.shape[2]) + + # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 + dw = (dst_w - new_w) / 2 + dh = (dst_h - new_h) / 2 + # 四舍五入,确保padding是整数 + top = (int)(round(0)) + bottom = (int)(round(dh * 2 + 0.1)) + left = (int)(round(0)) + right = (int)(round(dw * 2 - 0.1)) + return [0, 0, 0, 0, top, bottom, left, right] + +def fd_ai2d_init(): + # 人脸检测模型ai2d初始化 + with ScopedTiming("fd_ai2d_init",debug_mode > 0): + # (1)创建人脸检测ai2d对象 + global fd_ai2d + fd_ai2d = nn.ai2d() + + #(2)创建人脸检测ai2d_output_tensor,用于保存人脸检测ai2d输出 + global fd_ai2d_output_tensor + data = np.ones(fd_kmodel_input_shape, dtype=np.uint8) + fd_ai2d_output_tensor = nn.from_numpy(data) + +def fd_ai2d_run(rgb888p_img): + # 根据人脸检测ai2d参数,对原图rgb888p_img进行预处理 + with ScopedTiming("fd_ai2d_run",debug_mode > 0): + global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder + # (1)根据原图构建ai2d_input_tensor对象 + fd_ai2d_input_tensor = nn.from_numpy(rgb888p_img) + # (2)根据新的图像设置新的人脸检测ai2d参数 + fd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + fd_ai2d.set_pad_param(True, get_pad_one_side_param(rgb888p_img), 0, rgb_mean) + fd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + # (3)根据新的人脸检测ai2d参数,构建人脸检测ai2d_builder + fd_ai2d_builder = fd_ai2d.build(rgb888p_img.shape, fd_kmodel_input_shape) + # (4)运行人脸检测ai2d_builder,将结果保存到人脸检测ai2d_output_tensor中 + fd_ai2d_builder.run(fd_ai2d_input_tensor, fd_ai2d_output_tensor) + +def fd_ai2d_release(): + # 释放人脸检测ai2d部分资源 + with ScopedTiming("fd_ai2d_release",debug_mode > 0): + global fd_ai2d_input_tensor,fd_ai2d_builder + del fd_ai2d_input_tensor + del fd_ai2d_builder + + +def fd_kpu_init(kmodel_file): + # 初始化人脸检测kpu对象,并加载kmodel + with ScopedTiming("fd_kpu_init",debug_mode > 0): + # 初始化人脸检测kpu对象 + kpu_obj = nn.kpu() + # 加载人脸检测kmodel + kpu_obj.load_kmodel(kmodel_file) + # 初始化人脸检测ai2d + fd_ai2d_init() + return kpu_obj + +def fd_kpu_pre_process(rgb888p_img): + # 设置人脸检测kpu输入 + # 使用人脸检测ai2d对原图进行预处理(padding,resize) + fd_ai2d_run(rgb888p_img) + with ScopedTiming("fd_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,fd_ai2d_output_tensor + # 设置人脸检测kpu输入 + current_kmodel_obj.set_input_tensor(0, fd_ai2d_output_tensor) + +def fd_kpu_get_output(): + # 获取人脸检测kpu输出 + with ScopedTiming("fd_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + # 获取模型输出,并将结果转换为numpy,以便进行人脸检测后处理 + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + del data + results.append(result) + return results + +def fd_kpu_run(kpu_obj,rgb888p_img): + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)原图预处理,并设置模型输入 + fd_kpu_pre_process(rgb888p_img) + # (2)人脸检测kpu推理 + with ScopedTiming("fd kpu_run",debug_mode > 0): + kpu_obj.run() + # (3)释放人脸检测ai2d资源 + fd_ai2d_release() + # (4)获取人俩检测kpu输出 + results = fd_kpu_get_output() + # (5)人脸检测kpu结果后处理 + with ScopedTiming("fd kpu_post",debug_mode > 0): + post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, + [rgb888p_img.shape[3],rgb888p_img.shape[2]],results) + # (6)返回人脸关键点 + if len(post_ret)==0: + return post_ret + else: + return post_ret[0],post_ret[1] #0:det,1:landm,2:score + +def fd_kpu_deinit(): + # kpu释放 + with ScopedTiming("fd_kpu_deinit",debug_mode > 0): + global fd_ai2d, fd_ai2d_output_tensor + del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 + del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 + +###############for face recognition############### +# 标准5官 +umeyama_args_112 = [ + 38.2946 , 51.6963 , + 73.5318 , 51.5014 , + 56.0252 , 71.7366 , + 41.5493 , 92.3655 , + 70.7299 , 92.2041 +] + +def svd22(a): + # svd + s = [0.0, 0.0] + u = [0.0, 0.0, 0.0, 0.0] + v = [0.0, 0.0, 0.0, 0.0] + + s[0] = (math.sqrt((a[0] - a[3]) ** 2 + (a[1] + a[2]) ** 2) + math.sqrt((a[0] + a[3]) ** 2 + (a[1] - a[2]) ** 2)) / 2 + s[1] = abs(s[0] - math.sqrt((a[0] - a[3]) ** 2 + (a[1] + a[2]) ** 2)) + v[2] = math.sin((math.atan2(2 * (a[0] * a[1] + a[2] * a[3]), a[0] ** 2 - a[1] ** 2 + a[2] ** 2 - a[3] ** 2)) / 2) if \ + s[0] > s[1] else 0 + v[0] = math.sqrt(1 - v[2] ** 2) + v[1] = -v[2] + v[3] = v[0] + u[0] = -(a[0] * v[0] + a[1] * v[2]) / s[0] if s[0] != 0 else 1 + u[2] = -(a[2] * v[0] + a[3] * v[2]) / s[0] if s[0] != 0 else 0 + u[1] = (a[0] * v[1] + a[1] * v[3]) / s[1] if s[1] != 0 else -u[2] + u[3] = (a[2] * v[1] + a[3] * v[3]) / s[1] if s[1] != 0 else u[0] + v[0] = -v[0] + v[2] = -v[2] + + return u, s, v + + +def image_umeyama_112(src): + # 使用Umeyama算法计算仿射变换矩阵 + SRC_NUM = 5 + SRC_DIM = 2 + src_mean = [0.0, 0.0] + dst_mean = [0.0, 0.0] + + for i in range(0,SRC_NUM * 2,2): + src_mean[0] += src[i] + src_mean[1] += src[i + 1] + dst_mean[0] += umeyama_args_112[i] + dst_mean[1] += umeyama_args_112[i + 1] + + src_mean[0] /= SRC_NUM + src_mean[1] /= SRC_NUM + dst_mean[0] /= SRC_NUM + dst_mean[1] /= SRC_NUM + + src_demean = [[0.0, 0.0] for _ in range(SRC_NUM)] + dst_demean = [[0.0, 0.0] for _ in range(SRC_NUM)] + + for i in range(SRC_NUM): + src_demean[i][0] = src[2 * i] - src_mean[0] + src_demean[i][1] = src[2 * i + 1] - src_mean[1] + dst_demean[i][0] = umeyama_args_112[2 * i] - dst_mean[0] + dst_demean[i][1] = umeyama_args_112[2 * i + 1] - dst_mean[1] + + A = [[0.0, 0.0], [0.0, 0.0]] + for i in range(SRC_DIM): + for k in range(SRC_DIM): + for j in range(SRC_NUM): + A[i][k] += dst_demean[j][i] * src_demean[j][k] + A[i][k] /= SRC_NUM + + T = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] + U, S, V = svd22([A[0][0], A[0][1], A[1][0], A[1][1]]) + + T[0][0] = U[0] * V[0] + U[1] * V[2] + T[0][1] = U[0] * V[1] + U[1] * V[3] + T[1][0] = U[2] * V[0] + U[3] * V[2] + T[1][1] = U[2] * V[1] + U[3] * V[3] + + scale = 1.0 + src_demean_mean = [0.0, 0.0] + src_demean_var = [0.0, 0.0] + for i in range(SRC_NUM): + src_demean_mean[0] += src_demean[i][0] + src_demean_mean[1] += src_demean[i][1] + + src_demean_mean[0] /= SRC_NUM + src_demean_mean[1] /= SRC_NUM + + for i in range(SRC_NUM): + src_demean_var[0] += (src_demean_mean[0] - src_demean[i][0]) * (src_demean_mean[0] - src_demean[i][0]) + src_demean_var[1] += (src_demean_mean[1] - src_demean[i][1]) * (src_demean_mean[1] - src_demean[i][1]) + + src_demean_var[0] /= SRC_NUM + src_demean_var[1] /= SRC_NUM + + scale = 1.0 / (src_demean_var[0] + src_demean_var[1]) * (S[0] + S[1]) + T[0][2] = dst_mean[0] - scale * (T[0][0] * src_mean[0] + T[0][1] * src_mean[1]) + T[1][2] = dst_mean[1] - scale * (T[1][0] * src_mean[0] + T[1][1] * src_mean[1]) + T[0][0] *= scale + T[0][1] *= scale + T[1][0] *= scale + T[1][1] *= scale + return T + +def get_affine_matrix(sparse_points): + # 获取affine变换矩阵 + with ScopedTiming("get_affine_matrix", debug_mode > 1): + # 使用Umeyama算法计算仿射变换矩阵 + matrix_dst = image_umeyama_112(sparse_points) + matrix_dst = [matrix_dst[0][0],matrix_dst[0][1],matrix_dst[0][2], + matrix_dst[1][0],matrix_dst[1][1],matrix_dst[1][2]] + return matrix_dst + +def fr_ai2d_init(): + with ScopedTiming("fr_ai2d_init",debug_mode > 0): + # (1)人脸识别ai2d初始化 + global fr_ai2d + fr_ai2d = nn.ai2d() + + # (2)人脸识别ai2d_output_tensor初始化,用于存放ai2d输出 + global fr_ai2d_output_tensor + data = np.ones(fr_kmodel_input_shape, dtype=np.uint8) + fr_ai2d_output_tensor = nn.from_numpy(data) + +def fr_ai2d_run(rgb888p_img,sparse_points): + # 人脸识别ai2d推理 + with ScopedTiming("fr_ai2d_run",debug_mode > 0): + global fr_ai2d,fr_ai2d_input_tensor,fr_ai2d_output_tensor + #(1)根据原图创建人脸识别ai2d_input_tensor对象 + fr_ai2d_input_tensor = nn.from_numpy(rgb888p_img) + #(2)根据新的人脸关键点设置新的人脸识别ai2d参数 + fr_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + affine_matrix = get_affine_matrix(sparse_points) + fr_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,affine_matrix) + global fr_ai2d_builder + # (3)根据新的人脸识别ai2d参数,构建识别ai2d_builder + fr_ai2d_builder = fr_ai2d.build(rgb888p_img.shape, fr_kmodel_input_shape) + # (4)推理人脸识别ai2d,将预处理的结果保存到fr_ai2d_output_tensor + fr_ai2d_builder.run(fr_ai2d_input_tensor, fr_ai2d_output_tensor) + +def fr_ai2d_release(): + # 释放人脸识别ai2d_input_tensor、ai2d_builder + with ScopedTiming("fr_ai2d_release",debug_mode > 0): + global fr_ai2d_input_tensor,fr_ai2d_builder + del fr_ai2d_input_tensor + del fr_ai2d_builder + +def fr_kpu_init(kmodel_file): + # 人脸识别kpu初始化 + with ScopedTiming("fr_kpu_init",debug_mode > 0): + # 初始化人脸识别kpu对象 + kpu_obj = nn.kpu() + # 加载人脸识别kmodel + kpu_obj.load_kmodel(kmodel_file) + # 初始化人脸识别ai2d + fr_ai2d_init() + return kpu_obj + +def fr_kpu_pre_process(rgb888p_img,sparse_points): + # 人脸识别kpu预处理 + # 人脸识别ai2d推理,根据关键点对原图进行预处理 + fr_ai2d_run(rgb888p_img,sparse_points) + with ScopedTiming("fr_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,fr_ai2d_output_tensor + # 将人脸识别ai2d输出设置为人脸识别kpu输入 + current_kmodel_obj.set_input_tensor(0, fr_ai2d_output_tensor) + + #ai2d_out_data = fr_ai2d_output_tensor.to_numpy() + #print('ai2d_out_data.shape:',ai2d_out_data.shape) + #with open("/sdcard/app/ai2d_out.bin", "wb") as file: + #file.write(ai2d_out_data.tobytes()) + +def fr_kpu_get_output(): + # 获取人脸识别kpu输出 + with ScopedTiming("fr_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + data = current_kmodel_obj.get_output_tensor(0) + result = data.to_numpy() + del data + return result[0] + +def fr_kpu_run(kpu_obj,rgb888p_img,sparse_points): + # 人脸识别kpu推理 + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)人脸识别kpu预处理,设置kpu输入 + fr_kpu_pre_process(rgb888p_img,sparse_points) + # (2)人脸识别kpu推理 + with ScopedTiming("fr kpu_run",debug_mode > 0): + kpu_obj.run() + # (3)释放人脸识别ai2d + fr_ai2d_release() + # (4)获取人脸识别kpu输出 + results = fr_kpu_get_output() + return results + +def fr_kpu_deinit(): + # 人脸识别kpu相关资源释放 + with ScopedTiming("fr_kpu_deinit",debug_mode > 0): + global fr_ai2d + del fr_ai2d + +#********************for face_detect.py******************** +def image2rgb888array(img): #4维 + # 将Image转换为rgb888格式 + with ScopedTiming("fr_kpu_deinit",debug_mode > 0): + img_data_rgb888=img.to_rgb888() + # hwc,rgb888 + img_hwc=img_data_rgb888.to_numpy_ref() + shape=img_hwc.shape + img_tmp = img_hwc.reshape((shape[0] * shape[1], shape[2])) + img_tmp_trans = img_tmp.transpose() + img_res=img_tmp_trans.copy() + # chw,rgb888 + img_return=img_res.reshape((1,shape[2],shape[0],shape[1])) + return img_return + +def face_registration_inference(): + print("face_registration_test start") + # 人脸检测kpu初始化 + kpu_face_detect = fd_kpu_init(fd_kmodel_file) + # 人脸识别kpu初始化 + kpu_face_reg = fr_kpu_init(fr_kmodel_file) + try: + # 获取图像列表 + img_list = os.listdir(database_img_dir) + for img_file in img_list: + with ScopedTiming("total",1): + # (1)读取一张图像 + full_img_file = database_img_dir + img_file + print(full_img_file) + img = image.Image(full_img_file) + rgb888p_img_ndarry = image2rgb888array(img) + + #(2)推理得到人脸检测kpu,得到人脸检测框、人脸五点 + dets,landms = fd_kpu_run(kpu_face_detect,rgb888p_img_ndarry) + if dets: + if dets.shape[0] == 1: + #(3)若是只检测到一张人脸,则将该人脸注册到数据库 + db_i_name = img_file.split('.')[0] + for landm in landms: + reg_result = fr_kpu_run(kpu_face_reg,rgb888p_img_ndarry,landm) + #print('\nwrite bin:',database_dir+'{}.bin'.format(db_i_name)) + with open(database_dir+'{}.bin'.format(db_i_name), "wb") as file: + file.write(reg_result.tobytes()) + else: + print('Only one person in a picture when you sign up') + else: + print('No person detected') + + gc.collect() + except Exception as e: + print(f"An error occurred during buffer used: {e}") + finally: + # 释放kpu资源 + fd_kpu_deinit() + fr_kpu_deinit() + global current_kmodel_obj + del current_kmodel_obj + del kpu_face_detect + del kpu_face_reg + # 垃圾回收 + gc.collect() + time.sleep(1) + + print("face_registration_test end") + return 0 + +if __name__ == '__main__': + face_registration_inference() +``` + +**人脸识别:** + +```python +import ulab.numpy as np # 类似python numpy操作,但也会有一些接口不同 +import nncase_runtime as nn # nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +from media.camera import * # 摄像头模块 +from media.display import * # 显示模块 +from media.media import * # 软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 +import aidemo # aidemo模块,封装ai demo相关后处理、画图操作 +import image # 图像模块,主要用于读取、图像绘制元素(框、点等)等操作 +import time # 时间统计 +import gc # 垃圾回收模块 +import os # 操作系统接口模块 +import math # 数学模块 + +#********************for config.py******************** +# display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) # 显示宽度要求16位对齐 +DISPLAY_HEIGHT = 1080 + +# ai原图分辨率,sensor默认出图为16:9,若需不形变原图,最好按照16:9比例设置宽高 +OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) # ai原图宽度要求16位对齐 +OUT_RGB888P_HEIGH = 1080 + +# kmodel输入shape +# 人脸检测kmodel输入shape +fd_kmodel_input_shape = (1,3,320,320) +# 人脸识别kmodel输入shape +fr_kmodel_input_shape = (1,3,112,112) +# ai原图padding +rgb_mean = [104,117,123] + +#kmodel相关参数设置 +#人脸检测 +confidence_threshold = 0.5 #人脸检测阈值 +top_k = 5000 +nms_threshold = 0.2 +keep_top_k = 750 +vis_thres = 0.5 +variance = [0.1, 0.2] +anchor_len = 4200 +score_dim = 2 +det_dim = 4 +keypoint_dim = 10 +#人脸识别 +max_register_face = 100 # 数据库最多人脸个数 +feature_num = 128 # 人脸识别特征维度 +face_recognition_threshold = 0.75 # 人脸识别阈值 + +#文件配置 +# 人脸检测kmodel +root_dir = '/sdcard/app/tests/' +fd_kmodel_file = root_dir + 'kmodel/face_detection_320.kmodel' +# 人脸识别kmodel +fr_kmodel_file = root_dir + 'kmodel/face_recognition.kmodel' +# 人脸检测anchor +anchors_path = root_dir + 'utils/prior_data_320.bin' +# 人脸数据库 +database_dir = root_dir + 'utils/db/' +# 调试模型,0:不调试,>0:打印对应级别调试信息 +debug_mode = 0 + +#********************for scoped_timing.py******************** +# 时间统计类 +class ScopedTiming: + def __init__(self, info="", enable_profile=True): + self.info = info + self.enable_profile = enable_profile + + def __enter__(self): + if self.enable_profile: + self.start_time = time.time_ns() + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.enable_profile: + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") + +#********************for ai_utils.py******************** +global current_kmodel_obj #当前kpu实例 +# fd_ai2d: 人脸检测ai2d实例 +# fd_ai2d_input_tensor: 人脸检测ai2d输入 +# fd_ai2d_output_tensor: 人脸检测ai2d输入 +# fd_ai2d_builder: 根据人脸检测ai2d参数,构建的人脸检测ai2d_builder对象 +global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder +# fr_ai2d: 人脸识别ai2d实例 +# fr_ai2d_input_tensor: 人脸识别ai2d输入 +# fr_ai2d_output_tensor: 人脸识别ai2d输入 +# fr_ai2d_builder: 根据人脸识别ai2d参数,构建的人脸识别ai2d_builder对象 +global fr_ai2d,fr_ai2d_input_tensor,fr_ai2d_output_tensor,fr_ai2d_builder +# valid_register_face: 数据库中有效人脸个数 +# db_name: 数据库人名列表 +# db_data: 数据库特征列表 +global valid_register_face,db_name,db_data + +#读取anchor文件,为人脸检测后处理做准备 +print('anchors_path:',anchors_path) +prior_data = np.fromfile(anchors_path, dtype=np.float) +prior_data = prior_data.reshape((anchor_len,det_dim)) + +def get_pad_one_side_param(): + # 右padding或下padding,获取padding参数 + dst_w = fd_kmodel_input_shape[3] # kmodel输入宽(w) + dst_h = fd_kmodel_input_shape[2] # kmodel输入高(h) + + # OUT_RGB888P_WIDTH:原图宽(w) + # OUT_RGB888P_HEIGH:原图高(h) + # 计算最小的缩放比例,等比例缩放 + ratio_w = dst_w / OUT_RGB888P_WIDTH + ratio_h = dst_h / OUT_RGB888P_HEIGH + if ratio_w < ratio_h: + ratio = ratio_w + else: + ratio = ratio_h + # 计算经过缩放后的新宽和新高 + new_w = (int)(ratio * OUT_RGB888P_WIDTH) + new_h = (int)(ratio * OUT_RGB888P_HEIGH) + + # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 + dw = (dst_w - new_w) / 2 + dh = (dst_h - new_h) / 2 + # 四舍五入,确保padding是整数 + top = (int)(round(0)) + bottom = (int)(round(dh * 2 + 0.1)) + left = (int)(round(0)) + right = (int)(round(dw * 2 - 0.1)) + return [0, 0, 0, 0, top, bottom, left, right] + +def fd_ai2d_init(): + # 人脸检测模型ai2d初始化 + with ScopedTiming("fd_ai2d_init",debug_mode > 0): + # (1)创建人脸检测ai2d对象 + global fd_ai2d + fd_ai2d = nn.ai2d() + # (2)设置人脸检测ai2d参数 + fd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + fd_ai2d.set_pad_param(True, get_pad_one_side_param(), 0, rgb_mean) + fd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + + #(3)人脸检测ai2d_builder,根据人脸检测ai2d参数、输入输出大小创建ai2d_builder对象 + global fd_ai2d_builder + fd_ai2d_builder = fd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fd_kmodel_input_shape) + + #(4)创建人脸检测ai2d_output_tensor,用于保存人脸检测ai2d输出 + global fd_ai2d_output_tensor + data = np.ones(fd_kmodel_input_shape, dtype=np.uint8) + fd_ai2d_output_tensor = nn.from_numpy(data) + +def fd_ai2d_run(rgb888p_img): + # 根据人脸检测ai2d参数,对原图rgb888p_img进行预处理 + with ScopedTiming("fd_ai2d_run",debug_mode > 0): + global fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder + # (1)根据原图构建ai2d_input_tensor对象 + ai2d_input = rgb888p_img.to_numpy_ref() + fd_ai2d_input_tensor = nn.from_numpy(ai2d_input) + # (2)运行人脸检测ai2d_builder,将结果保存到人脸检测ai2d_output_tensor中 + fd_ai2d_builder.run(fd_ai2d_input_tensor, fd_ai2d_output_tensor) + +def fd_ai2d_release(): + # 释放人脸检测ai2d_input_tensor + with ScopedTiming("fd_ai2d_release",debug_mode > 0): + global fd_ai2d_input_tensor + del fd_ai2d_input_tensor + + +def fd_kpu_init(kmodel_file): + # 初始化人脸检测kpu对象,并加载kmodel + with ScopedTiming("fd_kpu_init",debug_mode > 0): + # 初始化人脸检测kpu对象 + kpu_obj = nn.kpu() + # 加载人脸检测kmodel + kpu_obj.load_kmodel(kmodel_file) + # 初始化人脸检测ai2d + fd_ai2d_init() + return kpu_obj + +def fd_kpu_pre_process(rgb888p_img): + # 设置人脸检测kpu输入 + # 使用人脸检测ai2d对原图进行预处理(padding,resize) + fd_ai2d_run(rgb888p_img) + with ScopedTiming("fd_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,fd_ai2d_output_tensor + # 设置人脸检测kpu输入 + current_kmodel_obj.set_input_tensor(0, fd_ai2d_output_tensor) + +def fd_kpu_get_output(): + # 获取人脸检测kpu输出 + with ScopedTiming("fd_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + # 获取模型输出,并将结果转换为numpy,以便进行人脸检测后处理 + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + del data + results.append(result) + return results + +def fd_kpu_run(kpu_obj,rgb888p_img): + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)原图预处理,并设置模型输入 + fd_kpu_pre_process(rgb888p_img) + # (2)人脸检测kpu推理 + with ScopedTiming("fd kpu_run",debug_mode > 0): + kpu_obj.run() + # (3)释放人脸检测ai2d资源 + fd_ai2d_release() + # (4)获取人俩检测kpu输出 + results = fd_kpu_get_output() + # (5)人脸检测kpu结果后处理 + with ScopedTiming("fd kpu_post",debug_mode > 0): + post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, + [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) + # (6)返回人脸检测框 + if len(post_ret)==0: + return post_ret,post_ret + else: + return post_ret[0],post_ret[1] #0:det,1:landm,2:score + +def fd_kpu_deinit(): + # kpu释放 + with ScopedTiming("fd_kpu_deinit",debug_mode > 0): + global fd_ai2d, fd_ai2d_output_tensor + del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 + del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 + +###############for face recognition############### +##for database +def database_init(): + # 数据初始化,构建数据库人名列表和数据库特征列表 + with ScopedTiming("database_init", debug_mode > 1): + global valid_register_face,db_name,db_data + valid_register_face = 0 + db_name = [] + db_data = [] + + db_file_list = os.listdir(database_dir) + for db_file in db_file_list: + if not db_file.endswith('.bin'): + continue + if valid_register_face >= max_register_face: + break + valid_index = valid_register_face + full_db_file = database_dir + db_file + with open(full_db_file, 'rb') as f: + data = f.read() + feature = np.frombuffer(data, dtype=np.float) + db_data.append(feature) + name = db_file.split('.')[0] + db_name.append(name) + valid_register_face += 1 + +def database_reset(): + # 数据库清空 + with ScopedTiming("database_reset", debug_mode > 1): + global valid_register_face,db_name,db_data + print("database clearing...") + db_name = [] + db_data = [] + valid_register_face = 0 + print("database clear Done!") + +def database_search(feature): + # 数据库查询 + with ScopedTiming("database_search", debug_mode > 1): + global valid_register_face,db_name,db_data + v_id = -1 + v_score_max = 0.0 + + # 将当前人脸特征归一化 + feature /= np.linalg.norm(feature) + # 遍历当前人脸数据库,统计最高得分 + for i in range(valid_register_face): + db_feature = db_data[i] + db_feature /= np.linalg.norm(db_feature) + # 计算数据库特征与当前人脸特征相似度 + v_score = np.dot(feature, db_feature)/2 + 0.5 + if v_score > v_score_max: + v_score_max = v_score + v_id = i + + if v_id == -1: + # 数据库中无人脸 + return 'unknown' + elif v_score_max < face_recognition_threshold: + # 小于人脸识别阈值,未识别 +# print('v_score_max:',v_score_max) + return 'unknown' + else: + # 识别成功 + result = 'name: {}, score:{}'.format(db_name[v_id],v_score_max) + return result + +# 标准5官 +umeyama_args_112 = [ + 38.2946 , 51.6963 , + 73.5318 , 51.5014 , + 56.0252 , 71.7366 , + 41.5493 , 92.3655 , + 70.7299 , 92.2041 +] + +def svd22(a): + # svd + s = [0.0, 0.0] + u = [0.0, 0.0, 0.0, 0.0] + v = [0.0, 0.0, 0.0, 0.0] + + s[0] = (math.sqrt((a[0] - a[3]) ** 2 + (a[1] + a[2]) ** 2) + math.sqrt((a[0] + a[3]) ** 2 + (a[1] - a[2]) ** 2)) / 2 + s[1] = abs(s[0] - math.sqrt((a[0] - a[3]) ** 2 + (a[1] + a[2]) ** 2)) + v[2] = math.sin((math.atan2(2 * (a[0] * a[1] + a[2] * a[3]), a[0] ** 2 - a[1] ** 2 + a[2] ** 2 - a[3] ** 2)) / 2) if \ + s[0] > s[1] else 0 + v[0] = math.sqrt(1 - v[2] ** 2) + v[1] = -v[2] + v[3] = v[0] + u[0] = -(a[0] * v[0] + a[1] * v[2]) / s[0] if s[0] != 0 else 1 + u[2] = -(a[2] * v[0] + a[3] * v[2]) / s[0] if s[0] != 0 else 0 + u[1] = (a[0] * v[1] + a[1] * v[3]) / s[1] if s[1] != 0 else -u[2] + u[3] = (a[2] * v[1] + a[3] * v[3]) / s[1] if s[1] != 0 else u[0] + v[0] = -v[0] + v[2] = -v[2] + + return u, s, v + + +def image_umeyama_112(src): + # 使用Umeyama算法计算仿射变换矩阵 + SRC_NUM = 5 + SRC_DIM = 2 + src_mean = [0.0, 0.0] + dst_mean = [0.0, 0.0] + + for i in range(0,SRC_NUM * 2,2): + src_mean[0] += src[i] + src_mean[1] += src[i + 1] + dst_mean[0] += umeyama_args_112[i] + dst_mean[1] += umeyama_args_112[i + 1] + + src_mean[0] /= SRC_NUM + src_mean[1] /= SRC_NUM + dst_mean[0] /= SRC_NUM + dst_mean[1] /= SRC_NUM + + src_demean = [[0.0, 0.0] for _ in range(SRC_NUM)] + dst_demean = [[0.0, 0.0] for _ in range(SRC_NUM)] + + for i in range(SRC_NUM): + src_demean[i][0] = src[2 * i] - src_mean[0] + src_demean[i][1] = src[2 * i + 1] - src_mean[1] + dst_demean[i][0] = umeyama_args_112[2 * i] - dst_mean[0] + dst_demean[i][1] = umeyama_args_112[2 * i + 1] - dst_mean[1] + + A = [[0.0, 0.0], [0.0, 0.0]] + for i in range(SRC_DIM): + for k in range(SRC_DIM): + for j in range(SRC_NUM): + A[i][k] += dst_demean[j][i] * src_demean[j][k] + A[i][k] /= SRC_NUM + + T = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] + U, S, V = svd22([A[0][0], A[0][1], A[1][0], A[1][1]]) + + T[0][0] = U[0] * V[0] + U[1] * V[2] + T[0][1] = U[0] * V[1] + U[1] * V[3] + T[1][0] = U[2] * V[0] + U[3] * V[2] + T[1][1] = U[2] * V[1] + U[3] * V[3] + + scale = 1.0 + src_demean_mean = [0.0, 0.0] + src_demean_var = [0.0, 0.0] + for i in range(SRC_NUM): + src_demean_mean[0] += src_demean[i][0] + src_demean_mean[1] += src_demean[i][1] + + src_demean_mean[0] /= SRC_NUM + src_demean_mean[1] /= SRC_NUM + + for i in range(SRC_NUM): + src_demean_var[0] += (src_demean_mean[0] - src_demean[i][0]) * (src_demean_mean[0] - src_demean[i][0]) + src_demean_var[1] += (src_demean_mean[1] - src_demean[i][1]) * (src_demean_mean[1] - src_demean[i][1]) + + src_demean_var[0] /= SRC_NUM + src_demean_var[1] /= SRC_NUM + + scale = 1.0 / (src_demean_var[0] + src_demean_var[1]) * (S[0] + S[1]) + T[0][2] = dst_mean[0] - scale * (T[0][0] * src_mean[0] + T[0][1] * src_mean[1]) + T[1][2] = dst_mean[1] - scale * (T[1][0] * src_mean[0] + T[1][1] * src_mean[1]) + T[0][0] *= scale + T[0][1] *= scale + T[1][0] *= scale + T[1][1] *= scale + return T + +def get_affine_matrix(sparse_points): + # 获取放射变换矩阵 + with ScopedTiming("get_affine_matrix", debug_mode > 1): + # 使用Umeyama算法计算仿射变换矩阵 + matrix_dst = image_umeyama_112(sparse_points) + matrix_dst = [matrix_dst[0][0],matrix_dst[0][1],matrix_dst[0][2], + matrix_dst[1][0],matrix_dst[1][1],matrix_dst[1][2]] + return matrix_dst + +def fr_ai2d_init(): + with ScopedTiming("fr_ai2d_init",debug_mode > 0): + # (1)人脸识别ai2d初始化 + global fr_ai2d + fr_ai2d = nn.ai2d() + + # (2)人脸识别ai2d_output_tensor初始化,用于存放ai2d输出 + global fr_ai2d_output_tensor + data = np.ones(fr_kmodel_input_shape, dtype=np.uint8) + fr_ai2d_output_tensor = nn.from_numpy(data) + +def fr_ai2d_run(rgb888p_img,sparse_points): + # 人脸识别ai2d推理 + with ScopedTiming("fr_ai2d_run",debug_mode > 0): + global fr_ai2d,fr_ai2d_input_tensor,fr_ai2d_output_tensor + #(1)根据原图创建人脸识别ai2d_input_tensor对象 + ai2d_input = rgb888p_img.to_numpy_ref() + fr_ai2d_input_tensor = nn.from_numpy(ai2d_input) + #(2)根据新的人脸关键点设置新的人脸识别ai2d参数 + fr_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + affine_matrix = get_affine_matrix(sparse_points) + fr_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,affine_matrix) + global fr_ai2d_builder + # (3)根据新的人脸识别ai2d参数,构建识别ai2d_builder + fr_ai2d_builder = fr_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fr_kmodel_input_shape) + # (4)推理人脸识别ai2d,将预处理的结果保存到fr_ai2d_output_tensor + fr_ai2d_builder.run(fr_ai2d_input_tensor, fr_ai2d_output_tensor) + +def fr_ai2d_release(): + # 释放人脸识别ai2d_input_tensor、ai2d_builder + with ScopedTiming("fr_ai2d_release",debug_mode > 0): + global fr_ai2d_input_tensor,fr_ai2d_builder + del fr_ai2d_input_tensor + del fr_ai2d_builder + +def fr_kpu_init(kmodel_file): + # 人脸识别kpu初始化 + with ScopedTiming("fr_kpu_init",debug_mode > 0): + # 初始化人脸识别kpu对象 + kpu_obj = nn.kpu() + # 加载人脸识别kmodel + kpu_obj.load_kmodel(kmodel_file) + # 初始化人脸识别ai2d + fr_ai2d_init() + # 数据库初始化 + database_init() + return kpu_obj + +def fr_kpu_pre_process(rgb888p_img,sparse_points): + # 人脸识别kpu预处理 + # 人脸识别ai2d推理,根据关键点对原图进行预处理 + fr_ai2d_run(rgb888p_img,sparse_points) + with ScopedTiming("fr_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,fr_ai2d_output_tensor + # 将人脸识别ai2d输出设置为人脸识别kpu输入 + current_kmodel_obj.set_input_tensor(0, fr_ai2d_output_tensor) + +def fr_kpu_get_output(): + # 获取人脸识别kpu输出 + with ScopedTiming("fr_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + data = current_kmodel_obj.get_output_tensor(0) + result = data.to_numpy() + del data + return result[0] + +def fr_kpu_run(kpu_obj,rgb888p_img,sparse_points): + # 人脸识别kpu推理 + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)人脸识别kpu预处理,设置kpu输入 + fr_kpu_pre_process(rgb888p_img,sparse_points) + # (2)人脸识别kpu推理 + with ScopedTiming("fr kpu_run",debug_mode > 0): + kpu_obj.run() + # (3)释放人脸识别ai2d + fr_ai2d_release() + # (4)获取人脸识别kpu输出 + results = fr_kpu_get_output() + # (5)在数据库中查找当前人脸特征 + recg_result = database_search(results) + return recg_result + +def fr_kpu_deinit(): + # 人脸识别kpu相关资源释放 + with ScopedTiming("fr_kpu_deinit",debug_mode > 0): + global fr_ai2d,fr_ai2d_output_tensor + del fr_ai2d + del fr_ai2d_output_tensor + +#********************for media_utils.py******************** +global draw_img,osd_img #for display +global buffer,media_source,media_sink #for media + +# for display,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.2 +def display_init(): + # hdmi显示初始化 + display.init(LT9611_1920X1080_30FPS) + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + +def display_deinit(): + # 释放显示资源 + display.deinit() + +def display_draw(dets,recg_results): + # 在显示器上写人脸识别结果 + with ScopedTiming("display_draw",debug_mode >0): + global draw_img,osd_img + if dets: + draw_img.clear() + for i,det in enumerate(dets): + # (1)画人脸框 + x1, y1, w, h = map(lambda x: int(round(x, 0)), det[:4]) + x1 = x1 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + y1 = y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH + w = w * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + h = h * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH + draw_img.draw_rectangle(x1,y1, w, h, color=(255,0, 0, 255), thickness = 4) + + # (2)写人脸识别结果 + recg_text = recg_results[i] + draw_img.draw_string(x1,y1,recg_text,color=(255, 255, 0, 0),scale=4) + + # (3)将画图结果拷贝到osd + draw_img.copy_to(osd_img) + # (4)将osd显示到屏幕 + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + else: + # (1)清空用来画框的图像 + draw_img.clear() + # (2)清空osd + draw_img.copy_to(osd_img) + # (3)显示透明图层 + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + +#for camera,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.1 +def camera_init(dev_id): + # camera初始化 + camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) + + # set chn0 output yuv420sp + camera.set_outsize(dev_id, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + + # set chn2 output rgb88planar + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_BGR_888_PLANAR) + +def camera_start(dev_id): + # camera启动 + camera.start_stream(dev_id) + +def camera_read(dev_id): + # 读取一帧图像 + with ScopedTiming("camera_read",debug_mode >0): + rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) + return rgb888p_img + +def camera_release_image(dev_id,rgb888p_img): + # 释放一帧图像 + with ScopedTiming("camera_release_image",debug_mode >0): + camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) + +def camera_stop(dev_id): + # 停止camera + camera.stop_stream(dev_id) + +#for media,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.3 +def media_init(): + # meida初始化 + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + + ret = media.buffer_config(config) + + global media_source, media_sink + media_source = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + media_sink = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + media.create_link(media_source, media_sink) + + # 初始化多媒体buffer + ret = media.buffer_init() + if ret: + return ret + global buffer, draw_img, osd_img + buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # 用于画框 + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_MPGC) + # 用于拷贝画框结果,防止画框过程中发生buffer搬运 + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, + phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) + return ret + +def media_deinit(): + # meida资源释放 + global buffer,media_source, media_sink + media.release_buffer(buffer) + media.destroy_link(media_source, media_sink) + + ret = media.buffer_deinit() + return ret + +#********************for face_detect.py******************** +def face_recognition_inference(): + print("face_recognition_test start") + # 人脸检测kpu初始化 + kpu_face_detect = fd_kpu_init(fd_kmodel_file) + # 人脸关键点kpu初始化 + kpu_face_recg = fr_kpu_init(fr_kmodel_file) + # camera初始化 + camera_init(CAM_DEV_ID_0) + # 显示初始化 + display_init() + + rgb888p_img = None + # 注意:将一定要将一下过程包在try中,用于保证程序停止后,资源释放完毕;确保下次程序仍能正常运行 + try: + # 注意:媒体初始化(注:媒体初始化必须在camera_start之前,确保media缓冲区已配置完全) + ret = media_init() + if ret: + print("face_detect_test, buffer init failed") + return ret + + # 启动camera + camera_start(CAM_DEV_ID_0) + time.sleep(5) + gc_count = 0 + while True: + with ScopedTiming("total",1): + # (1)读取一帧图像 + rgb888p_img = camera_read(CAM_DEV_ID_0) + # (2)若读取失败,释放当前帧 + if rgb888p_img == -1: + print("face_detect_test, capture_image failed") + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + continue + + # (3)若读取成功,推理当前帧 + if rgb888p_img.format() == image.RGBP888: + # (3.1)推理当前图像,并获取人脸检测结果 + dets,landms = fd_kpu_run(kpu_face_detect,rgb888p_img) + recg_result = [] + for landm in landms: + # (3.2)针对每个人脸五官点,推理得到人脸特征,并计算特征在数据库中相似度 + ret = fr_kpu_run(kpu_face_recg,rgb888p_img,landm) + recg_result.append(ret) + # (3.3)将识别结果画到显示器上 + display_draw(dets,recg_result) + + # (4)释放当前帧 + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + if gc_count > 5: + gc.collect() + gc_count = 0 + else: + gc_count += 1 + except Exception as e: + # 捕捉运行运行中异常,并打印错误 + print(f"An error occurred during buffer used: {e}") + finally: + # 释放当前帧 + if rgb888p_img is not None: + #先release掉申请的内存再stop + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + + # 停止camera + camera_stop(CAM_DEV_ID_0) + # 释放显示资源 + display_deinit() + # 释放kpu资源 + fd_kpu_deinit() + fr_kpu_deinit() + global current_kmodel_obj + del current_kmodel_obj + del kpu_face_detect + del kpu_face_recg + # 垃圾回收 + gc.collect() + time.sleep(1) + # 释放媒体资源 + ret = media_deinit() + if ret: + print("face_recognition_test, buffer_deinit failed") + return ret + + print("face_recognition_test end") + return 0 + +if __name__ == '__main__': + face_recognition_inference() +``` + +### 3.人脸姿态角 + +```python +import ulab.numpy as np # 类似python numpy操作,但也会有一些接口不同 +import nncase_runtime as nn # nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +from media.camera import * # 摄像头模块 +from media.display import * # 显示模块 +from media.media import * # 软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 +import aidemo # aidemo模块,封装ai demo相关后处理、画图操作 +import image # 图像模块,主要用于读取、图像绘制元素(框、点等)等操作 +import time # 时间统计 +import gc # 垃圾回收模块 +import os # 操作系统接口模块 +import math # 数学模块 + +#********************for config.py******************** +# display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) # 显示宽度要求16位对齐 +DISPLAY_HEIGHT = 1080 + +# ai原图分辨率,sensor默认出图为16:9,若需不形变原图,最好按照16:9比例设置宽高 +OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) # ai原图宽度要求16位对齐 +OUT_RGB888P_HEIGH = 1080 + +# kmodel参数设置 +# 人脸检测kmodel输入shape +fd_kmodel_input_shape = (1,3,320,320) +# 人脸姿态估计kmodel输入shape +fp_kmodel_input_shape = (1,3,120,120) +# ai原图padding +rgb_mean = [104,117,123] + +#人脸检测kmodel其它参数设置 +confidence_threshold = 0.5 # 人脸检测阈值 +top_k = 5000 +nms_threshold = 0.2 +keep_top_k = 750 +vis_thres = 0.5 +variance = [0.1, 0.2] +anchor_len = 4200 +score_dim = 2 +det_dim = 4 +keypoint_dim = 10 + +# 文件配置 +# 人脸检测kmodel文件配置 +root_dir = '/sdcard/app/tests/' +fd_kmodel_file = root_dir + 'kmodel/face_detection_320.kmodel' +# 人脸姿态估计kmodel文件配置 +fp_kmodel_file = root_dir + 'kmodel/face_pose.kmodel' +# anchor文件配置 +anchors_path = root_dir + 'utils/prior_data_320.bin' +# 调试模型,0:不调试,>0:打印对应级别调试信息 +debug_mode = 0 + +#********************for scoped_timing.py******************** +# 时间统计类 +class ScopedTiming: + def __init__(self, info="", enable_profile=True): + self.info = info + self.enable_profile = enable_profile + + def __enter__(self): + if self.enable_profile: + self.start_time = time.time_ns() + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.enable_profile: + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") + +#********************for ai_utils.py******************** +global current_kmodel_obj #当前kpu对象 +# fd_ai2d: 人脸检测ai2d实例 +# fd_ai2d_input_tensor: 人脸检测ai2d输入 +# fd_ai2d_output_tensor: 人脸检测ai2d输入 +# fd_ai2d_builder: 根据人脸检测ai2d参数,构建的人脸检测ai2d_builder对象 +global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder +# fld_ai2d: 人脸姿态估计ai2d实例 +# fld_ai2d_input_tensor: 人脸姿态估计ai2d输入 +# fld_ai2d_output_tensor:人脸姿态估计ai2d输入 +# fld_ai2d_builder: 根据人脸姿态估计ai2d参数,构建的人脸姿态估计ai2d_builder对象 +global fp_ai2d,fp_ai2d_input_tensor,fp_ai2d_output_tensor,fp_ai2d_builder +global matrix_dst #人脸仿射变换矩阵 +#读取anchor文件,为人脸检测后处理做准备 +print('anchors_path:',anchors_path) +prior_data = np.fromfile(anchors_path, dtype=np.float) +prior_data = prior_data.reshape((anchor_len,det_dim)) + +def get_pad_one_side_param(): + # 右padding或下padding,获取padding参数 + dst_w = fd_kmodel_input_shape[3] # kmodel输入宽(w) + dst_h = fd_kmodel_input_shape[2] # kmodel输入高(h) + + # OUT_RGB888P_WIDTH:原图宽(w) + # OUT_RGB888P_HEIGH:原图高(h) + # 计算最小的缩放比例,等比例缩放 + ratio_w = dst_w / OUT_RGB888P_WIDTH + ratio_h = dst_h / OUT_RGB888P_HEIGH + if ratio_w < ratio_h: + ratio = ratio_w + else: + ratio = ratio_h + # 计算经过缩放后的新宽和新高 + new_w = (int)(ratio * OUT_RGB888P_WIDTH) + new_h = (int)(ratio * OUT_RGB888P_HEIGH) + + # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 + dw = (dst_w - new_w) / 2 + dh = (dst_h - new_h) / 2 + # 四舍五入,确保padding是整数 + top = (int)(round(0)) + bottom = (int)(round(dh * 2 + 0.1)) + left = (int)(round(0)) + right = (int)(round(dw * 2 - 0.1)) + return [0, 0, 0, 0, top, bottom, left, right] + +def fd_ai2d_init(): + # 人脸检测模型ai2d初始化 + with ScopedTiming("fd_ai2d_init",debug_mode > 0): + # (1)创建人脸检测ai2d对象 + global fd_ai2d + fd_ai2d = nn.ai2d() + # (2)设置人脸检测ai2d参数 + fd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + fd_ai2d.set_pad_param(True, get_pad_one_side_param(), 0, rgb_mean) + fd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + + #(3)人脸检测ai2d_builder,根据人脸检测ai2d参数、输入输出大小创建ai2d_builder对象 + global fd_ai2d_builder + fd_ai2d_builder = fd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fd_kmodel_input_shape) + + #(4)创建人脸检测ai2d_output_tensor,用于保存人脸检测ai2d输出 + global fd_ai2d_output_tensor + data = np.ones(fd_kmodel_input_shape, dtype=np.uint8) + fd_ai2d_output_tensor = nn.from_numpy(data) + +def fd_ai2d_run(rgb888p_img): + # 根据人脸检测ai2d参数,对原图rgb888p_img进行预处理 + with ScopedTiming("fd_ai2d_run",debug_mode > 0): + global fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder + # (1)根据原图构建ai2d_input_tensor对象 + ai2d_input = rgb888p_img.to_numpy_ref() + fd_ai2d_input_tensor = nn.from_numpy(ai2d_input) + # (2)运行人脸检测ai2d_builder,将结果保存到人脸检测ai2d_output_tensor中 + fd_ai2d_builder.run(fd_ai2d_input_tensor, fd_ai2d_output_tensor) + +def fd_ai2d_release(): + # 释放人脸检测ai2d_input_tensor + with ScopedTiming("fd_ai2d_release",debug_mode > 0): + global fd_ai2d_input_tensor + del fd_ai2d_input_tensor + + +def fd_kpu_init(kmodel_file): + # 初始化人脸检测kpu对象,并加载kmodel + with ScopedTiming("fd_kpu_init",debug_mode > 0): + # 初始化人脸检测kpu对象 + kpu_obj = nn.kpu() + # 加载人脸检测kmodel + kpu_obj.load_kmodel(kmodel_file) + # 初始化人脸检测ai2d + fd_ai2d_init() + return kpu_obj + +def fd_kpu_pre_process(rgb888p_img): + # 设置人脸检测kpu输入 + # 使用人脸检测ai2d对原图进行预处理(padding,resize) + fd_ai2d_run(rgb888p_img) + with ScopedTiming("fd_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,fd_ai2d_output_tensor + # 设置人脸检测kpu输入 + current_kmodel_obj.set_input_tensor(0, fd_ai2d_output_tensor) + +def fd_kpu_get_output(): + # 获取人脸检测kpu输出 + with ScopedTiming("fd_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + # 获取模型输出,并将结果转换为numpy,以便进行人脸检测后处理 + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + del data + results.append(result) + return results + +def fd_kpu_run(kpu_obj,rgb888p_img): + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)原图预处理,并设置模型输入 + fd_kpu_pre_process(rgb888p_img) + # (2)人脸检测kpu推理 + with ScopedTiming("fd kpu_run",debug_mode > 0): + kpu_obj.run() + # (3)释放人脸检测ai2d资源 + fd_ai2d_release() + # (4)获取人俩检测kpu输出 + results = fd_kpu_get_output() + # (5)人脸检测kpu结果后处理 + with ScopedTiming("fd kpu_post",debug_mode > 0): + post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, + [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) + # (6)返回人脸检测框 + if len(post_ret)==0: + return post_ret + else: + return post_ret[0] #0:det,1:landm,2:score + +def fd_kpu_deinit(): + # kpu释放 + with ScopedTiming("fd_kpu_deinit",debug_mode > 0): + global fd_ai2d, fd_ai2d_output_tensor + del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 + del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 + +###############for face recognition############### +def get_affine_matrix(bbox): + # 获取仿射矩阵,用于将边界框映射到模型输入空间 + with ScopedTiming("get_affine_matrix", debug_mode > 1): + # 设置缩放因子 + factor = 2.7 + # 从边界框提取坐标和尺寸 + x1, y1, w, h = map(lambda x: int(round(x, 0)), bbox[:4]) + # 模型输入大小 + edge_size = fp_kmodel_input_shape[2] + # 平移距离,使得模型输入空间的中心对准原点 + trans_distance = edge_size / 2.0 + # 计算边界框中心点的坐标 + center_x = x1 + w / 2.0 + center_y = y1 + h / 2.0 + # 计算最大边长 + maximum_edge = factor * (h if h > w else w) + # 计算缩放比例 + scale = edge_size * 2.0 / maximum_edge + # 计算平移参数 + cx = trans_distance - scale * center_x + cy = trans_distance - scale * center_y + # 创建仿射矩阵 + affine_matrix = [scale, 0, cx, 0, scale, cy] + return affine_matrix + +def build_projection_matrix(det): + x1, y1, w, h = map(lambda x: int(round(x, 0)), det[:4]) + + # 计算边界框中心坐标 + center_x = x1 + w / 2.0 + center_y = y1 + h / 2.0 + + # 定义后部(rear)和前部(front)的尺寸和深度 + rear_width = 0.5 * w + rear_height = 0.5 * h + rear_depth = 0 + factor = np.sqrt(2.0) + front_width = factor * rear_width + front_height = factor * rear_height + front_depth = factor * rear_width # 使用宽度来计算深度,也可以使用高度,取决于需求 + + # 定义立方体的顶点坐标 + temp = [ + [-rear_width, -rear_height, rear_depth], + [-rear_width, rear_height, rear_depth], + [rear_width, rear_height, rear_depth], + [rear_width, -rear_height, rear_depth], + [-front_width, -front_height, front_depth], + [-front_width, front_height, front_depth], + [front_width, front_height, front_depth], + [front_width, -front_height, front_depth] + ] + + projections = np.array(temp) + # 返回投影矩阵和中心坐标 + return projections, (center_x, center_y) + +def rotation_matrix_to_euler_angles(R): + # 将旋转矩阵(3x3 矩阵)转换为欧拉角(pitch、yaw、roll) + # 计算 sin(yaw) + sy = np.sqrt(R[0, 0] ** 2 + R[1, 0] ** 2) + + if sy < 1e-6: + # 若 sin(yaw) 过小,说明 pitch 接近 ±90 度 + pitch = np.arctan2(-R[1, 2], R[1, 1]) * 180 / np.pi + yaw = np.arctan2(-R[2, 0], sy) * 180 / np.pi + roll = 0 + else: + # 计算 pitch、yaw、roll 的角度 + pitch = np.arctan2(R[2, 1], R[2, 2]) * 180 / np.pi + yaw = np.arctan2(-R[2, 0], sy) * 180 / np.pi + roll = np.arctan2(R[1, 0], R[0, 0]) * 180 / np.pi + return [pitch,yaw,roll] + +def get_euler(data): + # 获取旋转矩阵和欧拉角 + R = data[:3, :3].copy() + eular = rotation_matrix_to_euler_angles(R) + return R,eular + +def fp_ai2d_init(): + # 人脸姿态估计ai2d初始化 + with ScopedTiming("fp_ai2d_init",debug_mode > 0): + # (1)创建人脸姿态估计ai2d对象 + global fp_ai2d + fp_ai2d = nn.ai2d() + + # (2)创建人脸姿态估计ai2d_output_tensor对象 + global fp_ai2d_output_tensor + data = np.ones(fp_kmodel_input_shape, dtype=np.uint8) + fp_ai2d_output_tensor = nn.from_numpy(data) + +def fp_ai2d_run(rgb888p_img,det): + # 人脸姿态估计ai2d推理 + with ScopedTiming("fp_ai2d_run",debug_mode > 0): + global fp_ai2d,fp_ai2d_input_tensor,fp_ai2d_output_tensor + #(1)根据原图构建人脸姿态估计ai2d_input_tensor + ai2d_input = rgb888p_img.to_numpy_ref() + fp_ai2d_input_tensor = nn.from_numpy(ai2d_input) + #(2)设置人脸姿态估计ai2d参数 + fp_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + global matrix_dst + matrix_dst = get_affine_matrix(det) + fp_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,matrix_dst) + # (3)构建人脸姿态估计ai2d_builder + global fp_ai2d_builder + fp_ai2d_builder = fp_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fp_kmodel_input_shape) + # (4)推理人脸姿态估计ai2d,将结果保存到ai2d_output_tensor + fp_ai2d_builder.run(fp_ai2d_input_tensor, fp_ai2d_output_tensor) + +def fp_ai2d_release(): + # 释放部分人脸姿态估计ai2d资源 + with ScopedTiming("fp_ai2d_release",debug_mode > 0): + global fp_ai2d_input_tensor,fp_ai2d_builder + del fp_ai2d_input_tensor + del fp_ai2d_builder + +def fp_kpu_init(kmodel_file): + # 初始化人脸姿态估计kpu及ai2d + with ScopedTiming("fp_kpu_init",debug_mode > 0): + kpu_obj = nn.kpu() + kpu_obj.load_kmodel(kmodel_file) + fp_ai2d_init() + return kpu_obj + +def fp_kpu_pre_process(rgb888p_img,det): + # 人脸姿态估计kpu预处理 + fp_ai2d_run(rgb888p_img,det) + with ScopedTiming("fp_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,fp_ai2d_output_tensor + current_kmodel_obj.set_input_tensor(0, fp_ai2d_output_tensor) + #ai2d_out_data = _ai2d_output_tensor.to_numpy() + #with open("/sdcard/app/ai2d_out.bin", "wb") as file: + #file.write(ai2d_out_data.tobytes()) + +def fp_kpu_get_output(): + # 获取人脸姿态估计kpu输出 + with ScopedTiming("fp_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + data = current_kmodel_obj.get_output_tensor(0) + result = data.to_numpy() + result = result[0] + del data + return result + +def fp_kpu_post_process(pred): + # 人脸姿态估计kpu推理结果后处理 + R,eular = get_euler(pred) + return R,eular + +def fp_kpu_run(kpu_obj,rgb888p_img,det): + # 人脸姿态估计kpu推理 + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)根据人脸检测框进行人脸姿态估计kpu预处理 + fp_kpu_pre_process(rgb888p_img,det) + # (2)人脸姿态估计kpu推理 + with ScopedTiming("fp_kpu_run",debug_mode > 0): + kpu_obj.run() + # (3)释放人脸姿态估计ai2d资源 + fp_ai2d_release() + # (4)释放人脸姿态估计kpu推理输出 + result = fp_kpu_get_output() + # (5)释放人脸姿态估计后处理 + R,eular = fp_kpu_post_process(result) + return R,eular + +def fp_kpu_deinit(): + # 释放人脸姿态估计kpu及ai2d资源 + with ScopedTiming("fp_kpu_deinit",debug_mode > 0): + global fp_ai2d,fp_ai2d_output_tensor + del fp_ai2d + del fp_ai2d_output_tensor + +#********************for media_utils.py******************** +global draw_img_ulab,draw_img,osd_img #for display +global buffer,media_source,media_sink #for media + +# for display,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.2 +def display_init(): + # 设置使用hdmi进行显示 + display.init(LT9611_1920X1080_30FPS) + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + +def display_deinit(): + # 释放显示资源 + display.deinit() + +def display_draw(dets,pose_results): + # 在显示器画人脸轮廓 + with ScopedTiming("display_draw",debug_mode >0): + global draw_img_ulab,draw_img,osd_img + if dets: + draw_img.clear() + line_color = np.array([255, 0, 0 ,255],dtype = np.uint8) #bgra + for i,det in enumerate(dets): + # (1)获取人脸姿态矩阵和欧拉角 + projections,center_point = build_projection_matrix(det) + R,euler = pose_results[i] + + # (2)遍历人脸投影矩阵的关键点,进行投影,并将结果画在图像上 + first_points = [] + second_points = [] + for pp in range(8): + sum_x, sum_y = 0.0, 0.0 + for cc in range(3): + sum_x += projections[pp][cc] * R[cc][0] + sum_y += projections[pp][cc] * (-R[cc][1]) + + center_x,center_y = center_point[0],center_point[1] + x = (sum_x + center_x) / OUT_RGB888P_WIDTH * DISPLAY_WIDTH + y = (sum_y + center_y) / OUT_RGB888P_HEIGH * DISPLAY_HEIGHT + x = max(0, min(x, DISPLAY_WIDTH)) + y = max(0, min(y, DISPLAY_HEIGHT)) + + if pp < 4: + first_points.append((x, y)) + else: + second_points.append((x, y)) + first_points = np.array(first_points,dtype=np.float) + aidemo.polylines(draw_img_ulab,first_points,True,line_color,2,8,0) + second_points = np.array(second_points,dtype=np.float) + aidemo.polylines(draw_img_ulab,second_points,True,line_color,2,8,0) + + for ll in range(4): + x0, y0 = int(first_points[ll][0]),int(first_points[ll][1]) + x1, y1 = int(second_points[ll][0]),int(second_points[ll][1]) + draw_img.draw_line(x0, y0, x1, y1, color = (255, 0, 0 ,255), thickness = 2) + + # (3)将绘制好的图像拷贝到显示缓冲区,并在显示器上展示 + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + else: + # (1)清空用来画框的图像 + draw_img.clear() + # (2)清空osd + draw_img.copy_to(osd_img) + # (3)显示透明图层 + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + +#for camera,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.1 +def camera_init(dev_id): + # camera初始化 + camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) + + # set chn0 output yuv420sp + camera.set_outsize(dev_id, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + + # set chn2 output rgb88planar + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) + +def camera_start(dev_id): + # camera启动 + camera.start_stream(dev_id) + +def camera_read(dev_id): + # 读取一帧图像 + with ScopedTiming("camera_read",debug_mode >0): + rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) + return rgb888p_img + +def camera_release_image(dev_id,rgb888p_img): + # 释放一帧图像 + with ScopedTiming("camera_release_image",debug_mode >0): + camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) + +def camera_stop(dev_id): + # 停止camera + camera.stop_stream(dev_id) + +#for media,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.3 +def media_init(): + # meida初始化 + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + + ret = media.buffer_config(config) + + global media_source, media_sink + media_source = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + media_sink = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + media.create_link(media_source, media_sink) + + # 初始化多媒体buffer + ret = media.buffer_init() + if ret: + return ret + global buffer, draw_img_ulab,draw_img, osd_img + buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # 用于画框,draw_img->draw_img_ulab(两者指向同一块内存) + draw_img_ulab = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_REF,data = draw_img_ulab) + # 用于拷贝画框结果,防止画框过程中发生buffer搬运 + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, + phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) + return ret + +def media_deinit(): + # meida资源释放 + global buffer,media_source, media_sink + media.release_buffer(buffer) + media.destroy_link(media_source, media_sink) + + ret = media.buffer_deinit() + return ret + +#********************for face_detect.py******************** +def face_pose_inference(): + print("face_pose_test start") + # 人脸检测kpu初始化 + kpu_face_detect = fd_kpu_init(fd_kmodel_file) + # 人脸姿态估计kpu初始化 + kpu_face_pose = fp_kpu_init(fp_kmodel_file) + # camera初始化 + camera_init(CAM_DEV_ID_0) + # 显示初始化 + display_init() + + rgb888p_img = None + # 注意:将一定要将一下过程包在try中,用于保证程序停止后,资源释放完毕;确保下次程序仍能正常运行 + try: + # 注意:媒体初始化(注:媒体初始化必须在camera_start之前,确保media缓冲区已配置完全) + ret = media_init() + if ret: + print("face_detect_test, buffer init failed") + return ret + + # 启动camera + camera_start(CAM_DEV_ID_0) + time.sleep(5) + + gc_count = 0 + while True: + with ScopedTiming("total",1): + # (1)读取一帧图像 + rgb888p_img = camera_read(CAM_DEV_ID_0) + # (2)若读取失败,释放当前帧 + if rgb888p_img == -1: + print("face_detect_test, capture_image failed") + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + continue + + # (3)若读取成功,推理当前帧 + if rgb888p_img.format() == image.RGBP888: + # (3.1)推理当前图像,并获取人脸检测结果 + dets = fd_kpu_run(kpu_face_detect,rgb888p_img) + # (3.2)针对每个人脸框,推理得到对应人脸旋转矩阵、欧拉角 + pose_results = [] + for det in dets: + R,eular = fp_kpu_run(kpu_face_pose,rgb888p_img,det) + pose_results.append((R,eular)) + # (3.3)将人脸姿态估计结果画到显示器上 + display_draw(dets,pose_results) + + # (4)释放当前帧 + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + if gc_count > 5: + gc.collect() + gc_count = 0 + else: + gc_count += 1 + except Exception as e: + # 捕捉运行运行中异常,并打印错误 + print(f"An error occurred during buffer used: {e}") + finally: + # 释放当前帧 + if rgb888p_img is not None: + #先release掉申请的内存再stop + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + # 停止camera + camera_stop(CAM_DEV_ID_0) + # 释放显示资源 + display_deinit() + # 释放kpu资源 + fd_kpu_deinit() + fp_kpu_deinit() + global current_kmodel_obj + del current_kmodel_obj + del kpu_face_detect + del kpu_face_pose + # 垃圾回收 + gc.collect() + time.sleep(1) + # 释放媒体资源 + ret = media_deinit() + if ret: + print("face_pose_test, buffer_deinit failed") + return ret + + print("face_pose_test end") + return 0 + +if __name__ == '__main__': + face_pose_inference() +``` + +### 4. 人脸解析 + +```python +import ulab.numpy as np # 类似python numpy操作,但也会有一些接口不同 +import nncase_runtime as nn # nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +from media.camera import * # 摄像头模块 +from media.display import * # 显示模块 +from media.media import * # 软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 +import aidemo # aidemo模块,封装ai demo相关后处理、画图操作 +import image # 图像模块,主要用于读取、图像绘制元素(框、点等)等操作 +import time # 时间统计 +import gc # 垃圾回收模块 +import os # 操作系统接口模块 +import math # 数学模块 + +#********************for config.py******************** +# display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) # 显示宽度要求16位对齐 +DISPLAY_HEIGHT = 1080 + +# ai原图分辨率,sensor默认出图为16:9,若需不形变原图,最好按照16:9比例设置宽高 +OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) # ai原图宽度要求16位对齐 +OUT_RGB888P_HEIGH = 1080 + +# kmodel参数设置 +# 人脸检测kmodel输入shape +fd_kmodel_input_shape = (1,3,320,320) +# 人脸解析kmodel输入shape +fp_kmodel_input_shape = (1,3,320,320) +# ai原图padding +rgb_mean = [104,117,123] + +#人脸检测kmodel其它参数设置 +confidence_threshold = 0.5 # 人脸检测阈值 +top_k = 5000 +nms_threshold = 0.2 +keep_top_k = 750 +vis_thres = 0.5 +variance = [0.1, 0.2] +anchor_len = 4200 +score_dim = 2 +det_dim = 4 +keypoint_dim = 10 + +# 文件配置 +# 人脸检测kmodel +root_dir = '/sdcard/app/tests/' +fd_kmodel_file = root_dir + 'kmodel/face_detection_320.kmodel' +# 人脸解析kmodel +fp_kmodel_file = root_dir + 'kmodel/face_parse.kmodel' +# anchor文件 +anchors_path = root_dir + 'utils/prior_data_320.bin' +# 调试模型,0:不调试,>0:打印对应级别调试信息 +debug_mode = 0 + +#********************for scoped_timing.py******************** +# 时间统计类 +class ScopedTiming: + def __init__(self, info="", enable_profile=True): + self.info = info + self.enable_profile = enable_profile + + def __enter__(self): + if self.enable_profile: + self.start_time = time.time_ns() + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.enable_profile: + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") + +#********************for ai_utils.py******************** +global current_kmodel_obj #当前kpu对象 +# fd_ai2d: 人脸检测ai2d实例 +# fd_ai2d_input_tensor: 人脸检测ai2d输入 +# fd_ai2d_output_tensor: 人脸检测ai2d输入 +# fd_ai2d_builder: 根据人脸检测ai2d参数,构建的人脸检测ai2d_builder对象 +global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder +# fld_ai2d: 人脸解析ai2d实例 +# fld_ai2d_input_tensor: 人脸解析ai2d输入 +# fld_ai2d_output_tensor:人脸解析ai2d输入 +# fld_ai2d_builder: 根据人脸解析ai2d参数,构建的人脸解析ai2d_builder对象 +global fp_ai2d,fp_ai2d_input_tensor,fp_ai2d_output_tensor,fp_ai2d_builder +global matrix_dst #人脸仿射变换矩阵 + +#读取anchor文件,为人脸检测后处理做准备 +print('anchors_path:',anchors_path) +prior_data = np.fromfile(anchors_path, dtype=np.float) +prior_data = prior_data.reshape((anchor_len,det_dim)) + +def get_pad_one_side_param(): + # 右padding或下padding,获取padding参数 + dst_w = fd_kmodel_input_shape[3] # kmodel输入宽(w) + dst_h = fd_kmodel_input_shape[2] # kmodel输入高(h) + + # OUT_RGB888P_WIDTH:原图宽(w) + # OUT_RGB888P_HEIGH:原图高(h) + # 计算最小的缩放比例,等比例缩放 + ratio_w = dst_w / OUT_RGB888P_WIDTH + ratio_h = dst_h / OUT_RGB888P_HEIGH + if ratio_w < ratio_h: + ratio = ratio_w + else: + ratio = ratio_h + # 计算经过缩放后的新宽和新高 + new_w = (int)(ratio * OUT_RGB888P_WIDTH) + new_h = (int)(ratio * OUT_RGB888P_HEIGH) + + # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 + dw = (dst_w - new_w) / 2 + dh = (dst_h - new_h) / 2 + # 四舍五入,确保padding是整数 + top = (int)(round(0)) + bottom = (int)(round(dh * 2 + 0.1)) + left = (int)(round(0)) + right = (int)(round(dw * 2 - 0.1)) + return [0, 0, 0, 0, top, bottom, left, right] + +def fd_ai2d_init(): + # 人脸检测模型ai2d初始化 + with ScopedTiming("fd_ai2d_init",debug_mode > 0): + # (1)创建人脸检测ai2d对象 + global fd_ai2d + fd_ai2d = nn.ai2d() + # (2)设置人脸检测ai2d参数 + fd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + fd_ai2d.set_pad_param(True, get_pad_one_side_param(), 0, rgb_mean) + fd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + + #(3)人脸检测ai2d_builder,根据人脸检测ai2d参数、输入输出大小创建ai2d_builder对象 + global fd_ai2d_builder + fd_ai2d_builder = fd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fd_kmodel_input_shape) + + #(4)创建人脸检测ai2d_output_tensor,用于保存人脸检测ai2d输出 + global fd_ai2d_output_tensor + data = np.ones(fd_kmodel_input_shape, dtype=np.uint8) + fd_ai2d_output_tensor = nn.from_numpy(data) + +def fd_ai2d_run(rgb888p_img): + # 根据人脸检测ai2d参数,对原图rgb888p_img进行预处理 + with ScopedTiming("fd_ai2d_run",debug_mode > 0): + global fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder + # (1)根据原图构建ai2d_input_tensor对象 + ai2d_input = rgb888p_img.to_numpy_ref() + fd_ai2d_input_tensor = nn.from_numpy(ai2d_input) + # (2)运行人脸检测ai2d_builder,将结果保存到人脸检测ai2d_output_tensor中 + fd_ai2d_builder.run(fd_ai2d_input_tensor, fd_ai2d_output_tensor) + +def fd_ai2d_release(): + # 释放人脸检测ai2d_input_tensor + with ScopedTiming("fd_ai2d_release",debug_mode > 0): + global fd_ai2d_input_tensor + del fd_ai2d_input_tensor + + +def fd_kpu_init(kmodel_file): + # 初始化人脸检测kpu对象,并加载kmodel + with ScopedTiming("fd_kpu_init",debug_mode > 0): + # 初始化人脸检测kpu对象 + kpu_obj = nn.kpu() + # 加载人脸检测kmodel + kpu_obj.load_kmodel(kmodel_file) + # 初始化人脸检测ai2d + fd_ai2d_init() + return kpu_obj + +def fd_kpu_pre_process(rgb888p_img): + # 设置人脸检测kpu输入 + # 使用人脸检测ai2d对原图进行预处理(padding,resize) + fd_ai2d_run(rgb888p_img) + with ScopedTiming("fd_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,fd_ai2d_output_tensor + # 设置人脸检测kpu输入 + current_kmodel_obj.set_input_tensor(0, fd_ai2d_output_tensor) + +def fd_kpu_get_output(): + # 获取人脸检测kpu输出 + with ScopedTiming("fd_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + # 获取模型输出,并将结果转换为numpy,以便进行人脸检测后处理 + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + del data + results.append(result) + return results + +def fd_kpu_run(kpu_obj,rgb888p_img): + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)原图预处理,并设置模型输入 + fd_kpu_pre_process(rgb888p_img) + # (2)人脸检测kpu推理 + with ScopedTiming("fd kpu_run",debug_mode > 0): + kpu_obj.run() + # (3)释放人脸检测ai2d资源 + fd_ai2d_release() + # (4)获取人俩检测kpu输出 + results = fd_kpu_get_output() + # (5)人脸检测kpu结果后处理 + with ScopedTiming("fd kpu_post",debug_mode > 0): + post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, + [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) + # (6)返回人脸检测框 + if len(post_ret)==0: + return post_ret + else: + return post_ret[0] #0:det,1:landm,2:score + +def fd_kpu_deinit(): + # kpu释放 + with ScopedTiming("fd_kpu_deinit",debug_mode > 0): + global fd_ai2d, fd_ai2d_output_tensor + del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 + del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 + +###############for face recognition############### +def get_affine_matrix(bbox): + # 获取仿射矩阵,用于将边界框映射到模型输入空间 + with ScopedTiming("get_affine_matrix", debug_mode > 1): + # 设置缩放因子 + factor = 2.7 + # 从边界框提取坐标和尺寸 + x1, y1, w, h = map(lambda x: int(round(x, 0)), bbox[:4]) + # 模型输入大小 + edge_size = fp_kmodel_input_shape[2] + # 平移距离,使得模型输入空间的中心对准原点 + trans_distance = edge_size / 2.0 + # 计算边界框中心点的坐标 + center_x = x1 + w / 2.0 + center_y = y1 + h / 2.0 + # 计算最大边长 + maximum_edge = factor * (h if h > w else w) + # 计算缩放比例 + scale = edge_size * 2.0 / maximum_edge + # 计算平移参数 + cx = trans_distance - scale * center_x + cy = trans_distance - scale * center_y + # 创建仿射矩阵 + affine_matrix = [scale, 0, cx, 0, scale, cy] + return affine_matrix + +def fp_ai2d_init(): + # 人脸解析ai2d初始化 + with ScopedTiming("fp_ai2d_init",debug_mode > 0): + # (1)创建人脸解析ai2d对象 + global fp_ai2d + fp_ai2d = nn.ai2d() + + # (2)创建人脸解析ai2d_output_tensor对象 + global fp_ai2d_output_tensor + data = np.ones(fp_kmodel_input_shape, dtype=np.uint8) + fp_ai2d_output_tensor = nn.from_numpy(data) + +def fp_ai2d_run(rgb888p_img,det): + # 人脸解析ai2d推理 + with ScopedTiming("fp_ai2d_run",debug_mode > 0): + global fp_ai2d,fp_ai2d_input_tensor,fp_ai2d_output_tensor + #(1)根据原图构建人脸解析ai2d_input_tensor + ai2d_input = rgb888p_img.to_numpy_ref() + fp_ai2d_input_tensor = nn.from_numpy(ai2d_input) + #(2)设置人脸解析ai2d参数 + fp_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + global matrix_dst + matrix_dst = get_affine_matrix(det) + fp_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,matrix_dst) + + # (3)构建人脸解析ai2d_builder + global fp_ai2d_builder + fp_ai2d_builder = fp_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fp_kmodel_input_shape) + # (4)推理人脸解析ai2d,将结果保存到ai2d_output_tensor + fp_ai2d_builder.run(fp_ai2d_input_tensor, fp_ai2d_output_tensor) + +def fp_ai2d_release(): + # 释放部分人脸解析ai2d资源 + with ScopedTiming("fp_ai2d_release",debug_mode > 0): + global fp_ai2d_input_tensor,fp_ai2d_builder + del fp_ai2d_input_tensor + del fp_ai2d_builder + +def fp_kpu_init(kmodel_file): + # 初始化人脸解析kpu及ai2d + with ScopedTiming("fp_kpu_init",debug_mode > 0): + kpu_obj = nn.kpu() + kpu_obj.load_kmodel(kmodel_file) + fp_ai2d_init() + return kpu_obj + +def fp_kpu_pre_process(rgb888p_img,det): + # 人脸解析kpu预处理 + fp_ai2d_run(rgb888p_img,det) + with ScopedTiming("fp_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,fp_ai2d_output_tensor + current_kmodel_obj.set_input_tensor(0, fp_ai2d_output_tensor) + #ai2d_out_data = fp_ai2d_output_tensor.to_numpy() + #with open("/sdcard/app/ai2d_out.bin", "wb") as file: + #file.write(ai2d_out_data.tobytes()) + +def fp_kpu_get_output(): + # 获取人脸解析kpu输出 + with ScopedTiming("fp_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + data = current_kmodel_obj.get_output_tensor(0) + result = data.to_numpy() + del data + return result + +def fp_kpu_run(kpu_obj,rgb888p_img,det): + # 人脸解析kpu推理 + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)根据人脸检测框进行人脸解析kpu预处理 + fp_kpu_pre_process(rgb888p_img,det) + # (2)人脸解析kpu推理 + with ScopedTiming("fp_kpu_run",debug_mode > 0): + kpu_obj.run() + # (3)释放人脸解析ai2d资源 + fp_ai2d_release() + # (4)释放人脸解析kpu输出 + result = fp_kpu_get_output() + return result + +def fp_kpu_deinit(): + # 释放人脸解析kpu和ai2d资源 + with ScopedTiming("fp_kpu_deinit",debug_mode > 0): + global fp_ai2d,fp_ai2d_output_tensor + del fp_ai2d + del fp_ai2d_output_tensor + +#********************for media_utils.py******************** +global draw_img_ulab,draw_img,osd_img #for display +global buffer,media_source,media_sink #for media + +#for display +def display_init(): + # 设置使用hdmi进行显示 + display.init(LT9611_1920X1080_30FPS) + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + +def display_deinit(): + # 释放显示资源 + display.deinit() + +def display_draw(dets,parse_results): + # 在显示器画出人脸解析结果 + with ScopedTiming("display_draw",debug_mode >0): + global draw_img_ulab,draw_img,osd_img + if dets: + draw_img.clear() + for i,det in enumerate(dets): + # (1)将人脸检测框画到draw_img + x, y, w, h = map(lambda x: int(round(x, 0)), det[:4]) + x = x * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + y = y * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + w = w * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + h = h * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH + draw_img.draw_rectangle(x,y, w, h, color=(255, 255, 0, 255)) + # (2)将人脸解析结果画到draw_img(draw_img_ulab和draw_img指同一内存) + aidemo.face_parse_post_process(draw_img_ulab,[OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH], + [DISPLAY_WIDTH,DISPLAY_HEIGHT],fp_kmodel_input_shape[2],det.tolist(),parse_results[i]) + # (3)将绘制好的图像拷贝到显示缓冲区,并在显示器上展示 + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + else: + # (1)清空用来画框的图像 + draw_img.clear() + # (2)清空osd + draw_img.copy_to(osd_img) + # (3)显示透明图层 + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + +#for camera,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.1 +def camera_init(dev_id): + # camera初始化 + camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) + + # set chn0 output yuv420sp + camera.set_outsize(dev_id, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + + # set chn2 output rgb88planar + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) + +def camera_start(dev_id): + # camera启动 + camera.start_stream(dev_id) + +def camera_read(dev_id): + # 读取一帧图像 + with ScopedTiming("camera_read",debug_mode >0): + rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) + return rgb888p_img + +def camera_release_image(dev_id,rgb888p_img): + # 释放一帧图像 + with ScopedTiming("camera_release_image",debug_mode >0): + camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) + +def camera_stop(dev_id): + # 停止camera + camera.stop_stream(dev_id) + +#for media,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.3 +def media_init(): + # meida初始化 + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + + ret = media.buffer_config(config) + + global media_source, media_sink + media_source = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + media_sink = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + media.create_link(media_source, media_sink) + + # 初始化多媒体buffer + ret = media.buffer_init() + if ret: + return ret + + global buffer, draw_img_ulab,draw_img, osd_img + buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # 用于画框,draw_img->draw_img_ulab(两者指向同一块内存) + draw_img_ulab = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_REF,data = draw_img_ulab) + # 用于拷贝画框结果,防止画框过程中发生buffer搬运 + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, + phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) + return ret + +def media_deinit(): + # meida资源释放 + global buffer,media_source, media_sink + media.release_buffer(buffer) + media.destroy_link(media_source, media_sink) + + ret = media.buffer_deinit() + return ret + +#********************for face_detect.py******************** +def face_parse_inference(): + print("face_parse_test start") + # 人脸检测kpu初始化 + kpu_face_detect = fd_kpu_init(fd_kmodel_file) + # 人脸解析kpu初始化 + kpu_face_parse = fp_kpu_init(fp_kmodel_file) + # camera初始化 + camera_init(CAM_DEV_ID_0) + # 显示初始化 + display_init() + + rgb888p_img = None + # 注意:将一定要将一下过程包在try中,用于保证程序停止后,资源释放完毕;确保下次程序仍能正常运行 + try: + # 注意:媒体初始化(注:媒体初始化必须在camera_start之前,确保media缓冲区已配置完全) + ret = media_init() + if ret: + print("face_detect_test, buffer init failed") + return ret + + # 启动camera + camera_start(CAM_DEV_ID_0) + time.sleep(5) + + gc_count = 0 + while True: + with ScopedTiming("total",1): + # (1)读取一帧图像 + rgb888p_img = camera_read(CAM_DEV_ID_0) + # (2)若读取失败,释放当前帧 + if rgb888p_img == -1: + print("face_detect_test, capture_image failed") + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + continue + + # (3)若读取成功,推理当前帧 + if rgb888p_img.format() == image.RGBP888: + # (3.1)推理当前图像,并获取人脸检测结果 + dets = fd_kpu_run(kpu_face_detect,rgb888p_img) + # (3.2)针对每个人脸框,推理得到对应人脸解析结果 + parse_results = [] + for det in dets: + parse_ret = fp_kpu_run(kpu_face_parse,rgb888p_img,det) + parse_results.append(parse_ret) + # (3.3)将人脸解析结果画到显示器上 + display_draw(dets,parse_results) + + # (4)释放当前帧 + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + gc.collect() + except Exception as e: + # 捕捉运行运行中异常,并打印错误 + print(f"An error occurred during buffer used: {e}") + finally: + # 释放当前帧 + if rgb888p_img is not None: + #先release掉申请的内存再stop + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + + # 停止camera + camera_stop(CAM_DEV_ID_0) + # 释放显示资源 + display_deinit() + # 释放kpu资源 + fd_kpu_deinit() + fp_kpu_deinit() + global current_kmodel_obj + del current_kmodel_obj + del kpu_face_detect + del kpu_face_parse + # 垃圾回收 + gc.collect() + time.sleep(1) + # 释放媒体资源 + ret = media_deinit() + if ret: + print("face_parse_test, buffer_deinit failed") + return ret + + print("face_parse_test end") + return 0 + +if __name__ == '__main__': + face_parse_inference() +``` + +### 5. 车牌识别 + +```python +import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 +import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +from media.camera import * #摄像头模块 +from media.display import * #显示模块 +from media.media import * #软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 +import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 +import time #时间统计 +import gc #垃圾回收模块 +import aidemo #aidemo模块,封装ai demo相关后处理、画图操作 + +##config.py +#display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +#ai原图分辨率输入 +OUT_RGB888P_WIDTH = ALIGN_UP(640, 16) +OUT_RGB888P_HEIGHT = 360 + +#车牌检测 和 车牌识别 kmodel输入shape +det_kmodel_input_shape = (1,3,640,640) +rec_kmodel_input_shape = (1,1,32,220) + +#车牌检测 相关参数设置 +obj_thresh = 0.2 #车牌检测分数阈值 +nms_thresh = 0.2 #检测框 非极大值抑制 阈值 + +#文件配置 +root_dir = '/sdcard/app/tests/' +det_kmodel_file = root_dir + 'kmodel/LPD_640.kmodel' # 车牌检测 kmodel 文件路径 +rec_kmodel_file = root_dir + 'kmodel/licence_reco.kmodel' # 车牌识别 kmodel 文件路径 +#dict_rec = ["挂", "使", "领", "澳", "港", "皖", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "京", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "桂", "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新", "警", "学", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "_", "-"] +dict_rec = ["gua","shi","ling","ao","gang","wan","hu","jin","yu","ji","jin","meng","liao","ji","hei","su","zhe","jing","min","gan","lu","yu","e","xiang","yue","gui","qiong","chuan","gui","yun","zang","shan","gan","qing","ning","xin","jing","xue","0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "_", "-"] +dict_size = len(dict_rec) +debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) + +#scoped_timing.py 用于debug模式输出程序块运行时间 +class ScopedTiming: + def __init__(self, info="", enable_profile=True): + self.info = info + self.enable_profile = enable_profile + + def __enter__(self): + if self.enable_profile: + self.start_time = time.time_ns() + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.enable_profile: + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") + + +#ai_utils.py +global det_current_kmodel_obj,rec_current_kmodel_obj # 定义全局的 kpu 对象 +global det_ai2d,det_ai2d_input_tensor,det_ai2d_output_tensor,det_ai2d_builder # 定义车牌检测 ai2d 对象 ,并且定义 ai2d 的输入、输出 以及 builder +global rec_ai2d,rec_ai2d_input_tensor,rec_ai2d_output_tensor,rec_ai2d_builder # 定义车牌识别 ai2d 对象 ,并且定义 ai2d 的输入、输出 以及 builder + +# 车牌检测 接收kmodel输出的后处理方法 +def det_kpu_post_process(output_data): + with ScopedTiming("det_kpu_post_process", debug_mode > 0): + results = aidemo.licence_det_postprocess(output_data,[OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH],[det_kmodel_input_shape[2],det_kmodel_input_shape[3]],obj_thresh,nms_thresh) + return results + +# 车牌识别 接收kmodel输出的后处理方法 +def rec_kpu_post_process(output_data): + with ScopedTiming("rec_kpu_post_process", debug_mode > 0): + size = rec_kmodel_input_shape[3] / 4 + result = [] + for i in range(size): + maxs = float("-inf") + index = -1 + for j in range(dict_size): + if (maxs < float(output_data[i * dict_size +j])): + index = j + maxs = output_data[i * dict_size +j] + result.append(index) + + result_str = "" + for i in range(size): + if (result[i] >= 0 and result[i] != 0 and not(i > 0 and result[i-1] == result[i])): + result_str += dict_rec[result[i]-1] + return result_str + +# 车牌检测 ai2d 初始化 +def det_ai2d_init(): + with ScopedTiming("det_ai2d_init",debug_mode > 0): + global det_ai2d + det_ai2d = nn.ai2d() + det_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + det_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + + global det_ai2d_out_tensor + data = np.ones(det_kmodel_input_shape, dtype=np.uint8) + det_ai2d_out_tensor = nn.from_numpy(data) + + global det_ai2d_builder + det_ai2d_builder = det_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], det_kmodel_input_shape) + +# 车牌识别 ai2d 初始化 +def rec_ai2d_init(): + with ScopedTiming("rec_ai2d_init",debug_mode > 0): + global rec_ai2d + rec_ai2d = nn.ai2d() + rec_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + + global rec_ai2d_out_tensor + data = np.ones(rec_kmodel_input_shape, dtype=np.uint8) + rec_ai2d_out_tensor = nn.from_numpy(data) + + rec_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + +# 车牌检测 ai2d 运行 +def det_ai2d_run(rgb888p_img): + with ScopedTiming("det_ai2d_run",debug_mode > 0): + global det_ai2d_input_tensor,det_ai2d_out_tensor,det_ai2d_builder + det_ai2d_input = rgb888p_img.to_numpy_ref() + det_ai2d_input_tensor = nn.from_numpy(det_ai2d_input) + + det_ai2d_builder.run(det_ai2d_input_tensor, det_ai2d_out_tensor) + +# 车牌识别 ai2d 运行 +def rec_ai2d_run(img_array): + with ScopedTiming("rec_ai2d_run",debug_mode > 0): + global rec_ai2d_input_tensor,rec_ai2d_out_tensor,rec_ai2d_builder + rec_ai2d_builder = rec_ai2d.build([1,1,img_array.shape[2],img_array.shape[3]], rec_kmodel_input_shape) + rec_ai2d_input_tensor = nn.from_numpy(img_array) + + rec_ai2d_builder.run(rec_ai2d_input_tensor, rec_ai2d_out_tensor) + +# 车牌检测 ai2d 释放内存 +def det_ai2d_release(): + with ScopedTiming("det_ai2d_release",debug_mode > 0): + global det_ai2d_input_tensor + del det_ai2d_input_tensor + +# 车牌识别 ai2d 释放内存 +def rec_ai2d_release(): + with ScopedTiming("rec_ai2d_release",debug_mode > 0): + global rec_ai2d_input_tensor, rec_ai2d_builder + del rec_ai2d_input_tensor + del rec_ai2d_builder + +# 车牌检测 kpu 初始化 +def det_kpu_init(kmodel_file): + # init kpu and load kmodel + with ScopedTiming("det_kpu_init",debug_mode > 0): + kpu_obj = nn.kpu() + kpu_obj.load_kmodel(kmodel_file) + + det_ai2d_init() + return kpu_obj + +# 车牌识别 kpu 初始化 +def rec_kpu_init(kmodel_file): + # init kpu and load kmodel + with ScopedTiming("rec_kpu_init",debug_mode > 0): + kpu_obj = nn.kpu() + kpu_obj.load_kmodel(kmodel_file) + + rec_ai2d_init() + return kpu_obj + +# 车牌检测 kpu 输入预处理 +def det_kpu_pre_process(rgb888p_img): + det_ai2d_run(rgb888p_img) + with ScopedTiming("det_kpu_pre_process",debug_mode > 0): + global det_current_kmodel_obj,det_ai2d_out_tensor + # set kpu input + det_current_kmodel_obj.set_input_tensor(0, det_ai2d_out_tensor) + +# 车牌识别 kpu 输入预处理 +def rec_kpu_pre_process(img_array): + rec_ai2d_run(img_array) + with ScopedTiming("rec_kpu_pre_process",debug_mode > 0): + global rec_current_kmodel_obj,rec_ai2d_out_tensor + # set kpu input + rec_current_kmodel_obj.set_input_tensor(0, rec_ai2d_out_tensor) + +# 车牌识别 抠图 +def rec_array_pre_process(rgb888p_img,dets): + with ScopedTiming("rec_array_pre_process",debug_mode > 0): + isp_image = rgb888p_img.to_numpy_ref() + imgs_array_boxes = aidemo.ocr_rec_preprocess(isp_image,[OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH],dets) + return imgs_array_boxes + +# 车牌检测 获取 kmodel 输出 +def det_kpu_get_output(): + with ScopedTiming("det_kpu_get_output",debug_mode > 0): + global det_current_kmodel_obj + results = [] + for i in range(det_current_kmodel_obj.outputs_size()): + data = det_current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + tmp2 = result.copy() + del data + results.append(tmp2) + return results + +# 车牌识别 获取 kmodel 输出 +def rec_kpu_get_output(): + with ScopedTiming("rec_kpu_get_output",debug_mode > 0): + global rec_current_kmodel_obj + data = rec_current_kmodel_obj.get_output_tensor(0) + result = data.to_numpy() + result = result.reshape((result.shape[0] * result.shape[1] * result.shape[2])) + tmp = result.copy() + del data + return tmp + +# 车牌检测 kpu 运行 +def det_kpu_run(kpu_obj,rgb888p_img): + global det_current_kmodel_obj + det_current_kmodel_obj = kpu_obj + # (1) 原图预处理,并设置模型输入 + det_kpu_pre_process(rgb888p_img) + # (2) kpu 运行 + with ScopedTiming("det_kpu_run",debug_mode > 0): + kpu_obj.run() + # (3) 释放ai2d资源 + det_ai2d_release() + # (4) 获取kpu输出 + results = det_kpu_get_output() + # (5) kpu结果后处理 + dets = det_kpu_post_process(results) + # 返回 车牌检测结果 + return dets + +# 车牌识别 kpu 运行 +def rec_kpu_run(kpu_obj,rgb888p_img,dets): + global rec_current_kmodel_obj + if (len(dets) == 0): + return [] + rec_current_kmodel_obj = kpu_obj + # (1) 原始图像抠图,车牌检测结果 points 排序 + imgs_array_boxes = rec_array_pre_process(rgb888p_img,dets) + imgs_array = imgs_array_boxes[0] + boxes = imgs_array_boxes[1] + recs = [] + for img_array in imgs_array: + # (2) 抠出后的图像 进行预处理,设置模型输入 + rec_kpu_pre_process(img_array) + # (3) kpu 运行 + with ScopedTiming("rec_kpu_run",debug_mode > 0): + kpu_obj.run() + # (4) 释放ai2d资源 + rec_ai2d_release() + # (5) 获取 kpu 输出 + result = rec_kpu_get_output() + # (6) kpu 结果后处理 + rec = rec_kpu_post_process(result) + recs.append(rec) + # (7) 返回 车牌检测 和 识别结果 + return [boxes,recs] + + +# 车牌检测 kpu 释放内存 +def det_kpu_deinit(kpu_obj): + with ScopedTiming("det_kpu_deinit",debug_mode > 0): + global det_ai2d, det_ai2d_builder, det_ai2d_out_tensor + del kpu_obj + del det_ai2d + del det_ai2d_builder + del det_ai2d_out_tensor + +# 车牌识别 kpu 释放内存 +def rec_kpu_deinit(kpu_obj): + with ScopedTiming("rec_kpu_deinit",debug_mode > 0): + global rec_ai2d, rec_ai2d_out_tensor + del kpu_obj + del rec_ai2d + del rec_ai2d_out_tensor + +#media_utils.py +global draw_img,osd_img #for display 定义全局 作图image对象 +global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 + +#for display 初始化 +def display_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + +# display 释放内存 +def display_deinit(): + display.deinit() + +# display 作图过程 将所有车牌检测框 和 识别结果绘制到屏幕 +def display_draw(dets_recs): + with ScopedTiming("display_draw",debug_mode >0): + global draw_img,osd_img + if dets_recs: + dets = dets_recs[0] + recs = dets_recs[1] + draw_img.clear() + point_8 = np.zeros((8),dtype=np.int16) + for det_index in range(len(dets)): + for i in range(4): + x = dets[det_index][i * 2 + 0]/OUT_RGB888P_WIDTH*DISPLAY_WIDTH + y = dets[det_index][i * 2 + 1]/OUT_RGB888P_HEIGHT*DISPLAY_HEIGHT + point_8[i * 2 + 0] = int(x) + point_8[i * 2 + 1] = int(y) + for i in range(4): + draw_img.draw_line(point_8[i * 2 + 0],point_8[i * 2 + 1],point_8[(i+1) % 4 * 2 + 0],point_8[(i+1) % 4 * 2 + 1],color=(255, 0, 255, 0),thickness=4) + draw_img.draw_string( point_8[6], point_8[7] + 20, recs[det_index] , color=(255,255,153,18) , scale=4) + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + else: + draw_img.clear() + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + +#for camera 初始化 +def camera_init(dev_id): + camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) + + # set chn0 output yuv420sp + camera.set_outsize(dev_id, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + + # set chn2 output rgb88planar + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) + camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_BGR_888_PLANAR) + +# camera 开启 +def camera_start(dev_id): + camera.start_stream(dev_id) + +# camera 读取图像 +def camera_read(dev_id): + with ScopedTiming("camera_read",debug_mode >0): + rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) + return rgb888p_img + +# camera 图像释放 +def camera_release_image(dev_id,rgb888p_img): + with ScopedTiming("camera_release_image",debug_mode >0): + camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) + +# camera 结束 +def camera_stop(dev_id): + camera.stop_stream(dev_id) + +#for media 初始化 +def media_init(): + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + + ret = media.buffer_config(config) + + global media_source, media_sink + media_source = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + media_sink = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + media.create_link(media_source, media_sink) + + # 初始化多媒体buffer + ret = media.buffer_init() + if ret: + return ret + global buffer, draw_img, osd_img + buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # 图层1,用于画框 + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_MPGC) + # 图层2,用于拷贝画框结果,防止画框过程中发生buffer搬运 + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, + phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) + return ret + +# media 释放内存 +def media_deinit(): + global buffer,media_source, media_sink + media.release_buffer(buffer) + media.destroy_link(media_source, media_sink) + + ret = media.buffer_deinit() + return ret + + +#**********for licence_det_rec.py********** +def licence_det_rec_inference(): + print("licence_det_rec start") + kpu_licence_det = det_kpu_init(det_kmodel_file) # 创建车牌检测的 kpu 对象 + kpu_licence_rec = rec_kpu_init(rec_kmodel_file) # 创建车牌识别的 kpu 对象 + camera_init(CAM_DEV_ID_0) # 初始化 camera + display_init() # 初始化 display + + rgb888p_img = None + try: + ret = media_init() + if ret: + print("licence_det_rec, buffer init failed") + return ret + + camera_start(CAM_DEV_ID_0) + time.sleep(5) + + count = 0 + while True: + with ScopedTiming("total",1): + rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 + if rgb888p_img == -1: + print("licence_det_rec, capture_image failed") + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + continue + + # for rgb888planar + if rgb888p_img.format() == image.RGBP888: + dets = det_kpu_run(kpu_licence_det,rgb888p_img) # 执行车牌检测 kpu 运行 以及 后处理过程 + dets_recs = rec_kpu_run(kpu_licence_rec,rgb888p_img,dets) # 执行车牌识别 kpu 运行 以及 后处理过程 + display_draw(dets_recs) # 将得到的检测结果和识别结果 绘制到display + + camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 + rgb888p_img = None + + if (count > 5): + gc.collect() + count = 0 + else: + count += 1 + except Exception as e: + print(f"An error occurred during buffer used: {e}") + finally: + if rgb888p_img is not None: + #先release掉申请的内存再stop + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + + camera_stop(CAM_DEV_ID_0) # 停止 camera + display_deinit() # 释放 display + det_kpu_deinit(kpu_licence_det) # 释放 车牌检测 kpu + rec_kpu_deinit(kpu_licence_rec) # 释放 车牌识别 kpu + gc.collect() + time.sleep(1) + ret = media_deinit() # 释放 整个media + if ret: + print("licence_det_rec, buffer_deinit failed") + return ret + + print("licence_det_rec end") + return 0 + +if __name__ == '__main__': + licence_det_rec_inference() +``` + +### 6. 石头剪刀布 + +```python +import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 +import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +from media.camera import * #摄像头模块 +from media.display import * #显示模块 +from media.media import * #软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 +from random import randint #随机整数生成 +import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 +import time #时间统计 +import gc #垃圾回收模块 +import aicube #aicube模块,封装ai cube 相关后处理 + +##config.py +#display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +#ai原图分辨率输入 +OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) +OUT_RGB888P_HEIGHT = 1080 + +#手掌检测 和 手掌关键点检测 kmodel输入shape +hd_kmodel_input_shape = (1,3,512,512) +hk_kmodel_input_shape = (1,3,256,256) + +#手掌检测 相关参数设置 +confidence_threshold = 0.2 #手掌检测 分数阈值 +nms_threshold = 0.5 #非极大值抑制 阈值 +hd_kmodel_frame_size = [512,512] #手掌检测kmodel输入 w h +hd_frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGHT] #手掌检测原始输入图像 w h +strides = [8,16,32] #手掌检测模型 下采样输出倍数 +num_classes = 1 #检测类别数, 及手掌一种 +nms_option = False #控制最大值抑制的方式 False 类内 True 类间 +labels = ["hand"] #标签名称 +anchors = [26,27,53,52,75,71,80,99,106,82,99,134,140,113,161,172,245,276] #手掌检测模型 锚框 +#手掌关键点检测 相关参数 +hk_kmodel_frame_size = [256,256] #手掌关键点检测 kmodel 输入 w h + +# kmodel 路径 +root_dir = '/sdcard/app/tests/' +hd_kmodel_file = root_dir + 'kmodel/hand_det.kmodel' #手掌检测kmodel路径 +hk_kmodel_file = root_dir + 'kmodel/handkp_det.kmodel' #手掌关键点kmodel路径 +debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) + +# 猜拳模式 0 玩家稳赢 , 1 玩家必输 , n > 2 多局多胜 +guess_mode = 3 + +# 读取石头剪刀布的bin文件方法 +def read_file(file_name): + image_arr = np.fromfile(file_name,dtype=np.uint8) + image_arr = image_arr.reshape((400,400,4)) + return image_arr +# 石头剪刀布的 array +five_image = read_file(root_dir + "utils/five.bin") +fist_image = read_file(root_dir + "utils/fist.bin") +shear_image = read_file(root_dir + "utils/shear.bin") + + +#scoped_timing.py 用于debug模式输出程序块运行时间 +class ScopedTiming: + def __init__(self, info="", enable_profile=True): + self.info = info + self.enable_profile = enable_profile + + def __enter__(self): + if self.enable_profile: + self.start_time = time.time_ns() + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.enable_profile: + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") + +#ai_utils.py +global current_kmodel_obj # 定义全局的 kpu 对象 +global hd_ai2d,hd_ai2d_input_tensor,hd_ai2d_output_tensor,hd_ai2d_builder # 定义手掌检测 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder +global hk_ai2d,hk_ai2d_input_tensor,hk_ai2d_output_tensor,hk_ai2d_builder # 定义手掌关键点检测 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder +global counts_guess, player_win, k230_win, sleep_end, set_stop_id # 定义猜拳游戏的参数:猜拳次数、玩家赢次、k230赢次、是否停顿、是狗暂停 + +# 手掌检测 ai2d 初始化 +def hd_ai2d_init(): + with ScopedTiming("hd_ai2d_init",debug_mode > 0): + global hd_ai2d + global hd_ai2d_builder + # 计算padding值 + ori_w = OUT_RGB888P_WIDTH + ori_h = OUT_RGB888P_HEIGHT + width = hd_kmodel_frame_size[0] + height = hd_kmodel_frame_size[1] + ratiow = float(width) / ori_w + ratioh = float(height) / ori_h + if ratiow < ratioh: + ratio = ratiow + else: + ratio = ratioh + new_w = int(ratio * ori_w) + new_h = int(ratio * ori_h) + dw = float(width - new_w) / 2 + dh = float(height - new_h) / 2 + top = int(round(dh - 0.1)) + bottom = int(round(dh + 0.1)) + left = int(round(dw - 0.1)) + right = int(round(dw - 0.1)) + + # init kpu and load kmodel + hd_ai2d = nn.ai2d() + hd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + hd_ai2d.set_pad_param(True, [0,0,0,0,top,bottom,left,right], 0, [114,114,114]) + hd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) + hd_ai2d_builder = hd_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,height,width]) + + global hd_ai2d_output_tensor + data = np.ones(hd_kmodel_input_shape, dtype=np.uint8) + hd_ai2d_output_tensor = nn.from_numpy(data) + +# 手掌检测 ai2d 运行 +def hd_ai2d_run(rgb888p_img): + with ScopedTiming("hd_ai2d_run",debug_mode > 0): + global hd_ai2d_input_tensor,hd_ai2d_output_tensor,hd_ai2d_builder + hd_ai2d_input = rgb888p_img.to_numpy_ref() + hd_ai2d_input_tensor = nn.from_numpy(hd_ai2d_input) + + hd_ai2d_builder.run(hd_ai2d_input_tensor, hd_ai2d_output_tensor) + +# 手掌检测 ai2d 释放内存 +def hd_ai2d_release(): + with ScopedTiming("hd_ai2d_release",debug_mode > 0): + global hd_ai2d_input_tensor + del hd_ai2d_input_tensor + +# 手掌检测 kpu 初始化 +def hd_kpu_init(hd_kmodel_file): + # init kpu and load kmodel + with ScopedTiming("hd_kpu_init",debug_mode > 0): + hd_kpu_obj = nn.kpu() + hd_kpu_obj.load_kmodel(hd_kmodel_file) + + hd_ai2d_init() + return hd_kpu_obj + +# 手掌检测 kpu 输入预处理 +def hd_kpu_pre_process(rgb888p_img): + hd_ai2d_run(rgb888p_img) + with ScopedTiming("hd_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,hd_ai2d_output_tensor + # set kpu input + current_kmodel_obj.set_input_tensor(0, hd_ai2d_output_tensor) + +# 手掌检测 kpu 获取 kmodel 输出 +def hd_kpu_get_output(): + with ScopedTiming("hd_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + result = result.reshape((result.shape[0]*result.shape[1]*result.shape[2]*result.shape[3])) + tmp2 = result.copy() + del result + results.append(tmp2) + return results + +# 手掌检测 kpu 运行 +def hd_kpu_run(kpu_obj,rgb888p_img): + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1) 原始图像预处理,并设置模型输入 + hd_kpu_pre_process(rgb888p_img) + # (2) kpu 运行 + with ScopedTiming("hd_kpu_run",debug_mode > 0): + current_kmodel_obj.run() + # (3) 释放ai2d资源 + hd_ai2d_release() + # (4) 获取kpu输出 + results = hd_kpu_get_output() + # (5) kpu结果后处理 + dets = aicube.anchorbasedet_post_process( results[0], results[1], results[2], hd_kmodel_frame_size, hd_frame_size, strides, num_classes, confidence_threshold, nms_threshold, anchors, nms_option) + # (6) 返回 手掌检测 结果 + return dets + +# 手掌检测 kpu 释放内存 +def hd_kpu_deinit(kpu_obj): + with ScopedTiming("hd_kpu_deinit",debug_mode > 0): + global hd_ai2d,hd_ai2d_output_tensor,hd_ai2d_builder + del kpu_obj + del hd_ai2d + del hd_ai2d_output_tensor + del hd_ai2d_builder + +# 手掌关键点检测 ai2d 初始化 +def hk_ai2d_init(): + with ScopedTiming("hk_ai2d_init",debug_mode > 0): + global hk_ai2d + hk_ai2d = nn.ai2d() + hk_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + + global hk_ai2d_output_tensor + data = np.ones(hk_kmodel_input_shape, dtype=np.uint8) + hk_ai2d_output_tensor = nn.from_numpy(data) + +# 手掌关键点检测 ai2d 运行 +def hk_ai2d_run(rgb888p_img, x, y, w, h): + with ScopedTiming("hk_ai2d_run",debug_mode > 0): + global hk_ai2d,hk_ai2d_input_tensor,hk_ai2d_output_tensor + hk_ai2d_input = rgb888p_img.to_numpy_ref() + hk_ai2d_input_tensor = nn.from_numpy(hk_ai2d_input) + + hk_ai2d.set_crop_param(True, x, y, w, h) + hk_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) + + global hk_ai2d_builder + hk_ai2d_builder = hk_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,hk_kmodel_frame_size[1],hk_kmodel_frame_size[0]]) + hk_ai2d_builder.run(hk_ai2d_input_tensor, hk_ai2d_output_tensor) + +# 手掌关键点检测 ai2d 释放内存 +def hk_ai2d_release(): + with ScopedTiming("hk_ai2d_release",debug_mode > 0): + global hk_ai2d_input_tensor,hk_ai2d_builder + del hk_ai2d_input_tensor + del hk_ai2d_builder + +# 手掌关键点检测 kpu 初始化 +def hk_kpu_init(hk_kmodel_file): + # init kpu and load kmodel + with ScopedTiming("hk_kpu_init",debug_mode > 0): + hk_kpu_obj = nn.kpu() + hk_kpu_obj.load_kmodel(hk_kmodel_file) + + hk_ai2d_init() + return hk_kpu_obj + +# 手掌关键点检测 kpu 输入预处理 +def hk_kpu_pre_process(rgb888p_img, x, y, w, h): + hk_ai2d_run(rgb888p_img, x, y, w, h) + with ScopedTiming("hk_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,hk_ai2d_output_tensor + # set kpu input + current_kmodel_obj.set_input_tensor(0, hk_ai2d_output_tensor) + +# 手掌关键点检测 kpu 获得 kmodel 输出 +def hk_kpu_get_output(): + with ScopedTiming("hk_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + + result = result.reshape((result.shape[0]*result.shape[1])) + tmp2 = result.copy() + del result + results.append(tmp2) + return results + +# 手掌关键点检测 接收kmodel结果的后处理 +def hk_kpu_post_process(results, x, y, w, h): + results_show = np.zeros(results.shape,dtype=np.int16) + # results_show = np.zeros(len(results),dtype=np.int16) + results_show[0::2] = results[0::2] * w + x + results_show[1::2] = results[1::2] * h + y + return results_show + +# 手掌关键点检测 kpu 运行 +def hk_kpu_run(kpu_obj,rgb888p_img, x, y, w, h): + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1) 原图预处理,并设置模型输入 + hk_kpu_pre_process(rgb888p_img, x, y, w, h) + # (2) kpu 运行 + with ScopedTiming("hk_kpu_run",debug_mode > 0): + current_kmodel_obj.run() + # (3) 释放ai2d资源 + hk_ai2d_release() + # (4) 获取kpu输出 + results = hk_kpu_get_output() + # (5) kpu结果后处理 + result = hk_kpu_post_process(results[0],x,y,w,h) + # (6) 返回 关键点检测 结果 + return result + +# 手掌关键点检测 kpu 释放内存 +def hk_kpu_deinit(kpu_obj): + with ScopedTiming("hk_kpu_deinit",debug_mode > 0): + global hk_ai2d,hk_ai2d_output_tensor + del kpu_obj + del hk_ai2d + del hk_ai2d_output_tensor + +# 手掌关键点检测 计算角度 +def hk_vector_2d_angle(v1,v2): + v1_x = v1[0] + v1_y = v1[1] + v2_x = v2[0] + v2_y = v2[1] + v1_norm = np.sqrt(v1_x * v1_x+ v1_y * v1_y) + v2_norm = np.sqrt(v2_x * v2_x + v2_y * v2_y) + dot_product = v1_x * v2_x + v1_y * v2_y + cos_angle = dot_product/(v1_norm*v2_norm) + angle = np.acos(cos_angle)*180/np.pi + # if (angle>180): + # return 65536 + return angle + +# 利用手掌关键点检测的结果 判断手掌手势 +def hk_gesture(kpu_hand_keypoint_detect,rgb888p_img,det_box): + x1, y1, x2, y2 = int(det_box[2]),int(det_box[3]),int(det_box[4]),int(det_box[5]) + w = int(x2 - x1) + h = int(y2 - y1) + + if (h<(0.1*OUT_RGB888P_HEIGHT)): + return + if (w<(0.25*OUT_RGB888P_WIDTH) and ((x1<(0.03*OUT_RGB888P_WIDTH)) or (x2>(0.97*OUT_RGB888P_WIDTH)))): + return + if (w<(0.15*OUT_RGB888P_WIDTH) and ((x1<(0.01*OUT_RGB888P_WIDTH)) or (x2>(0.99*OUT_RGB888P_WIDTH)))): + return + + length = max(w,h)/2 + cx = (x1+x2)/2 + cy = (y1+y2)/2 + ratio_num = 1.26*length + + x1_kp = int(max(0,cx-ratio_num)) + y1_kp = int(max(0,cy-ratio_num)) + x2_kp = int(min(OUT_RGB888P_WIDTH-1, cx+ratio_num)) + y2_kp = int(min(OUT_RGB888P_HEIGHT-1, cy+ratio_num)) + w_kp = int(x2_kp - x1_kp + 1) + h_kp = int(y2_kp - y1_kp + 1) + + results = hk_kpu_run(kpu_hand_keypoint_detect,rgb888p_img, x1_kp, y1_kp, w_kp, h_kp) + + angle_list = [] + for i in range(5): + angle = hk_vector_2d_angle([(results[0]-results[i*8+4]), (results[1]-results[i*8+5])],[(results[i*8+6]-results[i*8+8]),(results[i*8+7]-results[i*8+9])]) + angle_list.append(angle) + + thr_angle = 65. + thr_angle_thumb = 53. + thr_angle_s = 49. + gesture_str = None + if 65535. not in angle_list: + if (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "fist" + elif (angle_list[0]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "gun" + elif (angle_list[0]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]5) and (angle_list[1]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "one" + elif (angle_list[0]thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]thr_angle_thumb) and (angle_list[1]thr_angle): + gesture_str = "three" + elif (angle_list[0]thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "thumbUp" + elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "yeah" + + return gesture_str + + +#media_utils.py +global draw_img,osd_img,masks #for display 定义全局 作图image对象 +global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 + +#for display 初始化 +def display_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + +# display 释放内存 +def display_deinit(): + display.deinit() + +#for camera 初始化 +def camera_init(dev_id): + camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) + + # set chn0 output yuv420sp + camera.set_outsize(dev_id, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + + # set chn2 output rgb88planar + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) + camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) + +# camera 开启 +def camera_start(dev_id): + camera.start_stream(dev_id) + +# camera 读取图像 +def camera_read(dev_id): + with ScopedTiming("camera_read",debug_mode >0): + rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) + return rgb888p_img + +# camera 图像释放 +def camera_release_image(dev_id,rgb888p_img): + with ScopedTiming("camera_release_image",debug_mode >0): + camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) + +# camera 结束 +def camera_stop(dev_id): + camera.stop_stream(dev_id) + +#for media 初始化 +def media_init(): + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + + ret = media.buffer_config(config) + + global media_source, media_sink + media_source = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + media_sink = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + media.create_link(media_source, media_sink) + + # 初始化多媒体buffer + ret = media.buffer_init() + if ret: + return ret + global buffer, draw_img, osd_img, masks + buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # 图层1,用于画框 + masks = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888,alloc=image.ALLOC_REF,data=masks) + # 图层2,用于拷贝画框结果,防止画框过程中发生buffer搬运 + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, + phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) + return ret + +# media 释放内存 +def media_deinit(): + global buffer,media_source, media_sink + media.release_buffer(buffer) + media.destroy_link(media_source, media_sink) + + ret = media.buffer_deinit() + return ret + + +#**********for finger_guessing.py********** +def finger_guessing_inference(): + print("finger_guessing_test start") + kpu_hand_detect = hd_kpu_init(hd_kmodel_file) # 创建手掌检测的 kpu 对象 + kpu_hand_keypoint_detect = hk_kpu_init(hk_kmodel_file) # 创建手掌关键点检测的 kpu 对象 + camera_init(CAM_DEV_ID_0) # 初始化 camera + display_init() # 初始化 display + + rgb888p_img = None + try: + ret = media_init() + if ret: + print("finger_guessing, buffer init failed") + return ret + + camera_start(CAM_DEV_ID_0) # 开启 camera + counts_guess = -1 # 猜拳次数 计数 + player_win = 0 # 玩家 赢次计数 + k230_win = 0 # k230 赢次计数 + sleep_end = False # 是否 停顿 + set_stop_id = True # 是否 暂停猜拳 + LIBRARY = ["fist","yeah","five"] # 猜拳 石头剪刀布 三种方案的dict + + count = 0 + while True: + with ScopedTiming("total",1): + rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图像 + if rgb888p_img == -1: + print("finger_guessing, capture_image failed") + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + continue + + # for rgb888planar + if rgb888p_img.format() == image.RGBP888: + with ScopedTiming("trigger time", debug_mode > 0): + dets_no_pro = hd_kpu_run(kpu_hand_detect,rgb888p_img) # 执行手掌检测 kpu 运行 以及 后处理过程 + gesture = "" + draw_img.clear() + + dets = [] + for det_box in dets_no_pro: + if det_box[4] < OUT_RGB888P_WIDTH - 10 : + dets.append(det_box) + + for det_box in dets: + gesture = hk_gesture(kpu_hand_keypoint_detect,rgb888p_img,det_box) # 执行手掌关键点检测 kpu 运行 以及 后处理过程 得到手势类型 + if (len(dets) >= 2): + draw_img.draw_string( 300 , 500, "Must have one hand !", color=(255,255,0,0), scale=7) + draw_img.copy_to(osd_img) + elif (guess_mode == 0): + if (gesture == "fist"): + masks[:400,:400,:] = shear_image + elif (gesture == "five"): + masks[:400,:400,:] = fist_image + elif (gesture == "yeah"): + masks[:400,:400,:] = five_image + draw_img.copy_to(osd_img) + elif (guess_mode == 1): + if (gesture == "fist"): + masks[:400,:400,:] = five_image + elif (gesture == "five"): + masks[:400,:400,:] = shear_image + elif (gesture == "yeah"): + masks[:400,:400,:] = fist_image + draw_img.copy_to(osd_img) + else: + if (sleep_end): + time.sleep_ms(2000) + sleep_end = False + if (len(dets) == 0): + set_stop_id = True + if (counts_guess == -1 and gesture != "fist" and gesture != "yeah" and gesture != "five"): + draw_img.draw_string( 400 , 450, "G A M E S T A R T", color=(255,255,0,0), scale=7) + draw_img.draw_string( 400 , 550, " 1 S E T ", color=(255,255,0,0), scale=7) + draw_img.copy_to(osd_img) + elif (counts_guess == guess_mode): + draw_img.clear() + if (k230_win > player_win): + draw_img.draw_string( 400 , 450, "Y O U L O S E", color=(255,255,0,0), scale=7) + elif (k230_win < player_win): + draw_img.draw_string( 400 , 450, "Y O U W I N", color=(255,255,0,0), scale=7) + else: + draw_img.draw_string( 400 , 450, "T I E G A M E", color=(255,255,0,0), scale=7) + draw_img.copy_to(osd_img) + counts_guess = -1 + player_win = 0 + k230_win = 0 + + sleep_end = True + else: + if (set_stop_id): + if (counts_guess == -1 and (gesture == "fist" or gesture == "yeah" or gesture == "five")): + counts_guess = 0 + if (counts_guess != -1 and (gesture == "fist" or gesture == "yeah" or gesture == "five")): + k230_guess = randint(1,10000) % 3 + if (gesture == "fist" and LIBRARY[k230_guess] == "yeah"): + player_win += 1 + elif (gesture == "fist" and LIBRARY[k230_guess] == "five"): + k230_win += 1 + if (gesture == "yeah" and LIBRARY[k230_guess] == "fist"): + k230_win += 1 + elif (gesture == "yeah" and LIBRARY[k230_guess] == "five"): + player_win += 1 + if (gesture == "five" and LIBRARY[k230_guess] == "fist"): + player_win += 1 + elif (gesture == "five" and LIBRARY[k230_guess] == "yeah"): + k230_win += 1 + + if (LIBRARY[k230_guess] == "fist"): + masks[:400,:400,:] = fist_image + elif (LIBRARY[k230_guess] == "five"): + masks[:400,:400,:] = five_image + elif (LIBRARY[k230_guess] == "yeah"): + masks[:400,:400,:] = shear_image + + counts_guess += 1; + draw_img.draw_string( 400 , 450, " " + str(counts_guess) + " S E T ", color=(255,255,0,0), scale=7) + draw_img.copy_to(osd_img) + set_stop_id = False + sleep_end = True + + else: + draw_img.draw_string( 400 , 450, " " + str(counts_guess+1) + " S E T ", color=(255,255,0,0), scale=7) + draw_img.copy_to(osd_img) + else: + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) # 将得到的图像 绘制到 display + + camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图形 + rgb888p_img = None + + if (count > 5): + gc.collect() + count = 0 + else: + count += 1 + except Exception as e: + print(f"An error occurred during buffer used: {e}") + finally: + if rgb888p_img is not None: + #先release掉申请的内存再stop + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + + camera_stop(CAM_DEV_ID_0) # 停止 camera + display_deinit() # 停止 display + hd_kpu_deinit(kpu_hand_detect) # 释放手掌检测 kpu + hk_kpu_deinit(kpu_hand_keypoint_detect) # 释放手掌关键点检测 kpu + + gc.collect() + ret = media_deinit() # 释放 整个 media + if ret: + print("finger_guessing, buffer_deinit failed") + return ret + + print("finger_guessing_test end") + return 0 + +if __name__ == '__main__': + finger_guessing_inference() +``` + +### 7. OCR识别 + +```python +import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 +import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +from media.camera import * #摄像头模块 +from media.display import * #显示模块 +from media.media import * #软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 +import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 +import time #时间统计 +import gc #垃圾回收模块 +import aicube #aicube模块,封装检测分割等任务相关后处理 + +# display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +# ai原图分辨率输入 +OUT_RGB888P_WIDTH = ALIGN_UP(640, 16) +OUT_RGB888P_HEIGH = 360 + +#kmodel输入参数设置 +kmodel_input_shape_det = (1,3,640,640) # OCR检测模型的kmodel输入分辨率 +kmodel_input_shape_rec = (1,3,32,512) # OCR识别模型的kmodel输入分辨率 +rgb_mean = [0,0,0] # ai2d padding的值 + +#检测步骤kmodel相关参数设置 +mask_threshold = 0.25 # 二值化mask阈值 +box_threshold = 0.3 # 检测框分数阈值 + +#文件配置 +root_dir = '/sdcard/app/tests/' +kmodel_file_det = root_dir + 'kmodel/ocr_det_int16.kmodel' # 检测模型路径 +kmodel_file_rec = root_dir + "kmodel/ocr_rec_int16.kmodel" # 识别模型路径 +dict_path = root_dir + 'utils/dict.txt' # 调试模式 大于0(调试)、 反之 (不调试) +debug_mode = 0 + +# OCR字典读取 +with open(dict_path, 'r') as file: + line_one = file.read(100000) + line_list = line_one.split("\r\n") +DICT = {num: char.replace("\r", "").replace("\n", "") for num, char in enumerate(line_list)} + +# scoped_timing.py 用于debug模式输出程序块运行时间 +class ScopedTiming: + def __init__(self, info="", enable_profile=True): + self.info = info + self.enable_profile = enable_profile + + def __enter__(self): + if self.enable_profile: + self.start_time = time.time_ns() + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.enable_profile: + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") + +# utils 设定全局变量 +global current_kmodel_obj # 设置全局kpu对象 +global ai2d_det,ai2d_input_tensor_det,ai2d_output_tensor_det,ai2d_builder_det,ai2d_input_det # 设置检测模型的ai2d对象,并定义ai2d的输入、输出和builder +global ai2d_rec,ai2d_input_tensor_rec,ai2d_output_tensor_rec,ai2d_builder_rec # 设置识别模型的ai2d对象,并定义ai2d的输入、输出和builder + +# padding方法,一边padding,右padding或者下padding +def get_pad_one_side_param(out_img_size,input_img_size): + dst_w = out_img_size[0] + dst_h = out_img_size[1] + + input_width = input_img_size[0] + input_high = input_img_size[1] + + ratio_w = dst_w / input_width + ratio_h = dst_h / input_high + if ratio_w < ratio_h: + ratio = ratio_w + else: + ratio = ratio_h + + new_w = (int)(ratio * input_width) + new_h = (int)(ratio * input_high) dw = (dst_w - new_w) / 2 dh = (dst_h - new_h) / 2 - # 四舍五入,确保padding是整数 + top = (int)(round(0)) bottom = (int)(round(dh * 2 + 0.1)) left = (int)(round(0)) right = (int)(round(dw * 2 - 0.1)) return [0, 0, 0, 0, top, bottom, left, right] -def fd_ai2d_init(): - # 人脸检测模型ai2d初始化 - with ScopedTiming("fd_ai2d_init",debug_mode > 0): - # (1)创建人脸检测ai2d对象 - global fd_ai2d - fd_ai2d = nn.ai2d() - # (2)设置人脸检测ai2d参数 - fd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, +# 检测步骤ai2d初始化 +def ai2d_init_det(): + with ScopedTiming("ai2d_init_det",debug_mode > 0): + global ai2d_det + ai2d_det = nn.ai2d() + ai2d_det.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + ai2d_det.set_pad_param(True, get_pad_one_side_param([kmodel_input_shape_det[3],kmodel_input_shape_det[2]], [OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH]), 0, [0, 0, 0]) + ai2d_det.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + global ai2d_output_tensor_det + data = np.ones(kmodel_input_shape_det, dtype=np.uint8) + ai2d_output_tensor_det = nn.from_numpy(data) + global ai2d_builder_det + ai2d_builder_det = ai2d_det.build([1, 3, OUT_RGB888P_HEIGH, OUT_RGB888P_WIDTH], [1, 3, kmodel_input_shape_det[2], kmodel_input_shape_det[3]]) + + +# 检测步骤的ai2d 运行,完成ai2d_init_det预设的预处理 +def ai2d_run_det(rgb888p_img): + with ScopedTiming("ai2d_run_det",debug_mode > 0): + global ai2d_input_tensor_det,ai2d_builder_det,ai2d_input_det + ai2d_input_det = rgb888p_img.to_numpy_ref() + ai2d_input_tensor_det = nn.from_numpy(ai2d_input_det) + global ai2d_output_tensor_det + ai2d_builder_det.run(ai2d_input_tensor_det, ai2d_output_tensor_det) + +# 识别步骤ai2d初始化 +def ai2d_init_rec(): + with ScopedTiming("ai2d_init_res",debug_mode > 0): + global ai2d_rec,ai2d_output_tensor_rec + ai2d_rec = nn.ai2d() + ai2d_rec.set_dtype(nn.ai2d_format.RGB_packed, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) - fd_ai2d.set_pad_param(True, get_pad_one_side_param(), 0, rgb_mean) - fd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + ai2d_out_data = np.ones((1, 3, kmodel_input_shape_rec[2], kmodel_input_shape_rec[3]), dtype=np.uint8) + ai2d_output_tensor_rec = nn.from_numpy(ai2d_out_data) - #(3)人脸检测ai2d_builder,根据人脸检测ai2d参数、输入输出大小创建ai2d_builder对象 - global fd_ai2d_builder - fd_ai2d_builder = fd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fd_kmodel_input_shape) - #(4)创建人脸检测ai2d_output_tensor,用于保存人脸检测ai2d输出 - global fd_ai2d_output_tensor - data = np.ones(fd_kmodel_input_shape, dtype=np.uint8) - fd_ai2d_output_tensor = nn.from_numpy(data) +# 识别步骤ai2d运行 +def ai2d_run_rec(rgb888p_img): + with ScopedTiming("ai2d_run_rec",debug_mode > 0): + global ai2d_rec,ai2d_builder_rec,ai2d_input_tensor_rec,ai2d_output_tensor_rec + ai2d_rec.set_pad_param(True, get_pad_one_side_param([kmodel_input_shape_rec[3],kmodel_input_shape_rec[2]],[rgb888p_img.shape[2],rgb888p_img.shape[1]]), 0, [0, 0, 0]) + ai2d_rec.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + ai2d_builder_rec = ai2d_rec.build([rgb888p_img.shape[0], rgb888p_img.shape[1], rgb888p_img.shape[2],rgb888p_img.shape[3]], + [1, 3, kmodel_input_shape_rec[2], kmodel_input_shape_rec[3]]) + ai2d_input_tensor_rec = nn.from_numpy(rgb888p_img) + ai2d_builder_rec.run(ai2d_input_tensor_rec, ai2d_output_tensor_rec) -def fd_ai2d_run(rgb888p_img): - # 根据人脸检测ai2d参数,对原图rgb888p_img进行预处理 - with ScopedTiming("fd_ai2d_run",debug_mode > 0): - global fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder - # (1)根据原图构建ai2d_input_tensor对象 - ai2d_input = rgb888p_img.to_numpy_ref() - fd_ai2d_input_tensor = nn.from_numpy(ai2d_input) - # (2)运行人脸检测ai2d_builder,将结果保存到人脸检测ai2d_output_tensor中 - fd_ai2d_builder.run(fd_ai2d_input_tensor, fd_ai2d_output_tensor) +# 检测步骤ai2d释放内存 +def ai2d_release_det(): + with ScopedTiming("ai2d_release_det",debug_mode > 0): + global ai2d_input_tensor_det + del ai2d_input_tensor_det -def fd_ai2d_release(): - # 释放人脸检测ai2d_input_tensor - with ScopedTiming("fd_ai2d_release",debug_mode > 0): - global fd_ai2d_input_tensor - del fd_ai2d_input_tensor +# 识别步骤ai2d释放内存 +def ai2d_release_rec(): + with ScopedTiming("ai2d_release_rec",debug_mode > 0): + global ai2d_input_tensor_rec + del ai2d_input_tensor_rec +# 检测步骤kpu初始化 +def kpu_init_det(kmodel_file): + # init kpu and load kmodel + with ScopedTiming("kpu_init_det",debug_mode > 0): + kpu_obj = nn.kpu() + kpu_obj.load_kmodel(kmodel_file) + ai2d_init_det() + return kpu_obj -def fd_kpu_init(kmodel_file): - # 初始化人脸检测kpu对象,并加载kmodel - with ScopedTiming("fd_kpu_init",debug_mode > 0): - # 初始化人脸检测kpu对象 +# 识别步骤kpu初始化 +def kpu_init_rec(kmodel_file): + # init kpu and load kmodel + with ScopedTiming("kpu_init_rec",debug_mode > 0): kpu_obj = nn.kpu() - # 加载人脸检测kmodel kpu_obj.load_kmodel(kmodel_file) - # 初始化人脸检测ai2d - fd_ai2d_init() + ai2d_init_rec() return kpu_obj -def fd_kpu_pre_process(rgb888p_img): - # 设置人脸检测kpu输入 - # 使用人脸检测ai2d对原图进行预处理(padding,resize) - fd_ai2d_run(rgb888p_img) - with ScopedTiming("fd_kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,fd_ai2d_output_tensor - # 设置人脸检测kpu输入 - current_kmodel_obj.set_input_tensor(0, fd_ai2d_output_tensor) +# 检测步骤预处理,调用ai2d_run_det实现,并将ai2d的输出设置为kmodel的输入 +def kpu_pre_process_det(rgb888p_img): + ai2d_run_det(rgb888p_img) + with ScopedTiming("kpu_pre_process_det",debug_mode > 0): + global current_kmodel_obj,ai2d_output_tensor_det + # set kpu input + current_kmodel_obj.set_input_tensor(0, ai2d_output_tensor_det) + +# 识别步骤预处理,调用ai2d_init_run_rec实现,并将ai2d的输出设置为kmodel的输入 +def kpu_pre_process_rec(rgb888p_img): + ai2d_run_rec(rgb888p_img) + with ScopedTiming("kpu_pre_process_rec",debug_mode > 0): + global current_kmodel_obj,ai2d_output_tensor_rec + # set kpu input + current_kmodel_obj.set_input_tensor(0, ai2d_output_tensor_rec) + + +# 获取kmodel的输出 +def kpu_get_output(): + with ScopedTiming("kpu_get_output",debug_mode > 0): + global current_kmodel_obj + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + del data + results.append(result) + return results + +# 检测步骤kpu运行 +def kpu_run_det(kpu_obj,rgb888p_img): + # kpu推理 + global current_kmodel_obj + current_kmodel_obj = kpu_obj + #(1)原图像预处理并设置模型输入 + kpu_pre_process_det(rgb888p_img) + #(2)kpu推理 + with ScopedTiming("kpu_run_det",debug_mode > 0): + # 检测运行 + kpu_obj.run() + #(3)检测释放ai2d资源 + ai2d_release_det() + #(4)获取检测kpu输出 + results = kpu_get_output() + #(5)CHW转HWC + global ai2d_input_det + tmp = (ai2d_input_det.shape[0], ai2d_input_det.shape[1], ai2d_input_det.shape[2]) + ai2d_input_det = ai2d_input_det.reshape((ai2d_input_det.shape[0], ai2d_input_det.shape[1] * ai2d_input_det.shape[2])) + ai2d_input_det = ai2d_input_det.transpose() + tmp2 = ai2d_input_det.copy() + tmp2 = tmp2.reshape((tmp[1], tmp[2], tmp[0])) + #(6)后处理,aicube.ocr_post_process接口说明: + # 接口:aicube.ocr_post_process(threshold_map,ai_isp,kmodel_input_shape,isp_shape,mask_threshold,box_threshold); + # 参数说明: + # threshold_map: DBNet模型的输出为(N,kmodel_input_shape_det[2],kmodel_input_shape_det[3],2),两个通道分别为threshold map和segmentation map + # 后处理过程只使用threshold map,因此将results[0][:,:,:,0] reshape成一维传给接口使用。 + # ai_isp:后处理还会返回基于原图的检测框裁剪数据,因此要将原图数据reshape为一维传给接口处理。 + # kmodel_input_shape:kmodel输入分辨率。 + # isp_shape:AI原图分辨率。要将kmodel输出分辨率的检测框坐标映射到原图分辨率上,需要使用这两个分辨率的值。 + # mask_threshold:用于二值化图像获得文本区域。 + # box_threshold:检测框分数阈值,低于该阈值的检测框不计入结果。 + with ScopedTiming("kpu_post",debug_mode > 0): + # 调用aicube模块的ocr_post_process完成ocr检测的后处理 + # det_results结构为[[crop_array_nhwc,[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y]],...] + det_results = aicube.ocr_post_process(results[0][:, :, :, 0].reshape(-1), tmp2.reshape(-1), + [kmodel_input_shape_det[3], kmodel_input_shape_det[2]], + [OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH], mask_threshold, box_threshold) + return det_results + +# 识别步骤后处理 +def kpu_run_rec(kpu_obj,rgb888p_img): + # kpu推理 + global current_kmodel_obj + current_kmodel_obj = kpu_obj + #(1)识别预处理并设置模型输入 + kpu_pre_process_rec(rgb888p_img) + #(2)kpu推理 + with ScopedTiming("kpu_run_rec",debug_mode > 0): + # 识别运行 + kpu_obj.run() + #(3)识别释放ai2d资源 + ai2d_release_rec() + #(4)获取识别kpu输出 + results = kpu_get_output() + #(5)识别后处理,results结构为[(N,MAX_LENGTH,DICT_LENGTH),...],在axis=2维度上取argmax获取当前识别字符在字典中的索引 + preds = np.argmax(results[0], axis=2).reshape((-1)) + output_txt = "" + for i in range(len(preds)): + # 当前识别字符不是字典的最后一个字符并且和前一个字符不重复(去重),加入识别结果字符串 + if preds[i] != (len(DICT) - 1) and (not (i > 0 and preds[i - 1] == preds[i])): + output_txt = output_txt + DICT[preds[i]] + return output_txt + +# 释放检测步骤kpu、ai2d以及ai2d相关的tensor +def kpu_deinit_det(kpu_obj): + with ScopedTiming("kpu_deinit",debug_mode > 0): + global ai2d_det,ai2d_output_tensor_det + del kpu_obj + del ai2d_det + del ai2d_output_tensor_det + +# 释放识别步骤kpu +def kpu_deinit_rec(kpu_obj): + with ScopedTiming("kpu_deinit",debug_mode > 0): + global ai2d_rec,ai2d_output_tensor_rec + del kpu_obj + del ai2d_rec + del ai2d_output_tensor_rec + + +#********************for media_utils.py******************** + +global draw_img,osd_img #for display +global buffer,media_source,media_sink #for media + +# display初始化 +def display_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + +# 释放display +def display_deinit(): + display.deinit() + +# display显示检测识别框 +def display_draw(det_results): + with ScopedTiming("display_draw",debug_mode >0): + global draw_img,osd_img + if det_results: + draw_img.clear() + # 循环绘制所有检测到的框 + for j in det_results: + # 将原图的坐标点转换成显示的坐标点,循环绘制四条直线,得到一个矩形框 + for i in range(4): + x1 = j[1][(i * 2)] / OUT_RGB888P_WIDTH * DISPLAY_WIDTH + y1 = j[1][(i * 2 + 1)] / OUT_RGB888P_HEIGH * DISPLAY_HEIGHT + x2 = j[1][((i + 1) * 2) % 8] / OUT_RGB888P_WIDTH * DISPLAY_WIDTH + y2 = j[1][((i + 1) * 2 + 1) % 8] / OUT_RGB888P_HEIGH * DISPLAY_HEIGHT + draw_img.draw_line((int(x1), int(y1), int(x2), int(y2)), color=(255, 0, 0, 255), + thickness=5) + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + else: + draw_img.clear() + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + +# camera初始化 +def camera_init(dev_id): + camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) + # camera获取的通道0图像送display显示 + # set chn0 output yuv420sp + camera.set_outsize(dev_id, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # camera获取的通道2图像送ai处理 + # set chn2 output rgb88planar + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) + +# camera 启动视频流 +def camera_start(dev_id): + camera.start_stream(dev_id) -def fd_kpu_get_output(): - # 获取人脸检测kpu输出 - with ScopedTiming("fd_kpu_get_output",debug_mode > 0): - global current_kmodel_obj - # 获取模型输出,并将结果转换为numpy,以便进行人脸检测后处理 - results = [] - for i in range(current_kmodel_obj.outputs_size()): - data = current_kmodel_obj.get_output_tensor(i) - result = data.to_numpy() - del data - results.append(result) - return results +# camera 捕获一帧图像 +def camera_read(dev_id): + with ScopedTiming("camera_read",debug_mode >0): + rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) + return rgb888p_img -def fd_kpu_run(kpu_obj,rgb888p_img): - global current_kmodel_obj - current_kmodel_obj = kpu_obj - # (1)原图预处理,并设置模型输入 - fd_kpu_pre_process(rgb888p_img) - # (2)人脸检测kpu推理 - with ScopedTiming("fd kpu_run",debug_mode > 0): - kpu_obj.run() - # (3)释放人脸检测ai2d资源 - fd_ai2d_release() - # (4)获取人俩检测kpu输出 - results = fd_kpu_get_output() - # (5)人脸检测kpu结果后处理 - with ScopedTiming("fd kpu_post",debug_mode > 0): - post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, - [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) - # (6)返回人脸检测框 - if len(post_ret)==0: - return post_ret,post_ret - else: - return post_ret[0],post_ret[1] #0:det,1:landm,2:score +# camera 释放内存 +def camera_release_image(dev_id,rgb888p_img): + with ScopedTiming("camera_release_image",debug_mode >0): + camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) -def fd_kpu_deinit(kpu_obj): - # kpu释放 - with ScopedTiming("fd_kpu_deinit",debug_mode > 0): - global fd_ai2d, fd_ai2d_output_tensor - del kpu_obj #删除人脸检测kpu_obj变量,释放对它所引用对象的内存引用 - del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 - del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 +# camera 停止视频流 +def camera_stop(dev_id): + camera.stop_stream(dev_id) -###############for face recognition############### -##for database -def database_init(): - # 数据初始化,构建数据库人名列表和数据库特征列表 - with ScopedTiming("database_init", debug_mode > 1): - global valid_register_face,db_name,db_data - valid_register_face = 0 - db_name = [] - db_data = [] +#for media 初始化 +def media_init(): + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE - db_file_list = os.listdir(database_dir) - for db_file in db_file_list: - if not db_file.endswith('.bin'): - continue - if valid_register_face >= max_register_face: - break - valid_index = valid_register_face - full_db_file = database_dir + db_file - with open(full_db_file, 'rb') as f: - data = f.read() - feature = np.frombuffer(data, dtype=np.float) - db_data.append(feature) - name = db_file.split('.')[0] - db_name.append(name) - valid_register_face += 1 + ret = media.buffer_config(config) -def database_reset(): - # 数据库清空 - with ScopedTiming("database_reset", debug_mode > 1): - global valid_register_face,db_name,db_data - print("database clearing...") - db_name = [] - db_data = [] - valid_register_face = 0 - print("database clear Done!") + global media_source, media_sink + media_source = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + media_sink = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + media.create_link(media_source, media_sink) -def database_search(feature): - # 数据库查询 - with ScopedTiming("database_search", debug_mode > 1): - global valid_register_face,db_name,db_data - v_id = -1 - v_score_max = 0.0 + # 初始化多媒体buffer + ret = media.buffer_init() + if ret: + return ret + global buffer, draw_img, osd_img + buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # 图层1,用于画框 + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_MPGC) + # 图层2,用于拷贝画框结果,防止画框过程中发生buffer搬运 + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, + phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) + return ret - # 将当前人脸特征归一化 - feature /= np.linalg.norm(feature) - # 遍历当前人脸数据库,统计最高得分 - for i in range(valid_register_face): - db_feature = db_data[i] - db_feature /= np.linalg.norm(db_feature) - # 计算数据库特征与当前人脸特征相似度 - v_score = np.dot(feature, db_feature)/2 + 0.5 - if v_score > v_score_max: - v_score_max = v_score - v_id = i +# media 释放buffer,销毁link +def media_deinit(): + global buffer,media_source, media_sink + media.release_buffer(buffer) + media.destroy_link(media_source, media_sink) - if v_id == -1: - # 数据库中无人脸 - return 'unknown' - elif v_score_max < face_recognition_threshold: - # 小于人脸识别阈值,未识别 - print('v_score_max:',v_score_max) - return 'unknown' - else: - # 识别成功 - result = 'name: {}, score:{}'.format(db_name[v_id],v_score_max) - return result + ret = media.buffer_deinit() + return ret -# 标准5官 -umeyama_args_112 = [ - 38.2946 , 51.6963 , - 73.5318 , 51.5014 , - 56.0252 , 71.7366 , - 41.5493 , 92.3655 , - 70.7299 , 92.2041 -] +def ocr_rec_inference(): + print("ocr_rec_test start") + kpu_ocr_det = kpu_init_det(kmodel_file_det) # 创建OCR检测kpu对象 + kpu_ocr_rec = kpu_init_rec(kmodel_file_rec) # 创建OCR识别kpu对象 + camera_init(CAM_DEV_ID_0) # camera初始化 + display_init() # display初始化 + rgb888p_img = None + try: + ret = media_init() + if ret: + print("ocr_rec_test, buffer init failed") + return ret -def svd22(a): - # svd - s = [0.0, 0.0] - u = [0.0, 0.0, 0.0, 0.0] - v = [0.0, 0.0, 0.0, 0.0] + camera_start(CAM_DEV_ID_0) + time.sleep(5) + count=0 + while True: + with ScopedTiming("total",1): + rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图像 + if rgb888p_img == -1: + print("ocr_rec_test, capture_image failed") + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + continue + # for rgb888planar + if rgb888p_img.format() == image.RGBP888: + det_results = kpu_run_det(kpu_ocr_det,rgb888p_img) # kpu运行获取OCR检测kmodel的推理输出 + ocr_results="" + if det_results: + for j in det_results: + ocr_result = kpu_run_rec(kpu_ocr_rec,j[0]) # j[0]为检测框的裁剪部分,kpu运行获取OCR识别kmodel的推理输出 + ocr_results = ocr_results+" ["+ocr_result+"] " + print("\n"+ocr_results) + display_draw(det_results) + camera_release_image(CAM_DEV_ID_0,rgb888p_img) + rgb888p_img = None + # gc.collect() + if (count>2): + gc.collect() + count = 0 + else: + count += 1 + except Exception as e: + print(f"An error occurred during buffer used: {e}") + finally: + if rgb888p_img is not None: + #先release掉申请的内存再stop + camera_release_image(CAM_DEV_ID_0,rgb888p_img) - s[0] = (math.sqrt((a[0] - a[3]) ** 2 + (a[1] + a[2]) ** 2) + math.sqrt((a[0] + a[3]) ** 2 + (a[1] - a[2]) ** 2)) / 2 - s[1] = abs(s[0] - math.sqrt((a[0] - a[3]) ** 2 + (a[1] + a[2]) ** 2)) - v[2] = math.sin((math.atan2(2 * (a[0] * a[1] + a[2] * a[3]), a[0] ** 2 - a[1] ** 2 + a[2] ** 2 - a[3] ** 2)) / 2) if \ - s[0] > s[1] else 0 - v[0] = math.sqrt(1 - v[2] ** 2) - v[1] = -v[2] - v[3] = v[0] - u[0] = -(a[0] * v[0] + a[1] * v[2]) / s[0] if s[0] != 0 else 1 - u[2] = -(a[2] * v[0] + a[3] * v[2]) / s[0] if s[0] != 0 else 0 - u[1] = (a[0] * v[1] + a[1] * v[3]) / s[1] if s[1] != 0 else -u[2] - u[3] = (a[2] * v[1] + a[3] * v[3]) / s[1] if s[1] != 0 else u[0] - v[0] = -v[0] - v[2] = -v[2] + camera_stop(CAM_DEV_ID_0) # 停止camera + display_deinit() # 释放display + kpu_deinit_det(kpu_ocr_det) # 释放OCR检测步骤kpu + kpu_deinit_rec(kpu_ocr_rec) # 释放OCR识别步骤kpu + gc.collect() + time.sleep(1) + ret = media_deinit() # 释放整个media + if ret: + print("ocr_rec_test, buffer_deinit failed") + return ret - return u, s, v + print("ocr_rec_test end") + return 0 +if __name__ == '__main__': + ocr_rec_inference() +``` -def image_umeyama_112(src): - # 使用Umeyama算法计算仿射变换矩阵 - SRC_NUM = 5 - SRC_DIM = 2 - src_mean = [0.0, 0.0] - dst_mean = [0.0, 0.0] +### 8. 手掌关键点检测 - for i in range(0,SRC_NUM * 2,2): - src_mean[0] += src[i] - src_mean[1] += src[i + 1] - dst_mean[0] += umeyama_args_112[i] - dst_mean[1] += umeyama_args_112[i + 1] +```python +import aicube #aicube模块,封装检测分割等任务相关后处理 +from media.camera import * #摄像头模块 +from media.display import * #显示模块 +from media.media import * #软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 - src_mean[0] /= SRC_NUM - src_mean[1] /= SRC_NUM - dst_mean[0] /= SRC_NUM - dst_mean[1] /= SRC_NUM +import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 - src_demean = [[0.0, 0.0] for _ in range(SRC_NUM)] - dst_demean = [[0.0, 0.0] for _ in range(SRC_NUM)] +import time #时间统计 +import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 - for i in range(SRC_NUM): - src_demean[i][0] = src[2 * i] - src_mean[0] - src_demean[i][1] = src[2 * i + 1] - src_mean[1] - dst_demean[i][0] = umeyama_args_112[2 * i] - dst_mean[0] - dst_demean[i][1] = umeyama_args_112[2 * i + 1] - dst_mean[1] +import gc #垃圾回收模块 - A = [[0.0, 0.0], [0.0, 0.0]] - for i in range(SRC_DIM): - for k in range(SRC_DIM): - for j in range(SRC_NUM): - A[i][k] += dst_demean[j][i] * src_demean[j][k] - A[i][k] /= SRC_NUM +##config.py +#display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 - T = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] - U, S, V = svd22([A[0][0], A[0][1], A[1][0], A[1][1]]) +##ai原图分辨率输入 +OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) +OUT_RGB888P_HEIGHT = 1080 - T[0][0] = U[0] * V[0] + U[1] * V[2] - T[0][1] = U[0] * V[1] + U[1] * V[3] - T[1][0] = U[2] * V[0] + U[3] * V[2] - T[1][1] = U[2] * V[1] + U[3] * V[3] +#kmodel输入shape +kmodel_input_shape = (1,3,512,512) # kmodel输入分辨率 - scale = 1.0 - src_demean_mean = [0.0, 0.0] - src_demean_var = [0.0, 0.0] - for i in range(SRC_NUM): - src_demean_mean[0] += src_demean[i][0] - src_demean_mean[1] += src_demean[i][1] +#kmodel相关参数设置 +confidence_threshold = 0.2 # 手掌检测阈值,用于过滤roi +nms_threshold = 0.5 # 手掌检测框阈值,用于过滤重复roi +kmodel_frame_size = [512,512] # 手掌检测输入图片尺寸 +frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGHT] # 直接输入图片尺寸 +strides = [8,16,32] # 输出特征图的尺寸与输入图片尺寸的比 +num_classes = 1 # 模型输出类别数 +nms_option = False # 是否所有检测框一起做NMS,False则按照不同的类分别应用NMS +labels = ["hand"] # 模型输出类别名称 - src_demean_mean[0] /= SRC_NUM - src_demean_mean[1] /= SRC_NUM +root_dir = '/sdcard/app/tests/' +kmodel_file = root_dir + 'kmodel/hand_det.kmodel' # kmodel文件的路径 +anchors = [26,27, 53,52, 75,71, 80,99, 106,82, 99,134, 140,113, 161,172, 245,276] #anchor设置 - for i in range(SRC_NUM): - src_demean_var[0] += (src_demean_mean[0] - src_demean[i][0]) * (src_demean_mean[0] - src_demean[i][0]) - src_demean_var[1] += (src_demean_mean[1] - src_demean[i][1]) * (src_demean_mean[1] - src_demean[i][1]) +debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) - src_demean_var[0] /= SRC_NUM - src_demean_var[1] /= SRC_NUM +#scoped_timing.py 用于debug模式输出程序块运行时间 +class ScopedTiming: + def __init__(self, info="", enable_profile=True): + self.info = info + self.enable_profile = enable_profile - scale = 1.0 / (src_demean_var[0] + src_demean_var[1]) * (S[0] + S[1]) - T[0][2] = dst_mean[0] - scale * (T[0][0] * src_mean[0] + T[0][1] * src_mean[1]) - T[1][2] = dst_mean[1] - scale * (T[1][0] * src_mean[0] + T[1][1] * src_mean[1]) - T[0][0] *= scale - T[0][1] *= scale - T[1][0] *= scale - T[1][1] *= scale - return T + def __enter__(self): + if self.enable_profile: + self.start_time = time.time_ns() + return self -def get_affine_matrix(sparse_points): - # 获取放射变换矩阵 - with ScopedTiming("get_affine_matrix", debug_mode > 1): - # 使用Umeyama算法计算仿射变换矩阵 - matrix_dst = image_umeyama_112(sparse_points) - matrix_dst = [matrix_dst[0][0],matrix_dst[0][1],matrix_dst[0][2], - matrix_dst[1][0],matrix_dst[1][1],matrix_dst[1][2]] - return matrix_dst + def __exit__(self, exc_type, exc_value, traceback): + if self.enable_profile: + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") -def fr_ai2d_init(): - with ScopedTiming("fr_ai2d_init",debug_mode > 0): - # (1)人脸识别ai2d初始化 - global fr_ai2d - fr_ai2d = nn.ai2d() +#ai_utils.py +global current_kmodel_obj # 定义全局的 kpu 对象 +global ai2d,ai2d_input_tensor,ai2d_output_tensor,ai2d_builder # 定义全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder - # (2)人脸识别ai2d_output_tensor初始化,用于存放ai2d输出 - global fr_ai2d_output_tensor - data = np.ones(fr_kmodel_input_shape, dtype=np.uint8) - fr_ai2d_output_tensor = nn.from_numpy(data) -def fr_ai2d_run(rgb888p_img,sparse_points): - # 人脸识别ai2d推理 - with ScopedTiming("fr_ai2d_run",debug_mode > 0): - global fr_ai2d,fr_ai2d_input_tensor,fr_ai2d_output_tensor - #(1)根据原图创建人脸识别ai2d_input_tensor对象 - ai2d_input = rgb888p_img.to_numpy_ref() - fr_ai2d_input_tensor = nn.from_numpy(ai2d_input) - #(2)根据新的人脸关键点设置新的人脸识别ai2d参数 - fr_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, +# ai2d 初始化 +def ai2d_init(): + with ScopedTiming("ai2d_init",debug_mode > 0): + global ai2d + global ai2d_builder + global ai2d_output_tensor + # 计算padding值 + ori_w = OUT_RGB888P_WIDTH + ori_h = OUT_RGB888P_HEIGHT + width = kmodel_frame_size[0] + height = kmodel_frame_size[1] + ratiow = float(width) / ori_w + ratioh = float(height) / ori_h + if ratiow < ratioh: + ratio = ratiow + else: + ratio = ratioh + new_w = int(ratio * ori_w) + new_h = int(ratio * ori_h) + dw = float(width - new_w) / 2 + dh = float(height - new_h) / 2 + top = int(round(dh - 0.1)) + bottom = int(round(dh + 0.1)) + left = int(round(dw - 0.1)) + right = int(round(dw - 0.1)) + + ai2d = nn.ai2d() + ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) - affine_matrix = get_affine_matrix(sparse_points) - fr_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,affine_matrix) - global fr_ai2d_builder - # (3)根据新的人脸识别ai2d参数,构建识别ai2d_builder - fr_ai2d_builder = fr_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fr_kmodel_input_shape) - # (4)推理人脸识别ai2d,将预处理的结果保存到fr_ai2d_output_tensor - fr_ai2d_builder.run(fr_ai2d_input_tensor, fr_ai2d_output_tensor) + ai2d.set_pad_param(True, [0,0,0,0,top,bottom,left,right], 0, [114,114,114]) + ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) + ai2d_builder = ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,height,width]) + data = np.ones(kmodel_input_shape, dtype=np.uint8) + ai2d_output_tensor = nn.from_numpy(data) -def fr_ai2d_release(): - # 释放人脸识别ai2d_input_tensor、ai2d_builder - with ScopedTiming("fr_ai2d_release",debug_mode > 0): - global fr_ai2d_input_tensor,fr_ai2d_builder - del fr_ai2d_input_tensor - del fr_ai2d_builder +# ai2d 运行 +def ai2d_run(rgb888p_img): + with ScopedTiming("ai2d_run",debug_mode > 0): + global ai2d_input_tensor, ai2d_output_tensor, ai2d_builder + ai2d_input = rgb888p_img.to_numpy_ref() + ai2d_input_tensor = nn.from_numpy(ai2d_input) + ai2d_builder.run(ai2d_input_tensor, ai2d_output_tensor) -def fr_kpu_init(kmodel_file): - # 人脸识别kpu初始化 - with ScopedTiming("fr_kpu_init",debug_mode > 0): - # 初始化人脸识别kpu对象 +# ai2d 释放内存 +def ai2d_release(): + with ScopedTiming("ai2d_release",debug_mode > 0): + global ai2d_input_tensor + del ai2d_input_tensor + +# kpu 初始化 +def kpu_init(kmodel_file): + # init kpu and load kmodel + with ScopedTiming("kpu_init",debug_mode > 0): kpu_obj = nn.kpu() - # 加载人脸识别kmodel kpu_obj.load_kmodel(kmodel_file) - # 初始化人脸识别ai2d - fr_ai2d_init() - # 数据库初始化 - database_init() - return kpu_obj -def fr_kpu_pre_process(rgb888p_img,sparse_points): - # 人脸识别kpu预处理 - # 人脸识别ai2d推理,根据关键点对原图进行预处理 - fr_ai2d_run(rgb888p_img,sparse_points) - with ScopedTiming("fr_kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,fr_ai2d_output_tensor - # 将人脸识别ai2d输出设置为人脸识别kpu输入 - current_kmodel_obj.set_input_tensor(0, fr_ai2d_output_tensor) + ai2d_init() + return kpu_obj - #ai2d_out_data = fr_ai2d_output_tensor.to_numpy() - #print('ai2d_out_data.shape:',ai2d_out_data.shape) - #with open("/sdcard/app/ai2d_out.bin", "wb") as file: - #file.write(ai2d_out_data.tobytes()) +# kpu 输入预处理 +def kpu_pre_process(rgb888p_img): + ai2d_run(rgb888p_img) + with ScopedTiming("kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,ai2d_output_tensor + # set kpu input + current_kmodel_obj.set_input_tensor(0, ai2d_output_tensor) -def fr_kpu_get_output(): - # 获取人脸识别kpu输出 - with ScopedTiming("fr_kpu_get_output",debug_mode > 0): +# kpu 获得 kmodel 输出 +def kpu_get_output(): + with ScopedTiming("kpu_get_output",debug_mode > 0): global current_kmodel_obj - data = current_kmodel_obj.get_output_tensor(0) - result = data.to_numpy() - del data - return result[0] + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() -def fr_kpu_run(kpu_obj,rgb888p_img,sparse_points): - # 人脸识别kpu推理 + result = result.reshape((result.shape[0]*result.shape[1]*result.shape[2]*result.shape[3])) + tmp2 = result.copy() + del result + results.append(tmp2) + return results + +# kpu 运行 +def kpu_run(kpu_obj,rgb888p_img): global current_kmodel_obj current_kmodel_obj = kpu_obj - # (1)人脸识别kpu预处理,设置kpu输入 - fr_kpu_pre_process(rgb888p_img,sparse_points) - # (2)人脸识别kpu推理 - with ScopedTiming("fr kpu_run",debug_mode > 0): - kpu_obj.run() - # (3)释放人脸识别ai2d - fr_ai2d_release() - # (4)获取人脸识别kpu输出 - results = fr_kpu_get_output() - # (5)在数据库中查找当前人脸特征 - recg_result = database_search(results) - return recg_result + # (1)原图预处理,并设置模型输入 + kpu_pre_process(rgb888p_img) + # (2)手掌检测 kpu 运行 + with ScopedTiming("kpu_run",debug_mode > 0): + current_kmodel_obj.run() + # (3)释放手掌检测 ai2d 资源 + ai2d_release() + # (4)获取手掌检测 kpu 输出 + results = kpu_get_output() + # (5)手掌检测 kpu 结果后处理 + dets = aicube.anchorbasedet_post_process( results[0], results[1], results[2], kmodel_frame_size, frame_size, strides, num_classes, confidence_threshold, nms_threshold, anchors, nms_option) + # (6)返回手掌检测结果 + return dets -def fr_kpu_deinit(kpu_obj): - # 人脸识别kpu相关资源释放 - with ScopedTiming("fr_kpu_deinit",debug_mode > 0): - global fr_ai2d +# kpu 释放内存 +def kpu_deinit(kpu_obj): + with ScopedTiming("kpu_deinit",debug_mode > 0): + global ai2d, ai2d_output_tensor, ai2d_builder del kpu_obj - del fr_ai2d + del ai2d + del ai2d_output_tensor + del ai2d_builder -#********************for media_utils.py******************** -global draw_img,osd_img #for display -global buffer,media_source,media_sink #for media +#media_utils.py +global draw_img,osd_img #for display 定义全局 作图image对象 +global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 -# for display,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.2 +#for display 初始化 def display_init(): - # hdmi显示初始化 + # use hdmi for display display.init(LT9611_1920X1080_30FPS) display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) +# display 释放内存 def display_deinit(): - # 释放显示资源 display.deinit() -def display_draw(dets,recg_results): - # 在显示器上写人脸识别结果 +# display 作图过程 框出所有检测到的手以及标出得分 +def display_draw(dets): with ScopedTiming("display_draw",debug_mode >0): global draw_img,osd_img + if dets: draw_img.clear() - for i,det in enumerate(dets): - # (1)画人脸框 - x1, y1, w, h = map(lambda x: int(round(x, 0)), det[:4]) - x1 = x1 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - y1 = y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH - w = w * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - h = h * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH - draw_img.draw_rectangle(x1,y1, w, h, color=(255,0, 255, 0)) + for det_box in dets: + x1, y1, x2, y2 = det_box[2],det_box[3],det_box[4],det_box[5] + w = float(x2 - x1) * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + h = float(y2 - y1) * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT - # (2)写人脸识别结果 - recg_text = recg_results[i] - draw_img.draw_string(x1,y1,recg_text,color=(255,0, 0, 255),scale=4) + x1 = int(x1 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) + y1 = int(y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) + x2 = int(x2 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) + y2 = int(y2 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) - # (3)将画图结果拷贝到osd + if (h<(0.1*DISPLAY_HEIGHT)): + continue + if (w<(0.25*DISPLAY_WIDTH) and ((x1<(0.03*DISPLAY_WIDTH)) or (x2>(0.97*DISPLAY_WIDTH)))): + continue + if (w<(0.15*DISPLAY_WIDTH) and ((x1<(0.01*DISPLAY_WIDTH)) or (x2>(0.99*DISPLAY_WIDTH)))): + continue + draw_img.draw_rectangle(x1 , y1 , int(w) , int(h), color=(255, 0, 255, 0), thickness = 2) + draw_img.draw_string( x1 , y1-50, " " + labels[det_box[0]] + " " + str(round(det_box[1],2)), color=(255,0, 255, 0), scale=4) draw_img.copy_to(osd_img) - # (4)将osd显示到屏幕 display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) else: - # (1)清空用来画框的图像 draw_img.clear() - # (2)清空osd draw_img.copy_to(osd_img) - # (3)显示透明图层 display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) -#for camera,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.1 +#for camera 初始化 def camera_init(dev_id): - # camera初始化 camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) # set chn0 output yuv420sp @@ -5494,31 +9003,30 @@ def camera_init(dev_id): camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) # set chn2 output rgb88planar - camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) - camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_BGR_888_PLANAR) + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) + camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) +# camera 开启 def camera_start(dev_id): - # camera启动 camera.start_stream(dev_id) +# camera 读取图像 def camera_read(dev_id): - # 读取一帧图像 with ScopedTiming("camera_read",debug_mode >0): rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) return rgb888p_img +# camera 图像释放 def camera_release_image(dev_id,rgb888p_img): - # 释放一帧图像 with ScopedTiming("camera_release_image",debug_mode >0): camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) +# camera 结束 def camera_stop(dev_id): - # 停止camera camera.stop_stream(dev_id) -#for media,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.3 +#for media 初始化 def media_init(): - # meida初始化 config = k_vb_config() config.max_pool_cnt = 1 config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT @@ -5538,15 +9046,15 @@ def media_init(): return ret global buffer, draw_img, osd_img buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) - # 用于画框 + # 图层1,用于画框 draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_MPGC) - # 用于拷贝画框结果,防止画框过程中发生buffer搬运 + # 图层2,用于拷贝画框结果,防止画框过程中发生buffer搬运 osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) return ret +# media 释放内存 def media_deinit(): - # meida资源释放 global buffer,media_source, media_sink media.release_buffer(buffer) media.destroy_link(media_source, media_sink) @@ -5554,146 +9062,122 @@ def media_deinit(): ret = media.buffer_deinit() return ret -#********************for face_detect.py******************** -def face_recognition_inference(): - print("face_recognition_test start") - # 人脸检测kpu初始化 - kpu_face_detect = fd_kpu_init(fd_kmodel_file) - # 人脸关键点kpu初始化 - kpu_face_recg = fr_kpu_init(fr_kmodel_file) - # camera初始化 - camera_init(CAM_DEV_ID_0) - # 显示初始化 - display_init() +#**********for hand_detect.py********** +def hand_detect_inference(): + print("hand_detect_test start") + kpu_hand_detect = kpu_init(kmodel_file) # 创建手掌检测的 kpu 对象 + camera_init(CAM_DEV_ID_0) # 初始化 camera + display_init() # 初始化 display rgb888p_img = None - # 注意:将一定要将一下过程包在try中,用于保证程序停止后,资源释放完毕;确保下次程序仍能正常运行 try: - # 注意:媒体初始化(注:媒体初始化必须在camera_start之前,确保media缓冲区已配置完全) ret = media_init() if ret: - print("face_detect_test, buffer init failed") + print("hand_detect_test, buffer init failed") return ret - # 启动camera camera_start(CAM_DEV_ID_0) - time.sleep(5) + count = 0 while True: with ScopedTiming("total",1): - # (1)读取一帧图像 - rgb888p_img = camera_read(CAM_DEV_ID_0) - # (2)若读取失败,释放当前帧 + rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 if rgb888p_img == -1: - print("face_detect_test, capture_image failed") + print("hand_detect_test, capture_image failed") camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None continue - # (3)若读取成功,推理当前帧 + # for rgb888planar if rgb888p_img.format() == image.RGBP888: - # (3.1)推理当前图像,并获取人脸检测结果 - dets,landms = fd_kpu_run(kpu_face_detect,rgb888p_img) - recg_result = [] - for landm in landms: - # (3.2)针对每个人脸五官点,推理得到人脸特征,并计算特征在数据库中相似度 - ret = fr_kpu_run(kpu_face_recg,rgb888p_img,landm) - recg_result.append(ret) - # (3.3)将识别结果画到显示器上 - display_draw(dets,recg_result) + dets = kpu_run(kpu_hand_detect,rgb888p_img) # 执行手掌检测 kpu 运行 以及 后处理过程 + display_draw(dets) # 将得到的检测结果 绘制到 display - # (4)释放当前帧 - camera_release_image(CAM_DEV_ID_0,rgb888p_img) + camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - gc.collect() + if (count>10): + gc.collect() + count = 0 + else: + count += 1 + except Exception as e: - # 捕捉运行运行中异常,并打印错误 print(f"An error occurred during buffer used: {e}") finally: - # 释放当前帧 if rgb888p_img is not None: #先release掉申请的内存再stop camera_release_image(CAM_DEV_ID_0,rgb888p_img) - # 停止camera - camera_stop(CAM_DEV_ID_0) - # 释放显示资源 - display_deinit() - # 释放kpu资源 - fd_kpu_deinit(kpu_face_detect) - fr_kpu_deinit(kpu_face_recg) - # 垃圾回收 + camera_stop(CAM_DEV_ID_0) # 停止 camera + display_deinit() # 释放 display + kpu_deinit(kpu_hand_detect) # 释放 kpu gc.collect() - time.sleep(1) - # 释放媒体资源 - ret = media_deinit() + ret = media_deinit() # 释放 整个media if ret: - print("face_recognition_test, buffer_deinit failed") + print("hand_detect_test, buffer_deinit failed") return ret - print("face_recognition_test end") + print("hand_detect_test end") return 0 if __name__ == '__main__': - face_recognition_inference() + hand_detect_inference() ``` -### 3.人脸姿态角 +### 9. 静态手势识别 ```python -import ulab.numpy as np # 类似python numpy操作,但也会有一些接口不同 -import nncase_runtime as nn # nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 -from media.camera import * # 摄像头模块 -from media.display import * # 显示模块 -from media.media import * # 软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 -import aidemo # aidemo模块,封装ai demo相关后处理、画图操作 -import image # 图像模块,主要用于读取、图像绘制元素(框、点等)等操作 -import time # 时间统计 -import gc # 垃圾回收模块 -import os # 操作系统接口模块 -import math # 数学模块 +import aicube #aicube模块,封装检测分割等任务相关后处理 +from media.camera import * #摄像头模块 +from media.display import * #显示模块 +from media.media import * #软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 -#********************for config.py******************** -# display分辨率 -DISPLAY_WIDTH = ALIGN_UP(1920, 16) # 显示宽度要求16位对齐 +import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 + +import time #时间统计 +import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 + +import gc #垃圾回收模块 + +##config.py +#display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) DISPLAY_HEIGHT = 1080 -# ai原图分辨率,sensor默认出图为16:9,若需不形变原图,最好按照16:9比例设置宽高 -OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) # ai原图宽度要求16位对齐 -OUT_RGB888P_HEIGH = 1080 +##ai原图分辨率输入 +OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) +OUT_RGB888P_HEIGHT = 1080 -# kmodel参数设置 -# 人脸检测kmodel输入shape -fd_kmodel_input_shape = (1,3,320,320) -# 人脸姿态估计kmodel输入shape -fp_kmodel_input_shape = (1,3,120,120) -# ai原图padding -rgb_mean = [104,117,123] +#--------for hand detection---------- +#kmodel输入shape +hd_kmodel_input_shape = (1,3,512,512) # 手掌检测kmodel输入分辨率 -#人脸检测kmodel其它参数设置 -confidence_threshold = 0.5 # 人脸检测阈值 -top_k = 5000 -nms_threshold = 0.2 -keep_top_k = 750 -vis_thres = 0.5 -variance = [0.1, 0.2] -anchor_len = 4200 -score_dim = 2 -det_dim = 4 -keypoint_dim = 10 +#kmodel相关参数设置 +confidence_threshold = 0.2 # 手掌检测阈值,用于过滤roi +nms_threshold = 0.5 # 手掌检测框阈值,用于过滤重复roi +hd_kmodel_frame_size = [512,512] # 手掌检测输入图片尺寸 +hd_frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGHT] # 手掌检测直接输入图片尺寸 +strides = [8,16,32] # 输出特征图的尺寸与输入图片尺寸的比 +num_classes = 1 # 手掌检测模型输出类别数 +nms_option = False # 是否所有检测框一起做NMS,False则按照不同的类分别应用NMS -# 文件配置 -# 人脸检测kmodel文件配置 root_dir = '/sdcard/app/tests/' -fd_kmodel_file = root_dir + 'kmodel/face_detection_320.kmodel' -# 人脸姿态估计kmodel文件配置 -fp_kmodel_file = root_dir + 'kmodel/face_pose.kmodel' -# anchor文件配置 -anchors_path = root_dir + 'utils/prior_data_320.bin' -# 调试模型,0:不调试,>0:打印对应级别调试信息 -debug_mode = 0 +hd_kmodel_file = root_dir + 'kmodel/hand_det.kmodel' # 手掌检测kmodel文件的路径 +anchors = [26,27, 53,52, 75,71, 80,99, 106,82, 99,134, 140,113, 161,172, 245,276] #anchor设置 -#********************for scoped_timing.py******************** -# 时间统计类 +#--------for hand recognition---------- +#kmodel输入shape +hr_kmodel_input_shape = (1,3,224,224) # 手势识别kmodel输入分辨率 + +#kmodel相关参数设置 +hr_kmodel_frame_size = [224,224] # 手势识别输入图片尺寸 +labels = ["gun","other","yeah","five"] # 模型输出类别名称 + +hr_kmodel_file = root_dir + "kmodel/hand_reco.kmodel" # 手势识别kmodel文件的路径 + +debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) + +#scoped_timing.py 用于debug模式输出程序块运行时间 class ScopedTiming: def __init__(self, info="", enable_profile=True): self.info = info @@ -5705,405 +9189,247 @@ class ScopedTiming: return self def __exit__(self, exc_type, exc_value, traceback): - if self.enable_profile: - elapsed_time = time.time_ns() - self.start_time - print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") - -#********************for ai_utils.py******************** -global current_kmodel_obj #当前kpu对象 -# fd_ai2d: 人脸检测ai2d实例 -# fd_ai2d_input_tensor: 人脸检测ai2d输入 -# fd_ai2d_output_tensor: 人脸检测ai2d输入 -# fd_ai2d_builder: 根据人脸检测ai2d参数,构建的人脸检测ai2d_builder对象 -global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder -# fld_ai2d: 人脸姿态估计ai2d实例 -# fld_ai2d_input_tensor: 人脸姿态估计ai2d输入 -# fld_ai2d_output_tensor:人脸姿态估计ai2d输入 -# fld_ai2d_builder: 根据人脸姿态估计ai2d参数,构建的人脸姿态估计ai2d_builder对象 -global fp_ai2d,fp_ai2d_input_tensor,fp_ai2d_output_tensor,fp_ai2d_builder -global matrix_dst #人脸仿射变换矩阵 -#读取anchor文件,为人脸检测后处理做准备 -print('anchors_path:',anchors_path) -prior_data = np.fromfile(anchors_path, dtype=np.float) -prior_data = prior_data.reshape((anchor_len,det_dim)) - -def get_pad_one_side_param(): - # 右padding或下padding,获取padding参数 - dst_w = fd_kmodel_input_shape[3] # kmodel输入宽(w) - dst_h = fd_kmodel_input_shape[2] # kmodel输入高(h) + if self.enable_profile: + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") - # OUT_RGB888P_WIDTH:原图宽(w) - # OUT_RGB888P_HEIGH:原图高(h) - # 计算最小的缩放比例,等比例缩放 - ratio_w = dst_w / OUT_RGB888P_WIDTH - ratio_h = dst_h / OUT_RGB888P_HEIGH - if ratio_w < ratio_h: - ratio = ratio_w - else: - ratio = ratio_h - # 计算经过缩放后的新宽和新高 - new_w = (int)(ratio * OUT_RGB888P_WIDTH) - new_h = (int)(ratio * OUT_RGB888P_HEIGH) +#ai_utils.py +global current_kmodel_obj # 定义全局的 kpu 对象 +global hd_ai2d,hd_ai2d_input_tensor,hd_ai2d_output_tensor,hd_ai2d_builder # 定义手掌检测全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder +global hr_ai2d,hr_ai2d_input_tensor,hr_ai2d_output_tensor,hr_ai2d_builder # 定义手势识别全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder - # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 - dw = (dst_w - new_w) / 2 - dh = (dst_h - new_h) / 2 - # 四舍五入,确保padding是整数 - top = (int)(round(0)) - bottom = (int)(round(dh * 2 + 0.1)) - left = (int)(round(0)) - right = (int)(round(dw * 2 - 0.1)) - return [0, 0, 0, 0, top, bottom, left, right] +#-------hand detect--------: +# 手掌检测 ai2d 初始化 +def hd_ai2d_init(): + with ScopedTiming("hd_ai2d_init",debug_mode > 0): + global hd_ai2d + global hd_ai2d_builder + global hd_ai2d_output_tensor + # 计算padding值 + ori_w = OUT_RGB888P_WIDTH + ori_h = OUT_RGB888P_HEIGHT + width = hd_kmodel_frame_size[0] + height = hd_kmodel_frame_size[1] + ratiow = float(width) / ori_w + ratioh = float(height) / ori_h + if ratiow < ratioh: + ratio = ratiow + else: + ratio = ratioh + new_w = int(ratio * ori_w) + new_h = int(ratio * ori_h) + dw = float(width - new_w) / 2 + dh = float(height - new_h) / 2 + top = int(round(dh - 0.1)) + bottom = int(round(dh + 0.1)) + left = int(round(dw - 0.1)) + right = int(round(dw - 0.1)) -def fd_ai2d_init(): - # 人脸检测模型ai2d初始化 - with ScopedTiming("fd_ai2d_init",debug_mode > 0): - # (1)创建人脸检测ai2d对象 - global fd_ai2d - fd_ai2d = nn.ai2d() - # (2)设置人脸检测ai2d参数 - fd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + hd_ai2d = nn.ai2d() + hd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) - fd_ai2d.set_pad_param(True, get_pad_one_side_param(), 0, rgb_mean) - fd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) - - #(3)人脸检测ai2d_builder,根据人脸检测ai2d参数、输入输出大小创建ai2d_builder对象 - global fd_ai2d_builder - fd_ai2d_builder = fd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fd_kmodel_input_shape) + hd_ai2d.set_pad_param(True, [0,0,0,0,top,bottom,left,right], 0, [114,114,114]) + hd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) + hd_ai2d_builder = hd_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,height,width]) + data = np.ones(hd_kmodel_input_shape, dtype=np.uint8) + hd_ai2d_output_tensor = nn.from_numpy(data) - #(4)创建人脸检测ai2d_output_tensor,用于保存人脸检测ai2d输出 - global fd_ai2d_output_tensor - data = np.ones(fd_kmodel_input_shape, dtype=np.uint8) - fd_ai2d_output_tensor = nn.from_numpy(data) +# 手掌检测 ai2d 运行 +def hd_ai2d_run(rgb888p_img): + with ScopedTiming("hd_ai2d_run",debug_mode > 0): + global hd_ai2d_input_tensor, hd_ai2d_output_tensor, hd_ai2d_builder + hd_ai2d_input = rgb888p_img.to_numpy_ref() + hd_ai2d_input_tensor = nn.from_numpy(hd_ai2d_input) -def fd_ai2d_run(rgb888p_img): - # 根据人脸检测ai2d参数,对原图rgb888p_img进行预处理 - with ScopedTiming("fd_ai2d_run",debug_mode > 0): - global fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder - # (1)根据原图构建ai2d_input_tensor对象 - ai2d_input = rgb888p_img.to_numpy_ref() - fd_ai2d_input_tensor = nn.from_numpy(ai2d_input) - # (2)运行人脸检测ai2d_builder,将结果保存到人脸检测ai2d_output_tensor中 - fd_ai2d_builder.run(fd_ai2d_input_tensor, fd_ai2d_output_tensor) + hd_ai2d_builder.run(hd_ai2d_input_tensor, hd_ai2d_output_tensor) -def fd_ai2d_release(): - # 释放人脸检测ai2d_input_tensor - with ScopedTiming("fd_ai2d_release",debug_mode > 0): - global fd_ai2d_input_tensor - del fd_ai2d_input_tensor +# 手掌检测 ai2d 释放内存 +def hd_ai2d_release(): + with ScopedTiming("hd_ai2d_release",debug_mode > 0): + global hd_ai2d_input_tensor + del hd_ai2d_input_tensor +# 手掌检测 kpu 初始化 +def hd_kpu_init(hd_kmodel_file): + # init kpu and load kmodel + with ScopedTiming("hd_kpu_init",debug_mode > 0): + hd_kpu_obj = nn.kpu() + hd_kpu_obj.load_kmodel(hd_kmodel_file) -def fd_kpu_init(kmodel_file): - # 初始化人脸检测kpu对象,并加载kmodel - with ScopedTiming("fd_kpu_init",debug_mode > 0): - # 初始化人脸检测kpu对象 - kpu_obj = nn.kpu() - # 加载人脸检测kmodel - kpu_obj.load_kmodel(kmodel_file) - # 初始化人脸检测ai2d - fd_ai2d_init() - return kpu_obj + hd_ai2d_init() + return hd_kpu_obj -def fd_kpu_pre_process(rgb888p_img): - # 设置人脸检测kpu输入 - # 使用人脸检测ai2d对原图进行预处理(padding,resize) - fd_ai2d_run(rgb888p_img) - with ScopedTiming("fd_kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,fd_ai2d_output_tensor - # 设置人脸检测kpu输入 - current_kmodel_obj.set_input_tensor(0, fd_ai2d_output_tensor) +# 手掌检测 kpu 输入预处理 +def hd_kpu_pre_process(rgb888p_img): + hd_ai2d_run(rgb888p_img) + with ScopedTiming("hd_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,hd_ai2d_output_tensor + # set kpu input + current_kmodel_obj.set_input_tensor(0, hd_ai2d_output_tensor) -def fd_kpu_get_output(): - # 获取人脸检测kpu输出 - with ScopedTiming("fd_kpu_get_output",debug_mode > 0): +# 手掌检测 kpu 获得 kmodel 输出 +def hd_kpu_get_output(): + with ScopedTiming("hd_kpu_get_output",debug_mode > 0): global current_kmodel_obj - # 获取模型输出,并将结果转换为numpy,以便进行人脸检测后处理 results = [] for i in range(current_kmodel_obj.outputs_size()): data = current_kmodel_obj.get_output_tensor(i) result = data.to_numpy() - del data - results.append(result) + result = result.reshape((result.shape[0]*result.shape[1]*result.shape[2]*result.shape[3])) + tmp2 = result.copy() + del result + results.append(tmp2) return results -def fd_kpu_run(kpu_obj,rgb888p_img): +# 手掌检测 kpu 运行 +def hd_kpu_run(kpu_obj,rgb888p_img): global current_kmodel_obj current_kmodel_obj = kpu_obj - # (1)原图预处理,并设置模型输入 - fd_kpu_pre_process(rgb888p_img) - # (2)人脸检测kpu推理 - with ScopedTiming("fd kpu_run",debug_mode > 0): - kpu_obj.run() - # (3)释放人脸检测ai2d资源 - fd_ai2d_release() - # (4)获取人俩检测kpu输出 - results = fd_kpu_get_output() - # (5)人脸检测kpu结果后处理 - with ScopedTiming("fd kpu_post",debug_mode > 0): - post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, - [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) - # (6)返回人脸检测框 - if len(post_ret)==0: - return post_ret - else: - return post_ret[0] #0:det,1:landm,2:score - -def fd_kpu_deinit(kpu_obj): - # kpu释放 - with ScopedTiming("fd_kpu_deinit",debug_mode > 0): - global fd_ai2d, fd_ai2d_output_tensor - del kpu_obj #删除人脸检测kpu_obj变量,释放对它所引用对象的内存引用 - del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 - del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 - -###############for face recognition############### -def get_affine_matrix(bbox): - # 获取仿射矩阵,用于将边界框映射到模型输入空间 - with ScopedTiming("get_affine_matrix", debug_mode > 1): - # 设置缩放因子 - factor = 2.7 - # 从边界框提取坐标和尺寸 - x1, y1, w, h = map(lambda x: int(round(x, 0)), bbox[:4]) - # 模型输入大小 - edge_size = fp_kmodel_input_shape[2] - # 平移距离,使得模型输入空间的中心对准原点 - trans_distance = edge_size / 2.0 - # 计算边界框中心点的坐标 - center_x = x1 + w / 2.0 - center_y = y1 + h / 2.0 - # 计算最大边长 - maximum_edge = factor * (h if h > w else w) - # 计算缩放比例 - scale = edge_size * 2.0 / maximum_edge - # 计算平移参数 - cx = trans_distance - scale * center_x - cy = trans_distance - scale * center_y - # 创建仿射矩阵 - affine_matrix = [scale, 0, cx, 0, scale, cy] - return affine_matrix - -def build_projection_matrix(det): - x1, y1, w, h = map(lambda x: int(round(x, 0)), det[:4]) - - # 计算边界框中心坐标 - center_x = x1 + w / 2.0 - center_y = y1 + h / 2.0 - - # 定义后部(rear)和前部(front)的尺寸和深度 - rear_width = 0.5 * w - rear_height = 0.5 * h - rear_depth = 0 - factor = np.sqrt(2.0) - front_width = factor * rear_width - front_height = factor * rear_height - front_depth = factor * rear_width # 使用宽度来计算深度,也可以使用高度,取决于需求 - - # 定义立方体的顶点坐标 - temp = [ - [-rear_width, -rear_height, rear_depth], - [-rear_width, rear_height, rear_depth], - [rear_width, rear_height, rear_depth], - [rear_width, -rear_height, rear_depth], - [-front_width, -front_height, front_depth], - [-front_width, front_height, front_depth], - [front_width, front_height, front_depth], - [front_width, -front_height, front_depth] - ] - - projections = np.array(temp) - # 返回投影矩阵和中心坐标 - return projections, (center_x, center_y) + # (1)原图预处理,并设置模型输入 + hd_kpu_pre_process(rgb888p_img) + # (2)手掌检测 kpu 运行 + with ScopedTiming("hd_kpu_run",debug_mode > 0): + current_kmodel_obj.run() + # (3)释放手掌检测 ai2d 资源 + hd_ai2d_release() + # (4)获取手掌检测 kpu 输出 + results = hd_kpu_get_output() + # (5)手掌检测 kpu 结果后处理 + dets = aicube.anchorbasedet_post_process( results[0], results[1], results[2], hd_kmodel_frame_size, hd_frame_size, strides, num_classes, confidence_threshold, nms_threshold, anchors, nms_option) + # (6)返回手掌检测结果 + return dets -def rotation_matrix_to_euler_angles(R): - # 将旋转矩阵(3x3 矩阵)转换为欧拉角(pitch、yaw、roll) - # 计算 sin(yaw) - sy = np.sqrt(R[0, 0] ** 2 + R[1, 0] ** 2) +# 手掌检测 kpu 释放内存 +def hd_kpu_deinit(kpu_obj): + with ScopedTiming("hd_kpu_deinit",debug_mode > 0): + global hd_ai2d, hd_ai2d_output_tensor, hd_ai2d_builder + del kpu_obj + del hd_ai2d + del hd_ai2d_output_tensor + del hd_ai2d_builder - if sy < 1e-6: - # 若 sin(yaw) 过小,说明 pitch 接近 ±90 度 - pitch = np.arctan2(-R[1, 2], R[1, 1]) * 180 / np.pi - yaw = np.arctan2(-R[2, 0], sy) * 180 / np.pi - roll = 0 - else: - # 计算 pitch、yaw、roll 的角度 - pitch = np.arctan2(R[2, 1], R[2, 2]) * 180 / np.pi - yaw = np.arctan2(-R[2, 0], sy) * 180 / np.pi - roll = np.arctan2(R[1, 0], R[0, 0]) * 180 / np.pi - return [pitch,yaw,roll] +#-------hand recognition--------: +# 手势识别 ai2d 初始化 +def hr_ai2d_init(): + with ScopedTiming("hr_ai2d_init",debug_mode > 0): + global hr_ai2d, hr_ai2d_output_tensor + hr_ai2d = nn.ai2d() + hr_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + data = np.ones(hr_kmodel_input_shape, dtype=np.uint8) + hr_ai2d_output_tensor = nn.from_numpy(data) -def get_euler(data): - # 获取旋转矩阵和欧拉角 - R = data[:3, :3].copy() - eular = rotation_matrix_to_euler_angles(R) - return R,eular +# 手势识别 ai2d 运行 +def hr_ai2d_run(rgb888p_img, x, y, w, h): + with ScopedTiming("hr_ai2d_run",debug_mode > 0): + global hr_ai2d,hr_ai2d_input_tensor,hr_ai2d_output_tensor + hr_ai2d_input = rgb888p_img.to_numpy_ref() + hr_ai2d_input_tensor = nn.from_numpy(hr_ai2d_input) -def fp_ai2d_init(): - # 人脸姿态估计ai2d初始化 - with ScopedTiming("fp_ai2d_init",debug_mode > 0): - # (1)创建人脸姿态估计ai2d对象 - global fp_ai2d - fp_ai2d = nn.ai2d() + hr_ai2d.set_crop_param(True, x, y, w, h) + hr_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) - # (2)创建人脸姿态估计ai2d_output_tensor对象 - global fp_ai2d_output_tensor - data = np.ones(fp_kmodel_input_shape, dtype=np.uint8) - fp_ai2d_output_tensor = nn.from_numpy(data) + global hr_ai2d_builder + hr_ai2d_builder = hr_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,hr_kmodel_frame_size[1],hr_kmodel_frame_size[0]]) + hr_ai2d_builder.run(hr_ai2d_input_tensor, hr_ai2d_output_tensor) -def fp_ai2d_run(rgb888p_img,det): - # 人脸姿态估计ai2d推理 - with ScopedTiming("fp_ai2d_run",debug_mode > 0): - global fp_ai2d,fp_ai2d_input_tensor,fp_ai2d_output_tensor - #(1)根据原图构建人脸姿态估计ai2d_input_tensor - ai2d_input = rgb888p_img.to_numpy_ref() - fp_ai2d_input_tensor = nn.from_numpy(ai2d_input) - #(2)设置人脸姿态估计ai2d参数 - fp_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, - nn.ai2d_format.NCHW_FMT, - np.uint8, np.uint8) - global matrix_dst - matrix_dst = get_affine_matrix(det) - fp_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,matrix_dst) - # (3)构建人脸姿态估计ai2d_builder - global fp_ai2d_builder - fp_ai2d_builder = fp_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fp_kmodel_input_shape) - # (4)推理人脸姿态估计ai2d,将结果保存到ai2d_output_tensor - fp_ai2d_builder.run(fp_ai2d_input_tensor, fp_ai2d_output_tensor) +# 手势识别 ai2d 释放内存 +def hr_ai2d_release(): + with ScopedTiming("hr_ai2d_release",debug_mode > 0): + global hr_ai2d_input_tensor, hr_ai2d_builder + del hr_ai2d_input_tensor + del hr_ai2d_builder -def fp_ai2d_release(): - # 释放部分人脸姿态估计ai2d资源 - with ScopedTiming("fp_ai2d_release",debug_mode > 0): - global fp_ai2d_input_tensor,fp_ai2d_builder - del fp_ai2d_input_tensor - del fp_ai2d_builder +# 手势识别 kpu 初始化 +def hr_kpu_init(hr_kmodel_file): + # init kpu and load kmodel + with ScopedTiming("hr_kpu_init",debug_mode > 0): + hr_kpu_obj = nn.kpu() + hr_kpu_obj.load_kmodel(hr_kmodel_file) -def fp_kpu_init(kmodel_file): - # 初始化人脸姿态估计kpu及ai2d - with ScopedTiming("fp_kpu_init",debug_mode > 0): - kpu_obj = nn.kpu() - kpu_obj.load_kmodel(kmodel_file) - fp_ai2d_init() - return kpu_obj + hr_ai2d_init() + return hr_kpu_obj -def fp_kpu_pre_process(rgb888p_img,det): - # 人脸姿态估计kpu预处理 - fp_ai2d_run(rgb888p_img,det) - with ScopedTiming("fp_kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,fp_ai2d_output_tensor - current_kmodel_obj.set_input_tensor(0, fp_ai2d_output_tensor) - #ai2d_out_data = _ai2d_output_tensor.to_numpy() - #with open("/sdcard/app/ai2d_out.bin", "wb") as file: - #file.write(ai2d_out_data.tobytes()) +# 手势识别 kpu 输入预处理 +def hr_kpu_pre_process(rgb888p_img, x, y, w, h): + hr_ai2d_run(rgb888p_img, x, y, w, h) + with ScopedTiming("hr_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,hr_ai2d_output_tensor + # set kpu input + current_kmodel_obj.set_input_tensor(0, hr_ai2d_output_tensor) -def fp_kpu_get_output(): - # 获取人脸姿态估计kpu输出 - with ScopedTiming("fp_kpu_get_output",debug_mode > 0): +# 手势识别 kpu 获得 kmodel 输出 +def hr_kpu_get_output(): + with ScopedTiming("hr_kpu_get_output",debug_mode > 0): global current_kmodel_obj - data = current_kmodel_obj.get_output_tensor(0) - result = data.to_numpy() - result = result[0] - del data - return result + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() -def fp_kpu_post_process(pred): - # 人脸姿态估计kpu推理结果后处理 - R,eular = get_euler(pred) - return R,eular + result = result.reshape((result.shape[0]*result.shape[1])) + tmp2 = result.copy() + del result + results.append(tmp2) + return results -def fp_kpu_run(kpu_obj,rgb888p_img,det): - # 人脸姿态估计kpu推理 +# softmax实现 +def softmax(x): + x -= np.max(x) + x = np.exp(x) / np.sum(np.exp(x)) + return x + +# 手势识别 kpu 输出后处理 +def hr_kpu_post_process(results): + x_softmax = softmax(results[0]) + result = np.argmax(x_softmax) + text = " " + labels[result] + ": " + str(round(x_softmax[result],2)) + return text + +# 手势识别 kpu 运行 +def hr_kpu_run(kpu_obj,rgb888p_img, x, y, w, h): global current_kmodel_obj current_kmodel_obj = kpu_obj - # (1)根据人脸检测框进行人脸姿态估计kpu预处理 - fp_kpu_pre_process(rgb888p_img,det) - # (2)人脸姿态估计kpu推理 - with ScopedTiming("fp_kpu_run",debug_mode > 0): - kpu_obj.run() - # (3)释放人脸姿态估计ai2d资源 - fp_ai2d_release() - # (4)释放人脸姿态估计kpu推理输出 - result = fp_kpu_get_output() - # (5)释放人脸姿态估计后处理 - R,eular = fp_kpu_post_process(result) - return R,eular + # (1)原图预处理,并设置模型输入 + hr_kpu_pre_process(rgb888p_img, x, y, w, h) + # (2)手势识别 kpu 运行 + with ScopedTiming("hr_kpu_run",debug_mode > 0): + current_kmodel_obj.run() + # (3)释放手势识别 ai2d 资源 + hr_ai2d_release() + # (4)获取手势识别 kpu 输出 + results = hr_kpu_get_output() + # (5)手势识别 kpu 结果后处理 + result = hr_kpu_post_process(results) + # (6)返回手势识别结果 + return result -def fp_kpu_deinit(kpu_obj): - # 释放人脸姿态估计kpu及ai2d资源 - with ScopedTiming("fp_kpu_deinit",debug_mode > 0): - global fp_ai2d,fp_ai2d_output_tensor +# 手势识别 kpu 释放内存 +def hr_kpu_deinit(kpu_obj): + with ScopedTiming("hr_kpu_deinit",debug_mode > 0): + global hr_ai2d, hr_ai2d_output_tensor del kpu_obj - del fp_ai2d - del fp_ai2d_output_tensor + del hr_ai2d + del hr_ai2d_output_tensor -#********************for media_utils.py******************** -global draw_img_ulab,draw_img,osd_img #for display -global buffer,media_source,media_sink #for media +#media_utils.py +global draw_img,osd_img #for display 定义全局 作图image对象 +global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 -# for display,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.2 +#for display 初始化 def display_init(): - # 设置使用hdmi进行显示 + # use hdmi for display display.init(LT9611_1920X1080_30FPS) display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) +# display 释放内存 def display_deinit(): - # 释放显示资源 display.deinit() -def display_draw(dets,pose_results): - # 在显示器画人脸轮廓 - with ScopedTiming("display_draw",debug_mode >0): - global draw_img_ulab,draw_img,osd_img - if dets: - draw_img.clear() - line_color = np.array([255, 0, 0 ,255],dtype = np.uint8) #bgra - for i,det in enumerate(dets): - # (1)获取人脸姿态矩阵和欧拉角 - projections,center_point = build_projection_matrix(det) - R,euler = pose_results[i] - - # (2)遍历人脸投影矩阵的关键点,进行投影,并将结果画在图像上 - first_points = [] - second_points = [] - for pp in range(8): - sum_x, sum_y = 0.0, 0.0 - for cc in range(3): - sum_x += projections[pp][cc] * R[cc][0] - sum_y += projections[pp][cc] * (-R[cc][1]) - - center_x,center_y = center_point[0],center_point[1] - x = (sum_x + center_x) / OUT_RGB888P_WIDTH * DISPLAY_WIDTH - y = (sum_y + center_y) / OUT_RGB888P_HEIGH * DISPLAY_HEIGHT - x = max(0, min(x, DISPLAY_WIDTH)) - y = max(0, min(y, DISPLAY_HEIGHT)) - - if pp < 4: - first_points.append((x, y)) - else: - second_points.append((x, y)) - first_points = np.array(first_points,dtype=np.float) - aidemo.polylines(draw_img_ulab,first_points,True,line_color,2,8,0) - second_points = np.array(second_points,dtype=np.float) - aidemo.polylines(draw_img_ulab,second_points,True,line_color,2,8,0) - - for ll in range(4): - x0, y0 = int(first_points[ll][0]),int(first_points[ll][1]) - x1, y1 = int(second_points[ll][0]),int(second_points[ll][1]) - draw_img.draw_line(x0, y0, x1, y1, color = (255, 0, 0 ,255), thickness = 2) - - # (3)将绘制好的图像拷贝到显示缓冲区,并在显示器上展示 - draw_img.copy_to(osd_img) - display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) - else: - # (1)清空用来画框的图像 - draw_img.clear() - # (2)清空osd - draw_img.copy_to(osd_img) - # (3)显示透明图层 - display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) - -#for camera,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.1 +#for camera 初始化 def camera_init(dev_id): - # camera初始化 camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) # set chn0 output yuv420sp @@ -6111,31 +9437,30 @@ def camera_init(dev_id): camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) # set chn2 output rgb88planar - camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) +# camera 开启 def camera_start(dev_id): - # camera启动 camera.start_stream(dev_id) +# camera 读取图像 def camera_read(dev_id): - # 读取一帧图像 with ScopedTiming("camera_read",debug_mode >0): rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) return rgb888p_img +# camera 图像释放 def camera_release_image(dev_id,rgb888p_img): - # 释放一帧图像 with ScopedTiming("camera_release_image",debug_mode >0): camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) +# camera 结束 def camera_stop(dev_id): - # 停止camera camera.stop_stream(dev_id) -#for media,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.3 +#for media 初始化 def media_init(): - # meida初始化 config = k_vb_config() config.max_pool_cnt = 1 config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT @@ -6153,18 +9478,17 @@ def media_init(): ret = media.buffer_init() if ret: return ret - global buffer, draw_img_ulab,draw_img, osd_img + global buffer, draw_img, osd_img buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) - # 用于画框,draw_img->draw_img_ulab(两者指向同一块内存) - draw_img_ulab = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) - draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_REF,data = draw_img_ulab) - # 用于拷贝画框结果,防止画框过程中发生buffer搬运 + # 图层1,用于画框 + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_MPGC) + # 图层2,用于拷贝画框结果,防止画框过程中发生buffer搬运 osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) return ret +# media 释放内存 def media_deinit(): - # meida资源释放 global buffer,media_source, media_sink media.release_buffer(buffer) media.destroy_link(media_source, media_sink) @@ -6172,91 +9496,105 @@ def media_deinit(): ret = media.buffer_deinit() return ret -#********************for face_detect.py******************** -def face_pose_inference(): - print("face_pose_test start") - # 人脸检测kpu初始化 - kpu_face_detect = fd_kpu_init(fd_kmodel_file) - # 人脸姿态估计kpu初始化 - kpu_face_pose = fp_kpu_init(fp_kmodel_file) - # camera初始化 - camera_init(CAM_DEV_ID_0) - # 显示初始化 - display_init() +#**********for hand_recognition.py********** +def hand_recognition_inference(): + print("hand_recognition start") + kpu_hand_detect = hd_kpu_init(hd_kmodel_file) # 创建手掌检测的 kpu 对象 + kpu_hand_recognition = hr_kpu_init(hr_kmodel_file) # 创建手势识别的 kpu 对象 + camera_init(CAM_DEV_ID_0) # 初始化 camera + display_init() # 初始化 display rgb888p_img = None - # 注意:将一定要将一下过程包在try中,用于保证程序停止后,资源释放完毕;确保下次程序仍能正常运行 try: - # 注意:媒体初始化(注:媒体初始化必须在camera_start之前,确保media缓冲区已配置完全) ret = media_init() if ret: - print("face_detect_test, buffer init failed") + print("hand_recognition_test, buffer init failed") return ret - # 启动camera camera_start(CAM_DEV_ID_0) - time.sleep(5) - - gc_count = 0 + count = 0 while True: with ScopedTiming("total",1): - # (1)读取一帧图像 - rgb888p_img = camera_read(CAM_DEV_ID_0) - # (2)若读取失败,释放当前帧 + rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 if rgb888p_img == -1: - print("face_detect_test, capture_image failed") + print("hand_recognition_test, capture_image failed") camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None continue - # (3)若读取成功,推理当前帧 + # for rgb888planar if rgb888p_img.format() == image.RGBP888: - # (3.1)推理当前图像,并获取人脸检测结果 - dets = fd_kpu_run(kpu_face_detect,rgb888p_img) - # (3.2)针对每个人脸框,推理得到对应人脸旋转矩阵、欧拉角 - pose_results = [] - for det in dets: - R,eular = fp_kpu_run(kpu_face_pose,rgb888p_img,det) - pose_results.append((R,eular)) - # (3.3)将人脸姿态估计结果画到显示器上 - display_draw(dets,pose_results) + dets = hd_kpu_run(kpu_hand_detect,rgb888p_img) # 执行手掌检测 kpu 运行 以及 后处理过程 + draw_img.clear() - # (4)释放当前帧 - camera_release_image(CAM_DEV_ID_0,rgb888p_img) + for det_box in dets: + x1, y1, x2, y2 = det_box[2],det_box[3],det_box[4],det_box[5] + w = int(x2 - x1) + h = int(y2 - y1) + + if (h<(0.1*OUT_RGB888P_HEIGHT)): + continue + if (w<(0.25*OUT_RGB888P_WIDTH) and ((x1<(0.03*OUT_RGB888P_WIDTH)) or (x2>(0.97*OUT_RGB888P_WIDTH)))): + continue + if (w<(0.15*OUT_RGB888P_WIDTH) and ((x1<(0.01*OUT_RGB888P_WIDTH)) or (x2>(0.99*OUT_RGB888P_WIDTH)))): + continue + + w_det = int(float(x2 - x1) * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) + h_det = int(float(y2 - y1) * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) + x_det = int(x1*DISPLAY_WIDTH // OUT_RGB888P_WIDTH) + y_det = int(y1*DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) + + length = max(w,h)/2 + cx = (x1+x2)/2 + cy = (y1+y2)/2 + ratio_num = 1.1*length + + x1_kp = int(max(0,cx-ratio_num)) + y1_kp = int(max(0,cy-ratio_num)) + x2_kp = int(min(OUT_RGB888P_WIDTH-1, cx+ratio_num)) + y2_kp = int(min(OUT_RGB888P_HEIGHT-1, cy+ratio_num)) + w_kp = int(x2_kp - x1_kp + 1) + h_kp = int(y2_kp - y1_kp + 1) + + hr_results = hr_kpu_run(kpu_hand_recognition,rgb888p_img, x1_kp, y1_kp, w_kp, h_kp) # 执行手势识别 kpu 运行 以及 后处理过程 + draw_img.draw_rectangle(x_det, y_det, w_det, h_det, color=(255, 0, 255, 0), thickness = 2) # 将得到的手掌检测结果 绘制到 display + draw_img.draw_string( x_det, y_det-50, hr_results, color=(255,0, 255, 0), scale=4) # 将得到的手势识别结果 绘制到 display + + camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None + if (count>10): + gc.collect() + count = 0 + else: + count += 1 + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) except Exception as e: - # 捕捉运行运行中异常,并打印错误 print(f"An error occurred during buffer used: {e}") finally: - # 释放当前帧 if rgb888p_img is not None: #先release掉申请的内存再stop camera_release_image(CAM_DEV_ID_0,rgb888p_img) - # 停止camera - camera_stop(CAM_DEV_ID_0) - # 释放显示资源 - display_deinit() - # 释放kpu资源 - fd_kpu_deinit(kpu_face_detect) - fp_kpu_deinit(kpu_face_pose) - # 垃圾回收 + + camera_stop(CAM_DEV_ID_0) # 停止 camera + display_deinit() # 释放 display + hd_kpu_deinit(kpu_hand_detect) # 释放手掌检测 kpu + hr_kpu_deinit(kpu_hand_recognition) # 释放手势识别 kpu gc.collect() - time.sleep(1) - # 释放媒体资源 - ret = media_deinit() + ret = media_deinit() # 释放 整个media if ret: - print("face_pose_test, buffer_deinit failed") + print("hand_recognition_test, buffer_deinit failed") return ret - print("face_pose_test end") + print("hand_recognition_test end") return 0 if __name__ == '__main__': - face_pose_inference() + hand_recognition_inference() ``` -### 4. 人脸解析 +### 10.人脸mesh ```python import ulab.numpy as np # 类似python numpy操作,但也会有一些接口不同 @@ -6271,6 +9609,7 @@ import gc # 垃圾回收模块 import os # 操作系统接口模块 import math # 数学模块 + #********************for config.py******************** # display分辨率 DISPLAY_WIDTH = ALIGN_UP(1920, 16) # 显示宽度要求16位对齐 @@ -6283,13 +9622,14 @@ OUT_RGB888P_HEIGH = 1080 # kmodel参数设置 # 人脸检测kmodel输入shape fd_kmodel_input_shape = (1,3,320,320) -# 人脸解析kmodel输入shape -fp_kmodel_input_shape = (1,3,320,320) +# 人脸mesh kmodel输入shape +fm_kmodel_input_shape = (1,3,120,120) +fmpost_kmodel_input_shapes = [(3,3),(3,1),(40,1),(10,1)] # ai原图padding rgb_mean = [104,117,123] #人脸检测kmodel其它参数设置 -confidence_threshold = 0.5 # 人脸检测阈值 +confidence_threshold = 0.5 # 人脸检测阈值 top_k = 5000 nms_threshold = 0.2 keep_top_k = 750 @@ -6304,10 +9644,16 @@ keypoint_dim = 10 # 人脸检测kmodel root_dir = '/sdcard/app/tests/' fd_kmodel_file = root_dir + 'kmodel/face_detection_320.kmodel' -# 人脸解析kmodel -fp_kmodel_file = root_dir + 'kmodel/face_parse.kmodel' +# 人脸mesh kmodel +fm_kmodel_file = root_dir + 'kmodel/face_alignment.kmodel' +# 人脸mesh后处理kmodel +fmpost_kmodel_file = root_dir + 'kmodel/face_alignment_post.kmodel' # anchor文件 anchors_path = root_dir + 'utils/prior_data_320.bin' +# 人脸mesh参数均值 +param_mean = np.array([0.0003492636315058917,2.52790130161884e-07,-6.875197868794203e-07,60.1679573059082,-6.295513230725192e-07,0.0005757200415246189,-5.085391239845194e-05,74.2781982421875,5.400917189035681e-07,6.574138387804851e-05,0.0003442012530285865,-66.67157745361328,-346603.6875,-67468.234375,46822.265625,-15262.046875,4350.5888671875,-54261.453125,-18328.033203125,-1584.328857421875,-84566.34375,3835.960693359375,-20811.361328125,38094.9296875,-19967.85546875,-9241.3701171875,-19600.71484375,13168.08984375,-5259.14404296875,1848.6478271484375,-13030.662109375,-2435.55615234375,-2254.20654296875,-14396.5615234375,-6176.3291015625,-25621.919921875,226.39447021484375,-6326.12353515625,-10867.2509765625,868.465087890625,-5831.14794921875,2705.123779296875,-3629.417724609375,2043.9901123046875,-2446.6162109375,3658.697021484375,-7645.98974609375,-6674.45263671875,116.38838958740234,7185.59716796875,-1429.48681640625,2617.366455078125,-1.2070955038070679,0.6690792441368103,-0.17760828137397766,0.056725528091192245,0.03967815637588501,-0.13586315512657166,-0.09223993122577667,-0.1726071834564209,-0.015804484486579895,-0.1416848599910736],dtype=np.float) +# 人脸mesh参数方差 +param_std = np.array([0.00017632152594160289,6.737943476764485e-05,0.00044708489440381527,26.55023193359375,0.0001231376954820007,4.493021697271615e-05,7.923670636955649e-05,6.982563018798828,0.0004350444069132209,0.00012314890045672655,0.00017400001524947584,20.80303955078125,575421.125,277649.0625,258336.84375,255163.125,150994.375,160086.109375,111277.3046875,97311.78125,117198.453125,89317.3671875,88493.5546875,72229.9296875,71080.2109375,50013.953125,55968.58203125,47525.50390625,49515.06640625,38161.48046875,44872.05859375,46273.23828125,38116.76953125,28191.162109375,32191.4375,36006.171875,32559.892578125,25551.1171875,24267.509765625,27521.3984375,23166.53125,21101.576171875,19412.32421875,19452.203125,17454.984375,22537.623046875,16174.28125,14671.640625,15115.6884765625,13870.0732421875,13746.3125,12663.1337890625,1.5870834589004517,1.5077009201049805,0.5881357789039612,0.5889744758605957,0.21327851712703705,0.2630201280117035,0.2796429395675659,0.38030216097831726,0.16162841022014618,0.2559692859649658],dtype=np.float) # 调试模型,0:不调试,>0:打印对应级别调试信息 debug_mode = 0 @@ -6335,12 +9681,13 @@ global current_kmodel_obj #当前kpu对象 # fd_ai2d_output_tensor: 人脸检测ai2d输入 # fd_ai2d_builder: 根据人脸检测ai2d参数,构建的人脸检测ai2d_builder对象 global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder -# fld_ai2d: 人脸解析ai2d实例 -# fld_ai2d_input_tensor: 人脸解析ai2d输入 -# fld_ai2d_output_tensor:人脸解析ai2d输入 -# fld_ai2d_builder: 根据人脸解析ai2d参数,构建的人脸解析ai2d_builder对象 -global fp_ai2d,fp_ai2d_input_tensor,fp_ai2d_output_tensor,fp_ai2d_builder -global matrix_dst #人脸仿射变换矩阵 +# fm_ai2d: 人脸mesh ai2d实例 +# fm_ai2d_input_tensor: 人脸mesh ai2d输入 +# fm_ai2d_output_tensor:人脸mesh ai2d输入 +# fm_ai2d_builder: 根据人脸mesh ai2d参数,构建的人脸mesh ai2d_builder对象 +global fm_ai2d,fm_ai2d_input_tensor,fm_ai2d_output_tensor,fm_ai2d_builder +global roi #人脸区域 +global vertices #3D关键点 #读取anchor文件,为人脸检测后处理做准备 print('anchors_path:',anchors_path) @@ -6413,7 +9760,6 @@ def fd_ai2d_release(): global fd_ai2d_input_tensor del fd_ai2d_input_tensor - def fd_kpu_init(kmodel_file): # 初始化人脸检测kpu对象,并加载kmodel with ScopedTiming("fd_kpu_init",debug_mode > 0): @@ -6434,170 +9780,251 @@ def fd_kpu_pre_process(rgb888p_img): # 设置人脸检测kpu输入 current_kmodel_obj.set_input_tensor(0, fd_ai2d_output_tensor) -def fd_kpu_get_output(): - # 获取人脸检测kpu输出 - with ScopedTiming("fd_kpu_get_output",debug_mode > 0): +def fd_kpu_get_output(): + # 获取人脸检测kpu输出 + with ScopedTiming("fd_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + # 获取模型输出,并将结果转换为numpy,以便进行人脸检测后处理 + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + del data + results.append(result) + return results + +def fd_kpu_run(kpu_obj,rgb888p_img): + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)原图预处理,并设置模型输入 + fd_kpu_pre_process(rgb888p_img) + # (2)人脸检测kpu推理 + with ScopedTiming("fd kpu_run",debug_mode > 0): + kpu_obj.run() + # (3)释放人脸检测ai2d资源 + fd_ai2d_release() + # (4)获取人俩检测kpu输出 + results = fd_kpu_get_output() + # (5)人脸检测kpu结果后处理 + with ScopedTiming("fd kpu_post",debug_mode > 0): + post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, + [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) + # (6)返回人脸检测框 + if len(post_ret)==0: + return post_ret + else: + return post_ret[0] #0:det,1:landm,2:score + +def fd_kpu_deinit(): + # kpu释放 + with ScopedTiming("fd_kpu_deinit",debug_mode > 0): + global fd_ai2d, fd_ai2d_output_tensor + del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 + del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 + +###############for face recognition############### +def parse_roi_box_from_bbox(bbox): + # 获取人脸roi + x1, y1, w, h = map(lambda x: int(round(x, 0)), bbox[:4]) + old_size = (w + h) / 2 + center_x = x1 + w / 2 + center_y = y1 + h / 2 + old_size * 0.14 + size = int(old_size * 1.58) + + x0 = center_x - float(size) / 2 + y0 = center_y - float(size) / 2 + x1 = x0 + size + y1 = y0 + size + + x0 = max(0, min(x0, OUT_RGB888P_WIDTH)) + y0 = max(0, min(y0, OUT_RGB888P_HEIGH)) + x1 = max(0, min(x1, OUT_RGB888P_WIDTH)) + y1 = max(0, min(y1, OUT_RGB888P_HEIGH)) + + roi = (x0, y0, x1 - x0, y1 - y0) + return roi + +def fm_ai2d_init(): + # 人脸mesh ai2d初始化 + with ScopedTiming("fm_ai2d_init",debug_mode > 0): + # (1)创建人脸mesh ai2d对象 + global fm_ai2d + fm_ai2d = nn.ai2d() + + # (2)创建人脸mesh ai2d_output_tensor对象,用于存放ai2d输出 + global fm_ai2d_output_tensor + data = np.ones(fm_kmodel_input_shape, dtype=np.uint8) + fm_ai2d_output_tensor = nn.from_numpy(data) + +def fm_ai2d_run(rgb888p_img,det): + # 人脸mesh ai2d推理 + with ScopedTiming("fm_ai2d_run",debug_mode > 0): + global fm_ai2d,fm_ai2d_input_tensor,fm_ai2d_output_tensor + #(1)根据原图ai2d_input_tensor对象 + ai2d_input = rgb888p_img.to_numpy_ref() + fm_ai2d_input_tensor = nn.from_numpy(ai2d_input) + + # (2)根据新的det设置新的人脸mesh ai2d参数 + fm_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + global roi + roi = parse_roi_box_from_bbox(det) + fm_ai2d.set_crop_param(True,int(roi[0]),int(roi[1]),int(roi[2]),int(roi[3])) + fm_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + # (3)根据新的人脸mesh ai2d参数,构建人脸mesh ai2d_builder + global fm_ai2d_builder + fm_ai2d_builder = fm_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fm_kmodel_input_shape) + # (4)推理人脸mesh ai2d,将预处理的结果保存到fm_ai2d_output_tensor + fm_ai2d_builder.run(fm_ai2d_input_tensor, fm_ai2d_output_tensor) + +def fm_ai2d_release(): + # 释放人脸mesh ai2d_input_tensor、ai2d_builder + with ScopedTiming("fm_ai2d_release",debug_mode > 0): + global fm_ai2d_input_tensor,fm_ai2d_builder + del fm_ai2d_input_tensor + del fm_ai2d_builder + +def fm_kpu_init(kmodel_file): + # 人脸mesh kpu初始化 + with ScopedTiming("fm_kpu_init",debug_mode > 0): + # 初始化人脸mesh kpu对象 + kpu_obj = nn.kpu() + # 加载人脸mesh kmodel + kpu_obj.load_kmodel(kmodel_file) + # 初始化人脸mesh ai2d + fm_ai2d_init() + return kpu_obj + +def fm_kpu_pre_process(rgb888p_img,det): + # 人脸mesh kpu预处理 + # 人脸mesh ai2d推理,根据det对原图进行预处理 + fm_ai2d_run(rgb888p_img,det) + with ScopedTiming("fm_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,fm_ai2d_output_tensor + # 将人脸mesh ai2d输出设置为人脸mesh kpu输入 + current_kmodel_obj.set_input_tensor(0, fm_ai2d_output_tensor) + +def fm_kpu_get_output(): + with ScopedTiming("fm_kpu_get_output",debug_mode > 0): global current_kmodel_obj - # 获取模型输出,并将结果转换为numpy,以便进行人脸检测后处理 - results = [] - for i in range(current_kmodel_obj.outputs_size()): - data = current_kmodel_obj.get_output_tensor(i) - result = data.to_numpy() - del data - results.append(result) - return results + # 获取人脸mesh kpu输出 + data = current_kmodel_obj.get_output_tensor(0) + result = data.to_numpy() + del data + return result -def fd_kpu_run(kpu_obj,rgb888p_img): +def fm_kpu_post_process(param): + # 人脸mesh kpu结果后处理,反标准化 + with ScopedTiming("fm_kpu_post_process",debug_mode > 0): + param = param * param_std + param_mean + return param + +def fm_kpu_run(kpu_obj,rgb888p_img,det): + # 人脸mesh kpu推理 global current_kmodel_obj current_kmodel_obj = kpu_obj - # (1)原图预处理,并设置模型输入 - fd_kpu_pre_process(rgb888p_img) - # (2)人脸检测kpu推理 - with ScopedTiming("fd kpu_run",debug_mode > 0): + # (1)人脸mesh kpu预处理,设置kpu输入 + fm_kpu_pre_process(rgb888p_img,det) + # (2)人脸mesh kpu推理 + with ScopedTiming("fm_kpu_run",debug_mode > 0): kpu_obj.run() - # (3)释放人脸检测ai2d资源 - fd_ai2d_release() - # (4)获取人俩检测kpu输出 - results = fd_kpu_get_output() - # (5)人脸检测kpu结果后处理 - with ScopedTiming("fd kpu_post",debug_mode > 0): - post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, - [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) - # (6)返回人脸检测框 - if len(post_ret)==0: - return post_ret - else: - return post_ret[0] #0:det,1:landm,2:score + # (3)释放人脸mesh ai2d + fm_ai2d_release() + # (4)获取人脸mesh kpu输出 + param = fm_kpu_get_output() + # (5)人脸mesh 后处理 + param = fm_kpu_post_process(param) + return param -def fd_kpu_deinit(kpu_obj): - # kpu释放 - with ScopedTiming("fd_kpu_deinit",debug_mode > 0): - global fd_ai2d, fd_ai2d_output_tensor - del kpu_obj #删除人脸检测kpu_obj变量,释放对它所引用对象的内存引用 - del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 - del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 +def fm_kpu_deinit(): + # 人脸mesh kpu释放 + with ScopedTiming("fm_kpu_deinit",debug_mode > 0): + global fm_ai2d,fm_ai2d_output_tensor + del fm_ai2d # 删除fm_ai2d变量,释放对它所引用对象的内存引用 + del fm_ai2d_output_tensor # 删除fm_ai2d_output_tensor变量,释放对它所引用对象的内存引用 -###############for face recognition############### -def get_affine_matrix(bbox): - # 获取仿射矩阵,用于将边界框映射到模型输入空间 - with ScopedTiming("get_affine_matrix", debug_mode > 1): - # 设置缩放因子 - factor = 2.7 - # 从边界框提取坐标和尺寸 - x1, y1, w, h = map(lambda x: int(round(x, 0)), bbox[:4]) - # 模型输入大小 - edge_size = fp_kmodel_input_shape[2] - # 平移距离,使得模型输入空间的中心对准原点 - trans_distance = edge_size / 2.0 - # 计算边界框中心点的坐标 - center_x = x1 + w / 2.0 - center_y = y1 + h / 2.0 - # 计算最大边长 - maximum_edge = factor * (h if h > w else w) - # 计算缩放比例 - scale = edge_size * 2.0 / maximum_edge - # 计算平移参数 - cx = trans_distance - scale * center_x - cy = trans_distance - scale * center_y - # 创建仿射矩阵 - affine_matrix = [scale, 0, cx, 0, scale, cy] - return affine_matrix +def fmpost_kpu_init(kmodel_file): + # face mesh post模型初始化 + with ScopedTiming("fmpost_kpu_init",debug_mode > 0): + # 初始化人脸mesh kpu post对象 + kpu_obj = nn.kpu() + # 加载人脸mesh后处理kmodel + kpu_obj.load_kmodel(kmodel_file) + return kpu_obj -def fp_ai2d_init(): - # 人脸解析ai2d初始化 - with ScopedTiming("fp_ai2d_init",debug_mode > 0): - # (1)创建人脸解析ai2d对象 - global fp_ai2d - fp_ai2d = nn.ai2d() +def fmpost_kpu_pre_process(param): + # face mesh post模型预处理,param解析 + with ScopedTiming("fmpost_kpu_pre_process",debug_mode > 0): + param = param[0] + trans_dim, shape_dim, exp_dim = 12, 40, 10 - # (2)创建人脸解析ai2d_output_tensor对象 - global fp_ai2d_output_tensor - data = np.ones(fp_kmodel_input_shape, dtype=np.uint8) - fp_ai2d_output_tensor = nn.from_numpy(data) + # reshape前务必进行copy,否则会导致模型输入错误 + R_ = param[:trans_dim].copy().reshape((3, -1)) + R = R_[:, :3].copy() + offset = R_[:, 3].copy() + offset = offset.reshape((3, 1)) + alpha_shp = param[trans_dim:trans_dim + shape_dim].copy().reshape((-1, 1)) + alpha_exp = param[trans_dim + shape_dim:].copy().reshape((-1, 1)) -def fp_ai2d_run(rgb888p_img,det): - # 人脸解析ai2d推理 - with ScopedTiming("fp_ai2d_run",debug_mode > 0): - global fp_ai2d,fp_ai2d_input_tensor,fp_ai2d_output_tensor - #(1)根据原图构建人脸解析ai2d_input_tensor - ai2d_input = rgb888p_img.to_numpy_ref() - fp_ai2d_input_tensor = nn.from_numpy(ai2d_input) - #(2)设置人脸解析ai2d参数 - fp_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, - nn.ai2d_format.NCHW_FMT, - np.uint8, np.uint8) - global matrix_dst - matrix_dst = get_affine_matrix(det) - fp_ai2d.set_affine_param(True,nn.interp_method.cv2_bilinear,0, 0, 127, 1,matrix_dst) + R_tensor = nn.from_numpy(R) + current_kmodel_obj.set_input_tensor(0, R_tensor) + del R_tensor - # (3)构建人脸解析ai2d_builder - global fp_ai2d_builder - fp_ai2d_builder = fp_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fp_kmodel_input_shape) - # (4)推理人脸解析ai2d,将结果保存到ai2d_output_tensor - fp_ai2d_builder.run(fp_ai2d_input_tensor, fp_ai2d_output_tensor) + offset_tensor = nn.from_numpy(offset) + current_kmodel_obj.set_input_tensor(1, offset_tensor) + del offset_tensor -def fp_ai2d_release(): - # 释放部分人脸解析ai2d资源 - with ScopedTiming("fp_ai2d_release",debug_mode > 0): - global fp_ai2d_input_tensor,fp_ai2d_builder - del fp_ai2d_input_tensor - del fp_ai2d_builder + alpha_shp_tensor = nn.from_numpy(alpha_shp) + current_kmodel_obj.set_input_tensor(2, alpha_shp_tensor) + del alpha_shp_tensor -def fp_kpu_init(kmodel_file): - # 初始化人脸解析kpu及ai2d - with ScopedTiming("fp_kpu_init",debug_mode > 0): - kpu_obj = nn.kpu() - kpu_obj.load_kmodel(kmodel_file) - fp_ai2d_init() - return kpu_obj + alpha_exp_tensor = nn.from_numpy(alpha_exp) + current_kmodel_obj.set_input_tensor(3, alpha_exp_tensor) + del alpha_exp_tensor -def fp_kpu_pre_process(rgb888p_img,det): - # 人脸解析kpu预处理 - fp_ai2d_run(rgb888p_img,det) - with ScopedTiming("fp_kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,fp_ai2d_output_tensor - current_kmodel_obj.set_input_tensor(0, fp_ai2d_output_tensor) - #ai2d_out_data = fp_ai2d_output_tensor.to_numpy() - #with open("/sdcard/app/ai2d_out.bin", "wb") as file: - #file.write(ai2d_out_data.tobytes()) + return -def fp_kpu_get_output(): - # 获取人脸解析kpu输出 - with ScopedTiming("fp_kpu_get_output",debug_mode > 0): +def fmpost_kpu_get_output(): + # 获取face mesh post模型输出 + with ScopedTiming("fmpost_kpu_get_output",debug_mode > 0): global current_kmodel_obj + # 获取人脸mesh kpu输出 data = current_kmodel_obj.get_output_tensor(0) result = data.to_numpy() del data return result -def fp_kpu_run(kpu_obj,rgb888p_img,det): - # 人脸解析kpu推理 +def fmpost_kpu_post_process(roi): + # face mesh post模型推理结果后处理 + with ScopedTiming("fmpost_kpu_post_process",debug_mode > 0): + x, y, w, h = map(lambda x: int(round(x, 0)), roi[:4]) + x = x * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + y = y * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH + w = w * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + h = h * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH + roi_array = np.array([x,y,w,h],dtype=np.float) + global vertices + aidemo.face_mesh_post_process(roi_array,vertices) + return + +def fmpost_kpu_run(kpu_obj,param): + # face mesh post模型推理 global current_kmodel_obj current_kmodel_obj = kpu_obj - # (1)根据人脸检测框进行人脸解析kpu预处理 - fp_kpu_pre_process(rgb888p_img,det) - # (2)人脸解析kpu推理 - with ScopedTiming("fp_kpu_run",debug_mode > 0): + fmpost_kpu_pre_process(param) + with ScopedTiming("fmpost_kpu_run",debug_mode > 0): kpu_obj.run() - # (3)释放人脸解析ai2d资源 - fp_ai2d_release() - # (4)释放人脸解析kpu输出 - result = fp_kpu_get_output() - return result - -def fp_kpu_deinit(kpu_obj): - # 释放人脸解析kpu和ai2d资源 - with ScopedTiming("fp_kpu_deinit",debug_mode > 0): - global fp_ai2d,fp_ai2d_output_tensor - del kpu_obj - del fp_ai2d - del fp_ai2d_output_tensor - + global vertices + vertices = fmpost_kpu_get_output() + global roi + fmpost_kpu_post_process(roi) + return #********************for media_utils.py******************** -global draw_img_ulab,draw_img,osd_img #for display +global draw_img_ulab,draw_img,osd_img #for display global buffer,media_source,media_sink #for media -#for display +# for display,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.2 def display_init(): # 设置使用hdmi进行显示 display.init(LT9611_1920X1080_30FPS) @@ -6607,25 +10034,17 @@ def display_deinit(): # 释放显示资源 display.deinit() -def display_draw(dets,parse_results): - # 在显示器画出人脸解析结果 +def display_draw(dets,vertices_list): + # 在显示器画人脸轮廓 with ScopedTiming("display_draw",debug_mode >0): global draw_img_ulab,draw_img,osd_img if dets: draw_img.clear() - for i,det in enumerate(dets): - # (1)将人脸检测框画到draw_img - x, y, w, h = map(lambda x: int(round(x, 0)), det[:4]) - x = x * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - y = y * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - w = w * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - h = h * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH - draw_img.draw_rectangle(x,y, w, h, color=(255, 255, 0, 255)) - # (2)将人脸解析结果画到draw_img(draw_img_ulab和draw_img指同一内存) - aidemo.face_parse_post_process(draw_img_ulab,[OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH], - [DISPLAY_WIDTH,DISPLAY_HEIGHT],fp_kmodel_input_shape[2],det.tolist(),parse_results[i]) - # (3)将绘制好的图像拷贝到显示缓冲区,并在显示器上展示 + for vertices in vertices_list: + aidemo.face_draw_mesh(draw_img_ulab, vertices) + # (4)将轮廓结果拷贝到osd draw_img.copy_to(osd_img) + # (5)将osd显示到屏幕 display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) else: # (1)清空用来画框的图像 @@ -6687,10 +10106,9 @@ def media_init(): ret = media.buffer_init() if ret: return ret - global buffer, draw_img_ulab,draw_img, osd_img buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) - # 用于画框,draw_img->draw_img_ulab(两者指向同一块内存) + # 用于画框 draw_img_ulab = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_REF,data = draw_img_ulab) # 用于拷贝画框结果,防止画框过程中发生buffer搬运 @@ -6708,12 +10126,13 @@ def media_deinit(): return ret #********************for face_detect.py******************** -def face_parse_inference(): - print("face_parse_test start") +def face_mesh_inference(): # 人脸检测kpu初始化 kpu_face_detect = fd_kpu_init(fd_kmodel_file) - # 人脸解析kpu初始化 - kpu_face_parse = fp_kpu_init(fp_kmodel_file) + # 人脸mesh kpu初始化 + kpu_face_mesh = fm_kpu_init(fm_kmodel_file) + # face_mesh_post kpu初始化 + kpu_face_mesh_post = fmpost_kpu_init(fmpost_kmodel_file) # camera初始化 camera_init(CAM_DEV_ID_0) # 显示初始化 @@ -6731,7 +10150,6 @@ def face_parse_inference(): # 启动camera camera_start(CAM_DEV_ID_0) time.sleep(5) - gc_count = 0 while True: with ScopedTiming("total",1): @@ -6743,22 +10161,28 @@ def face_parse_inference(): camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None continue - # (3)若读取成功,推理当前帧 if rgb888p_img.format() == image.RGBP888: # (3.1)推理当前图像,并获取人脸检测结果 dets = fd_kpu_run(kpu_face_detect,rgb888p_img) - # (3.2)针对每个人脸框,推理得到对应人脸解析结果 - parse_results = [] + ## (3.2)针对每个人脸框,推理得到对应人脸mesh + mesh_result = [] for det in dets: - parse_ret = fp_kpu_run(kpu_face_parse,rgb888p_img,det) - parse_results.append(parse_ret) - # (3.3)将人脸解析结果画到显示器上 - display_draw(dets,parse_results) + param = fm_kpu_run(kpu_face_mesh,rgb888p_img,det) + fmpost_kpu_run(kpu_face_mesh_post,param) + global vertices + mesh_result.append(vertices) + ## (3.3)将人脸mesh 画到屏幕上 + display_draw(dets,mesh_result) # (4)释放当前帧 camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None + if gc_count > 5: + gc.collect() + gc_count = 0 + else: + gc_count += 1 except Exception as e: # 捕捉运行运行中异常,并打印错误 print(f"An error occurred during buffer used: {e}") @@ -6773,64 +10197,87 @@ def face_parse_inference(): # 释放显示资源 display_deinit() # 释放kpu资源 - fd_kpu_deinit(kpu_face_detect) - fp_kpu_deinit(kpu_face_parse) + fd_kpu_deinit() + fm_kpu_deinit() + global current_kmodel_obj + del current_kmodel_obj + del kpu_face_detect + del kpu_face_mesh + del kpu_face_mesh_post # 垃圾回收 gc.collect() time.sleep(1) # 释放媒体资源 ret = media_deinit() if ret: - print("face_parse_test, buffer_deinit failed") + print("face_mesh_test, buffer_deinit failed") return ret - print("face_parse_test end") + #print("face_mesh_test end") return 0 if __name__ == '__main__': - face_parse_inference() + face_mesh_inference() ``` -### 5. 车牌识别 +### 11.注视估计 ```python -import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 -import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 -from media.camera import * #摄像头模块 -from media.display import * #显示模块 -from media.media import * #软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 -import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 -import time #时间统计 -import gc #垃圾回收模块 -import aidemo #aidemo模块,封装ai demo相关后处理、画图操作 +import ulab.numpy as np # 类似python numpy操作,但也会有一些接口不同 +import nncase_runtime as nn # nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +from media.camera import * # 摄像头模块 +from media.display import * # 显示模块 +from media.media import * # 软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 +import aidemo # aidemo模块,封装ai demo相关后处理、画图操作 +import image # 图像模块,主要用于读取、图像绘制元素(框、点等)等操作 +import time # 时间统计 +import gc # 垃圾回收模块 +import os # 操作系统接口模块 +import math # 数学模块 -##config.py -#display分辨率 -DISPLAY_WIDTH = ALIGN_UP(1920, 16) + +#********************for config.py******************** +# display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) # 显示宽度要求16位对齐 DISPLAY_HEIGHT = 1080 -#ai原图分辨率输入 -OUT_RGB888P_WIDTH = ALIGN_UP(640, 16) -OUT_RGB888P_HEIGHT = 480 +# ai原图分辨率,sensor默认出图为16:9,若需不形变原图,最好按照16:9比例设置宽高 +OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) # ai原图宽度要求16位对齐 +OUT_RGB888P_HEIGH = 1080 -#车牌检测 和 车牌识别 kmodel输入shape -det_kmodel_input_shape = (1,3,640,640) -rec_kmodel_input_shape = (1,1,32,220) +# kmodel参数设置 +# 人脸检测kmodel输入shape +fd_kmodel_input_shape = (1,3,320,320) +# 注视估计kmodel输入shape +feg_kmodel_input_shape = (1,3,448,448) +# ai原图padding +rgb_mean = [104,117,123] -#车牌检测 相关参数设置 -obj_thresh = 0.2 #车牌检测分数阈值 -nms_thresh = 0.2 #检测框 非极大值抑制 阈值 +#人脸检测kmodel其它参数设置 +confidence_threshold = 0.5 # 人脸检测阈值 +top_k = 5000 +nms_threshold = 0.2 +keep_top_k = 750 +vis_thres = 0.5 +variance = [0.1, 0.2] +anchor_len = 4200 +score_dim = 2 +det_dim = 4 +keypoint_dim = 10 -#文件配置 +# 文件配置 +# 人脸检测kmodel root_dir = '/sdcard/app/tests/' -det_kmodel_file = root_dir + 'kmodel/LPD_640.kmodel' # 车牌检测 kmodel 文件路径 -rec_kmodel_file = root_dir + 'kmodel/licence_reco.kmodel' # 车牌识别 kmodel 文件路径 -#dict_rec = ["挂", "使", "领", "澳", "港", "皖", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "京", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "桂", "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新", "警", "学", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "_", "-"] -dict_rec = ["gua","shi","ling","ao","gang","wan","hu","jin","yu","ji","jin","meng","liao","ji","hei","su","zhe","jing","min","gan","lu","yu","e","xiang","yue","gui","qiong","chuan","gui","yun","zang","shan","gan","qing","ning","xin","jing","xue","0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "_", "-"] -dict_size = len(dict_rec) -debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) +fd_kmodel_file = root_dir + 'kmodel/face_detection_320.kmodel' +# 注视估计kmodel +fr_kmodel_file = root_dir + 'kmodel/eye_gaze.kmodel' +# anchor文件 +anchors_path = root_dir + 'utils/prior_data_320.bin' +# 调试模型,0:不调试,>0:打印对应级别调试信息 +debug_mode = 0 -#scoped_timing.py 用于debug模式输出程序块运行时间 +#********************for scoped_timing.py******************** +# 时间统计类 class ScopedTiming: def __init__(self, info="", enable_profile=True): self.info = info @@ -6846,272 +10293,311 @@ class ScopedTiming: elapsed_time = time.time_ns() - self.start_time print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") +#********************for ai_utils.py******************** +global current_kmodel_obj #当前kpu对象 +# fd_ai2d: 人脸检测ai2d实例 +# fd_ai2d_input_tensor: 人脸检测ai2d输入 +# fd_ai2d_output_tensor: 人脸检测ai2d输入 +# fd_ai2d_builder: 根据人脸检测ai2d参数,构建的人脸检测ai2d_builder对象 +global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder +# feg_ai2d: 注视估计ai2d实例 +# feg_ai2d_input_tensor: 注视估计ai2d输入 +# feg_ai2d_output_tensor:注视估计ai2d输入 +# feg_ai2d_builder: 根据注视估计ai2d参数,构建的注视估计ai2d_builder对象 +global feg_ai2d,feg_ai2d_input_tensor,feg_ai2d_output_tensor,feg_ai2d_builder +global matrix_dst #人脸仿射变换矩阵 -#ai_utils.py -global det_current_kmodel_obj,rec_current_kmodel_obj # 定义全局的 kpu 对象 -global det_ai2d,det_ai2d_input_tensor,det_ai2d_output_tensor,det_ai2d_builder # 定义车牌检测 ai2d 对象 ,并且定义 ai2d 的输入、输出 以及 builder -global rec_ai2d,rec_ai2d_input_tensor,rec_ai2d_output_tensor,rec_ai2d_builder # 定义车牌识别 ai2d 对象 ,并且定义 ai2d 的输入、输出 以及 builder - -# 车牌检测 接收kmodel输出的后处理方法 -def det_kpu_post_process(output_data): - with ScopedTiming("det_kpu_post_process", debug_mode > 0): - results = aidemo.licence_det_postprocess(output_data,[OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH],[det_kmodel_input_shape[2],det_kmodel_input_shape[3]],obj_thresh,nms_thresh) - return results - -# 车牌识别 接收kmodel输出的后处理方法 -def rec_kpu_post_process(output_data): - with ScopedTiming("rec_kpu_post_process", debug_mode > 0): - size = rec_kmodel_input_shape[3] / 4 - result = [] - for i in range(size): - maxs = float("-inf") - index = -1 - for j in range(dict_size): - if (maxs < float(output_data[i * dict_size +j])): - index = j - maxs = output_data[i * dict_size +j] - result.append(index) - - result_str = "" - for i in range(size): - if (result[i] >= 0 and result[i] != 0 and not(i > 0 and result[i-1] == result[i])): - result_str += dict_rec[result[i]-1] - return result_str +#读取anchor文件,为人脸检测后处理做准备 +print('anchors_path:',anchors_path) +prior_data = np.fromfile(anchors_path, dtype=np.float) +prior_data = prior_data.reshape((anchor_len,det_dim)) -# 车牌检测 ai2d 初始化 -def det_ai2d_init(): - with ScopedTiming("det_ai2d_init",debug_mode > 0): - global det_ai2d - det_ai2d = nn.ai2d() - det_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, - nn.ai2d_format.NCHW_FMT, - np.uint8, np.uint8) - det_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) +def get_pad_one_side_param(): + # 右padding或下padding,获取padding参数 + dst_w = fd_kmodel_input_shape[3] # kmodel输入宽(w) + dst_h = fd_kmodel_input_shape[2] # kmodel输入高(h) - global det_ai2d_out_tensor - data = np.ones(det_kmodel_input_shape, dtype=np.uint8) - det_ai2d_out_tensor = nn.from_numpy(data) + # OUT_RGB888P_WIDTH:原图宽(w) + # OUT_RGB888P_HEIGH:原图高(h) + # 计算最小的缩放比例,等比例缩放 + ratio_w = dst_w / OUT_RGB888P_WIDTH + ratio_h = dst_h / OUT_RGB888P_HEIGH + if ratio_w < ratio_h: + ratio = ratio_w + else: + ratio = ratio_h + # 计算经过缩放后的新宽和新高 + new_w = (int)(ratio * OUT_RGB888P_WIDTH) + new_h = (int)(ratio * OUT_RGB888P_HEIGH) - global det_ai2d_builder - det_ai2d_builder = det_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], det_kmodel_input_shape) + # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 + dw = (dst_w - new_w) / 2 + dh = (dst_h - new_h) / 2 + # 四舍五入,确保padding是整数 + top = (int)(round(0)) + bottom = (int)(round(dh * 2 + 0.1)) + left = (int)(round(0)) + right = (int)(round(dw * 2 - 0.1)) + return [0, 0, 0, 0, top, bottom, left, right] -# 车牌识别 ai2d 初始化 -def rec_ai2d_init(): - with ScopedTiming("rec_ai2d_init",debug_mode > 0): - global rec_ai2d - rec_ai2d = nn.ai2d() - rec_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, +def fd_ai2d_init(): + # 人脸检测模型ai2d初始化 + with ScopedTiming("fd_ai2d_init",debug_mode > 0): + # (1)创建人脸检测ai2d对象 + global fd_ai2d + fd_ai2d = nn.ai2d() + # (2)设置人脸检测ai2d参数 + fd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) + fd_ai2d.set_pad_param(True, get_pad_one_side_param(), 0, rgb_mean) + fd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) - global rec_ai2d_out_tensor - data = np.ones(rec_kmodel_input_shape, dtype=np.uint8) - rec_ai2d_out_tensor = nn.from_numpy(data) - - rec_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) - -# 车牌检测 ai2d 运行 -def det_ai2d_run(rgb888p_img): - with ScopedTiming("det_ai2d_run",debug_mode > 0): - global det_ai2d_input_tensor,det_ai2d_out_tensor,det_ai2d_builder - det_ai2d_input = rgb888p_img.to_numpy_ref() - det_ai2d_input_tensor = nn.from_numpy(det_ai2d_input) - - det_ai2d_builder.run(det_ai2d_input_tensor, det_ai2d_out_tensor) - -# 车牌识别 ai2d 运行 -def rec_ai2d_run(img_array): - with ScopedTiming("rec_ai2d_run",debug_mode > 0): - global rec_ai2d_input_tensor,rec_ai2d_out_tensor,rec_ai2d_builder - rec_ai2d_builder = rec_ai2d.build([1,1,img_array.shape[2],img_array.shape[3]], rec_kmodel_input_shape) - rec_ai2d_input_tensor = nn.from_numpy(img_array) - - rec_ai2d_builder.run(rec_ai2d_input_tensor, rec_ai2d_out_tensor) + #(3)人脸检测ai2d_builder,根据人脸检测ai2d参数、输入输出大小创建ai2d_builder对象 + global fd_ai2d_builder + fd_ai2d_builder = fd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fd_kmodel_input_shape) -# 车牌检测 ai2d 释放内存 -def det_ai2d_release(): - with ScopedTiming("det_ai2d_release",debug_mode > 0): - global det_ai2d_input_tensor - del det_ai2d_input_tensor + #(4)创建人脸检测ai2d_output_tensor,用于保存人脸检测ai2d输出 + global fd_ai2d_output_tensor + data = np.ones(fd_kmodel_input_shape, dtype=np.uint8) + fd_ai2d_output_tensor = nn.from_numpy(data) -# 车牌识别 ai2d 释放内存 -def rec_ai2d_release(): - with ScopedTiming("rec_ai2d_release",debug_mode > 0): - global rec_ai2d_input_tensor, rec_ai2d_builder - del rec_ai2d_input_tensor - del rec_ai2d_builder +def fd_ai2d_run(rgb888p_img): + # 根据人脸检测ai2d参数,对原图rgb888p_img进行预处理 + with ScopedTiming("fd_ai2d_run",debug_mode > 0): + global fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder + # (1)根据原图构建ai2d_input_tensor对象 + ai2d_input = rgb888p_img.to_numpy_ref() + fd_ai2d_input_tensor = nn.from_numpy(ai2d_input) + # (2)运行人脸检测ai2d_builder,将结果保存到人脸检测ai2d_output_tensor中 + fd_ai2d_builder.run(fd_ai2d_input_tensor, fd_ai2d_output_tensor) -# 车牌检测 kpu 初始化 -def det_kpu_init(kmodel_file): - # init kpu and load kmodel - with ScopedTiming("det_kpu_init",debug_mode > 0): - kpu_obj = nn.kpu() - kpu_obj.load_kmodel(kmodel_file) +def fd_ai2d_release(): + # 释放人脸检测ai2d_input_tensor + with ScopedTiming("fd_ai2d_release",debug_mode > 0): + global fd_ai2d_input_tensor + del fd_ai2d_input_tensor - det_ai2d_init() - return kpu_obj -# 车牌识别 kpu 初始化 -def rec_kpu_init(kmodel_file): - # init kpu and load kmodel - with ScopedTiming("rec_kpu_init",debug_mode > 0): +def fd_kpu_init(kmodel_file): + # 初始化人脸检测kpu对象,并加载kmodel + with ScopedTiming("fd_kpu_init",debug_mode > 0): + # 初始化人脸检测kpu对象 kpu_obj = nn.kpu() + # 加载人脸检测kmodel kpu_obj.load_kmodel(kmodel_file) - - rec_ai2d_init() + # 初始化人脸检测ai2d + fd_ai2d_init() return kpu_obj -# 车牌检测 kpu 输入预处理 -def det_kpu_pre_process(rgb888p_img): - det_ai2d_run(rgb888p_img) - with ScopedTiming("det_kpu_pre_process",debug_mode > 0): - global det_current_kmodel_obj,det_ai2d_out_tensor - # set kpu input - det_current_kmodel_obj.set_input_tensor(0, det_ai2d_out_tensor) - -# 车牌识别 kpu 输入预处理 -def rec_kpu_pre_process(img_array): - rec_ai2d_run(img_array) - with ScopedTiming("rec_kpu_pre_process",debug_mode > 0): - global rec_current_kmodel_obj,rec_ai2d_out_tensor - # set kpu input - rec_current_kmodel_obj.set_input_tensor(0, rec_ai2d_out_tensor) - -# 车牌识别 抠图 -def rec_array_pre_process(rgb888p_img,dets): - with ScopedTiming("rec_array_pre_process",debug_mode > 0): - isp_image = rgb888p_img.to_numpy_ref() - imgs_array_boxes = aidemo.ocr_rec_preprocess(isp_image,[OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH],dets) - return imgs_array_boxes +def fd_kpu_pre_process(rgb888p_img): + # 设置人脸检测kpu输入 + # 使用人脸检测ai2d对原图进行预处理(padding,resize) + fd_ai2d_run(rgb888p_img) + with ScopedTiming("fd_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,fd_ai2d_output_tensor + # 设置人脸检测kpu输入 + current_kmodel_obj.set_input_tensor(0, fd_ai2d_output_tensor) -# 车牌检测 获取 kmodel 输出 -def det_kpu_get_output(): - with ScopedTiming("det_kpu_get_output",debug_mode > 0): - global det_current_kmodel_obj +def fd_kpu_get_output(): + # 获取人脸检测kpu输出 + with ScopedTiming("fd_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + # 获取模型输出,并将结果转换为numpy,以便进行人脸检测后处理 results = [] - for i in range(det_current_kmodel_obj.outputs_size()): - data = det_current_kmodel_obj.get_output_tensor(i) + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) result = data.to_numpy() - tmp2 = result.copy() del data - results.append(tmp2) + results.append(result) return results -# 车牌识别 获取 kmodel 输出 -def rec_kpu_get_output(): - with ScopedTiming("rec_kpu_get_output",debug_mode > 0): - global rec_current_kmodel_obj - data = rec_current_kmodel_obj.get_output_tensor(0) - result = data.to_numpy() - result = result.reshape((result.shape[0] * result.shape[1] * result.shape[2])) - tmp = result.copy() - del data - return tmp - -# 车牌检测 kpu 运行 -def det_kpu_run(kpu_obj,rgb888p_img): - global det_current_kmodel_obj - det_current_kmodel_obj = kpu_obj - # (1) 原图预处理,并设置模型输入 - det_kpu_pre_process(rgb888p_img) - # (2) kpu 运行 - with ScopedTiming("det_kpu_run",debug_mode > 0): +def fd_kpu_run(kpu_obj,rgb888p_img): + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)原图预处理,并设置模型输入 + fd_kpu_pre_process(rgb888p_img) + # (2)人脸检测kpu推理 + with ScopedTiming("fd kpu_run",debug_mode > 0): kpu_obj.run() - # (3) 释放ai2d资源 - det_ai2d_release() - # (4) 获取kpu输出 - results = det_kpu_get_output() - # (5) kpu结果后处理 - dets = det_kpu_post_process(results) - # 返回 车牌检测结果 - return dets + # (3)释放人脸检测ai2d资源 + fd_ai2d_release() + # (4)获取人俩检测kpu输出 + results = fd_kpu_get_output() + # (5)人脸检测kpu结果后处理 + with ScopedTiming("fd kpu_post",debug_mode > 0): + post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, + [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) + # (6)返回人脸检测框 + if len(post_ret)==0: + return post_ret + else: + return post_ret[0] #0:det,1:landm,2:score -# 车牌识别 kpu 运行 -def rec_kpu_run(kpu_obj,rgb888p_img,dets): - global rec_current_kmodel_obj - if (len(dets) == 0): - return [] - rec_current_kmodel_obj = kpu_obj - # (1) 原始图像抠图,车牌检测结果 points 排序 - imgs_array_boxes = rec_array_pre_process(rgb888p_img,dets) - imgs_array = imgs_array_boxes[0] - boxes = imgs_array_boxes[1] - recs = [] - for img_array in imgs_array: - # (2) 抠出后的图像 进行预处理,设置模型输入 - rec_kpu_pre_process(img_array) - # (3) kpu 运行 - with ScopedTiming("rec_kpu_run",debug_mode > 0): - kpu_obj.run() - # (4) 释放ai2d资源 - rec_ai2d_release() - # (5) 获取 kpu 输出 - result = rec_kpu_get_output() - # (6) kpu 结果后处理 - rec = rec_kpu_post_process(result) - recs.append(rec) - # (7) 返回 车牌检测 和 识别结果 - return [boxes,recs] +def fd_kpu_deinit(): + # kpu释放 + with ScopedTiming("fd_kpu_deinit",debug_mode > 0): + global fd_ai2d, fd_ai2d_output_tensor + del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 + del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 +###############for face recognition############### +def feg_ai2d_init(): + # 注视估计ai2d初始化 + with ScopedTiming("feg_ai2d_init",debug_mode > 0): + # (1)创建注视估计ai2d对象 + global feg_ai2d + feg_ai2d = nn.ai2d() + + # (2)创建注视估计ai2d_output_tensor对象,用于存放ai2d输出 + global feg_ai2d_output_tensor + data = np.ones(feg_kmodel_input_shape, dtype=np.uint8) + feg_ai2d_output_tensor = nn.from_numpy(data) + +def feg_ai2d_run(rgb888p_img,det): + # 注视估计ai2d推理 + with ScopedTiming("feg_ai2d_run",debug_mode > 0): + global feg_ai2d,feg_ai2d_input_tensor,feg_ai2d_output_tensor + #(1)根据原图ai2d_input_tensor对象 + ai2d_input = rgb888p_img.to_numpy_ref() + feg_ai2d_input_tensor = nn.from_numpy(ai2d_input) -# 车牌检测 kpu 释放内存 -def det_kpu_deinit(kpu_obj): - with ScopedTiming("det_kpu_deinit",debug_mode > 0): - global det_ai2d, det_ai2d_builder, det_ai2d_out_tensor - del kpu_obj - del det_ai2d - del det_ai2d_builder - del det_ai2d_out_tensor + # (2)根据新的det设置新的注视估计ai2d参数 + feg_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) -# 车牌识别 kpu 释放内存 -def rec_kpu_deinit(kpu_obj): - with ScopedTiming("rec_kpu_deinit",debug_mode > 0): - global rec_ai2d, rec_ai2d_out_tensor - del kpu_obj - del rec_ai2d - del rec_ai2d_out_tensor + x, y, w, h = map(lambda x: int(round(x, 0)), det[:4]) + feg_ai2d.set_crop_param(True,x,y,w,h) + feg_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + + # (3)根据新的注视估计ai2d参数,构建注视估计ai2d_builder + global feg_ai2d_builder + feg_ai2d_builder = feg_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], feg_kmodel_input_shape) + # (4)推理注视估计ai2d,将预处理的结果保存到feg_ai2d_output_tensor + feg_ai2d_builder.run(feg_ai2d_input_tensor, feg_ai2d_output_tensor) + +def feg_ai2d_release(): + # 释放注视估计ai2d_input_tensor、ai2d_builder + with ScopedTiming("feg_ai2d_release",debug_mode > 0): + global feg_ai2d_input_tensor,feg_ai2d_builder + del feg_ai2d_input_tensor + del feg_ai2d_builder + +def feg_kpu_init(kmodel_file): + # 注视估计kpu初始化 + with ScopedTiming("feg_kpu_init",debug_mode > 0): + # 初始化注视估计kpu对象 + kpu_obj = nn.kpu() + # 加载注视估计kmodel + kpu_obj.load_kmodel(kmodel_file) + # 初始化注视估计ai2d + feg_ai2d_init() + return kpu_obj -#media_utils.py -global draw_img,osd_img #for display 定义全局 作图image对象 -global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 +def feg_kpu_pre_process(rgb888p_img,det): + # 注视估计kpu预处理 + # 注视估计ai2d推理,根据det对原图进行预处理 + feg_ai2d_run(rgb888p_img,det) + with ScopedTiming("feg_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,feg_ai2d_output_tensor + # 将注视估计ai2d输出设置为注视估计kpu输入 + current_kmodel_obj.set_input_tensor(0, feg_ai2d_output_tensor) + +def feg_kpu_get_output(): + with ScopedTiming("feg_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + # 获取注视估计kpu输出 + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + del data + results.append(result) + return results -#for display 初始化 +def feg_kpu_post_process(results): + # 注视估计kpu推理结果后处理 + with ScopedTiming("feg_kpu_post_process",debug_mode > 0): + post_ret = aidemo.eye_gaze_post_process(results) + return post_ret[0],post_ret[1] + +def feg_kpu_run(kpu_obj,rgb888p_img,det): + # 注视估计kpu推理 + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)注视估计kpu预处理,设置kpu输入 + feg_kpu_pre_process(rgb888p_img,det) + # (2)注视估计kpu推理 + with ScopedTiming("feg_kpu_run",debug_mode > 0): + kpu_obj.run() + # (3)释放注视估计ai2d + feg_ai2d_release() + # (4)获取注视估计kpu输出 + results = feg_kpu_get_output() + # (5)注视估计后处理 + pitch,yaw = feg_kpu_post_process(results) + return pitch,yaw + +def feg_kpu_deinit(): + # 注视估计kpu释放 + with ScopedTiming("feg_kpu_deinit",debug_mode > 0): + global feg_ai2d,feg_ai2d_output_tensor + del feg_ai2d # 删除feg_ai2d变量,释放对它所引用对象的内存引用 + del feg_ai2d_output_tensor # 删除feg_ai2d_output_tensor变量,释放对它所引用对象的内存引用 + +#********************for media_utils.py******************** +global draw_img_ulab,draw_img,osd_img #for display +global buffer,media_source,media_sink #for media + +# for display,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.2 def display_init(): - # use hdmi for display + # 设置使用hdmi进行显示 display.init(LT9611_1920X1080_30FPS) display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) -# display 释放内存 def display_deinit(): + # 释放显示资源 display.deinit() -# display 作图过程 将所有车牌检测框 和 识别结果绘制到屏幕 -def display_draw(dets_recs): +def display_draw(dets,gaze_results): + # 在显示器画人脸轮廓 with ScopedTiming("display_draw",debug_mode >0): - global draw_img,osd_img - if dets_recs: - dets = dets_recs[0] - recs = dets_recs[1] + global draw_img_ulab,draw_img,osd_img + if dets: draw_img.clear() - point_8 = np.zeros((8),dtype=np.int16) - for det_index in range(len(dets)): - for i in range(4): - x = dets[det_index][i * 2 + 0]/OUT_RGB888P_WIDTH*DISPLAY_WIDTH - y = dets[det_index][i * 2 + 1]/OUT_RGB888P_HEIGHT*DISPLAY_HEIGHT - point_8[i * 2 + 0] = int(x) - point_8[i * 2 + 1] = int(y) - for i in range(4): - draw_img.draw_line(point_8[i * 2 + 0],point_8[i * 2 + 1],point_8[(i+1) % 4 * 2 + 0],point_8[(i+1) % 4 * 2 + 1],color=(255, 0, 255, 0),thickness=2) - draw_img.draw_string( point_8[6], point_8[7] + 20, recs[det_index] , color=(255,255,153,18) , scale=4) + for det,gaze_ret in zip(dets,gaze_results): + pitch , yaw = gaze_ret + length = DISPLAY_WIDTH / 2 + x, y, w, h = map(lambda x: int(round(x, 0)), det[:4]) + x = x * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + y = y * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH + w = w * DISPLAY_WIDTH // OUT_RGB888P_WIDTH + h = h * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH + center_x = (x + w / 2.0) + center_y = (y + h / 2.0) + dx = -length * math.sin(pitch) * math.cos(yaw) + target_x = int(center_x + dx) + dy = -length * math.sin(yaw) + target_y = int(center_y + dy) + + draw_img.draw_arrow(int(center_x), int(center_y), target_x, target_y, color = (255,255,0,0), size = 30, thickness = 2) + + # (4)将轮廓结果拷贝到osd draw_img.copy_to(osd_img) + # (5)将osd显示到屏幕 display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) else: + # (1)清空用来画框的图像 draw_img.clear() + # (2)清空osd draw_img.copy_to(osd_img) + # (3)显示透明图层 display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) -#for camera 初始化 +#for camera,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.1 def camera_init(dev_id): + # camera初始化 camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) # set chn0 output yuv420sp @@ -7119,30 +10605,31 @@ def camera_init(dev_id): camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) # set chn2 output rgb88planar - camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) - camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_BGR_888_PLANAR) + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) -# camera 开启 def camera_start(dev_id): + # camera启动 camera.start_stream(dev_id) -# camera 读取图像 def camera_read(dev_id): + # 读取一帧图像 with ScopedTiming("camera_read",debug_mode >0): rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) return rgb888p_img -# camera 图像释放 def camera_release_image(dev_id,rgb888p_img): + # 释放一帧图像 with ScopedTiming("camera_release_image",debug_mode >0): camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) -# camera 结束 def camera_stop(dev_id): + # 停止camera camera.stop_stream(dev_id) -#for media 初始化 +#for media,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.3 def media_init(): + # meida初始化 config = k_vb_config() config.max_pool_cnt = 1 config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT @@ -7160,17 +10647,18 @@ def media_init(): ret = media.buffer_init() if ret: return ret - global buffer, draw_img, osd_img + global buffer, draw_img_ulab,draw_img, osd_img buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) - # 图层1,用于画框 - draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_MPGC) - # 图层2,用于拷贝画框结果,防止画框过程中发生buffer搬运 + # 用于画框 + draw_img_ulab = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_REF,data = draw_img_ulab) + # 用于拷贝画框结果,防止画框过程中发生buffer搬运 osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) return ret -# media 释放内存 def media_deinit(): + # meida资源释放 global buffer,media_source, media_sink media.release_buffer(buffer) media.destroy_link(media_source, media_sink) @@ -7178,126 +10666,193 @@ def media_deinit(): ret = media.buffer_deinit() return ret - -#**********for licence_det_rec.py********** -def licence_det_inference(): - print("licence_det start") - kpu_licence_det = det_kpu_init(det_kmodel_file) # 创建车牌检测的 kpu 对象 - kpu_licence_rec = rec_kpu_init(rec_kmodel_file) # 创建车牌识别的 kpu 对象 - camera_init(CAM_DEV_ID_0) # 初始化 camera - display_init() # 初始化 display +#********************for face_detect.py******************** +def eye_gaze_inference(): + print("eye_gaze_test start") + # 人脸检测kpu初始化 + kpu_face_detect = fd_kpu_init(fd_kmodel_file) + # 注视估计kpu初始化 + kpu_eye_gaze = feg_kpu_init(fr_kmodel_file) + # camera初始化 + camera_init(CAM_DEV_ID_0) + # 显示初始化 + display_init() rgb888p_img = None + # 注意:将一定要将一下过程包在try中,用于保证程序停止后,资源释放完毕;确保下次程序仍能正常运行 try: + # 注意:媒体初始化(注:媒体初始化必须在camera_start之前,确保media缓冲区已配置完全) ret = media_init() if ret: - print("licence_det, buffer init failed") + print("face_detect_test, buffer init failed") return ret + # 启动camera camera_start(CAM_DEV_ID_0) time.sleep(5) while True: with ScopedTiming("total",1): - rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 + # (1)读取一帧图像 + rgb888p_img = camera_read(CAM_DEV_ID_0) + # (2)若读取失败,释放当前帧 if rgb888p_img == -1: - print("licence_det, capture_image failed") + print("face_detect_test, capture_image failed") camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None continue - - # for rgb888planar + # (3)若读取成功,推理当前帧 if rgb888p_img.format() == image.RGBP888: - dets = det_kpu_run(kpu_licence_det,rgb888p_img) # 执行车牌检测 kpu 运行 以及 后处理过程 - dets_recs = rec_kpu_run(kpu_licence_rec,rgb888p_img,dets) # 执行车牌识别 kpu 运行 以及 后处理过程 - display_draw(dets_recs) # 将得到的检测结果和识别结果 绘制到display + # (3.1)推理当前图像,并获取人脸检测结果 + dets = fd_kpu_run(kpu_face_detect,rgb888p_img) + # (3.2)针对每个人脸框,推理得到对应注视估计 + gaze_results = [] + for det in dets: + pitch ,yaw = feg_kpu_run(kpu_eye_gaze,rgb888p_img,det) + gaze_results.append([pitch ,yaw]) + # (3.3)将注视估计画到屏幕上 + display_draw(dets,gaze_results) - camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 + # (4)释放当前帧 + camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None - # gc.collect() + with ScopedTiming("gc collect", debug_mode > 0): + gc.collect() #2.00 ms + except Exception as e: + # 捕捉运行运行中异常,并打印错误 print(f"An error occurred during buffer used: {e}") finally: + # 释放当前帧 if rgb888p_img is not None: #先release掉申请的内存再stop camera_release_image(CAM_DEV_ID_0,rgb888p_img) - camera_stop(CAM_DEV_ID_0) # 停止 camera - display_deinit() # 释放 display - det_kpu_deinit(kpu_licence_det) # 释放 车牌检测 kpu - rec_kpu_deinit(kpu_licence_rec) # 释放 车牌识别 kpu + # 停止camera + camera_stop(CAM_DEV_ID_0) + # 释放显示资源 + display_deinit() + # 释放kpu资源 + fd_kpu_deinit() + feg_kpu_deinit() + global current_kmodel_obj + del current_kmodel_obj + del kpu_face_detect + del kpu_eye_gaze + # 垃圾回收 gc.collect() time.sleep(1) - ret = media_deinit() # 释放 整个media + # 释放媒体资源 + ret = media_deinit() if ret: - print("licence_det, buffer_deinit failed") + print("eye_gaze_test, buffer_deinit failed") return ret - print("licence_det end") + print("eye_gaze_test end") return 0 if __name__ == '__main__': - licence_det_inference() + eye_gaze_inference() ``` -### 6. 石头剪刀布 +### 12.动态手势识别 ```python -import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 -import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 -from media.camera import * #摄像头模块 -from media.display import * #显示模块 -from media.media import * #软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 -from random import randint #随机整数生成 -import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 -import time #时间统计 -import gc #垃圾回收模块 -import aicube #aicube模块,封装ai cube 相关后处理 +import aicube #aicube模块,封装检测分割等任务相关后处理 +from media.camera import * #摄像头模块 +from media.display import * #显示模块 +from media.media import * #软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 + +import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 + +import time #时间统计 +import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 + +import gc #垃圾回收模块 ##config.py #display分辨率 DISPLAY_WIDTH = ALIGN_UP(1920, 16) DISPLAY_HEIGHT = 1080 -#ai原图分辨率输入 +##ai原图分辨率输入 OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) -OUT_RGB888P_HEIGH = 1080 +OUT_RGB888P_HEIGHT = 1080 -#手掌检测 和 手掌关键点检测 kmodel输入shape -hd_kmodel_input_shape = (1,3,512,512) -hk_kmodel_input_shape = (1,3,256,256) +root_dir = '/sdcard/app/tests/' -#手掌检测 相关参数设置 -confidence_threshold = 0.2 #手掌检测 分数阈值 -nms_threshold = 0.5 #非极大值抑制 阈值 -hd_kmodel_frame_size = [512,512] #手掌检测kmodel输入 w h -hd_frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH] #手掌检测原始输入图像 w h -strides = [8,16,32] #手掌检测模型 下采样输出倍数 -num_classes = 1 #检测类别数, 及手掌一种 -nms_option = False #控制最大值抑制的方式 False 类内 True 类间 -labels = ["hand"] #标签名称 -anchors = [26,27,53,52,75,71,80,99,106,82,99,134,140,113,161,172,245,276] #手掌检测模型 锚框 -#手掌关键点检测 相关参数 -hk_kmodel_frame_size = [256,256] #手掌关键点检测 kmodel 输入 w h +#--------for hand detection---------- +#kmodel输入shape +hd_kmodel_input_shape = (1,3,512,512) # 手掌检测kmodel输入分辨率 -# kmodel 路径 -root_dir = '/sdcard/app/tests/' -hd_kmodel_file = root_dir + 'kmodel/hand_det.kmodel' #手掌检测kmodel路径 -hk_kmodel_file = root_dir + 'kmodel/handkp_det.kmodel' #手掌关键点kmodel路径 -debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) +#kmodel相关参数设置 +confidence_threshold = 0.2 # 手掌检测阈值,用于过滤roi +nms_threshold = 0.5 # 手掌检测框阈值,用于过滤重复roi +hd_kmodel_frame_size = [512,512] # 手掌检测输入图片尺寸 +hd_frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGHT] # 手掌检测直接输入图片尺寸 +strides = [8,16,32] # 输出特征图的尺寸与输入图片尺寸的比 +num_classes = 1 # 手掌检测模型输出类别数 +nms_option = False # 是否所有检测框一起做NMS,False则按照不同的类分别应用NMS + +hd_kmodel_file = root_dir + 'kmodel/hand_det.kmodel' # 手掌检测kmodel文件的路径 +anchors = [26,27, 53,52, 75,71, 80,99, 106,82, 99,134, 140,113, 161,172, 245,276] #anchor设置 -# 猜拳模式 0 玩家稳赢 , 1 玩家必输 , n > 2 多局多胜 -guess_mode = 3 +#--------for hand keypoint detection---------- +#kmodel输入shape +hk_kmodel_input_shape = (1,3,256,256) # 手掌关键点检测kmodel输入分辨率 -# 读取石头剪刀布的bin文件方法 -def read_file(file_name): - image_arr = np.fromfile(file_name,dtype=np.uint8) - image_arr = image_arr.reshape((400,400,4)) - return image_arr -# 石头剪刀布的 array -five_image = read_file(root_dir + "utils/five.bin") -fist_image = read_file(root_dir + "utils/fist.bin") -shear_image = read_file(root_dir + "utils/shear.bin") +#kmodel相关参数设置 +hk_kmodel_frame_size = [256,256] # 手掌关键点检测输入图片尺寸 +hk_kmodel_file = root_dir + 'kmodel/handkp_det.kmodel' # 手掌关键点检测kmodel文件的路径 +#--------for hand gesture---------- +#kmodel输入shape +gesture_kmodel_input_shape = [[1, 3, 224, 224], # 动态手势识别kmodel输入分辨率 + [1,3,56,56], + [1,4,28,28], + [1,4,28,28], + [1,8,14,14], + [1,8,14,14], + [1,8,14,14], + [1,12,14,14], + [1,12,14,14], + [1,20,7,7], + [1,20,7,7]] + +#kmodel相关参数设置 +resize_shape = 256 +mean_values = np.array([0.485, 0.456, 0.406]).reshape((3,1,1)) # 动态手势识别预处理均值 +std_values = np.array([0.229, 0.224, 0.225]).reshape((3,1,1)) # 动态手势识别预处理方差 +gesture_kmodel_frame_size = [224,224] # 动态手势识别输入图片尺寸 + +gesture_kmodel_file = root_dir + 'kmodel/gesture.kmodel' # 动态手势识别kmodel文件的路径 + +shang_bin = root_dir + "utils/shang.bin" # 动态手势识别屏幕坐上角标志状态文件的路径 +xia_bin = root_dir + "utils/xia.bin" # 动态手势识别屏幕坐上角标志状态文件的路径 +zuo_bin = root_dir + "utils/zuo.bin" # 动态手势识别屏幕坐上角标志状态文件的路径 +you_bin = root_dir + "utils/you.bin" # 动态手势识别屏幕坐上角标志状态文件的路径 + +bin_width = 150 # 动态手势识别屏幕坐上角标志状态文件的短边尺寸 +bin_height = 216 # 动态手势识别屏幕坐上角标志状态文件的长边尺寸 +shang_argb = np.fromfile(shang_bin, dtype=np.uint8) +shang_argb = shang_argb.reshape((bin_height, bin_width, 4)) +xia_argb = np.fromfile(xia_bin, dtype=np.uint8) +xia_argb = xia_argb.reshape((bin_height, bin_width, 4)) +zuo_argb = np.fromfile(zuo_bin, dtype=np.uint8) +zuo_argb = zuo_argb.reshape((bin_width, bin_height, 4)) +you_argb = np.fromfile(you_bin, dtype=np.uint8) +you_argb = you_argb.reshape((bin_width, bin_height, 4)) + +TRIGGER = 0 # 动态手势识别应用的结果状态 +MIDDLE = 1 +UP = 2 +DOWN = 3 +LEFT = 4 +RIGHT = 5 + +max_hist_len = 20 # 最多存储多少帧的结果 + +debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) #scoped_timing.py 用于debug模式输出程序块运行时间 class ScopedTiming: @@ -7316,19 +10871,22 @@ class ScopedTiming: print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") #ai_utils.py -global current_kmodel_obj # 定义全局的 kpu 对象 -global hd_ai2d,hd_ai2d_input_tensor,hd_ai2d_output_tensor,hd_ai2d_builder # 定义手掌检测 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder -global hk_ai2d,hk_ai2d_input_tensor,hk_ai2d_output_tensor,hk_ai2d_builder # 定义手掌关键点检测 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder -global counts_guess, player_win, k230_win, sleep_end, set_stop_id # 定义猜拳游戏的参数:猜拳次数、玩家赢次、k230赢次、是否停顿、是狗暂停 +global current_kmodel_obj # 定义全局的 kpu 对象 +global hd_ai2d,hd_ai2d_input_tensor,hd_ai2d_output_tensor,hd_ai2d_builder # 定义手掌检测全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder +global hk_ai2d,hk_ai2d_input_tensor,hk_ai2d_output_tensor,hk_ai2d_builder # 定义手掌关键点检测全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder +global gesture_ai2d_resize, gesture_ai2d_resize_builder, gesture_ai2d_crop, gesture_ai2d_crop_builder # 定义动态手势识别全局 ai2d 对象,以及 builder +global gesture_ai2d_input_tensor, gesture_kpu_input_tensors, gesture_ai2d_middle_output_tensor, gesture_ai2d_output_tensor # 定义动态手势识别全局 ai2d 的输入、输出 -# 手掌检测 ai2d 初始化 +#-------hand detect--------: +# 手掌检测ai2d 初始化 def hd_ai2d_init(): with ScopedTiming("hd_ai2d_init",debug_mode > 0): global hd_ai2d global hd_ai2d_builder + global hd_ai2d_output_tensor # 计算padding值 ori_w = OUT_RGB888P_WIDTH - ori_h = OUT_RGB888P_HEIGH + ori_h = OUT_RGB888P_HEIGHT width = hd_kmodel_frame_size[0] height = hd_kmodel_frame_size[1] ratiow = float(width) / ori_w @@ -7346,23 +10904,21 @@ def hd_ai2d_init(): left = int(round(dw - 0.1)) right = int(round(dw - 0.1)) - # init kpu and load kmodel hd_ai2d = nn.ai2d() hd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) hd_ai2d.set_pad_param(True, [0,0,0,0,top,bottom,left,right], 0, [114,114,114]) hd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) - hd_ai2d_builder = hd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], [1,3,height,width]) + hd_ai2d_builder = hd_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,height,width]) - global hd_ai2d_output_tensor data = np.ones(hd_kmodel_input_shape, dtype=np.uint8) hd_ai2d_output_tensor = nn.from_numpy(data) # 手掌检测 ai2d 运行 def hd_ai2d_run(rgb888p_img): with ScopedTiming("hd_ai2d_run",debug_mode > 0): - global hd_ai2d_input_tensor,hd_ai2d_output_tensor + global hd_ai2d_input_tensor,hd_ai2d_output_tensor, hd_ai2d_builder hd_ai2d_input = rgb888p_img.to_numpy_ref() hd_ai2d_input_tensor = nn.from_numpy(hd_ai2d_input) @@ -7392,7 +10948,7 @@ def hd_kpu_pre_process(rgb888p_img): # set kpu input current_kmodel_obj.set_input_tensor(0, hd_ai2d_output_tensor) -# 手掌检测 kpu 获取 kmodel 输出 +# 手掌检测 kpu 获得 kmodel 输出 def hd_kpu_get_output(): with ScopedTiming("hd_kpu_get_output",debug_mode > 0): global current_kmodel_obj @@ -7410,38 +10966,38 @@ def hd_kpu_get_output(): def hd_kpu_run(kpu_obj,rgb888p_img): global current_kmodel_obj current_kmodel_obj = kpu_obj - # (1) 原始图像预处理,并设置模型输入 + # (1)原图预处理,并设置模型输入 hd_kpu_pre_process(rgb888p_img) - # (2) kpu 运行 + # (2)手掌检测 kpu 运行 with ScopedTiming("hd_kpu_run",debug_mode > 0): current_kmodel_obj.run() - # (3) 释放ai2d资源 + # (3)释放手掌检测 ai2d 资源 hd_ai2d_release() - # (4) 获取kpu输出 + # (4)获取手掌检测 kpu 输出 results = hd_kpu_get_output() - # (5) kpu结果后处理 - dets = aicube.anchorbasedet_post_process( results[0], results[1], results[2], hd_kmodel_frame_size, hd_frame_size, strides, num_classes, confidence_threshold, nms_threshold, anchors, nms_option) - # (6) 返回 手掌检测 结果 + # (5)手掌检测 kpu 结果后处理 + dets = aicube.anchorbasedet_post_process( results[0], results[1], results[2], hd_kmodel_frame_size, hd_frame_size, strides, num_classes, confidence_threshold, nms_threshold, anchors, nms_option) # kpu结果后处理 + # (6)返回手掌检测结果 return dets # 手掌检测 kpu 释放内存 def hd_kpu_deinit(kpu_obj): with ScopedTiming("hd_kpu_deinit",debug_mode > 0): - global hd_ai2d,hd_ai2d_output_tensor + global hd_ai2d, hd_ai2d_output_tensor, hd_ai2d_builder del kpu_obj del hd_ai2d del hd_ai2d_output_tensor + del hd_ai2d_builder +#-------hand keypoint detection------: # 手掌关键点检测 ai2d 初始化 def hk_ai2d_init(): with ScopedTiming("hk_ai2d_init",debug_mode > 0): - global hk_ai2d + global hk_ai2d, hk_ai2d_output_tensor hk_ai2d = nn.ai2d() hk_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) - - global hk_ai2d_output_tensor data = np.ones(hk_kmodel_input_shape, dtype=np.uint8) hk_ai2d_output_tensor = nn.from_numpy(data) @@ -7456,14 +11012,15 @@ def hk_ai2d_run(rgb888p_img, x, y, w, h): hk_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) global hk_ai2d_builder - hk_ai2d_builder = hk_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], [1,3,hk_kmodel_frame_size[1],hk_kmodel_frame_size[0]]) + hk_ai2d_builder = hk_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,hk_kmodel_frame_size[1],hk_kmodel_frame_size[0]]) hk_ai2d_builder.run(hk_ai2d_input_tensor, hk_ai2d_output_tensor) # 手掌关键点检测 ai2d 释放内存 def hk_ai2d_release(): with ScopedTiming("hk_ai2d_release",debug_mode > 0): - global hk_ai2d_input_tensor + global hk_ai2d_input_tensor, hk_ai2d_builder del hk_ai2d_input_tensor + del hk_ai2d_builder # 手掌关键点检测 kpu 初始化 def hk_kpu_init(hk_kmodel_file): @@ -7498,10 +11055,9 @@ def hk_kpu_get_output(): results.append(tmp2) return results -# 手掌关键点检测 接收kmodel结果的后处理 +# 手掌关键点检测 kpu 输出后处理 def hk_kpu_post_process(results, x, y, w, h): results_show = np.zeros(results.shape,dtype=np.int16) - # results_show = np.zeros(len(results),dtype=np.int16) results_show[0::2] = results[0::2] * w + x results_show[1::2] = results[1::2] * h + y return results_show @@ -7510,110 +11066,250 @@ def hk_kpu_post_process(results, x, y, w, h): def hk_kpu_run(kpu_obj,rgb888p_img, x, y, w, h): global current_kmodel_obj current_kmodel_obj = kpu_obj - # (1) 原图预处理,并设置模型输入 + # (1)原图预处理,并设置模型输入 hk_kpu_pre_process(rgb888p_img, x, y, w, h) - # (2) kpu 运行 + # (2)手掌关键点检测 kpu 运行 with ScopedTiming("hk_kpu_run",debug_mode > 0): current_kmodel_obj.run() - # (3) 释放ai2d资源 + # (3)释放手掌关键点检测 ai2d 资源 hk_ai2d_release() - # (4) 获取kpu输出 + # (4)获取手掌关键点检测 kpu 输出 results = hk_kpu_get_output() - # (5) kpu结果后处理 + # (5)手掌关键点检测 kpu 结果后处理 result = hk_kpu_post_process(results[0],x,y,w,h) - # (6) 返回 关键点检测 结果 + # (6)返回手掌关键点检测结果 return result # 手掌关键点检测 kpu 释放内存 def hk_kpu_deinit(kpu_obj): with ScopedTiming("hk_kpu_deinit",debug_mode > 0): - global hk_ai2d,hk_ai2d_output_tensor + global hk_ai2d, hk_ai2d_output_tensor del kpu_obj del hk_ai2d del hk_ai2d_output_tensor -# 手掌关键点检测 计算角度 +# 求两个vector之间的夹角 def hk_vector_2d_angle(v1,v2): - v1_x = v1[0] - v1_y = v1[1] - v2_x = v2[0] - v2_y = v2[1] - v1_norm = np.sqrt(v1_x * v1_x+ v1_y * v1_y) - v2_norm = np.sqrt(v2_x * v2_x + v2_y * v2_y) - dot_product = v1_x * v2_x + v1_y * v2_y - cos_angle = dot_product/(v1_norm*v2_norm) - angle = np.acos(cos_angle)*180/np.pi - # if (angle>180): - # return 65536 - return angle - -# 利用手掌关键点检测的结果 判断手掌手势 -def hk_gesture(kpu_hand_keypoint_detect,rgb888p_img,det_box): - x1, y1, x2, y2 = det_box[2],det_box[3],det_box[4],det_box[5] - w = int(float(x2 - x1) * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - h = int(float(y2 - y1) * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) + with ScopedTiming("hk_vector_2d_angle",debug_mode > 0): + v1_x = v1[0] + v1_y = v1[1] + v2_x = v2[0] + v2_y = v2[1] + v1_norm = np.sqrt(v1_x * v1_x+ v1_y * v1_y) + v2_norm = np.sqrt(v2_x * v2_x + v2_y * v2_y) + dot_product = v1_x * v2_x + v1_y * v2_y + cos_angle = dot_product/(v1_norm*v2_norm) + angle = np.acos(cos_angle)*180/np.pi + return angle + +# 根据手掌关键点检测结果判断手势类别 +def hk_gesture(results): + with ScopedTiming("hk_gesture",debug_mode > 0): + angle_list = [] + for i in range(5): + angle = hk_vector_2d_angle([(results[0]-results[i*8+4]), (results[1]-results[i*8+5])],[(results[i*8+6]-results[i*8+8]),(results[i*8+7]-results[i*8+9])]) + angle_list.append(angle) + + thr_angle = 65. + thr_angle_thumb = 53. + thr_angle_s = 49. + gesture_str = None + if 65535. not in angle_list: + if (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "fist" + elif (angle_list[0]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "gun" + elif (angle_list[0]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]5) and (angle_list[1]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "one" + elif (angle_list[0]thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]thr_angle_thumb) and (angle_list[1]thr_angle): + gesture_str = "three" + elif (angle_list[0]thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "thumbUp" + elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "yeah" + + return gesture_str + +#-------dynamic gesture--------: +# 动态手势识别 ai2d 初始化 +def gesture_ai2d_init(kpu_obj, resize_shape): + with ScopedTiming("gesture_ai2d_init",debug_mode > 0): + global gesture_ai2d_resize, gesture_ai2d_resize_builder + global gesture_ai2d_crop, gesture_ai2d_crop_builder + global gesture_ai2d_middle_output_tensor, gesture_ai2d_output_tensor - x1 = int(x1 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - y1 = int(y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) - x2 = int(x2 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - y2 = int(y2 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) - - if (h<(0.1*DISPLAY_HEIGHT)): - return - if (w<(0.25*DISPLAY_WIDTH) and ((x1<(0.03*DISPLAY_WIDTH)) or (x2>(0.97*DISPLAY_WIDTH)))): - return - if (w<(0.15*DISPLAY_WIDTH) and ((x1<(0.01*DISPLAY_WIDTH)) or (x2>(0.99*DISPLAY_WIDTH)))): - return - - length = max(w,h)/2 - cx = (x1+x2)/2 - cy = (y1+y2)/2 - ratio_num = 1.26*length - - x1_kp = int(max(0,cx-ratio_num)) - y1_kp = int(max(0,cy-ratio_num)) - x2_kp = int(min(DISPLAY_WIDTH-1, cx+ratio_num)) - y2_kp = int(min(DISPLAY_HEIGHT-1, cy+ratio_num)) - w_kp = int(x2_kp - x1_kp + 1) - h_kp = int(y2_kp - y1_kp + 1) - - results = hk_kpu_run(kpu_hand_keypoint_detect,rgb888p_img, x1_kp, y1_kp, w_kp, h_kp) - - angle_list = [] - for i in range(5): - angle = hk_vector_2d_angle([(results[0]-results[i*8+4]), (results[1]-results[i*8+5])],[(results[i*8+6]-results[i*8+8]),(results[i*8+7]-results[i*8+9])]) - angle_list.append(angle) + ori_w = OUT_RGB888P_WIDTH + ori_h = OUT_RGB888P_HEIGHT + width = gesture_kmodel_frame_size[0] + height = gesture_kmodel_frame_size[1] + ratiow = float(resize_shape) / ori_w + ratioh = float(resize_shape) / ori_h + if ratiow < ratioh: + ratio = ratioh + else: + ratio = ratiow + new_w = int(ratio * ori_w) + new_h = int(ratio * ori_h) - thr_angle = 65. - thr_angle_thumb = 53. - thr_angle_s = 49. - gesture_str = None - if 65535. not in angle_list: - if (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): - gesture_str = "fist" - elif (angle_list[0]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): - gesture_str = "gun" - elif (angle_list[0]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]5) and (angle_list[1]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): - gesture_str = "one" - elif (angle_list[0]thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]thr_angle_thumb) and (angle_list[1]thr_angle): - gesture_str = "three" - elif (angle_list[0]thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): - gesture_str = "thumbUp" - elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]thr_angle) and (angle_list[4]>thr_angle): - gesture_str = "yeah" + top = int((new_h-height)/2) + left = int((new_w-width)/2) + + gesture_ai2d_resize = nn.ai2d() + gesture_ai2d_resize.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) + gesture_ai2d_resize.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + gesture_ai2d_resize_builder = gesture_ai2d_resize.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,new_h,new_w]) + + gesture_ai2d_crop = nn.ai2d() + gesture_ai2d_crop.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) + gesture_ai2d_crop.set_crop_param(True, left, top, width, height) + gesture_ai2d_crop_builder = gesture_ai2d_crop.build([1,3,new_h,new_w], [1,3,height,width]) + + global gesture_kpu_input_tensor, gesture_kpu_input_tensors, current_kmodel_obj + current_kmodel_obj = kpu_obj + gesture_kpu_input_tensors = [] + for i in range(current_kmodel_obj.inputs_size()): + data = np.zeros(gesture_kmodel_input_shape[i], dtype=np.float) + gesture_kpu_input_tensor = nn.from_numpy(data) + gesture_kpu_input_tensors.append(gesture_kpu_input_tensor) + + data = np.ones(gesture_kmodel_input_shape[0], dtype=np.uint8) + gesture_ai2d_output_tensor = nn.from_numpy(data) + + global data_float + data_float = np.ones(gesture_kmodel_input_shape[0], dtype=np.float) + + data_middle = np.ones((1,3,new_h,new_w), dtype=np.uint8) + gesture_ai2d_middle_output_tensor = nn.from_numpy(data_middle) + +def gesture_ai2d_run(rgb888p_img): + with ScopedTiming("gesture_ai2d_run",debug_mode > 0): + global gesture_ai2d_input_tensor, gesture_kpu_input_tensors, gesture_ai2d_middle_output_tensor, gesture_ai2d_output_tensor + global gesture_ai2d_resize_builder, gesture_ai2d_crop_builder + + gesture_ai2d_input = rgb888p_img.to_numpy_ref() + gesture_ai2d_input_tensor = nn.from_numpy(gesture_ai2d_input) + + gesture_ai2d_resize_builder.run(gesture_ai2d_input_tensor, gesture_ai2d_middle_output_tensor) + gesture_ai2d_crop_builder.run(gesture_ai2d_middle_output_tensor, gesture_ai2d_output_tensor) + + result = gesture_ai2d_output_tensor.to_numpy() + global data_float + data_float[0] = result[0].copy() + data_float[0] = (data_float[0]*1.0/255 -mean_values)/std_values + tmp = nn.from_numpy(data_float) + gesture_kpu_input_tensors[0] = tmp + +# 动态手势识别 ai2d 释放内存 +def gesture_ai2d_release(): + with ScopedTiming("gesture_ai2d_release",debug_mode > 0): + global gesture_ai2d_input_tensor + del gesture_ai2d_input_tensor + +# 动态手势识别 kpu 初始化 +def gesture_kpu_init(gesture_kmodel_file): + # init kpu and load kmodel + with ScopedTiming("gesture_kpu_init",debug_mode > 0): + gesture_kpu_obj = nn.kpu() + gesture_kpu_obj.load_kmodel(gesture_kmodel_file) + gesture_ai2d_init(gesture_kpu_obj, resize_shape) + return gesture_kpu_obj + +# 动态手势识别 kpu 输入预处理 +def gesture_kpu_pre_process(rgb888p_img): + gesture_ai2d_run(rgb888p_img) + with ScopedTiming("gesture_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,gesture_kpu_input_tensors + # set kpu input + for i in range(current_kmodel_obj.inputs_size()): + current_kmodel_obj.set_input_tensor(i, gesture_kpu_input_tensors[i]) - return gesture_str +# 动态手势识别 kpu 获得 kmodel 输出 +def gesture_kpu_get_output(): + with ScopedTiming("gesture_kpu_get_output",debug_mode > 0): + global current_kmodel_obj, gesture_kpu_input_tensors + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + if (i==0): + result = data.to_numpy() + tmp2 = result.copy() + else: + gesture_kpu_input_tensors[i] = data + return tmp2 + +# 动态手势识别结果处理 +def gesture_process_output(pred,history): + if (pred == 7 or pred == 8 or pred == 21 or pred == 22 or pred == 3 ): + pred = history[-1] + if (pred == 0 or pred == 4 or pred == 6 or pred == 9 or pred == 14 or pred == 1 or pred == 19 or pred == 20 or pred == 23 or pred == 24) : + pred = history[-1] + if (pred == 0) : + pred = 2 + if (pred != history[-1]) : + if (len(history)>= 2) : + if (history[-1] != history[len(history)-2]) : + pred = history[-1] + history.append(pred) + if (len(history) > max_hist_len) : + history = history[-max_hist_len:] + return history[-1] + +# 动态手势识别结果后处理 +def gesture_kpu_post_process(results, his_logit, history): + with ScopedTiming("gesture_kpu_post_process",debug_mode > 0): + his_logit.append(results[0]) + avg_logit = sum(np.array(his_logit)) + idx_ = np.argmax(avg_logit) + + idx = gesture_process_output(idx_, history) + if (idx_ != idx): + his_logit_last = his_logit[-1] + his_logit = [] + his_logit.append(his_logit_last) + return idx, avg_logit + +# 动态手势识别 kpu 运行 +def gesture_kpu_run(kpu_obj,rgb888p_img, his_logit, history): + global current_kmodel_obj + current_kmodel_obj = kpu_obj + # (1)原图预处理,并设置模型输入 + gesture_kpu_pre_process(rgb888p_img) + # (2)动态手势识别 kpu 运行 + with ScopedTiming("gesture_kpu_run",debug_mode > 0): + current_kmodel_obj.run() + # (3)释放动态手势识别 ai2d 资源 + gesture_ai2d_release() + # (4)获取动态手势识别 kpu 输出 + results = gesture_kpu_get_output() + # (5)动态手势识别 kpu 结果后处理 + result, avg_logit= gesture_kpu_post_process(results,his_logit, history) + # (6)返回动态手势识别结果 + return result, avg_logit + +def gesture_kpu_deinit(kpu_obj): + with ScopedTiming("gesture_kpu_deinit",debug_mode > 0): + global gesture_ai2d_resize, gesture_ai2d_middle_output_tensor + global gesture_ai2d_crop, gesture_ai2d_output_tensor + global gesture_kpu_input_tensors + global gesture_ai2d_resize_builder, gesture_ai2d_crop_builder + del kpu_obj + del gesture_ai2d_resize + del gesture_ai2d_middle_output_tensor + del gesture_ai2d_crop + del gesture_ai2d_output_tensor + del gesture_kpu_input_tensors + del gesture_ai2d_resize_builder + del gesture_ai2d_crop_builder -#media_utils.py -global draw_img,osd_img,masks #for display 定义全局 作图image对象 -global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 +#media_utils.py +global draw_img,osd_img,draw_numpy #for display 定义全局 作图image对象 +global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 #for display 初始化 def display_init(): @@ -7634,7 +11330,7 @@ def camera_init(dev_id): camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) # set chn2 output rgb88planar - camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) # camera 开启 @@ -7675,11 +11371,11 @@ def media_init(): ret = media.buffer_init() if ret: return ret - global buffer, draw_img, osd_img, masks + global buffer, draw_img, osd_img, draw_numpy buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) # 图层1,用于画框 - masks = np.zeros((OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH,4),dtype=np.uint8) - draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888,alloc=image.ALLOC_REF,data=masks) + draw_numpy = np.zeros((DISPLAY_HEIGHT, DISPLAY_WIDTH,4), dtype=np.uint8) + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_REF,data=draw_numpy) # 图层2,用于拷贝画框结果,防止画框过程中发生buffer搬运 osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) @@ -7694,132 +11390,205 @@ def media_deinit(): ret = media.buffer_deinit() return ret +#**********for dynamic_gesture.py********** +def dynamic_gesture_inference(): + print("dynamic_gesture_test start") + cur_state = TRIGGER + pre_state = TRIGGER + draw_state = TRIGGER -#**********for finger_guessing.py********** -def finger_guessing_inference(): - print("finger_guessing_test start") - kpu_hand_detect = hd_kpu_init(hd_kmodel_file) # 创建手掌检测的 kpu 对象 - kpu_hand_keypoint_detect = hk_kpu_init(hk_kmodel_file) # 创建手掌关键点检测的 kpu 对象 - camera_init(CAM_DEV_ID_0) # 初始化 camera - display_init() # 初始化 display + kpu_hand_detect = hd_kpu_init(hd_kmodel_file) # 创建手掌检测的 kpu 对象 + kpu_hand_keypoint_detect = hk_kpu_init(hk_kmodel_file) # 创建手掌关键点检测的 kpu 对象 + kpu_dynamic_gesture = gesture_kpu_init(gesture_kmodel_file) # 创建动态手势识别的 kpu 对象 + camera_init(CAM_DEV_ID_0) # 初始化 camera + display_init() # 初始化 display rgb888p_img = None try: ret = media_init() if ret: - print("finger_guessing, buffer init failed") + print("dynamic_gesture, buffer init failed") return ret - camera_start(CAM_DEV_ID_0) # 开启 camera - counts_guess = -1 # 猜拳次数 计数 - player_win = 0 # 玩家 赢次计数 - k230_win = 0 # k230 赢次计数 - sleep_end = False # 是否 停顿 - set_stop_id = True # 是否 暂停猜拳 - LIBRARY = ["fist","yeah","five"] # 猜拳 石头剪刀布 三种方案的dict + camera_start(CAM_DEV_ID_0) + vec_flag = [] + his_logit = [] + history = [2] + s_start = time.time_ns() + count = 0 while True: with ScopedTiming("total",1): - rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图像 + rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 if rgb888p_img == -1: - print("finger_guessing, capture_image failed") + print("dynamic_gesture, capture_image failed") camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None continue # for rgb888planar if rgb888p_img.format() == image.RGBP888: - with ScopedTiming("trigger time", debug_mode > 0): - dets = hd_kpu_run(kpu_hand_detect,rgb888p_img) # 执行手掌检测 kpu 运行 以及 后处理过程 - gesture = "" - draw_img.clear() - for det_box in dets: - gesture = hk_gesture(kpu_hand_keypoint_detect,rgb888p_img,det_box) # 执行手掌关键点检测 kpu 运行 以及 后处理过程 得到手势类型 - if (len(dets) >= 2): - draw_img.draw_string( 300 , 500, "Must have one hand !", color=(255,255,0,0), scale=7) - draw_img.copy_to(osd_img) - elif (guess_mode == 0): - if (gesture == "fist"): - masks[:400,:400,:] = shear_image - elif (gesture == "five"): - masks[:400,:400,:] = fist_image - elif (gesture == "yeah"): - masks[:400,:400,:] = five_image - draw_img.copy_to(osd_img) - elif (guess_mode == 1): - if (gesture == "fist"): - masks[:400,:400,:] = five_image - elif (gesture == "five"): - masks[:400,:400,:] = shear_image - elif (gesture == "yeah"): - masks[:400,:400,:] = fist_image - draw_img.copy_to(osd_img) - else: - if (sleep_end): - time.sleep_ms(2000) - sleep_end = False - if (len(dets) == 0): - set_stop_id = True - if (counts_guess == -1 and gesture != "fist" and gesture != "yeah" and gesture != "five"): - draw_img.draw_string( 400 , 450, "G A M E S T A R T", color=(255,255,0,0), scale=7) - draw_img.draw_string( 400 , 550, " 1 S E T ", color=(255,255,0,0), scale=7) - draw_img.copy_to(osd_img) - elif (counts_guess == guess_mode): - draw_img.clear() - if (k230_win > player_win): - draw_img.draw_string( 400 , 450, "Y O U L O S E", color=(255,255,0,0), scale=7) - elif (k230_win < player_win): - draw_img.draw_string( 400 , 450, "Y O U W I N", color=(255,255,0,0), scale=7) + draw_img.clear() + if (cur_state == TRIGGER): + with ScopedTiming("trigger time", debug_mode > 0): + dets = hd_kpu_run(kpu_hand_detect,rgb888p_img) # 执行手掌检测 kpu 运行 以及 后处理过程 + + for det_box in dets: + x1, y1, x2, y2 = int(det_box[2]),int(det_box[3]),int(det_box[4]),int(det_box[5]) + w = int(x2 - x1) + h = int(y2 - y1) + + if (h<(0.1*OUT_RGB888P_HEIGHT)): + continue + if (w<(0.25*OUT_RGB888P_WIDTH) and ((x1<(0.03*OUT_RGB888P_WIDTH)) or (x2>(0.97*OUT_RGB888P_WIDTH)))): + continue + if (w<(0.15*OUT_RGB888P_WIDTH) and ((x1<(0.01*OUT_RGB888P_WIDTH)) or (x2>(0.99*OUT_RGB888P_WIDTH)))): + continue + + length = max(w,h)/2 + cx = (x1+x2)/2 + cy = (y1+y2)/2 + ratio_num = 1.26*length + + x1_kp = int(max(0,cx-ratio_num)) + y1_kp = int(max(0,cy-ratio_num)) + x2_kp = int(min(OUT_RGB888P_WIDTH-1, cx+ratio_num)) + y2_kp = int(min(OUT_RGB888P_HEIGHT-1, cy+ratio_num)) + w_kp = int(x2_kp - x1_kp + 1) + h_kp = int(y2_kp - y1_kp + 1) + + hk_results = hk_kpu_run(kpu_hand_keypoint_detect,rgb888p_img, x1_kp, y1_kp, w_kp, h_kp) # 执行手掌关键点检测 kpu 运行 以及 后处理过程 + gesture = hk_gesture(hk_results) # 根据关键点检测结果判断手势类别 + + if ((gesture == "five") or (gesture == "yeah")): + v_x = hk_results[24]-hk_results[0] + v_y = hk_results[25]-hk_results[1] + angle = hk_vector_2d_angle([v_x,v_y],[1.0,0.0]) # 计算手指(中指)的朝向 + + if (v_y>0): + angle = 360-angle + + if ((70.0<=angle) and (angle<110.0)): # 手指向上 + if ((pre_state != UP) or (pre_state != MIDDLE)): + vec_flag.append(pre_state) + if ((len(vec_flag)>10)or(pre_state == UP) or (pre_state == MIDDLE) or(pre_state == TRIGGER)): + draw_numpy[:bin_height,:bin_width,:] = shang_argb + cur_state = UP + + elif ((110.0<=angle) and (angle<225.0)): # 手指向右(实际方向) + if (pre_state != RIGHT): + vec_flag.append(pre_state) + if ((len(vec_flag)>10)or(pre_state == RIGHT)or(pre_state == TRIGGER)): + draw_numpy[:bin_width,:bin_height,:] = you_argb + cur_state = RIGHT + + elif((225.0<=angle) and (angle<315.0)): # 手指向下 + if (pre_state != DOWN): + vec_flag.append(pre_state) + if ((len(vec_flag)>10)or(pre_state == DOWN)or(pre_state == TRIGGER)): + draw_numpy[:bin_height,:bin_width,:] = xia_argb + cur_state = DOWN + + else: # 手指向左(实际方向) + if (pre_state != LEFT): + vec_flag.append(pre_state) + if ((len(vec_flag)>10)or(pre_state == LEFT)or(pre_state == TRIGGER)): + draw_numpy[:bin_width,:bin_height,:] = zuo_argb + cur_state = LEFT + + m_start = time.time_ns() + his_logit = [] + else: + with ScopedTiming("swip time",debug_mode > 0): + idx, avg_logit = gesture_kpu_run(kpu_dynamic_gesture,rgb888p_img, his_logit, history) # 执行动态手势识别 kpu 运行 以及 后处理过程 + if (cur_state == UP): + draw_numpy[:bin_height,:bin_width,:] = shang_argb + if ((idx==15) or (idx==10)): + vec_flag.clear() + if (((avg_logit[idx] >= 0.7) and (len(his_logit) >= 2)) or ((avg_logit[idx] >= 0.3) and (len(his_logit) >= 4))): + s_start = time.time_ns() + cur_state = TRIGGER + draw_state = DOWN + history = [2] + pre_state = UP + elif ((idx==25)or(idx==26)) : + vec_flag.clear() + if (((avg_logit[idx] >= 0.4) and (len(his_logit) >= 2)) or ((avg_logit[idx] >= 0.3) and (len(his_logit) >= 3))): + s_start = time.time_ns() + cur_state = TRIGGER + draw_state = MIDDLE + history = [2] + pre_state = MIDDLE else: - draw_img.draw_string( 400 , 450, "T I E G A M E", color=(255,255,0,0), scale=7) - draw_img.copy_to(osd_img) - counts_guess = -1 - player_win = 0 - k230_win = 0 - - sleep_end = True - else: - if (set_stop_id): - if (counts_guess == -1 and (gesture == "fist" or gesture == "yeah" or gesture == "five")): - counts_guess = 0 - if (counts_guess != -1 and (gesture == "fist" or gesture == "yeah" or gesture == "five")): - k230_guess = randint(1,10000) % 3 - if (gesture == "fist" and LIBRARY[k230_guess] == "yeah"): - player_win += 1 - elif (gesture == "fist" and LIBRARY[k230_guess] == "five"): - k230_win += 1 - if (gesture == "yeah" and LIBRARY[k230_guess] == "fist"): - k230_win += 1 - elif (gesture == "yeah" and LIBRARY[k230_guess] == "five"): - player_win += 1 - if (gesture == "five" and LIBRARY[k230_guess] == "fist"): - player_win += 1 - elif (gesture == "five" and LIBRARY[k230_guess] == "yeah"): - k230_win += 1 - - if (LIBRARY[k230_guess] == "fist"): - masks[:400,:400,:] = fist_image - elif (LIBRARY[k230_guess] == "five"): - masks[:400,:400,:] = five_image - elif (LIBRARY[k230_guess] == "yeah"): - masks[:400,:400,:] = shear_image - - counts_guess += 1; - draw_img.draw_string( 400 , 450, " " + str(counts_guess) + " S E T ", color=(255,255,0,0), scale=7) - draw_img.copy_to(osd_img) - set_stop_id = False - sleep_end = True - - else: - draw_img.draw_string( 400 , 450, " " + str(counts_guess+1) + " S E T ", color=(255,255,0,0), scale=7) - draw_img.copy_to(osd_img) + his_logit.clear() + elif (cur_state == RIGHT): + draw_numpy[:bin_width,:bin_height,:] = you_argb + if ((idx==16)or(idx==11)) : + vec_flag.clear() + if (((avg_logit[idx] >= 0.4) and (len(his_logit) >= 2)) or ((avg_logit[idx] >= 0.3) and (len(his_logit) >= 3))): + s_start = time.time_ns() + cur_state = TRIGGER + draw_state = RIGHT + history = [2] + pre_state = RIGHT else: - draw_img.copy_to(osd_img) - display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) # 将得到的图像 绘制到 display + his_logit.clear() + elif (cur_state == DOWN): + draw_numpy[:bin_height,:bin_width,:] = xia_argb + if ((idx==18)or(idx==13)): + vec_flag.clear() + if (((avg_logit[idx] >= 0.4) and (len(his_logit) >= 2)) or ((avg_logit[idx] >= 0.3) and (len(his_logit) >= 3))): + s_start = time.time_ns() + cur_state = TRIGGER + draw_state = UP + history = [2] + pre_state = DOWN + else: + his_logit.clear() + elif (cur_state == LEFT): + draw_numpy[:bin_width,:bin_height,:] = zuo_argb + if ((idx==17)or(idx==12)): + vec_flag.clear() + if (((avg_logit[idx] >= 0.4) and (len(his_logit) >= 2)) or ((avg_logit[idx] >= 0.3) and (len(his_logit) >= 3))): + s_start = time.time_ns() + cur_state = TRIGGER + draw_state = LEFT + history = [2] + pre_state = LEFT + else: + his_logit.clear() + + elapsed_time = round((time.time_ns() - m_start)/1000000) + + if ((cur_state != TRIGGER) and (elapsed_time>2000)): + cur_state = TRIGGER + pre_state = TRIGGER + + elapsed_ms_show = round((time.time_ns()-s_start)/1000000) + if (elapsed_ms_show<1000): + if (draw_state == UP): + draw_img.draw_arrow(1068,330,1068,130, (255,170,190,230), thickness=13) # 判断为向上挥动时,画一个向上的箭头 + elif (draw_state == RIGHT): + draw_img.draw_arrow(1290,540,1536,540, (255,170,190,230), thickness=13) # 判断为向右挥动时,画一个向右的箭头 + elif (draw_state == DOWN): + draw_img.draw_arrow(1068,750,1068,950, (255,170,190,230), thickness=13) # 判断为向下挥动时,画一个向下的箭头 + elif (draw_state == LEFT): + draw_img.draw_arrow(846,540,600,540, (255,170,190,230), thickness=13) # 判断为向左挥动时,画一个向左的箭头 + elif (draw_state == MIDDLE): + draw_img.draw_circle(1068,540,100, (255,170,190,230), thickness=2, fill=True) # 判断为五指捏合手势时,画一个实心圆 + else: + draw_state = TRIGGER - camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图形 + camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - gc.collect() + if (count>5): + gc.collect() + count = 0 + else: + count += 1 + + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) except Exception as e: print(f"An error occurred during buffer used: {e}") finally: @@ -7827,25 +11596,26 @@ def finger_guessing_inference(): #先release掉申请的内存再stop camera_release_image(CAM_DEV_ID_0,rgb888p_img) - camera_stop(CAM_DEV_ID_0) # 停止 camera - display_deinit() # 停止 display - hd_kpu_deinit(kpu_hand_detect) # 释放手掌检测 kpu - hk_kpu_deinit(kpu_hand_keypoint_detect) # 释放手掌关键点检测 kpu + camera_stop(CAM_DEV_ID_0) # 停止 camera + display_deinit() # 释放 display + hd_kpu_deinit(kpu_hand_detect) # 释放手掌检测 kpu + hk_kpu_deinit(kpu_hand_keypoint_detect) # 释放手掌关键点检测 kpu + gesture_kpu_deinit(kpu_dynamic_gesture) # 释放动态手势识别 kpu gc.collect() - ret = media_deinit() # 释放 整个 media + ret = media_deinit() # 释放 整个media if ret: - print("finger_guessing, buffer_deinit failed") + print("dynamic_gesture, buffer_deinit failed") return ret - print("finger_guessing_test end") + print("dynamic_gesture_test end") return 0 if __name__ == '__main__': - finger_guessing_inference() + dynamic_gesture_inference() ``` -### 7. OCR识别 +### 13.单目标跟踪 ```python import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 @@ -7856,39 +11626,42 @@ from media.media import * #软件抽象模块,主要封装媒体数 import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 import time #时间统计 import gc #垃圾回收模块 -import aicube #aicube模块,封装检测分割等任务相关后处理 +import aidemo #aidemo模块,封装ai demo相关后处理、画图操作 -# display分辨率 +##config.py +#display分辨率 DISPLAY_WIDTH = ALIGN_UP(1920, 16) DISPLAY_HEIGHT = 1080 -# ai原图分辨率输入 -OUT_RGB888P_WIDTH = ALIGN_UP(640, 16) -OUT_RGB888P_HEIGH = 360 +#ai原图分辨率输入 +OUT_RGB888P_WIDTH = ALIGN_UP(1280, 16) +OUT_RGB888P_HEIGHT = 720 -#kmodel输入参数设置 -kmodel_input_shape_det = (1,3,640,640) # OCR检测模型的kmodel输入分辨率 -kmodel_input_shape_rec = (1,3,32,512) # OCR识别模型的kmodel输入分辨率 -rgb_mean = [0,0,0] # ai2d padding的值 +#单目标跟踪 kmodel 输入 shape +crop_kmodel_input_shape = (1,3,127,127) +src_kmodel_input_shape = (1,3,255,255) + + +#单目标跟踪 相关参数设置 +head_thresh = 0.1 #单目标跟踪分数阈值 +CONTEXT_AMOUNT = 0.5 #跟踪框宽、高调整系数 +rgb_mean = [114,114,114] #padding颜色值 +ratio_src_crop = float(src_kmodel_input_shape[2])/float(crop_kmodel_input_shape[2]) #src模型和crop模型输入比值 +track_x1 = float(300) #起始跟踪目标框左上角点x +track_y1 = float(300) #起始跟踪目标框左上角点y +track_w = float(100) #起始跟踪目标框w +track_h = float(100) #起始跟踪目标框h -#检测步骤kmodel相关参数设置 -mask_threshold = 0.25 # 二值化mask阈值 -box_threshold = 0.3 # 检测框分数阈值 #文件配置 root_dir = '/sdcard/app/tests/' -kmodel_file_det = root_dir + 'kmodel/ocr_det_int16.kmodel' # 检测模型路径 -kmodel_file_rec = root_dir + "kmodel/ocr_rec_int16.kmodel" # 识别模型路径 -dict_path = root_dir + 'utils/dict.txt' # 调试模式 大于0(调试)、 反之 (不调试) -debug_mode = 0 +crop_kmodel_file = root_dir + 'kmodel/cropped_test127.kmodel' #单目标跟踪 crop kmodel 文件路径 +src_kmodel_file = root_dir + 'kmodel/nanotrack_backbone_sim.kmodel' #单目标跟踪 src kmodel 文件路径 +track_kmodel_file = root_dir + 'kmodel/nanotracker_head_calib_k230.kmodel' #单目标跟踪 head kmodel 文件路径 -# OCR字典读取 -with open(dict_path, 'r') as file: - line_one = file.read(100000) - line_list = line_one.split("\r\n") -DICT = {num: char.replace("\r", "").replace("\n", "") for num, char in enumerate(line_list)} +debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) -# scoped_timing.py 用于debug模式输出程序块运行时间 +#scoped_timing.py 用于debug模式输出程序块运行时间 class ScopedTiming: def __init__(self, info="", enable_profile=True): self.info = info @@ -7901,295 +11674,368 @@ class ScopedTiming: def __exit__(self, exc_type, exc_value, traceback): if self.enable_profile: - elapsed_time = time.time_ns() - self.start_time - print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") - -# utils 设定全局变量 -global current_kmodel_obj # 设置全局kpu对象 -global ai2d_det,ai2d_input_tensor_det,ai2d_output_tensor_det,ai2d_builder_det,ai2d_input_det # 设置检测模型的ai2d对象,并定义ai2d的输入、输出和builder -global ai2d_rec,ai2d_input_tensor_rec,ai2d_output_tensor_rec,ai2d_builder_rec # 设置识别模型的ai2d对象,并定义ai2d的输入、输出和builder - -# padding方法,一边padding,右padding或者下padding -def get_pad_one_side_param(out_img_size,input_img_size): - dst_w = out_img_size[0] - dst_h = out_img_size[1] - - input_width = input_img_size[0] - input_high = input_img_size[1] - - ratio_w = dst_w / input_width - ratio_h = dst_h / input_high - if ratio_w < ratio_h: - ratio = ratio_w - else: - ratio = ratio_h - - new_w = (int)(ratio * input_width) - new_h = (int)(ratio * input_high) - dw = (dst_w - new_w) / 2 - dh = (dst_h - new_h) / 2 - - top = (int)(round(0)) - bottom = (int)(round(dh * 2 + 0.1)) - left = (int)(round(0)) - right = (int)(round(dw * 2 - 0.1)) - return [0, 0, 0, 0, top, bottom, left, right] - -# 检测步骤ai2d初始化 -def ai2d_init_det(): - with ScopedTiming("ai2d_init_det",debug_mode > 0): - global ai2d_det - ai2d_det = nn.ai2d() - ai2d_det.set_dtype(nn.ai2d_format.NCHW_FMT, - nn.ai2d_format.NCHW_FMT, - np.uint8, np.uint8) - ai2d_det.set_pad_param(True, get_pad_one_side_param([kmodel_input_shape_det[3],kmodel_input_shape_det[2]], [OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH]), 0, [0, 0, 0]) - ai2d_det.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) - global ai2d_output_tensor_det - data = np.ones(kmodel_input_shape_det, dtype=np.uint8) - ai2d_output_tensor_det = nn.from_numpy(data) - global ai2d_builder_det - ai2d_builder_det = ai2d_det.build([1, 3, OUT_RGB888P_HEIGH, OUT_RGB888P_WIDTH], [1, 3, kmodel_input_shape_det[2], kmodel_input_shape_det[3]]) - - -# 检测步骤的ai2d 运行,完成ai2d_init_det预设的预处理 -def ai2d_run_det(rgb888p_img): - with ScopedTiming("ai2d_run_det",debug_mode > 0): - global ai2d_input_tensor_det,ai2d_builder_det,ai2d_input_det - ai2d_input_det = rgb888p_img.to_numpy_ref() - ai2d_input_tensor_det = nn.from_numpy(ai2d_input_det) - global ai2d_output_tensor_det - ai2d_builder_det.run(ai2d_input_tensor_det, ai2d_output_tensor_det) - -# 识别步骤ai2d初始化 -def ai2d_init_rec(): - with ScopedTiming("ai2d_init_res",debug_mode > 0): - global ai2d_rec,ai2d_output_tensor_rec - ai2d_rec = nn.ai2d() - ai2d_rec.set_dtype(nn.ai2d_format.RGB_packed, - nn.ai2d_format.NCHW_FMT, - np.uint8, np.uint8) - ai2d_out_data = np.ones((1, 3, kmodel_input_shape_rec[2], kmodel_input_shape_rec[3]), dtype=np.uint8) - ai2d_output_tensor_rec = nn.from_numpy(ai2d_out_data) - - -# 识别步骤ai2d运行 -def ai2d_run_rec(rgb888p_img): - with ScopedTiming("ai2d_run_rec",debug_mode > 0): - global ai2d_rec,ai2d_builder_rec,ai2d_input_tensor_rec,ai2d_output_tensor_rec - ai2d_rec.set_pad_param(True, get_pad_one_side_param([kmodel_input_shape_rec[3],kmodel_input_shape_rec[2]],[rgb888p_img.shape[2],rgb888p_img.shape[1]]), 0, [0, 0, 0]) - ai2d_rec.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) - ai2d_builder_rec = ai2d_rec.build([rgb888p_img.shape[0], rgb888p_img.shape[1], rgb888p_img.shape[2],rgb888p_img.shape[3]], - [1, 3, kmodel_input_shape_rec[2], kmodel_input_shape_rec[3]]) - ai2d_input_tensor_rec = nn.from_numpy(rgb888p_img) - ai2d_builder_rec.run(ai2d_input_tensor_rec, ai2d_output_tensor_rec) - -# 检测步骤ai2d释放内存 -def ai2d_release_det(): - with ScopedTiming("ai2d_release_det",debug_mode > 0): - global ai2d_input_tensor_det - del ai2d_input_tensor_det + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") -# 识别步骤ai2d释放内存 -def ai2d_release_rec(): - with ScopedTiming("ai2d_release_rec",debug_mode > 0): - global ai2d_input_tensor_rec - del ai2d_input_tensor_rec -# 检测步骤kpu初始化 -def kpu_init_det(kmodel_file): +#ai_utils.py +global crop_current_kmodel_obj,src_current_kmodel_obj,track_current_kmodel_obj # 定义全局的 kpu 对象 +global crop_ai2d,crop_ai2d_input_tensor,crop_ai2d_output_tensor,crop_ai2d_builder # 对应crop模型: ai2d 对象 ,并且定义 ai2d 的输入、输出 以及 builder +global crop_pad_ai2d,crop_pad_ai2d_input_tensor,crop_pad_ai2d_output_tensor,crop_pad_ai2d_builder # 对应crop模型: ai2d 对象 ,并且定义 ai2d 的输入、输出 以及 builder +global src_ai2d,src_ai2d_input_tensor,src_ai2d_output_tensor,src_ai2d_builder # 对应src模型: ai2d 对象 ,并且定义 ai2d 的输入、输出 以及 builder +global src_pad_ai2d,src_pad_ai2d_input_tensor,src_pad_ai2d_output_tensor,src_pad_ai2d_builder # 对应src模型: ai2d 对象 ,并且定义 ai2d 的输入、输出 以及 builder +global track_kpu_input_0,track_kpu_input_1 # 对应head模型: 两个输入 + + +# 单目标跟踪的后处理 +def track_kpu_post_process(output_data,center_xy_wh): + with ScopedTiming("track_kpu_post_process", debug_mode > 0): + det = aidemo.nanotracker_postprocess(output_data[0],output_data[1],[OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH],head_thresh,center_xy_wh,crop_kmodel_input_shape[2],CONTEXT_AMOUNT) + return det + +# 单目标跟踪 对应crop模型的 ai2d 初始化 +def crop_ai2d_init(): + with ScopedTiming("crop_ai2d_init",debug_mode > 0): + global crop_ai2d, crop_pad_ai2d + crop_ai2d = nn.ai2d() + crop_pad_ai2d = nn.ai2d() + + crop_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT,nn.ai2d_format.NCHW_FMT,np.uint8, np.uint8) + crop_pad_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT,nn.ai2d_format.NCHW_FMT,np.uint8, np.uint8) + + crop_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) + crop_pad_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + + global crop_ai2d_out_tensor + data = np.ones(crop_kmodel_input_shape, dtype=np.uint8) + crop_ai2d_out_tensor = nn.from_numpy(data) + +# 单目标跟踪 对应crop模型的 ai2d 运行 +def crop_ai2d_run(rgb888p_img,center_xy_wh): + with ScopedTiming("crop_ai2d_run",debug_mode > 0): + global crop_ai2d, crop_pad_ai2d + global crop_ai2d_input_tensor,crop_ai2d_out_tensor,crop_ai2d_builder + global crop_pad_ai2d_input_tensor,crop_pad_ai2d_out_tensor,crop_pad_ai2d_builder + + s_z = round(np.sqrt((center_xy_wh[2] + CONTEXT_AMOUNT * (center_xy_wh[2] + center_xy_wh[3])) * (center_xy_wh[3] + CONTEXT_AMOUNT * (center_xy_wh[2] + center_xy_wh[3])))) + c = (s_z + 1) / 2 + context_xmin = np.floor(center_xy_wh[0] - c + 0.5) + context_xmax = int(context_xmin + s_z - 1) + context_ymin = np.floor(center_xy_wh[1] - c + 0.5) + context_ymax = int(context_ymin + s_z - 1) + + left_pad = int(max(0, -context_xmin)) + top_pad = int(max(0, -context_ymin)) + right_pad = int(max(0, int(context_xmax - OUT_RGB888P_WIDTH + 1))) + bottom_pad = int(max(0, int(context_ymax - OUT_RGB888P_HEIGHT + 1))) + context_xmin = context_xmin + left_pad + context_xmax = context_xmax + left_pad + context_ymin = context_ymin + top_pad + context_ymax = context_ymax + top_pad + + if (left_pad != 0 or right_pad != 0 or top_pad != 0 or bottom_pad != 0): + crop_pad_ai2d.set_pad_param(True, [0, 0, 0, 0, top_pad, bottom_pad, left_pad, right_pad], 0, rgb_mean) + crop_pad_ai2d_builder = crop_pad_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1, 3, OUT_RGB888P_HEIGHT + top_pad + bottom_pad, OUT_RGB888P_WIDTH + left_pad + right_pad]) + crop_pad_ai2d_input = rgb888p_img.to_numpy_ref() + crop_pad_ai2d_input_tensor = nn.from_numpy(crop_pad_ai2d_input) + crop_pad_ai2d_output = np.ones([1, 3, OUT_RGB888P_HEIGHT + top_pad + bottom_pad, OUT_RGB888P_WIDTH + left_pad + right_pad], dtype=np.uint8) + crop_pad_ai2d_out_tensor = nn.from_numpy(crop_pad_ai2d_output) + crop_pad_ai2d_builder.run(crop_pad_ai2d_input_tensor, crop_pad_ai2d_out_tensor) + + crop_ai2d.set_crop_param(True, int(context_xmin), int(context_ymin), int(context_xmax - context_xmin + 1), int(context_ymax - context_ymin + 1)) + crop_ai2d_builder = crop_ai2d.build([1, 3, OUT_RGB888P_HEIGHT + top_pad + bottom_pad, OUT_RGB888P_WIDTH + left_pad + right_pad], crop_kmodel_input_shape) + crop_ai2d_input_tensor = crop_pad_ai2d_out_tensor + crop_ai2d_builder.run(crop_ai2d_input_tensor, crop_ai2d_out_tensor) + del crop_pad_ai2d_input_tensor + del crop_pad_ai2d_out_tensor + del crop_pad_ai2d_builder + else: + crop_ai2d.set_crop_param(True, int(center_xy_wh[0] - s_z/2.0), int(center_xy_wh[1] - s_z/2.0), int(s_z), int(s_z)) + crop_ai2d_builder = crop_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], crop_kmodel_input_shape) + crop_ai2d_input = rgb888p_img.to_numpy_ref() + crop_ai2d_input_tensor = nn.from_numpy(crop_ai2d_input) + crop_ai2d_builder.run(crop_ai2d_input_tensor, crop_ai2d_out_tensor) + +# 单目标跟踪 对应crop模型的 ai2d 释放 +def crop_ai2d_release(): + with ScopedTiming("crop_ai2d_release",debug_mode > 0): + global crop_ai2d_input_tensor,crop_ai2d_builder + del crop_ai2d_input_tensor + del crop_ai2d_builder + + +# 单目标跟踪 对应src模型的 ai2d 初始化 +def src_ai2d_init(): + with ScopedTiming("src_ai2d_init",debug_mode > 0): + global src_ai2d, src_pad_ai2d + src_ai2d = nn.ai2d() + src_pad_ai2d = nn.ai2d() + + src_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT,nn.ai2d_format.NCHW_FMT,np.uint8, np.uint8) + src_pad_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT,nn.ai2d_format.NCHW_FMT,np.uint8, np.uint8) + + src_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) + src_pad_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) + + global src_ai2d_out_tensor + data = np.ones(src_kmodel_input_shape, dtype=np.uint8) + src_ai2d_out_tensor = nn.from_numpy(data) + +# 单目标跟踪 对应src模型的 ai2d 运行 +def src_ai2d_run(rgb888p_img,center_xy_wh): + with ScopedTiming("src_ai2d_run",debug_mode > 0): + global src_ai2d, src_pad_ai2d + global src_ai2d_input_tensor,src_ai2d_out_tensor,src_ai2d_builder + global src_pad_ai2d_input_tensor,src_pad_ai2d_out_tensor,src_pad_ai2d_builder + + s_z = round(np.sqrt((center_xy_wh[2] + CONTEXT_AMOUNT * (center_xy_wh[2] + center_xy_wh[3])) * (center_xy_wh[3] + CONTEXT_AMOUNT * (center_xy_wh[2] + center_xy_wh[3])))) * ratio_src_crop + c = (s_z + 1) / 2 + context_xmin = np.floor(center_xy_wh[0] - c + 0.5) + context_xmax = int(context_xmin + s_z - 1) + context_ymin = np.floor(center_xy_wh[1] - c + 0.5) + context_ymax = int(context_ymin + s_z - 1) + + left_pad = int(max(0, -context_xmin)) + top_pad = int(max(0, -context_ymin)) + right_pad = int(max(0, int(context_xmax - OUT_RGB888P_WIDTH + 1))) + bottom_pad = int(max(0, int(context_ymax - OUT_RGB888P_HEIGHT + 1))) + context_xmin = context_xmin + left_pad + context_xmax = context_xmax + left_pad + context_ymin = context_ymin + top_pad + context_ymax = context_ymax + top_pad + + if (left_pad != 0 or right_pad != 0 or top_pad != 0 or bottom_pad != 0): + src_pad_ai2d.set_pad_param(True, [0, 0, 0, 0, top_pad, bottom_pad, left_pad, right_pad], 0, rgb_mean) + src_pad_ai2d_builder = src_pad_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1, 3, OUT_RGB888P_HEIGHT + top_pad + bottom_pad, OUT_RGB888P_WIDTH + left_pad + right_pad]) + src_pad_ai2d_input = rgb888p_img.to_numpy_ref() + src_pad_ai2d_input_tensor = nn.from_numpy(src_pad_ai2d_input) + src_pad_ai2d_output = np.ones([1, 3, OUT_RGB888P_HEIGHT + top_pad + bottom_pad, OUT_RGB888P_WIDTH + left_pad + right_pad], dtype=np.uint8) + src_pad_ai2d_out_tensor = nn.from_numpy(src_pad_ai2d_output) + src_pad_ai2d_builder.run(src_pad_ai2d_input_tensor, src_pad_ai2d_out_tensor) + + src_ai2d.set_crop_param(True, int(context_xmin), int(context_ymin), int(context_xmax - context_xmin + 1), int(context_ymax - context_ymin + 1)) + src_ai2d_builder = src_ai2d.build([1, 3, OUT_RGB888P_HEIGHT + top_pad + bottom_pad, OUT_RGB888P_WIDTH + left_pad + right_pad], src_kmodel_input_shape) + src_ai2d_input_tensor = src_pad_ai2d_out_tensor + src_ai2d_builder.run(src_ai2d_input_tensor, src_ai2d_out_tensor) + del src_pad_ai2d_input_tensor + del src_pad_ai2d_out_tensor + del src_pad_ai2d_builder + else: + src_ai2d.set_crop_param(True, int(center_xy_wh[0] - s_z/2.0), int(center_xy_wh[1] - s_z/2.0), int(s_z), int(s_z)) + src_ai2d_builder = src_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], src_kmodel_input_shape) + src_ai2d_input = rgb888p_img.to_numpy_ref() + src_ai2d_input_tensor = nn.from_numpy(src_ai2d_input) + src_ai2d_builder.run(src_ai2d_input_tensor, src_ai2d_out_tensor) + +# 单目标跟踪 对应src模型的 ai2d 释放 +def src_ai2d_release(): + with ScopedTiming("src_ai2d_release",debug_mode > 0): + global src_ai2d_input_tensor,src_ai2d_builder + del src_ai2d_input_tensor + del src_ai2d_builder + + +# 单目标跟踪 crop kpu 初始化 +def crop_kpu_init(kmodel_file): # init kpu and load kmodel - with ScopedTiming("kpu_init_det",debug_mode > 0): + with ScopedTiming("crop_kpu_init",debug_mode > 0): kpu_obj = nn.kpu() kpu_obj.load_kmodel(kmodel_file) - ai2d_init_det() + + crop_ai2d_init() return kpu_obj -# 识别步骤kpu初始化 -def kpu_init_rec(kmodel_file): +# 单目标跟踪 crop kpu 输入预处理 +def crop_kpu_pre_process(rgb888p_img,center_xy_wh): + crop_ai2d_run(rgb888p_img,center_xy_wh) + with ScopedTiming("crop_kpu_pre_process",debug_mode > 0): + global crop_current_kmodel_obj,crop_ai2d_out_tensor + # set kpu input + crop_current_kmodel_obj.set_input_tensor(0, crop_ai2d_out_tensor) + +# 单目标跟踪 crop kpu 获取输出 +def crop_kpu_get_output(): + with ScopedTiming("crop_kpu_get_output",debug_mode > 0): + global crop_current_kmodel_obj + data = crop_current_kmodel_obj.get_output_tensor(0) + result = data.to_numpy() + del data + return result + +# 单目标跟踪 crop kpu 运行 +def crop_kpu_run(kpu_obj,rgb888p_img,center_xy_wh): + global crop_current_kmodel_obj + crop_current_kmodel_obj = kpu_obj + # (1) 原图预处理,并设置模型输入 + crop_kpu_pre_process(rgb888p_img,center_xy_wh) + # (2) kpu 运行 + with ScopedTiming("crop_kpu_run",debug_mode > 0): + kpu_obj.run() + # (3) 释放ai2d资源 + crop_ai2d_release() + # (4) 获取kpu输出 + result = crop_kpu_get_output() + # 返回 crop kpu 的输出 + return result + +# 单目标跟踪 crop kpu 释放 +def crop_kpu_deinit(kpu_obj): + with ScopedTiming("crop_kpu_deinit",debug_mode > 0): + global crop_ai2d, crop_pad_ai2d, crop_ai2d_out_tensor + del kpu_obj + del crop_ai2d + del crop_pad_ai2d + del crop_ai2d_out_tensor + +# 单目标跟踪 src kpu 初始化 +def src_kpu_init(kmodel_file): # init kpu and load kmodel - with ScopedTiming("kpu_init_rec",debug_mode > 0): + with ScopedTiming("src_kpu_init",debug_mode > 0): kpu_obj = nn.kpu() kpu_obj.load_kmodel(kmodel_file) - ai2d_init_rec() + + src_ai2d_init() return kpu_obj -# 检测步骤预处理,调用ai2d_run_det实现,并将ai2d的输出设置为kmodel的输入 -def kpu_pre_process_det(rgb888p_img): - ai2d_run_det(rgb888p_img) - with ScopedTiming("kpu_pre_process_det",debug_mode > 0): - global current_kmodel_obj,ai2d_output_tensor_det +# 单目标跟踪 src kpu 输入预处理 +def src_kpu_pre_process(rgb888p_img,center_xy_wh): + src_ai2d_run(rgb888p_img,center_xy_wh) + with ScopedTiming("src_kpu_pre_process",debug_mode > 0): + global src_current_kmodel_obj,src_ai2d_out_tensor # set kpu input - current_kmodel_obj.set_input_tensor(0, ai2d_output_tensor_det) + src_current_kmodel_obj.set_input_tensor(0, src_ai2d_out_tensor) -# 识别步骤预处理,调用ai2d_init_run_rec实现,并将ai2d的输出设置为kmodel的输入 -def kpu_pre_process_rec(rgb888p_img): - ai2d_run_rec(rgb888p_img) - with ScopedTiming("kpu_pre_process_rec",debug_mode > 0): - global current_kmodel_obj,ai2d_output_tensor_rec - # set kpu input - current_kmodel_obj.set_input_tensor(0, ai2d_output_tensor_rec) +# 单目标跟踪 src kpu 获取输出 +def src_kpu_get_output(): + with ScopedTiming("src_kpu_get_output",debug_mode > 0): + global src_current_kmodel_obj + data = src_current_kmodel_obj.get_output_tensor(0) + result = data.to_numpy() + del data + return result + +# 单目标跟踪 src kpu 运行 +def src_kpu_run(kpu_obj,rgb888p_img,center_xy_wh): + global src_current_kmodel_obj + src_current_kmodel_obj = kpu_obj + # (1) 原图预处理,并设置模型输入 + src_kpu_pre_process(rgb888p_img,center_xy_wh) + # (2) kpu 运行 + with ScopedTiming("src_kpu_run",debug_mode > 0): + kpu_obj.run() + # (3) 释放ai2d资源 + src_ai2d_release() + # (4) 获取kpu输出 + result = src_kpu_get_output() + # 返回 src kpu 的输出 + return result +# 单目标跟踪 src kpu 释放 +def src_kpu_deinit(kpu_obj): + with ScopedTiming("src_kpu_deinit",debug_mode > 0): + global src_ai2d, src_pad_ai2d, src_ai2d_out_tensor + del kpu_obj + del src_ai2d + del src_pad_ai2d + del src_ai2d_out_tensor -# 获取kmodel的输出 -def kpu_get_output(): - with ScopedTiming("kpu_get_output",debug_mode > 0): - global current_kmodel_obj +# 单目标跟踪 track kpu 初始化 +def track_kpu_init(kmodel_file): + # init kpu and load kmodel + with ScopedTiming("track_kpu_init",debug_mode > 0): + kpu_obj = nn.kpu() + kpu_obj.load_kmodel(kmodel_file) + return kpu_obj + +# 单目标跟踪 track kpu 输入预处理 +def track_kpu_pre_process(): + with ScopedTiming("track_kpu_pre_process",debug_mode > 0): + global track_current_kmodel_obj,track_kpu_input_0,track_kpu_input_1 + # set kpu input + track_current_kmodel_obj.set_input_tensor(0, track_kpu_input_0) + track_current_kmodel_obj.set_input_tensor(1, track_kpu_input_1) + +# 单目标跟踪 track kpu 获取输出 +def track_kpu_get_output(): + with ScopedTiming("track_kpu_get_output",debug_mode > 0): + global track_current_kmodel_obj results = [] - for i in range(current_kmodel_obj.outputs_size()): - data = current_kmodel_obj.get_output_tensor(i) + for i in range(track_current_kmodel_obj.outputs_size()): + data = track_current_kmodel_obj.get_output_tensor(i) result = data.to_numpy() del data results.append(result) return results -# 检测步骤kpu运行 -def kpu_run_det(kpu_obj,rgb888p_img): - # kpu推理 - global current_kmodel_obj - current_kmodel_obj = kpu_obj - #(1)原图像预处理并设置模型输入 - kpu_pre_process_det(rgb888p_img) - #(2)kpu推理 - with ScopedTiming("kpu_run_det",debug_mode > 0): - # 检测运行 - kpu_obj.run() - #(3)检测释放ai2d资源 - ai2d_release_det() - #(4)获取检测kpu输出 - results = kpu_get_output() - #(5)CHW转HWC - global ai2d_input_det - tmp = (ai2d_input_det.shape[0], ai2d_input_det.shape[1], ai2d_input_det.shape[2]) - ai2d_input_det = ai2d_input_det.reshape((ai2d_input_det.shape[0], ai2d_input_det.shape[1] * ai2d_input_det.shape[2])) - ai2d_input_det = ai2d_input_det.transpose() - tmp2 = ai2d_input_det.copy() - tmp2 = tmp2.reshape((tmp[1], tmp[2], tmp[0])) - #(6)后处理,aicube.ocr_post_process接口说明: - # 接口:aicube.ocr_post_process(threshold_map,ai_isp,kmodel_input_shape,isp_shape,mask_threshold,box_threshold); - # 参数说明: - # threshold_map: DBNet模型的输出为(N,kmodel_input_shape_det[2],kmodel_input_shape_det[3],2),两个通道分别为threshold map和segmentation map - # 后处理过程只使用threshold map,因此将results[0][:,:,:,0] reshape成一维传给接口使用。 - # ai_isp:后处理还会返回基于原图的检测框裁剪数据,因此要将原图数据reshape为一维传给接口处理。 - # kmodel_input_shape:kmodel输入分辨率。 - # isp_shape:AI原图分辨率。要将kmodel输出分辨率的检测框坐标映射到原图分辨率上,需要使用这两个分辨率的值。 - # mask_threshold:用于二值化图像获得文本区域。 - # box_threshold:检测框分数阈值,低于该阈值的检测框不计入结果。 - with ScopedTiming("kpu_post",debug_mode > 0): - # 调用aicube模块的ocr_post_process完成ocr检测的后处理 - # det_results结构为[[crop_array_nhwc,[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y]],...] - det_results = aicube.ocr_post_process(results[0][:, :, :, 0].reshape(-1), tmp2.reshape(-1), - [kmodel_input_shape_det[3], kmodel_input_shape_det[2]], - [OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH], mask_threshold, box_threshold) - return det_results - -# 识别步骤后处理 -def kpu_run_rec(kpu_obj,rgb888p_img): - # kpu推理 - global current_kmodel_obj - current_kmodel_obj = kpu_obj - #(1)识别预处理并设置模型输入 - kpu_pre_process_rec(rgb888p_img) - #(2)kpu推理 - with ScopedTiming("kpu_run_rec",debug_mode > 0): - # 识别运行 +# 单目标跟踪 track kpu 运行 +def track_kpu_run(kpu_obj,center_xy_wh): + global track_current_kmodel_obj,track_kpu_input_1 + track_current_kmodel_obj = kpu_obj + # (1) 原图预处理,并设置模型输入 + track_kpu_pre_process() + # (2) kpu 运行 + with ScopedTiming("track_kpu_run",debug_mode > 0): kpu_obj.run() - #(3)识别释放ai2d资源 - ai2d_release_rec() - #(4)获取识别kpu输出 - results = kpu_get_output() - #(5)识别后处理,results结构为[(N,MAX_LENGTH,DICT_LENGTH),...],在axis=2维度上取argmax获取当前识别字符在字典中的索引 - preds = np.argmax(results[0], axis=2).reshape((-1)) - output_txt = "" - for i in range(len(preds)): - # 当前识别字符不是字典的最后一个字符并且和前一个字符不重复(去重),加入识别结果字符串 - if preds[i] != (len(DICT) - 1) and (not (i > 0 and preds[i - 1] == preds[i])): - output_txt = output_txt + DICT[preds[i]] - return output_txt - -# 释放检测步骤kpu、ai2d以及ai2d相关的tensor -def kpu_deinit_det(kpu_obj): - with ScopedTiming("kpu_deinit",debug_mode > 0): - global ai2d_det,ai2d_output_tensor_det - del kpu_obj - del ai2d_det - del ai2d_output_tensor_det -# 释放识别步骤kpu -def kpu_deinit_rec(kpu_obj): - with ScopedTiming("kpu_deinit",debug_mode > 0): - global ai2d_rec,ai2d_output_tensor_rec + del track_kpu_input_1 + # (4) 获取kpu输出 + results = track_kpu_get_output() + # (5) track 后处理 + det = track_kpu_post_process(results,center_xy_wh) + # 返回 跟踪的结果 + return det + +# 单目标跟踪 track kpu 释放 +def track_kpu_deinit(kpu_obj): + with ScopedTiming("track_kpu_deinit",debug_mode > 0): + global track_kpu_input_0 del kpu_obj - del ai2d_rec - del ai2d_output_tensor_rec - + del track_kpu_input_0 -#********************for media_utils.py******************** -global draw_img,osd_img #for display -global buffer,media_source,media_sink #for media +#media_utils.py +global draw_img,osd_img #for display 定义全局 作图image对象 +global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 -# display初始化 +#for display 初始化 def display_init(): # use hdmi for display display.init(LT9611_1920X1080_30FPS) display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) -# 释放display +# display 释放内存 def display_deinit(): display.deinit() -# display显示检测识别框 -def display_draw(det_results): - with ScopedTiming("display_draw",debug_mode >0): - global draw_img,osd_img - if det_results: - draw_img.clear() - # 循环绘制所有检测到的框 - for j in det_results: - # 将原图的坐标点转换成显示的坐标点,循环绘制四条直线,得到一个矩形框 - for i in range(4): - x1 = j[1][(i * 2)] / OUT_RGB888P_WIDTH * DISPLAY_WIDTH - y1 = j[1][(i * 2 + 1)] / OUT_RGB888P_HEIGH * DISPLAY_HEIGHT - x2 = j[1][((i + 1) * 2) % 8] / OUT_RGB888P_WIDTH * DISPLAY_WIDTH - y2 = j[1][((i + 1) * 2 + 1) % 8] / OUT_RGB888P_HEIGH * DISPLAY_HEIGHT - draw_img.draw_line((int(x1), int(y1), int(x2), int(y2)), color=(255, 0, 0, 255), - thickness=5) - draw_img.copy_to(osd_img) - display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) - else: - draw_img.clear() - draw_img.copy_to(osd_img) - display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) -# camera初始化 +#for camera 初始化 def camera_init(dev_id): camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) - # camera获取的通道0图像送display显示 + # set chn0 output yuv420sp camera.set_outsize(dev_id, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) - # camera获取的通道2图像送ai处理 + # set chn2 output rgb88planar - camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) - camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) + camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_BGR_888_PLANAR) -# camera 启动视频流 +# camera 开启 def camera_start(dev_id): camera.start_stream(dev_id) -# camera 捕获一帧图像 +# camera 读取图像 def camera_read(dev_id): with ScopedTiming("camera_read",debug_mode >0): rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) return rgb888p_img -# camera 释放内存 +# camera 图像释放 def camera_release_image(dev_id,rgb888p_img): with ScopedTiming("camera_release_image",debug_mode >0): camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) -# camera 停止视频流 +# camera 结束 def camera_stop(dev_id): camera.stop_stream(dev_id) @@ -8221,7 +12067,7 @@ def media_init(): phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) return ret -# media 释放buffer,销毁link +# media 释放内存 def media_deinit(): global buffer,media_source, media_sink media.release_buffer(buffer) @@ -8230,42 +12076,124 @@ def media_deinit(): ret = media.buffer_deinit() return ret -def ocr_rec_inference(): - print("ocr_rec_test start") - kpu_ocr_det = kpu_init_det(kmodel_file_det) # 创建OCR检测kpu对象 - kpu_ocr_rec = kpu_init_rec(kmodel_file_rec) # 创建OCR识别kpu对象 - camera_init(CAM_DEV_ID_0) # camera初始化 - display_init() # display初始化 + +#**********for nanotracker.py********** +def nanotracker_inference(): + print("nanotracker start") + kpu_crop = crop_kpu_init(crop_kmodel_file) # 创建单目标跟踪 crop kpu 对象 + kpu_src = src_kpu_init(src_kmodel_file) # 创建单目标跟踪 src kpu 对象 + kpu_track = track_kpu_init(track_kmodel_file) # 创建单目标跟踪 track kpu 对象 + camera_init(CAM_DEV_ID_0) # 初始化 camera + display_init() # 初始化 display + rgb888p_img = None try: ret = media_init() if ret: - print("ocr_rec_test, buffer init failed") + print("nanotracker, buffer init failed") return ret camera_start(CAM_DEV_ID_0) time.sleep(5) - while True: + + run_bool = True + if (track_x1 < 50 or track_y1 < 50 or track_x1+track_w >= OUT_RGB888P_WIDTH-50 or track_y1+track_h >= OUT_RGB888P_HEIGHT-50): + print("**剪切范围超出图像范围**") + run_bool = False + + track_mean_x = track_x1 + track_w / 2.0 + track_mean_y = track_y1 + track_h / 2.0 + draw_mean_w = int(track_w / OUT_RGB888P_WIDTH * DISPLAY_WIDTH) + draw_mean_h = int(track_h / OUT_RGB888P_HEIGHT * DISPLAY_HEIGHT) + draw_mean_x = int(track_mean_x / OUT_RGB888P_WIDTH * DISPLAY_WIDTH - draw_mean_w / 2.0) + draw_mean_y = int(track_mean_y / OUT_RGB888P_HEIGHT * DISPLAY_HEIGHT - draw_mean_h / 2.0) + track_w_src = track_w + track_h_src = track_h + + center_xy_wh = [track_mean_x,track_mean_y,track_w_src,track_h_src] + center_xy_wh_tmp = [track_mean_x,track_mean_y,track_w_src,track_h_src] + + seconds = 8 + endtime = time.time() + seconds + enter_init = True + + track_boxes = [track_x1,track_y1,track_w,track_h,1] + track_boxes_tmp = np.array([track_x1,track_y1,track_w,track_h,1]) + global draw_img,osd_img + + count = 0 + while run_bool: with ScopedTiming("total",1): - rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图像 + rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 if rgb888p_img == -1: - print("ocr_rec_test, capture_image failed") + print("nanotrakcer, capture_image failed") camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None continue + # for rgb888planar if rgb888p_img.format() == image.RGBP888: - det_results = kpu_run_det(kpu_ocr_det,rgb888p_img) # kpu运行获取OCR检测kmodel的推理输出 - ocr_results="" - if det_results: - for j in det_results: - ocr_result = kpu_run_rec(kpu_ocr_rec,j[0]) # j[0]为检测框的裁剪部分,kpu运行获取OCR识别kmodel的推理输出 - ocr_results = ocr_results+" ["+ocr_result+"] " - print("\n"+ocr_results) - display_draw(det_results) - camera_release_image(CAM_DEV_ID_0,rgb888p_img) + nowtime = time.time() + draw_img.clear() + if (enter_init and nowtime <= endtime): + print("倒计时: " + str(endtime - nowtime) + " 秒") + draw_img.draw_rectangle(draw_mean_x , draw_mean_y , draw_mean_w , draw_mean_h , color=(255, 0, 255, 0),thickness = 4) + print(" >>>>>> get trackWindow <<<<<<<<") + global track_kpu_input_0 + track_kpu_input_0 = nn.from_numpy(crop_kpu_run(kpu_crop,rgb888p_img,center_xy_wh)) + + time.sleep(1) + if (nowtime > endtime): + print(">>>>>>> Play <<<<<<<") + enter_init = False + else: + global track_kpu_input_1 + track_kpu_input_1 = nn.from_numpy(src_kpu_run(kpu_src,rgb888p_img,center_xy_wh)) + det = track_kpu_run(kpu_track,center_xy_wh) + track_boxes = det[0] + center_xy_wh = det[1] + track_bool = True + if (len(track_boxes) != 0): + track_bool = track_boxes[0] > 10 and track_boxes[1] > 10 and track_boxes[0] + track_boxes[2] < OUT_RGB888P_WIDTH - 10 and track_boxes[1] + track_boxes[3] < OUT_RGB888P_HEIGHT - 10 + else: + track_bool = False + + if (len(center_xy_wh) != 0): + track_bool = track_bool and center_xy_wh[2] * center_xy_wh[3] < 40000 + else: + track_bool = False + + if (track_bool): + center_xy_wh_tmp = center_xy_wh + track_boxes_tmp = track_boxes + x1 = int(float(track_boxes[0]) * DISPLAY_WIDTH / OUT_RGB888P_WIDTH) + y1 = int(float(track_boxes[1]) * DISPLAY_HEIGHT / OUT_RGB888P_HEIGHT) + w = int(float(track_boxes[2]) * DISPLAY_WIDTH / OUT_RGB888P_WIDTH) + h = int(float(track_boxes[3]) * DISPLAY_HEIGHT / OUT_RGB888P_HEIGHT) + draw_img.draw_rectangle(x1, y1, w, h, color=(255, 255, 0, 0),thickness = 4) + else: + center_xy_wh = center_xy_wh_tmp + track_boxes = track_boxes_tmp + x1 = int(float(track_boxes[0]) * DISPLAY_WIDTH / OUT_RGB888P_WIDTH) + y1 = int(float(track_boxes[1]) * DISPLAY_HEIGHT / OUT_RGB888P_HEIGHT) + w = int(float(track_boxes[2]) * DISPLAY_WIDTH / OUT_RGB888P_WIDTH) + h = int(float(track_boxes[3]) * DISPLAY_HEIGHT / OUT_RGB888P_HEIGHT) + draw_img.draw_rectangle(x1, y1, w, h, color=(255, 255, 0, 0),thickness = 4) + draw_img.draw_string( x1 , y1-50, "Step away from the camera, please !" , color=(255, 255 ,0 , 0), scale=4, thickness = 1) + draw_img.draw_string( x1 , y1-100, "Near the center, please !" , color=(255, 255 ,0 , 0), scale=4, thickness = 1) + + + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + + camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - # gc.collect() + + if (count > 5): + gc.collect() + count = 0 + else: + count += 1 except Exception as e: print(f"An error occurred during buffer used: {e}") finally: @@ -8273,25 +12201,26 @@ def ocr_rec_inference(): #先release掉申请的内存再stop camera_release_image(CAM_DEV_ID_0,rgb888p_img) - camera_stop(CAM_DEV_ID_0) # 停止camera - display_deinit() # 释放display - kpu_deinit_det(kpu_ocr_det) # 释放OCR检测步骤kpu - kpu_deinit_rec(kpu_ocr_rec) # 释放OCR识别步骤kpu + camera_stop(CAM_DEV_ID_0) # 停止 camera + display_deinit() # 释放 display + crop_kpu_deinit(kpu_crop) # 释放 单目标跟踪 crop kpu + src_kpu_deinit(kpu_src) # 释放 单目标跟踪 src kpu + track_kpu_deinit(kpu_track) # 释放 单目标跟踪 track kpu gc.collect() time.sleep(1) - ret = media_deinit() # 释放整个media + ret = media_deinit() # 释放 整个media if ret: - print("ocr_rec_test, buffer_deinit failed") + print("nanotracker, buffer_deinit failed") return ret - print("ocr_rec_test end") + print("nanotracker end") return 0 if __name__ == '__main__': - ocr_rec_inference() + nanotracker_inference() ``` -### 8. 手掌关键点检测 +### 14.隔空放大 ```python import aicube #aicube模块,封装检测分割等任务相关后处理 @@ -8314,7 +12243,7 @@ DISPLAY_HEIGHT = 1080 ##ai原图分辨率输入 OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) -OUT_RGB888P_HEIGH = 1080 +OUT_RGB888P_HEIGHT = 1080 #--------for hand detection---------- #kmodel输入shape @@ -8324,7 +12253,7 @@ hd_kmodel_input_shape = (1,3,512,512) # 手掌检测km confidence_threshold = 0.2 # 手掌检测阈值,用于过滤roi nms_threshold = 0.5 # 手掌检测框阈值,用于过滤重复roi hd_kmodel_frame_size = [512,512] # 手掌检测输入图片尺寸 -hd_frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH] # 手掌检测直接输入图片尺寸 +hd_frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGHT] # 手掌检测直接输入图片尺寸 strides = [8,16,32] # 输出特征图的尺寸与输入图片尺寸的比 num_classes = 1 # 手掌检测模型输出类别数 nms_option = False # 是否所有检测框一起做NMS,False则按照不同的类分别应用NMS @@ -8363,6 +12292,8 @@ class ScopedTiming: global current_kmodel_obj # 定义全局的 kpu 对象 global hd_ai2d,hd_ai2d_input_tensor,hd_ai2d_output_tensor,hd_ai2d_builder # 定义手掌检测全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder global hk_ai2d,hk_ai2d_input_tensor,hk_ai2d_output_tensor,hk_ai2d_builder # 定义手掌关键点检测全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder +global space_ai2d,space_ai2d_input_tensor,space_ai2d_output_tensor,space_ai2d_builder,space_draw_ai2d_release # 定义缩放剪切图像全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder + #-------hand detect--------: # 手掌检测ai2d 初始化 @@ -8373,7 +12304,7 @@ def hd_ai2d_init(): global hd_ai2d_output_tensor # 计算padding值 ori_w = OUT_RGB888P_WIDTH - ori_h = OUT_RGB888P_HEIGH + ori_h = OUT_RGB888P_HEIGHT width = hd_kmodel_frame_size[0] height = hd_kmodel_frame_size[1] ratiow = float(width) / ori_w @@ -8398,14 +12329,14 @@ def hd_ai2d_init(): np.uint8, np.uint8) hd_ai2d.set_pad_param(True, [0,0,0,0,top,bottom,left,right], 0, [114,114,114]) hd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) - hd_ai2d_builder = hd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], [1,3,height,width]) + hd_ai2d_builder = hd_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,height,width]) data = np.ones(hd_kmodel_input_shape, dtype=np.uint8) hd_ai2d_output_tensor = nn.from_numpy(data) # 手掌检测 ai2d 运行 def hd_ai2d_run(rgb888p_img): with ScopedTiming("hd_ai2d_run",debug_mode > 0): - global hd_ai2d_input_tensor,hd_ai2d_output_tensor + global hd_ai2d_input_tensor,hd_ai2d_output_tensor,hd_ai2d_builder hd_ai2d_input = rgb888p_img.to_numpy_ref() hd_ai2d_input_tensor = nn.from_numpy(hd_ai2d_input) @@ -8470,9 +12401,10 @@ def hd_kpu_run(kpu_obj,rgb888p_img): # 手掌检测 kpu 释放内存 def hd_kpu_deinit(kpu_obj): with ScopedTiming("hd_kpu_deinit",debug_mode > 0): - global hd_ai2d, hd_ai2d_output_tensor + global hd_ai2d, hd_ai2d_output_tensor,hd_ai2d_builder del kpu_obj del hd_ai2d + del hd_ai2d_builder del hd_ai2d_output_tensor #-------hand keypoint detection------: @@ -8498,14 +12430,15 @@ def hk_ai2d_run(rgb888p_img, x, y, w, h): hk_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) global hk_ai2d_builder - hk_ai2d_builder = hk_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], [1,3,hk_kmodel_frame_size[1],hk_kmodel_frame_size[0]]) + hk_ai2d_builder = hk_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,hk_kmodel_frame_size[1],hk_kmodel_frame_size[0]]) hk_ai2d_builder.run(hk_ai2d_input_tensor, hk_ai2d_output_tensor) # 手掌关键点检测 ai2d 释放内存 def hk_ai2d_release(): with ScopedTiming("hk_ai2d_release",debug_mode > 0): - global hk_ai2d_input_tensor + global hk_ai2d_input_tensor,hk_ai2d_builder del hk_ai2d_input_tensor + del hk_ai2d_builder # 手掌关键点检测 kpu 初始化 def hk_kpu_init(hk_kmodel_file): @@ -8564,6 +12497,48 @@ def hk_kpu_deinit(kpu_obj): del hk_ai2d del hk_ai2d_output_tensor +# 隔空缩放剪切 ai2d 初始化 +def space_ai2d_init(): + with ScopedTiming("space_ai2d_init",debug_mode > 0): + global space_ai2d + space_ai2d = nn.ai2d() + space_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.RGB_packed, + np.uint8, np.uint8) + +# 隔空缩放剪切 ai2d 运行 +def space_ai2d_run(rgb888p_img, x, y, w, h, out_w, out_h): + with ScopedTiming("space_ai2d_run",debug_mode > 0): + global space_ai2d,space_ai2d_input_tensor,space_ai2d_output_tensor,space_draw_ai2d_release + space_draw_ai2d_release = True + space_ai2d_input = rgb888p_img.to_numpy_ref() + space_ai2d_input_tensor = nn.from_numpy(space_ai2d_input) + + space_ai2d.set_crop_param(True, x, y, w, h) + space_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) + + data = np.ones((1,out_h, out_w,3), dtype=np.uint8) + space_ai2d_output_tensor = nn.from_numpy(data) + + global space_ai2d_builder + space_ai2d_builder = space_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,out_h, out_w,3]) + space_ai2d_builder.run(space_ai2d_input_tensor, space_ai2d_output_tensor) + + space_np_out = space_ai2d_output_tensor.to_numpy() + return space_np_out + +# 隔空缩放剪切 ai2d 释放内存 +def space_ai2d_release(re_ai2d): + with ScopedTiming("space_ai2d_release",debug_mode > 0): + global space_ai2d_input_tensor,space_ai2d_output_tensor,space_ai2d_builder,space_draw_ai2d_release,space_ai2d + if (space_draw_ai2d_release): + del space_ai2d_input_tensor + del space_ai2d_output_tensor + del space_ai2d_builder + space_draw_ai2d_release = False + if (re_ai2d): + del space_ai2d + #media_utils.py global draw_img,osd_img,masks #for display 定义全局 作图image对象 global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 @@ -8578,34 +12553,6 @@ def display_init(): def display_deinit(): display.deinit() -# display 作图过程 标出检测到的21个关键点并用不同颜色的线段连接 -def display_draw(results, x, y, w, h): - with ScopedTiming("display_draw",debug_mode >0): - global draw_img,osd_img - - if results: - results_show = np.zeros(results.shape,dtype=np.int16) - results_show[0::2] = results[0::2] * w + x - results_show[1::2] = results[1::2] * h + y - for i in range(len(results_show)/2): - draw_img.draw_circle(results_show[i*2], results_show[i*2+1], 1, color=(255, 0, 255, 0),fill=False) - for i in range(5): - j = i*8 - if i==0: - R = 255; G = 0; B = 0 - if i==1: - R = 255; G = 0; B = 255 - if i==2: - R = 255; G = 255; B = 0 - if i==3: - R = 0; G = 255; B = 0 - if i==4: - R = 0; G = 0; B = 255 - draw_img.draw_line(results_show[0], results_show[1],results_show[j+2], results_show[j+3],color=(255,R,G,B)) - draw_img.draw_line(results_show[j+2], results_show[j+3],results_show[j+4], results_show[j+5],color=(255,R,G,B)) - draw_img.draw_line(results_show[j+4], results_show[j+5],results_show[j+6], results_show[j+7],color=(255,R,G,B)) - draw_img.draw_line(results_show[j+6], results_show[j+7],results_show[j+8], results_show[j+9],color=(255,R,G,B)) - #for camera 初始化 def camera_init(dev_id): camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) @@ -8615,7 +12562,7 @@ def camera_init(dev_id): camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) # set chn2 output rgb88planar - camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) # camera 开启 @@ -8656,10 +12603,11 @@ def media_init(): ret = media.buffer_init() if ret: return ret - global buffer, draw_img, osd_img + global buffer, draw_img, osd_img, masks buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) # 图层1,用于画框 - draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_MPGC) + masks = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888,alloc=image.ALLOC_REF,data=masks) # 图层2,用于拷贝画框结果,防止画框过程中发生buffer搬运 osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) @@ -8674,75 +12622,143 @@ def media_deinit(): ret = media.buffer_deinit() return ret -#**********for hand_keypoint_detect.py********** -def hand_keypoint_detect_inference(): - print("hand_keypoint_detect_test start") +#**********for space_resize.py********** +def space_resize_inference(): + print("space_resize start") kpu_hand_detect = hd_kpu_init(hd_kmodel_file) # 创建手掌检测的 kpu 对象 kpu_hand_keypoint_detect = hk_kpu_init(hk_kmodel_file) # 创建手掌关键点检测的 kpu 对象 camera_init(CAM_DEV_ID_0) # 初始化 camera display_init() # 初始化 display + space_ai2d_init() # 初始化 隔空缩放剪切 ai2d 对象 rgb888p_img = None try: ret = media_init() if ret: - print("hand_detect_test, buffer init failed") + print("space_resize, buffer init failed") return ret camera_start(CAM_DEV_ID_0) + + global draw_img,osd_img + first_start = True # 首次手掌入镜参数 + two_point_left_x = 0 # 中指食指包括范围 x + two_point_top_y = 0 # 中指食指包括范围 y + two_point_mean_w = 0 # 中指食指首次入镜包括范围 w + two_point_mean_h = 0 # 中指食指首次入镜包括范围 h + two_point_crop_w = 0 # 中指食指包括范围 w + two_point_crop_h = 0 # 中指食指包括范围 h + osd_plot_x = 0 # osd 画缩放图起始点 x + osd_plot_y = 0 # osd 画缩放图起始点 y + ori_new_ratio = 0 # 缩放比例 + new_resize_w = 0 # 缩放后 w + new_resize_h = 0 # 缩放后 h + crop_area = 0 # 剪切区域 + rect_frame_x = 0 # osd绘画起始点 x + rect_frame_y = 0 # osd绘画起始点 y + + count = 0 while True: with ScopedTiming("total",1): rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 if rgb888p_img == -1: - print("hand_detect_test, capture_image failed") - camera_release_image(CAM_DEV_ID_0,rgb888p_img) + print("space_resize, capture_image failed") + #camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None continue # for rgb888planar if rgb888p_img.format() == image.RGBP888: - dets = hd_kpu_run(kpu_hand_detect,rgb888p_img) # 执行手掌检测 kpu 运行 以及 后处理过程 + two_point = np.zeros((4),dtype=np.int16) + dets_no_pro = hd_kpu_run(kpu_hand_detect,rgb888p_img) # 执行手掌检测 kpu 运行 以及 后处理过程 draw_img.clear() - for det_box in dets: - x1, y1, x2, y2 = det_box[2],det_box[3],det_box[4],det_box[5] - w = int(float(x2 - x1) * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - h = int(float(y2 - y1) * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) + dets = [] + for det_box in dets_no_pro: + if det_box[4] < OUT_RGB888P_WIDTH - 10 : + dets.append(det_box) - x1 = int(x1 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - y1 = int(y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) - x2 = int(x2 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - y2 = int(y2 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) + if (len(dets)==1): + for det_box in dets: + x1, y1, x2, y2 = int(det_box[2]),int(det_box[3]),int(det_box[4]),int(det_box[5]) + w = int(x2 - x1) + h = int(y2 - y1) + + if (h<(0.1*OUT_RGB888P_HEIGHT)): + continue + if (w<(0.25*OUT_RGB888P_WIDTH) and ((x1<(0.03*OUT_RGB888P_WIDTH)) or (x2>(0.97*OUT_RGB888P_WIDTH)))): + continue + if (w<(0.15*OUT_RGB888P_WIDTH) and ((x1<(0.01*OUT_RGB888P_WIDTH)) or (x2>(0.99*OUT_RGB888P_WIDTH)))): + continue + + length = max(w,h)/2 + cx = (x1+x2)/2 + cy = (y1+y2)/2 + ratio_num = 1.26*length + + x1_kp = int(max(0,cx-ratio_num)) + y1_kp = int(max(0,cy-ratio_num)) + x2_kp = int(min(OUT_RGB888P_WIDTH-1, cx+ratio_num)) + y2_kp = int(min(OUT_RGB888P_HEIGHT-1, cy+ratio_num)) + w_kp = int(x2_kp - x1_kp + 1) + h_kp = int(y2_kp - y1_kp + 1) + + hk_results = hk_kpu_run(kpu_hand_keypoint_detect,rgb888p_img, x1_kp, y1_kp, w_kp, h_kp) # 执行手掌关键点检测 kpu 运行 以及 后处理过程 + + results_show = np.zeros(hk_results[0].shape,dtype=np.int16) + results_show[0::2] = hk_results[0][0::2] * w_kp + x1_kp + results_show[1::2] = hk_results[0][1::2] * h_kp + y1_kp + + two_point[0] = results_show[8] + two_point[1] = results_show[9] + two_point[2] = results_show[16+8] + two_point[3] = results_show[16+9] + + if (first_start): + if (two_point[0] > 0 and two_point[0] < OUT_RGB888P_WIDTH and two_point[2] > 0 and two_point[2] < OUT_RGB888P_WIDTH and two_point[1] > 0 and two_point[1] < OUT_RGB888P_HEIGHT and two_point[3] > 0 and two_point[3] < OUT_RGB888P_HEIGHT): + two_point_mean_w = np.sqrt(pow(two_point[0] - two_point[2],2) + pow(two_point[1] - two_point[3],2))*0.8 + two_point_mean_h = np.sqrt(pow(two_point[0] - two_point[2],2) + pow(two_point[1] - two_point[3],2))*0.8 + first_start = False + else: + two_point_left_x = int(max((two_point[0] + two_point[2]) / 2 - two_point_mean_w / 2, 0)) + two_point_top_y = int(max((two_point[1] + two_point[3]) / 2 - two_point_mean_h / 2, 0)) + two_point_crop_w = int(min(min((two_point[0] + two_point[2]) / 2 - two_point_mean_w / 2 + two_point_mean_w , two_point_mean_w), OUT_RGB888P_WIDTH - ((two_point[0] + two_point[2]) / 2 - two_point_mean_w / 2))) + two_point_crop_h = int(min(min((two_point[1] + two_point[3]) / 2 - two_point_mean_h / 2 + two_point_mean_h , two_point_mean_h), OUT_RGB888P_HEIGHT - ((two_point[1] + two_point[3]) / 2 - two_point_mean_h / 2))) - if (h<(0.1*DISPLAY_HEIGHT)): - continue - if (w<(0.25*DISPLAY_WIDTH) and ((x1<(0.03*DISPLAY_WIDTH)) or (x2>(0.97*DISPLAY_WIDTH)))): - continue - if (w<(0.15*DISPLAY_WIDTH) and ((x1<(0.01*DISPLAY_WIDTH)) or (x2>(0.99*DISPLAY_WIDTH)))): - continue + ori_new_ratio = np.sqrt(pow((two_point[0] - two_point[2]),2) + pow((two_point[1] - two_point[3]),2))*0.8 / two_point_mean_w - length = max(w,h)/2 - cx = (x1+x2)/2 - cy = (y1+y2)/2 - ratio_num = 1.26*length + new_resize_w = min(int(two_point_crop_w * ori_new_ratio / OUT_RGB888P_WIDTH * DISPLAY_WIDTH),600) + new_resize_h = min(int(two_point_crop_h * ori_new_ratio / OUT_RGB888P_HEIGHT * DISPLAY_HEIGHT),600) - x1_kp = int(max(0,cx-ratio_num)) - y1_kp = int(max(0,cy-ratio_num)) - x2_kp = int(min(DISPLAY_WIDTH-1, cx+ratio_num)) - y2_kp = int(min(DISPLAY_HEIGHT-1, cy+ratio_num)) - w_kp = int(x2_kp - x1_kp + 1) - h_kp = int(y2_kp - y1_kp + 1) + rect_frame_x = int(two_point_left_x * 1.0 / OUT_RGB888P_WIDTH * DISPLAY_WIDTH) + rect_frame_y = int(two_point_top_y * 1.0 / OUT_RGB888P_HEIGHT * DISPLAY_HEIGHT) + + draw_w = min(new_resize_w,DISPLAY_WIDTH-rect_frame_x-1) + draw_h = min(new_resize_h,DISPLAY_HEIGHT-rect_frame_y-1) + + space_np_out = space_ai2d_run(rgb888p_img, two_point_left_x, two_point_top_y, two_point_crop_w, two_point_crop_h, new_resize_w, new_resize_h) # 运行 隔空缩放检测 ai2d + global masks + masks[rect_frame_y:rect_frame_y + draw_h,rect_frame_x:rect_frame_x + draw_w,3] = 255 + masks[rect_frame_y:rect_frame_y + draw_h,rect_frame_x:rect_frame_x + draw_w,0:3] = space_np_out[0][0:draw_h,0:draw_w,::-1] + space_ai2d_release(False) # 释放 隔空缩放检测 ai2d 相关对象 - hk_results = hk_kpu_run(kpu_hand_keypoint_detect,rgb888p_img, x1_kp, y1_kp, w_kp, h_kp) # 执行手掌关键点检测 kpu 运行 以及 后处理过程 - draw_img.draw_rectangle(x1, y1, w, h, color=(255, 0, 255, 0)) # 将得到的手掌检测结果 绘制到 display - display_draw(hk_results[0], x1_kp, y1_kp, w_kp, h_kp) # 将得到的手掌关键点检测结果 绘制到 display + draw_img.draw_rectangle(rect_frame_x, rect_frame_y, new_resize_w, new_resize_h, color=(255, 0, 255, 0),thickness = 4) + else: + draw_img.draw_string( 300 , 500, "Must have one hand !", color=(255,255,0,0), scale=7) + first_start = True camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - #gc.collect() - draw_img.copy_to(osd_img) - display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + + if (count > 5): + gc.collect() + count = 0 + else: + count += 1 + + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) except Exception as e: print(f"An error occurred during buffer used: {e}") finally: @@ -8752,22 +12768,23 @@ def hand_keypoint_detect_inference(): camera_stop(CAM_DEV_ID_0) # 停止 camera display_deinit() # 释放 display + space_ai2d_release(True) # 释放 隔空缩放检测 ai2d 相关对象 hd_kpu_deinit(kpu_hand_detect) # 释放手掌检测 kpu hk_kpu_deinit(kpu_hand_keypoint_detect) # 释放手掌关键点检测 kpu gc.collect() ret = media_deinit() # 释放 整个media if ret: - print("hand_detect_test, buffer_deinit failed") + print("space_resize, buffer_deinit failed") return ret - print("hand_detect_test end") + print("space_resize end") return 0 if __name__ == '__main__': - hand_keypoint_detect_inference() + space_resize_inference() ``` -### 9. 静态手势识别 +### 15.拼图游戏 ```python import aicube #aicube模块,封装检测分割等任务相关后处理 @@ -8782,6 +12799,7 @@ import time #时间统计 import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 import gc #垃圾回收模块 +import random ##config.py #display分辨率 @@ -8790,7 +12808,7 @@ DISPLAY_HEIGHT = 1080 ##ai原图分辨率输入 OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) -OUT_RGB888P_HEIGH = 1080 +OUT_RGB888P_HEIGHT = 1080 #--------for hand detection---------- #kmodel输入shape @@ -8800,24 +12818,25 @@ hd_kmodel_input_shape = (1,3,512,512) # 手掌检测km confidence_threshold = 0.2 # 手掌检测阈值,用于过滤roi nms_threshold = 0.5 # 手掌检测框阈值,用于过滤重复roi hd_kmodel_frame_size = [512,512] # 手掌检测输入图片尺寸 -hd_frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH] # 手掌检测直接输入图片尺寸 +hd_frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGHT] # 手掌检测直接输入图片尺寸 strides = [8,16,32] # 输出特征图的尺寸与输入图片尺寸的比 num_classes = 1 # 手掌检测模型输出类别数 nms_option = False # 是否所有检测框一起做NMS,False则按照不同的类分别应用NMS +level = 3 # 游戏级别 目前只支持设置为 3 + + root_dir = '/sdcard/app/tests/' -hd_kmodel_file = root_dir + 'kmodel/hand_det.kmodel' # 手掌检测kmodel文件的路径 +hd_kmodel_file = root_dir + "kmodel/hand_det.kmodel" # 手掌检测kmodel文件的路径 anchors = [26,27, 53,52, 75,71, 80,99, 106,82, 99,134, 140,113, 161,172, 245,276] #anchor设置 -#--------for hand recognition---------- +#--------for hand keypoint detection---------- #kmodel输入shape -hr_kmodel_input_shape = (1,3,224,224) # 手势识别kmodel输入分辨率 +hk_kmodel_input_shape = (1,3,256,256) # 手掌关键点检测kmodel输入分辨率 #kmodel相关参数设置 -hr_kmodel_frame_size = [224,224] # 手势识别输入图片尺寸 -labels = ["gun","other","yeah","five"] # 模型输出类别名称 - -hr_kmodel_file = root_dir + "kmodel/hand_reco.kmodel" # 手势识别kmodel文件的路径 +hk_kmodel_frame_size = [256,256] # 手掌关键点检测输入图片尺寸 +hk_kmodel_file = root_dir + 'kmodel/handkp_det.kmodel' # 手掌关键点检测kmodel文件的路径 debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) @@ -8840,10 +12859,11 @@ class ScopedTiming: #ai_utils.py global current_kmodel_obj # 定义全局的 kpu 对象 global hd_ai2d,hd_ai2d_input_tensor,hd_ai2d_output_tensor,hd_ai2d_builder # 定义手掌检测全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder -global hr_ai2d,hr_ai2d_input_tensor,hr_ai2d_output_tensor,hr_ai2d_builder # 定义手势识别全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder +global hk_ai2d,hk_ai2d_input_tensor,hk_ai2d_output_tensor,hk_ai2d_builder # 定义手掌关键点检测全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder + #-------hand detect--------: -# 手掌检测 ai2d 初始化 +# 手掌检测ai2d 初始化 def hd_ai2d_init(): with ScopedTiming("hd_ai2d_init",debug_mode > 0): global hd_ai2d @@ -8851,7 +12871,7 @@ def hd_ai2d_init(): global hd_ai2d_output_tensor # 计算padding值 ori_w = OUT_RGB888P_WIDTH - ori_h = OUT_RGB888P_HEIGH + ori_h = OUT_RGB888P_HEIGHT width = hd_kmodel_frame_size[0] height = hd_kmodel_frame_size[1] ratiow = float(width) / ori_w @@ -8876,14 +12896,14 @@ def hd_ai2d_init(): np.uint8, np.uint8) hd_ai2d.set_pad_param(True, [0,0,0,0,top,bottom,left,right], 0, [114,114,114]) hd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) - hd_ai2d_builder = hd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], [1,3,height,width]) + hd_ai2d_builder = hd_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,height,width]) data = np.ones(hd_kmodel_input_shape, dtype=np.uint8) hd_ai2d_output_tensor = nn.from_numpy(data) # 手掌检测 ai2d 运行 def hd_ai2d_run(rgb888p_img): with ScopedTiming("hd_ai2d_run",debug_mode > 0): - global hd_ai2d_input_tensor,hd_ai2d_output_tensor + global hd_ai2d_input_tensor,hd_ai2d_output_tensor,hd_ai2d_builder hd_ai2d_input = rgb888p_img.to_numpy_ref() hd_ai2d_input_tensor = nn.from_numpy(hd_ai2d_input) @@ -8933,7 +12953,7 @@ def hd_kpu_run(kpu_obj,rgb888p_img): current_kmodel_obj = kpu_obj # (1)原图预处理,并设置模型输入 hd_kpu_pre_process(rgb888p_img) - # (2)手掌检测 kpu 运行 + # (2)手掌检测 kpu 运行 with ScopedTiming("hd_kpu_run",debug_mode > 0): current_kmodel_obj.run() # (3)释放手掌检测 ai2d 资源 @@ -8948,64 +12968,66 @@ def hd_kpu_run(kpu_obj,rgb888p_img): # 手掌检测 kpu 释放内存 def hd_kpu_deinit(kpu_obj): with ScopedTiming("hd_kpu_deinit",debug_mode > 0): - global hd_ai2d, hd_ai2d_output_tensor + global hd_ai2d, hd_ai2d_output_tensor,hd_ai2d_builder del kpu_obj del hd_ai2d + del hd_ai2d_builder del hd_ai2d_output_tensor -#-------hand recognition--------: -# 手势识别 ai2d 初始化 -def hr_ai2d_init(): - with ScopedTiming("hr_ai2d_init",debug_mode > 0): - global hr_ai2d, hr_ai2d_output_tensor - hr_ai2d = nn.ai2d() - hr_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, +#-------hand keypoint detection------: +# 手掌关键点检测 ai2d 初始化 +def hk_ai2d_init(): + with ScopedTiming("hk_ai2d_init",debug_mode > 0): + global hk_ai2d, hk_ai2d_output_tensor + hk_ai2d = nn.ai2d() + hk_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) - data = np.ones(hr_kmodel_input_shape, dtype=np.uint8) - hr_ai2d_output_tensor = nn.from_numpy(data) + data = np.ones(hk_kmodel_input_shape, dtype=np.uint8) + hk_ai2d_output_tensor = nn.from_numpy(data) -# 手势识别 ai2d 运行 -def hr_ai2d_run(rgb888p_img, x, y, w, h): - with ScopedTiming("hr_ai2d_run",debug_mode > 0): - global hr_ai2d,hr_ai2d_input_tensor,hr_ai2d_output_tensor - hr_ai2d_input = rgb888p_img.to_numpy_ref() - hr_ai2d_input_tensor = nn.from_numpy(hr_ai2d_input) +# 手掌关键点检测 ai2d 运行 +def hk_ai2d_run(rgb888p_img, x, y, w, h): + with ScopedTiming("hk_ai2d_run",debug_mode > 0): + global hk_ai2d,hk_ai2d_input_tensor,hk_ai2d_output_tensor + hk_ai2d_input = rgb888p_img.to_numpy_ref() + hk_ai2d_input_tensor = nn.from_numpy(hk_ai2d_input) - hr_ai2d.set_crop_param(True, x, y, w, h) - hr_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) + hk_ai2d.set_crop_param(True, x, y, w, h) + hk_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) - global hr_ai2d_builder - hr_ai2d_builder = hr_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], [1,3,hr_kmodel_frame_size[1],hr_kmodel_frame_size[0]]) - hr_ai2d_builder.run(hr_ai2d_input_tensor, hr_ai2d_output_tensor) + global hk_ai2d_builder + hk_ai2d_builder = hk_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,hk_kmodel_frame_size[1],hk_kmodel_frame_size[0]]) + hk_ai2d_builder.run(hk_ai2d_input_tensor, hk_ai2d_output_tensor) -# 手势识别 ai2d 释放内存 -def hr_ai2d_release(): - with ScopedTiming("hr_ai2d_release",debug_mode > 0): - global hr_ai2d_input_tensor - del hr_ai2d_input_tensor +# 手掌关键点检测 ai2d 释放内存 +def hk_ai2d_release(): + with ScopedTiming("hk_ai2d_release",debug_mode > 0): + global hk_ai2d_input_tensor,hk_ai2d_builder + del hk_ai2d_input_tensor + del hk_ai2d_builder -# 手势识别 kpu 初始化 -def hr_kpu_init(hr_kmodel_file): +# 手掌关键点检测 kpu 初始化 +def hk_kpu_init(hk_kmodel_file): # init kpu and load kmodel - with ScopedTiming("hr_kpu_init",debug_mode > 0): - hr_kpu_obj = nn.kpu() - hr_kpu_obj.load_kmodel(hr_kmodel_file) + with ScopedTiming("hk_kpu_init",debug_mode > 0): + hk_kpu_obj = nn.kpu() + hk_kpu_obj.load_kmodel(hk_kmodel_file) - hr_ai2d_init() - return hr_kpu_obj + hk_ai2d_init() + return hk_kpu_obj -# 手势识别 kpu 输入预处理 -def hr_kpu_pre_process(rgb888p_img, x, y, w, h): - hr_ai2d_run(rgb888p_img, x, y, w, h) - with ScopedTiming("hr_kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,hr_ai2d_output_tensor +# 手掌关键点检测 kpu 输入预处理 +def hk_kpu_pre_process(rgb888p_img, x, y, w, h): + hk_ai2d_run(rgb888p_img, x, y, w, h) + with ScopedTiming("hk_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,hk_ai2d_output_tensor # set kpu input - current_kmodel_obj.set_input_tensor(0, hr_ai2d_output_tensor) + current_kmodel_obj.set_input_tensor(0, hk_ai2d_output_tensor) -# 手势识别 kpu 获得 kmodel 输出 -def hr_kpu_get_output(): - with ScopedTiming("hr_kpu_get_output",debug_mode > 0): +# 手掌关键点检测 kpu 获得 kmodel 输出 +def hk_kpu_get_output(): + with ScopedTiming("hk_kpu_get_output",debug_mode > 0): global current_kmodel_obj results = [] for i in range(current_kmodel_obj.outputs_size()): @@ -9018,44 +13040,71 @@ def hr_kpu_get_output(): results.append(tmp2) return results -# softmax实现 -def softmax(x): - x -= np.max(x) - x = np.exp(x) / np.sum(np.exp(x)) - return x - -# 手势识别 kpu 输出后处理 -def hr_kpu_post_process(results): - x_softmax = softmax(results[0]) - result = np.argmax(x_softmax) - text = " " + labels[result] + ": " + str(round(x_softmax[result],2)) - return text - -# 手势识别 kpu 运行 -def hr_kpu_run(kpu_obj,rgb888p_img, x, y, w, h): +# 手掌关键点检测 kpu 运行 +def hk_kpu_run(kpu_obj,rgb888p_img, x, y, w, h): global current_kmodel_obj current_kmodel_obj = kpu_obj # (1)原图预处理,并设置模型输入 - hr_kpu_pre_process(rgb888p_img, x, y, w, h) - # (2)手势识别 kpu 运行 - with ScopedTiming("hr_kpu_run",debug_mode > 0): + hk_kpu_pre_process(rgb888p_img, x, y, w, h) + # (2)手掌关键点检测 kpu 运行 + with ScopedTiming("hk_kpu_run",debug_mode > 0): current_kmodel_obj.run() - # (3)释放手势识别 ai2d 资源 - hr_ai2d_release() - # (4)获取手势识别 kpu 输出 - results = hr_kpu_get_output() - # (5)手势识别 kpu 结果后处理 - result = hr_kpu_post_process(results) - # (6)返回手势识别结果 - return result + # (3)释放手掌关键点检测 ai2d 资源 + hk_ai2d_release() + # (4)获取手掌关键点检测 kpu 输出 + results = hk_kpu_get_output() + # (5)返回手掌关键点检测结果 + return results -# 手势识别 kpu 释放内存 -def hr_kpu_deinit(kpu_obj): - with ScopedTiming("hr_kpu_deinit",debug_mode > 0): - global hr_ai2d, hr_ai2d_output_tensor +# 手掌关键点检测 kpu 释放内存 +def hk_kpu_deinit(kpu_obj): + with ScopedTiming("hk_kpu_deinit",debug_mode > 0): + global hk_ai2d, hk_ai2d_output_tensor del kpu_obj - del hr_ai2d - del hr_ai2d_output_tensor + del hk_ai2d + del hk_ai2d_output_tensor + +# 隔空缩放剪切 ai2d 初始化 +def space_ai2d_init(): + with ScopedTiming("space_ai2d_init",debug_mode > 0): + global space_ai2d + space_ai2d = nn.ai2d() + space_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.RGB_packed, + np.uint8, np.uint8) + +# 隔空缩放剪切 ai2d 运行 +def space_ai2d_run(rgb888p_img, x, y, w, h, out_w, out_h): + with ScopedTiming("space_ai2d_run",debug_mode > 0): + global space_ai2d,space_ai2d_input_tensor,space_ai2d_output_tensor,space_draw_ai2d_release + space_draw_ai2d_release = True + space_ai2d_input = rgb888p_img.to_numpy_ref() + space_ai2d_input_tensor = nn.from_numpy(space_ai2d_input) + + space_ai2d.set_crop_param(True, x, y, w, h) + space_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) + + data = np.ones((1,out_h, out_w,3), dtype=np.uint8) + space_ai2d_output_tensor = nn.from_numpy(data) + + global space_ai2d_builder + space_ai2d_builder = space_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,out_h, out_w,3]) + space_ai2d_builder.run(space_ai2d_input_tensor, space_ai2d_output_tensor) + + space_np_out = space_ai2d_output_tensor.to_numpy() + return space_np_out + +# 隔空缩放剪切 ai2d 释放内存 +def space_ai2d_release(re_ai2d): + with ScopedTiming("space_ai2d_release",debug_mode > 0): + global space_ai2d_input_tensor,space_ai2d_output_tensor,space_ai2d_builder,space_draw_ai2d_release,space_ai2d + if (space_draw_ai2d_release): + del space_ai2d_input_tensor + del space_ai2d_output_tensor + del space_ai2d_builder + space_draw_ai2d_release = False + if (re_ai2d): + del space_ai2d #media_utils.py global draw_img,osd_img,masks #for display 定义全局 作图image对象 @@ -9080,7 +13129,7 @@ def camera_init(dev_id): camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) # set chn2 output rgb88planar - camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) # camera 开启 @@ -9121,10 +13170,11 @@ def media_init(): ret = media.buffer_init() if ret: return ret - global buffer, draw_img, osd_img + global buffer, draw_img, osd_img, masks buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) # 图层1,用于画框 - draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_MPGC) + masks = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888,alloc=image.ALLOC_REF,data=masks) # 图层2,用于拷贝画框结果,防止画框过程中发生buffer搬运 osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) @@ -9139,11 +13189,11 @@ def media_deinit(): ret = media.buffer_deinit() return ret -#**********for hand_recognition.py********** -def hand_recognition_inference(): - print("hand_recognition start") +#**********for puzzle_game.py********** +def puzzle_game_inference(): + print("puzzle_game_inference start") kpu_hand_detect = hd_kpu_init(hd_kmodel_file) # 创建手掌检测的 kpu 对象 - kpu_hand_recognition = hr_kpu_init(hr_kmodel_file) # 创建手势识别的 kpu 对象 + kpu_hand_keypoint_detect = hk_kpu_init(hk_kmodel_file) # 创建手掌关键点检测的 kpu 对象 camera_init(CAM_DEV_ID_0) # 初始化 camera display_init() # 初始化 display @@ -9151,61 +13201,179 @@ def hand_recognition_inference(): try: ret = media_init() if ret: - print("hand_recognition_test, buffer init failed") + print("puzzle_game_inference, buffer init failed") return ret camera_start(CAM_DEV_ID_0) + + global draw_img,osd_img + puzzle_width = DISPLAY_HEIGHT # 设定 拼图宽 + puzzle_height = DISPLAY_HEIGHT # 设定 拼图高 + puzzle_ori_width = DISPLAY_WIDTH - puzzle_width - 50 # 设定 原始拼图宽 + puzzle_ori_height = DISPLAY_WIDTH - puzzle_height - 50 # 设定 原始拼图高 + + every_block_width = int(puzzle_width/level) # 设定 拼图块宽 + every_block_height = int(puzzle_height/level) # 设定 拼图块高 + ori_every_block_width = int(puzzle_ori_width/level) # 设定 原始拼图宽 + ori_every_block_height = int(puzzle_ori_height/level) # 设定 原始拼图高 + ratio_num = every_block_width/360.0 # 字体比例 + blank_x = 0 # 空白块 角点x + blank_y = 0 # 空白块 角点y + direction_vec = [-1,1,-1,1] # 空白块四种移动方向 + + exact_division_x = 0 # 交换块 角点x + exact_division_y = 0 # 交换块 角点y + distance_tow_points = DISPLAY_WIDTH # 两手指距离 + distance_thred = every_block_width*0.4 # 两手指距离阈值 + + move_mat = np.zeros((every_block_height,every_block_width,4),dtype=np.uint8) + + osd_frame_tmp = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) + osd_frame_tmp_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888,alloc=image.ALLOC_REF,data=osd_frame_tmp) + osd_frame_tmp[0:puzzle_height,0:puzzle_width,3] = 127 + osd_frame_tmp[0:puzzle_height,0:puzzle_width,2] = 130 + osd_frame_tmp[0:puzzle_height,0:puzzle_width,1] = 150 + osd_frame_tmp[0:puzzle_height,0:puzzle_width,0] = 100 + osd_frame_tmp[(1080-puzzle_ori_height)//2:(1080-puzzle_ori_height)//2+puzzle_ori_width,puzzle_width+25:puzzle_width+25+puzzle_ori_height,3] = 127 + osd_frame_tmp[(1080-puzzle_ori_height)//2:(1080-puzzle_ori_height)//2+puzzle_ori_width,puzzle_width+25:puzzle_width+25+puzzle_ori_height,2] = 130 + osd_frame_tmp[(1080-puzzle_ori_height)//2:(1080-puzzle_ori_height)//2+puzzle_ori_width,puzzle_width+25:puzzle_width+25+puzzle_ori_height,1] = 150 + osd_frame_tmp[(1080-puzzle_ori_height)//2:(1080-puzzle_ori_height)//2+puzzle_ori_width,puzzle_width+25:puzzle_width+25+puzzle_ori_height,0] = 100 + for i in range(level*level): + osd_frame_tmp_img.draw_rectangle((i%level)*every_block_width,(i//level)*every_block_height,every_block_width,every_block_height,(255,0,0,0),5) + osd_frame_tmp_img.draw_string((i%level)*every_block_width + 55,(i//level)*every_block_height + 45,str(i),(255,0,0,255),30*ratio_num) + osd_frame_tmp_img.draw_rectangle(puzzle_width+25 + (i%level)*ori_every_block_width,(1080-puzzle_ori_height)//2 + (i//level)*ori_every_block_height,ori_every_block_width,ori_every_block_height,(255,0,0,0),5) + osd_frame_tmp_img.draw_string(puzzle_width+25 + (i%level)*ori_every_block_width + 50,(1080-puzzle_ori_height)//2 + (i//level)*ori_every_block_height + 25,str(i),(255,0,0,255),20*ratio_num) + osd_frame_tmp[0:every_block_height,0:every_block_width,3] = 220 + osd_frame_tmp[0:every_block_height,0:every_block_width,2] = 114 + osd_frame_tmp[0:every_block_height,0:every_block_width,1] = 114 + osd_frame_tmp[0:every_block_height,0:every_block_width,0] = 114 + + for i in range(level*10): + k230_random = int(random.random() * 100) % 4 + blank_x_tmp = blank_x + blank_y_tmp = blank_y + if (k230_random < 2): + blank_x_tmp = blank_x + direction_vec[k230_random] + else: + blank_y_tmp = blank_y + direction_vec[k230_random] + + if ((blank_x_tmp >= 0 and blank_x_tmp < level) and (blank_y_tmp >= 0 and blank_y_tmp < level) and (abs(blank_x - blank_x_tmp) <= 1 and abs(blank_y - blank_y_tmp) <= 1)): + move_rect = [blank_x_tmp*every_block_width,blank_y_tmp*every_block_height,every_block_width,every_block_height] + blank_rect = [blank_x*every_block_width,blank_y*every_block_height,every_block_width,every_block_height] + + move_mat[:] = osd_frame_tmp[move_rect[1]:move_rect[1]+move_rect[3],move_rect[0]:move_rect[0]+move_rect[2],:] + osd_frame_tmp[move_rect[1]:move_rect[1]+move_rect[3],move_rect[0]:move_rect[0]+move_rect[2],:] = osd_frame_tmp[blank_rect[1]:blank_rect[1]+blank_rect[3],blank_rect[0]:blank_rect[0]+blank_rect[2],:] + osd_frame_tmp[blank_rect[1]:blank_rect[1]+blank_rect[3],blank_rect[0]:blank_rect[0]+blank_rect[2],:] = move_mat[:] + + blank_x = blank_x_tmp + blank_y = blank_y_tmp + + count = 0 while True: with ScopedTiming("total",1): rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 if rgb888p_img == -1: - print("hand_recognition_test, capture_image failed") + print("puzzle_game_inference, capture_image failed") camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None continue # for rgb888planar if rgb888p_img.format() == image.RGBP888: - dets = hd_kpu_run(kpu_hand_detect,rgb888p_img) # 执行手掌检测 kpu 运行 以及 后处理过程 + two_point = np.zeros((4),dtype=np.int16) + dets_no_pro = hd_kpu_run(kpu_hand_detect,rgb888p_img) # 执行手掌检测 kpu 运行 以及 后处理过程 draw_img.clear() - for det_box in dets: - x1, y1, x2, y2 = det_box[2],det_box[3],det_box[4],det_box[5] - w = int(float(x2 - x1) * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - h = int(float(y2 - y1) * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) - - x1 = int(x1 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - y1 = int(y1 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) - x2 = int(x2 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) - y2 = int(y2 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH) - - if (h<(0.1*DISPLAY_HEIGHT)): - continue - if (w<(0.25*DISPLAY_WIDTH) and ((x1<(0.03*DISPLAY_WIDTH)) or (x2>(0.97*DISPLAY_WIDTH)))): - continue - if (w<(0.15*DISPLAY_WIDTH) and ((x1<(0.01*DISPLAY_WIDTH)) or (x2>(0.99*DISPLAY_WIDTH)))): - continue - - length = max(w,h)/2 - cx = (x1+x2)/2 - cy = (y1+y2)/2 - ratio_num = 1.1*length + osd_frame_tmp_img.copy_to(draw_img) - x1_kp = int(max(0,cx-ratio_num)) - y1_kp = int(max(0,cy-ratio_num)) - x2_kp = int(min(DISPLAY_WIDTH-1, cx+ratio_num)) - y2_kp = int(min(DISPLAY_HEIGHT-1, cy+ratio_num)) - w_kp = int(x2_kp - x1_kp + 1) - h_kp = int(y2_kp - y1_kp + 1) + dets = [] + for det_box in dets_no_pro: + if det_box[4] < OUT_RGB888P_WIDTH - 10 : + dets.append(det_box) - hr_results = hr_kpu_run(kpu_hand_recognition,rgb888p_img, x1_kp, y1_kp, w_kp, h_kp) # 执行手势识别 kpu 运行 以及 后处理过程 + if (len(dets)==1): + for det_box in dets: + x1, y1, x2, y2 = int(det_box[2]),int(det_box[3]),int(det_box[4]),int(det_box[5]) + w = int(x2 - x1) + h = int(y2 - y1) + + if (h<(0.1*OUT_RGB888P_HEIGHT)): + continue + if (w<(0.25*OUT_RGB888P_WIDTH) and ((x1<(0.03*OUT_RGB888P_WIDTH)) or (x2>(0.97*OUT_RGB888P_WIDTH)))): + continue + if (w<(0.15*OUT_RGB888P_WIDTH) and ((x1<(0.01*OUT_RGB888P_WIDTH)) or (x2>(0.99*OUT_RGB888P_WIDTH)))): + continue + + length = max(w,h)/2 + cx = (x1+x2)/2 + cy = (y1+y2)/2 + ratio_num = 1.26*length + + x1_kp = int(max(0,cx-ratio_num)) + y1_kp = int(max(0,cy-ratio_num)) + x2_kp = int(min(OUT_RGB888P_WIDTH-1, cx+ratio_num)) + y2_kp = int(min(OUT_RGB888P_HEIGHT-1, cy+ratio_num)) + w_kp = int(x2_kp - x1_kp + 1) + h_kp = int(y2_kp - y1_kp + 1) + + hk_results = hk_kpu_run(kpu_hand_keypoint_detect,rgb888p_img, x1_kp, y1_kp, w_kp, h_kp) # 执行手掌关键点检测 kpu 运行 以及 后处理过程 + + results_show = np.zeros(hk_results[0].shape,dtype=np.int16) + results_show[0::2] = (hk_results[0][0::2] * w_kp + x1_kp) #* DISPLAY_WIDTH // OUT_RGB888P_WIDTH + results_show[1::2] = (hk_results[0][1::2] * h_kp + y1_kp) #* DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT + + two_point[0] = results_show[8+8] + two_point[1] = results_show[8+9] + two_point[2] = results_show[16+8] + two_point[3] = results_show[16+9] + + if (two_point[1] <= OUT_RGB888P_WIDTH): + distance_tow_points = np.sqrt(pow((two_point[0]-two_point[2]),2) + pow((two_point[1] - two_point[3]),2))* 1.0 / OUT_RGB888P_WIDTH * DISPLAY_WIDTH + exact_division_x = int((two_point[0] * 1.0 / OUT_RGB888P_WIDTH * DISPLAY_WIDTH)//every_block_width) + exact_division_y = int((two_point[1] * 1.0 / OUT_RGB888P_HEIGHT * DISPLAY_HEIGHT)//every_block_height) + + + if (distance_tow_points < distance_thred and exact_division_x >= 0 and exact_division_x < level and exact_division_y >= 0 and exact_division_y < level): + if (abs(blank_x - exact_division_x) == 1 and abs(blank_y - exact_division_y) == 0): + move_rect = [exact_division_x*every_block_width,exact_division_y*every_block_height,every_block_width,every_block_height] + blank_rect = [blank_x*every_block_width,blank_y*every_block_height,every_block_width,every_block_height] + + move_mat[:] = osd_frame_tmp[move_rect[1]:move_rect[1]+move_rect[3],move_rect[0]:move_rect[0]+move_rect[2],:] + osd_frame_tmp[move_rect[1]:move_rect[1]+move_rect[3],move_rect[0]:move_rect[0]+move_rect[2],:] = osd_frame_tmp[blank_rect[1]:blank_rect[1]+blank_rect[3],blank_rect[0]:blank_rect[0]+blank_rect[2],:] + osd_frame_tmp[blank_rect[1]:blank_rect[1]+blank_rect[3],blank_rect[0]:blank_rect[0]+blank_rect[2],:] = move_mat[:] + + blank_x = exact_division_x + elif (abs(blank_y - exact_division_y) == 1 and abs(blank_x - exact_division_x) == 0): + move_rect = [exact_division_x*every_block_width,exact_division_y*every_block_height,every_block_width,every_block_height] + blank_rect = [blank_x*every_block_width,blank_y*every_block_height,every_block_width,every_block_height] + + move_mat[:] = osd_frame_tmp[move_rect[1]:move_rect[1]+move_rect[3],move_rect[0]:move_rect[0]+move_rect[2],:] + osd_frame_tmp[move_rect[1]:move_rect[1]+move_rect[3],move_rect[0]:move_rect[0]+move_rect[2],:] = osd_frame_tmp[blank_rect[1]:blank_rect[1]+blank_rect[3],blank_rect[0]:blank_rect[0]+blank_rect[2],:] + osd_frame_tmp[blank_rect[1]:blank_rect[1]+blank_rect[3],blank_rect[0]:blank_rect[0]+blank_rect[2],:] = move_mat[:] + + blank_y = exact_division_y + + osd_frame_tmp_img.copy_to(draw_img) + x1 = int(two_point[0] * 1.0 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) + y1 = int(two_point[1] * 1.0 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) + draw_img.draw_circle(x1, y1, 1, color=(255, 0, 255, 255),thickness=4,fill=False) + else: + osd_frame_tmp_img.copy_to(draw_img) + x1 = int(two_point[0] * 1.0 * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) + y1 = int(two_point[1] * 1.0 * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) + draw_img.draw_circle(x1, y1, 1, color=(255, 255, 255, 0),thickness=4,fill=False) + else: + draw_img.draw_string( 300 , 500, "Must have one hand !", color=(255,255,0,0), scale=7) + first_start = True + camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 + rgb888p_img = None - draw_img.draw_rectangle(x1, y1, w, h, color=(255, 0, 255, 0)) # 将得到的检测结果 绘制到 display - draw_img.draw_string( x1 , y1-50, hr_results, color=(255,0, 255, 0), scale=4) # 将得到的识别结果 绘制到 display + if (count > 5): + gc.collect() + count = 0 + else: + count += 1 - camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 - rgb888p_img = None - #gc.collect() draw_img.copy_to(osd_img) display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) except Exception as e: @@ -9218,491 +13386,399 @@ def hand_recognition_inference(): camera_stop(CAM_DEV_ID_0) # 停止 camera display_deinit() # 释放 display hd_kpu_deinit(kpu_hand_detect) # 释放手掌检测 kpu - hr_kpu_deinit(kpu_hand_recognition) # 释放手势识别 kpu + hk_kpu_deinit(kpu_hand_keypoint_detect) # 释放手掌关键点检测 kpu gc.collect() ret = media_deinit() # 释放 整个media if ret: - print("hand_recognition_test, buffer_deinit failed") + print("puzzle_game_inference, buffer_deinit failed") return ret - print("hand_recognition_test end") + print("puzzle_game_inference end") return 0 if __name__ == '__main__': - hand_recognition_inference() + puzzle_game_inference() ``` -### 10.人脸mesh +### 16.基于关键点的手势识别 ```python -import ulab.numpy as np # 类似python numpy操作,但也会有一些接口不同 -import nncase_runtime as nn # nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 -from media.camera import * # 摄像头模块 -from media.display import * # 显示模块 -from media.media import * # 软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 -import aidemo # aidemo模块,封装ai demo相关后处理、画图操作 -import image # 图像模块,主要用于读取、图像绘制元素(框、点等)等操作 -import time # 时间统计 -import gc # 垃圾回收模块 -import os # 操作系统接口模块 -import math # 数学模块 +import aicube #aicube模块,封装检测分割等任务相关后处理 +from media.camera import * #摄像头模块 +from media.display import * #显示模块 +from media.media import * #软件抽象模块,主要封装媒体数据链路以及媒体缓冲区 +import nncase_runtime as nn #nncase运行模块,封装了kpu(kmodel推理)和ai2d(图片预处理加速)操作 +import ulab.numpy as np #类似python numpy操作,但也会有一些接口不同 -#********************for config.py******************** -# display分辨率 -DISPLAY_WIDTH = ALIGN_UP(1920, 16) # 显示宽度要求16位对齐 -DISPLAY_HEIGHT = 1080 +import time #时间统计 +import image #图像模块,主要用于读取、图像绘制元素(框、点等)等操作 -# ai原图分辨率,sensor默认出图为16:9,若需不形变原图,最好按照16:9比例设置宽高 -OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) # ai原图宽度要求16位对齐 -OUT_RGB888P_HEIGH = 1080 +import gc #垃圾回收模块 -# kmodel参数设置 -# 人脸检测kmodel输入shape -fd_kmodel_input_shape = (1,3,320,320) -# 人脸mesh kmodel输入shape -fm_kmodel_input_shape = (1,3,120,120) -fmpost_kmodel_input_shapes = [(3,3),(3,1),(40,1),(10,1)] -# ai原图padding -rgb_mean = [104,117,123] +##config.py +#display分辨率 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 -#人脸检测kmodel其它参数设置 -confidence_threshold = 0.5 # 人脸检测阈值 -top_k = 5000 -nms_threshold = 0.2 -keep_top_k = 750 -vis_thres = 0.5 -variance = [0.1, 0.2] -anchor_len = 4200 -score_dim = 2 -det_dim = 4 -keypoint_dim = 10 +##ai原图分辨率输入 +OUT_RGB888P_WIDTH = ALIGN_UP(1920, 16) +OUT_RGB888P_HEIGHT = 1080 -# 文件配置 -# 人脸检测kmodel root_dir = '/sdcard/app/tests/' -fd_kmodel_file = root_dir + 'kmodel/face_detection_320.kmodel' -# 人脸mesh kmodel -fm_kmodel_file = root_dir + 'kmodel/face_alignment.kmodel' -# 人脸mesh后处理kmodel -fmpost_kmodel_file = root_dir + 'kmodel/face_alignment_post.kmodel' -# anchor文件 -anchors_path = root_dir + 'utils/prior_data_320.bin' -# 人脸mesh参数均值 -param_mean = np.array([0.0003492636315058917,2.52790130161884e-07,-6.875197868794203e-07,60.1679573059082,-6.295513230725192e-07,0.0005757200415246189,-5.085391239845194e-05,74.2781982421875,5.400917189035681e-07,6.574138387804851e-05,0.0003442012530285865,-66.67157745361328,-346603.6875,-67468.234375,46822.265625,-15262.046875,4350.5888671875,-54261.453125,-18328.033203125,-1584.328857421875,-84566.34375,3835.960693359375,-20811.361328125,38094.9296875,-19967.85546875,-9241.3701171875,-19600.71484375,13168.08984375,-5259.14404296875,1848.6478271484375,-13030.662109375,-2435.55615234375,-2254.20654296875,-14396.5615234375,-6176.3291015625,-25621.919921875,226.39447021484375,-6326.12353515625,-10867.2509765625,868.465087890625,-5831.14794921875,2705.123779296875,-3629.417724609375,2043.9901123046875,-2446.6162109375,3658.697021484375,-7645.98974609375,-6674.45263671875,116.38838958740234,7185.59716796875,-1429.48681640625,2617.366455078125,-1.2070955038070679,0.6690792441368103,-0.17760828137397766,0.056725528091192245,0.03967815637588501,-0.13586315512657166,-0.09223993122577667,-0.1726071834564209,-0.015804484486579895,-0.1416848599910736],dtype=np.float) -# 人脸mesh参数方差 -param_std = np.array([0.00017632152594160289,6.737943476764485e-05,0.00044708489440381527,26.55023193359375,0.0001231376954820007,4.493021697271615e-05,7.923670636955649e-05,6.982563018798828,0.0004350444069132209,0.00012314890045672655,0.00017400001524947584,20.80303955078125,575421.125,277649.0625,258336.84375,255163.125,150994.375,160086.109375,111277.3046875,97311.78125,117198.453125,89317.3671875,88493.5546875,72229.9296875,71080.2109375,50013.953125,55968.58203125,47525.50390625,49515.06640625,38161.48046875,44872.05859375,46273.23828125,38116.76953125,28191.162109375,32191.4375,36006.171875,32559.892578125,25551.1171875,24267.509765625,27521.3984375,23166.53125,21101.576171875,19412.32421875,19452.203125,17454.984375,22537.623046875,16174.28125,14671.640625,15115.6884765625,13870.0732421875,13746.3125,12663.1337890625,1.5870834589004517,1.5077009201049805,0.5881357789039612,0.5889744758605957,0.21327851712703705,0.2630201280117035,0.2796429395675659,0.38030216097831726,0.16162841022014618,0.2559692859649658],dtype=np.float) -# 调试模型,0:不调试,>0:打印对应级别调试信息 -debug_mode = 0 - -#********************for scoped_timing.py******************** -# 时间统计类 -class ScopedTiming: - def __init__(self, info="", enable_profile=True): - self.info = info - self.enable_profile = enable_profile - - def __enter__(self): - if self.enable_profile: - self.start_time = time.time_ns() - return self - - def __exit__(self, exc_type, exc_value, traceback): - if self.enable_profile: - elapsed_time = time.time_ns() - self.start_time - print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") - -#********************for ai_utils.py******************** -global current_kmodel_obj #当前kpu对象 -# fd_ai2d: 人脸检测ai2d实例 -# fd_ai2d_input_tensor: 人脸检测ai2d输入 -# fd_ai2d_output_tensor: 人脸检测ai2d输入 -# fd_ai2d_builder: 根据人脸检测ai2d参数,构建的人脸检测ai2d_builder对象 -global fd_ai2d,fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder -# fm_ai2d: 人脸mesh ai2d实例 -# fm_ai2d_input_tensor: 人脸mesh ai2d输入 -# fm_ai2d_output_tensor:人脸mesh ai2d输入 -# fm_ai2d_builder: 根据人脸mesh ai2d参数,构建的人脸mesh ai2d_builder对象 -global fm_ai2d,fm_ai2d_input_tensor,fm_ai2d_output_tensor,fm_ai2d_builder -global roi #人脸区域 -global vertices #3D关键点 - -#读取anchor文件,为人脸检测后处理做准备 -print('anchors_path:',anchors_path) -prior_data = np.fromfile(anchors_path, dtype=np.float) -prior_data = prior_data.reshape((anchor_len,det_dim)) - -def get_pad_one_side_param(): - # 右padding或下padding,获取padding参数 - dst_w = fd_kmodel_input_shape[3] # kmodel输入宽(w) - dst_h = fd_kmodel_input_shape[2] # kmodel输入高(h) - - # OUT_RGB888P_WIDTH:原图宽(w) - # OUT_RGB888P_HEIGH:原图高(h) - # 计算最小的缩放比例,等比例缩放 - ratio_w = dst_w / OUT_RGB888P_WIDTH - ratio_h = dst_h / OUT_RGB888P_HEIGH - if ratio_w < ratio_h: - ratio = ratio_w - else: - ratio = ratio_h - # 计算经过缩放后的新宽和新高 - new_w = (int)(ratio * OUT_RGB888P_WIDTH) - new_h = (int)(ratio * OUT_RGB888P_HEIGH) - - # 计算需要添加的padding,以使得kmodel输入的宽高和原图一致 - dw = (dst_w - new_w) / 2 - dh = (dst_h - new_h) / 2 - # 四舍五入,确保padding是整数 - top = (int)(round(0)) - bottom = (int)(round(dh * 2 + 0.1)) - left = (int)(round(0)) - right = (int)(round(dw * 2 - 0.1)) - return [0, 0, 0, 0, top, bottom, left, right] - -def fd_ai2d_init(): - # 人脸检测模型ai2d初始化 - with ScopedTiming("fd_ai2d_init",debug_mode > 0): - # (1)创建人脸检测ai2d对象 - global fd_ai2d - fd_ai2d = nn.ai2d() - # (2)设置人脸检测ai2d参数 - fd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, - nn.ai2d_format.NCHW_FMT, - np.uint8, np.uint8) - fd_ai2d.set_pad_param(True, get_pad_one_side_param(), 0, rgb_mean) - fd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) - - #(3)人脸检测ai2d_builder,根据人脸检测ai2d参数、输入输出大小创建ai2d_builder对象 - global fd_ai2d_builder - fd_ai2d_builder = fd_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fd_kmodel_input_shape) - - #(4)创建人脸检测ai2d_output_tensor,用于保存人脸检测ai2d输出 - global fd_ai2d_output_tensor - data = np.ones(fd_kmodel_input_shape, dtype=np.uint8) - fd_ai2d_output_tensor = nn.from_numpy(data) - -def fd_ai2d_run(rgb888p_img): - # 根据人脸检测ai2d参数,对原图rgb888p_img进行预处理 - with ScopedTiming("fd_ai2d_run",debug_mode > 0): - global fd_ai2d_input_tensor,fd_ai2d_output_tensor,fd_ai2d_builder - # (1)根据原图构建ai2d_input_tensor对象 - ai2d_input = rgb888p_img.to_numpy_ref() - fd_ai2d_input_tensor = nn.from_numpy(ai2d_input) - # (2)运行人脸检测ai2d_builder,将结果保存到人脸检测ai2d_output_tensor中 - fd_ai2d_builder.run(fd_ai2d_input_tensor, fd_ai2d_output_tensor) - -def fd_ai2d_release(): - # 释放人脸检测ai2d_input_tensor - with ScopedTiming("fd_ai2d_release",debug_mode > 0): - global fd_ai2d_input_tensor - del fd_ai2d_input_tensor - -def fd_kpu_init(kmodel_file): - # 初始化人脸检测kpu对象,并加载kmodel - with ScopedTiming("fd_kpu_init",debug_mode > 0): - # 初始化人脸检测kpu对象 - kpu_obj = nn.kpu() - # 加载人脸检测kmodel - kpu_obj.load_kmodel(kmodel_file) - # 初始化人脸检测ai2d - fd_ai2d_init() - return kpu_obj - -def fd_kpu_pre_process(rgb888p_img): - # 设置人脸检测kpu输入 - # 使用人脸检测ai2d对原图进行预处理(padding,resize) - fd_ai2d_run(rgb888p_img) - with ScopedTiming("fd_kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,fd_ai2d_output_tensor - # 设置人脸检测kpu输入 - current_kmodel_obj.set_input_tensor(0, fd_ai2d_output_tensor) -def fd_kpu_get_output(): - # 获取人脸检测kpu输出 - with ScopedTiming("fd_kpu_get_output",debug_mode > 0): - global current_kmodel_obj - # 获取模型输出,并将结果转换为numpy,以便进行人脸检测后处理 - results = [] - for i in range(current_kmodel_obj.outputs_size()): - data = current_kmodel_obj.get_output_tensor(i) - result = data.to_numpy() - del data - results.append(result) - return results +#--------for hand detection---------- +#kmodel输入shape +hd_kmodel_input_shape = (1,3,512,512) # 手掌检测kmodel输入分辨率 -def fd_kpu_run(kpu_obj,rgb888p_img): - global current_kmodel_obj - current_kmodel_obj = kpu_obj - # (1)原图预处理,并设置模型输入 - fd_kpu_pre_process(rgb888p_img) - # (2)人脸检测kpu推理 - with ScopedTiming("fd kpu_run",debug_mode > 0): - kpu_obj.run() - # (3)释放人脸检测ai2d资源 - fd_ai2d_release() - # (4)获取人俩检测kpu输出 - results = fd_kpu_get_output() - # (5)人脸检测kpu结果后处理 - with ScopedTiming("fd kpu_post",debug_mode > 0): - post_ret = aidemo.face_det_post_process(confidence_threshold,nms_threshold,fd_kmodel_input_shape[2],prior_data, - [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGH],results) - # (6)返回人脸检测框 - if len(post_ret)==0: - return post_ret - else: - return post_ret[0] #0:det,1:landm,2:score +#kmodel相关参数设置 +confidence_threshold = 0.2 # 手掌检测阈值,用于过滤roi +nms_threshold = 0.5 # 手掌检测框阈值,用于过滤重复roi +hd_kmodel_frame_size = [512,512] # 手掌检测输入图片尺寸 +hd_frame_size = [OUT_RGB888P_WIDTH,OUT_RGB888P_HEIGHT] # 手掌检测直接输入图片尺寸 +strides = [8,16,32] # 输出特征图的尺寸与输入图片尺寸的比 +num_classes = 1 # 手掌检测模型输出类别数 +nms_option = False # 是否所有检测框一起做NMS,False则按照不同的类分别应用NMS + +hd_kmodel_file = root_dir + 'kmodel/hand_det.kmodel' # 手掌检测kmodel文件的路径 +anchors = [26,27, 53,52, 75,71, 80,99, 106,82, 99,134, 140,113, 161,172, 245,276] #anchor设置 -def fd_kpu_deinit(kpu_obj): - # kpu释放 - with ScopedTiming("fd_kpu_deinit",debug_mode > 0): - global fd_ai2d, fd_ai2d_output_tensor - del kpu_obj #删除人脸检测kpu_obj变量,释放对它所引用对象的内存引用 - del fd_ai2d #删除人脸检测ai2d变量,释放对它所引用对象的内存引用 - del fd_ai2d_output_tensor #删除人脸检测ai2d_output_tensor变量,释放对它所引用对象的内存引用 +#--------for hand keypoint detection---------- +#kmodel输入shape +hk_kmodel_input_shape = (1,3,256,256) # 手掌关键点检测kmodel输入分辨率 -###############for face recognition############### -def parse_roi_box_from_bbox(bbox): - # 获取人脸roi - x1, y1, w, h = map(lambda x: int(round(x, 0)), bbox[:4]) - old_size = (w + h) / 2 - center_x = x1 + w / 2 - center_y = y1 + h / 2 + old_size * 0.14 - size = int(old_size * 1.58) +#kmodel相关参数设置 +hk_kmodel_frame_size = [256,256] # 手掌关键点检测输入图片尺寸 +hk_kmodel_file = root_dir + 'kmodel/handkp_det.kmodel' # 手掌关键点检测kmodel文件的路径 - x0 = center_x - float(size) / 2 - y0 = center_y - float(size) / 2 - x1 = x0 + size - y1 = y0 + size +debug_mode = 0 # debug模式 大于0(调试)、 反之 (不调试) - x0 = max(0, min(x0, OUT_RGB888P_WIDTH)) - y0 = max(0, min(y0, OUT_RGB888P_HEIGH)) - x1 = max(0, min(x1, OUT_RGB888P_WIDTH)) - y1 = max(0, min(y1, OUT_RGB888P_HEIGH)) +#scoped_timing.py 用于debug模式输出程序块运行时间 +class ScopedTiming: + def __init__(self, info="", enable_profile=True): + self.info = info + self.enable_profile = enable_profile - roi = (x0, y0, x1 - x0, y1 - y0) - return roi + def __enter__(self): + if self.enable_profile: + self.start_time = time.time_ns() + return self -def fm_ai2d_init(): - # 人脸mesh ai2d初始化 - with ScopedTiming("fm_ai2d_init",debug_mode > 0): - # (1)创建人脸mesh ai2d对象 - global fm_ai2d - fm_ai2d = nn.ai2d() + def __exit__(self, exc_type, exc_value, traceback): + if self.enable_profile: + elapsed_time = time.time_ns() - self.start_time + print(f"{self.info} took {elapsed_time / 1000000:.2f} ms") - # (2)创建人脸mesh ai2d_output_tensor对象,用于存放ai2d输出 - global fm_ai2d_output_tensor - data = np.ones(fm_kmodel_input_shape, dtype=np.uint8) - fm_ai2d_output_tensor = nn.from_numpy(data) +#ai_utils.py +global current_kmodel_obj # 定义全局的 kpu 对象 +global hd_ai2d,hd_ai2d_input_tensor,hd_ai2d_output_tensor,hd_ai2d_builder # 定义手掌检测全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder +global hk_ai2d,hk_ai2d_input_tensor,hk_ai2d_output_tensor,hk_ai2d_builder # 定义手掌关键点检测全局 ai2d 对象,并且定义 ai2d 的输入、输出 以及 builder -def fm_ai2d_run(rgb888p_img,det): - # 人脸mesh ai2d推理 - with ScopedTiming("fm_ai2d_run",debug_mode > 0): - global fm_ai2d,fm_ai2d_input_tensor,fm_ai2d_output_tensor - #(1)根据原图ai2d_input_tensor对象 - ai2d_input = rgb888p_img.to_numpy_ref() - fm_ai2d_input_tensor = nn.from_numpy(ai2d_input) +#-------hand detect--------: +# 手掌检测ai2d 初始化 +def hd_ai2d_init(): + with ScopedTiming("hd_ai2d_init",debug_mode > 0): + global hd_ai2d + global hd_ai2d_builder + global hd_ai2d_output_tensor + # 计算padding值 + ori_w = OUT_RGB888P_WIDTH + ori_h = OUT_RGB888P_HEIGHT + width = hd_kmodel_frame_size[0] + height = hd_kmodel_frame_size[1] + ratiow = float(width) / ori_w + ratioh = float(height) / ori_h + if ratiow < ratioh: + ratio = ratiow + else: + ratio = ratioh + new_w = int(ratio * ori_w) + new_h = int(ratio * ori_h) + dw = float(width - new_w) / 2 + dh = float(height - new_h) / 2 + top = int(round(dh - 0.1)) + bottom = int(round(dh + 0.1)) + left = int(round(dw - 0.1)) + right = int(round(dw - 0.1)) - # (2)根据新的det设置新的人脸mesh ai2d参数 - fm_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + hd_ai2d = nn.ai2d() + hd_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) - global roi - roi = parse_roi_box_from_bbox(det) - fm_ai2d.set_crop_param(True,int(roi[0]),int(roi[1]),int(roi[2]),int(roi[3])) - fm_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) - # (3)根据新的人脸mesh ai2d参数,构建人脸mesh ai2d_builder - global fm_ai2d_builder - fm_ai2d_builder = fm_ai2d.build([1,3,OUT_RGB888P_HEIGH,OUT_RGB888P_WIDTH], fm_kmodel_input_shape) - # (4)推理人脸mesh ai2d,将预处理的结果保存到fm_ai2d_output_tensor - fm_ai2d_builder.run(fm_ai2d_input_tensor, fm_ai2d_output_tensor) + hd_ai2d.set_pad_param(True, [0,0,0,0,top,bottom,left,right], 0, [114,114,114]) + hd_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) + hd_ai2d_builder = hd_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,height,width]) -def fm_ai2d_release(): - # 释放人脸mesh ai2d_input_tensor、ai2d_builder - with ScopedTiming("fm_ai2d_release",debug_mode > 0): - global fm_ai2d_input_tensor,fm_ai2d_builder - del fm_ai2d_input_tensor - del fm_ai2d_builder + data = np.ones(hd_kmodel_input_shape, dtype=np.uint8) + hd_ai2d_output_tensor = nn.from_numpy(data) -def fm_kpu_init(kmodel_file): - # 人脸mesh kpu初始化 - with ScopedTiming("fm_kpu_init",debug_mode > 0): - # 初始化人脸mesh kpu对象 - kpu_obj = nn.kpu() - # 加载人脸mesh kmodel - kpu_obj.load_kmodel(kmodel_file) - # 初始化人脸mesh ai2d - fm_ai2d_init() - return kpu_obj +# 手掌检测 ai2d 运行 +def hd_ai2d_run(rgb888p_img): + with ScopedTiming("hd_ai2d_run",debug_mode > 0): + global hd_ai2d_input_tensor,hd_ai2d_output_tensor, hd_ai2d_builder + hd_ai2d_input = rgb888p_img.to_numpy_ref() + hd_ai2d_input_tensor = nn.from_numpy(hd_ai2d_input) -def fm_kpu_pre_process(rgb888p_img,det): - # 人脸mesh kpu预处理 - # 人脸mesh ai2d推理,根据det对原图进行预处理 - fm_ai2d_run(rgb888p_img,det) - with ScopedTiming("fm_kpu_pre_process",debug_mode > 0): - global current_kmodel_obj,fm_ai2d_output_tensor - # 将人脸mesh ai2d输出设置为人脸mesh kpu输入 - current_kmodel_obj.set_input_tensor(0, fm_ai2d_output_tensor) + hd_ai2d_builder.run(hd_ai2d_input_tensor, hd_ai2d_output_tensor) -def fm_kpu_get_output(): - with ScopedTiming("fm_kpu_get_output",debug_mode > 0): - global current_kmodel_obj - # 获取人脸mesh kpu输出 - data = current_kmodel_obj.get_output_tensor(0) - result = data.to_numpy() - del data - return result +# 手掌检测 ai2d 释放内存 +def hd_ai2d_release(): + with ScopedTiming("hd_ai2d_release",debug_mode > 0): + global hd_ai2d_input_tensor + del hd_ai2d_input_tensor -def fm_kpu_post_process(param): - # 人脸mesh kpu结果后处理,反标准化 - with ScopedTiming("fm_kpu_post_process",debug_mode > 0): - param = param * param_std + param_mean - return param +# 手掌检测 kpu 初始化 +def hd_kpu_init(hd_kmodel_file): + # init kpu and load kmodel + with ScopedTiming("hd_kpu_init",debug_mode > 0): + hd_kpu_obj = nn.kpu() + hd_kpu_obj.load_kmodel(hd_kmodel_file) -def fm_kpu_run(kpu_obj,rgb888p_img,det): - # 人脸mesh kpu推理 + hd_ai2d_init() + return hd_kpu_obj + +# 手掌检测 kpu 输入预处理 +def hd_kpu_pre_process(rgb888p_img): + hd_ai2d_run(rgb888p_img) + with ScopedTiming("hd_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,hd_ai2d_output_tensor + # set kpu input + current_kmodel_obj.set_input_tensor(0, hd_ai2d_output_tensor) + +# 手掌检测 kpu 获得 kmodel 输出 +def hd_kpu_get_output(): + with ScopedTiming("hd_kpu_get_output",debug_mode > 0): + global current_kmodel_obj + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() + result = result.reshape((result.shape[0]*result.shape[1]*result.shape[2]*result.shape[3])) + tmp2 = result.copy() + del result + results.append(tmp2) + return results + +# 手掌检测 kpu 运行 +def hd_kpu_run(kpu_obj,rgb888p_img): global current_kmodel_obj current_kmodel_obj = kpu_obj - # (1)人脸mesh kpu预处理,设置kpu输入 - fm_kpu_pre_process(rgb888p_img,det) - # (2)人脸mesh kpu推理 - with ScopedTiming("fm_kpu_run",debug_mode > 0): - kpu_obj.run() - # (3)释放人脸mesh ai2d - fm_ai2d_release() - # (4)获取人脸mesh kpu输出 - param = fm_kpu_get_output() - # (5)人脸mesh 后处理 - param = fm_kpu_post_process(param) - return param + # (1)原图预处理,并设置模型输入 + hd_kpu_pre_process(rgb888p_img) + # (2)手掌检测 kpu 运行 + with ScopedTiming("hd_kpu_run",debug_mode > 0): + current_kmodel_obj.run() + # (3)释放手掌检测 ai2d 资源 + hd_ai2d_release() + # (4)获取手掌检测 kpu 输出 + results = hd_kpu_get_output() + # (5)手掌检测 kpu 结果后处理 + dets = aicube.anchorbasedet_post_process( results[0], results[1], results[2], hd_kmodel_frame_size, hd_frame_size, strides, num_classes, confidence_threshold, nms_threshold, anchors, nms_option) # kpu结果后处理 + # (6)返回手掌检测结果 + return dets -def fm_kpu_deinit(kpu_obj): - # 人脸mesh kpu释放 - with ScopedTiming("fm_kpu_deinit",debug_mode > 0): - global fm_ai2d,fm_ai2d_output_tensor - del kpu_obj # 删除kpu_obj变量,释放对它所引用对象的内存引用 - del fm_ai2d # 删除fm_ai2d变量,释放对它所引用对象的内存引用 - del fm_ai2d_output_tensor # 删除fm_ai2d_output_tensor变量,释放对它所引用对象的内存引用 +# 手掌检测 kpu 释放内存 +def hd_kpu_deinit(kpu_obj): + with ScopedTiming("hd_kpu_deinit",debug_mode > 0): + global hd_ai2d, hd_ai2d_output_tensor, hd_ai2d_builder + del kpu_obj + del hd_ai2d + del hd_ai2d_output_tensor + del hd_ai2d_builder -def fmpost_kpu_init(kmodel_file): - # face mesh post模型初始化 - with ScopedTiming("fmpost_kpu_init",debug_mode > 0): - # 初始化人脸mesh kpu post对象 - kpu_obj = nn.kpu() - # 加载人脸mesh后处理kmodel - kpu_obj.load_kmodel(kmodel_file) - return kpu_obj +#-------hand keypoint detection------: +# 手掌关键点检测 ai2d 初始化 +def hk_ai2d_init(): + with ScopedTiming("hk_ai2d_init",debug_mode > 0): + global hk_ai2d, hk_ai2d_output_tensor + hk_ai2d = nn.ai2d() + hk_ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, + nn.ai2d_format.NCHW_FMT, + np.uint8, np.uint8) + data = np.ones(hk_kmodel_input_shape, dtype=np.uint8) + hk_ai2d_output_tensor = nn.from_numpy(data) -def fmpost_kpu_pre_process(param): - # face mesh post模型预处理,param解析 - with ScopedTiming("fmpost_kpu_pre_process",debug_mode > 0): - param = param[0] - trans_dim, shape_dim, exp_dim = 12, 40, 10 +# 手掌关键点检测 ai2d 运行 +def hk_ai2d_run(rgb888p_img, x, y, w, h): + with ScopedTiming("hk_ai2d_run",debug_mode > 0): + global hk_ai2d,hk_ai2d_input_tensor,hk_ai2d_output_tensor + hk_ai2d_input = rgb888p_img.to_numpy_ref() + hk_ai2d_input_tensor = nn.from_numpy(hk_ai2d_input) - # reshape前务必进行copy,否则会导致模型输入错误 - R_ = param[:trans_dim].copy().reshape((3, -1)) - R = R_[:, :3].copy() - offset = R_[:, 3].copy() - offset = offset.reshape((3, 1)) - alpha_shp = param[trans_dim:trans_dim + shape_dim].copy().reshape((-1, 1)) - alpha_exp = param[trans_dim + shape_dim:].copy().reshape((-1, 1)) + hk_ai2d.set_crop_param(True, x, y, w, h) + hk_ai2d.set_resize_param(True, nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel ) - R_tensor = nn.from_numpy(R) - current_kmodel_obj.set_input_tensor(0, R_tensor) - del R_tensor + global hk_ai2d_builder + hk_ai2d_builder = hk_ai2d.build([1,3,OUT_RGB888P_HEIGHT,OUT_RGB888P_WIDTH], [1,3,hk_kmodel_frame_size[1],hk_kmodel_frame_size[0]]) + hk_ai2d_builder.run(hk_ai2d_input_tensor, hk_ai2d_output_tensor) - offset_tensor = nn.from_numpy(offset) - current_kmodel_obj.set_input_tensor(1, offset_tensor) - del offset_tensor +# 手掌关键点检测 ai2d 释放内存 +def hk_ai2d_release(): + with ScopedTiming("hk_ai2d_release",debug_mode > 0): + global hk_ai2d_input_tensor, hk_ai2d_builder + del hk_ai2d_input_tensor + del hk_ai2d_builder - alpha_shp_tensor = nn.from_numpy(alpha_shp) - current_kmodel_obj.set_input_tensor(2, alpha_shp_tensor) - del alpha_shp_tensor +# 手掌关键点检测 kpu 初始化 +def hk_kpu_init(hk_kmodel_file): + # init kpu and load kmodel + with ScopedTiming("hk_kpu_init",debug_mode > 0): + hk_kpu_obj = nn.kpu() + hk_kpu_obj.load_kmodel(hk_kmodel_file) - alpha_exp_tensor = nn.from_numpy(alpha_exp) - current_kmodel_obj.set_input_tensor(3, alpha_exp_tensor) - del alpha_exp_tensor + hk_ai2d_init() + return hk_kpu_obj - return +# 手掌关键点检测 kpu 输入预处理 +def hk_kpu_pre_process(rgb888p_img, x, y, w, h): + hk_ai2d_run(rgb888p_img, x, y, w, h) + with ScopedTiming("hk_kpu_pre_process",debug_mode > 0): + global current_kmodel_obj,hk_ai2d_output_tensor + # set kpu input + current_kmodel_obj.set_input_tensor(0, hk_ai2d_output_tensor) -def fmpost_kpu_get_output(): - # 获取face mesh post模型输出 - with ScopedTiming("fmpost_kpu_get_output",debug_mode > 0): +# 手掌关键点检测 kpu 获得 kmodel 输出 +def hk_kpu_get_output(): + with ScopedTiming("hk_kpu_get_output",debug_mode > 0): global current_kmodel_obj - # 获取人脸mesh kpu输出 - data = current_kmodel_obj.get_output_tensor(0) - result = data.to_numpy() - del data - return result + results = [] + for i in range(current_kmodel_obj.outputs_size()): + data = current_kmodel_obj.get_output_tensor(i) + result = data.to_numpy() -def fmpost_kpu_post_process(roi): - # face mesh post模型推理结果后处理 - with ScopedTiming("fmpost_kpu_post_process",debug_mode > 0): - x, y, w, h = map(lambda x: int(round(x, 0)), roi[:4]) - x = x * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - y = y * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH - w = w * DISPLAY_WIDTH // OUT_RGB888P_WIDTH - h = h * DISPLAY_HEIGHT // OUT_RGB888P_HEIGH - roi_array = np.array([x,y,w,h],dtype=np.float) - global vertices - aidemo.face_mesh_post_process(roi_array,vertices) - return + result = result.reshape((result.shape[0]*result.shape[1])) + tmp2 = result.copy() + del result + results.append(tmp2) + return results -def fmpost_kpu_run(kpu_obj,param): - # face mesh post模型推理 +# 手掌关键点检测 kpu 输出后处理 +def hk_kpu_post_process(results, x, y, w, h): + results_show = np.zeros(results.shape,dtype=np.int16) + results_show[0::2] = results[0::2] * w + x + results_show[1::2] = results[1::2] * h + y + return results_show + +# 手掌关键点检测 kpu 运行 +def hk_kpu_run(kpu_obj,rgb888p_img, x, y, w, h): global current_kmodel_obj current_kmodel_obj = kpu_obj - fmpost_kpu_pre_process(param) - with ScopedTiming("fmpost_kpu_run",debug_mode > 0): - kpu_obj.run() - global vertices - vertices = fmpost_kpu_get_output() - global roi - fmpost_kpu_post_process(roi) - return + # (1)原图预处理,并设置模型输入 + hk_kpu_pre_process(rgb888p_img, x, y, w, h) + # (2)手掌关键点检测 kpu 运行 + with ScopedTiming("hk_kpu_run",debug_mode > 0): + current_kmodel_obj.run() + # (3)释放手掌关键点检测 ai2d 资源 + hk_ai2d_release() + # (4)获取手掌关键点检测 kpu 输出 + results = hk_kpu_get_output() + # (5)手掌关键点检测 kpu 结果后处理 + result = hk_kpu_post_process(results[0],x,y,w,h) + # (6)返回手掌关键点检测结果 + return result -def fmpost_kpu_deinit(kpu_obj): - # face mesh post模型释放 - with ScopedTiming("fm_kpu_deinit",debug_mode > 0): +# 手掌关键点检测 kpu 释放内存 +def hk_kpu_deinit(kpu_obj): + with ScopedTiming("hk_kpu_deinit",debug_mode > 0): + global hk_ai2d, hk_ai2d_output_tensor del kpu_obj + del hk_ai2d + del hk_ai2d_output_tensor -#********************for media_utils.py******************** -global draw_img_ulab,draw_img,osd_img #for display -global buffer,media_source,media_sink #for media +# 求两个vector之间的夹角 +def hk_vector_2d_angle(v1,v2): + with ScopedTiming("hk_vector_2d_angle",debug_mode > 0): + v1_x = v1[0] + v1_y = v1[1] + v2_x = v2[0] + v2_y = v2[1] + v1_norm = np.sqrt(v1_x * v1_x+ v1_y * v1_y) + v2_norm = np.sqrt(v2_x * v2_x + v2_y * v2_y) + dot_product = v1_x * v2_x + v1_y * v2_y + cos_angle = dot_product/(v1_norm*v2_norm) + angle = np.acos(cos_angle)*180/np.pi + return angle + +# 根据手掌关键点检测结果判断手势类别 +def hk_gesture(results): + with ScopedTiming("hk_gesture",debug_mode > 0): + angle_list = [] + for i in range(5): + angle = hk_vector_2d_angle([(results[0]-results[i*8+4]), (results[1]-results[i*8+5])],[(results[i*8+6]-results[i*8+8]),(results[i*8+7]-results[i*8+9])]) + angle_list.append(angle) + + thr_angle = 65. + thr_angle_thumb = 53. + thr_angle_s = 49. + gesture_str = None + if 65535. not in angle_list: + if (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "fist" + elif (angle_list[0]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "gun" + elif (angle_list[0]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]5) and (angle_list[1]thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "one" + elif (angle_list[0]thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]thr_angle_thumb) and (angle_list[1]thr_angle): + gesture_str = "three" + elif (angle_list[0]thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "thumbUp" + elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]thr_angle) and (angle_list[4]>thr_angle): + gesture_str = "yeah" + + return gesture_str -# for display,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.2 +#media_utils.py +global draw_img,osd_img #for display 定义全局 作图image对象 +global buffer,media_source,media_sink #for media 定义 media 程序中的中间存储对象 + +#for display 初始化 def display_init(): - # 设置使用hdmi进行显示 + # use hdmi for display display.init(LT9611_1920X1080_30FPS) display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) +# display 释放内存 def display_deinit(): - # 释放显示资源 display.deinit() -def display_draw(dets,vertices_list): - # 在显示器画人脸轮廓 +# display 作图过程 标出检测到的21个关键点并用不同颜色的线段连接 +def display_draw(results, x, y, w, h): with ScopedTiming("display_draw",debug_mode >0): - global draw_img_ulab,draw_img,osd_img - if dets: - draw_img.clear() - for vertices in vertices_list: - aidemo.face_draw_mesh(draw_img_ulab, vertices) - # (4)将轮廓结果拷贝到osd - draw_img.copy_to(osd_img) - # (5)将osd显示到屏幕 - display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) - else: - # (1)清空用来画框的图像 - draw_img.clear() - # (2)清空osd - draw_img.copy_to(osd_img) - # (3)显示透明图层 - display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) + global draw_img,osd_img -#for camera,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.1 + if results: + results_show = np.zeros(results.shape,dtype=np.int16) + results_show[0::2] = results[0::2] * (DISPLAY_WIDTH / OUT_RGB888P_WIDTH) + results_show[1::2] = results[1::2] * (DISPLAY_HEIGHT / OUT_RGB888P_HEIGHT) + + for i in range(len(results_show)/2): + draw_img.draw_circle(results_show[i*2], results_show[i*2+1], 1, color=(255, 0, 255, 0),fill=False) + for i in range(5): + j = i*8 + if i==0: + R = 255; G = 0; B = 0 + if i==1: + R = 255; G = 0; B = 255 + if i==2: + R = 255; G = 255; B = 0 + if i==3: + R = 0; G = 255; B = 0 + if i==4: + R = 0; G = 0; B = 255 + draw_img.draw_line(results_show[0], results_show[1], results_show[j+2], results_show[j+3], color=(255,R,G,B), thickness = 3) + draw_img.draw_line(results_show[j+2], results_show[j+3], results_show[j+4], results_show[j+5], color=(255,R,G,B), thickness = 3) + draw_img.draw_line(results_show[j+4], results_show[j+5], results_show[j+6], results_show[j+7], color=(255,R,G,B), thickness = 3) + draw_img.draw_line(results_show[j+6], results_show[j+7], results_show[j+8], results_show[j+9], color=(255,R,G,B), thickness = 3) + + +#for camera 初始化 def camera_init(dev_id): - # camera初始化 camera.sensor_init(dev_id, CAM_DEFAULT_SENSOR) # set chn0 output yuv420sp @@ -9710,31 +13786,30 @@ def camera_init(dev_id): camera.set_outfmt(dev_id, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) # set chn2 output rgb88planar - camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGH) + camera.set_outsize(dev_id, CAM_CHN_ID_2, OUT_RGB888P_WIDTH, OUT_RGB888P_HEIGHT) camera.set_outfmt(dev_id, CAM_CHN_ID_2, PIXEL_FORMAT_RGB_888_PLANAR) +# camera 开启 def camera_start(dev_id): - # camera启动 camera.start_stream(dev_id) +# camera 读取图像 def camera_read(dev_id): - # 读取一帧图像 with ScopedTiming("camera_read",debug_mode >0): rgb888p_img = camera.capture_image(dev_id, CAM_CHN_ID_2) return rgb888p_img +# camera 图像释放 def camera_release_image(dev_id,rgb888p_img): - # 释放一帧图像 with ScopedTiming("camera_release_image",debug_mode >0): camera.release_image(dev_id, CAM_CHN_ID_2, rgb888p_img) +# camera 结束 def camera_stop(dev_id): - # 停止camera camera.stop_stream(dev_id) -#for media,已经封装好,无需自己再实现,直接调用即可,详细解析请查看1.6.3 +#for media 初始化 def media_init(): - # meida初始化 config = k_vb_config() config.max_pool_cnt = 1 config.comm_pool[0].blk_size = 4 * DISPLAY_WIDTH * DISPLAY_HEIGHT @@ -9752,18 +13827,17 @@ def media_init(): ret = media.buffer_init() if ret: return ret - global buffer, draw_img_ulab,draw_img, osd_img + global buffer, draw_img, osd_img buffer = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) - # 用于画框 - draw_img_ulab = np.zeros((DISPLAY_HEIGHT,DISPLAY_WIDTH,4),dtype=np.uint8) - draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_REF,data = draw_img_ulab) - # 用于拷贝画框结果,防止画框过程中发生buffer搬运 + # 图层1,用于画框 + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_MPGC) + # 图层2,用于拷贝画框结果,防止画框过程中发生buffer搬运 osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, poolid=buffer.pool_id, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr) return ret +# media 释放内存 def media_deinit(): - # meida资源释放 global buffer,media_source, media_sink media.release_buffer(buffer) media.destroy_link(media_source, media_sink) @@ -9771,89 +13845,105 @@ def media_deinit(): ret = media.buffer_deinit() return ret -#********************for face_detect.py******************** -def face_mesh_inference(): - # 人脸检测kpu初始化 - kpu_face_detect = fd_kpu_init(fd_kmodel_file) - # 人脸mesh kpu初始化 - kpu_face_mesh = fm_kpu_init(fm_kmodel_file) - # face_mesh_post kpu初始化 - kpu_face_mesh_post = fmpost_kpu_init(fmpost_kmodel_file) - # camera初始化 - camera_init(CAM_DEV_ID_0) - # 显示初始化 - display_init() +#**********for hand_keypoint_class.py********** +def hand_keypoint_class_inference(): + print("hand_keypoint_class_test start") + + kpu_hand_detect = hd_kpu_init(hd_kmodel_file) # 创建手掌检测的 kpu 对象 + kpu_hand_keypoint_detect = hk_kpu_init(hk_kmodel_file) # 创建手掌关键点检测的 kpu 对象 + camera_init(CAM_DEV_ID_0) # 初始化 camera + display_init() # 初始化 display rgb888p_img = None - # 注意:将一定要将一下过程包在try中,用于保证程序停止后,资源释放完毕;确保下次程序仍能正常运行 try: - # 注意:媒体初始化(注:媒体初始化必须在camera_start之前,确保media缓冲区已配置完全) ret = media_init() if ret: - print("face_detect_test, buffer init failed") + print("hand_keypoint_class, buffer init failed") return ret - # 启动camera camera_start(CAM_DEV_ID_0) - time.sleep(5) + count = 0 while True: - with ScopedTiming("total",1): - # (1)读取一帧图像 - rgb888p_img = camera_read(CAM_DEV_ID_0) - # (2)若读取失败,释放当前帧 + with ScopedTiming("total", 1): + rgb888p_img = camera_read(CAM_DEV_ID_0) # 读取一帧图片 if rgb888p_img == -1: - print("face_detect_test, capture_image failed") + print("hand_keypoint_class, capture_image failed") camera_release_image(CAM_DEV_ID_0,rgb888p_img) rgb888p_img = None continue - # (3)若读取成功,推理当前帧 + + # for rgb888planar if rgb888p_img.format() == image.RGBP888: - # (3.1)推理当前图像,并获取人脸检测结果 - dets = fd_kpu_run(kpu_face_detect,rgb888p_img) - ## (3.2)针对每个人脸框,推理得到对应人脸mesh - mesh_result = [] - for det in dets: - param = fm_kpu_run(kpu_face_mesh,rgb888p_img,det) - fmpost_kpu_run(kpu_face_mesh_post,param) - global vertices - mesh_result.append(vertices) - ## (3.3)将人脸mesh 画到屏幕上 - display_draw(dets,mesh_result) + draw_img.clear() + dets = hd_kpu_run(kpu_hand_detect,rgb888p_img) # 执行手掌检测 kpu 运行 以及 后处理过程 - # (4)释放当前帧 - camera_release_image(CAM_DEV_ID_0,rgb888p_img) + for det_box in dets: + x1, y1, x2, y2 = det_box[2],det_box[3],det_box[4],det_box[5] + w = int(x2 - x1) + h = int(y2 - y1) + + if (h<(0.1*OUT_RGB888P_HEIGHT)): + continue + if (w<(0.25*OUT_RGB888P_WIDTH) and ((x1<(0.03*OUT_RGB888P_WIDTH)) or (x2>(0.97*OUT_RGB888P_WIDTH)))): + continue + if (w<(0.15*OUT_RGB888P_WIDTH) and ((x1<(0.01*OUT_RGB888P_WIDTH)) or (x2>(0.99*OUT_RGB888P_WIDTH)))): + continue + + w_det = int(float(x2 - x1) * DISPLAY_WIDTH // OUT_RGB888P_WIDTH) + h_det = int(float(y2 - y1) * DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) + x_det = int(x1*DISPLAY_WIDTH // OUT_RGB888P_WIDTH) + y_det = int(y1*DISPLAY_HEIGHT // OUT_RGB888P_HEIGHT) + + length = max(w, h)/2 + cx = (x1+x2)/2 + cy = (y1+y2)/2 + ratio_num = 1.26*length + + x1_kp = int(max(0,cx-ratio_num)) + y1_kp = int(max(0,cy-ratio_num)) + x2_kp = int(min(OUT_RGB888P_WIDTH-1, cx+ratio_num)) + y2_kp = int(min(OUT_RGB888P_HEIGHT-1, cy+ratio_num)) + w_kp = int(x2_kp - x1_kp + 1) + h_kp = int(y2_kp - y1_kp + 1) + + hk_results = hk_kpu_run(kpu_hand_keypoint_detect,rgb888p_img, x1_kp, y1_kp, w_kp, h_kp) # 执行手掌关键点检测 kpu 运行 以及 后处理过程 + gesture = hk_gesture(hk_results) # 根据关键点检测结果判断手势类别 + + draw_img.draw_rectangle(x_det, y_det, w_det, h_det, color=(255, 0, 255, 0), thickness = 2) # 将得到的手掌检测结果 绘制到 display + display_draw(hk_results, x1_kp, y1_kp, w_kp, h_kp) # 将得到的手掌关键点检测结果 绘制到 display + draw_img.draw_string( x_det , y_det-50, " " + str(gesture), color=(255,0, 255, 0), scale=4) # 将根据关键点检测结果判断的手势类别 绘制到 display + + camera_release_image(CAM_DEV_ID_0,rgb888p_img) # camera 释放图像 rgb888p_img = None - #with ScopedTiming("gc collect", debug_mode > 0): - #gc.collect() + if (count>10): + gc.collect() + count = 0 + else: + count += 1 + + draw_img.copy_to(osd_img) + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD3) except Exception as e: - # 捕捉运行运行中异常,并打印错误 print(f"An error occurred during buffer used: {e}") finally: - # 释放当前帧 if rgb888p_img is not None: #先release掉申请的内存再stop camera_release_image(CAM_DEV_ID_0,rgb888p_img) - # 停止camera - camera_stop(CAM_DEV_ID_0) - # 释放显示资源 - display_deinit() - # 释放kpu资源 - fd_kpu_deinit(kpu_face_detect) - fm_kpu_deinit(kpu_face_mesh) - fmpost_kpu_deinit(kpu_face_mesh_post) - # 垃圾回收 + camera_stop(CAM_DEV_ID_0) # 停止 camera + display_deinit() # 释放 display + hd_kpu_deinit(kpu_hand_detect) # 释放手掌检测 kpu + hk_kpu_deinit(kpu_hand_keypoint_detect) # 释放手掌关键点检测 kpu + gc.collect() - time.sleep(1) - # 释放媒体资源 - ret = media_deinit() + ret = media_deinit() # 释放 整个media if ret: - print("face_mesh_test, buffer_deinit failed") + print("hand_keypoint_class, buffer_deinit failed") return ret - #print("face_mesh_test end") + print("hand_keypoint_class_test end") return 0 if __name__ == '__main__': - face_mesh_inference() + hand_keypoint_class_inference() ``` diff --git a/zh/example/example.rst b/zh/example/example.rst index 2d323c1..ab83c9e 100755 --- a/zh/example/example.rst +++ b/zh/example/example.rst @@ -5,20 +5,6 @@ CanMV 例程讲解 K230_CanMV_AI_Demo示例说明.md K230_Canmv示例讲解-人脸检测.md - cipher/cipher.md - machine/adc/adc.md - machine/fft/fft.md - machine/fpioa/fpioa.md - machine/gpio/gpio.md - machine/pwm/pwm.md - machine/spi/spi.md - machine/timer/timer.md - machine/wdt/wdt.md - media/acodec.md - media/audio.md - media/camera.md - media/display.md - media/media.md - media/mp4muxer.md - media/player.md - media/venc.md \ No newline at end of file + peripheral.rst + media.rst + omv/omv.rst diff --git a/zh/example/machine/uart/uart.md b/zh/example/machine/uart/uart.md new file mode 100755 index 0000000..8332da5 --- /dev/null +++ b/zh/example/machine/uart/uart.md @@ -0,0 +1,25 @@ +# uart - uart例程 + +本示例程序用于对 CanMV 开发板进行一个UART的功能展示。 + +```python +from machine import UART +# UART1: baudrate 115200, 8bits, parity none, one stopbits +uart = UART(UART.UART2, baudrate=115200, bits=UART.EIGHTBITS, parity=UART.PARITY_NONE, stop=UART.STOPBITS_ONE) +# UART write +r = uart.write("UART test") +print(r) +# UART read +r = uart.read() +print(r) +# UART readline +r = uart.readline() +print(r) +# UART readinto +b = bytearray(8) +r = uart.readinto(b) +print(r) + +``` + +具体接口定义请参考 [UART](../../../api/machine/K230_CanMV_UART模块API手册.md) diff --git a/zh/example/media.rst b/zh/example/media.rst new file mode 100755 index 0000000..f9a554f --- /dev/null +++ b/zh/example/media.rst @@ -0,0 +1,13 @@ +多媒体 例程讲解 +=========== +.. toctree:: + :maxdepth: 1 + + media/acodec.md + media/audio.md + media/camera.md + media/display.md + media/media.md + media/mp4muxer.md + media/player.md + media/venc.md \ No newline at end of file diff --git a/zh/example/omv/April-Tags/find_apriltags.md b/zh/example/omv/April-Tags/find_apriltags.md new file mode 100644 index 0000000..1fa3158 --- /dev/null +++ b/zh/example/omv/April-Tags/find_apriltags.md @@ -0,0 +1,160 @@ +# find_apriltags + +```python +# AprilTags Example +# +# This example shows the power of the CanMV Cam to detect April Tags. + +from media.camera import * +from media.display import * +from media.media import * +import time, math, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +# Note! Unlike find_qrcodes the find_apriltags method does not need lens correction on the image to work. + +# The apriltag code supports up to 6 tag families which can be processed at the same time. +# Returned tag objects will have their tag family and id within the tag family. + +tag_families = 0 +tag_families |= image.TAG16H5 # comment out to disable this family +tag_families |= image.TAG25H7 # comment out to disable this family +tag_families |= image.TAG25H9 # comment out to disable this family +tag_families |= image.TAG36H10 # comment out to disable this family +tag_families |= image.TAG36H11 # comment out to disable this family (default family) +tag_families |= image.ARTOOLKIT # comment out to disable this family + +# What's the difference between tag families? Well, for example, the TAG16H5 family is effectively +# a 4x4 square tag. So, this means it can be seen at a longer distance than a TAG36H11 tag which +# is a 6x6 square tag. However, the lower H value (H5 versus H11) means that the false positve +# rate for the 4x4 tag is much, much, much, higher than the 6x6 tag. So, unless you have a +# reason to use the other tags families just use TAG36H11 which is the default family. + +def family_name(tag): + if(tag.family() == image.TAG16H5): + return "TAG16H5" + if(tag.family() == image.TAG25H7): + return "TAG25H7" + if(tag.family() == image.TAG25H9): + return "TAG25H9" + if(tag.family() == image.TAG36H10): + return "TAG36H10" + if(tag.family() == image.TAG36H11): + return "TAG36H11" + if(tag.family() == image.ARTOOLKIT): + return "ARTOOLKIT" + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, alloc=image.ALLOC_HEAP, data=yuv420_img) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + draw_img.clear() + for tag in img.find_apriltags(families=tag_families): + draw_img.draw_rectangle([v*SCALE for v in tag.rect()], color=(255, 0, 0)) + draw_img.draw_cross(tag.cx()*SCALE, tag.cy()*SCALE, color=(0, 255, 0)) + print_args = (family_name(tag), tag.id(), (180 * tag.rotation()) / math.pi) + print("Tag Family %s, Tag ID %d, rotation %f (degrees)" % print_args) + draw_img.copy_to(osd_img) + print(fps.fps()) + del img + gc.collect() + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/April-Tags/find_apriltags_3d_pose.md b/zh/example/omv/April-Tags/find_apriltags_3d_pose.md new file mode 100644 index 0000000..971ed1a --- /dev/null +++ b/zh/example/omv/April-Tags/find_apriltags_3d_pose.md @@ -0,0 +1,160 @@ +# find_apriltags_3d_pose + +```python +# AprilTags Example +# +# This example shows the power of the CanMV Cam to detect April Tags. + +from media.camera import * +from media.display import * +from media.media import * +import time, math, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +# Note! Unlike find_qrcodes the find_apriltags method does not need lens correction on the image to work. + +# What's the difference between tag families? Well, for example, the TAG16H5 family is effectively +# a 4x4 square tag. So, this means it can be seen at a longer distance than a TAG36H11 tag which +# is a 6x6 square tag. However, the lower H value (H5 versus H11) means that the false positve +# rate for the 4x4 tag is much, much, much, higher than the 6x6 tag. So, unless you have a +# reason to use the other tags families just use TAG36H11 which is the default family. + +# The AprilTags library outputs the pose information for tags. This is the x/y/z translation and +# x/y/z rotation. The x/y/z rotation is in radians and can be converted to degrees. As for +# translation the units are dimensionless and you must apply a conversion function. + +# f_x is the x focal length of the camera. It should be equal to the lens focal length in mm +# divided by the x sensor size in mm times the number of pixels in the image. +# The below values are for the OV7725 camera with a 2.8 mm lens. + +# f_y is the y focal length of the camera. It should be equal to the lens focal length in mm +# divided by the y sensor size in mm times the number of pixels in the image. +# The below values are for the OV7725 camera with a 2.8 mm lens. + +# c_x is the image x center position in pixels. +# c_y is the image y center position in pixels. + +f_x = (2.8 / 3.984) * DETECT_WIDTH # find_apriltags defaults to this if not set +f_y = (2.8 / 2.952) * DETECT_HEIGHT # find_apriltags defaults to this if not set +c_x = DETECT_WIDTH * 0.5 # find_apriltags defaults to this if not set (the image.w * 0.5) +c_y = DETECT_HEIGHT * 0.5 # find_apriltags defaults to this if not set (the image.h * 0.5) + +def degrees(radians): + return (180 * radians) / math.pi + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, alloc=image.ALLOC_HEAP, data=yuv420_img) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + draw_img.clear() + for tag in img.find_apriltags(fx=f_x, fy=f_y, cx=c_x, cy=c_y): # defaults to TAG36H11 + draw_img.draw_rectangle([v*SCALE for v in tag.rect()], color=(255, 0, 0)) + draw_img.draw_cross(tag.cx()*SCALE, tag.cy()*SCALE, color=(0, 255, 0)) + print_args = (tag.x_translation(), tag.y_translation(), tag.z_translation(), + degrees(tag.x_rotation()), degrees(tag.y_rotation()), degrees(tag.z_rotation())) + # Translation units are unknown. Rotation units are in degrees. + print("Tx: %f, Ty %f, Tz %f, Rx %f, Ry %f, Rz %f" % print_args) + draw_img.copy_to(osd_img) + print(fps.fps()) + del img + gc.collect() + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Codes/find_barcodes.md b/zh/example/omv/Codes/find_barcodes.md new file mode 100644 index 0000000..12f3899 --- /dev/null +++ b/zh/example/omv/Codes/find_barcodes.md @@ -0,0 +1,162 @@ +# find_barcodes + +```python +# Barcode Example +# +# This example shows off how easy it is to detect bar codes. + +from media.camera import * +from media.display import * +from media.media import * +import time, math, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def barcode_name(code): + if(code.type() == image.EAN2): + return "EAN2" + if(code.type() == image.EAN5): + return "EAN5" + if(code.type() == image.EAN8): + return "EAN8" + if(code.type() == image.UPCE): + return "UPCE" + if(code.type() == image.ISBN10): + return "ISBN10" + if(code.type() == image.UPCA): + return "UPCA" + if(code.type() == image.EAN13): + return "EAN13" + if(code.type() == image.ISBN13): + return "ISBN13" + if(code.type() == image.I25): + return "I25" + if(code.type() == image.DATABAR): + return "DATABAR" + if(code.type() == image.DATABAR_EXP): + return "DATABAR_EXP" + if(code.type() == image.CODABAR): + return "CODABAR" + if(code.type() == image.CODE39): + return "CODE39" + if(code.type() == image.PDF417): + return "PDF417" + if(code.type() == image.CODE93): + return "CODE93" + if(code.type() == image.CODE128): + return "CODE128" + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, alloc=image.ALLOC_HEAP, data=yuv420_img) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + codes = img.find_qrcodes() + draw_img.clear() + for code in codes: + draw_img.draw_rectangle([v*SCALE for v in code.rect()], color=(255, 0, 0)) + print_args = (barcode_name(code), code.payload(), (180 * code.rotation()) / math.pi, code.quality(), fps.fps()) + print("Barcode %s, Payload \"%s\", rotation %f (degrees), quality %d, FPS %f" % print_args) + draw_img.copy_to(osd_img) + if not codes: + print("FPS %f" % fps.fps()) + del img + gc.collect() + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Codes/find_datamatrices.md b/zh/example/omv/Codes/find_datamatrices.md new file mode 100644 index 0000000..8421c9c --- /dev/null +++ b/zh/example/omv/Codes/find_datamatrices.md @@ -0,0 +1,128 @@ +# find_datamatrices + +```python +# Data Matrices Example +# +# This example shows off how easy it is to detect data matrices. + +from media.camera import * +from media.display import * +from media.media import * +import time, math, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, alloc=image.ALLOC_HEAP, data=yuv420_img) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + matrices = img.find_datamatrices() + draw_img.clear() + for matrix in matrices: + draw_img.draw_rectangle([v*SCALE for v in matrix.rect()], color=(255, 0, 0)) + print_args = (matrix.rows(), matrix.columns(), matrix.payload(), (180 * matrix.rotation()) / math.pi, fps.fps()) + print("Matrix [%d:%d], Payload \"%s\", rotation %f (degrees), FPS %f" % print_args) + draw_img.copy_to(osd_img) + if not matrices: + print("FPS %f" % fps.fps()) + del img + gc.collect() + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Codes/find_qrcodes.md b/zh/example/omv/Codes/find_qrcodes.md new file mode 100644 index 0000000..5bdb8ae --- /dev/null +++ b/zh/example/omv/Codes/find_qrcodes.md @@ -0,0 +1,127 @@ +# find_qrcodes + +```python +# QRCode Example +# +# This example shows the power of the CanMV Cam to detect QR Codes. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, alloc=image.ALLOC_HEAP, data=yuv420_img) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + codes = img.find_qrcodes() + draw_img.clear() + for code in codes: + draw_img.draw_rectangle([v*SCALE for v in code.rect()], color=(255, 0, 0)) + print(code) + draw_img.copy_to(osd_img) + if not codes: + print("FPS %f" % fps.fps()) + del img + gc.collect() + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Color-Tracking/automatic_grayscale_color_tracking.md b/zh/example/omv/Color-Tracking/automatic_grayscale_color_tracking.md new file mode 100644 index 0000000..9e4f756 --- /dev/null +++ b/zh/example/omv/Color-Tracking/automatic_grayscale_color_tracking.md @@ -0,0 +1,157 @@ +# automatic_grayscale_color_tracking + +```python +# Automatic Grayscale Color Tracking Example +# +# This example shows off single color automatic grayscale color tracking using the CanMV Cam. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, math + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + # Capture the color thresholds for whatever was in the center of the image. + r = [(DETECT_WIDTH//2)-(50//2), (DETECT_HEIGHT//2)-(50//2), 50, 50] # 50x50 center of QVGA. + threshold = [128, 128] # Middle grayscale values. + frame_count = 0 + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_grayscale() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + draw_img.clear() + if frame_count < 60: + if frame_count == 0: + print("Letting auto algorithms run. Don't put anything in front of the camera!") + print("Auto algorithms done. Hold the object you want to track in front of the camera in the box.") + print("MAKE SURE THE COLOR OF THE OBJECT YOU WANT TO TRACK IS FULLY ENCLOSED BY THE BOX!") + draw_img.draw_rectangle([v*SCALE for v in r]) + frame_count = frame_count + 1 + elif frame_count < 120: + if frame_count == 60: + print("Learning thresholds...") + elif frame_count == 119: + print("Thresholds learned...") + print("Tracking colors...") + hist = img.get_histogram(roi=r) + lo = hist.get_percentile(0.01) # Get the CDF of the histogram at the 1% range (ADJUST AS NECESSARY)! + hi = hist.get_percentile(0.99) # Get the CDF of the histogram at the 99% range (ADJUST AS NECESSARY)! + # Average in percentile values. + threshold[0] = (threshold[0] + lo.value()) // 2 + threshold[1] = (threshold[1] + hi.value()) // 2 + for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10): + draw_img.draw_rectangle([v*SCALE for v in blob.rect()]) + draw_img.draw_cross(blob.cx()*SCALE, blob.cy()*SCALE) + draw_img.draw_rectangle([v*SCALE for v in r]) + frame_count = frame_count + 1 + del hist + else: + for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10): + draw_img.draw_rectangle([v*SCALE for v in blob.rect()]) + draw_img.draw_cross(blob.cx()*SCALE, blob.cy()*SCALE) + + draw_img.copy_to(osd_img) + del img + gc.collect() + if frame_count >= 120: + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Color-Tracking/automatic_rgb565_color_tracking.md b/zh/example/omv/Color-Tracking/automatic_rgb565_color_tracking.md new file mode 100644 index 0000000..bf00fe8 --- /dev/null +++ b/zh/example/omv/Color-Tracking/automatic_rgb565_color_tracking.md @@ -0,0 +1,161 @@ +# automatic_rgb565_color_tracking + +```python +# Automatic RGB565 Color Tracking Example +# +# This example shows off single color automatic RGB565 color tracking using the CanMV Cam. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, math + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + # Capture the color thresholds for whatever was in the center of the image. + r = [(DETECT_WIDTH//2)-(50//2), (DETECT_HEIGHT//2)-(50//2), 50, 50] # 50x50 center of QVGA. + threshold = [50, 50, 0, 0, 0, 0] # Middle L, A, B values. + frame_count = 0 + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + draw_img.clear() + if frame_count < 60: + if frame_count == 0: + print("Letting auto algorithms run. Don't put anything in front of the camera!") + print("Auto algorithms done. Hold the object you want to track in front of the camera in the box.") + print("MAKE SURE THE COLOR OF THE OBJECT YOU WANT TO TRACK IS FULLY ENCLOSED BY THE BOX!") + draw_img.draw_rectangle([v*SCALE for v in r]) + frame_count = frame_count + 1 + elif frame_count < 120: + if frame_count == 60: + print("Learning thresholds...") + elif frame_count == 119: + print("Thresholds learned...") + print("Tracking colors...") + hist = img.get_histogram(roi=r) + lo = hist.get_percentile(0.01) # Get the CDF of the histogram at the 1% range (ADJUST AS NECESSARY)! + hi = hist.get_percentile(0.99) # Get the CDF of the histogram at the 99% range (ADJUST AS NECESSARY)! + # Average in percentile values. + threshold[0] = (threshold[0] + lo.l_value()) // 2 + threshold[1] = (threshold[1] + hi.l_value()) // 2 + threshold[2] = (threshold[2] + lo.a_value()) // 2 + threshold[3] = (threshold[3] + hi.a_value()) // 2 + threshold[4] = (threshold[4] + lo.b_value()) // 2 + threshold[5] = (threshold[5] + hi.b_value()) // 2 + for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10): + draw_img.draw_rectangle([v*SCALE for v in blob.rect()]) + draw_img.draw_cross(blob.cx()*SCALE, blob.cy()*SCALE) + draw_img.draw_rectangle([v*SCALE for v in r]) + frame_count = frame_count + 1 + del hist + else: + for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10): + draw_img.draw_rectangle([v*SCALE for v in blob.rect()]) + draw_img.draw_cross(blob.cx()*SCALE, blob.cy()*SCALE) + + draw_img.copy_to(osd_img) + del img + gc.collect() + if frame_count >= 120: + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Color-Tracking/black_grayscale_line_following.md b/zh/example/omv/Color-Tracking/black_grayscale_line_following.md new file mode 100644 index 0000000..8972c0f --- /dev/null +++ b/zh/example/omv/Color-Tracking/black_grayscale_line_following.md @@ -0,0 +1,183 @@ +# black_grayscale_line_following + +```python +# Black Grayscale Line Following Example +# +# Making a line following robot requires a lot of effort. This example script +# shows how to do the machine vision part of the line following robot. You +# can use the output from this script to drive a differential drive robot to +# follow a line. This script just generates a single turn value that tells +# your robot to go left or right. +# +# For this script to work properly you should point the camera at a line at a +# 45 or so degree angle. Please make sure that only the line is within the +# camera's field of view. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, math + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +# Tracks a black line. Use [(128, 255)] for a tracking a white line. +GRAYSCALE_THRESHOLD = [(0, 64)] + +# Each roi is (x, y, w, h). The line detection algorithm will try to find the +# centroid of the largest blob in each roi. The x position of the centroids +# will then be averaged with different weights where the most weight is assigned +# to the roi near the bottom of the image and less to the next roi and so on. +ROIS = [ # [ROI, weight] + (0, 100, 160, 20, 0.7), # You'll need to tweak the weights for your app + (0, 50, 160, 20, 0.3), # depending on how your robot is setup. + (0, 0, 160, 20, 0.1) + ] + +# Compute the weight divisor (we're computing this so you don't have to make weights add to 1). +weight_sum = 0 +for r in ROIS: weight_sum += r[4] # r[4] is the roi weight. + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_grayscale() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + draw_img.clear() + centroid_sum = 0 + for r in ROIS: + blobs = img.find_blobs(GRAYSCALE_THRESHOLD, roi=r[0:4], merge=True) # r[0:4] is roi tuple. + + if blobs: + # Find the blob with the most pixels. + largest_blob = max(blobs, key=lambda b: b.pixels()) + + # Draw a rect around the blob. + draw_img.draw_rectangle([v*SCALE for v in largest_blob.rect()]) + draw_img.draw_cross(largest_blob.cx()*SCALE, largest_blob.cy()*SCALE) + + centroid_sum += largest_blob.cx() * r[4] # r[4] is the roi weight. + + center_pos = (centroid_sum / weight_sum) # Determine center of line. + + # Convert the center_pos to a deflection angle. We're using a non-linear + # operation so that the response gets stronger the farther off the line we + # are. Non-linear operations are good to use on the output of algorithms + # like this to cause a response "trigger". + deflection_angle = 0 + + # The 80 is from half the X res, the 60 is from half the Y res. The + # equation below is just computing the angle of a triangle where the + # opposite side of the triangle is the deviation of the center position + # from the center and the adjacent side is half the Y res. This limits + # the angle output to around -45 to 45. (It's not quite -45 and 45). + deflection_angle = -math.atan((center_pos-80)/60) + + # Convert angle in radians to degrees. + deflection_angle = math.degrees(deflection_angle) + + # Now you have an angle telling you how much to turn the robot by which + # incorporates the part of the line nearest to the robot and parts of + # the line farther away from the robot for a better prediction. + print("Turn Angle: %f" % deflection_angle) + draw_img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Color-Tracking/image_histogram_info.md b/zh/example/omv/Color-Tracking/image_histogram_info.md new file mode 100644 index 0000000..4f82e1d --- /dev/null +++ b/zh/example/omv/Color-Tracking/image_histogram_info.md @@ -0,0 +1,118 @@ +# image_histogram_info + +```python +# Image Histogram Info Example +# +# This script computes the histogram of the image and prints it out. + +# You can also pass get_histogram() an "roi=" to get just the histogram of that area. +# get_histogram() allows you to quickly determine the color channel information of +# any any area in the image. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_grayscale() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + print(img.get_histogram(bins=8)) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Color-Tracking/image_statistics_info.md b/zh/example/omv/Color-Tracking/image_statistics_info.md new file mode 100644 index 0000000..6609504 --- /dev/null +++ b/zh/example/omv/Color-Tracking/image_statistics_info.md @@ -0,0 +1,118 @@ +# image_statistics_info + +```python +# Image Statistics Info Example +# +# This script computes the statistics of the image and prints it out. + +# You can also pass get_statistics() an "roi=" to get just the statistics of that area. +# get_statistics() allows you to quickly determine the color channel information of +# any any area in the image. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_grayscale() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + print(img.get_statistics()) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Color-Tracking/multi_color_code_tracking.md b/zh/example/omv/Color-Tracking/multi_color_code_tracking.md new file mode 100644 index 0000000..419f7c0 --- /dev/null +++ b/zh/example/omv/Color-Tracking/multi_color_code_tracking.md @@ -0,0 +1,153 @@ +# multi_color_code_tracking + +```python +# Multi Color Code Tracking Example +# +# This example shows off multi color code tracking using the CanMV Cam. +# +# A color code is a blob composed of two or more colors. The example below will +# only track colored objects which have two or more the colors below in them. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, math + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +# Color Tracking Thresholds (L Min, L Max, A Min, A Max, B Min, B Max) +# The below thresholds track in general red/green things. You may wish to tune them... +thresholds = [(30, 100, 15, 127, 15, 127), # generic_red_thresholds -> index is 0 so code == (1 << 0) + (30, 100, -64, -8, -32, 32), # generic_green_thresholds -> index is 1 so code == (1 << 1) + (0, 15, 0, 40, -80, -20)] # generic_blue_thresholds -> index is 2 so code == (1 << 2) +# Codes are or'ed together when "merge=True" for "find_blobs". + +# Only blobs that with more pixels than "pixel_threshold" and more area than "area_threshold" are +# returned by "find_blobs" below. Change "pixels_threshold" and "area_threshold" if you change the +# camera resolution. "merge=True" must be set to merge overlapping color blobs for color codes. + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + draw_img.clear() + for blob in img.find_blobs(thresholds, pixels_threshold=100, area_threshold=100, merge=True): + if blob.code() == 3: # r/g code + draw_img.draw_rectangle([v*SCALE for v in blob.rect()]) + draw_img.draw_cross(blob.cx()*SCALE, blob.cy()*SCALE) + draw_img.draw_string(blob.x()*SCALE + 2, blob.y()*SCALE + 2, "r/g") + if blob.code() == 5: # r/b code + draw_img.draw_rectangle([v*SCALE for v in blob.rect()]) + draw_img.draw_cross(blob.cx()*SCALE, blob.cy()*SCALE) + draw_img.draw_string(blob.x()*SCALE + 2, blob.y()*SCALE + 2, "r/b") + if blob.code() == 6: # g/b code + draw_img.draw_rectangle([v*SCALE for v in blob.rect()]) + draw_img.draw_cross(blob.cx()*SCALE, blob.cy()*SCALE) + draw_img.draw_string(blob.x()*SCALE + 2, blob.y()*SCALE + 2, "g/b") + if blob.code() == 7: # r/g/b code + draw_img.draw_rectangle([v*SCALE for v in blob.rect()]) + draw_img.draw_cross(blob.cx()*SCALE, blob.cy()*SCALE) + draw_img.draw_string(blob.x()*SCALE + 2, blob.y()*SCALE + 2, "r/g/b") + draw_img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Color-Tracking/single_color_code_tracking.md b/zh/example/omv/Color-Tracking/single_color_code_tracking.md new file mode 100644 index 0000000..e6c9079 --- /dev/null +++ b/zh/example/omv/Color-Tracking/single_color_code_tracking.md @@ -0,0 +1,147 @@ +# single_color_code_tracking + +```python +# Single Color Code Tracking Example +# +# This example shows off single color code tracking using the CanMV Cam. +# +# A color code is a blob composed of two or more colors. The example below will +# only track colored objects which have both the colors below in them. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, math + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +# Color Tracking Thresholds (L Min, L Max, A Min, A Max, B Min, B Max) +# The below thresholds track in general red/green things. You may wish to tune them... +thresholds = [(30, 100, 15, 127, 15, 127), # generic_red_thresholds -> index is 0 so code == (1 << 0) + (30, 100, -64, -8, -32, 32)] # generic_green_thresholds -> index is 1 so code == (1 << 1) +# Codes are or'ed together when "merge=True" for "find_blobs" + +# Only blobs that with more pixels than "pixel_threshold" and more area than "area_threshold" are +# returned by "find_blobs" below. Change "pixels_threshold" and "area_threshold" if you change the +# camera resolution. "merge=True" must be set to merge overlapping color blobs for color codes. + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + draw_img.clear() + for blob in img.find_blobs(thresholds, pixels_threshold=100, area_threshold=100, merge=True): + if blob.code() == 3: # r/g code == (1 << 1) | (1 << 0) + # These values depend on the blob not being circular - otherwise they will be shaky. + # if blob.elongation() > 0.5: + # img.draw_edges(blob.min_corners(), color=(255,0,0)) + # img.draw_line(blob.major_axis_line(), color=(0,255,0)) + # img.draw_line(blob.minor_axis_line(), color=(0,0,255)) + # These values are stable all the time. + draw_img.draw_rectangle([v*SCALE for v in blob.rect()]) + draw_img.draw_cross(blob.cx()*SCALE, blob.cy()*SCALE) + # Note - the blob rotation is unique to 0-180 only. + draw_img.draw_keypoints([(blob.cx()*SCALE, blob.cy()*SCALE, int(math.degrees(blob.rotation())))], size=20) + draw_img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/arrow_drawing.md b/zh/example/omv/Drawing/arrow_drawing.md new file mode 100644 index 0000000..bc85b88 --- /dev/null +++ b/zh/example/omv/Drawing/arrow_drawing.md @@ -0,0 +1,117 @@ +# arrow_drawing + +```python +# Arrow Drawing +# +# This example shows off drawing arrows on the CanMV Cam. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, urandom + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for drawing + img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + img.clear() + for i in range(10): + x0 = (urandom.getrandbits(30) % (2*img.width())) - (img.width()//2) + y0 = (urandom.getrandbits(30) % (2*img.height())) - (img.height()//2) + x1 = (urandom.getrandbits(30) % (2*img.width())) - (img.width()//2) + y1 = (urandom.getrandbits(30) % (2*img.height())) - (img.height()//2) + r = (urandom.getrandbits(30) % 127) + 128 + g = (urandom.getrandbits(30) % 127) + 128 + b = (urandom.getrandbits(30) % 127) + 128 + # If the first argument is a scaler then this method expects + # to see x0, y0, x1, and y1. Otherwise, it expects a (x0,y0,x1,y1) tuple. + img.draw_arrow(x0, y0, x1, y1, color = (r, g, b), size = 30, thickness = 2) + img.copy_to(osd_img) + time.sleep(1) + os.exitpoint() + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except KeyboardInterrupt as e: + print("user stop: ", e) + except BaseException as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/circle_drawing.md b/zh/example/omv/Drawing/circle_drawing.md new file mode 100644 index 0000000..a386888 --- /dev/null +++ b/zh/example/omv/Drawing/circle_drawing.md @@ -0,0 +1,116 @@ +# circle_drawing + +```python +# Circle Drawing +# +# This example shows off drawing circles on the CanMV Cam. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, urandom + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for drawing + img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + img.clear() + for i in range(10): + x = (urandom.getrandbits(30) % (2*img.width())) - (img.width()//2) + y = (urandom.getrandbits(30) % (2*img.height())) - (img.height()//2) + radius = urandom.getrandbits(30) % (max(img.height(), img.width())//2) + r = (urandom.getrandbits(30) % 127) + 128 + g = (urandom.getrandbits(30) % 127) + 128 + b = (urandom.getrandbits(30) % 127) + 128 + # If the first argument is a scaler then this method expects + # to see x, y, and radius. Otherwise, it expects a (x,y,radius) tuple. + img.draw_circle(x, y, radius, color = (r, g, b), thickness = 2, fill = False) + img.copy_to(osd_img) + time.sleep(1) + os.exitpoint() + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except KeyboardInterrupt as e: + print("user stop: ", e) + except BaseException as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/cross_drawing.md b/zh/example/omv/Drawing/cross_drawing.md new file mode 100644 index 0000000..4fd167a --- /dev/null +++ b/zh/example/omv/Drawing/cross_drawing.md @@ -0,0 +1,115 @@ +# cross_drawing + +```python +# Cross Drawing +# +# This example shows off drawing crosses on the CanMV Cam. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, urandom + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for drawing + img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + img.clear() + for i in range(10): + x = (urandom.getrandbits(30) % (2*img.width())) - (img.width()//2) + y = (urandom.getrandbits(30) % (2*img.height())) - (img.height()//2) + r = (urandom.getrandbits(30) % 127) + 128 + g = (urandom.getrandbits(30) % 127) + 128 + b = (urandom.getrandbits(30) % 127) + 128 + # If the first argument is a scaler then this method expects + # to see x and y. Otherwise, it expects a (x,y) tuple. + img.draw_cross(x, y, color = (r, g, b), size = 10, thickness = 2) + img.copy_to(osd_img) + time.sleep(1) + os.exitpoint() + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except KeyboardInterrupt as e: + print("user stop: ", e) + except BaseException as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/ellipse_drawing.md b/zh/example/omv/Drawing/ellipse_drawing.md new file mode 100644 index 0000000..206338f --- /dev/null +++ b/zh/example/omv/Drawing/ellipse_drawing.md @@ -0,0 +1,119 @@ +# ellipse_drawing + +```python +# Ellipse Drawing +# +# This example shows off drawing ellipses on the CanMV Cam. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, urandom + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for drawing + img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + img.clear() + for i in range(10): + x = (urandom.getrandbits(30) % (2*img.width())) - (img.width()//2) + y = (urandom.getrandbits(30) % (2*img.height())) - (img.height()//2) + radius_x = urandom.getrandbits(30) % (max(img.height(), img.width())//2) + radius_y = urandom.getrandbits(30) % (max(img.height(), img.width())//2) + rot = urandom.getrandbits(30) + r = (urandom.getrandbits(30) % 127) + 128 + g = (urandom.getrandbits(30) % 127) + 128 + b = (urandom.getrandbits(30) % 127) + 128 + # If the first argument is a scaler then this method expects + # to see x, y, radius x, and radius y. + # Otherwise, it expects a (x,y,radius_x,radius_y) tuple. + img.draw_ellipse(x, y, radius_x, radius_y, rot, color = (r, g, b), thickness = 2, fill = False) + img.copy_to(osd_img) + time.sleep(1) + os.exitpoint() + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except KeyboardInterrupt as e: + print("user stop: ", e) + except BaseException as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/flood_fill.md b/zh/example/omv/Drawing/flood_fill.md new file mode 100644 index 0000000..12f46c1 --- /dev/null +++ b/zh/example/omv/Drawing/flood_fill.md @@ -0,0 +1,115 @@ +# flood_fill + +```python +# Flood Fill +# +# This example shows off flood filling areas in the image. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # # set chn0 output size + # camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # # set chn0 output format + # camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # # create meida source device + # globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # # create meida sink device + # globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # # create meida link + # media.create_link(meida_source, meida_sink) + # # set display plane with video channel + # display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + # media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + x = img.width() // 2 + y = img.height() // 2 + img.flood_fill(x, y, seed_threshold=0.05, floating_thresholds=0.05, + color=(255, 0, 0), invert=False, clear_background=False) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except KeyboardInterrupt as e: + print("user stop: ", e) + except BaseException as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/image_drawing.md b/zh/example/omv/Drawing/image_drawing.md new file mode 100644 index 0000000..0dc9622 --- /dev/null +++ b/zh/example/omv/Drawing/image_drawing.md @@ -0,0 +1,122 @@ +# image_drawing + +```python +# Draw Image Example +# +# This example shows off how to draw images in the frame buffer. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # # set chn0 output size + # camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # # set chn0 output format + # camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # # create meida source device + # globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # # create meida sink device + # globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # # create meida link + # media.create_link(meida_source, meida_sink) + # # set display plane with video channel + # display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + # media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + small_img = img.mean_pooled(4, 4) # Makes a copy. + x = (img.width()//2)-(small_img.width()//2) + y = (img.height()//2)-(small_img.height()//2) + # Draws an image in the frame buffer.Pass an optional + # mask image to control what pixels are drawn. + img.draw_image(small_img, x, y, x_scale=1, y_scale=1) + img.copy_to(osd_img) + del img, small_img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/image_drawing_advanced.md b/zh/example/omv/Drawing/image_drawing_advanced.md new file mode 100644 index 0000000..fad3ba7 --- /dev/null +++ b/zh/example/omv/Drawing/image_drawing_advanced.md @@ -0,0 +1,195 @@ +# image_drawing_advanced + +```python +# Draw Image Testing script with bounce +# +# Exercise draw image with many different values for testing + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +BOUNCE = True +RESCALE = True + +SMALL_IMAGE_SCALE = 3 + +CYCLE_FORMATS = True +CYCLE_MASK = True + +# Used when CYCLE_FORMATS or CYCLE_MASK is true +value_mixer_init = 0 + +# Location of small image +x_init = 100 +y_init = 50 + +# Bounce direction +xd_init = 1 +yd_init = 1 + +# Small image scaling +rescale_init = 1.0 +rd_init = 0.1 +max_rescale = 5 +min_rescale = 0.2 + +# Boundary to bounce within +xmin = -DISPLAY_WIDTH / SMALL_IMAGE_SCALE - 8 +ymin = -DISPLAY_HEIGHT / SMALL_IMAGE_SCALE - 8 +xmax = DISPLAY_WIDTH + 8 +ymax = DISPLAY_HEIGHT + 8 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # # set chn0 output size + # camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # # set chn0 output format + # camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # # create meida source device + # globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # # create meida sink device + # globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # # create meida link + # media.create_link(meida_source, meida_sink) + # # set display plane with video channel + # display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + # media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + value_mixer = value_mixer_init + x = x_init + y = y_init + xd = xd_init + yd = yd_init + rescale = rescale_init + rd = rd_init + fps = time.clock() + while True: + fps.tick() + status = "" + value_mixer = value_mixer + 1 + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + small_img = img.mean_pooled(SMALL_IMAGE_SCALE, SMALL_IMAGE_SCALE) + status = 'rgb565 ' + if CYCLE_FORMATS: + image_format = (value_mixer >> 8) & 3 + # To test combining different formats + if (image_format==1): small_img = small_img.to_bitmap(); status = 'bitmap ' + if (image_format==2): small_img = small_img.to_grayscale(); status = 'grayscale ' + if (image_format==3): small_img = small_img.to_rgb565(); status = 'rgb565 ' + + # update small image location + if BOUNCE: + x = x + xd + if (xxmax): + xd = -xd + + y = y + yd + if (yymax): + yd = -yd + + # Update small image scale + if RESCALE: + rescale = rescale + rd + if (rescalemax_rescale): + rd = -rd + + # Find the center of the image + scaled_width = int(small_img.width() * abs(rescale)) + scaled_height= int(small_img.height() * abs(rescale)) + + apply_mask = CYCLE_MASK and ((value_mixer >> 9) & 1) + if apply_mask: + img.draw_image(small_img, int(x), int(y), mask=small_img.to_bitmap(), x_scale=rescale, y_scale=rescale, alpha=240) + status += 'alpha:240 ' + status += '+mask ' + else: + img.draw_image(small_img, int(x), int(y), x_scale=rescale, y_scale=rescale, alpha=128) + status += 'alpha:128 ' + + img.draw_string(8, 0, status, mono_space = False) + img.copy_to(osd_img) + del img, small_img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/image_drawing_alpha_blending_test.md b/zh/example/omv/Drawing/image_drawing_alpha_blending_test.md new file mode 100644 index 0000000..37936fd --- /dev/null +++ b/zh/example/omv/Drawing/image_drawing_alpha_blending_test.md @@ -0,0 +1,167 @@ +# image_drawing_alpha_blending_test + +```python +# Image Drawing Alpha Blending Test +# +# This script tests the performance and quality of the draw_image() +# method which can perform nearest neighbor, bilinear, bicubic, and +# area scaling along with color channel extraction, alpha blending, +# color palette application, and alpha palette application. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +small_img = image.Image(4,4,image.RGB565) +small_img.set_pixel(0, 0, (0, 0, 127)) +small_img.set_pixel(1, 0, (47, 255, 199)) +small_img.set_pixel(2, 0, (0, 188, 255)) +small_img.set_pixel(3, 0, (0, 0, 127)) +small_img.set_pixel(0, 1, (0, 176, 255)) +small_img.set_pixel(1, 1, (222, 0, 0 )) +small_img.set_pixel(2, 1, (50, 255, 195)) +small_img.set_pixel(3, 1, (86, 255, 160)) +small_img.set_pixel(0, 2, (255, 211, 0 )) +small_img.set_pixel(1, 2, (83, 255, 163)) +small_img.set_pixel(2, 2, (255, 211, 0)) +small_img.set_pixel(3, 2, (0, 80, 255)) +small_img.set_pixel(0, 3, (255, 118, 0 )) +small_img.set_pixel(1, 3, (127, 0, 0 )) +small_img.set_pixel(2, 3, (0, 144, 255)) +small_img.set_pixel(3, 3, (50, 255, 195)) + +big_img = image.Image(128,128,image.RGB565) +big_img.draw_image(small_img, 0, 0, x_scale=32, y_scale=32) + +alpha_div = 1 +alpha_value_init = 0 +alpha_step_init = 2 + +x_bounce_init = DISPLAY_WIDTH//2 +x_bounce_toggle_init = 1 + +y_bounce_init = DISPLAY_HEIGHT//2 +y_bounce_toggle_init = 1 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # # set chn0 output size + # camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # # set chn0 output format + # camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # # create meida source device + # globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # # create meida sink device + # globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # # create meida link + # media.create_link(meida_source, meida_sink) + # # set display plane with video channel + # display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + # media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + alpha_value = alpha_value_init + alpha_step = alpha_step_init + x_bounce = x_bounce_init + x_bounce_toggle = x_bounce_toggle_init + y_bounce = y_bounce_init + y_bounce_toggle = y_bounce_toggle_init + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.draw_image(big_img, x_bounce, y_bounce, rgb_channel=-1, alpha=alpha_value//alpha_div) + + x_bounce += x_bounce_toggle + if abs(x_bounce-(img.width()//2)) >= (img.width()//2): x_bounce_toggle = -x_bounce_toggle + + y_bounce += y_bounce_toggle + if abs(y_bounce-(img.height()//2)) >= (img.height()//2): y_bounce_toggle = -y_bounce_toggle + + alpha_value += alpha_step + if not alpha_value or alpha_value//alpha_div == 256: alpha_step = -alpha_step + + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/keypoints_drawing.md b/zh/example/omv/Drawing/keypoints_drawing.md new file mode 100644 index 0000000..66b592a --- /dev/null +++ b/zh/example/omv/Drawing/keypoints_drawing.md @@ -0,0 +1,116 @@ +# keypoints_drawing + +```python +# Keypoints Drawing +# +# This example shows off drawing keypoints on the CanMV Cam. Usually you call draw_keypoints() +# on a keypoints object but you can also call it on a list of 3-value tuples... + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, urandom + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for drawing + img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + img.clear() + for i in range(10): + x = (urandom.getrandbits(30) % (2*img.width())) - (img.width()//2) + y = (urandom.getrandbits(30) % (2*img.height())) - (img.height()//2) + rot = urandom.getrandbits(30) % 360 + r = (urandom.getrandbits(30) % 127) + 128 + g = (urandom.getrandbits(30) % 127) + 128 + b = (urandom.getrandbits(30) % 127) + 128 + # This method draws a keypoints object or a list of (x, y, rot) tuples... + img.draw_keypoints([(x, y, rot)], color = (r, g, b), size = 20, thickness = 2, fill = False) + img.copy_to(osd_img) + time.sleep(1) + os.exitpoint() + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except KeyboardInterrupt as e: + print("user stop: ", e) + except BaseException as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/line_drawing.md b/zh/example/omv/Drawing/line_drawing.md new file mode 100644 index 0000000..1352875 --- /dev/null +++ b/zh/example/omv/Drawing/line_drawing.md @@ -0,0 +1,117 @@ +# line_drawing + +```python +# Line Drawing +# +# This example shows off drawing lines on the CanMV Cam. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, urandom + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for drawing + img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + img.clear() + for i in range(10): + x0 = (urandom.getrandbits(30) % (2*img.width())) - (img.width()//2) + y0 = (urandom.getrandbits(30) % (2*img.height())) - (img.height()//2) + x1 = (urandom.getrandbits(30) % (2*img.width())) - (img.width()//2) + y1 = (urandom.getrandbits(30) % (2*img.height())) - (img.height()//2) + r = (urandom.getrandbits(30) % 127) + 128 + g = (urandom.getrandbits(30) % 127) + 128 + b = (urandom.getrandbits(30) % 127) + 128 + # If the first argument is a scaler then this method expects + # to see x0, y0, x1, and y1. Otherwise, it expects a (x0,y0,x1,y1) tuple. + img.draw_line(x0, y0, x1, y1, color = (r, g, b), thickness = 2) + img.copy_to(osd_img) + time.sleep(1) + os.exitpoint() + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except KeyboardInterrupt as e: + print("user stop: ", e) + except BaseException as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/rectangle_drawing.md b/zh/example/omv/Drawing/rectangle_drawing.md new file mode 100644 index 0000000..af8f676 --- /dev/null +++ b/zh/example/omv/Drawing/rectangle_drawing.md @@ -0,0 +1,117 @@ +# rectangle_drawing + +```python +# Rectangle Drawing +# +# This example shows off drawing rectangles on the CanMV Cam. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, urandom + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for drawing + img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + img.clear() + for i in range(10): + x = (urandom.getrandbits(30) % (2*img.width())) - (img.width()//2) + y = (urandom.getrandbits(30) % (2*img.height())) - (img.height()//2) + w = (urandom.getrandbits(30) % (img.width()//2)) + h = (urandom.getrandbits(30) % (img.height()//2)) + r = (urandom.getrandbits(30) % 127) + 128 + g = (urandom.getrandbits(30) % 127) + 128 + b = (urandom.getrandbits(30) % 127) + 128 + # If the first argument is a scaler then this method expects + # to see x, y, w, and h. Otherwise, it expects a (x,y,w,h) tuple. + img.draw_rectangle(x, y, w, h, color = (r, g, b), thickness = 2, fill = False) + img.copy_to(osd_img) + time.sleep(1) + os.exitpoint() + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except KeyboardInterrupt as e: + print("user stop: ", e) + except BaseException as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Drawing/text_drawing.md b/zh/example/omv/Drawing/text_drawing.md new file mode 100644 index 0000000..dc13d0c --- /dev/null +++ b/zh/example/omv/Drawing/text_drawing.md @@ -0,0 +1,118 @@ +# text_drawing + +```python +# Text Drawing +# +# This example shows off drawing text on the CanMV Cam. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys, urandom + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def draw(): + # create image for drawing + img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + img.clear() + for i in range(10): + x = (urandom.getrandbits(30) % (2*img.width())) - (img.width()//2) + y = (urandom.getrandbits(30) % (2*img.height())) - (img.height()//2) + r = (urandom.getrandbits(30) % 127) + 128 + g = (urandom.getrandbits(30) % 127) + 128 + b = (urandom.getrandbits(30) % 127) + 128 + # If the first argument is a scaler then this method expects + # to see x, y, and text. Otherwise, it expects a (x,y,text) tuple. + # Character and string rotation can be done at 0, 90, 180, 270, and etc. degrees. + img.draw_string(x, y, "Hello World!", color = (r, g, b), scale = 2, mono_space = False, + char_rotation = 0, char_hmirror = False, char_vflip = False, + string_rotation = 0, string_hmirror = False, string_vflip = False) + img.copy_to(osd_img) + time.sleep(1) + os.exitpoint() + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("draw") + draw() + except KeyboardInterrupt as e: + print("user stop: ", e) + except BaseException as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Feature-Detection/edges.md b/zh/example/omv/Feature-Detection/edges.md new file mode 100644 index 0000000..c892d2b --- /dev/null +++ b/zh/example/omv/Feature-Detection/edges.md @@ -0,0 +1,123 @@ +# edges + +```python +# Edge detection with Canny: +# +# This example demonstrates the Canny edge detector. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.GRAYSCALE, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, data=yuv420_img) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + # Use Canny edge detector + img.find_edges(image.EDGE_CANNY, threshold=(50, 80)) + # Faster simpler edge detection + #img.find_edges(image.EDGE_SIMPLE, threshold=(100, 255)) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Feature-Detection/find_circles.md b/zh/example/omv/Feature-Detection/find_circles.md new file mode 100644 index 0000000..e517f4f --- /dev/null +++ b/zh/example/omv/Feature-Detection/find_circles.md @@ -0,0 +1,143 @@ +# find_circles + +```python +# Find Circles Example +# +# This example shows off how to find circles in the image using the Hough +# Transform. https://en.wikipedia.org/wiki/Circle_Hough_Transform +# +# Note that the find_circles() method will only find circles which are completely +# inside of the image. Circles which go outside of the image/roi are ignored... + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + draw_img.clear() + # Circle objects have four values: x, y, r (radius), and magnitude. The + # magnitude is the strength of the detection of the circle. Higher is + # better... + + # `threshold` controls how many circles are found. Increase its value + # to decrease the number of circles detected... + + # `x_margin`, `y_margin`, and `r_margin` control the merging of similar + # circles in the x, y, and r (radius) directions. + + # r_min, r_max, and r_step control what radiuses of circles are tested. + # Shrinking the number of tested circle radiuses yields a big performance boost. + + for c in img.find_circles(threshold = 2000, x_margin = 10, y_margin = 10, r_margin = 10, + r_min = 2, r_max = 100, r_step = 2): + draw_img.draw_circle(c.x()*SCALE, c.y()*SCALE, c.r()*SCALE, color = (255, 0, 0)) + print(c) + draw_img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Feature-Detection/find_lines.md b/zh/example/omv/Feature-Detection/find_lines.md new file mode 100644 index 0000000..2ae2a9d --- /dev/null +++ b/zh/example/omv/Feature-Detection/find_lines.md @@ -0,0 +1,158 @@ +# find_lines + +```python +# Find Lines Example +# +# This example shows off how to find lines in the image. For each line object +# found in the image a line object is returned which includes the line's rotation. + +# Note: Line detection is done by using the Hough Transform: +# http://en.wikipedia.org/wiki/Hough_transform +# Please read about it above for more information on what `theta` and `rho` are. + +# find_lines() finds infinite length lines. Use find_line_segments() to find non-infinite lines. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +# All line objects have a `theta()` method to get their rotation angle in degrees. +# You can filter lines based on their rotation angle. + +min_degree = 0 +max_degree = 179 + +# All lines also have `x1()`, `y1()`, `x2()`, and `y2()` methods to get their end-points +# and a `line()` method to get all the above as one 4 value tuple for `draw_line()`. + +# About negative rho values: +# +# A [theta+0:-rho] tuple is the same as [theta+180:+rho]. + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + draw_img.clear() + # `threshold` controls how many lines in the image are found. Only lines with + # edge difference magnitude sums greater than `threshold` are detected... + + # More about `threshold` - each pixel in the image contributes a magnitude value + # to a line. The sum of all contributions is the magintude for that line. Then + # when lines are merged their magnitudes are added togheter. Note that `threshold` + # filters out lines with low magnitudes before merging. To see the magnitude of + # un-merged lines set `theta_margin` and `rho_margin` to 0... + + # `theta_margin` and `rho_margin` control merging similar lines. If two lines + # theta and rho value differences are less than the margins then they are merged. + + for l in img.find_lines(threshold = 1000, theta_margin = 25, rho_margin = 25): + if (min_degree <= l.theta()) and (l.theta() <= max_degree): + draw_img.draw_line([v*SCALE for v in l.line()], color = (255, 0, 0)) + print(l) + draw_img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Feature-Detection/find_rects.md b/zh/example/omv/Feature-Detection/find_rects.md new file mode 100644 index 0000000..263b928 --- /dev/null +++ b/zh/example/omv/Feature-Detection/find_rects.md @@ -0,0 +1,135 @@ +# find_rects + +```python +# Find Rects Example +# +# This example shows off how to find rectangles in the image using the quad threshold +# detection code from our April Tags code. The quad threshold detection algorithm +# detects rectangles in an extremely robust way and is much better than Hough +# Transform based methods. For example, it can still detect rectangles even when lens +# distortion causes those rectangles to look bent. Rounded rectangles are no problem! +# (But, given this the code will also detect small radius circles too)... + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + draw_img.clear() + # `threshold` below should be set to a high enough value to filter out noise + # rectangles detected in the image which have low edge magnitudes. Rectangles + # have larger edge magnitudes the larger and more contrasty they are... + + for r in img.find_rects(threshold = 10000): + draw_img.draw_rectangle([v*SCALE for v in r.rect()], color = (255, 0, 0)) + for p in r.corners(): draw_img.draw_circle(p[0]*SCALE, p[1]*SCALE, 5*SCALE, color = (0, 255, 0)) + print(r) + draw_img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Feature-Detection/hog.md b/zh/example/omv/Feature-Detection/hog.md new file mode 100644 index 0000000..64abf74 --- /dev/null +++ b/zh/example/omv/Feature-Detection/hog.md @@ -0,0 +1,123 @@ +# hog + +```python +# Histogram of Oriented Gradients (HoG) Example +# +# This example demonstrates HoG visualization. +# +# Note: Due to JPEG artifacts, the HoG visualization looks blurry. To see the +# image without JPEG artifacts, uncomment the lines that save the image to uSD. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.GRAYSCALE, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, data=yuv420_img) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + img.find_hog() + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Feature-Detection/keypoints.md b/zh/example/omv/Feature-Detection/keypoints.md new file mode 100644 index 0000000..aadfa24 --- /dev/null +++ b/zh/example/omv/Feature-Detection/keypoints.md @@ -0,0 +1,157 @@ +# keypoints + +```python +# Object tracking with keypoints example. +# Show the camera an object and then run the script. A set of keypoints will be extracted +# once and then tracked in the following frames. If you want a new set of keypoints re-run +# the script. NOTE: see the docs for arguments to tune find_keypoints and match_keypoints. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def camera_drop(frame): + for i in range(frame): + os.exitpoint() + img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, img) + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + kpts1 = None + # NOTE: uncomment to load a keypoints descriptor from file + #kpts1 = image.load_descriptor("/desc.orb") + camera_drop(60) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_grayscale() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + draw_img.clear() + if kpts1 == None: + # NOTE: By default find_keypoints returns multi-scale keypoints extracted from an image pyramid. + kpts1 = img.find_keypoints(max_keypoints=150, threshold=10, scale_factor=1.2) + if kpts1: + if SCALE == 1: + draw_img.draw_keypoints(kpts1) + draw_img.copy_to(osd_img) + time.sleep(2) + fps.reset() + else: + # NOTE: When extracting keypoints to match the first descriptor, we use normalized=True to extract + # keypoints from the first scale only, which will match one of the scales in the first descriptor. + kpts2 = img.find_keypoints(max_keypoints=150, threshold=10, normalized=True) + if kpts2: + match = image.match_descriptor(kpts1, kpts2, threshold=85) + if (match.count()>10): + # If we have at least n "good matches" + # Draw bounding rectangle and cross. + draw_img.draw_rectangle([v*SCALE for v in match.rect()]) + draw_img.draw_cross(match.cx()*SCALE, match.cy()*SCALE, size=10) + + print(kpts2, "matched:%d dt:%d"%(match.count(), match.theta())) + # NOTE: uncomment if you want to draw the keypoints + #img.draw_keypoints(kpts2, size=KEYPOINTS_SIZE, matched=True) + draw_img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Feature-Detection/lbp.md b/zh/example/omv/Feature-Detection/lbp.md new file mode 100644 index 0000000..bb0e71b --- /dev/null +++ b/zh/example/omv/Feature-Detection/lbp.md @@ -0,0 +1,156 @@ +# lbp + +```python +# Local Binary Patterns (LBP) Example +# +# This example shows off how to use the local binary pattern feature descriptor +# on your CanMV Cam. LBP descriptors work like Freak feature descriptors. +# +# WARNING: LBP supports needs to be reworked! As of right now this feature needs +# a lot of work to be made into somethin useful. This script will reamin to show +# that the functionality exists, but, in its current state is inadequate. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def camera_drop(frame): + for i in range(frame): + os.exitpoint() + img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, img) + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + osd_img.draw_string(0, 0, "Please wait...") + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + # Load Haar Cascade + # By default this will use all stages, lower satges is faster but less accurate. + face_cascade = image.HaarCascade("frontalface", stages=25) + print(face_cascade) + d0 = None + #d0 = image.load_descriptor("/desc.lbp") + # Skip a few frames to allow the sensor settle down + # Note: This takes more time when exec from the IDE. + camera_drop(90) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, data=yuv420_img) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + draw_img.clear() + objects = img.find_features(face_cascade, threshold=0.5, scale_factor=1.25) + if objects: + face = objects[0] + d1 = img.find_lbp(face) + if (d0 == None): + d0 = d1 + else: + dist = image.match_descriptor(d0, d1) + draw_img.draw_string(0, 10, "Match %d%%"%(dist)) + print("Match %d%%"%(dist)) + + draw_img.draw_rectangle([v*SCALE for v in face]) + # Draw FPS + draw_img.draw_string(0, 0, "FPS:%.2f"%(fps.fps())) + draw_img.copy_to(osd_img) + del img + gc.collect() + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Feature-Detection/linear_regression_fast.md b/zh/example/omv/Feature-Detection/linear_regression_fast.md new file mode 100644 index 0000000..0529bfe --- /dev/null +++ b/zh/example/omv/Feature-Detection/linear_regression_fast.md @@ -0,0 +1,142 @@ +# linear_regression_fast + +```python +# Fast Linear Regression Example +# +# This example shows off how to use the get_regression() method on your CanMV Cam +# to get the linear regression of a ROI. Using this method you can easily build +# a robot which can track lines which all point in the same general direction +# but are not actually connected. Use find_blobs() on lines that are nicely +# connected for better filtering options and control. +# +# This is called the fast linear regression because we use the least-squares +# method to fit the line. However, this method is NOT GOOD FOR ANY images that +# have a lot (or really any) outlier points which corrupt the line fit... + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +THRESHOLD = (0, 100) # Grayscale threshold for dark things... +BINARY_VISIBLE = True # Does binary first so you can see what the linear regression + # is being run on... might lower FPS though. + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.GRAYSCALE, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + osd_img.draw_string(0, 0, "Please wait...") + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, data=yuv420_img) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + img = img.binary([THRESHOLD]) if BINARY_VISIBLE else img + # Returns a line object similar to line objects returned by find_lines() and + # find_line_segments(). You have x1(), y1(), x2(), y2(), length(), + # theta() (rotation in degrees), rho(), and magnitude(). + # + # magnitude() represents how well the linear regression worked. It goes from + # (0, INF] where 0 is returned for a circle. The more linear the + # scene is the higher the magnitude. + line = img.get_regression([(255,255) if BINARY_VISIBLE else THRESHOLD]) + if (line): img.draw_line(line.line(), color = 127) + print("FPS %f, mag = %s" % (fps.fps(), str(line.magnitude()) if (line) else "N/A")) + img.copy_to(osd_img) + del img + gc.collect() + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Feature-Detection/linear_regression_robust.md b/zh/example/omv/Feature-Detection/linear_regression_robust.md new file mode 100644 index 0000000..2bcda71 --- /dev/null +++ b/zh/example/omv/Feature-Detection/linear_regression_robust.md @@ -0,0 +1,144 @@ +# linear_regression_robust + +```python +# Robust Linear Regression Example +# +# This example shows off how to use the get_regression() method on your CanMV Cam +# to get the linear regression of a ROI. Using this method you can easily build +# a robot which can track lines which all point in the same general direction +# but are not actually connected. Use find_blobs() on lines that are nicely +# connected for better filtering options and control. +# +# We're using the robust=True argument for get_regression() in this script which +# computes the linear regression using a much more robust algorithm... but potentially +# much slower. The robust algorithm runs in O(N^2) time on the image. So, YOU NEED +# TO LIMIT THE NUMBER OF PIXELS the robust algorithm works on or it can actually +# take seconds for the algorithm to give you a result... THRESHOLD VERY CAREFULLY! + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +THRESHOLD = (0, 100) # Grayscale threshold for dark things... +BINARY_VISIBLE = True # Does binary first so you can see what the linear regression + # is being run on... might lower FPS though. + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.GRAYSCALE, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + osd_img.draw_string(0, 0, "Please wait...") + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, data=yuv420_img) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + img = img.binary([THRESHOLD]) if BINARY_VISIBLE else img + # Returns a line object similar to line objects returned by find_lines() and + # find_line_segments(). You have x1(), y1(), x2(), y2(), length(), + # theta() (rotation in degrees), rho(), and magnitude(). + # + # magnitude() represents how well the linear regression worked. It goes from + # (0, INF] where 0 is returned for a circle. The more linear the + # scene is the higher the magnitude. + line = img.get_regression([(255,255) if BINARY_VISIBLE else THRESHOLD], robust = True) + if (line): img.draw_line(line.line(), color = 127) + print("FPS %f, mag = %s" % (fps.fps(), str(line.magnitude()) if (line) else "N/A")) + img.copy_to(osd_img) + del img + gc.collect() + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Feature-Detection/template_matching.md b/zh/example/omv/Feature-Detection/template_matching.md new file mode 100644 index 0000000..a123168 --- /dev/null +++ b/zh/example/omv/Feature-Detection/template_matching.md @@ -0,0 +1,146 @@ +# template_matching + +```python +# Template Matching Example - Normalized Cross Correlation (NCC) +# +# This example shows off how to use the NCC feature of your CanMV Cam to match +# image patches to parts of an image... expect for extremely controlled enviorments +# NCC is not all to useful. +# +# WARNING: NCC supports needs to be reworked! As of right now this feature needs +# a lot of work to be made into somethin useful. This script will reamin to show +# that the functionality exists, but, in its current state is inadequate. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys +from image import SEARCH_EX, SEARCH_DS + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + osd_img.draw_string(0, 0, "Please wait...") + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + # Load template. + # Template should be a small (eg. 32x32 pixels) grayscale image. + # template = image.Image("/sd/template.bmp") + # template.to_grayscale() + template = image.Image(32, 32, image.GRAYSCALE) + template.draw_circle(16,16,16,color=(255,255,255),fill=True) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, data=yuv420_img) + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + draw_img.clear() + # find_template(template, threshold, [roi, step, search]) + # ROI: The region of interest tuple (x, y, w, h). + # Step: The loop step used (y+=step, x+=step) use a bigger step to make it faster. + # Search is either image.SEARCH_EX for exhaustive search or image.SEARCH_DS for diamond search + # + # Note1: ROI has to be smaller than the image and bigger than the template. + # Note2: In diamond search, step and ROI are both ignored. + r = img.find_template(template, 0.50, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60)) + if r: + draw_img.draw_rectangle([v*SCALE for v in r],color=(255,0,0)) + draw_img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/adaptive_histogram_equalization.md b/zh/example/omv/Image-Filters/adaptive_histogram_equalization.md new file mode 100644 index 0000000..4799204 --- /dev/null +++ b/zh/example/omv/Image-Filters/adaptive_histogram_equalization.md @@ -0,0 +1,130 @@ +# adaptive_histogram_equalization + +```python +# Adaptive Histogram Equalization +# +# This example shows off how to use adaptive histogram equalization to improve +# the contrast in the image. Adaptive histogram equalization splits the image +# into regions and then equalizes the histogram in those regions to improve +# the image contrast versus a global histogram equalization. Additionally, +# you may specify a clip limit to prevent the contrast from going wild. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # A clip_limit of < 0 gives you normal adaptive histogram equalization + # which may result in huge amounts of contrast noise... + + # A clip_limit of 1 does nothing. For best results go slightly higher + # than 1 like below. The higher you go the closer you get back to + # standard adaptive histogram equalization with huge contrast swings. + img.histeq(adaptive=True, clip_limit=3) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/blur_filter.md b/zh/example/omv/Image-Filters/blur_filter.md new file mode 100644 index 0000000..7379d14 --- /dev/null +++ b/zh/example/omv/Image-Filters/blur_filter.md @@ -0,0 +1,121 @@ +# blur_filter + +```python +# Blur Filter Example +# +# This example shows off using the guassian filter to blur images. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # Run the kernel on every pixel of the image. + img.gaussian(1) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/cartoon_filter.md b/zh/example/omv/Image-Filters/cartoon_filter.md new file mode 100644 index 0000000..d04b031 --- /dev/null +++ b/zh/example/omv/Image-Filters/cartoon_filter.md @@ -0,0 +1,131 @@ +# cartoon_filter + +```python +# Cartoon Filter +# +# This example shows off a simple cartoon filter on images. The cartoon +# filter works by joining similar pixel areas of an image and replacing +# the pixels in those areas with the area mean. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # seed_threshold controls the maximum area growth of a colored + # region. Making this larger will merge more pixels. + + # floating_threshold controls the maximum pixel-to-pixel difference + # when growing a region. Settings this very high will quickly combine + # all pixels in the image. You should keep this small. + + # cartoon() will grow regions while both thresholds are statisfied... + + img.cartoon(seed_threshold=0.05, floating_thresholds=0.05) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/color_bilateral_filter.md b/zh/example/omv/Image-Filters/color_bilateral_filter.md new file mode 100644 index 0000000..21c1e70 --- /dev/null +++ b/zh/example/omv/Image-Filters/color_bilateral_filter.md @@ -0,0 +1,133 @@ +# color_bilateral_filter + +```python +# Color Bilteral Filter Example +# +# This example shows off using the bilateral filter on color images. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # color_sigma controls how close color wise pixels have to be to each other to be + # blured togheter. A smaller value means they have to be closer. + # A larger value is less strict. + + # space_sigma controls how close space wise pixels have to be to each other to be + # blured togheter. A smaller value means they have to be closer. + # A larger value is less strict. + + # Run the kernel on every pixel of the image. + img.bilateral(3, color_sigma=0.1, space_sigma=1) + + # Note that the bilateral filter can introduce image defects if you set + # color_sigma/space_sigma to aggresively. Increase the sigma values until + # the defects go away if you see them. + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/color_binary_filter.md b/zh/example/omv/Image-Filters/color_binary_filter.md new file mode 100644 index 0000000..8efdac9 --- /dev/null +++ b/zh/example/omv/Image-Filters/color_binary_filter.md @@ -0,0 +1,147 @@ +# color_binary_filter + +```python +# Color Binary Filter Example +# +# This script shows off the binary image filter. You may pass binary any +# number of thresholds to segment the image by. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +# Use the Tools -> Machine Vision -> Threshold Edtor to pick better thresholds. +red_threshold = (0,100, 0,127, 0,127) # L A B +green_threshold = (0,100, -128,0, 0,127) # L A B +blue_threshold = (0,100, -128,127, -128,0) # L A B + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + frame_count = 0 + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # Test red threshold + if frame_count < 100: + img.binary([red_threshold]) + # Test green threshold + elif frame_count < 200: + img.binary([green_threshold]) + # Test blue threshold + elif frame_count < 300: + img.binary([blue_threshold]) + # Test not red threshold + elif frame_count < 400: + img.binary([red_threshold], invert = 1) + # Test not green threshold + elif frame_count < 500: + img.binary([green_threshold], invert = 1) + # Test not blue threshold + elif frame_count < 600: + img.binary([blue_threshold], invert = 1) + else: + frame_count = 0 + frame_count = frame_count + 1 + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/color_light_removal.md b/zh/example/omv/Image-Filters/color_light_removal.md new file mode 100644 index 0000000..b4eddb1 --- /dev/null +++ b/zh/example/omv/Image-Filters/color_light_removal.md @@ -0,0 +1,127 @@ +# color_light_removal + +```python +# Color Light Removal +# +# This example shows off how to remove bright lights from the image. +# You can do this using the binary() method with the "zero=" argument. +# +# Removing bright lights from the image allows you to now use +# histeq() on the image without outliers from oversaturated +# parts of the image breaking the algorithm... + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +thresholds = (90, 100, -128, 127, -128, 127) + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.binary([thresholds], invert=False, zero=True) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/edge_filter.md b/zh/example/omv/Image-Filters/edge_filter.md new file mode 100644 index 0000000..81caa9d --- /dev/null +++ b/zh/example/omv/Image-Filters/edge_filter.md @@ -0,0 +1,121 @@ +# edge_filter + +```python +# Edge Filter Example +# +# This example shows off using the laplacian filter to detect edges. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # Run the kernel on every pixel of the image. + img.laplacian(1,sharpen=True) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/erode_and_dilate.md b/zh/example/omv/Image-Filters/erode_and_dilate.md new file mode 100644 index 0000000..61f6127 --- /dev/null +++ b/zh/example/omv/Image-Filters/erode_and_dilate.md @@ -0,0 +1,148 @@ +# erode_and_dilate + +```python +# Erode and Dilate Example +# +# This example shows off the erode and dilate functions which you can run on +# a binary image to remove noise. This example was originally a test but its +# useful for showing off how these functions work. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +grayscale_thres = (170, 255) +rgb565_thres = (70, 100, -128, 127, -128, 127) + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + frame_count = 0 + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # Test red threshold + if frame_count < 100: + img.binary([rgb565_thres]) + img.erode(2) + # Test green threshold + elif frame_count < 200: + img.binary([rgb565_thres]) + img.dilate(2) + # Test blue threshold + elif frame_count < 300: + img = img.to_grayscale() + img.binary([grayscale_thres]) + img.erode(2) + img = img.to_rgb565() + # Test not red threshold + elif frame_count < 400: + img = img.to_grayscale() + img.binary([grayscale_thres]) + img.dilate(2) + img = img.to_rgb565() + else: + frame_count = 0 + frame_count = frame_count + 1 + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/gamma_correction.md b/zh/example/omv/Image-Filters/gamma_correction.md new file mode 100644 index 0000000..9c40c11 --- /dev/null +++ b/zh/example/omv/Image-Filters/gamma_correction.md @@ -0,0 +1,123 @@ +# gamma_correction + +```python +# Gamma Correction +# +# This example shows off gamma correction to make the image brighter. The gamma +# correction method can also fix contrast and brightness too. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # Gamma, contrast, and brightness correction are applied to each color channel. The + # values are scaled to the range per color channel per image type... + img.gamma_corr(gamma = 0.5, contrast = 1.0, brightness = 0.0) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/grayscale_bilateral_filter.md b/zh/example/omv/Image-Filters/grayscale_bilateral_filter.md new file mode 100644 index 0000000..65d9bdf --- /dev/null +++ b/zh/example/omv/Image-Filters/grayscale_bilateral_filter.md @@ -0,0 +1,134 @@ +# grayscale_bilateral_filter + +```python +# Grayscale Bilteral Filter Example +# +# This example shows off using the bilateral filter on grayscale images. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.GRAYSCALE, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_grayscale() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # color_sigma controls how close color wise pixels have to be to each other to be + # blured togheter. A smaller value means they have to be closer. + # A larger value is less strict. + + # space_sigma controls how close space wise pixels have to be to each other to be + # blured togheter. A smaller value means they have to be closer. + # A larger value is less strict. + + # Run the kernel on every pixel of the image. + img.bilateral(3, color_sigma=0.1, space_sigma=1) + + # Note that the bilateral filter can introduce image defects if you set + # color_sigma/space_sigma to aggresively. Increase the sigma values until + # the defects go away if you see them. + + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/grayscale_binary_filter.md b/zh/example/omv/Image-Filters/grayscale_binary_filter.md new file mode 100644 index 0000000..c1c3f72 --- /dev/null +++ b/zh/example/omv/Image-Filters/grayscale_binary_filter.md @@ -0,0 +1,139 @@ +# grayscale_binary_filter + +```python +# Grayscale Binary Filter Example +# +# This script shows off the binary image filter. You may pass binary any +# number of thresholds to segment the image by. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +low_threshold = (0, 50) +high_threshold = (205, 255) + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.GRAYSCALE, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + frame_count = 0 + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_grayscale() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # Test low threshold + if frame_count < 100: + img.binary([low_threshold]) + # Test high threshold + elif frame_count < 200: + img.binary([high_threshold]) + # Test not low threshold + elif frame_count < 300: + img.binary([low_threshold], invert = 1) + # Test not high threshold + elif frame_count < 400: + img.binary([high_threshold], invert = 1) + else: + frame_count = 0 + frame_count = frame_count + 1 + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/grayscale_light_removal.md b/zh/example/omv/Image-Filters/grayscale_light_removal.md new file mode 100644 index 0000000..419c762 --- /dev/null +++ b/zh/example/omv/Image-Filters/grayscale_light_removal.md @@ -0,0 +1,127 @@ +# grayscale_light_removal + +```python +# Grayscale Light Removal +# +# This example shows off how to remove bright lights from the image. +# You can do this using the binary() method with the "zero=" argument. +# +# Removing bright lights from the image allows you to now use +# histeq() on the image without outliers from oversaturated +# parts of the image breaking the algorithm... + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +thresholds = (220, 255) + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.GRAYSCALE, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_grayscale() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.binary([thresholds], invert=False, zero=True) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/histogram_equalization.md b/zh/example/omv/Image-Filters/histogram_equalization.md new file mode 100644 index 0000000..8ddb040 --- /dev/null +++ b/zh/example/omv/Image-Filters/histogram_equalization.md @@ -0,0 +1,121 @@ +# histogram_equalization + +```python +# Histogram Equalization +# +# This example shows off how to use histogram equalization to improve +# the contrast in the image. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.histeq() + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/kernel_filters.md b/zh/example/omv/Image-Filters/kernel_filters.md new file mode 100644 index 0000000..cf2dba0 --- /dev/null +++ b/zh/example/omv/Image-Filters/kernel_filters.md @@ -0,0 +1,127 @@ +# kernel_filters + +```python +# Kernel Filtering Example +# +# This example shows off how to use a generic kernel filter. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +kernel_size = 1 # 3x3==1, 5x5==2, 7x7==3, etc. + +kernel = [-2, -1, 0, + -1, 1, 1, + 0, 1, 2] + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.GRAYSCALE, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_grayscale() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # Run the kernel on every pixel of the image. + img.morph(kernel_size, kernel) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/lens_correction.md b/zh/example/omv/Image-Filters/lens_correction.md new file mode 100644 index 0000000..217fb4b --- /dev/null +++ b/zh/example/omv/Image-Filters/lens_correction.md @@ -0,0 +1,123 @@ +# lens_correction + +```python +# Lens Correction +# +# This example shows off how to use the lens correction method to fix lens +# distortion in an image. You need to do this for qrcode / barcode / data matrix +# detection. Increase the strength below until lines are straight in the view. +# Zoom in (higher) or out (lower) until you see enough of the image. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.lens_corr(strength = 1.8, zoom = 1.0) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/linear_polar.md b/zh/example/omv/Image-Filters/linear_polar.md new file mode 100644 index 0000000..174ff1b --- /dev/null +++ b/zh/example/omv/Image-Filters/linear_polar.md @@ -0,0 +1,123 @@ +# linear_polar + +```python +# Linear Polar Mapping Example +# +# This example shows off re-projecting the image using a linear polar +# transformation. Linear polar images are useful in that rotations +# become translations in the X direction and linear changes +# in scale become linear translations in the Y direction. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.linpolar(reverse=False) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/log_polar.md b/zh/example/omv/Image-Filters/log_polar.md new file mode 100644 index 0000000..3cbc355 --- /dev/null +++ b/zh/example/omv/Image-Filters/log_polar.md @@ -0,0 +1,123 @@ +# log_polar + +```python +# Log Polar Mapping Example +# +# This example shows off re-projecting the image using a log polar +# transformation. Log polar images are useful in that rotations +# become translations in the X direction and exponential changes +# in scale (x2, x4, etc.) become linear translations in the Y direction. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.logpolar(reverse=False) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/mean_adaptive_threshold_filter.md b/zh/example/omv/Image-Filters/mean_adaptive_threshold_filter.md new file mode 100644 index 0000000..520c5d3 --- /dev/null +++ b/zh/example/omv/Image-Filters/mean_adaptive_threshold_filter.md @@ -0,0 +1,125 @@ +# mean_adaptive_threshold_filter + +```python +# Mean Adaptive Threshold Filter Example +# +# This example shows off mean filtering with adaptive thresholding. +# When mean(threshold=True) the mean() method adaptive thresholds the image +# by comparing the mean of the pixels around a pixel, minus an offset, with that pixel. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # The first argument is the kernel size. N coresponds to a ((N*2)+1)^2 + # kernel size. E.g. 1 == 3x3 kernel, 2 == 5x5 kernel, etc. Note: You + # shouldn't ever need to use a value bigger than 2. + img.mean(1, threshold=True, offset=5, invert=True) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/mean_filter.md b/zh/example/omv/Image-Filters/mean_filter.md new file mode 100644 index 0000000..af48782 --- /dev/null +++ b/zh/example/omv/Image-Filters/mean_filter.md @@ -0,0 +1,125 @@ +# mean_filter + +```python +# Mean Filter Example +# +# This example shows off mean filtering. Mean filtering is your standard average +# filter in a NxN neighborhood. Mean filtering removes noise in the image by +# bluring everything. But, it's the fastest kernel filter operation. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # The only argument is the kernel size. N coresponds to a ((N*2)+1)^2 + # kernel size. E.g. 1 == 3x3 kernel, 2 == 5x5 kernel, etc. Note: You + # shouldn't ever need to use a value bigger than 2. + img.mean(1) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/median_adaptive_threshold_filter.md b/zh/example/omv/Image-Filters/median_adaptive_threshold_filter.md new file mode 100644 index 0000000..2b1ed99 --- /dev/null +++ b/zh/example/omv/Image-Filters/median_adaptive_threshold_filter.md @@ -0,0 +1,127 @@ +# median_adaptive_threshold_filter + +```python +# Median Adaptive Threshold Filter Example +# +# This example shows off median filtering with adaptive thresholding. +# When median(threshold=True) the median() method adaptive thresholds the image +# by comparing the median of the pixels around a pixel, minus an offset, with that pixel. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # The first argument to the median filter is the kernel size, it can be + # either 0, 1, or 2 for a 1x1, 3x3, or 5x5 kernel respectively. The second + # argument "percentile" is the percentile number to choose from the NxN + # neighborhood. 0.5 is the median, 0.25 is the lower quartile, and 0.75 + # would be the upper quartile. + img.median(1, percentile=0.5, threshold=True, offset=5, invert=True) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/median_filter.md b/zh/example/omv/Image-Filters/median_filter.md new file mode 100644 index 0000000..9d85c50 --- /dev/null +++ b/zh/example/omv/Image-Filters/median_filter.md @@ -0,0 +1,127 @@ +# median_filter + +```python +# Median Filter Example +# +# This example shows off median filtering. Median filtering replaces every pixel +# with the median value of it's NxN neighborhood. Median filtering is good for +# removing noise in the image while preserving edges. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # The first argument to the median filter is the kernel size, it can be + # either 0, 1, or 2 for a 1x1, 3x3, or 5x5 kernel respectively. The second + # argument "percentile" is the percentile number to choose from the NxN + # neighborhood. 0.5 is the median, 0.25 is the lower quartile, and 0.75 + # would be the upper quartile. + img.median(1, percentile=0.5) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/midpoint_adaptive_threshold_filter.md b/zh/example/omv/Image-Filters/midpoint_adaptive_threshold_filter.md new file mode 100644 index 0000000..ea97ccd --- /dev/null +++ b/zh/example/omv/Image-Filters/midpoint_adaptive_threshold_filter.md @@ -0,0 +1,128 @@ +# midpoint_adaptive_threshold_filter + +```python +# Midpoint Adaptive Threshold Filter Example +# +# This example shows off midpoint filtering with adaptive thresholding. +# When midpoint(threshold=True) the midpoint() method adaptive thresholds the image +# by comparing the midpoint of the pixels around a pixel, minus an offset, with that pixel. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # The first argument is the kernel size. N coresponds to a ((N*2)+1)^2 + # kernel size. E.g. 1 == 3x3 kernel, 2 == 5x5 kernel, etc. Note: You + # shouldn't ever need to use a value bigger than 2. The "bias" argument + # lets you select between min and max blending. 0.5 == midpoint filter, + # 0.0 == min filter, and 1.0 == max filter. Note that the min filter + # makes images darker while the max filter makes images lighter. + img.midpoint(1, bias=0.5, threshold=True, offset=5, invert=True) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/midpoint_filter.md b/zh/example/omv/Image-Filters/midpoint_filter.md new file mode 100644 index 0000000..0a3f8f6 --- /dev/null +++ b/zh/example/omv/Image-Filters/midpoint_filter.md @@ -0,0 +1,127 @@ +# midpoint_filter + +```python +# Midpoint Filter Example +# +# This example shows off midpoint filtering. Midpoint filtering replaces each +# pixel by the average of the min and max pixel values for a NxN neighborhood. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # The first argument is the kernel size. N coresponds to a ((N*2)+1)^2 + # kernel size. E.g. 1 == 3x3 kernel, 2 == 5x5 kernel, etc. Note: You + # shouldn't ever need to use a value bigger than 2. The "bias" argument + # lets you select between min and max blending. 0.5 == midpoint filter, + # 0.0 == min filter, and 1.0 == max filter. Note that the min filter + # makes images darker while the max filter makes images lighter. + img.midpoint(1, bias=0.5) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/mode_adaptive_threshold_filter.md b/zh/example/omv/Image-Filters/mode_adaptive_threshold_filter.md new file mode 100644 index 0000000..32d53bd --- /dev/null +++ b/zh/example/omv/Image-Filters/mode_adaptive_threshold_filter.md @@ -0,0 +1,125 @@ +# mode_adaptive_threshold_filter + +```python +# Mode Adaptive Threshold Filter Example +# +# This example shows off mode filtering with adaptive thresholding. +# When mode(threshold=True) the mode() method adaptive thresholds the image +# by comparing the mode of the pixels around a pixel, minus an offset, with that pixel. +# Avoid using the mode filter on RGB565 images. It will cause artifacts on image edges... + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # The only argument to the median filter is the kernel size, it can be + # either 0, 1, or 2 for a 1x1, 3x3, or 5x5 kernel respectively. + img.mode(1, threshold=True, offset=5, invert=True) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/mode_filter.md b/zh/example/omv/Image-Filters/mode_filter.md new file mode 100644 index 0000000..a061f25 --- /dev/null +++ b/zh/example/omv/Image-Filters/mode_filter.md @@ -0,0 +1,125 @@ +# mode_filter + +```python +# Mode Filter Example +# +# This example shows off mode filtering. Mode filtering is a highly non-linear +# operation which replaces each pixel with the mode of the NxN neighborhood +# of pixels around it. Avoid using the mode filter on RGB565 images. It will +# cause artifacts on image edges... + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # The only argument to the median filter is the kernel size, it can be + # either 0, 1, or 2 for a 1x1, 3x3, or 5x5 kernel respectively. + img.mode(1) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/negative.md b/zh/example/omv/Image-Filters/negative.md new file mode 100644 index 0000000..d985b5d --- /dev/null +++ b/zh/example/omv/Image-Filters/negative.md @@ -0,0 +1,121 @@ +# negative + +```python +# Negative Example +# +# This example shows off negating the image. This is not a particularly +# useful method but it can come in handy once in a while. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.negate() + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/perspective_and_rotation_correction.md b/zh/example/omv/Image-Filters/perspective_and_rotation_correction.md new file mode 100644 index 0000000..c364ca0 --- /dev/null +++ b/zh/example/omv/Image-Filters/perspective_and_rotation_correction.md @@ -0,0 +1,171 @@ +# perspective_and_rotation_correction + +```python +# Rotation Correction +# +# This example shows off how to use the rotation_corr() to both correct for +# perspective distortion and then to rotate the new corrected image in 3D +# space aftwards to handle movement. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +# The image will be warped such that the following points become the new: +# +# (0, 0) +# (w-1, 0) +# (w-1, h-1) +# (0, h-1) +# +# Try setting the points below to the corners of a quadrilateral +# (in clock-wise order) in the field-of-view. You can get points +# on the image by clicking and dragging on the frame buffer and +# recording the values shown in the histogram widget. + +w = DETECT_WIDTH +h = DETECT_HEIGHT + +TARGET_POINTS = [(0, 0), # (x, y) CHANGE ME! + (w-1, 0), # (x, y) CHANGE ME! + (w-1, h-1), # (x, y) CHANGE ME! + (0, h-1)] # (x, y) CHANGE ME! + +# Degrees per frame to rotation by... +X_ROTATION_DEGREE_RATE = 5 +Y_ROTATION_DEGREE_RATE = 0.5 +Z_ROTATION_DEGREE_RATE = 0 +X_OFFSET = 0 +Y_OFFSET = 0 + +ZOOM_AMOUNT = 1 # Lower zooms out - Higher zooms in. +FOV_WINDOW = 25 # Between 0 and 180. Represents the field-of-view of the scene + # window when rotating the image in 3D space. When closer to + # zero results in lines becoming straighter as the window + # moves away from the image being rotated in 3D space. A large + # value moves the window closer to the image in 3D space which + # results in the more perspective distortion and sometimes + # the image in 3D intersecting the scene window. + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + x_rotation_counter = 0 + y_rotation_counter = 0 + z_rotation_counter = 0 + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.rotation_corr(x_rotation = x_rotation_counter, + y_rotation = y_rotation_counter, + z_rotation = z_rotation_counter, + x_translation = X_OFFSET, + y_translation = Y_OFFSET, + zoom = ZOOM_AMOUNT, + fov = FOV_WINDOW, + corners = TARGET_POINTS) + x_rotation_counter += X_ROTATION_DEGREE_RATE + y_rotation_counter += Y_ROTATION_DEGREE_RATE + z_rotation_counter += Z_ROTATION_DEGREE_RATE + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/perspective_correction.md b/zh/example/omv/Image-Filters/perspective_correction.md new file mode 100644 index 0000000..027b1c5 --- /dev/null +++ b/zh/example/omv/Image-Filters/perspective_correction.md @@ -0,0 +1,141 @@ +# perspective_correction + +```python +# Perspective Correction +# +# This example shows off how to use the rotation_corr() to fix perspective +# issues related to how your CanMV Cam is mounted. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +# The image will be warped such that the following points become the new: +# +# (0, 0) +# (w-1, 0) +# (w-1, h-1) +# (0, h-1) +# +# Try setting the points below to the corners of a quadrilateral +# (in clock-wise order) in the field-of-view. You can get points +# on the image by clicking and dragging on the frame buffer and +# recording the values shown in the histogram widget. + +w = DETECT_WIDTH +h = DETECT_HEIGHT + +TARGET_POINTS = [(0, 0), # (x, y) CHANGE ME! + (w-1, 0), # (x, y) CHANGE ME! + (w-1, h-1), # (x, y) CHANGE ME! + (0, h-1)] # (x, y) CHANGE ME! + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.rotation_corr(corners = TARGET_POINTS) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/rotation_correction.md b/zh/example/omv/Image-Filters/rotation_correction.md new file mode 100644 index 0000000..2642dbd --- /dev/null +++ b/zh/example/omv/Image-Filters/rotation_correction.md @@ -0,0 +1,150 @@ +# rotation_correction + +```python +# Rotation Correction +# +# This example shows off how to use the rotation_corr() to play with the scene +# window your CanMV Cam sees. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +# Degrees per frame to rotation by... +X_ROTATION_DEGREE_RATE = 5 +Y_ROTATION_DEGREE_RATE = 0.5 +Z_ROTATION_DEGREE_RATE = 0 +X_OFFSET = 0 +Y_OFFSET = 0 + +ZOOM_AMOUNT = 1 # Lower zooms out - Higher zooms in. +FOV_WINDOW = 60 # Between 0 and 180. Represents the field-of-view of the scene + # window when rotating the image in 3D space. When closer to + # zero results in lines becoming straighter as the window + # moves away from the image being rotated in 3D space. A large + # value moves the window closer to the image in 3D space which + # results in the more perspective distortion and sometimes + # the image in 3D intersecting the scene window. + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + x_rotation_counter = 0 + y_rotation_counter = 0 + z_rotation_counter = 0 + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.rotation_corr(x_rotation = x_rotation_counter, + y_rotation = y_rotation_counter, + z_rotation = z_rotation_counter, + x_translation = X_OFFSET, + y_translation = Y_OFFSET, + zoom = ZOOM_AMOUNT, + fov = FOV_WINDOW) + + x_rotation_counter += X_ROTATION_DEGREE_RATE + y_rotation_counter += Y_ROTATION_DEGREE_RATE + z_rotation_counter += Z_ROTATION_DEGREE_RATE + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/sharpen_filter.md b/zh/example/omv/Image-Filters/sharpen_filter.md new file mode 100644 index 0000000..39dbc70 --- /dev/null +++ b/zh/example/omv/Image-Filters/sharpen_filter.md @@ -0,0 +1,121 @@ +# sharpen_filter + +```python +# Sharpen Filter Example +# +# This example shows off using the laplacian filter to sharpen images. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # Run the kernel on every pixel of the image. + img.laplacian(1,sharpen=True) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/unsharp_filter.md b/zh/example/omv/Image-Filters/unsharp_filter.md new file mode 100644 index 0000000..a3790de --- /dev/null +++ b/zh/example/omv/Image-Filters/unsharp_filter.md @@ -0,0 +1,121 @@ +# unsharp_filter + +```python +# Unsharp Filter Example +# +# This example shows off using the guassian filter to unsharp mask filter images. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + # Run the kernel on every pixel of the image. + img.gaussian(1,unsharp=True) + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Image-Filters/vflip_hmirror_transpose.md b/zh/example/omv/Image-Filters/vflip_hmirror_transpose.md new file mode 100644 index 0000000..e8ee9c5 --- /dev/null +++ b/zh/example/omv/Image-Filters/vflip_hmirror_transpose.md @@ -0,0 +1,134 @@ +# vflip_hmirror_transpose + +```python +# Vertical Flip - Horizontal Mirror - Transpose +# +# This example shows off how to vertically flip, horizontally mirror, or +# transpose an image. Note that: +# +# vflip=False, hmirror=False, transpose=False -> 0 degree rotation +# vflip=True, hmirror=False, transpose=True -> 90 degree rotation +# vflip=True, hmirror=True, transpose=False -> 180 degree rotation +# vflip=False, hmirror=True, transpose=True -> 270 degree rotation + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DETECT_WIDTH, DETECT_HEIGHT, image.RGB565, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + mills = time.ticks_ms() + counter = 0 + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + img = rgb888_img.to_rgb565() + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + img.replace(vflip=(counter//2)%2, + hmirror=(counter//4)%2, + transpose=False) + + if (time.ticks_ms() > (mills + 1000)): + mills = time.ticks_ms() + counter += 1 + img.copy_to(osd_img) + del img + gc.collect() + print(fps.fps()) + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Snapshot/emboss_snapshot.md b/zh/example/omv/Snapshot/emboss_snapshot.md new file mode 100644 index 0000000..ece72ef --- /dev/null +++ b/zh/example/omv/Snapshot/emboss_snapshot.md @@ -0,0 +1,89 @@ +# emboss_snapshot + +```python +# Emboss Snapshot Example +# +# Note: You will need an SD card to run this example. +# +# You can use your CanMV Cam to save modified image files. + +from media.camera import * +from media.display import * +from media.media import * +import time, os + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output rgb888 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + time.sleep(1) + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + try: + img = rgb888_img.to_rgb565() + img.morph(1, [+2, +1, +0, + +1, +1, -1, + +0, -1, -2]) # Emboss the image. + img.save("/sdcard/snapshot_emboss.jpg") + print("save image ok") + except Exception as e: + print("save image fail: ", e) + # release image for dev and chn + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + print("camera init") + camera_init() + print("camera capture") + capture_picture() + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/Snapshot/snapshot.md b/zh/example/omv/Snapshot/snapshot.md new file mode 100644 index 0000000..33e642a --- /dev/null +++ b/zh/example/omv/Snapshot/snapshot.md @@ -0,0 +1,85 @@ +# snapshot + +```python +# Snapshot Example +# +# Note: You will need an SD card to run this example. +# +# You can use your CanMV Cam to save image files. + +from media.camera import * +from media.display import * +from media.media import * +import time, os + +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output rgb888 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DISPLAY_WIDTH, DISPLAY_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_RGB_888) + # media buffer init + media.buffer_init() + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + time.sleep(1) + rgb888_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + try: + rgb888_img.to_jpeg().save("/sdcard/snapshot.jpg") + print("save image ok") + except Exception as e: + print("save image fail: ", e) + # release image for dev and chn + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, rgb888_img) + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + print("camera init") + camera_init() + print("camera capture") + capture_picture() + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../../api/openmv/image.md) diff --git a/zh/example/omv/find_qrcodes.md b/zh/example/omv/find_qrcodes.md new file mode 100644 index 0000000..fb2ee07 --- /dev/null +++ b/zh/example/omv/find_qrcodes.md @@ -0,0 +1,132 @@ +# 二维码识别 + +```python +# QRCode Example +# +# This example shows the power of the CanMV Cam to detect QR Codes. + +from media.camera import * +from media.display import * +from media.media import * +import time, os, gc, sys + +# 显示图像尺寸 +DISPLAY_WIDTH = ALIGN_UP(1920, 16) +DISPLAY_HEIGHT = 1080 +# 检测图像尺寸 +SCALE = 4 +DETECT_WIDTH = DISPLAY_WIDTH // SCALE +DETECT_HEIGHT = DISPLAY_HEIGHT // SCALE + +def camera_init(): + # use hdmi for display + display.init(LT9611_1920X1080_30FPS) + # config vb for osd layer + config = k_vb_config() + config.max_pool_cnt = 1 + config.comm_pool[0].blk_size = 4*DISPLAY_WIDTH*DISPLAY_HEIGHT + config.comm_pool[0].blk_cnt = 1 + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE + # meida buffer config + media.buffer_config(config) + # init default sensor + camera.sensor_init(CAM_DEV_ID_0, CAM_DEFAULT_SENSOR) + # set chn0 output size + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_0, DISPLAY_WIDTH, DISPLAY_HEIGHT) + # set chn0 output format + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_0, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # create meida source device + globals()["meida_source"] = media_device(CAMERA_MOD_ID, CAM_DEV_ID_0, CAM_CHN_ID_0) + # create meida sink device + globals()["meida_sink"] = media_device(DISPLAY_MOD_ID, DISPLAY_DEV_ID, DISPLAY_CHN_VIDEO1) + # create meida link + media.create_link(meida_source, meida_sink) + # set display plane with video channel + display.set_plane(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, PIXEL_FORMAT_YVU_PLANAR_420, DISPLAY_MIRROR_NONE, DISPLAY_CHN_VIDEO1) + # set chn1 output nv12 + camera.set_outsize(CAM_DEV_ID_0, CAM_CHN_ID_1, DETECT_WIDTH, DETECT_HEIGHT) + camera.set_outfmt(CAM_DEV_ID_0, CAM_CHN_ID_1, PIXEL_FORMAT_YUV_SEMIPLANAR_420) + # media buffer init + media.buffer_init() + # request media buffer for osd image + globals()["buffer"] = media.request_buffer(4 * DISPLAY_WIDTH * DISPLAY_HEIGHT) + # start stream for camera device0 + camera.start_stream(CAM_DEV_ID_0) + +def camera_deinit(): + # stop stream for camera device0 + camera.stop_stream(CAM_DEV_ID_0) + # deinit display + display.deinit() + os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) + time.sleep_ms(100) + # release media buffer + media.release_buffer(globals()["buffer"]) + # destroy media link + media.destroy_link(globals()["meida_source"], globals()["meida_sink"]) + # deinit media buffer + media.buffer_deinit() + +def capture_picture(): + # create image for drawing + draw_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888) + # create image for osd + buffer = globals()["buffer"] + osd_img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888, alloc=image.ALLOC_VB, phyaddr=buffer.phys_addr, virtaddr=buffer.virt_addr, poolid=buffer.pool_id) + osd_img.clear() + display.show_image(osd_img, 0, 0, DISPLAY_CHN_OSD0) + fps = time.clock() + while True: + fps.tick() + try: + os.exitpoint() + # 采集一帧图像 + yuv420_img = camera.capture_image(CAM_DEV_ID_0, CAM_CHN_ID_1) + # NV12图像转灰度图像 + img = image.Image(yuv420_img.width(), yuv420_img.height(), image.GRAYSCALE, alloc=image.ALLOC_HEAP, data=yuv420_img) + # 释放采集图像 + camera.release_image(CAM_DEV_ID_0, CAM_CHN_ID_1, yuv420_img) + codes = img.find_qrcodes() + draw_img.clear() + for code in codes: + draw_img.draw_rectangle([v*SCALE for v in code.rect()], color=(255, 0, 0)) + print(code) + draw_img.copy_to(osd_img) + if not codes: + print("FPS %f" % fps.fps()) + del img + gc.collect() + except KeyboardInterrupt as e: + print("user stop: ", e) + break + except BaseException as e: + sys.print_exception(e) + break + +def main(): + os.exitpoint(os.EXITPOINT_ENABLE) + camera_is_init = False + try: + print("camera init") + camera_init() + camera_is_init = True + print("camera capture") + capture_picture() + except Exception as e: + sys.print_exception(e) + finally: + if camera_is_init: + print("camera deinit") + camera_deinit() + +if __name__ == "__main__": + main() + +``` + +具体接口使用请参考相关文档说明: + +- [camere](../../api/mpp/K230_CanMV_Camera模块API手册.md) +- [display](../../api/mpp/K230_CanMV_Display模块API手册.md) +- [media](../../api/mpp/K230_CanMV_Media模块API手册.md) +- [image](../../api/openmv/image.md) diff --git a/zh/example/omv/omv.rst b/zh/example/omv/omv.rst new file mode 100755 index 0000000..608fc68 --- /dev/null +++ b/zh/example/omv/omv.rst @@ -0,0 +1,73 @@ +Openmv 例程讲解 +=========== +.. toctree:: + :maxdepth: 1 + + April-Tags/find_apriltags_3d_pose.md + April-Tags/find_apriltags.md + Codes/find_barcodes.md + Codes/find_datamatrices.md + Codes/find_qrcodes.md + Color-Tracking/automatic_grayscale_color_tracking.md + Color-Tracking/automatic_rgb565_color_tracking.md + Color-Tracking/black_grayscale_line_following.md + Color-Tracking/image_histogram_info.md + Color-Tracking/image_statistics_info.md + Color-Tracking/multi_color_code_tracking.md + Color-Tracking/single_color_code_tracking.md + Drawing/arrow_drawing.md + Drawing/circle_drawing.md + Drawing/cross_drawing.md + Drawing/ellipse_drawing.md + Drawing/flood_fill.md + Drawing/image_drawing_advanced.md + Drawing/image_drawing_alpha_blending_test.md + Drawing/image_drawing.md + Drawing/keypoints_drawing.md + Drawing/line_drawing.md + Drawing/rectangle_drawing.md + Feature-Detection/edges.md + Feature-Detection/find_circles.md + Feature-Detection/find_lines.md + Feature-Detection/find_rects.md + Feature-Detection/hog.md + Feature-Detection/keypoints.md + Feature-Detection/lbp.md + Feature-Detection/linear_regression_fast.md + Feature-Detection/linear_regression_robust.md + Feature-Detection/template_matching.md + find_qrcodes.md + Image-Filters/adaptive_histogram_equalization.md + Image-Filters/blur_filter.md + Image-Filters/cartoon_filter.md + Image-Filters/color_bilateral_filter.md + Image-Filters/color_binary_filter.md + Image-Filters/color_light_removal.md + Image-Filters/edge_filter.md + Image-Filters/erode_and_dilate.md + Image-Filters/gamma_correction.md + Image-Filters/grayscale_bilateral_filter.md + Image-Filters/grayscale_binary_filter.md + Image-Filters/grayscale_light_removal.md + Image-Filters/histogram_equalization.md + Image-Filters/kernel_filters.md + Image-Filters/lens_correction.md + Image-Filters/linear_polar.md + Image-Filters/log_polar.md + Image-Filters/mean_adaptive_threshold_filter.md + Image-Filters/mean_filter.md + Image-Filters/median_adaptive_threshold_filter.md + Image-Filters/median_filter.md + Image-Filters/midpoint_adaptive_threshold_filter.md + Image-Filters/midpoint_filter.md + Image-Filters/mode_adaptive_threshold_filter.md + Image-Filters/mode_filter.md + Image-Filters/negative.md + Image-Filters/perspective_and_rotation_correction.md + Image-Filters/perspective_correction.md + Image-Filters/rotation_correction.md + Image-Filters/sharpen_filter.md + Image-Filters/unsharp_filter.md + Image-Filters/vflip_hmirror_transpose.md + Snapshot/emboss_snapshot.md + Snapshot/snapshot.md diff --git a/zh/example/peripheral.rst b/zh/example/peripheral.rst new file mode 100755 index 0000000..b604b6c --- /dev/null +++ b/zh/example/peripheral.rst @@ -0,0 +1,14 @@ +外设 例程讲解 +=========== +.. toctree:: + :maxdepth: 1 + + cipher/cipher.md + machine/adc/adc.md + machine/fft/fft.md + machine/fpioa/fpioa.md + machine/gpio/gpio.md + machine/pwm/pwm.md + machine/spi/spi.md + machine/timer/timer.md + machine/wdt/wdt.md diff --git a/zh/example/socket_network/http_client.md b/zh/example/socket_network/http_client.md new file mode 100755 index 0000000..77a3fb4 --- /dev/null +++ b/zh/example/socket_network/http_client.md @@ -0,0 +1,48 @@ +# tchttp - client 例程 + +本示例程序用于对 CanMV 开发板进行一个 http client的功能展示。 + +```python +import socket + + +def main(use_stream=True): + #创建socket + s = socket.socket() + #获取地址及端口号 对应地址 + ai = socket.getaddrinfo("www.baidu.com", 80) + #ai = socket.getaddrinfo("10.100.228.5", 8080) + + print("Address infos:", ai) + addr = ai[0][-1] + + print("Connect address:", addr) + #连接 + s.connect(addr) + + if use_stream: + # MicroPython socket objects support stream (aka file) interface + # directly, but the line below is needed for CPython. + s = s.makefile("rwb", 0) + #发送http请求 + s.write(b"GET /index.html HTTP/1.0\r\n\r\n") + #打印请求内容 + print(s.read()) + else: + #发送http请求 + s.send(b"GET /index.html HTTP/1.0\r\n\r\n") + #打印请求内容 + print(s.recv(4096)) + #print(s.read()) + #关闭socket + s.close() + + +#main() +main(use_stream=True) +main(use_stream=False) + + +``` + +具体接口定义请参考 [socket](../../api/extmod/K230_CanMV_socket模块API手册.md)、[network](../../api/extmod/K230_CanMV_network模块API手册.md) diff --git a/zh/example/socket_network/http_server.md b/zh/example/socket_network/http_server.md new file mode 100755 index 0000000..f3ced1c --- /dev/null +++ b/zh/example/socket_network/http_server.md @@ -0,0 +1,90 @@ +# http - server 例程 + +本示例程序用于对 CanMV 开发板进行一个 http server 的功能展示。 + +```python +# port from micropython/examples/network/http_server.py +import socket +import network +import time +# print(network.LAN().ifconfig()[0]) +# print("Listening, connect your browser to http://%s:8081/" % (network.LAN().ifconfig()[0])) + +CONTENT = b"""\ +HTTP/1.0 200 OK + +Hello #%d from k230 canmv MicroPython! +""" + + +def main(micropython_optimize=True): + #建立socket + s = socket.socket() + #获取地址及端口号 对应地址 + # Binding to all interfaces - server will be accessible to other hosts! + ai = socket.getaddrinfo("0.0.0.0", 8081) + print("Bind address info:", ai) + addr = ai[0][-1] + #设置属性 + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + #绑定地址 + s.bind(addr) + #开始监听 + s.listen(5) + print("Listening, connect your browser to http://%s:8081/" % (network.LAN().ifconfig()[0])) + + counter = 0 + while True: + #接受连接 + res = s.accept() + client_sock = res[0] + client_addr = res[1] + print("Client address:", client_addr) + print("Client socket:", client_sock) + #非阻塞模式 + client_sock.setblocking(False) + if not micropython_optimize: + # To read line-oriented protocol (like HTTP) from a socket (and + # avoid short read problem), it must be wrapped in a stream (aka + # file-like) object. That's how you do it in CPython: + client_stream = client_sock.makefile("rwb") + else: + # .. but MicroPython socket objects support stream interface + # directly, so calling .makefile() method is not required. If + # you develop application which will run only on MicroPython, + # especially on a resource-constrained embedded device, you + # may take this shortcut to save resources. + client_stream = client_sock + + print("Request:") + #获取内容 + req = client_stream.read() + print(req) + + while True: + ##获取内容 + h = client_stream.read() + if h == b"" or h == b"\r\n": + break + print(h) + #回复内容 + client_stream.write(CONTENT % counter) + #time.sleep(0.5) + #关闭 + client_stream.close() + # if not micropython_optimize: + # client_sock.close() + counter += 1 + #print("wjx", counter) + if counter > 20 : + print("http server exit!") + #关闭 + s.close() + break + + +main() + +``` + +具体接口定义请参考 [socket](../../api/extmod/K230_CanMV_socket模块API手册.md)、[network](../../api/extmod/K230_CanMV_network模块API手册.md) diff --git a/zh/example/socket_network/network_lan.md b/zh/example/socket_network/network_lan.md new file mode 100755 index 0000000..8c53069 --- /dev/null +++ b/zh/example/socket_network/network_lan.md @@ -0,0 +1,47 @@ +# network - lan 例程 + +本示例程序用于对 CanMV 开发板进行一个 network lan的功能展示。 + +```python +import network + + +def main(): + #获取lan接口 + a=network.LAN() + #获取网口是否在使用 + print(a.active()) + #关闭网口 + print(a.active(0)) + #使能网口 + print(a.active(1)) + #查看网口 ip,掩码,网关,dns配置 + print(a.ifconfig()) + #设置网口 ip,掩码,网关,dns配置 + print(a.ifconfig(('192.168.0.4', '255.255.255.0', '192.168.0.1', '8.8.8.8'))) + #查看网口 ip,掩码,网关,dns配置 + print(a.ifconfig()) + #设置网口为dhcp模式 + print(a.ifconfig("dhcp")) + #查看网口 ip,掩码,网关,dns配置 + print(a.ifconfig()) + #查看网口mac地址 + print(a.config("mac")) + #设置网口mac地址 + print(a.config(mac="42:EA:D0:C2:0D:83")) + #查看网口mac地址 + print(a.config("mac")) + #设置网口为dhcp模式 + print(a.ifconfig("dhcp")) + #查看网口 ip,掩码,网关,dns配置 + print(a.ifconfig()) + + + + +main() + + +``` + +具体接口定义请参考 [socket](../../api/extmod/K230_CanMV_socket模块API手册.md)、[network](../../api/extmod/K230_CanMV_network模块API手册.md) diff --git a/zh/example/socket_network/tcp_client.md b/zh/example/socket_network/tcp_client.md new file mode 100755 index 0000000..6a74dff --- /dev/null +++ b/zh/example/socket_network/tcp_client.md @@ -0,0 +1,45 @@ +# tcp - client 例程 + +本示例程序用于对 CanMV 开发板进行一个 tcp client的功能展示。 + +```python +#配置 tcp/udp socket调试工具 +import socket +import time + +PORT=60000 + +def client(): + #获取地址及端口号 对应地址 + ai = socket.getaddrinfo("10.100.228.5", PORT) + #ai = socket.getaddrinfo("10.10.1.94", PORT) + print("Address infos:", ai) + addr = ai[0][-1] + + print("Connect address:", addr) + #建立socket + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) + #连接地址 + s.connect(addr) + + for i in range(10): + str="K230 tcp client send test {0} \r\n".format(i) + print(str) + #print(s.send(str)) + #发送字符串 + print(s.write(str)) + time.sleep(0.2) + #time.sleep(1) + #print(s.recv(4096)) + #print(s.read()) + #延时1秒 + time.sleep(1) + #关闭socket + s.close() + print("end") + +#main() +client() +``` + +具体接口定义请参考 [socket](../../api/extmod/K230_CanMV_socket模块API手册.md)、[network](../../api/extmod/K230_CanMV_network模块API手册.md) diff --git a/zh/example/socket_network/tcp_server.md b/zh/example/socket_network/tcp_server.md new file mode 100755 index 0000000..2216f9d --- /dev/null +++ b/zh/example/socket_network/tcp_server.md @@ -0,0 +1,77 @@ +# tcp - server 例程 + +本示例程序用于对 CanMV 开发板进行一个 tcp server的功能展示。 + +```python +#配置 tcp/udp socket调试工具 +import socket +import network +import time +PORT=60000 + + +CONTENT = b""" +Hello #%d from k230 canmv MicroPython! +""" + + + +def server(): + counter=1 + #获取地址及端口号 对应地址 + #ai = socket.getaddrinfo("10.100.228.5", 8000) + ai = socket.getaddrinfo("0.0.0.0", PORT) + print("Address infos:", ai,PORT) + addr = ai[0][-1] + + print("Connect address:", addr) + #建立socket + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) + #设置属性 + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + #绑定 + s.bind(addr) + #监听 + s.listen(5) + print("tcp server %s port:%d\n" % ((network.LAN().ifconfig()[0]),PORT)) + + + while True: + #接受连接 + res = s.accept() + client_sock = res[0] + client_addr = res[1] + print("Client address:", client_addr) + print("Client socket:", client_sock) + client_sock.setblocking(False) + + client_stream = client_sock + #发送字符传 + client_stream.write(CONTENT % counter) + + while True: + #读取内容 + h = client_stream.read() + if h != b"" : + print(h) + #回复内容 + client_stream.write("recv :%s" % h) + + if "end" in h : + #关闭socket + client_stream.close() + break + + counter += 1 + if counter > 10 : + print("server exit!") + #关闭 + s.close() + break + +#main() +server() + +``` + +具体接口定义请参考 [socket](../../api/extmod/K230_CanMV_socket模块API手册.md)、[network](../../api/extmod/K230_CanMV_network模块API手册.md) diff --git a/zh/example/socket_network/udp_server.md b/zh/example/socket_network/udp_server.md new file mode 100755 index 0000000..d86fa71 --- /dev/null +++ b/zh/example/socket_network/udp_server.md @@ -0,0 +1,54 @@ +# udp - server 例程 + +本示例程序用于对 CanMV 开发板进行一个 udp server的功能展示。 + +```python +#配置 tcp/udp socket调试工具 +import socket +import time +import network +PORT=60000 + + +def udpserver(): + #获取地址及端口号对应地址 + ai = socket.getaddrinfo("0.0.0.0", PORT) + #ai = socket.getaddrinfo("10.10.1.94", 60000) + print("Address infos:", ai) + addr = ai[0][-1] + + print("udp server %s port:%d\n" % ((network.LAN().ifconfig()[0]),PORT)) + #建立socket + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + #设置属性 + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + #绑定 + s.bind(addr) + print("a") + #延时 + time.sleep(1) + + for j in range(10): + try: + #接受内容 + data, addr = s.recvfrom(800) + print("b") + except: + continue + #打印内容 + print("recv %d" % j,data,addr) + #回复内容 + s.sendto(b"%s have recv count=%d " % (data,j), addr) + #关闭 + s.close() + print("udp server exit!!") + + + + +#main() +udpserver() + +``` + +具体接口定义请参考 [socket](../../api/extmod/K230_CanMV_socket模块API手册.md)、[network](../../api/extmod/K230_CanMV_network模块API手册.md) diff --git a/zh/example/socket_network/upd_client.md b/zh/example/socket_network/upd_client.md new file mode 100755 index 0000000..26a5111 --- /dev/null +++ b/zh/example/socket_network/upd_client.md @@ -0,0 +1,47 @@ +# udp - client 例程 + +本示例程序用于对 CanMV 开发板进行一个 udp client的功能展示。 + +```python +#配置 tcp/udp socket调试工具 +import socket +import time + + +def udpclient(): + #获取地址和端口号 对应地址 + ai = socket.getaddrinfo("10.100.228.5", 60000) + #ai = socket.getaddrinfo("10.10.1.94", 60000) + print("Address infos:", ai) + addr = ai[0][-1] + + print("Connect address:", addr) + #建立socket + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + + + + for i in range(10): + str="K230 udp client send test {0} \r\n".format(i) + print(str) + #发送字符串 + print(s.sendto(str,addr)) + #延时 + time.sleep(0.2) + #time.sleep(1) + #print(s.recv(4096)) + #print(s.read()) + #延时 + time.sleep(1) + #关闭 + s.close() + print("end") + + + +#main() +udpclient() + +``` + +具体接口定义请参考 [socket](../../api/extmod/K230_CanMV_socket模块API手册.md)、[network](../../api/extmod/K230_CanMV_network模块API手册.md) diff --git a/zh/images/Canmv-link-board.png b/zh/images/Canmv-link-board.png index c49fd46d4ca5b049390ff6c307c9b854ed4ad948..3344404ad81369c72efa661cd63fe2be107f1961 100755 GIT binary patch literal 96046 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℘hkP~*SnMkG+%R2wnwEOs3fHhL6wICO3Py-COV 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%0DE$!SQO(~hu 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 diff --git "a/zh/userguide/K230_CanMV_IDE\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/zh/userguide/K230_CanMV_IDE\344\275\277\347\224\250\350\257\264\346\230\216.md" index 9a7d749..cb363b3 100755 --- "a/zh/userguide/K230_CanMV_IDE\344\275\277\347\224\250\350\257\264\346\230\216.md" +++ "b/zh/userguide/K230_CanMV_IDE\344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -64,15 +64,11 @@ K230 使用的 CanMV IDE 与 K210 的一致,可以在[这里](https://github.c ### 2.1 连接开发板 -将开发板的USB端口连接到电脑,点击界面左下角的连接按钮。 +将开发板的USB端口连接到电脑,点击界面左下角的连接按钮,等待连接完成。 ![IDE connect](images/ide-2.png) -选择 USB 端口对应的COM号,如图为 COM14,并点击 OK ,等待连接完成。 - -![COM port](images/ide-3.png) - -如果使用 OpenMV IDE,则直接点击左下角的连接按钮即可。 +如果使用 OpenMV IDE,同样直接点击左下角的连接按钮即可。 ![OpenMV IDE connect](images/openmv-ide-connect.png) @@ -84,18 +80,22 @@ K230 使用的 CanMV IDE 与 K210 的一致,可以在[这里](https://github.c ### 2.3 保存代码和文件到开发板 -点击菜单栏中的`工具`或者`Tools`选项,前三个选项都可以将文件保存到开发板的`/sdcard`目录下。 +点击菜单栏中的`工具`或者`Tools`选项,有两个选项可以将文件保存到开发板的`/sdcard`目录下。 -前两个选项会分别将当前打开的文件保存为固定的`boot.py`或`main.py`,这两个文件功能一致,都是在CanMV启动时运行,但是`boot.py`会先运行,`main.py`后运行。 +第一个选项将当前打开的脚本文件保存为固定的`main.py`,会在CanMV启动时运行。 -第三个选项`保存文件到CanMV Cam`可以保存一个指定的文件到开发板。 +第二个选项`保存文件到CanMV Cam`可以保存一个指定的文件到开发板的指定路径上,注意由于只有 SD 卡上的路径可读写,所以实际的路径是 `/sdcard/<填写的路径>` ![Save](images/ide-5.png) ### 2.4 在 IDE 中显示图像 -openmv 提供了 image 类,对 image 对象调用 `compress_for_ide()` 方法可以将图像发送到 IDE 进行显示,如果图像来源是 camera 并且像素格式为 YUV420SP,会自动使用硬件编码器进行图像编码,此时会占用 VENC 模块的第4通道。 +当启用显示输出(即调用 `display.init()`)时,IDE会显示与 LCD 或 HDMI 相同的图像,也可以使用 image 类,对 image 对象调用 `compress_for_ide()` 方法将指定图像发送到 IDE 进行显示,如果图像来源是 camera 并且像素格式为 YUV420SP,会自动使用硬件编码器进行图像编码,此时会占用 VENC 模块的第4通道。可以参考示例中的 `Media/camera_480p.py` + +![IDE 显示图像](images/ide.png) + +### 2.5 更新资源 -![IDE 显示图像](images/ide_image.png) +当有新的资源(示例和 kmodel 等)可用时,IDE 会在开启时弹出对话框提示更新,点击“安装”按钮即可进行更新。 -由于 CanMV IDE 是基于2.9.2版本的OpenMV IDE,使用Qt5,性能较低,图像帧率只能达到20FPS左右,使用4.0以上版本的 OpenMV IDE 可以获得较高的帧率。 +![资源更新](images/ide-update.png) diff --git "a/zh/userguide/K230_CanMV\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/zh/userguide/K230_CanMV\344\275\277\347\224\250\350\257\264\346\230\216.md" index b309bb1..10056b0 100755 --- "a/zh/userguide/K230_CanMV\344\275\277\347\224\250\350\257\264\346\230\216.md" +++ "b/zh/userguide/K230_CanMV\344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -78,14 +78,14 @@ K230 CanMV没有在其他Linux版本的主机环境下验证过,不保证可 说明:本章节命令仅供参考,文件名请根据实际情况进行替换。 ```sh -git clone git@g.a-bug.org:maix_sw/k230_canmv.git +git clone https://github.com/kendryte/k230_canmv.git cd k230_canmv make prepare_sourcecode # 生成docker镜像(第一次编译需要,已经生成docker镜像后跳过此步骤,可选) docker build -f k230_sdk/tools/docker/Dockerfile -t k230_docker k230_sdk/tools/docker # 启动docker环境(可选) docker run -u root -it -v $(pwd):$(pwd) -v $(pwd)/k230_sdk/toolchain:/opt/toolchain -w $(pwd) k230_docker /bin/bash -# 默认使用EVB板卡,如果需要使用其他板卡,请使用 make CONF=k230_xx_defconfig,支持的板卡在configs目录下 +# 默认使用CanMV板卡,如果需要使用其他板卡,请使用 make CONF=k230_xx_defconfig,支持的板卡在configs目录下 make CONF=k230_canmv_defconfig ``` diff --git a/zh/userguide/images/ide-2.png b/zh/userguide/images/ide-2.png index 9410b89909eb3fca64438c3ea464fb45a4c02857..2d654429d9cd8c981ff50197c2419fe6482a722d 100755 GIT binary patch literal 230351 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

I1twDz1?U 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 literal 73143 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 diff --git a/zh/userguide/images/ide-4.png b/zh/userguide/images/ide-4.png index 1622d4fd2d029b5724b14fb5637566431c99ba16..70d64ad74c91363098923cf12eeb6a97e8f612bd 100755 GIT binary patch literal 138361 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 literal 70573 zcmZ^~by$>J)IN-$AW{NKhms;K-3myDNJ$Od&CsoMcbC%Lozguc2n^jYbi>f|jpxXD z-}k$&-~NMZ*!$Vfvt#YG?sc!VLp~`;Vm%{yhJ=KKB`qcX842m}DiRXPyQip#nxB+5 zP$Z;RNYdgTR9w^d7Ti2lHWuJ;h(FV-$ItzXX!72=w0(Wh6sXacCXe@l!S>*IDTXUvD!P?Z6sDp8(4G&d3XKlj$CH2kl^ z{9M$g^@sZZtvR{BtMDZ-Ba(POjQ`Nn97`0W!r2;KdKYwc^_%gM3C;_I9Bd}}EcEa! z!KaVDeS8>{X2`FvD5%$7)%)wjCT&;jB{l6mY|Glxe1tNLu0lZ8!&_YzpT^+Bc>QHyYK9oyd8;> z>Z6ce9j0;2*O*b~z#Gc}YyEiznw7cvHzbKLhgDswioo;DVsHD+T&>ld0G%kI9`TF_R(J3IbAxTFP znNw);?)u_fr8P*|qk4j4Whb=LIs{6~`p8X$`v~@Tu{7zs*>>t`9pU$|j;8JWGzL|0o7iMgPh#qWVd|xm0Uv9F`R|s4cZUp~=MK*p8W!HCMek^I5Ay@M zVv8DT;2jhjlwlN`1A~;wO;mAlrko*SpVr&NTYE+K@Mk(Ba~Jo}3zRBn?$A1uBNp*h zu~*yCtw>tPx@VXXJQl^;pW`m07RVF18+99rF_d~V-fFaZf~ZP+;W^l?YM7yrSd|iA ztJH%gc>3mFQ5wIVj1R|BJ$a+B@mZD(!c5;@#fal+ z;n)I#{tvSfQ70$UwJd3ky^3Q;5*8PhMk0tA>gfHIiCpf?!A3pWm7ieo^a`d+-esNH zH*{59V;eRc47uz>>C@7Ry?8B=_DvugwJBRVKV|ls}^3I z4sy>Loz&$_4M`~GPIwz36HlrrHkyq@It%Y=_WLK|-^eQVzIz+-LfI|N?Hk>;e(K%h zs>nn~kb6&Fgahqb@e-xoVov-_JMH~EZ?n@yNAUsP3Bdi4T5_fzZ}e^YKllT$(ftMC+TH*pSjao=rvQ?4ea*~J)5NIom5Ed z!+;AdLYf6NUGvvw>qMUiOnk~uYa?=TCAHHTG}fe=&mzu$XeYhkhVWM=!A>MthK=pD zM@^q7JWCrz7nKy!X8tK5+`Gyf)uVbXF-|f|i;n~qD$8)Xeg}iX3ui`d zJCTx8ODomaKx*y`{Z|*(Dr_DUo~OvyRb6HVbA0!SD#zR>)Hzgczgr=L3%X7~Whd#3 zYhdAy-%TUK_es$_aAKiSmAT=>=7(>$%$yQhI@n`bn1k*ByqZ)~Gqk^l&X`W2s@=I5 zQzcu9=PcQid2tq1Y;TzZMnUgL1xW+=nzp2vrjDAoAH@v=}g|ZI^0*eL|~2d;QX~-gh{D%CQsGgfeOU6VW55Dan@8V zllH+0V=W@s>J8>yx0Yw3&-{L)tq*U%uE-@lJve<0l4E0ZHtKarb4W@@ucH`Lzk-E1 z!xv^$dLx(X#)^ArjpVI6B&A4u5n_cn6wOzBc=9(q2lN8Q;f5`3lPa^fS9?yff>)nx zgw|^5bLpC#R^$}P1Cp?lvGi;;Op2W0f^=L`ipDB+Aw+v?)y5SbUkRs-d8}el@o#ut z&BKeQytty0R!8UL7Gh2T2A|)XR8{&!nw!@-)tvJh%01g#FzZ0WqI?Br5qcSB{KA|e zZSa}4iQ>OUc|H3RWUsJOs_$x^>wFyBn%Kb_r)$>Vx3{Ywt$lN|V3EdYFzD8<+&=<- zLz{M=Fgy{%^KSJTfV9WJ`@xkI!@64(1+Ui0ouDafZN5Jw?J=Y0R+2?VWggX-b%m}OM>|6~nZ@>-9 zIOM+995P`&C*li?-{TywMq!usi)$mbJTREwv8j^#_A-*Cj5?`F1T9YQqhCutf4Q(b znf>LjUe4#RpFre5rRkP=cMrQ_`Ke{*n79A#>*s~ucN|t;CX!tAYpLIQE$T>`n$A;J zelB>=NqfU2=qSAbTeI~yS7^MBw;r+hJLb_gHZ802w2nymVb^aTN! z5{@qVJ({X5X%y%0fTEfo2vjXrlE3R6KciiFz-$)d%k9}N^JKE)=WSn3R!qfprefMY z(rYwWio^wCeb*8H^2#9Igyk-Pen4SHE-{e(0T&jJ|Q2>?+>o%3|5#zlchz?3RLB;b8>gJN*`I{A|pBRXw6Q z*IA|~g_opli{r(-96fnEIDB}D7YD@TU>RaXqOQCWnT`pCOoNS)HV@eE=19X~nOB~lW zyd&j!mzsR{{CBIC7~f8<>8mK(o=ZoQxG760S-FDDMvw1O>@pZdxvW&KBTLBV@eQ%r z77Qys_^(8u=Qb<>be0J00T+kq-CPWoCD!fUYN(cU=RJVjulhtp7a~n%H^mo3UQrdB zv6ztak(g_|2G%NqGNOKK4B?97t>)G9jJ4~)6<~HR%)PTTYHEezzF!bH`eI54?jfvs z8mtvNuus-~#>dG?X~a_U_2VQw_Fk|;*R4tS{TQiSP+k zUS1UVNEc(Q0yH}nP zm&*%n)oJ?}L?{5dzZ&(+U>QRQDh|_OOGi!GSvyXwk#pPLz>gP_2hWVQkIV;%G)ib}F98y9J(j2n3YY?Y2yhy5m92Eh^#G3A|pD@kW z$3aomxz^s!#(i!O{D{Ervf6x`60)?T9Drt=c z1bCL^98H`CJ67ZT$+CH&m`5o)b7OUGln!Q}!p*vKSJv?9*miHp%z@W}^_Q*l8|{0A zwr0Hc$T!1ptSKU$4=nXc&x73{^WJh=J|eOg?Y(-x>tpV)tBfkBXUw$*#c~Kb!yPY# z_XY;0)lPmDwhQu7XEac7n?lG8du9+d6HfCTMwAzGdTXORE(U`0M_|2Ql{fl#>Mvdp zV}_zy30$(7zG`3%Hu*GiSIL=0W%zu|w``el`K>`Vrh4`-H^q_N-2#wN-=^1IMBlMn z-pM?h@*Ylv5iZAcD$?(-BE?xqC=EGcYbc`+g~fa zNn371`ui_K)mZd}U^VM0ovKhw_efepa(#Y7?sv6IP;v!i7@`mQdKT)ONIKdR z;)kM~^`V*QdP%tc^@+bnYx(=1t@GJ8FS}0eXNfiPJW;!BAINnYnarkb3TH3 zO?x3}lH}zDv1A$|9{BAeLpPLjziC<}3}dhu*w4TGZq^^P9^RH!MV9-s)mqQiLw#1l z4M09z_;Ee?u(urYC4TLGPeML@)4O7!-4^5&<+0|v2o#?Gpkycr)~q!f%l;Tf!2Iw7 zf*eU;KfxXv4@qPXe1y4P)KSsZ#x9??jjZa|+fqRon}x#1N8NM)&V16px{Gvr-=iL% zg<@EMcW7T$2tauadBJmVZnwx+;kR=`TB0=q7-HcU$2OFXfVG;uXhZD^ycNaFiM`b( zO6K%`1Lp7TK}H*7Ev6BkHLMQ2)DJfn@}XFW5{c63$}~m20u+(#z64iRRj%a7h0+O! zThF-%>lj3_T0E6TAv_+76r~fkq835x%kNv;VcBH@7w*XH)?>RW2+%L3oGt}zN~B;>~^`GQFYO} z|L`iv98y-HHu64a{Os1%6W+Rz20+p8ejOSvlkNFnM}sdx@IjLBVz|dBBQM-mPsU8O z3?{0me#vpC zPk_!~<7L}?c0Cj}XLLR;FE*|dK*gnhRpo2M(c(!V)!Q5PBZEZH(GfU2vm$D#ulicm zN@g3nVAlbgoNAlsm^D?MW1n!!k~=2;6wQ(7e`%JDfqK#8YXZId&P>D+j?U5%yXoteM0*R7P-YC04 zj*QC_Uc5lsf9kFK_IT6d(3bo!WXx5IWM2*EPaN6_tI3FH@LIfRDTC?RjU%~2AtQ6v z{H8GNSoN3gtgJted+9|6eT7)Y!>H7GNawm7VdUP7#?4LGi`u*GC4l?m}hR~(9_8+IGJ$85_kho_5&CO{X| z$re`rU0kjh23Y&RT9gi0029$xw*JGy&+>|>q~Cn;zbkM$XT^s?sk5F79 zS|^wz&FW)=o4VNhm5ifYE_h^}eu^(jh_4Ywea;h-ELjc>>`(7sLin*6V(DO=mzKrq zoPPLdN2{4am{Md0S#N&UvYH@Onj(exwfP(bN~(`q>~1!*1&erI^Mq#!^(}x%?GBeN z&nk{;`sKj}LWlU623u`W#~}E8e>^YLS<>siI>@5{vv@_r>7yEoNV}qq6J-yjuvb>H z< zRW;*ok{33# z>!ZZz9r;uT(m|n*pMDto?zfPJMS@`xyzw_nu)GGj72f8&TSTQj%tu4nw?ZWPu zVZEy^z7IYhRoT}i9p&Mnq05yZ%K5}oD7fVUhnznieXW0NZHRG4*KAe$U4t>3$QbxL z8PtO{2Zw=i@8+GlT;C3q7P)*Xc~pX}qp5dsAaIf2Uy0h5o{6cn&#)z>dmkC~LG$c}kv23!;US3|eusk4;V z*NT7%$CJO)j*Ry@QnnOhs zc+nA`kZ^q9aoB=q1Dp3EJZy&vBf;kPrMhOUT5lF_5Uo%6G#@51dzBF^;BzlXubAmL zM=*2l@J?7{Fvb?_P@Wrq^t`c1oiN+bV7dkFi<1X?ZQT2rV(U@#=(iPcb#I;RBZph{*sP3F{j{dxnjp;eOPX8rGy>6#M8pySMcrvTon|an%ZhWi$a;(A3?S zwqSq0Mgy>B^1xoW`(xvbks;%?5aa<6U0C;{VrzLa_L{^eEo&)UKhX3-AupqH4%*0I zLB$@pQpU!{2to7eoA;t;XBTRM9<(3@hipshE8&tZ-Mp86;3Uj(Zxwp#Y?m_Yt>>Dp zhu^-TYn6X0sX!R#aVan~EOT{vioChNlYVxFQxZX~9(S2iQ3%GvhWLC(1|{C$jyLBo!`=*hwaW7&cEvkkN!per)TlMt)B#h&rGmI#EgLER<+* zfL9#QskwD7qlyRGZMv}E9xsj4;4^1CZRiB8gzTj!b@n6+|NOz9P11R5e7vV1UrXPJ z2aV;!T{P3vv2;O5Wmxbcw_k`Ht^Va}53)G`ecrOt_zB>(o9pXSsD2c~A>xa2`LGjp zvDYy9^i$Zp0mf54gPbN?Ik7ukvu>s%m~XAl)h3@(e9w--TF!4+LSvoohd)N zH9Yjhfh9ivvvgt3oW-3HbE$NmUqgp^r-glzM*qT}lH74G3#? zf#pE03zn=n)v07N?73&Rr7C(&wBlcx1@yhCtn}ITJnNMz$O#Dgl3NaQO&vJ{0zUe- zS?&lK9(;zV{5?D7?4ryBa0Nl&CgzgoDOQ1K^9jWIO8X5%UUq5x$@n{js1?0o1lEQ! zQcql>f{gJOn#c!n!dGXW$lgWqdf=i1kp;!_8+uZ-zLg=7;vA3kP#BeI$e#Hhi&to9 zfPtiVi4ldb+X`DSEZ26)7f|LDl*x!&^m>gxJ5z2(NTkPbF)@vBX^83T$IKaFfsE!` zNVzorl32lWx*15FC?J7`?0 zf3nAxiL(EV)pi%fZAhqLj}v3CbDF|wTb>hUBxZ%!KQjD+Gka_4R89(KQ~p@Xpy_tf z>@UNl!x&Ze{tGEVJ8m{8FUU6S=JnL?N|h-bCE*AJUBuzXJ9eS?o>D845?p30Hcwb2d?#tUWZn&Mz7y-OjD?i3DFUZ?HOwc*pl-N``7H%WCOX#QXIpW947W#&VA z3H@<`oK#zqhYncPPE_1_#7l>|wNaJXkTBD&e_xOJj=aE#S+3Rv*D2jLs}ui~-$=@4 zir^?mmFR8#u}#@7LZdJ&4l7cxCRkWG!kFF-u00ok^hDbZ2~T>K-*9m>j25cd zl(9qGL{GY!jBJMW2<%)(HLKmjO|M$J-0Plkg4anpnEcQ@&E;K3M^a*QRT{Te1;O~_mOFFi>v5UNQ%^c?c;ww|g zGp$|~v33tV9F$I*EG?{?T@FE)9ujPv_nQ1JR{d3LOQ$gFtP|K-M!Jv(_bbSA z^cPO@FaK2^G5HSn^KKqg<*nK8rmOxgZE$d{rnRW(zK*h?`#H8V(+AZr(LQ5KDF1XZ z_cU!6_*fv@f+~QCi;MoP`(u5e;?x7Yqgo^vx^}7*Gkc*9xcaRZ^ouIsu>jIvRfQW9 z_Vqs!o9bWw{&-Hcs*1VU^I2oO-pGZ#NI|())tw1k$ zD=romm!3t`jOVhE8h6cf-W5A$&W9UBU{Eu?2XO+@WItD~nN6iaJt`kduWI)nQZ8l& z3Fnp$6fPaoQ$@TH6#Q0VVA!;J!uXARsJD|pCE?L62$C_!epjl&p3--(l%t_+8Pjm9 zL?GUwAcq1{{DLig+L};>II|72l$Fw0VI0x_e4UY|U{!rjTA41cQ<0 znDYJztpm)1>1VUh0$feAeTrU`d0J6gntP+@-8G0$U-^Xz3tbfv>KM}~Xa$|13n2~s z14Le-spw7(mTGfnzUkjt;Zl|cc)xic5T$otPu$ZoRinXnt5HAU2EcDc)1r?X-+ei* zIRG{CZXZFuaeJaR-im3`>t-cboyZX9=?ZR8FxlwomLtxTqM%Ohux69CauO1gK25}H zdmH1Ac_ZXb_XEe=ZS>ST7~br>F9TuGnXgYsOjP=!LX;a^%*f3AqjErv8Pqp%I5>I> zt`PKQ1m6m&!`%(zdY_w3`b?4QJMHA;aydABKbQx-9;c&??R&aeam0h7;$wkJFQ5Ci zThQ`TrD067ApG_ef%i^sPr)}%?fOKHhl?5g6gOB99T)P1gan%#Mn=Y_gXUe=y{e^O zZ5}Rl;rO^QCaktsIdU36|8C3tsZ9T21a5Yx%}MQgy2%=5FnJ`77f2t==80R6E}N1? z^u4-a)HeWBT~K{3#mU}jQ?+iTQ)eYO_5r(>&~2E~_(Q$WVA}F+D}f3A%LT^iACqRo z=|!c&29a)WONhZ7%GVPe(Ez1Nf!{HW2pryUs6c6uT{E+N*}lQ-Q#(UPo2QRZF(2)Z z|F|K2o%7n*o14fNj~9ANSaX8?*}#H2LD}-uuPc>-yYrF)q6LRT=ib`xzfz zf{+y3rS@=gfy9PI?Ouqk4|(M@Lb!XB$;7lfmJ!B~TfF}=`c2VSry;Q(Q`UF1v^X)` ztQg-ic!vIQFqj6g9mu{$BfJjh@hzQPWa#rb7fN*J=i@Tz{CCVN`YWB-)WPN7tPN9k zMq182V*6)CT0TS+;jaI&AXcmN+}~BhDn~GJP$^RRp3Pm7si`YykUlSZ9tIln|G_Bi!Ce#ttU^FfPctCf2xG1!=Pg z7l;^L#R1}h2D6OPdktPQF@>X`wHx&gy_|%;<}!WS}J8cs5QJSk|oWlwL7g}14w~ZZlAab_E@O$^51p|E-q1RGv!&& zj9QLCpUz^H3@_)EJ3LdhH;(4xh%7{xEfIoUxF(*wkK#3%e4YeLMmf5PKvCo!=M$qP)o|pTnYkLP+c0hS;Vq(Z!Gw13o)gjJ6;?2`hD7SHg%Je{%?);%< ziz&_RWG(j3}9qzO}zpQKQ`c(5Bg@h4`P2$!-D`Rc}Tj@)FUb$dV6% zdtVFS%a5v)ht!9gN=xa;PNgPTb=vz(l^V;`Y~zhr-@4Co=EI%c>oy?2^REzzS_ZGF zsJ^k14>o%AFZOSZB)gsY)2$qoHJYQ4WHhhbfZespeKq%)s=8j2fNucl7a=kxgGa4y8V&#F_V+hB2@R@6Hnb z=9rzdKA+gOU5GUXi3q?X#l@dfP&}H(H~&X0bdP5Y)ZZOU6e*L9jONwWhBLBse5(;5 z0PbC~Q&H_f1A`njL;%9%DyT6bSks=q5|RV=X8yR5H@ zv?=QddJ<_g-%hBJN-S1!OW)+aXL(fe!nK+e*8Z%`&`*hvOysa6kh{_cP8hSXKi$)m zf9Oqxj$y63wBOS-Vh}Uejz-r6*WovdJUv_yCz$r!lF8yt+8DEK8UnmrsMM#34=(wQ zEBOs$`FTJ-5Atq&P_Q$NFVeu5!JVy6EZY!cdA;YBS2>oL{$(S8Wcl0YH)8R&CD&nb zjh!@OLGiCEg(?n!8QIx5r~T3u(NI_OQm}9Ll)o$6Bo8Y`$#!!}YK!o?arI4bQQAiU zUH#T$5AHesl-EWUR8K{8X7gkt!bH*s8&Pg9PLCs_nl=)(20%k5U_y_0e}rWSlM`EF zXsfe1{pwUL#K3N9xzNw8BD5rF3HfNCV$UfkU$2u7w=hLom-qa?{V&?;&r zS-sc6(HM?6=iF*d!X;w4W!3C&e%zM{754?F;Q&b%Kj+$>I>gU+HyT9xali8Rd38SfiXn3F>$u>9JbT zcv)&08$2+8Jy||?c70OIl~Wv6+$|)HZUnlHC@I-#C(K$`4P@;J^!=zv@|BA&^Nl;3J;k&Y<9}GpeM>u+urPINolkceA12u_Z7yf9=G}M8Ja3QtF)0L-4JD(Fdly;% zi7(rm#kGzq6MQFR ze?ok~yybxLMy?L8bg`hWy6<^JM8^45*CxUS3VI}+z7aG{tZ(S^{<$x?LiJn5nz?Cr z+z&0$_{i7ocTAl(JR@IR8-;5qesvL`GQ!G<@bgzGR#VKrw9%!Z(e>!hU0L0MtbIM_ zaOwKaI$<60C}lY8V+Xp~ts~un9Omz)o$F>(R8zYu3gp-F;O<4U7uy{f2kIrf&>l<> z`-<@09{#gu7|HR1=wVMTJddBeer=J=NJYh*#AW~3$jbW2LoKIO`CAf=Hf1cHzN~~; zxl^#H77iWV*=uI7N~F^}hBmp|qW2{%B8aDM!Ia8 zU5~<7ju(mLxQr(bh&cjXcx*~#nwu_C;()5sJdlIw;`Mn|c>e&c#CsmIWzJOtKFe^K}*s*<0}uBLH^XBl;1cmx@GiGg(X z+8BUDXEiWv#IxqsGYM_PVZdLLLs|WY$jP=s*ekc>ZbXW$4y+05X~{2%_@Zr-@!Vqs zEpJK^JO*M-Zl9t%7nn7xWLq5duWbujtT9yZY!2I5 zw|>1I=Q5f1qNpiCWIERJP7Mlj{7mOo>n|&35`0RjiVwXO3cgFs zm=Tvx-WLWfkWFWP&|8#5Vbc(MWfEkK>;AE+BaWVKPRpN0p}gO;B_U(RUXIg+ULKJ~ z;iZ_$nOV4}bD>+f&>VgK+Bh<+LqG+8IyvtOVMSz(jL_7>8dg_pCN;ZL`hyt}RgiKW zon4(4XWDnwD0+%JPWuiimRZ0SK6dpu#EGC15LZi>%Z=lD-$7sIdA1voe?BT#NAY-h zfjNaHHtm3TrFSwo0>1B5G@= zCQ@7O8OBM-_GHWKMKRstg^&Fp?8_4JMUuZUs6%DGCKr$v+;YER@()Y9Sldu2KJ1xk>?}d~Isc5xy6LL3Ymqfk-Pvi{g;6HRN>QEwkTIy+#cyw|M9@9 zS?9wH$4pC3zW@k!&#E`Y5VzfS`|@u13zDbHH7DyGMAnIJ1%bvk^lWVE_5<~Qm3g>$ zpYH0OP8F-}Ei^#5=n&+5e0=<`4qXw7RNj~*_)Q0&+p0grrkE>%6#+RWiaV%hR6Vke zPs)G)a*+|Z@gU1Q^skdnm)#s`v`7d`J(u`b^semUSgbXy2}Uk$I?6O+aW^% zdFp_@77YZPt~qsD9E<9l0P>L(ce4d+`*G|lhgq3?CAO2U_M3*!bk`PRHqpuV@VRf_ z_N@s*`BFMe>3j_Ikr9SVi0Kj^-RRxvY_UCb2N5~(*-@@5hU;kF9SSrYayQ<|6+5?I znflEw<>Y5MMV`jx%h7ePg>Hbdm~BLMTU{)<;7pD!^+{RM=T40S`Ql^~>A`U(T?p4Z z?wNG?d4S&IQ)uU2K9TPw)$zjiZ>M_y5@uX=HMPDx9hQxWh5`gRVJBP57iX`-x;x}j z&_T__B=;u)Fy>XILdtOEh$&aCB>qWaFn-L`C{$bq{KF2LYa2$SyIRp_Q}r*qGd^4RF@2y{l6kdf+b%{vjw?7AP9h+kPxCh& zv6k+ChqwN3G9#VkLt>#h4T-G$NPIAm_ijH#FKD^uu!9xd`RPB*4q*f+gPKHJB8}U6 z04zY}Ylav{9y*5d-=JkKpjmsWtOcjF3b7uEGKT-p^vULYnXvH|*vn4rAJXek zN{qjsprXRlLrm+R&*32Q$nnyqPM`m31vU)2N zC}eyiN2p6qL;1wu7S3BV{-BH>z-ic7q@Y{{Hn)3S1M3|>)Ik~IH9z6RiXuSy9hj!9 zqN1WlB%vGtVQcdq{srj7&OYDaxQAC6-6jBFv_kx;BOT!;_Yv}BDiKuDDdtf{!uFFd z;g$6FJ$oO%Mt%On#~~N!w8%DIZKg@d$*pdt*>1+lvY<_S#2F<$tIlA}=VJwAr2+h+bEuHFvc+}G)> zOmO_?c)jiX;N5SV0`LJ2-;3a*Kf|Q?E-EIr?Xh1+Lq~VgiAHG$&2Txob6JXuixbmu z)2QtJLvrMg;oBo95b-*AV35hiBM^bj0rLXp_u5>44pY$4@A8Gl-KvJcEGHgQu>WU^ zZ3#28Q!>ky7O=_jrs*%st=%(BXSOnxtYh?B$5WDeNTmq8M+3=<+0n+2e~tAv`n>&Lnr#= z+Pgswhcs@=Rg%&%xg%sP|B)`5?2p`+RVUO~ciq!t0Ye(e|7u(#<#w0cF zE-Wq%7G#64W5{^zd|mFLwl1qJN1W-Ei9U|cd0w{Mi~BKUiDAH{Q1o__6%hjC>9z|E~P^)1U9$S zX;^PV1#NF^T0=kRy4G6>4DBshzoVTlUys?15?ihk-CKo#r6aC|;K-u=SASS*a~VQV7BmZfOW#uCtgNK*!K|>YM(GRU5~VRM zqUJQp=ROVt%KDh^GvZkV(H}b0x?Og+4R{zEzBT0Or-~PMuV15XY!FV@?^A=)8R%#p z^SiXa5EXD(>2iDfmg?(~L}Z=Q8{XQPgy%rM6v=jK_RabVJy|3={ik|-kBr({QR>$+ z7i5LBiKWkYdI9+QSM+)VFMp2B4!!N`dwCW(8)yDUagP_rCnmMv_)h4P6u%QSO;i=xO5cNx@H>EE?9lx7fE1v zBb^H&ux@Knm(TtL)QAxW)?bw8VZA)X_a2hAs&g9q6OD+WQwIP5%;?aGdTXse7Zh?+ zqgf!X(zBe%z>`tYlpGI>Nxbp=SjLLRa4nmruX8q}qM}`_TaZH%DiSXMM6D2ljIdL{ zIY&4+DDF7Q#gg|211;N0YH{7o;bm-gP}a#}K%E^9oOjWeB_)f@2<9Y~?2~h2vb&`< zcsm?H^T;lqr@b*g=Bq8I0#fpSF{{|~?%`Z}! zMvZ^qd0_BD`KJraEA={G^&qINE>Us+rb#6&QPFvYX!kb=r3N@S!TuQ4VoSP1c2hQ| zyqA2$NEY|w^VubGf0m$$x)UgPC-(hVME*%NtchItta4IVx!8OTEeggx8rmEM74b|U z$8XPlGe$hk+2V3 zPK5zytI zQfrrJi6&xpOS32b6T=yl>V7aEHE+GpO}WS)8gNKX-8B*7ihj6 z&7`q>X`^=$dT*rY9=HGga8doSz<0WstivsQQlNlrerFhmu*yFuhi1TCD~I>44BjE& z)Kn^fh(PrgAY%d(AP(Oogg8#Ac^YVW?3BIz!YzAkRPhWGx^SL-*%BB58&R7 zOyPaWckSXId6%`e5~OQtR?!T`*Y)h%8C_`fxlM4QoPCBx%Hdxj^63xC`%`kco?7GM zK9gs|`4%99sSHuM`N(WjwkoJKFw;`Qt-IvK9mXSq;rv1swa04!ji+yUPjqKTc(#jN z^Cn9U!}K&QqKmwkE;zYcdYd;Nofiz7Lr%rZvS9WM}On&Zh|K8 z?5|Ye9@BA_hPda?n#wZ+>pVH&OLx3r;J>3n{MBryOXHfHrz$VrEfN44lxv3Z;>yJl z{oT6YS~dh2tBJx@$1ZnM-WTi-;2`5Do`w9E;f8oY5S?rfAL14hB)y0y%yJyn<5~HR ztJweCzsa36TP3hpjpIu04=I^7;jQPxcX$AY2t`sRhF>3C@>rP)#DT8vq&BXTo;tnGIB`rOyGm1%{BHSLcs zUESU2I5-8C{q?ohbBRYsPesMj?5PguJ6=z++jm!!TVVY+-$||y&cic#XBLr!nT1?e zQ}te2EMdW~1O?N7{rV&-){Ve+SOj6c>*TW%>d~Kl+ZYykO&VPJ@KjuY_ z%bf~j@U>MrBU#`FKE1auiez^&?Nal{+B*8BuCAw8)?!jpr0T0>Gjz*HM7>{3@oZ*> z3nhym_Guz_49}h*>`6D9*>Ae|bbJxomhbqqw6uQ^#F%jQ)Oyk`R{kBC6(zh$1&B8)ezSMAClfn>)+CS4}M)SR^?@S zttRp53XTOmDsskb+q6X01%@x^>U3_h8la;q`3e6ggv6;IsmiOXV}Ga%3<`O^l>jQ3IA9oeG+o}i76k8ayfX8jwevrmw(5^#V&*7j*4rB-8~Vi3<*zhPxn zf5@{%Xrb`$G^^=rKYRNL*d6Q?-TQ56TW_Ck)Hg8P9}5hH+kteRuAJU2DS1{V>%;Ep zlWJ{o-VYXmr!6hfh&rF@Jgi3#YeZ@=2c}=Uy0;kQg79)lOi6{vdcOZF=`9I4^-tb& z+@&nur`EHGL_(~9eo!nh8_ixiZfl_>N-G5#X}d9;LvDsYp3g2u_^?Rmg%Z;L%ugs1 zcM1B`&(PihqkaAM!sVrO4=jCJJ*OG_FyUHzH^<_4My2L4twuu2E?| zf**~bM6>bJ+G{@(R05T5*PhhxGvvtbErk2*u{4~#Wn?Tu1cqB%$#P1Q72A3HD$oMP z?)SV|97ByJGfCf+OniCBH=!DDeL{n4N`y*I#q!*ic{NjCgmy<{YFv1oDWRYHlf%6h z)$B*n8GHU9=kK>i@XxnvIPoMax2}s_9Uc7LDYAifkO~UB2oz|dFC$}4ZE1LHEMEIu zP4qy`hPKe2QaLeq0&4>+HIosoc~&1*z z%*K2ZFrEJd=i>h(?5*RX`kw!B6a_`X07O7gK#*?f5~M?$?2SKa(2<8uKOxE9-E!Cynx4&M!G<$C_D$9Kim6RGpLq)G@%F_V*-*qk z6}*8TW=cD(RP?4UGuf?Wx%aeV_O{@TMC1vw;gad%l=n;9 zbW6+1-<)qUI?oSJ?;M+qTEV=wW*lEVt&Lr3eY}4A+4nlnHgrbbcFU2_8(Z@3Xjiw2 zD$Z^;5~Q>G=^?YpIc=W6{!Ow0v5;yq2IR<;h>Q4+&(i4<6oVpq660jIr!-&ze7m{~ z(2Icr_nGQ~jaxIiJDjst(FsYseW#XuLJFnt)i3s_eZHpsxc991)PO9E=^$7q{-(l_ z{*Je~d5MW1zI@7)zmA_&Q>Wt?i#?i=G_8TVrP2@ocB4pNzPVy0Ym^l`A4M8rwnz$M znV%Dc@Uk2mhD3Wvh5HP5?#zAv8~!5k;uMlu^|1%E9-Zi<1@m#E(`|4{m#0xm_;foSnD_lRMAV3=q&2tk+tZe?F5w5adNDU)`m36?j8qX&gIqNV*9Az3MR#UiN+0y)wmRM*ktQz966w? zYz~imy$N)g8)uo4Uq4Wvx}^7XT4pKVGM#gEgtkL_Vln8YjPqUNVpr+cr|RPDxPwh% zDc;~ayt}@Zc>0Kxz0%4#aOe1(lh|3^>(4{BqZIpBjIznI+0%q$Z?C6G88KOOv5<7# zURhP1k) z53}P=uq8AFqV}?>AXK$xPN;ljQ-37>a&AcCnP7m(xoNpY{tEXEGLld|0#DvWc$)QhgN}>L*n(+|rcVz; z^zO%zT*`7Hk1)B8H7nUElUJq&*lFMSpvwsBcATU4Uyx9zJO+H>oH7urixHqV;N1^04G z%h(@ad@3Hc^uN)e|3#d_t8Knzk%2s6f4iac;n5;d6M>@g`>qY;TUYMdK&rX@uc13e zERgw{Q{GXL`47dJCwHF)U~h|Pca0(F_xa_fE}z&N7_k@~^4qFIeb|k<=eDTwH*@k} z0(P|NX#@eSJ#$Oh=uWw>nGL>ci&K5EbiOn9h1yS4uT=EQ`t4V0HC)YkL{M=y!u0(7 z;C#{xpNK+!q2rDyD+DUzJc1(Ggqi+;$WJtNeY`C29h11G=3|DaKr2p6PQOg|qcf_K z*)Y;=i-f2zUxaR47owxJRJigl9#wLC9C0YXjf@j+5ONqiS#$Bku9J#WZR`KI^z`! zMDJL1eizfIY0Fd8fU~i)6GKw+JUSz$&?NAWjAL3QC|NHmvK2gqZB+U9s2f^|N>HDc z>qkc5Hby$0BDTGXF=zr}RrfN5KUoQm#ki#(X>LNH@KKW5n`K{%i(OU~v8mjjSW-Qv z_>v%`;T35WuOQ18*V>B4?~DkgQ`nnIVkk}@dYQx$*M*CdczahOa*#S7xw!|YB^!gyS=gZbIyQG zHlZcGii%6R`nl_ym8ZEsUDPzmgK^(5KZW1@WO3RYZ1fg>?T&qfB7Wb@Qe5GhLycY1 z1DaK31_PNL%q2UX=;W^^wuUUpjw<8>&n)q*cPKuRZ+uLpCX5S@_b|L!)-dt^6gPn!E7IWFHXcs~%dS@m$+km-}#w&@n-Abgp!g5lO79w zQh`D9_EQ3%4}&WdVd6gr241?-$qWz&WIECGj}t};*bw#A)_uBkN%!O15PrmBN6^yp z?C9L%aqr(^=F_aq?n``~Sh zHacqfK03zQe|W*&yY9M}(qyw`puSxdn3Ebby31Da zGtoRPP5=7A!GTk)maaVdr>0(t2s`d-WkEQSy7O zta+yknpzjXmd<0zFzy5rXyE>sKbW)Qw&o{iy_1z>$7)FKmB{?`Bzikm3B0*$ikk4cYN+hW0tXn zdK0t6VEXhQ7Yc!MH~?J8X143Iq`je*9@JlG50j4P3~Ove&P5;ZDc!6%L1nh)1jkl2JN4p#@lpKE2^jr4h=N}icS1kcxid*J6O5bKVjywSm5i3WzxBB zyVR{SoTF5Wm~urnGA3-f`6|+Uf^D>xLwHGWz?hkX{(~#c#d!stRlRWrYO0X{0q6TX zFIY)Ej-Eyugh^BSx9Fw~uDHqlBP-HI7x?_{_%^wLw$QWVK2O7q@iOT|-k3nf`sl|z z4nIdmL;;FMNFvW|n;$!$W_dKQ!q%Z*yf!jczG}t!oR(Ja*LNKPA0a6zsl#9vzP^7O zgf6J+Ca^5pevFOXd-2XFYow}8{W-4g!Rjz@P;$+-IDMP?hu@B?VWHb8RdEqx$IDXj zC*eS+`*^l$y+_xck%Yn_iT_sIz2hy^nMWA?<}P=ZN$juk;HKFh8xE|dL(k1&lo6dI z&EGAFXntE&-xDunuO0mAyni58Qxz5+-g}mPhE*4=Ma7J7M$kg-Xr#%0BH|RrW@h9hp&+ELZsb<_SJ~0NlQZhYImkv$N0$Z?ajbLUbVYk2uADeW*gX}oPgLn)A0}_OB=MFVBHAqy(10pIQAmCTEJ#D1H%J+ZU-*Q@d&uLssgKy4{P^-I zfUW)I{z?r7@Bl!#!SrJ`A<<5pLYy)j1+2SnQS|>}i&|3LE*BxtQEp=+GgHd&6;rCo zT4&Zi-aX8IW8A_~DJFt-j5%zsj*vrT-=?ttqf>3ZW&+)(-vGeDUX(*XWEW`wnnkcv z`k$wY2I~U!{8jG$Yu-L&(T;nMU*#|B7*_w&%(dCx$0)%Z);hmqm*6q}Xy7q6ke19r z5wfs?HkRYW%72=|X!D-x(%T_E(o{`(G|>{pN5}5;*lMgCIA~ZzFU-GXXW#a1N*+}B zYf=^}=Z+@6N*t52QTg$V|Lg|sZDF@^mGkH3Lj^Ljs~%Orf(;HjxgPw}tGY(X%1P(P zKbe9GMid6wBq+o6SsuN~#tjqy2-pP(EbUD;2`V=dtiGIpCc0hluQ;=wB&jd7kM#B3 zf2z_Jp(Rm**|a=P+slLrAQH5{$2(3rW0La61N(9P0}23$K{o3u4X^}YX@DGMWKa?k z5t$epe=94Cz~Mi7FDH=SRGx6d>n4Dngm3?hZW~^g(Mu^3bT&-X&^BQSiQC?2SY)^u zVd50gECv_=JU~>9B)8Jvu(7k>^A|BTF?ouMA+Mr>6gSty_2l&QPsXJQK$4#0Hac+M zzTxdurzJhuJs}7iex|WLk{)a>rt1!IU&06swC2_Xa95W07j)aLskgF~?d{q3mU{Fi ztL;U|?p*+l-WiZ$1h&w>T+GDm&IA9C*O+=jzV~#aS-fg_79Htt63a;(QV^%ZY4_%e z4*>k*=q^b!1XdItI_mk7jqq85q|RIXj7JS@CD-B%V7O6Vbz|^D+^<*kewX?1&t<@5 zbDk#eU9p?nJGQQx7~AeCuKr|>G4WT=7eu}y_~xVs8`t)(xys4?^%3rI^)J@3gBtP# z(|-$4jN{9~`cHbNGJEC!{fGY>!9OoC4d?kk2)eg|8p2n$cIt}#PtH&i_2A{NJ^TJ4 zjsB04e?AQrfDlVhIq_g}3*6lxo#J4jpX+jMi*DRyxRA7*D9txPIc;(@veNn z^W|Y4&qnpUxy0UYIxCtJB^XoHj!AbdRy3sr8U=c33+hB8>;{Zz9`>vpVfX2u1jR@v z?LZRe%+8j_t;ZgA*T%hq*S3_g8nT?L_x;FX)*P*Ofmb-2y5fwIylg28-FWQUDxEQ1 z6A;EVPwLuhbdj(<-+SD9blZ|Sz(#4|F$X@Ksvy}tqXw^=z6UOUJyFzg&U&}rc44S= z+Nk+#7!?9d_hGy%z9rw-Jzg+NR4V&!8*7#p;7PfXEIl44#zradRqQitX4Au?d&+1! zXL}a8hCK?c+v+S2=07f!EMv~TZ^E9(y|S*vgRRVno%FG~+@*x+y}hnT2bdT`4SZNw zgL#h5V$I3pqT5>=c3w5XS8_O&Sm~hAJ3oe~em7OW$8!{qT(HHxO+yd(JnPn`4upj% zNN;n!#L2A1?8kAu>j;f9-Q?+du9WuL?6`U5;nJ>fMI?(Yp^>F$;3#56$K76DmTC0Z zUA_G4VyO1s*!5~}4cFyqUlPTUAER5#^;DAs+K!4%iAm>tF^(5g%!o-SgQM(YXwsyj zM$>~XY#Yd?2F~^=BVQNREcatsf=s?EsXNhp@w|o}9#&DE^RaxpJ%ZIaZH_Rp5^xM) z5xwQ*di75RdXu)6y6^-I;E5{p(WgfoSyeXEAL8IKQ?m?C#-5vaGQ`UV66}ZaX`X>Q3YWy{+yUXJ|HmyBcr>SObJF6-5 zwI@fc-5yR9w1(aKEw$+r4x4h({Cdy!Nc*&M>37gVN<1sSE(&x{O&{)89JdZ6YJ1L@ z;dmA{2kgqfuGyWLPW~?KISQG8#3sXgG z@G8rQz2+u?nF&`TmUCI|!|IX2P;b9L%rNg5;((V1{CP*flCqh0XOsQ8{pjQUs+74oZ+^#a z^APPhr232zKDomFN=5I zoa&70eC7CfigW;PkjvNT$a<9W5Gj#+5w}G`=8djTXwf0+6g4H(tZi#d2 z=2i(&W;kc3R>p3S2!oHZ?eXvsiiA6mBTm&~pl zyI#6}-)G2}9y>mD;GaHop_g+w-zxqjmYBB~zancF}K&p9~w=}3X5RB2s;2n(<|1U~)KSA6ISsnnJ(w_}Oh7|wfl zT2mJ$Lke<4K1t40Yk4nCVyE`r{CHb+tHH2bbiMJkP;~{trak{&)cN}oTavNE{Rh4k zB#%^SJbS{+q>h)mwYM(o*14ZXuOrraQ9l){JLylc#@oW}Xz(E`%)fH-vOmeAyE+gr zrj{$HPr9$ij^B&t@e%%-|9GAe^ zirEjdJkgms49iTT}a!dKK)$E2TT9wP%yfx6cOCFWXHr6C`bI zS&^P&b#-h4kK-F{ZMo;T$XpWWXen~uGjv%0)d0TbGguCyj;+3{G}3^iM3 zODCnWJEC?eH!5_ku;9p?{^vuDV|G!8QdUG(DrB!bUidyufqRgxS+US?F0Hcl;d*>| zU(ECj#-YH(tYFB}cp_W_RogQQCUhHlqN%NVxh;Q<#TJht#bmE=;xSeMflzs8K??cL z(-RIG56eCy4;9!Nn0|Zw5?gf-qp5sUB7X0bIo*2KLB|?ChpfBUKeDp2+Jgv&E5K_- zkg>E4i|K-RFXwz<^St%y>MBx7NJ1SqE)5CLVx)ak=|n+*Nf`V^nv$A^Mt66i<7`Ea zvBbR%8!ZBhKj(NzQRN=y(Oyw0|L_p*8q#9{M?6!ja!^`P{ia_bBLjUZ*N~u)yhKGC zoWGv!v~BOusPeE=TUaGm4NiG5CX83mzQPX!7+W(w^2fjEe6%e{@1aTm{?x*4+I`&u zl0W%&=?Tn&I~b33GsSe;p)#b(kte3OWbyL`ul<&K{9aRG!{DCtUOZ2wZu3-|sD-DG z>lAMs47ee%>V=~S7{l0cLZ^ou!sD{KzGAYT=hSmlXL^)a62W|UD!b^xfp~;?4@s=T z(?hRvfUfZmy5S79Ca}Uogx^jPAC!f#FZP-w^_dOJRr-=z!PK}4R}O0`J#T7MTzU|f z@~OJqH#J{?dR|QX;x$5GZ(#_b__mFdtnZ&0J*;U!p)fKpv$SLgzz5qGHLB~==o-*A zK)8bZk`<>k5XzpO9^fMbdIB&zy%&5UC@(KR>ORP3VrgmAm&o^=I0uZBPAT`Z-hW?1TG z?fV7-Tzd8LyV$-R`YZr`yc(Xgw6p;7irM(*6Ch<^OK6;5_3k`?;&+?9qy2*k^Eat+ zA65>y6F`bNmKFVpCdBy-l^*_&6JhU5>C8-E} z>W$8-*BWI4fgsZ#AP)lAF!-LlqN0eJ+9Pjt97gUhj0j7@kU`T=Og^yLuF>fbA_JgM3+t-&j@@P z04wR&HV?v95X6GwH%vk{KfqvUc^n&Pxve}SBqS84_=1a%H@kOi1tLIVY`{u8j0X{O zeF5a;;7S_Uw^P>wxJjhd9CzJuEV;E!A@@c z8Vpy2RQpb9j*a@Cpy~qzzB8oQ!~{4Hpkn5*-pzaPgSj22?bCBmg3hAfeivLGF=2}X z8kzu05aX3XcIE+k6)I&T4Oq;VUsFm)3%a}WeGq)#M(P>g6GzKTj13gE90E7H{WsVm ztE03OiZ@ULGX?$x2;aS9F#L_{*8tf=07OhlNs0G#y~M3p2X)r!BOnFNK7h30-uuiX zZb%&9TmAG|B%a)zIff@0^~AEXv2!S>Dt-hKIcv4>e=bre6c6Z8f^IZ34=8C;pV*VT zPY5vYWBVR2GJ3w+D1Z9{sP|pZAE6LZ&X2ZSkk;VGT@Rs0uYhLB@$TFR)OPxC;v)*$ zcy~@wRU>m|{{_THpDUgeu)3}BDmK9PW_O%`hyc;VXE>wA!ouPtrfhh3O)KePS1}Gj z<0GFBT`LRI7mybya{R{>$T6$s)^6eB-(OA+_!kf_sD7=emj#@KwKX%KLvSBHR8UnF zXCeSP$*kLas{kw+0EC8jcPrX#e*%lNXk*jyEb6tYYJ08oo@%WVv%S6REqwhpyDANg z|8BGLOGQ9s?+^O>{xepb)!61%oWy{3$dHK>Nt{tt74!PJh_Em! zNU^2>Pa%w4jAikwf;i;^ig5q)R%V%S|9QC-fTKK{mEHg=-}|(-hTJU>{5x#CAj5or zKGCo0zKwphbG|~7ZWkt=J`M{5Nw{#R#jmX*a`wf;XQyr?QkCb%=y)r_qQF8JHfQao z5`DzXSa|{{9f?d=Hv_$_FnyL+I`YgGj)-^kfX9$Mv0{9$St2sh%Ob#J(ZsColx3{^SUb>B8}Vp})gjP-ugd#jn)HVQH=w(sGqNSG z=;$!GM*}&>+1DL~CzjdDQ%XDS0pVqe@fbV2LuQjSjc4FY_SDf|QjgmChfwZcrh5 zc(u=NhFY;t^SmS4=$N<=O;m?uPIMBfM{O^sN^y@ktF^f8!jowyh_S^+h5o)Ag{qWUWlz_Lv-GY7m!)OI*jHGT zRa0aki_5-jn!+U2=ewsNA~K#fzNQV1XbG-t8&7B>MK#=$lZD-k?AR z7O2@8Q?;L~X{)P4;+0>9*y%D@44T|^7uDVsU_z){4T>;0-)NOtRvmm<`3zAK z?Mkj`$+M{J!M`~h0;ja;AZJG|7M%Ww^VBXhsib{YVc^-H$+4l!y&z?H#22O>*-)%* zgYc;d+Um()ih8Ug|KcpiaOqis&KPAmlebj$^;7|?VI@z_AdWLs75kgYla_G%x=|gc z&4;`!hw784xzrC?!!Ktu3al@FC{++Y|ITxtoz8tnPgPw)$sUo@upVn8P$OfW%|Bs{ zbHEiy%>S1VA#3{p_c#;?s?(Vc7t1VRsxXDj+O^s#)wy?j?bYK5^i5}{C&|3{9(!6B z{~6M#+N!AJFwJ41hc~Q8>*8)PsV6>wH9FNMqh3FJa27aEG6jF)m&k7v*5o)7 zJbr~-3%`mF4I+0H7-DQl&1$~nE&6f_9q8f5bA;XeJSnyjtd2#m66lRP+Q^(^lG=~#w8JbiG z6U#0g5@nREM>Ltl@L@b?{i2T2mPb^AXI)~^Q{G$P9z)NX)R!IYYPEG??RygciXZh~ zI)ykKK*+;FL(J_tBC8H(MA2c3fg;oiN1gOjzsmUsctPx~P>XkKBOy|elda3ShapT3 zn|tO7uwwm(TfkGErG)K)1s8NOPr$R}UR)XTa1ThS&Ww?(k%|bv3(> z3*uOGZb&&kj)Is3u_$KR+JJN9Sbg2r_XAsomFn{F#zC#St!d zfH%q_Nd1?74SS%`n~YCZC+_>VeaO#m|JpyfBqMVdykb~^%O(E5EdBucU%n0e<^P`Y zqZ9F7HZ#}&a0S=&#WM#e6sW&+;ASJUPuz)rH$uP1WxYV}2du6J0~L5BUktGFAj!dm z2^jzU{Cs3JUu?d*f7^p*UF$b1Y#Am?Ya9Pa_z)A|W`Zxaym}=a=YS2EdmVUh0?0&z z-+|;oQeRs%vmPgK-$246PrV{!d>jI*Sl(v6B9weC!XKAi-~r81{dgC$xP}MBXw`i=!x@hd7#;laGmQnw;k4J zxHf_nM8a1D%>?@*`F@Ui(z{_Zhd9m7$sxlJ1P<4qbaU5YBNHa@dy7V?takQ(VlfApX(m{KG1g=ZM2q%+qFsiU+e*d2USII-sTRO&#Wxh4o0Q>{_FboU~WZG}}XEJbQ zZ&ko#Xd+TT1_p#?FO%+2c9aZodd!Pvc#PrAKet|IQ1+>5)^{Dzj=IRZ4VF~ z6&V?-zx_)Qk%f=U<+>EX2lira?$#!cdXmuy3CWz}l_KAQ%oNxvBB4VLY=gL=EX!rU z!k-ih3d;cT(&U2$G{nns+C2)?mx~4wG;~lUb!W+^{wguTvA4Ge6?6m05+PR}P+0?R zOO|U9*9V8R7iJ0V*_2xYnQGO@^t$=KOTSPV8D&!film<01uh^8bXtyyK>z1AArMII z{j&6ElJY!x0JfKqv)QUc?1DJx9Rb<{Dp~!BN^4}63dBMn1>bM{6-bN*!^0>Io7<_P zAwO&gPRnxMM*5G=qk*c3Y&W_;)R0Jsj_D^Ng3{IxLT0=+&L%SUTo8uSOsQ)i`;=T- z`W1Rw1D#Kg(we)x*m8aogGmzV3)Z@8g<=L_+skFNhjY1&1DFQ>^L+&nK_F9Bgu%K5 zXbtZ^>ooZk>9$~uxYs5gg15nSeS)Y13QO&BS1Ivq!_veAYku!I#Ps4SixDO)ZwB&2 z#8|N2g-kLA{J@gcjS8eJ-Mo1dIO5WS6!-n#U(*VW5_}>qB=j_LBQ3k?(`Y39e5OEM z5?J!qV4~lfeepUmefsnX@L^_Vw6Jo>{CY{>QXW(w{M)qewO^4f0@{ai(lIPIE4pMV z^XdOj2!lPy7V7d@k-G=%&^uNRAp%=51Ai1G5XnV@e$4LxCl!>wfUvq|@`jfX3&D_i zzQJtcCpxv_k3hzmT=tDYt%xXy7%eK|jM+LtutmUXhkvc(I(VbOf!o9+aC;z0%MiT20|byrq5J$)_&EbZD|`& zoE-Z}g6urgyT+rPGZ?g|l}$!cO6qtg)Uz8Tj6uR}-l3*O6V&B-mpbwK7{p?dzWBQ3 zzU2z0&0%W_gnE1+-44VZByPbEKx2I{A2mKQif?d7Otw)Gyz41)bp4YVX-_r| z1r8<`p)-se`^T)+XK~80@7Cm9QH)fec0ii4YJWiL_R)E>UeUQMXHR~Jl+nA>kc6{! zBY{-FhctMjD<~_A0%iOlh?3Oj+cw{@b^xZlh>lkKiVzOdi+?+dhL&&r?k8cW#*`N) zN>{Nz)fYNfcP`Jfc~Y>j@y<&z$T-6sMiwUixkLZ32IPQ&G7+E+vzO7mE%gKZ4if>z z-CF?CK&1jMh?6kU0K@S&`6l}$O54N0Q!aVbBpB5jAlUv0;T|EVRWaQt;*`=>Z{6}h z@SrSp$9VU_pW&NL7t$~w-ohN_>Uo0-`fF zer*+Yjen8b{EpKupZ%Y_Czoh8=#l+Nh>n)O)4sUz-N)SkDV+}S> z*?c67Ke>qzV5;%L0djEK`HAKS)a8mw)?m8|Ky7rJWO{^%@QSj;Ol%PjvON;0_nK|; zRnXMzDbTDjHa32OivbLsGzeMm`@aVCF6iz7X=?(}Li#K00vlmix*Rln_r4egccPaS z)0X7q^*ZZzlhwPi7m)_`xdBp?;ciE>VtJQNd>#5;iZod3o|VFx;47Jfn>|;Qa69wN zm=P)IHc_+Lzg2V1XJ=QT41WqrH~_)kJg*x02{z9)(~${moj9kot7|E_9}njs3(vTs zw-~!XS;lXAt35f39rO!^_&|(YD#!}LbqK(DzYCl|O$Bz_2X#sMu13;ZGdnKr#I*zk zdKyeU{A&Nmn|Aq?L97wrBxIP7uzmD4H#Ul;l+C;ol?#s>Txn$M;n(=^+erHDqbCgf zwvOIFU8M*6Ir6jHxc{G95YXh|P`?_!kp*!1AC z((eJWG3$z2Q*=YUIR9SGHv^gC4)H-+(5vIb?{Db}*V4*Yr0pRFCWt(9L~$tgPrBYW z19?+ig#Vl5CU?hgP9LNmPrXM5$rmBl0ip`vIYv68FypGMwvGC~2dm;Ykpb0LUvcrQ z4u(}&?UrAImp(M_E_OKsvssiN8_&Q2_}eBX7kd)))W0);`)3B0OGbwDd0P)gwflY* z=`mw^GXh$30u%(Et*StqS4u%UOPJ)dQ{8{11!U(ba$c2+G#xVy-fBg^=$5eDB4Y#GkDItM*Xx$^IG8y$3Jow5+uo^IBF(hqsHs+)r>z*Zm~ zFzfl&Fo{h6vWj_|s_%LAF<<_O0I>iA^sMtD@nzv4Qhlx8E$6czx~xV>Qxb4EU;-Kz zRMvr#mw`uzL!*Pgenq>7UE2`>6;G3}!M`;R_f{U(O~n$1wp5<1=7It*WNFyIz#BI$ z95ggwQ=f!}Cr+`}BEb(U|Cox{9qhLm1?Svj3FX+dSv~r!!Ep z-eSn=;n3a%I_dWQpd6A;1n-ZaW@H3aV+vYYAqMK4#ArS`#CGujHhymD&3c}H1hg!c zmdnmfAQOOrL>yk3w-BN#CF1JBQ{=~UeZrSN%dbnH1-L4}Euy}4qjEXr4%hkq;5C3- zpvcOidWG_S2X4!=^i!qgXLHPw0fEP%mzBZ5|1DdqmWg{|-GX-+U;z926`MPUE9Xi( zuwUU>pRfHt;L%D5;Tb#?BGzxJ1as)>`ZdMtiHf#6J8)!BqBAn3K`NXgtUagHhp}E?L$~@HcY{Hn)Kc4v6#(3AUkXSgv7cEu;ZoXIk{%f>FD(5n*Bke zM^yd(GxM$#xBch%-AQeAh$$&&XD;AR1Iq|VwmbNAGvGbp{7EAl$z}P$jVZbqfdM-% zcvrO#n0DOhNbCFC;2cPpnHB&imyIyF^806aqAUJ;MVgi_Mre=$@)@ot^^G2!9ITD9 zT2Ap2XGkb0u!6EuP^|@AOs;N{0 zQko@}{1!`ALD2UNLf~Nehe03vMvIq9E0S!?%AIhj$xAAyd`>kn(QeW$E1s zJW~^w}3F_K*K>TGjX+O&BITh;f1M@4Z0OjC& zTz@uK3DXm^$0Op|vdl}VKJl#7-xujsxP_jDXYuW?E0j;ha4%Gcn^?o@0<)L@)EtD7 zYa{vd5h_|bAf_lSExqe6Qnj2C2-IRB!Eq{?51%|t90b)xkhsS@jyqeI9;`^mpV|Gy zZlq9K?$xWC(9=oF;}g6~N$!N!^sB0w1rfGI<*6gC3A-uxyp64@eQzNA#n8;3Yrms0 zVgeVlV8A4N>9~>6)DX-u^&ZrjgM`8vXjnpajv)yMkrZ6q8^=+F9uc7Y^bTX~4-mWj zsxFIcOaUzi7)1#$I`lCxy#*Mwy5lVCJHQyA>#RqsQ2Ka( zL{(Fz;!TvM0u5ftM}Vqj1tvvL1+m|L_;%|9<^mII-&SY`W(Nzk?#@ykIb?bS>-Q&JBuxr-H=46fi%#Um5C!>Y5tgH%Z zYHE@)QsI-EuT4#JSXfII>7$0d3FYsHA?7U&@0gd1_hK?(n2%q?_zVGuv=$x;qH7V+w0(CU85? zrBzpRv$+gCcR$G0R(kt3mZ5I{&G{+xvPNs_@D7(|jHHCbBO3$anvCn zWv-5O<_S%K7>#Uv0 zP*%SUC$TWt^V=GEF|uSbhI%chS(8ESCy4|-9|(G$;xls-i`w0{*3{HoH5SPBf6z)x zPA=^1>;DVeTEqhBcDBA`vI*-yJ zFtxNCOo-X+u#x2 zC;O?Jt)}@uD04e@ul78)nY8VjtOj-QrxQqf?S8(dJ({n5uD-Ysq~PjWb9OOEwf_6+ zv;QlbnE{n*Dw@fQh{;SqcsSQ-J@TR}dBT!EE{oKvMCbB*|o}UKFG= z!DNZp^C~u91B3Z}45&PEnf;VmW;L6?Ln11DFO}>CK&@gyONJiyCs37 z+#O={2gWxQ_71Y;+$FUNRUB$GfrA&zX7YvN6UpfKI86mCpIj{DIe?-*fy-Kt^OH4~ zOK+Tr*jU10ePVx3e7O4;~t z>+9xY<}d8+?3ObH&a(}B!I{*x)+%Idr?qOnD2#)Xk>JyBgs6XZRW?1ADcoT!_M%8Od^X)q2b}-&i3}7fRxrR zQXLu|P7etYY*DeWC^+1jW~}Kc2&aIknX-n*CrD!c_M1-rxe7T4YpkIL_j}?fY&(O)*PfiD(Qm{`ak$!M*eHVK_-b` z6I=oWaEYS9gwH_3fcDwkLl>|;IM5_<_rsDTtc_SnLTu!~C@3A2lz7$y**TTp-aXUU zYP(UT!Jr8;(>aBOQPW#s_t!{}(BJ>W=q9A1X&*r;mq-`agP%M5TZQlcy2Hr(cbsIIOqbw70g9ahr#fv-Tf#Ft^yh|#r( z9>c*(>v^!21A~KLr^{!#?1s+5$a@mJo{HB??AK51XT7ca_TIw@yQfy}97$;k5!OJ2 z#>U0~h7R_piVgSo0|Zk9tNxK>dTflka5T5Kx0ip|4mk)I1{6DzF+^L1Qv|l$=YA+X zu(+_WT-?Q=AR*yjP&tR;zN(P)Mp81MR;v)R>9vYV6u8laz2nAl)!&m2$Nx`H4fC@b zKE{E2p0vPuHs}=r0TT>9;8`%v&CA{j6LEopA2mAsG4pc%(YW6d6|Zjmi4|R!4PBSG zHu@QOcTpfWH}^}4(wW|DZm!gqml2i? z4#V&8H2T`4K2Ri%u3_=LIATOzW@bW!HXf<6cjsqX^2lT{3N6BMM*_yd3`(pnFW*wC zlgRvH1;T=4J)j_6I#+nj{IEnsWBaWoe-h(Y<2xi36&1AX>`HImh5O7LOncp~0Z;;5 zkOWTamw=H|l>ZHk1gd=wG$C9|(Rv{d;HqEffZVq_Ka^HxOAs*e^4L!$?U>(r&c~+- z@EVv#P$Y$+xkk^<&aOxg-#cEg;`|yGmh4O7B3@$DhrLk=TJXT{*h~f}`1ZP4Px_K- zzgdrQ0loAacZwq<`WmqkFup~^AQtM-?0O44=npP(#!EN%-JN710nhzk=4B*Yc}>1@ zBG!u6dV1__YVM?7xL!l)pSL0?su7K!-im6P{oFPm)?;`_sRm>uKIKdTXT|)5de#A3 zrFBzBI2AyF^sirW)#xI>=WzX7v0C=Bx;j3^W5XiVmvL-2!fnB$a09Lz6yP_g_l+n; zb>W>nLVnw7QzuH)7U=Mk)`mc}SD>g{!;pr@3XieHj7!jf zZ43&+Ja*$Z(AR$srW&|w#c%Uhmv5EozSU(nMvf@>QulvGBx3;X7V?`w%>dj26lMx~ zJ=bGc(qVyvNv=xG;jpfno|cwXR;C2X?@qRxaLPO{JvOE^Nwcy_z6AUMLO~mUHM1NY z0^n{W=Tv}2eavMe0tN(21U^Vuw6w%2%SP*io*%+oHml&JCWDkpii%mg*`#KBa@s?i zCoUi~s8zk=uGXiOl!!0QwDYrB$mF$#85-03&B37s-&K7s_59nL+$dZU&ChCr__dNa)J64Z|hvjA{n&{P|=?`KfHh0j1dIJ3HT#ye_0gJ)y zQmRDiz8}WT%>&FIO=j1#C|cH1f8o6TSPU?SPwu}}xP~HpZ*T^N6TnZGF_c{+tJmi36 z0lRD56-j^6=6NQ@2TBviD~n!2k6LKQ52ljrCg#Hi7YBY>&$AhJs|FKuNfvZVr)Or0 zxwE1n2NAUSAABB&jg46O(iM}e*A`-Od4ZZqGyO&(A~H7T>yRQBF?BHva=Yj@>i==S zn9XGP&N}XaIb2)lcu=gGXH%_lJId{9{(Tgr?^|R03a7ROg|SiMLrIXA{3&H?t6A%d zfxxeqf#C zW~1686KrZ~POyF0FXjtSU!Opf&iD5nWY}DuJLXnZ$pVas<*<~k^?jh!(lU6kUJ_x$ zouC6BE!56kTH@XqKZpzn%xp8U6Mhhs48CqzTcp6nHFiFg6vXUt+;!))8SFHj&oTAu zQGoOLNm*vyCG_%?%6){lfB#`Bu2bLU_<=HXEtZb?@JxDT>zw1KQHYxE`f=sy7L;dQ zgAEu{G7H^Su}<5%!mquEGRrLz_H~%+I4ln8Dx7-m%C5Ih%06QK`Qz{CBmRT)-qLbT zZo$u24|{%g$Ed7+K;M+9PU}Ik5$91XQ7tc73(tm9*4AEE6^^=F@ZE`&Q((cka zxGA;^Cyk`_gaOj#=^p#RM371cXO7HSPK_frP$}(mXVg=y)(+>uk$r zZ|bpJcN}c#CM9svua}IN7EIzY^k>ehbgH(f*)Y?Ar{L)+BKHN$vJ&yGXMyDu_Smj6 z@<*hE@}G#yfF(0Gf1{@m4odrnehp=1wEoyx9nQ5M)|UNw&f&OR$nc9cb^d{K-IOu* z9i-Sux2)Kit_-{yFI}N_<|QdBC4Qqc+*f9|lH!CzPt)0nPfbOo4uK^8tcs5}kBIaT z`u~V~52z-)ZC#kpx>Xb#(m^qRfHdh{rS}?okq)6r??qHlq=qV0I)o-2LRBf!r6qI} zq=q70Ldm}ZeC~bE-S?g|&b{Nm888MUZ{ByUx#pZ}t~sCetVAARIvG!}aD{4W7AM*p zkQN(V>v(l(MvOyRRiWD&X2lPQ>wG`RG3hby*q!8oU&bvurFPB^7HDfq!+~3KUG-K_ z%bAl?UGN6i!!tq7?#b)d=P$iir+(0yB}cLtDMhU&*Le@LM&IvHVHD|-nE5l6l%`C_I!+C>7Lin+zwca5c}}`^{Ie zpIoX_Q%(iMUEhu%kv6- z-sQ_1pm{I8c~us6X8;#rJ>7f>FW(@Sf|oJCK4hZkJLWg7&_z{09c#9F1lN|B4YePJ zw?%Pr*i9f=%2}TPY>1lA;p7{jC~r7&3v42Rhzon2GKftEZ#sY}Nk2JxWB=;jn5a5B zaw-?|YHMz7axl@pk?~8!!$*Utxkxal7?CDK^yjw6($@&+R^WQ?bGzu2w9b!2udr(9 zv`UAPdZkE)2paYjtiwj38Qa#4IlEzVOe`#+rg-D>chc~a$vfO9dIgQ3%K(Zp;k$3E zQ@Kn{eEStcDt`3=`W4ioWti$MgLroH1Mmf4CHt+xClr5?%-matyTC6nJ*-nECVqiv z%v0N}u;|T$0G#n9FGGfxV6-g{epBkZO$Y&viUB$V@?rU1#TVJJ0 zwGY$U!YCG_CX6&w%AjUMXlCmzh>VDgLGUr<&bAuq^O95eG#rY(g^h;k>`RX9m~SU0oJ_ zmzX$)N^436%K52PDuSSR6uDwHMANCs)PB5Rod58QxE1)R!G6aF&f{KAFHHgIb|LVN zmhEueFFlRBlVduyuE{W%0jPy%>lLXLR)KAX@K2>?a^(&)QSdXD{NHmHt4p*9)NiBK zfbRaK);ye=B2)d{OJixw6XPuKr3fAK@B$)CwvzPaC4>}>K8XOyB4-;Rhk@%zPK9ZE zp^wN*yfZ`2#?q<0y!2bzA3n2L}LZy&TUS5)t#n^D(d*Ez2ymH+Wsxn#H^SO$@m zjupa@XWsJRWZI{w`FI2%8Djd$)D@M!1z|h4;E4%1Bs`W>Y~X&q|G`vp_nC{tX&gJeZo22%St>ub^8&2`JyN_P@S2CHx5 z;hIXG@Gu(t0U##%8zz2OxzFcy2{4%5K%TP^*v2EH^!(zfe7sV-%B-v%nZ7M?3xF*R zdMhL+(5&M-inq+Iy%|>$*vhC2UYgkoweo9qn|6c7A-=Rdv>-ImwuN__gHSs1iyc@r z#eC^IES_LW?52Gu0l#6X9n&{7Key@nb--1gDp}vC(eGfeaqv=j&;%4euO~$TBjB<1 zl$DEPg%6ClRVi>T)ytVUtUD9mxwB9+Z}4XGYflo0)O+WzjGcD@3i#8JA8Oc$zRh87 zj>M{80^2Yk4=-uz2?=k-f4>&}iHgy_!6OYUFK#WJ!PRevaa7;3`L(8Uc{v@sGxmat zKZ>q(dU_FNz4;3I)(1@8;0)Z76MqA@Y_V+b?d9#MeYT-3oW~2IFVaB8q+biTS=AAliD>0#h z*}%RP?d~i_DUA+JI;g%*O(5jHHhr}R{nW0rFEfX1SagL6-1Q!W;A}a5ogC@NS(V{z1cIHU6V3^-L@7Z zR#SDi`LsVeI_liXB6oB3-O>96vMCTDB3F^;jaCxcNln(c$H4rvTIW;)A{kJlOT|YC z$zEVk(@dp-JsWshm9>WVUK+FI>Pup6Jz8D!F?`fKEGUw$GXy4hBDbva@gn~%w4NvJ0W+0rGfFHo?URXD8Q-A2rSGlhmoysdS z(`w#ste}SaDkEDV_emI}WuARG4H_YJ3k=f`?ZP|lto)Q3BdRu!2=fmDAz%WzbNG8i z6t*8`PBrW$-;4W^5AP$ZW=#sX#4Uz4IMkk~v~18LyT;!d-d|l}1vh&|X*ClAi_2`{ zo|FE39HJ83C2NMvc98R`=pOhYn=0zaj=_RlaXLpQvg) zy0X~FV^Em&PA(<^rXm|G1{b@NC|AmFR(Af@bI1?8y%P{bP#VX+iGr4D(P=+i(l6gZ zYbv2y?G2cA4RMJE*46S}iI6D=83wuv=5K{eer_>IrW^uva_jyh!BTG%}cxcVmR3s zon0rg0NEyxNhwCl;hAJm*$n%9CvK~U`klba zWyo~h1aBhb{>S?;(k~Gbrl*aF@CHKgnsr&+$YOT6yUQu?aYbh3P@#~LkxaH%|G|Dv zalcbg8*IvV@s(j|mRyEfR%AvNN(rJX`yKuJ@aUty%GE|go{i@xU6OvvA=j+G&%an> zp@})DrAB*|*$+haN*7WuD(7$Y-N-8x{rl0c4|9X(Etk#C39&AbFIq0 zKo)po_$@d6*;8dQW;RE^*Iu2;xwdcEXI3m)$k?i4mMN=E*1vZ@E1hx?p|{9P zQn|=n6t~sRwmLve;$e0;Acm~u`(+(~4!mN(!1~eZY~JyF27G*KJhZu;_OLtYZGyv| z<>B-YZm?)b3Bz{9+)}(!mj|u27e=MAS=)$izr|CN9SYq82XP&FjKKJv#lwZ&Ul*ka zXY_Id0C8?A!5a&?E-gkq(=4Hx4G)jYdQKfcYBQ0 zZZN!tJKUn@+pcI#&ZdbaSsHzZ`MElL7rk2Rd=yz5<5aCm}jf`#SvByuSNGPS;` zql%-9jYOTTDnBYjz?E@`SZw^Y) zr!XtAPSvR_?i9w$#yS|hlzYwon^tN=dcBDGdlMPeKG`9zi!+OY^EpniYdxzTea5le zZxl2-M}0U2GJA+JO$51ma5TtAI13%VePNb{AGdt6wUEyWxI`EP2Ls6Ek>|q?ef``v zy6vNH38A1NXNDzTf$UQE#wzN?-_*C9R zB(c}=ZtXdw8@=%;&v+%aDZGLR^LA+jneVOR9mIX^EpMCHCv0;{`&{({!_gzBr%bvcqDYhFFM8J3%eu);BNfZ#T(0)NYmA^SB!o;=+E*=n zGsr(+;qeeGfD^Vy9QcZr4nyREAM(W6Fq)Xkk+FFt=+f|1Sz^NdKKRwI4PbNZCyJ1F z;#3FvP0L1%A03C1Z-RWr^0OGv!!y(SZ|0RS9{eS&+X2&HD!6X;Dez-uNy4|d!99dc zk($%2H*t);U@fXB-Fr4qWm~wYq{7QE%CWXBJ|vKdayE{fVu2jOji?Y6!{WnJE3S(0DF2rWJ` z%=SGPD-oEqx2CS!Ww5Kk|q?jiK< z7cTVKp_E+A%@ze`;jMhSBOtDusqsN9nOb9Cup?D=3Q0`<~lyX;? z3Z&OmFFqp23Wek zAgiWj3gfpw(ynG10inS_==biLNB{PiVSUEb;b?lLc|KBya&#afJGFsBRjH9fvGMS( zR8Vaxw{f%dNP&j-igsyMNR;r35ZEB@=ef@!yxS|cb!f)9-79)vA-rCuVVh5pbI4FO zOUbWj(iS=Z;NqYv$eJG$N`bfDc$xYg?m5H<%Y@77g>k#d$edj7_Zv*8WaQ59oD1S> z?T-2*hGnGb_9%Ma3%30-p#rA)-Q7)0v_0La<=MP@!(8n0w_Bh12k+E-wI?LaUYW$ZiPw&`_Ja+zJ?R4M0n$!-y3oS9+JIti z!z}C`e@)qQb-4~u^&k%m=^yBIUTnG{R!fw*U@4WLs;U~DkbvNLp9kvIASjOO#l$?+ z(6%Lm4MX#hyoUX$zPqBH7R6GvMA?hq-j;x?pgNKXt=U=3bleixq=J`S1<}XZsb{LS z>J|Dr2H5jfQ@v1PgZ_;1Qj#G()TVqCQ!r%cf=(l%gMPQ#K1hSmg-;lv9{^>RIA0@n zSm?m>m0zP_!xK82bQLu(pKRxoop-lbX5TePw6ejdbk5*GayyoAYu8D~JaOhcGqgc) zIG8+lx&XMrwhljErW@Wop3wZOd~Fq?XxIAO*(=nj(E#f#1dGKEIlb=7T*!2Q3`gQb z(MyK5-1X;yAiHa-Pyw?shq>MCzE?YOFMo*X3;ST-WRXvh)IzPH?9k+$d~y-jg_lbG zvsGbgptRo_BBKe@L4cAwKc%a7VdXbW#4CKf@=ODmDU)`Y_z*L7tf&5&yprkGqsE6M zg@Yz&_5499o6UsmjfC0^_V{|3vdlB7mR0*E62c=#wbR-V1uYU)&{o1iM7fDq;;s(=plZ=8{_NPVNr?p8@& zRjgK+Nh^^sqmLM!%tX{yGAa!r-G;~--n66c!s?SjY8(`$tgIG0x;pwneUQs@i!_v! zUzJre8?2+nhHNzQp**$vI5$i9(M+=5VW~siwUn+%>z{m~6mf+dCT+0huaN-tfG^W` zyCN=!L5>r8YGV^0Bv-z5)_YdM@)23zTv{Mj2_4L}V|A=uYFa*D18SkM`H#0dBRqR5 zEp2=CZ@kl3D*Cw72;q+B*8o=0gBt&yEWzxe>CQ2+SR!IE&xI-5o26o^$(N#-1z*mF zL5E}`Q5N4TsNR5?!L?X@$9TBn$DN0U>49-xnmMxY zL4+cDk_!SEdcKc7zc;6IR?gSA!C~@z)P2znLejt+JNCVq+Px-U*Z~e;79`JCmf)bQ zGGrcwubW}8UIqnR+&mAM2Z%S(Z!7=jmCd&gsiK}Xl{(>+s2^V#u=R}~WH74{EdN}u zcz*W04m74X0YTRhqh6oBAFwFFEH4~_0wwBtww8bETkok|AbtIS-kV=e1y`FfwY z+t#4)=J|Z+Wp%P0r=M(PSC}y6*_pf6^r>mxCAWuvaIw3=yj6*>%BgFViZPG7Svsw8 zEBEf1`SdiC74`;Pg&A-P{(9BQ03~-V!M#99-9WiMGk-txk$(xbw*Qc;H)mRy`{EPf zIi3Z=Irk^C7p&H)EPQJb$ z;1aj8zz>`nio7d?ZwmKOXXI)7;^mPiY z5%4PVwUBwfxA9g!FwJfiD~W+cbOyLL>L((-93Pj-R>kEa9DTdm%(D3nxG_(l)~=f_5F|Lg~Mq}#7^Z14Tr=T>8|n%Ckx2CPq?^v7>l3jd=CPFMT;9Be9qeAy?TkO z-1oN8pl$JOn+d20OT!oPfab)RH1;Vhq3Nd$I@Ol5FJ47vjzTG*`lSzBhg7;8mgo6y zIu)MQ7o@N6S8B?sU53a=WYK}_bhuYeGK?7mO}lBiIF`MU4nmq$9LG!5=wcymM8nQt z-o$=F^q6p~sdKB-_;_vT_TV@wT1jw-o}?Fc?^aRoqJr9!ltJaj{I(hv&l=CtY(3I1 zab{sAqHU4!Hdm#OK^TwIbEonH;no$8`(LYN1_q|Mt@b0dUpvN$DHA~q?Ue8B#3g_DygCF zJ1njjN3khd6>^Dak-Vi~idlm?I%<`3@eV$U`H$5c6U*)0ro5gKhm|x@$_1}eN*R}O zpK9Ty41;}gC#W))!g&O$bH8V8iYzdJkCeQ>NOPiG%YSTZQd=yiJ6 zQDwE-$qSp(ADj06%j>vDLUH21HM zgw#?D=2CfjIMrRGmC-G)1mX5%{k zZT~y=lOT5EfpwTL6HnBz!93a zVe4~NOvN55X2JrcT?TeNftgR6+q$EUvQl_^yZYJ$Wnr+F z(%g6PBoo_(zOd2EVB#U9dH2n{X~~IvsWVQazcXbmgbS{`bm~8J63S_Qh;dr-p=A9n z5(i;fsF8e8F|J=OSHTfB^3aKr-7uy*AKHJY_I)#}ZNeb|Soy~b*MgqVD$*YN$-AXm z4ATTj$&Zcc1=`KG!ui8kgT6!vPrk(Wm4JXxH<5${P8rNG$A_(!Jf3k02-pcvj0=4J z#sAn_gTMZ(Z$fJ3=8*10e-S*taC(=Ulm8JPQ~viL&^HQcpU#A9MoAU_*-V(uhwuj_ z$C`=PD!6(A{{;s=LZ-jdF+WayY{aiWcoQM8i^Q4Q7)g#RNP$#soydr!!8v4vOQ~PUbm+OW_)Pr$CboZs;j~ zG2|G(`0W@_0PatC>!gwXucZFKf%+1dP9!QW35Mm*2u3Yxw|oM?R;Mn9X-YZuW|{Qk zCq6b+Z*D;YB`E*xFZ?fjD%fukB%=*$QL1Q*&IJpQOtDoQm{Kda%6(S~Q?J9_@ zH9lUp0}J5IjouL+=pRf+I7MSpI4%661dojse;mP$_W%gm7!|OKW z?CE3g+4M~lhce|OK;Elimo>LQZ8Jd+TCkD`Ryh!&ld*{S2hY^Ks#;~X-a<7er{A`r z)F4oJTrtk?|8K_gVP#>SnApGc>|e}4KGQ;w7(ZYfZEu|(0`b26&&=k(r;+aee;XuN z5B?3Ly|p-^*z!j!%d=(wQ{b(u6@cU65qbYNJmkN$& z{RgopWsNxTk=MzN!Mz`jk;C9}Qu-6yX%hFWRCB;%%AJz<+HMx+!T%hO(CvPf*^#AqE5=XTN_4So z?rnA>X;zb$E4Tqx9}TLc^A@sxYmF~NoVsqB^tMg-;U)l{<;MLJ4@P>fb|Nh-Y{z%a z+TK2Hf_hBOu{V)d3JQsq@p4<1+*(!ofR!f3Yd!RV|i>>ApTMJn1*wvW5 zrS>p&X}lCEj^exkTm+GDxef)d2sQR;Y5~WEsG!ccDPq@2@Xbgm-w%K^K@)rne`A18 zxE?$JU@!pRvkj{6V1Wgj??G?<`jS6=DvC z#v7hr3IV#q(Xn(0HFqhwv%OuzYLNt>3)SG6fLvVD#bq10H}`s-eC~sMJiEy4myn^s zy6o6kF~^!D8LF9NH&!$r_w@Z!ET99?Q|wM~c?|*ZQcKWT06S`cyzW5{*3ruV$Rdfl zmR3ZB%XSKKpx*yjGj*ygJnew~qT-4xezi`Fr5i?LqGER{~d+!XPW$$0_9DCz;mq#dM z7a;GF1^tL)*;yWZ)dV046*Wb*Ks16PswOr{54(MN|Df3BZ{7uniU1BA8E zLk{=?5Fxi!zxbYagR(WOx3b0btpf&Si#*uKKL$nE^``hBil-=!OZgXKVp#fnl8awY zW<2S8!@9FGFAYdqv((REcy)%qJ7lf1S!%dc%SfmG0~vI7%avhQXhmFM>t z`&$!hMX{zSq!;lRjnAL2h(RR)c*?prMUBH#DCOg>%cFQchX7E5?sGwR4}jrq2S7CN zD0PiH($)0VA-q#{%53%J+y%zV&Uk!~is}N=t^QV<>XtF&B+`AU+-Omp;(@iAV8>km z@PVb@>n2F|(H5ld(KZ&aG!*#k@3eTmk+B#lrNaWob`q?rjpRQ;E)BRtnx$Z75ek?G zXDx68Q1t@N74nN?JTKcg&AkPznAKmRe_`~A&FSk+2#;*Rd7|&KhYf^p<6XXdK|_N9 z8}7gi;Dx9V2t>b2R+i^_3$A~%zC_{k`FwV~X~IhI%9YxE6)porhsV^=$=O{M#7%nH zTZ1}0BF{rXTl+mw@ibGZCr>siY*=+G#ev;3GDZ-@^KZ(61`X)i9~uC}5xYdl;U)SX z9UZHyLw87l>N*SDDoS3LCse13vEjIIOI`SuY9w$@*JsS)e01bu$4BQm7b?dZvUTmW zZ&r}zoorrsvb5n@fvMN`1RKJ+EqW;Hb@U4XTWmXKC3q3D<7S&aiDr}KVPOe!-ka5Y z?aEnqgiYKUwJyfsT}Pi3`Ze8|0MDvmIsstl0NfRrY;C={@Ozy{A&KwPZH}FsMu^_W z^B;FBuI|^~(f&UGnw*ZW*z=8_GWFYYiK7iZwUgeP3Si3@?OgHVx;x%;=m7gp>S?I8 zO;B0WCx7=YC;#Ke$6)91(+qq(55}V$7;CcYA9t{X`1Vb`J1i^5xo})PMiat}D+i>XmOsWS=006}}Ix1uY zH8wojI0LNl;j~2>^XZ{)v*sZ9jSd7(;g^ZINa`tgHyu7IEJmGTX^C))| zN9&|@r3;2<0^k&hNtEyu1dMUa2ZFn!6_}^(5%>vhtKU47CN%@^S^+8Y^s9npA^niU ziK+bt(>En<-l|i(^T*)K5(~=uH5yn5?>Kv$c#`;OP)jtAj{u$k$ zF53Qwg)@iiukTMrW`y5}8x6R6pcv#+`fdzWl8<-^ylLOuv_J(gFl2=KAC*&9^U2%2yT^)*g&TJ(*PYM z*jBSneUe(0K4XI-AOy*1bg5YaEL!#nV8+R4nT=$Eyja!Vi*nSWAQNes1i)zc{ zgTraSB$7(6kZ@ZdOp>-|eseKZ12>>8JfBG98)b@*RM@+YlOZxuOtSNqP}^QXuu=#u z|LhaQ(`M_;w}K^bkfddWAB=5vwI(|IE;M6Q6lkyZMz6v$0HtO7{Pto>?OIs;@aF!Zr}u;a*hX+H zHhN_PwVcv%Dx*tDj~_ij7^r}1ch}OnwtIAL#`hDP>O36M)N2&ZbC4~L82Mm>cd+qh zVRSP1#TQ8Wq}>widEnsvrv(3<+~F)zX9{<5F%53bRr`~?n{_YEx9|!Vzi2R9$)R9^ zu+7_g#su$A7#)4bP;=aOm&IPuzJ74+{>3#+!1&kRuwbK5-bzpUsq~mPQ4sCSu7Zc5 zjMBH z*U06&C=7vg_Cfh8u7^%_d)I1$IQa3E@Aq?B3B?_4nO+mGU$~DGA#`e(9$fZQ|CdVr zSs4`&Qh{7r!kjJB+V;2>`vAG}4c>@@_Wokm1@*Myd@PEHKL25u7|dJFRglzQib6;nOE(sn-WK@q;3|11#^+lxlD=o+&R-`y;D(L0|( zYxmeIF_X!&qN2~e%on2{oZCV$@odN0jOA!nrV7xITW`Di;1a%%qUzn>!^6(vTzTsupRLXmZ8?=5Un%(B))n!!&=$Iy)2c8m>7?KNU z>Urnk$t7HsLB2?u0APAa482Plj+)LQe^0;5*qE{uNmZI;E%u)L%4;9z_6_QAoNzzW z?R=7O|9v)C1HszdZT>eFAp01+4=d8n`}j2aJjI#$T6^x<0pwbIamSnhw`Px~%3kH_ ze(%TNtOtf3Fm<2sJ0I~mc|p1xdl9f4rz|>yr^3=Lcg|;%v*A z9Gi%-`P7!&E)Z{dRWXSV;N+eaFX__Z(ys9AD9WDKFI=-1GVHyetC=cnn25Y3?ZwN| zzYHJSK1j`CZmiPRJSwfF+6ri&Xh-@Ws<*-3^qpHi-{xJ4QM)*U7kBzsV~2Mew}y;l zL}uB1WUK1@ymm2@MZ5MM2*DeBhz4RCtNQQxo^v#rL9%w}O+OJOlAp50LWj3}erYep z(V;E3F{wi@H5=|&&I-SD-?h`p94b!DVY9D$+PLgHG0*l}_Q78Xja$0de8cl?&Y`hK z^XHLtOmEviaS)1O(DvVi-KH|U)-H{&*6dT;YBfGl#j)UBDJeA=#yCCiw++8r*p|?Z z*oxyn;P2Sp%0B8bE?JoLS{>Thk4@ciT@&8DR(PiP{|F4BKC&rLx*PI#@0f!&ztFF3w&*DXWKp{TplESNil@d=;9!K3U9xg-cMWl zimtuu;3&S!lzt5I{=NLhIyjrmop1B~``&T1kCJ&!UGaWTq1O0hTe0+C7_*^Vch_ti z4~oHxAktJ3jIFmfg^@d!qnK7|*7t4FWLwT|$x7r8tb1APaEh{y$F5A}()3>G$esK_ zgIUbHL1%y)Z$}CoVFmZZ%z#fim~BLGN+IrD+OsYm5UO9&Jo1R#k}O(9L}Yq#<)j0W zL^JfHPuwepB!liDqN36KdB?i48FF>(xPh=BgF@Ce73Uni(%vxo;x@X_?&tGBndzUcZr zs5;YmGmM%ak$PC5MRas9{}R_r=g^z#IbhbuXf?Gk%v+3nX$34*U{^RYA=0i9+j3s zpfGE(FpcslxPG}_UY474fpF#ejhLcp=-y~S=x705Wp{GVz@p!*W)aH9o(#PzIZ`W6 zf<=&8(y;XhBrz2lPP4ooD=3WV+^;4hm>F;r4p%w~;72^{+6q;2S*K#^_R;bfA<9D{ zch?tvY#L#8#cexeub6or6ti6_xf`(U;Np>`iY`>$X$?{@l;{|^b3Wgfn;cLv(iUmf z@FJR4StPc*7Cdc729RFbF-6vF>q*{2GYDh{?#cd^H*&D#bP9EBU(PAuvbj8>(GSscxhBboqJHix+A!;Zl6juc*nhF!meAu zEf#Q35PuYUBU3uI0`@gWm31>#jS)XLX>{drkpug_#NaZIwtunouvGoLll2iuf2B^Q z8qZUQ-F9k31##0bFTGaG-fy0#)sT$>WuP3fd zA4aAmb7%?HOLP$IYc0yIa53kIlBPB+S$UU6M~-F&PQ2JHw3bH&Sg9Je=2SJNQj-;i zZ))aQR#n{|;(S+DXPJm1wq2Ayw=0!10;}I~*uDd`jMA7B&8#5X%-j$uVz&6e5f2WP zd|PcWlEvuM4{02EwhgtHL+5-=jK}`2;@yKg8b$eLtRBsc>BMfTdwphBINz&B^7F}$ zQZehm;Ud5vjVsxDX4hu(dE9H;Cfd9iK-`l#XDD3^GSHC4D4%_>DbHnpg?ZM|^QI|l zoE+}(>-|H|YhZ(WWhGBLBt~TY)%=0)>{Yue-SeGsa(1uHei(rO_eal)tM&Nr^%a@w z`7NXFpx}2D_kadhSMv?|s^=Su?j|+(tyEx_0cXcy(~F2kse0A*V1V4$nEd>Dw9+LX zQE9K~?d`2KomW)GoMW2DbcIHBeohNupe^$i#cyCMd0;(EXgN;QSjVKO6^QEl8z#g?jj!M3u{EISOwneS}q zC$POh`+kw;wn9HN{9?gX-Zku+)fz=gX&)9*mE~VC*028D51bx)HujNr)M4?wK~6qH zJEs`iuwXnn~{deb)Aac#xiw(e7O_D{wa=qp9_(yGCiW4Cj*xSfF{=S@>Hs)wuX z?6?=B4pRZd9JaNo?dNZI*ms+3~#d9 z;G&$}GL{kjD8+5Zq1hO?y*`IbhpLM9K2~c$m6%-=g3}<*{K~nXrNrF7Yg&eiMVQo= zE<<%9)v~s~*yMa>z0lu=0In(Qj=O!AK^F0gs724#-&;yVGi46eF^(F)Syog1@-M6B zZNM0Ze{YFY)^ljlXrkrLC!RqCb{f{Ghw2LUD$1=x8ltn((^t{`ovfqTHyaxkEzu znt4qf9qqKCeF0SLrnK58&Ty}rHgE)!-#ABY(X_U(-^z?<>4sMdh1-Fiwd;Xa{@QpN zH^1tKv`0=Y>m(;wCQ;Ddhg0hcDS@hLQBLwGkS)z!D>ow`fR*3QexinV_A zUju7a8<{>#UlmZi#R-}1`*wqMKi|2mXUZg$7RaK7^QdPO40p;k47p^G3kKY?;~A}r zXt~s}G^Q!i<$+D2BSqw98+Oj#Ue#*8p&|FFrj(@y*m&1}p2Xm;%+di>rzw1A4afD9 z&5%CIdEpxgIj6bJz7ulRk$={)#_XOgs1AMuobs9R@uXD3j_M8$4*CsI9#IZb;gnE$ zd3ounkpuKb=-anLM~A6QJUpl>Q|Sko-**ai5dqQaLnG8G5>|mc=EeOx0j61&Q5{Q< zDokg@5|ZaftUijv2Q&NY_EKodC}>m`gB6(E9&RTUI96O{M(1XVGnKQbzBkEJh1jwo z29~D@V`BCV*AClkT-LpbV~09^Xw7)_{6J=FNc$9!6ZaadjQl7Uhx@#gWsZU>AH^@( z@LFe-s+apjF?^zL|DiR&A^2u}G3xt_Q<=@iasrb~>3*^89aC?F7sc2lSzdU(qwMIu z%u3ntnKKBLb*ltFNjXQZA0k_u0H$&^ zg^Nzs#aB!`s$Qj?F|W_=Liz)fCH0||kpYYkn2E!9dGjj@p~*W|5hFIJH^1Gr3t!Z% zpip;&e{ZH@81ntnhlhthtbl`ngG+Q=I)incv1AsxHeW8V=zC_Q91RVW>Ilu-IaMxR z6#f0;rz@bD!!U?0j@5v5KKpaPScx4;NZsQxTX^esD=4J_MeZ<}0s>)B7=P7Hdl2YI6ZHAPOq70k zp>UW%>wO%@ln>>Yrq##K+_E%YM;8vTtX?sdZeh%_K9nIUt*3~HSC)W_2;0ibI=Il6 zanU<$dW`355x>rNxyKLt11Q@KkXmv)*a?T3?$QxERI6RjjY}gEW9sQcr6Z5bI`h@- z_I@RYqUS}ZB}2GGhFUgbG)D(F-A#dA!EeXRnRS?VsvAgzb#&g5sMD8RnwcKShvqR6 z_xMT=!PO5V%td=~&qrz!`q$g)d-HS? zJSKtWUGZtPQ*T^#@guv{3ML}#hy^n*uO^-|m)p%QEIUWp1E8{ z**^Kx&00fBTRVr0DFxnO%hX|z`ABMamn>r0Ijf@xxfCW=OOX)WKiT>tx7TNRL9cbR zuWIaFsX)iibbj5h{xbt*55b<2P#13BHXdthv(o--iCBtuak>L zU~HgT?+XGpJVs%i(cP6=S$RhBEst2Bj60GmJAOsTo?elzt^T$V2_ohyGmaW{b6Yf)0XVxn0a_q_tCmd4AG&_A~dKBA{uXU=N@|Mxg0wkCw;MEAe^yKzs zYy*x5UEM01zNtxEVgU!oqr~pux1mE9X}mvxy_(ui^F2ek9ETHiX_B+VsydTqvev`t zcJ$eVMH8W=Ihh@eOe});>0sTL!Y8rA#pP%fW~uh1BBCkxvdb0fR=Q&(wc+$)VMAevJ*x2vjVl&i-##1q4*KTAAXVJl z^x_~snTD)&I#4IOjc)hNB#hy9r+#vei$cuYcyk@T*7}T(-(&g}Se}Vu3ah5z1GCY9 zx(CvtW%ARtW(zfDzc?X^(`HagTHdY6$1Ha+YB5P{1{D``Y{S%pA05c*eS?q&Kcj&2www=sUutP>zA%1=f+A<8O=;mJk%)3z?X6&j_I+xF(O^W@ z@VyKRZv>HD)ni0#IX-rC%o?+KUrH>?Tq#;`28s|$SGyI8YIA{o?Cm=<#R}18(utgw zE0@Rtqk|&V%9!v^E0|>MR){NS9!}1d#pVuNwP0qck-1tMkYw$NfG3iB`QW)f2*i{C zsmb*8G_u|n9D@zGk1*)HU=$1Vi7aBtCOkKtON^pS)5_~fscN~5nag{fQVuzZG2Xln z^|YNowC;N?8h5i6skrv>#QcQF@rUR2xR$xPA*p2*i-GQ6?u5-gFNn0DLhjv5W=jaz zS;sQ*%fe*+_8(0MLno;F6nqznOApLyHswZg*!o`Qj(uhwa1mw-gT=(J(Npi zWKsl0&wp7UY)p>Ci`Ax1n@5;FD5LT)7Q`Br(j%&ni%rr#%OhK66*=c>o1HRC+12Fg z4oR|(J@_+OB_%hd1UTi2t2h+I9;_B_WAD7sE>|8h>Q~$4tjZn56lqs$)IwPFcD=HM zsohf-t8fNHONx!~q1QUQst9U(zmT>OQVw~_2!nEBPwnJ7oAxWsaU!2|BFyQtcD-z&8SIgs#Ne=UP| z6&2#&G7DijU|U%(@B2cLjQXI9Z%?iI#Pfys*3upLXY}DgXV)*^bXf6JIz}z{Gu+s1 z5xqwEdp#$aBMekhyB3+&-pjHP&!cvd5R2wwvchVhxAP! z=^F=sy*sjMbSII?IVme9g1fiXIN|UA1SdN3-lz0!P2Z##lQ^zta9p2hiaahb5}aMf zty^Yx9tA%2dgJgc?(pjC9q=LRKE>q~GFA>*<50f0+{ceU*GBF@;I9k`4K_MKX#PtJ zo+(mr29i14JZb2;wh&N=da$uE_vrp9uNf)fY2+nFo%Ou+aR~T1D`kava6%eHnFYA? zl$HNL;clKpP5$@7RryTrN}AkleUZThjXvi6`$t&6I=K1CH-Q*0oI=u?BL3Mml?0~$ zK^iCD1Q);j01hNSsi^;J>#tD>h+84Vf#g73`5k}jR{`KD;Kfdg)27s$dlXmGHJj!% z0;_m*U(xuu`~KhKZ;7G7$=nGQta}jh(<@ocveE629RZj=obN*iwo)rw1&IL{9IwnGVj+e$$4zmt) z{695BPw(GoNC=f+Y`^;36G?o+x9=Y}O_2yj>iGjPMrh$h~dEyO~W=lfw6ZyvB$7j8p4mVGN>rZ$Md}R#Y`V&-tI<+eH zp8$+_s;B>PFg-k+{-`$LsVLdcnUdH>eNkZ!%Fr;|OEK9qt7tF@E0yT8eHN{9*#iIY zW-2#?MnMv9favxb;~+zkD!#zVVC>NntOQtXMQ z`KR3#)X&?ws#DwN6)(X=|-vmcszL7ASJU z$wlyTJ+jL(x(SnvOCeEw-{ zr-<2SU;lV2U|Yn%*1;U^wxP*YQ^IZ=FpWYv}(& zH}>C=EMaqFQZO)9;LC)ZSpl2Wf1EQm=k!0HXc{Qo^%rQIV#u1l{j;woJc*17G5>?t z_MR8y?>d=EfHOXOV%q;TXZ+vk1^dtcihh(x*5U&K0{?IPlofq;X9zx!Fl!W??u+?C zWtK<4zIEbn!9|3p(+$|g{R*V#Piz?clL_z~r<3GAdq$cK@KhS$u8w>#m%Z7|jESU= z3H+Os!n=C!Z{E6fHcS+|paVVzNFgOoi6=40l@&7BZ~8>JD2-{Lp4yK?$qI(L%)|2?@JMD)f(=88|Olx8lahNv9C- z_aS&Z%HJfdm6U=)?j)}fn9<3WT5Ruwxe2&NizKM~b4*`g=XEYiF2T!@21 zg-G<^11JRZfLJ6!#3vTuqrSi61n+~hJg1Or4cs7yu#Lso1G=){j2lmtgZQ4(8o^#c{wrLXk0X%vrcl*4!)(Fl;YVyf>`4LF%ifMtgQvx7=pr zDq!`A>9aHVdik>5x8LhCgWsO*Qc;NdCT(o64p6xj#6s$EM;8%=g#+AZy*z*einQde zn4*{GQv*cP_q zbJ6dVwaOp2X9~1AxqT1#e2(`10%s6R4UUf&0IsQp;gUInDW{O@8E(sUxclD+ltiz% z>m7?>B1PEf(lK757bV#Aa`VHKGVU80tAXEPq5mr@NlD~28j*rtQPJ;-`ds5CTj=p|%82L< z&%Ie&xX}9A6fSR#+iO{?ER2#L0UAeGb52pIHJm1=tS8|C0FVKdjE;`Z+?~Qbp28j7 z1S3I|NNVWok!Y`1x3g>o4mbAswo7@xc>${Y{3Up1H*5G+&5-Ea-Uh2bSOEM)*Tg=c zuL{E*DY+~U|59j@NqN<(z&nvU+vzt<7mF9l*T{^&+7A7Mh)5>I{ekfS5@A`l@pV6! zwR&p^8AIzNIQc{I{rds$vfyk*1$2rq6$cM5@5Q>JAUuE9LKkP7H5gTwPv@uLAP;i5 zFA9C~=_)+XJ_N1jlx5(#Xf_2{d*|^@eb8RDs_(|B{Dt@w7~B-`(R)vI!e{sJi>IU^ zJ22S+Fmh(Va$a2YEdrF~Uo|((ohM5bGr~%$YzDkMPz6pwfL801J3t-^d38w(v@INt zg*cN{bEjM2SHA?WlHKkE;*gTyz_W$YnorLk0WHu6)&NqmK27WTwMU2wYnnd1CJyFC z%E~T1sPFzt>Pwdhj*%L=rDPNFQ-(nA`KK%<79VlIBFwu2M(LjMav1L=P37nLYuwB( zEcFWV@>|^vL_e!h=M41Tjr*#&CqtqTKq-8H;30SA@b|LZM5aZi@9m_BeOJp$Io zO(iC62`-?tgNG1a=Wxxbg(Ov-`v{a0bnsUj4&;+I@g{5aVt)n4{) z$q=_R66sXk%m*$Oa4q0}7CStoIgj}odH)ICOikE-ya62g8IJ$~XDx$*%&NseXx6`7 z)?Ggc6Xsh9aS-rc_;8I{h`N#o08a~bYWg{AXJU0V$jyaw0B{(S$U%3$b*_E|9NL52 z8O;(~4e~Yo-L?zZpMVM<_&aw0AT^oi@B$W!cXcOI&G-dy820&bzm-ub@Ae4%G?Ep^ zvjnvM;xdoG;MQ#uw<@;=TfXLDevv#3rmSk0GNXBcMrwXcEOcFW3VGN2EnieSq-u;s z1|+~7YxM4=I(tFOg;BYwCdO_LkTepf6h};4(TX>xY zHvDncwf0M`hWt-aQo*Kc0)qvR4Mb(cFt-}ho| z8Tg{Q*O$It6NgvT7>^`|t$0tla2uy)h&dcaxt-_VZ)v~X5g&0hY$q0U^10qQ*r3LC z6Yx*Gqax~9|IJPy zU@n6eU#Y?;*z26!Ct=5vdpe#+AOQw3Xz1A)Ki~?|Xq*)qmYj)9Ui1)M1llyiU^>6e zVe~hDF8a~4KNk?Vh5+J_sx0cgo$q3N7CaR+TQs3cgJ@vM@HG+E!>-3#0w(`$0H>NX zu@w*K@k-p6VSm6wphpCZJLv-Y&nUXPy84{z?I!!i27V|XrC;CNjSuo{TmXphD;889 zuzk~TaA;~hS;;ZxYEWj0GCj|h>I1yZqyJ6TX#YxCFO%V`3s{fG%{h%{O0{x7I@rjL z_7q*5Z`dP)9Svs#PLAG7{*+I7-19F{g;M>$W)Vu`fOeCF3*qShbFu(h6KD<>m>NX- zl$O`2kg;UUS!>||YPocH>u8olVB+V`IY-0IF94lquN52n!zOB2!WZ(4qVy`ldsWK- zaFA>TYGQ`8`A1!Pk6BmiKXdx|_uiYc?L-PE4?-c+fIsd&ai;%{^Aj# z1+z)9m%r5muilW+m=$u|&zP*4uvb=&1{_9?cZw6{c0{;Ry?~{2WtGeu*mDg!#7s5s zU4pQfy_v?%tjgNjVx(h#V-WCObh+5E1tVIq^iz=u@_-`Rx%jX7QBy9m&V*Dr%j#A6 zKyJp=LA~WSR>6+BUYca9lCQjFLp0BO3QOIDXUQ^eiV7e2+3O z`sFOCduytLOFt4~VPWxr1_A03;O8Fzyx!J5*tob%wF(|17JYq-Dk^m6=J?R)O4~u? z@sA9|$>z8j&afQ2YgD;9)JslDSz2GO^~-_l>JAdHbvHPFHu0=&#|-+!QLHHdFar?M z3_uQC3Ekz8Aqbn1Db!;ye9x)!<<@G9(4bAT!8-w~Xtgy!{)Ec18?i3h45GR$jmj0F zPxG`aIGXKrk{=3j8I%FuDF(Bbv#*M+KF3?gQNQ~-5|JQI!`IbgNKR(yoK0mLx99@k z6lH+inW36&Gjs+BJHl!GS*nfU#EfmK322IHCGek z4I^}HDStBh*+>!~-^ewH#8cQ?hiNzY)NDGSr47wQiZUG*(c!<>< zuVRa+l3;v6M^JL{JA;8ir1XeuivfTOeIJnh?kqv-j^&62QzZ<{^1$smHPX_`?xu z_cF4ptwDPPH9I@BmH?#bV;XDadbj0WC}{3j=Wa?wJWl_`+^o+scv6<#b81pP5w)adYUh(s~dQlU--=RrCLLhcS6eRptHxnPfjqFZ9VcYd+PD! z06Z(a*y=v3dUh^GRpMpOs!RK~vOwvle`oJ%ajBl=u=u)C8iYka z@ND^;g7tc_;T|WOQFe)kS%+=hfMWiuHjkQ~w?=TK2H=h?;mvtY+hy+BakJH6oGAut zwV|^#b?`lP?@S5tD!IWoSp5NRc>cntZe;NJr^HpLLjmNef=vwwsP{`Pz^=h8&oY4Y>8B;*sOituDqOe{ zq`)q13Z8{&3O!e+*ylO_A)EDb&dClY8J;Qh&RYV2gZ*|(td(kela;r_?{l#_k2)L5 z89%N)mmL-Zln&3Rq-p*w5go%lq_p$&w4^Iu`w7ZqWHq7fwW>UmJfNb|vFpShRzqK} zPGDz4rktipjS8IVyB+k$z;j_QZvrFdP!U?OFFC`sZa66*xc^FRR!&mPY{#bX>xa;LFuj_C)bq4WP*E)t~@ob1bbr zuntO;;ykfRq9Nm)QByUio#W}YhyjBt4^jBvE`O#@(o?YaPi8AOS86A?4^m{CUDI2- z8n$#%Wxk0a{;v0=J^!(3u9Z@g6IP{Fxv>LGU#L%7(gZ`ani-m3(qKTrS+jGu9Xl<+ z!r`2D#xDuGxIp#U1!uGkR6YYRH9mmzMBp_o8U7EWR;;_BG$#unYH3-+)P1il?;lgS z1IQ6zDFh&mpIp^?0Jy>ehCZhG6d8H&WL24^0XXAGG#a~HRasz(lEs~?L=B6hKN=df zO+q+F?BNW!oauVOZq~=!^Kdgw$0#FR$7sRxZ4;BzcOnk<_D}xAU)$A7{?+QHyf5M$ zxY3YBf7}qJ3<*5p5gr^#n_|0ji_cL#lciM?v7aW!qb?sfL(*}e!iHmU4U{SQp+ zQ`&<7&PfR_Q|okyL$ux%9)@+k91UccDQd|DiEz~0o4Di+yqnGs zps_3Cxs9_Syx#v!xVyLaYW;PbUZ@mW4uDBeZG!qhnidu5h%N%3q1c66_h7i5FvTnV4~jz(BuJ!Dqw%D!g#W8#N?WZ`Jg8v_& zC9+M^Qy3cXFgwPmG_j_mGMX14yo#zNzD!{M_js0&Z&RMoLDK)3&gz_ZlkB0sp%oC& z6gZx^_BDI9xw&{^OIt}PN;ONk;!38hXx<&mn8Ps@PC$X;E%qv@yr#OPvYRZSIbD9G z1sMW{HVL56;2K@r!2*4EPY=kY!O+midwUH86mWWVOK)Tx*J$yvRqHG0PGlsoH)5=- z`}f449Cx)=J9aIDE^D%U_jifK-$2I#=3-S;ly*rIzzH3rkyH zpLvH%8R9P00jX|o(uTZ3SoYU+78mYWE$58)K-v3>HNOB<-;Oxm;U2(qasyN46x^@D z+k12ki?@F3+3_;`?Hp#1729}80n$Z@Nn_|d=bboQFJ z*c~Iec$poV)KAI`>^TA3@=Q^0P3Lmw>K^^1``J0O--J_#zNqZ{OWQn3Q2?AouJu5Y zh4iKsB*Xfx;vX-kxwC*+QoWWhFx!r1G?mif+u8@)&7WeTw19yb@H4JqZ8lV2>ioNG zz$!6=-EoIOn)~!J>btFrLAh?~5R1Vxo5l>TE1P6Xi=dG|kwakTV@;yc1q$mI?(V5) zNW8p=#c?F$k6HFS1-7gnN>_^Z(4Oy>D?><$ZK!|UGn*)5ml{`TyqdY(l!rABCaNgt z{*8qK--Hh=5nsfv(+GEUvjcMr&;qWiT_mNX3>-B!vucr;Ec~iXA^>>%FwLv{ z+3{X$*Xsjn%vrTE`&WNSaLY6i;58-A5aj(=t^^vOr{LtY^RtXZXwuK7w_CRPkCEuL zYbT!+l$FmNSXLfymE`-yVDApy{1dgi_QK2HqOuHon6e}>muur&n?^=u2Cj2J&*r}& zU683UFay_Y*O75*IQ{*iR`#IOVqdk|-*sd?N*$o_a8Bn%m(kA_buwT6CY_(KA3j;x zaUQm-XI|MUH(6DRtn%?xyL!Al>^Njd=sZX{%v&V7_M)vy;ZN-_g6pzy$L7bghgZ7# zWXZDu10h#2+E@VYiFGl0#gm8?ejrDcy_4&VbVu>hpMpuBD;u2nf;RWZwjH@I6`L2$e|0r`7DcOqmBKQqrMQ9Aa^wTZa^iaUI0 zes)NNi4lM*6l)EEFo%*cwim74zvSc*$v}M7{+%x*mWp|_1x=nrvdQ7{;xMq`~5LHS4{^w z$flxClV%>A78F%m{es=3dCs%$jIq2jBad9xV9Z(f_D55IF7sQRNIy?ff{u%c-(dz# zb*mNe+WNn@l^^Sk+XH$i@VAGrBkYQb632NTgXa82;$i)J(`B*M)vA2j;!lF%+KDg) z>)72rzDILgib*EkQ*_}zLi}t{SWKrzHgUHPOu!+u+sLj%^yau<{k7}nN zZ0XKbidvn|qpS@}G|pw=~DsaDMt1>iFGok!x2t+V|Yp;C3Fr24wxDy$vv+6gLOl~6+Y?cHZk0>1wSyk5$Xx&s^1 zA$hQU$fXqGESxJ5JsuzsV!#1ZM~W=`bAoy)z!dVn)%}-{*FpDkV!xAadW}l_xwrN*BOp>=;i=2?FYSwMK+7-pt3;Jr<}8p-?OLj>c40}`}@70Y<7%W zYo@W*OR9Gv2yMo?0+_hsEe^QQ<34~07s(PB|5)dOovl%a;n2C{o{z1Iii(&olbWQJ z1gDGqj>!~_8WhKdx~aT^&aErQn{H{=d6DKiNoJZ|tz^X? z*!;wYv0roS(*v_yPEmm7tm=9FD2n1H5C;QdHETZ2Q$8K}3B4Jjo&j$!(HX@Keu%G2 zaMTx7?d&giEJr?dOkWcllnlA%oA)Qrnz{x(%#5fOl8nX9;ARhEunMfPtu9rk&hUtI9(aa;F zUPscRX8gC1t7sjMMBr%31X5w=TzHgJrs1+>kwodN<^QtUD!Dq!k-yw2#zQkd1F5;R z^E;`S8b}|31(&IKJn*7zNai{=p7pD73Q#7JcgAu8dmQJuYN!Iyo4B*tnyoH7@l zT#{9rz=L#wuUrac15Ks!x24Wa${AvS_0RU>dCT`8iRlu2RR(gmoldRtCPY-8L$%Pr zdUT}U9}8Oov*N9UX4)tKnjRM6t36q!C~avmzISv8q_5+CUu23+O;69SUxpLYO@4pZ zi=Wr{=GS`iRLSE)#Se@u>0^9n!Y!=_F`i6(%)^76{p*Ptsw4AmRf_RgnfTa-;NnRo z`K>a8NC&^8ua~|@s@=h&vX=7M6#W}l1NMb}U431#jb4mgo2cQ@=EzKGQc_8A@s{8n z{6{TXzl9+;!t{Qx;?_%`c`ah6O*X)s7Q8U7?encAG1W9C3m#9M~VGv2D%E!x5C z^c7ksP+)~Dy(gLq;okxWVEYICELRKt3k4wU@eAhikg~3}wg?zBy=u=_39pSN!I7Wb zn1+#=B&?~A8;w~~mE#B36RpN?XI7+WS$h4r_%M7q{7~hz=cz!;CG_}w?8^kWkb{Sf zEq>_F1LLc3&{_nb_R-bV^O6x=8?A|8Suy5PBOMlE9)6<6G|ZN&Y-3p_wDeO z&YeP!1@^|mw6K%o+mPdY^O@oeEhImeJ?=~8vmEDg-{rH@q<00CG zEL_vnrCA%IP!%K~fBZXo4AgY;F?8BYXl8pf9bdqwYb(x4@am2OsJai(yVONpItg#> zX5!sRR@UPI&;}7Yw zkFziRfc_KKMwRt1J%k*kaGHw{UVA;uBmbPlHlBzUCqtM$wf*x~UUk}&h6%ojp()e1 z^Zs}l6I-AzAOtsWPsNL4eyIYNoJq#P%iK4LsYw{P6O>8pT|5*WWQMPDM}fZ`IQ+q! z%)%G4aIfu2Q0jcXF33ZX3*_N_K7%|yceGEi_`#w=>!{W7WdeNw89{^FXs4+PtW-XM zljocu{SQ(f{|&w0x4-J|f=#0#XRC9|g_0VK@7KI>79kBwY*twu>&R%KPPjHUnI%Rd zwG0GezCr5tc;!A9786Q}WO?+KMOB<*Ugb}Va-#Zn)3y`m4fE@D)wYV~m9*9&hH&v@ z)(k-nOT*#GFey6C&e&jTZ;N=AnA(2cfmi?hMbSQzj8VCBC9gRh0mg761mAR%t>V1` z#$K2Q8%5i7Mc7-!ZS-wKv{`Tx&B80ymoCh(#gI=$-&-z+bW7* zln1nBspXwJTs)7Fguva?hG{dO4C+U@9@E_U8;*aNBw}GJ2pSe_kkglEKZ>qIIN}t> zvNokAdT|rEd_#`lq-``j3iQ~gQ@GZNz?eO3%x?5svIHd(-YLTgQ< z&M=Q8F2}f#mv+fMQUS8>sVNw5d}{DD_+TU+d@x3F@suN)74H!!%{TNz346Bg%Ya&= ze^5*qQyrb9QvWfR@UgLx+f#2$rOkdV-~Ig<$ivhAJ!fq{=5iYty1v7W3<*3R?_TYibid|nWukg@ZoF~*C5m1dPAq_Xoq~BwwndSy@qfKCxmx9&mW^_hnCGG+Qnu< zOmK17S#M?a!b4r#YNaW;QC|5NKF;8|iGafr z&{ZztRue1Dt2+gO(!1F2`|EV2!%Tuc(gs(FR-T{D20LZXV%Qb@6`>cW!}D8vwMq*fLbeuD{Dc_rxVV$-d!ntSuIU?|qad zs(&$t4jfYVb0&0!g~}D&484#)+zS?NBbEaJTQwjE70Dc5i_3&LV0(E~qLpT-@+`w` z|51(S*CRgHZsKNbxWFGXmQX(pep0CP?(80$(|m%TRMPIzW#1r7PsbOymE_XD2t6w9 zLgsWti_CZ{M^~SWw*hGo0!s)6ayth|zT1;>Q{yl8+#k1$U#iSZCLYVIkR$2>8%>r? z)N|7~rV$6lcg>VxRFi&TzmQ4UOZjWI^fQT@EoLd=W-WWBx&qOmZh;~CzrPy~9dvu? zMPz3Zvcqt`XB%Y86VS$S4)UzcMikS?c|8=MU&$VTWL|1hjx}dFefC)_Em2xV1s{}! z9$uHIOuQXj@DN~8yr!i5-%TqQk3wBfF5LQnUL+SN9MZIX3Y<67!qasJZ`eII8X7Teu<7B-!v}kpZ_9&JSapsm-qX#v$r9ef-3ugmL{oj`1^O%A z3Rsm~bxvV&W>Y4_t#sXZvM;)80z#G_j4)W%uAAn%5*>TmK$Vh=&JVSKc`;Q<=)=+R zRJz1?*;{Zq3W1ha0n5F+hEjTG8t7ez2&W@Bp82*8zPlqzup*R6FNgRHZJw0E%2)^X7B}U#jv|7Dp7#m)Ti;pcJgR z=)GaJU?5Cl66Uy}El!>?q}HY}5-`K(x6#us^>HCkq8EBM>?J?fo#4ATi_DHsO)+-8M-0_+EUK58wULYBl?e0V(T7>J0lPQ(#Q+1E8M?r#$6w#`m8yrLDrV~I)D2oYm%InX5nnh1YLC)fCeV51u(Bhc z?z7|Gz{`uO=d_X4l<25yvqtsF;jFK6U8EdNgAFT!xJ-kaXQZk`3V-U^A`2}U^khZ;af8ujNllWWT= z$BmlwaVxM;#e_5_0cPg+d-!zOU|3oBB*Hce_w6)P6@zU4fH`^7CPeV5kzF5BaP~!%ZMBcpEOnFE4PlcOi?2z-UZRmL%~GqGH)I zz|YidHQ+RMHeIp>(u}K^UT(v-rvxB2cj@8l{(+}(^d9(oAo6Na5KUf19>LlQR8#Z8 zn0Yam64!B4G%{2*{BXAD-sweY!%Xn!8TI_u5qyDB%#h@{oW@N_4o~i}ZmcAcLcx?C z44Ir0YUGOCZ(Z8h9%sX%s+NPb5)zWOF=9OPj^$HA$fSbD95C)Zjn)~3P0VLiuud;x z1SbKVS+1h)(-Sp0h=ZsH1{GZ@aBfZB8k;RO2d$+9QuQ6+d-FTpW z!`!;^7Ce%RVtV#g{e364&lcZEnb@A6ZL~wm9t)Bx{1e^7t@2ufFbDO@@Uv4&jHh6^?nxg{XkTZo3 zaL#NjLEVpWuaVtE-rp-5u;)TXh9cwR193*?Athp;>nqv@;vg;?}i3O{sdX_+hshmi>sI+$AWp6zz~#f-(WHp0kD_N8-Rq-qY^?GlH}UFQc= z{H^LmpGdAlD~b8Bvwf*X+*KQPtBX!qkfsdmqRs0ryJf7q{dS(RnbQO zTTL!BjBD7<#U;J3J;lDllHeKM)|Akj3gkb#jxyW}){XmyLq>Q^H!N>TMW^<>x1Z4V z%aX7jLCk%CCBqb?U=PP=hTgx;Vc&RA!hfl4DuS85vA)Ia+vuCXD0E?F&UAsQr>ZZa zg>BWzj}_IHN89}a*|Xx2{m#ao5h3U}_N&Apxc;pKih9JNm!M>kM9Xo!IpAhCv6#;D ze|$bv#Zn3KDV^)91sl_6o142oML78`_c}bl8BGy?aLy-;IuDfCqwXFV44HXX_kH*M zJNB%!CS0bgkJpDWp7-;Pp&VY2pDT;Tm%-;;_r519r$6#s6tMkHaMKqZ5OYgm2e#_RU2MAtej{j>KXpb=HM}oluuUCZ5^i+zq<22MJ6KMzC|?Tp*=_=BI$@})X>T9g z5<6XLVjt}eJ%%=>#-s&yi8YLSWmJp8Uj5>i67|mHTx=Aynha9vI(>LzA9k(+mhZvaedTHqXD4MA^959W18gX_u+C89qvW&Y;WZQt zQfinDp;RBZ#F;;y9PE>I<9(pdL!hE@iY1IkGeL1-_Z59IF1=Pw&vlbJrsOE%L)(%5 zLbD@Bnw7JeZiIw{FY44(f^{R%d?|vjgan>ciSD;TBYb|MR7eYlgsk;PqZl@_-QukV zrn`1OcFHl5GTGgeufQAhh5V-5VIY>GE!~fM__=81WAhJmm>8EJH|?XG z3ZphA*q}@0hBB|D@A(jhjO~`d9?F$FzKk6C)4*IMI6Im7?svi4wV9T@cYp%X=<|t( zzLa}sE)8B(?b49NX@>x*d;M?RA9mU5y{~`4;?1Yum6}-%9_Tjw56Af4#X^hD){10b&ux_eE1b_$B=3-E!w!{0EV=w0*Z-*( zkS{)hwLq+D8?qIQf4x#S|KTxZBqT{DJlFT?aBtP0J0`dSzcf05Z1_YB5h3PtGI!h` zjQb$%pDht|IJrDze_Jk{(K>)8ZT9_9qgKmZ`X>xqo8@Hb1YQq`W%%Ct4xc&-L30FK zWyo|)XY)y&p7#vK!Sj_rPF)CFPOu5ah3qbEHE=qW$R^ESkfy2DbwJpt5feJ!P!a^a ziM-3sk<%r&<-<=wz3i2B563*qjW1D}*6^nhAteqmhDV*m%fU2qMxKS`K8ruYCMoY{ z*;3!&pUZHe9unC!Hkk*i%fQBLY*gwK6r|q$g8wKO{9U7}s39Ubo|l>Ru-Z%|&jWJr z3-}}_O+#qCj5tW6eM3YLiYgJ6t^13PdX# zC-f0d4jXG=F^e%@27dSggDZ}s#hdlr*)K$Wl=XH`ur!I_c<+%ZJJyg`mqdt_Hbqkl z40DUXoej6`Ur-Xc?~H!8-Co{u4NYJO!lwHtBwWrHGIK%Ox6-Ho`MepZj_yb+?kYf9 zeYU}4MX8Uty?JxmY_Tak5wVeU?Df3tE5vDVn(;c4P;)&B?htpYk(&M#N!ko?6dE7N zKTU&9_X>V;5KU$GiO~oTkT$&;{m=Cce-Gyd<$BFg-w{ok-SFh4N9BbkF2PNAA@k1V z#vwwQK(u|t-E2TZ!)WQl&J+Q$LHcg0_ePa*t!FgXX0-@L))qHiV&3^ zcwn8pf|D2Djy+5>5u-0Vjw<7w#y9;o*P{KF(8FG2^v7#gqmb{e;Jr#*C$)n-d)1wo zuWp+_Ut-5cx0lyOH>f)Zi2P;(IF#_-bX4zD=^o{HuB1Kb9`!ZJ5sicG6!+s*IdX-+ z6X5e(qPRmTCg0p@uRIjoWn)w!X}Nhy-&bI@-FzkX!e_gkvTPI}ILb;Iv)v(mPQ;l!}6xFYY~?XYFZ3o+b9^YYPV=$rT@ z#s@AQr^~8rcj|>?uBO@c7@^X~4^EQxx(`v&B*B>(=ASsC>z|}<>lZE_!%mB@Ph&li z8)x~!6!jO#f;Ht;o({d3OIF*6ZErqN))f)fv@K7BK5|u-n|*2H`BLdKY^u^xN|b%W zZNOyM3@+)e7+EXZPDi)#9VX<}o7xeCDQ&4)|7=*&((4F0bGw?k^blP9g$ul{D?NH& za6*IGa7eyw;dj&b%7WZmXVA+8rBw+1j zMw~MPb$q(%UvrM#3Wm-EMR@lmJy`{#xba`_)~plOwMlNm8$g1p(e4F2{o1`IuWp#z zkbNn0{u<5c69cNy6(P+*p==k{UXS(M0rn?5k#Ak@U@Q% zL7UK~)NB%Iq8bmp^a;M_9v^@Rqmzvr)4=wLvnJ#Ly^}|Vxp_bW8MDM!;Vv*0$3n%+ z?*h4M##VFw}u(t-k0a1vH=$2GB)_qKQ3yY9Swbo<{|T?d$K z7l78Sw4nio1=D;{q2~jk!NM=^-~6AKTYDwh@J|}trBwFOzN^_xZ9-tTYxZSkRd49) z12r?Gx8DEf!}s3@D_5xszj7!1%0**Cnk|RQ42!Q;5$rj8Sd}*YmJ*p zt^Z1>JU#MEjo|p(m_JR@{$%lI*I}jo;av|takhApm&*UN1!$Msmj|pF2bh;Pe~HL^ zI=%PbU3shiY+d-*o6V!Ic>nQvz|1An?HWE)T!gj?*?+gx_;kB6bT!*d_(#}{^{EF^ nK_}1Evc!wkD}hfOQ{sTS%?kJN{JzXzg_=RKsxlR?Ucdcc3#v03 diff --git a/zh/userguide/images/ide-5.png b/zh/userguide/images/ide-5.png index c482ce05884df5323edd2fc98aeaaa46bbe1278f..33aa6bd1c2d2f3f3ef7fc721c9476bb3e84770bc 100755 GIT binary patch literal 152300 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≀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 z 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%0A&Z2ON{2JT`^NPLEYkDiX#jTSiFQpoQp5 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 literal 0 HcmV?d00001 diff --git a/zh/userguide/images/ide.png b/zh/userguide/images/ide.png index f7d8399b60e094a54920f33781a9099bf0b444ae..84955b682ff8a67246ff1facb94f23f6e9bd41cb 100755 GIT binary patch literal 449341 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

    &%N! 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

    N-ox~%E^RMlL08uf%QIi z)Yq4q6D_JfVL*W$bez?2f5z9Lya(eFOD)>KjXkG5$1;nO010Q|Iy_w;0$qSH1m!Z5B;tc6S_tmX zFLWOHr`+&X0@qGocnAn( zN%su;?f6`C=TywkZski81&IaS+&Jh{5kgCb0+Juz*K(`sLE-)B=fb69`Q?#}EWisF zI{dI+q$!-ltC19xCKu9o=pH%kl=gey-9P=lyk}c{55APpZRcmBYm8AV zOj7LFh76%bNQlA0`E8eyua8RW^$MQi|1+ULvx*2T#4s);Wx4We;2(t_UbY*BriIyI zw3?Bsq08?_ZVf+URmoo3WNcQxPC&N;?)h^L)+TUPR#|wJZDlHawgCLYP zWohD6-!Hv?0?lR=6^a=~DZe;G*VeB$#_abO7Sb~q&I{1Qm92pP3J1n(An+}x@S>oOHauw<@ex>Y0~=A! zKMnfBh7Q(Cee=(`k&sug5qLGt!pe>U9e!?ODOee0MEa)&1W`xL-rcj}vB%AbC%oXC z3iCXRW4lhE4;PoYWmF1m_#H{-y~RZhB(G9rWR?cM>Q9XpkF&gdKEr{A>Pqc}jQrp`9 zxp_k{Dfck#e2J*LEIrkL^J4h~u6TcYFFFS=4|K1*xp6)Ic%jQ7-#ZuJ>wun}$O7xE zSL*UCIuyB>N3hC)?swAw%7z9rHo3vWo4DVu5{=MEvq({OG2$OqOIkh(ynYGI^)kAd zK>lx5GdDVOX!C2KK8E_Cd_40)GhiXz`tqeLn3LRV`zht)`gfkXOrG7o4Mo(t1)`%I ztmM8~dlu#{M&+TBEpD)>%Pd#u>dbIPOnzPhh{cpwwz`1$?N)zK9sA{$gUUb;WLMYZEe`K zfJn+Iyl+&-Q^|Ol*XR!1O4;%u#a@NO&qzlnki;uXVpQl6e*gsVd1Vx3)Ku`#TwHvw zlRHC*p_bOxh2_;4x`5;5!8|HX9r<;7%8&{J(L*Yi({0gn7ay%+d0J4vqIlM^U`DjS)`z|ZzMs}s z(qC5>So`x01&c(*n!JOJ0tOEvOx3m0i`6`!$#GR?<;du177m>5c?)tBr^%No%UA4jEMH6xu|2}*wx+k_aO!fCM$ zWnUY@dugInz6lzIcvbXOlyJeFnl;^tV(X&psq|S=n-m8EO^rejg>|z(Gc*23u3HNx zlOtIq7|1WDDv7WXPp#GRm$xP!z?l+W3=dLAZ_?1Oz059OU^<;Q8{Od zp;kPPlfQhKTp$R#DYt-iF!o6Jglw3SjiL{ZS_(8?bzIy^#YSJaN(*$EriOg1@L20~ zdmZ~d=)TXa5o_VKA4XeT{!o{szAw zEz4NDZ9EZGRZ$tnykh?}tVTWbqIvwS9(9Z=<}CYY!oq65$DBHkX3i_1Lhue>5gjU2 zSqy-rGS#=^^hJe)j1Ot*Tr_ss&&>ii{!}~?!E6npq&|UmF7Jm?-KJ-T5Xg$Ly!hU6 zhixPlJc@WNw^dYdZd|N9@7F!#gCj4AX=!QMY%KT1|H-JoSXCQor0LlF<)hz^7+lV! z6J1deh0g~MS{dP}<>eP)*+bW{L}j86#vNE->K$0A=eAM5*l=kE3(JB6g*pO-vO=WY zBq^&rj}~17MI1XF?uRaoAJvsV!CVLGg}*LZ9sb}p2DJVDG32{kc-Uej-YZe)8p?q-?nklwpIO@*vz+lDSg*DuY%DRl9$dB-qg!k>cm*qe@3H^H3d9A{Nr59;)sm7EewoT z)W!g%c)4X8+eDb1*Mw_pDsi1Upl^+Zr-D$TBu;=u`={X}xVeh!*U?#3M6!If=5)_q z@)U&Q=kAYJZhB(7tsjl%9*)Iw=nyQX{B3Ke9g$EwRW4t%CQ2-gPOgRgWHDj^p#m&; zts)}Bf+)eTu5Q5Th9@}rSPHvN8-dDt8s%ue!JbPDpml^HIcA|2xw{R(YyDakT~<{{ zL`bz7jGZ$ZIZGZU#HfIipl#hwhfqN$+Ez81q1y;5v)WW!$hxvgjMVySe#apXm+wI7 z>U*)8`<#Q7^1Hj?bJtPk^z%S5kU7OnYJC)V_#tJo$LW4W{QUfEVq!AXV_sFN z|3aS8Zg(DBS5rtsU52~{K@k6lFAplnY)o{$dg4-=G0Ej9*urog^C*S<>Slh{TUcSvnzDCFv>{h^N02eAIR6QxJ;xLJVb@)$)vPevR2w-YX+ z=Gbpms6ZCl*k=7RHhq}D5=&4Q4G^?Omaq`?$FuHzXkPzy9kzw_r_y*6!0y9yiIg?H zpIEmhU`Nm^nU025`D(RJqDpf1757=Z*@_xPm+MOJh4ATOt0C`@SAiE`+^;Nq=V0(z3lAxzP zX*S3Gxp9@DWQ#he?`OrNG3-nk+08buy@aupcADicMztSELrbd7Fx%BXyJ}ABrB+$x zMA#YXI4(}Az1A6%G_Q4d?(sa_Oi5W?}s7JU7)$`^U&JXPWE13M01$(P{0Gx-z*K36a2 zQ&~0ruD{p&D#ME-(PR%X9v6L~UrE@*2W>9kw-@F%TEyU)|{*-N}D*+I3{1Z`In&atp{z$(dDwPPHx)C%%HT`qc_yg7RQ_KQ!ri_1(8oSrp~);FToT+5KL%YrL&R+o66 z5u_pNojr&@?F<>TcO!dL$q9dp^FOjzajgfxsxT z1;G;WC7o7zp{fBP9xMfi-FU*06Tj?2(lXGX4lQ*8gdK#xDq2;m=0CdPTW|OrSF$mF zE=StvWt1}^kgoNy`Gb!TS88xSl@p%zgU@WHw_Lb*`2}6<(}J40dVMOWf;{XatwKFi zRBU%UrOF$-_Q$;$)Lpi`dGEx~-MtRzzv8P5_ZH!C*EAt4b{w!vPeQ%|Q#g+eX!G#@ zaPjdG5M!dpPV#I=={V2%*nH^hzMS7OiJqKUI|iZ>hO!*{{2Cu`84B1!mY}_|z2EYj zDSn^@z;Dw;1OQIY+hf!CidD1V9sw)nBp3Ce{wAJ}!8z`nRs9pnN0t%!e}{7D+o-@U zY-_IagoV9{aEPEbeQb}$FP?m3-@C7;zdLAL>xxWSTdT%pU*6ed+#Ef$kb8Ygg6{jj z%E|xGx7jFL<&LklKj8zX{maQo5+c2LH!!!QCp}vlVVKTv@*v;>fGqIJ3M*+{4B?4< zYaq&kHcD=%-f(ZxGDi1`R#a~;s8t1~dUGD$WiI#GygoImzP6VEjj7}$b)tCZwj@42 z{!@vRd23Am=~0Kgn>q*ml)qt`qocXp!t9wbn7G1mu*#o?M)Lv`HB6JQoxPOG!0`td z#-$wD1C=Tv6tB;1>Md1L>!M|ji3JoUirS;|h>ukZ?<~@=Q>X(K$%b+z7I{WaP9LuI zIn<0%M?ryq5W7n|^jFBe5{Aa}_?MWCUqu$0B-h$23w2Xs)j2 zQPn4i$SX^zdNHS-lZ%}BThR=z;UYGgdyj6|3%881+2$%BdIMQ{Fse(}lliW)FOJh~ zFeV0yb4o#qX>nrur*;$b)cP@80(w; z&~Vyz*+31S(5;Sx6lTVHwLwF3?Cyp8cq#ux#IH~GsN<8irkeQdQk?L^Bj11<=!$+l zN~fm;KX+$(9 zVpkEnf4dLlvbo@#X1F}_>}kl0X_4D|UYF+}2$3>V!#+qt@XWPZr}cA%p7>;O@L>A- z4S$yq?(ZtjvV%^zwnfp&`W1Dl;(w{4IU_Og6e1bNaDDAbW6i|GX*Kh7pF)9gX>ksP0uOH&fGK2YwI(dK{hi%t(5ZoQkACk_diV2Fc*JiiY zCp>RmBdBz3$AD!iD3%9BS;v^W(O7zv3GiOG2kIMoUI*YM3A-0OZ*mnHdd$4F0g}65 zQ-aJr=Lf21AS=5+hG=~BFj}txB%+xrq?*gKzkH43`&m^H4@X$-7jEWST3o#2SjL$h z|FcCkWQdTnwGlc&hhF_Gs|9+D)@};bts7*@lev}9$(KHqM&lD>z7pK`+0jtInBWezduQX)dXcZOi>w*pN`Gd40&QU(pN&cy@#u#nBS_ZB6|IMTFszQ zQXtYyFj*ZAgFBxy*ni=4Sz!U_R;P?4kYj7JCNra{+d8=XBdRpxMx?u@ZK=JBvTFvhn! z?*kjqeOoej1^(Dfv@ryX=_TE<4Ocgd?HVy=g^Z|;GrdRh#eY3DS z-HFzW*KM8G==Mf0U?)g3oepTN@freL-zVIc`=1Wl8?~PH-v(uG-S(7(P>Pk5;%Cq< z&Fg7u-a@40mH1kxxdz=8GtjIYhZaU~LyLWwTz;nBM=KR;8qIHFds!Gn<~8F5J~1SKSqrcAjjy zKiD)?t>5x&*!uLNM3!%Iw4hjnbhP~^sE3_0PAeMOq0~+a&Rau%u)<{JPF9vYZ-q3V zKi>N~TK1(gJ>I!0B7IdTt0R6b-&;i*~!Hb zCS9IPP3`wVv`5$X)36-0`13Sh2i}SM5DmBtMaJyMO}YcOSDjH_H%}HEriPpeN>-+C zoe;U0?Ru{E414CW> zL7^$GeeG0%Z(N6jD@&&J>6}%4>7;BY39q>5XEBzhOiL)skH}hP}jfnlRj9RFjB34k(LG)tP_6s%3hVoR2Wy2C2$x9n^tRr;KF=1vMR5KmHL@_i zv;e_sLw|r5%G(qocOyaY`{KE?z1tdIV66}wx7L2_a9$>+ZvW4ZoMxz}&|KBgNdv+U zGNJ!MFyX9%uUC9W^A6l3#=GiVy}vy+pAIiAk*rMQo_L9JUR{2>`h>HonrpP9h5A=c zp@l)dJDeBMvsdLz-iXZQW#>B?9Kyb9 z-tfzey4>6WA>iJiHJnx{QdaaMmik)SJYMr+$&1gE;>DpD>)W6X}(HouQ3s|M<3Q=LDJ&o{M|@frF^k=EwK#xQF1RwQ9W$M0d;DI6-$NGLkll5^xF zPocODZ7oxvQ@w4sC*=HW%b(9M@gvIa55QSM=fJvcZe1t@mVr*mVH1A~+i(4K@+%J= zqAq5dw7caHdkr>lgiJO4&&12c&FwaeFAxE~ z`5^esT9$x_!77w5o|1Mz;^s+Rj!s<;>1tO?{|7-fEiQ1Rzq|PC_>$sZngeo_U%x!@ zYa$Cw_j062G#xbMSw6pSsGUej)>(a_8X((_fc$6|&CV0(PgXTVJCR$JA85YG|1o9s>!pb#0eWW-n9!NBy5tgGg2_rOx{+ z(XWyR_pK647rTM$em-o~bU0_+3DX@Anl`n7f&=lG5h))qRzHs6xUW3#8kHQ_nu|lv zds=B3XhVl51Ers)gd*w_R@l_+2&aov7aixsiD)|emb4*S1sB&jM~Le{E`?UKRbKwb`KI4 zn(gO=^TBFg-}^}wLeL18bN21eW7>5TB}^*PqX_6TyF=iwMteKY35^E~x_bZ|d|z8K zPvl`(Fl~0(dvQL76;nr*Re{e(NqFx1H2>xT$g9~oG#YqA5WJ4myUx~_{@2%q?QyKQ zpg|s}sIeue@*pm#Zg9Oix&th1$Qd-Dw-ZZ)9@cq{ z%q78N%^x)4?z`OTZ771e{!$GwzS$w)XRDND{h3~M#if#>2phf&A41xiF5 znaHI~HFX4jjx>c<4H|Cake_|JdKi#C%D6GzzihEM@=O-`>74JLjL9hqL~%fu%X=>E zAmUmYu7w5lxO3xVBOlyv_G>cfJuHa`*-`d@3SpC>N!%f?gGRX9XVCqvdCvQo$n@-S zvC(3ZDI&EjJ8H_m#?wB*#vbYqmF5KtC83#(0pymi8RUf9%L4YV(N{IgyQS zw8^i4!#wVc>&#cAwa5J=FP!>NP6VwM{90R2 zUGmMzU6HB$uGov)@UW`v>9px^PCvrx<*LR=q`#Tn`!5pu@g+yJ)!0U}%fmx;RZwKC zLarC!8xR!nkT5=S~mI?J0}@;#930D-47DSyo+dS{ zH-s?t-G3tBgI1hzgJM_gxrEA%v=;VZ7(It>Y&URaCnSn}dOD&CaDHrbaR#BIowN&X zfji>NM(2IEt0i3-dM&MeWA?Aq8T7dn{+kQ4LGfhQE{|+D4W%~?2VEz|&*kc^gLF9< zG6uKmy=W|O+1%EsVt^lEDK6P^kl$tl-VLVOxtV7phZaF@{6$V-8>`mCydL~ zYljyhe%E8Ongx{(aNkYu+OXWvfpz5+Zx8F%L&vFIZuYLd%Rz(a|JvB0+3zKCnP$Hc zC-__^STwAyX?Cud#^JNT-_pq}E%_K1H$YxYWp3@6uH{oi;0}M;3>i-L8u3g@g&xyXrl8{VH)Mnc4q$W>Ll@aqrxDbje9)|0iN78uZT>Nkpl? zpNRfv-#@=Pgd_34^7}t~rm4RCH}BvdBkCv~-`D!zOaFTsED`^!;r{buSxR58{(F{x z_v}WI`rA9gTY?C1W}CgZ+fA#kt@lNT+?%f@pDATIL+r|Xr_W+u?HwmJh|*_E*sV{n ztx}qW_cVyS8Lhs0`*}v}F$u;PMtk3mOaJzgKQapbJlfAv6?3WMk=A(7f&QP1bqsMp zbb*n#u1KAHD^E(+=__N}y8`eI7*{S2w~qCs&@gl+O`=CKQu_|(s`v68>GG}qrd=60 z3sm+f1CJ=ZJYY$>sh+CIzfcn}`3q!81`2B-fhJd1 zL&V`$W7&iI`TRIntdT_J8#!hye(^hb6BUjGZ7svT;i?bz>9(w`qaFWV4Q`^c`68&l?W$Vn>2D(2x(^flshXjUd zt}y&a!a@vQZdkXkk3Oup*S3FxUETm5bIwX`j%5vL`Zf2;1b_>R!`1)cWWslzmSJ8T z=y%^e960^fw@aCAyvRI#8R)Fd(-y+caytyW8c1>hnaLWBH6c3h-`itrY59hTav2P5 zcYDzOT@msuAV5iogT>6u_o=+^+4u)40+;bDk&+vK_p*ffaSc~Au6 zKGSUh#BA^3U_D`2+%2A?_VlN5q)h*uNL2~=%OI*GT|Gx6ptTBu8k%Afp>?s%av7ZDkIDiItj7&R=Od!GvjZG$UIpq9`jo!9DhuZl;2fRJvR+bAhKtKvbj6 zET46c_z{ke>_Jp8#1Xm5{fH=8!jDJEO?%b;rLly_iT2xu&nWz=LtfB7GY@8_4LoXX z;T?byG?G9?Y~Z7{`cxPsyZA7oDm$hM0C5!p{Fp;F`7hgN&NnCgle zOd0molBFrckqqk-*^%2Y48N5K5gJ@?>W973fSeJRygQ}rHVFbJjBffmLZN(;(fwJ^ zUhS*7gABQNgCnlkOgqG&BglVc5t4@9L5UlWf`WL3nKDx&u}?fvzk1qzJy~3MDC-KQ zmPex~?9%lm__tNi3I>@d3eA$74>>6()MZV@Slpd6p4USkZZK?lAMI{L-TeF4p?KQK zX)=4O{wg!^dv4DIKI`qj_Pu5f*PvluTIhU!AMKw!FCo@a@4VK&l)(jX^u{yjwS|5> z#OzHs_v8#F>CULr*A$xWaoTO2QyjrL><##MJNHZWv{NSzDHoVozxByG@dE|prOfPT zII{Ko-7u3^rY}FI(yfgx#d!NZ4^XkU(6sUCPGE38kI>s? z00&wCZ{08C|5!%QOO|}m;@I{7r|-O8a{=131nhB}@d%6Gq9!X45>B0!7r+e?E?kEL zws$8JPLb~0tNm<{BD0_0zF{`ur$x{Wcg?L%sy2dif=M_Mr2a0teG7RK)YWvP;i~rF zZ3IYh2(FB+xdhux*qZcgSrs>!?_u}cIT7M%s}2Zqrj0b>Ih8weFn3;A@G+&a^adO^ zlk;l%-bL*+9AoGlQ*EPMf{Gd}JP#_PJ?(%ww5P;IZw=0;V0n1o*^}3(Xsohd;B*m~I z&6~C(*;F(?Z7@f@765NjRUYNk5diWh+kcRXt1M!w zS__#nb9>?y){>}GOzx`OHcrO8ciN5g?9aG-KQsigI;zBfBRA4D&H(2nc39sZ1|Tnh zN%C@xYolw1Z>G6eTVa?bBe)rpnXYL8WMXelrJ2YO0|flBN1u8RQf`WW?`jic z$Y>sIzdg5)v|uZywtzs4wBb7a*Ya9 z-MiK0rwApWcy>L%p`8NFR-Q-s*NMk?-e2okc?eXtN>kr4e@JqD=u*d=O1q@g55s4R zj-I;KT-hP>Wp`UogxQdtAiypaqkN zfY@Sth1NH8y5tB+(A4t0GN(3{R6x9#oyM%VV}|1LBVY5-tu&B5ud0l|&%<+zxvjIo z{kV^WpCdoGSH%>S^MUf;NfM@<0NJC^5{1IzV#3j>?;Fg*wAyL3z-jlb_V5*9TYcv6 zyBJOD*2?(HsLXDF^t)2%)8(_RicJ{r%T|6!8rvRm?(|oBg!;c7Wk%3{ssrOk9X65vl^uD~s< z=K@!I=iJSDaD6{&dt5Nby*h@IB)c&~K-bQD_k$@pq(2Df_4#I9y27gZrXjD+^m9U2ZtQQyiBL!5ETf&3|0%FSd$yXE&kE(x*d zS`#A1Cd=892*2%)O1x-F7jAWYyAio3!i|C0eB3y*Y2If1~nvM)k&UJw=a%aPfe z_r?lUzuf`l@i)?8c(pJ01oHJx7VC2N0?RL^fvr!~gJnb8y9lk<;lePL`sqW1(Uyy4 zQ%PonoH^}#kTHR(oerH{FkOF%I2gvH1+y?5qX6|xQM69ottVI^feLo z5C!~dE11w(1Y0<+wDf1 zXZcsG*xgU;dz4CXTOQtL@9ocY5!px-+GliV27y%voTBE=@^I_fv3VRMiv#25V|ll) z29}(wZ6vYPXln_OTCWY$jJ}jj&7H8=VDJRhdTL#oDNP<5G0cQ(ct}?`^2MDbS zP3sJs{bpHc7ETbJZ?rcperlK=F6%tVa`*kx$?Fw*d>=n4h+|cIsHrwUGZ-_?)R;fL zHxZ*^-Q-H@A4SkQT0b#EfQ@AHRmmW~Dp|0XL*X5=vGqjohC}PTNO9h&#L> z^|FD|$3e(bYB$CAYu(74&oX30AE07|$vWzY3@L^h_3$+`8w4|0KG?d`1&6WqVzX`F z4>Cuuf+N^#vUP`p56=zyxdO0< zugzn2FG_^EF_Ts9V1S8k+qPKIjoD0=$I6uZK&X$%pa8`cUtXX_YsN9a_q~ZemS=in zL?m%Tg~Oz-k|NW^tNZNqM5Ls8rzjuo_fx0;J5_N;cgz+w><(_U_J5un-RKuI(+y-marZEk8EcZ_zT!QB#APsV-C;qH~} zqtR&vZLJ!3mIWqbM!4-Sh4Xg({AHN}E=K$$)V%%~8>^wPExPgQ)?sOzNPqSS@o&e? zoxL5((rbsiZ00a%AF{VSny1Znf+TzXNc(dqC5^>j^X2zZzpRY|MhBOV*xf?#x7i)@ zt~RyN+V886z#Bf%q*ooD?U+`B%;Tdt9Vb`w}O1b!r_}=9N?&s#>Jl$kv zhpj*D<|Oll;zQQtAxRd*_y1?@%Zq?0O1if))vrZMD{jt3KAf+7&AE7|PU$*}P@Bl> z6{&DypSZ0G{Oy-aenNeY5zhD2XVM3%i<;TNupq3Zt9~EbUlY`W{Md@*lcm19GMDFLkdOH z-=Q@zCMvNYvoP>xeRz;z2r;XZL86s#|f5HgV z0s?n`J0R#BU52z7LMP6jfqBXZ?SDfI@V4+~IrkcM{z#DwPxFDfd0O??p~&gX?4+N6 z`rYfy39i!OZfL_n_R|UYg@7v?9h9{ac$%D@a zCp%rH#U$(=t3&~F9+Zq*8f=Ayobc86{A#uYp#Ca+{TZ89a}$i8 zc6V>FBozkP4C=7n!yaQ4wx13Q=Tu)gQRUs|*f5MtMQS(T@YVY_>{3j-A?+>sl+zE| z)pXe)#ICmm&Lm}LpqAB@3u=XB8ME0uD9TY556bsRvt+bc3UgfAjvJ%Mt97L+$n+bg ztUfAfkcWwzGm>O3Uny?dFjBW3t~>MW!cdZ;2N*i=B%D7=(w%p-7%!P3D<|QEuw#8Q zj-*TqL{i1sPi|(Mes8FZPJgEEw5o~}EapM%&&&86r?#>X7m|W!AbXem66lL;#>&Jn zvpK!Jo}hL|c5KsJ+x-MfMC00MWQ_S~a1<@G@hY}@H{uMfHP|%qByBc(FythNW05$L zesgNdBb_&kRHjz|IL|?GVIneWm`vPp&c}d@fAc)4oAOUA~N}UER{qwA-0rrO*9L9Kk+%F#C}pfc9BY(xl*|C+G0Yb*galG+ki2#%Z$Uc00eT_TS$Q^!u> zCD%8Ux!S*bi_*Zz=b;aA@Z2?yYL~kpIog8{6itO=UgP4?h5<=}5-pEjxmk#+Fn<;~ z@t&`W?7FCbf|5_d^loFJz0WMp4UCkII00pi7Sklsc#%(D9{Ud%{LERSkAr8L&9Y4w z7M}!YXa;FBv$ILD#d~9;&e~ zbGW1{1ueYDcr0IbF0#!txRDC>9PVtQ&X0#L@igO6z0XqsSPBr4ML@qEBD6l_baw_Y zcA+6(hbJhWwRt#eJ=K;^9o_RkXd>85{2qqSjyxnX)9b)l4Mn4FuU{FA#B21FwkpeB zcekTEW7s8{L)=f<82%@T!JOlfpD1R`WbuxgpNrX3uN<0;5`SMNQMjws(B1nPy*YA% zesux~NArzZY_?M$L?Si!P;PEdU2oItm-$9PV>(UwdpT}_H!Hb*yKA5mh){;(o5oY> zx~tlsy$L#|o~WcWBmm>s6B@sOatc7Vihb=hlrK397d_$1097b^eOh4r)>pJ_mef6TWTjiB1~HU!9)eges&BZj>1MxSaqD9fkLQ4&y8K=1erlD^_MxYK`@ zSguRR`?@CzJob|dK}zJEIQrx^2Se0u2m&asfb{B!i;Qap8mI9mt!cUg^7Vy{Uveyu zSAAkaS%OqY#Ww~xTfRVhU@P@0AZj$rB@T~%Ytl9Yw_QyiZ+M~Q3*I25nzO$(Hj4e# zYQrzG)h7f7uF0uFX7@UsK|SR1QC~t$%;zyZAouJx>EoFXuY>PrN?iXET0PHm+MMbZ zENS@Lco|n`+ni5}H_z7Adu}?`OppATSQ`&Lwlex`m-Gi-{hl@HI@5m+#jRidH`=i_ zb6uj-^Vl#_Is+UHTo|f=-0pTAIE(%VNO6wLTr}!= z$ncx}E%rAAAfJ?#WsJGbQ?hViFZ9=P-o=(sCtTAFjqNJR4W!AYDNQ3iAHVIjqkNym z>zi7jk@)WP?Ax=#pOSmw>eJUEptl;ux6X4w#nt>EYv(wBH(e8}&QcU;7C2_IUgh*o z#*iq$&+xw~7o`HA{Ab7SL7G3t)c8|M=a&+uZc=45=GYf~aKUxc-)@$`FZe%TosnY< zYjQI`rOl}dAn`#IAX7FGmoO&pFq5I{u2hp z=_FB(B9}X~Rx}^+Z})~Mpye-CMFr*1lBJvfH6Z_E2ar?y|I0D*AC~jaEn8Hx56utg@n!~dd{!X3hSpuu`HeFlfixWNh){zif8{~Y~U>iqn zQQKM3ljeUUkH3RVn*U!c-U~`CW9>O{w7hYHEtdyZUT2Uzx0ry`%;>uFy$xT!@y&^g z2LE$WoOhDtiF-4*z%)5+Q53mtQ7s6iwkbNiSbAqT)|*=5n1tHmFKuRJli6eDUn8fL z|K7fTR^ZJjvHeDBUQScWQx%LGcOj;SZc$d|2>Kse%HNlEgA;1cB=uE3;?G6YvVCjr#L{Vgde(N|wRjSO{h=s~tBkjyIr8-L^2Dst{E9-_hkp(!&G}=sBS_ z&TuXm{~@A()&@&lEC-(XB@)eGZZ?%EU@UC|(Od14Was(QEY~+JMbXXvW`9RyL*&1+ z0D5s2N^E=8hO|SWkYd6Pb=#g7=WCE~xZO|ROaHSe|9(s=AV1?<2XL%toS5vcXHo(Z zr@8(2c~_#fOSDMuSE=Ek!OT17VEh!$2?r8sfdx465E3sqisa6BS$*p({)vA0+kP=hZ35a2=@)S{~p%iaAahJ z>(T`F{9iPjb;_z5-@}o`|J6Y9-+=S*pZ{|DDb1*e{nw57uiucfLE^uEMf|6wA8UYV z9`C=0AT+X%$PfLmm(vV;Zkp`Bp26K98Wt9(vUWm1r*M?Y;#SH3_kqR!zj`N2F$GfT z-Loe+_y;iR<)@LyKI1r2I{W74D6-PPG{>@C$pkviM50}Drw5>k`mqKF04eTp^}D6uy?z*@#6OLNbU^-ppwaOn`%^#r$s(%f zY;4bK#08!l{f!hG=j?kq7@~x9&b{3Ci7$wf8qaF^3%p{O*0&Pj=8qkwN4F>6EgjaV zOnz7Xqon5>bHr25Kh3H%9_|Can#ilKhkjYPdK?*#Y<|0s2WU5TDYW~a3{$0fr!HNu zg$uZKy19;I-CZu&7Fu5;6Wv?0H8ynZ?+x!yVW9)QOYI=In{V)AsWm1}4YpPqJr7&I zW5#Y1=}a)XJMW+tfA%Hoz2Gi6e`Zd7?&1ME*u2wz%wEt|=}jJeH742%ymEdm+TG7PI|Ro}@ebH6aok(sfDev@dl2lTNRu-$ zuZ4V1>)H9Jbbs{7S;3Mp=Ls}<`h-X|#@oKJ;~gBsySe)QXux5|_ip6-(AC61Jhb07 z`~0!Y5pfhGq~?Xkqt-oINb@vnzO}LFk!j5Yb!4p<=Mo$ilG_=TIplVIDk5+&!v{r> z?!y;HKX&oanh>)7bpX|2<;S;T1*PuOX4mx`L1p62 zuCrGUB{sj^96eXF`KN}M1?K}H+}qa9j6h9fceSbBRN>fU_wKKQ zmtXnE*@(Nw;p-5{UzopSJuWD$x({v`Zo=HEwj$ME9~c@a4dR<>-U+_$-gg2X${*2u zows1JG+PQb*RZ+?f;su0zOKdBKNf24%K`tn`X6!EO{g)ru$eb#=&@F&dyx#ag&IT2 z4L@P{ogq@qpKkt?I7TO~m=Vc&(7jtdh`pbQ(%0>dX)8FKyZWRsB~STzvct*q_ZM~s z#&75P@IBGd6u%}PJwJ-Hm%(w5LwHdN2FJ79-W_C7(am|Scgfx0N&A?f1x&!-+}2 zSPe+=yZ)gq8wti%f7scl?Q}wEYJOEa_^Ej1UXp@+?rkLB4Kiru`^C2i^y9kv+T7=O zsQF%OB_Z>9cbz@wc_2is=bCbF^{@Ex+@qs|bE`g^|(BHJqY`b#B{!r6rH#FbRIL_xXTs3 zo~q-_oIAun8)_Z^x?I9v*O4U#2KR9oFHxDcN&X101dvJf*y?ia%7S6st-PvXQ2v9lrGN3pHfi(4#G<+;9D zgG&s1Gs@)8co#=0 zfFXSrzhl(hpXC}qwo8H|ha8u_`8|{T*-^+1+EO~*cW>PS^Ad)XXBiD4*VIL*QGji=2yQ)LRO9gPW#L=;l`x+C?!GHNZPV(?ZT7K*i zxN^A6jg@c^67iAdi*rLG)8;vwia zQeyXN>h|(cmuc+QP)<6&`T zflBS~ihA0x0HdYgyNK)|{N|>r{CS`>Bv!2DSvyFCqnraVmV!L7+WvN#804? z8FuVlUJ~(xVJM23Q;V!z?C}Qu@NYasTvP7w|2OpHrWIv-DH8S--j&vH zz~EmXdddzQF*kS4ix)ZFPMs_I%N#C9=j+BQwq;{{u@-P35{RH;RdQf2(-^Hu2OiVe ze>#V63YI=^U0D%ggv-{9kI2JldWwoJ2T3t3vT6b5V7&MB%&b}-2OncNpru^?OrFRTg$#+z=5U<( zm4M`e(lWRza`H{r`);WkQlt)q>8@tqw3F}K1s$r{Ig4b=<*MDv8A0uwE%jK1QE^qQ+) zIJarWTak`|s6;@$dT zxrk}eu68{+TdF{i_Qxy1@6PhwIgqYOq2;K7;Y5!&C9}p(nv$mGJyZ)f8bLYD0Yt6D zB=h`=tHkZ|1D7I&f2m3Hg>1>rBa^l-JG?KQXC!jZN_o8Gv|ScU8q}k5Luavu(#*n} zGQVozJu6#8WQG?#8ZH2Kj`D{Vwbf`EGG4&YB#4S=C{hLY#Ll97=wwqzXzo+4!OW}z z`Riq&J>eo;a;XG$cJFyD(C{&26$T4CEnwD&ggi2$BuRRRl^;gh zQj6MSM1zd{!ZNdxJmg|ti8@))bH_xuE>*mLE-SItvC!mt79B>mN8MmGpzoD%mI9 zE7R@kCH4eMNK9ZhgTNz3N{C~EYdPXzMtoY1n_6f=8eDJ zQ>J_`c1yu)d6!M`JWicTalz}mel~sFvf&A0#$2H5>i~=P@7aof_85;hsr@Xz8{1Z( z+!t|6o79qq>qD2xxtsL8q)~4RF4Lve6AUdyxGx)YTNS$)G)floOR-IW zniJ18sg}7~WES3XVKSohbeql{wi9~Bw^f-av;VV*&WL(lxlxzsUmSu8j9 zMbMS;Gcw5gb&y+*TC;aBs(gup*~S@~;-38*axN6DZ0*7JU{gn;mMqI+uugL@gl$*y z;%kdW?oyqInW=o@^=Kl4QRlJm54u*g%qxMzOId?T-%sXGrUOU@Jae!*jwph*WGuR{ zm-_`f$#Pq9!@Yqlt<>xDAb8%l+ZuAiXvm@G0bYFdskp6Nf`S8+UM@4kX*AS*=qSkk{n_U4SVN@Pwt}0b0U1Q`oMuWZ8FF>%vuO0}JGivq6JE}6H{QZNn;@pLk zJU7WZB7pKT8#F4EHNbT^{JQto+8W!4m_r+>5VOvPC>EwP8GR9R_R>EEa65*pvjMzP zP~b+RHltV(95_mz7-l!0)q{tjT87Qar2u7=MZNphghVmttv`UrggG(fv+q8LAy*XDhmr9LL~Z zx_-6F!;gUFg)LSN&WWzaYGU`jCL`Qx$g4{53%$;gjh~o87)3^NRlq(TBn}%@q+BmL z-ankTPn}}Y%IJL&GPr8TfkiymW-Ix4#C6s*2>aO%(fK77TcrdM0!o*xd%W53RXe#l zoH%3?dLwYij-aaQOe`;FQdVvWN*01kr-G8pW<=ZzmkISnvNhPYC8(=1GjzAaRmR#K zqH}e7-%xd9CaGXt?2KT*w%CxJmGa@{bVQdy$`79@q=*_{e1))3!)4Kh%&=K=6^Y6+ zwW=~MjzCe0b6b$#Wih{OH~ADD$5q(I-`%BlBfagCjYEDe7$dWq8E*LP&9uOsgQ&<- z!b!~&Z1nVr!=aa1a@}tbl?+XgaN|D0HI_EI^d+M^CLMSZ)rOq@y69*$Ygc3%Qhcgc zX-gGn@0#H63~_3wPIQ6z?7JTrYhB#)$+=QtT{q|C3CnDF2%=auWH-G!wC%nT<@%GO z38ZDru4GO}qPI}JrT0y|o?s_@Cx8yaQSVv8ajs_fCBe`qlSSic%qUv>nI9phGq_6J zm%}#kNR*YQW~WzfrwGsFOut|UBDC?;<`9po2;)2%cj`H|@j4934Me6&G!&CVp2HgT z1@)0!Nmcbp-l_>e0OoWnXHG7eCP&I$`nZV&14TKkT!PZv;!gBNn%bzgq@tSS*uC9biw|Q}3l$a{>^CVH~4O4#$6h|>o?1?MKpe$$zYrYSeAB1k? zMmR6gB)h<7T6i!uWxyjxjU4q&hQZ+h7axF{wE}V+;jA!`vS!8if_FyYZAf6TXl02G z7KV6tV&Pid9bPA@c8e$&99L39R^yW_*eQ?`a77`mF}=`I!=aO6%Sckp#mlGK-lO&R zoSjl}(h&yT>*pf<*wFwx3JUGOBe?Ukh}Ukhhi5_Gnw$@T+b=mkin@|zNjhF?{bt5% zjLm+|D>HKniY`X5)0b!pzwvXjeF~M?^c2^&)f*dumn&v5vf+IB9c7Ir*#|*MbxC<+ zLS^Wg+iLZc>*I}sw{FimE{OB?m!>sw#|@d8zL7OB0Q@-PX?5<%r6;P-UQ$C-Wxylv z>EnMndtD{!zmhs?pcd6|pc^Ide?_LTN&g1e6(!e3uQlu~++YIsr!)uv9r=~ zJgeZQsfqEkJV23%VSpHM|>7Xy7W;QvNF7+Pj~$VZ30lAR zM-gffo948;!brNS#n_La-Wi-9LX#9lqmlEMa~H`xpF)dSkZ$T^VsT`X!tfTAvJWB# zC(!zSO2rK7o2|x5t~6p!o^h~SlNwt6zJhB2A8AZu;+v2>yG*wN6c3C#E@v7K#}xB# zfK!6Nq4ifv=b07=_>~wL=T2>e`jzvD1F=AsRW3tR?hYYIaktgz`+&OduZnuwkCI^hb*D4%J6Ff z@!p38LcBH@jLA*#O?%yi_@1vXdkp$Jh`D7|?{V42DzCSMP30>+sS|~N7m40Ri71K` z(izLcle;8+`Y0$lj@JCT+D5$JEGazFNn191WFyeC-Y=~(V8?wzBY_w=@yRm<^5KZz^JwmHKV;7j|nB!bI$?o|)Di19+j{6aH06BX)<`#P(^pRZ9ro zlE(ONlds*bc(avykt?`Ot7Mm{bN~zN$<4%{-Q_8$^ddYF1zh@*hxu#`va^?7J#!#f zSm&odGNy9YcU+LhQss(zk@j*{Oisx5cJ_o3-;9yBRdD)}SEY zU5<|-?whev$#xU14O?~$m=Wi>cB*VM&F6HmH9Y?^IS!9AW~asPAcdv;fw$18qNm;? zvIyII5fIRFB^lqdQWbS)I&IKy`DvAbvY$6hYFNz{GRK*kn23T<$bEFnwFBy8r5JpE z#62wTkR=AlEFokX(z7USPs!W)ZU!!lgnai&snpA5M2Dp_L%9Uxgf~%?*ZL@q|E}BX z)bibkN?;_%r`@AUP{<^PPmRwNB4Sr)vQ^X9e@O4sWw>An*mQH0M9pK?{gl$n?Q6I# z!SeJpu=S~`;szPv(5W*c$YLzrV>W~PU%lx=PE z=p3=BSmy-eSYNc$!3(u2cLghn_M>fN`1oI%81 z&joHe#8^iNjByB?8D@>tgZ6o46f-|aU*{$dt8C+)%;z-ak~e#3IArv7_iNtGrn?TX zl{mh>KeDi-6LeO@)n8CL#@_ah4b1a9;@p|`@1;2Y`~}P<7QAyr5{kUnfVF)9jtwSe z%Fq~ElnbBG?Fs&s<`Hc6m^KE?n8y*IBPb}iZ79y*8Kd<{E}hynq9rZsW5xi4hg7z~ zJHViy4GKz6J-YljtL9#*@n-@?iHGF(0W_Fs_LQK4xTq^?9se2?TLVg~@VD&vX$+*| zH4ldaSD&wj;I-Yvw=D#CvD^h&YmDD%t#^-W&)bD@ZFJp7m+f9L;9m{C5T6GQ@VOyo zTGSyyY=N)J31j8jboJr(-yeU$@G#%i*Gb5GPmM0M)N_&LCS;IL4#^PG(ICW_aVmd= zQTx&cdpP-&f1U{NzK`&`nkE6b*{T=z?<>|EzY9rzKVPIo>xoJX4gGI%HB0NL6dX!`ZUR8Ss8>yU~mYOVa>1o!7J~I!X5?$ zQ0)#uMP{IUaf&=O+^JJD@(2f4!w?Vj1eI>Vuoby-n~k#%Mb9M2W$W2BaS>4hE9rBc zS%lkIZIQ0JZaA+tu|v}L6MU7X7{u?Uqw%MbO<$R4#;QLFUC%MCPh)QacYGRl*%lAY zZ{lK)(XYW2>h4f%bwB!Q)dMBoOA|4{UxsEwC$`q;=#vO#@vR8FHjh0#47!ms0hHpJ zRS!5%oO>4*-tc(huf$e#2jjWDY9i;6x#CY&+6*;C0j`=;OB$s_Ap~)aOcs~s^W;L$ zv77amPh};6v($pcvnD_b#_=jeWQN{Z4jK+XEW0`uT=6q^5NZcVU3{|=(^*`kX+FWg?Jh-fHVPC`DcrccDW?!$x|jI>GwJ}V&{b&7oA zxo*=tNbeZ|ko#n3UOeBveG^G|@u&e_IX9u576>n1b4`>ZO{F_NlXkpLDk&*E9%6DP z_J-Y)Q9Evsk|C*d;bABR#+s=sd3zk313^70KgwN+_YQRK=^MMod>yt0asE)@E-(H# zZt$#ZiN&7^=@E-+h=O@q_i34_?-I2`489Tof~sb6W8q>1l13t|A0TrEbNX{ZCATU# z!dN=-Ro7VWwR38B`loJF$l6 zmNl^#Vk|F-@J$O)oeyZ@AK4{MMuT;P^NcUrFMi3jt5+`Cm7J|t) zdsGXn;`IY)E&1IhYRN3d?9wtL?X0yy;SG`CnV`mRaJ?@w;XjAXu$o_e$I-Ny^r=kl zqjB6nLQJ%G;1T}>OVC)#nP$w3nS~VIK$#@GZJ#j`_Ak1NP3+FJqx?)JFy3J3VX= zrX$C%rY+OU6!hc`qSg_wZ#TrqflmHliN)tUPoCA-<||t{$0*#1UELaQ;x^gs`s(eF znM`5zB?mUE{%6Ht<4@-@5|P5t+-@Ejk7*NL#|?Ase*fZVj~2Z?=dro>CkSO6a+aZH z%)X|GZ+!O#ME%hL9q-*{gMTe-TR{$EsZYesm}?L~3T@dsCx}h+?(Kj!#Ny?#DbEcG zfUJvJzrx$tAx*R-8@=R~y$>x`$_E8>Gp2#Pu!as$0uCuRnq&E(v7A!KPIGsR0g34X ztRJa2HEp>)i*Y(mv)ygAu%S-cy>ejkoOu`?onZksJueltRCpxcaz(6-Pp`+rOZr2R zrJ~Gs&vfTGZ>JQu8Y6F5#SLpo*eRlHAEj6N><#HHpOhERGxC;mY}#X2dVE<{EMC;# zX^g1dZzP^U`Yw+6&nR98bE4ds^zGT1DVy;A%zGN_rD)#_SASL1Mtxx{=@N^{@cdep zVfOO~bZ(tpk7cl&7wf(~han@?<%n8SqabVolGQ>nF^g+(FpBsz(&+28>+UsM0lxIO zWvU#o%ovqxIC!g3r)Z1gfk0`jqB82Ux^ncKJkWOQ+aTQ}|2EH>d~kEN>D@p5RHXAg zso|ud>h}h3SgBriOvraJ7hUWvpYDJZlNP4lb@bADs*Jq=`7^3m(jq8N{7DUw#=4^XDGQyzB1mL z{U$%Vf8$B{eBSZyKO@VNTknR4fHqFd&)Xf9>o7R>TnAe*uXq@vBgjVWoh1%Uy!J0q z*yx*R;I`1o?x$mMU%fsaLd$(T(pf#u1JRTAdlrto#(!+|?-<5rt2kN+v!V>F;Nn(; zk0HBX(q+qsUSjc$W-{RJit0SYXJ0021$ulP8Yaj$HErI(g$mLbV8tWQV4F zWVPBE!s*)HL%l-~(j28qGT^?^^47ImAcyyT zWfxPf-mdmrpXB9{?tk^QJ~I0> zx_TUMRJA{P`quTyPP43UlJO2FB@tZCQ)?c#DVJ}V)NH_TZs;XMWPdN)U(y#AA`!GN5exA58U!slG;fWX=!{v;d(Hv}y7S;Iu#PC}2IcZMSAOhIbD>jW| zcYM|0|2Xl!IO*PL+Bo7ft9Q>j1IvSXx%N(2Z5A0>_e>-I67cx}=;9Hxz-z2+feDUE2hff}R$03e&=+DXqJUQZe(G*7qanHWbtY+T=qHx|QfAD&8 z8RlQ1A|hfEYrnqCtlfm$I^;R`B(?|!e-(?ThgPNHJA7az}bN4_rE^i;C z$W4sPw)f<4fFn;0Wo^&X2@Bbeh1REa=L?md^ zLQ!uLQE$K(Soopi3itQf@BE&23?4^3MA6p7L+a_223ou;DWnKJm=kvf83@$ zdZ@jpqJO&yZg)_cT`|g$QW5?O^hIxvDvyoec>&1%1-!s(z;^#{xNZ?ESJ6GD{s&tC zmLSM9G!-y95dV7n-_HP;KLh$+{~nT&vA+N*e04P#YvnIu{|9_>htoTQ{U6Q$G=w4x zJ){4F%Kz>0EDf;z01gNS-8Uw)7iSCdFN{3A3_NbNn=70-cRNdv+58m}Amk-%{O(_A zpl3wu<^Lf5KOTZ{5`byxO-beEumq^$fiTo)MX^^ip{aOZxWt_f(njqUbpg5QW@U_( ztVA=&Eu%Qi4-k;tfXFbuY|)IPqqSAR0>-0dY=2a{T?vLJqF<)jymkHqD%RuLO-Q*Ah5vHaJW_3~oyX>~VS3Z-TC%Skvz_hJkq zHMfZ;w%c?1T0|1wTF{ERSL}1J^7`4yV8xbKf{7Bfs}%SXk4K$n7!BHyvN*^n%O7{v z3CkXv6M>^^Y}G-&8@6Xn%jw3opH8cBUqvfQ0>gap`^)s3Z0o36LctBtFrtm@D-Q2P z3}=pXOgRP8W8*7Ww0HH}sT&5BEPTDMPIDOo8E^2bF1Bar@k3U1QhRsH^1y>RJL$vZ z4QEOSu?N}S{_NH5%uz4!kMFe}s9MO ztDO+piNeA_&OMI2?39{9kHmz^jBpl-k*cbivt;g$?ix}sCoK&RRHhOn(fYYKNYF&u zM^hTO_`N-qq+)j3S6UNNk)?0W7Za*q;i8?MW9W}k$}EA4Ec-Q~7TBt-`S(Y@6_0dc zs*Gbm-M?|pZVPYbs7o77V*bEwVA80#BFW(OaA}~>$hMi+3HwbPbhd7k8L%6_{+ih* zhz;xCU!RT0K<3cPMmn4^%)RbFkVdG)<<(U~)+{@oOL)Xw^ZnzYVNWH6 zL$Acm?~@e%VV$WdN!<($9k2>$gs%6Ejl8&pEoq@<@7o}PFcrKpw()eQ$TPAo-p>YU zv#t57<~$-tYp9m!@}UJ`>Gsjsd1F8RlgH?sK09YDx51NFWY&}<)VJ$iBJq9lZWO#u z>Q*ZyFd`+kUER?KgpW>4#i-m)XqbLhHqPrc2LfNp#I*UkT$_`l&bg0lqLOkUsZlDu zF6Ot&6qe0mFst}W&D;s6qfA!uNC+kZ1HYQw8wam0jP|DDFtawj4?xzlMtJZ!il-We zljFpRDwgvr@aa_NB(@gmhHmLscfItLt!~%x(>g#g)qg?YHJ`dRI+Nd}ie|%NosB$o zj3v!^pslIxpF-^d-=vQaZ~^OV49Amki^igk(ZMX?`Nf&&Oc#c`l3y#gYX;*M1{fTg z=T()8lrDZFMOBphfJhC-d(<4vi3^HQ`>-Zk-kYYi=?nS!Q5PrZ>ruF!5nSbbklG)P zUuYh|ls?biUWimNB(?Qc`=i0krXF1J@eJ(L__zvTHX$ftIc(!Ux$8RDo*E!yey7~< zZ<1o1@i%V(pItBI$UDj}4OJ(*&?F9_IqU^$79hm#;3d93(1*tmw)TW9=7AGu^Nsvs z(_RuzO3k>{ZV!mq1bXpZ&!|zxEs>GmgCE)i{RBu-1QH-p9^QsDLyuv%SI98-zYad7 zr*096coR)GK0Fbyjv%o!$M$xxmEvLy#d6Rl%%N~K1~>8_o)6j+?I;5^sIiWS4xGhc z62;l-s{hFF2mJ^RvEySR=K08r$cXTbF$d@3)Jj7iuddZN`J*=a1G8f_4USUf8;y~mVMK##@U!0Da7}j!Kqbs94oTalmow!2w;n7y~D+vRGvhSYsdVA%gG^(mkQ(o9qCQP-VK&;YeVJAv)U=XX_^a#50G|%!{fw&0UKm|P z`kV`9(yj88M@Xucr8Pgl`jzFeTjPaqN)ZF%&U2HPDiLd4*8KNN`KbbUbkA^NT= zX99)mYQEsW`iYqa6NK*a%uQu9A11?LA3l z~mGq2AV(jrZ{kipCy!%MB0!GtZk zuh3(4FBS6Jv=WIx!)b{&A#sM+A4Yg&Eo1rF)o-0>JHkT(@{;BVu){z%Ct{_Wp05SwY^)jh@?OK(;k676Ctra;Gn0v&F1cNnvA zS;Tq@8ruAwhy4!6B_(JG%wAXgEH^E4BVQRb8!rAz znz}qV^9m=^2_!Y`KAJS{EF+&w=*t-EgZY`64!^}nQ@T7fMf=6ng*91GJ3(x9arZ>N zHRy}l#|jPtk0oRIoHoD}adeME72)Qz9c_rYmQPVLiti^thX2}a1Y&8f%&B0ZG8#!Y zWHRrSQn!4BYahE@=J;;a@xr~dtzqH1KOsxx?Y@XzjI9qE>CMnQ+ywf%=m1q~ilTm|_N;tQCT4{dn#N<`zOlL3nl&9P<| zTL8ut|9)Sz;j)cVir0f~B;^?Dpx3ywEaB&6w<@asJeqJ@7>s}Zu#A!z zQAL`_lDji9i-BY#DWkgE-*Bce9QuJ|t-w0ij_yz%{Y51T7;iL`Aa=|gzLKn~VV{HQ~k0?-xE8JX-VSGX6PxzN<5Ef$~uPC*0zf%T9aHCV2|P>qkl4 zLC~pZiY$|a8y&RqfiHwkW0%B4+E2@BY*mq;Mp|arm+^%Gl{BofXqN;(WD z1!UXdLPD6?vz&LG8w~JdXA2*w*1!1nOEBOBQ_(g34+T*(Nkf}ql@bzxqvw*uEDZ~! zTbV@tWD)07&id_2d6$*+vpi`X7JcSMwTWp1kHF!@W8XWZ9TIoz2p;$hWerG%8kCrL0#KbUP&xv2I zQUVCGfUq=MVa*q}P%oO0Z7lmX-f{5d*^$x@h@D82YDk)N{cIupUL{pk+CL5%qZnl< zl(N3@D@$CfNH&;j+3`IO&K@439NZ-;_)v+*Q8XmjtCyhxvQK&3fz zNjf?(Thf@Zy*9?B>atY;xl?P`mdqD1lrh-vjt3*}c6duHZnaywJRLRtS^+MiHuk?v z&Lf{~h!_xMXQcjy6>*Y2cwPq{Hb=bUC+^h z4TZvW<5CSNs+naoIkQe$QZSw~ibq9qw3xI~{FFCb2*L!vAx**@%H#d`Wpz zCb%?3Su&Q@0bWZB4mlarBq*se)R4GSRe=kX#Fm&%Zc$;$`Z|Kqzd4J5gtDsT+mKT> z0i_Eaa$Y*69$c6dcuu+#f1^wL(07G3!*BJjy#Bg=om%E~!om}IES#U`u;O~NQ%}hN z-L6MWuxB^bgI{sd&(=3H2&0V|5G~;Zy5l7QHMlhtU$Prr?W|nR0gs-nGGE^N@g03U zJ4W^Z+;_b-ag{sV{BC770i)+avHlNk3)R%IGpv~Q!J#06&Z|CMj8Lklo1)8#TkG%|LpsyitlhOp&2LT zRvKBwi}$|J>(O%HT2Ddw6Zz%gxc3JaUA*1#I881O`mZ$DYv_uP-?v7F-Wbsc8j9Lr z=}S*95M!D+0?|@j5m;KFip$HLP&4XsfJaKgO=n3u$wrG+c(@HvR_6U zi*G>coYvW)Ej_c7(A5`J?FFqjC72zK=94_A17h$R93ffFaF~QA_D@=)EpK-l2z;m% zVtPh3`+9tQaox>6ma7FG$^j{&j@0@Kb7H+4SOV2Dh1lDIOUVx$L|i}#PO1dqKiC%q zYZqbGHy-DcKXDizVW*yX9*2hAN^p255&Kp3+I8)OruOrxuQCtWpJvON*e)R+Uevq`d;MA_8O)zVulTHC_3 zDjQQWn!@ryWm`_VsVqFopk!W8-1@5wLI_pvpbd#hL=tt;{f#Xl{Y*?+{pDv%9?rxh zF0~rtfZjw(o9C_yeTPQ5p=r2<5R!PD7mJZ162b(MkS?O0+C95^{uPf=q=x?4AGJ3; zPgKULO09^fq=x>j(Cjzun9Bj6p&zxjhmRr9ysx+W__UW&hSt^+R5+FP{Sv%N1U`w_X^oeXpiSKUJ2K)5rDoRd%No~2o5TU#g!)4Ml$t!|EEme}V(G?sxpdhL==A{-d0{LR}ucdWbGe6IzCxtV5F z16eO7WIb1ogTVqv7rl9ZJ_hIsIwzNAsBSiQfk%h(S5T{56|C#D=nxm~I(92@SK9CI zc8kWY4|*ULV=wt+%T-V+)!C`tCzTXhK~wev(K3T7t#t=!VV6&n3b?jCjfh8c-(~9> zm-H@wELM%Dsl?h5sdrk+AQ7A{km~np>E^z3(NPNuDn&zQE^r z8~0uN)R6M_wDEY2Ix&@P<*lZ!lJy|WJpe3lEF_RyBH>Qs%)+#DTnPq*;_9o05ur|+ zf~v9&--CXar+j9TX$MO*s>+*%EZ7q12;H3}-h z!ZdT=PMV4bfweV0V3@zu=l&>|xDx?E$Af zYh~|9E&@Tark#O7*F*wa@qIt`N&xGnvt~|5q@8yHWw3s@h#XyrRKOO!E~_x%ZCbI1 zL0X~cjtPIrqt)Tg7MN_Q8M$x@(in)j#NvrXK#!*pGBtwr8_Aof78JQyeJHlqw1jWXY zjX8(Af|F_c%+9lx@|wvh3hBW?V9k6{df+JMO$%Pv2lVprY#B7>KgDKG``x?(mo+SS zF;z1tj39_(%~nsqFV3-Bne)RBU{-5aQ8~>G8l%|JWh;A{S^aH-d{pR?`@JHExyz(4 z%BUMkd7A?xe07V^aiZ>+A<)oH@NwY;`WBEbi%K%rhy+pYQ0Af`fFW2UF9m<{B+Qm< z-%2)Rac_$TKpS_duA?uu=w-0xMO$@PFW)5=2AEd&4g#~TBIPybX_6Im4kT_UH?XnS=<`T)C1DZM#kSuL8rKZpNEqvb6cewq`)!W5Lud;Hg7$FX z=u&?JI#lr;ew*NFJnTXqA$!=8^4%3@0|C&`AOAj2mo04n_pbPCP0d%vy+mwm@88BB z8x}BFA%Woe^8G{$m4D}dW(SmyE(}J~bHvbUKV2|;yI*s^*dEDragkNOA#9{{n3cu;CNnMGPA$0 zSu|mPI&wA|kf1a9sPHXQ-^{8rTB?u~81mez0#O(6Y6)Jh{Ed5*kj`_XO9fp*IVcde zT!~bHoiD%6r_t3dWPAU8b#26UWAb1@s9h9#LXl>Esea)ZulTgh`i34$Vb;~R{2Yw0DI%H#B0N!MBhjw1U)>5v~0qE=it zJ#IT{vlbJ(F-y&k9-&fTOE9iM0kXWKKFk+YVQ%v?p`w<8Y%5|9y7P+yNH*BZoN9_S zJKP==3(b|WEndM)f+I4kg~9?c5h91f#xRkP6^YJozAUjA{EQ!_X?G9y-sEOSdCVAx z27c^eN!d!g1W?(Y>PEut!t}wuWIEzdLrj~*^|1R*6p=3t{Qf(R?xA&`SN6J6++t3V ze*|XKe_{cYevedO-4;uDV?)|H7>_Af-F=k&jV_jwp|R{IR!H@{=~>dvegm1#!YPp0 z#=my9F1+dzn~08g$%EVv{(PZJT2m&_Fk$^>iNTIb)4bgaMW&wgdKU`a;4@}Ft#Ukk zaznPhZ$8ka!_N0wA>mE^`_Dwc_^m0q*iwDd_&~>kWED?bwcF6B=0I7GR0^3XBLhp? zkzCsA#aX=sX^JIqM}-FO2WqM+==FR+bp-H&lsJ2di_OfU`Ou(V2UJJ1KULxUIhPB+ zKrySR9HnVj3`_2n1FrLQrItNhKIgUSka2L6t8r5jvxc3H(X#1HxKmzoJ=t6U2Ju+B zqvm3tZkVg%m~Vda?ZBg=wm?qnySux)``x_q`@ePTez;W>b$09QoHISs_HxV2*>9?Q}D-nqK)qzl`(^AuRy2)~QAx7OA3I{T?{w|)_- zIko)L&pN`%MTOixTOSZLsiSm`rv|znkPW4V40C7nzfbG*OqQf^e3wt-#OVRIYuAAH z_lQQ5J~y>YP40YQ?B-g$^v`+s5cMLd$60tT*0U84)*|O;3`4;Sm+RJ zgeH>ax~~vFIZ{r`oC_m3p5FW7_VA$h=X%3`eUmXM1`lnds7pJQ#+=EixO1?aCZ51| zKSt@RX!X5>vA+0beIZ<@^+=^ejj*xtMFSiB7Y`#yD0~!ILAN^``B+n+spHiqiX$V3 zIppY+mPYi`;-Q-LlM(4pw3m2Y-X`}bGm6!q3roml!%~4dKUdaC^)&)_M6i7=BRW?o- zJj!(_TeBj5^)bWw!;OMO2FK;m=EZoL^yjpHc&ru9oIH0&ZWIJz%-mTzA!GmaWi~a` zOfl3|nc56Buj0-7+|E4E*s_+ar;2gaSev$d!ROcFNoR6P$fme6a@7FU6{UNsAgy;v zR`s-I?Tlfrc2pWImxtXz7j}eRyLJ4HPm@)>T20laPV9r`sNd$qvr8;RuoDE?23M@e z3kIVPSx54;B^lrD!1amDHFU~!G0virGG9Z^=Vvo|TK7=ZMixz8wJ{7$j@2$Xr8sNx zAi|2B8_vSHIa5)?I>d3aWfvJRqrrRIXwRCk`lazx8}KgtDTnYFWUyO=;9i zb4%Yi|Bz`}XY@LrRm!S!^K@>6`OBD^7ve(I^?-<@>ip$EcJ;~X>xezKJ0-m3{yU1?`0#0PBM z(iK!rrfTHVB5m%2@o#O40xrQETKjWXGf7z4QvvM}=rII`;!u}uAAX__cl3_Hf`aS3 zIoJ7T3{xWXRXuc-?+4u!#5(R&yUQ7KpGN@AsOOe4`%OXC+Xgm7Jhdr=C|Y}u0)R43 zSk_X*MJNp}5_p50+qif%$GOxi+&GMKDyqD&N2m|3JoJ?$^qd(@cHt@|$lb<|XUDGW zD?MzS(Q>*qk}y}cA}8`~pC28?DT0-xh_v}P{VP+yetCev>~d*%PyeHicN53>+>TH^ z0nyU;R>N>1Vyc(0Ejq7M9BYlnPB_>5Ta5H>Eua~3O1H>T)u-$-Q{CEOFkXVp=5LyUqe~w zre&n0oY1c{d796+!~fDZ#STJbLhrKdOu*H9+~>W<57`e4AfJqPt^>I!*47XNN3w2G zYRq2_S3uFTq`0on26nc17A94sW%nu7;8u`E`EPj0gNvO%!{ zF1QX;iv{-~n2Za6J{PpyJIn+FaSd!U1!;`L9#a(COeI5Ql*}%PZpiwnf(@p4!Zxb@n;N6R(z_$(*#$po{Gr0_C^aQ{#V%k7CK$Ku_ z`Y1QBpVTEl4y{IIR8<}&1Dj57;#1I(nzG|HHPtg)d;>?jz93)!laZ*t@ch#@_e)NH zqW*_%z2+W$wt-9eiyIa?jGNmol#8&8h1>Gm+pcO(e?tDeK9VrP2-}!Q$Jy<&0>=%H zeF%FtI^xm>--a3K8y|bHHcjuA8G$cz!TmzF=dsFXP0(xe85Qrjd}*CFZWZ-3NA7l7 zNQ)$=*SB|mwvCm>(geh|Kk!#8%p%fk$Jt2WkAx#Y5hwp|?itW?p7nN*BbPN92ckDn zKjqRIq4WB`8w!SZ%6>#{Rwf}*4^Y??l2ZSD^R~H#V<`(`>v0q5tH5#fbe5rD#Lyx# zHDhz#f^67e?7$bE3%r;>)=bwB4lHq!tVUg6{c@iBY+YYvX>ir>q5Kwar>w+wr&)qy zrTf}h-<*&kxO}V*VRQs2FL>hZM44YF=vQk7fmFBObmt(7RDI&Q&?6^WT8q{LF9CZ% z6U`Apv$I+f(n#|g6}t7|d!;$)Tn^-tIoZ*}MTPzLvo6vk%J`L6&hl^6!=>zzUU`>_#FiHg{r zkySgb^9&KA=9YOsoRgG-$vIh3XWh5s!krFs*6%pqovW-g@hQS<4xNFIr|@Z1lO22KF=qP)kZN)q1g_7c&jP1XEmoD2+`UC&>PY+QKIRMHNS!=At~g z0s%nsB8u$Vz>=!$s~-LSy&a8mUHceSg*nw==MZ_cODjq+&;C$GUKqvQjYMWV>%mXFtn+Y_)0AO>>ufM$56^R8UF3q$be%S3g(SPUHucm70B#N@bcr_PC5MWsx(Y z63v9+$3`0LNsyTvFZ75A$ihFIEO@Kh`71)*0dHC)&id$0BqUe%;~%H28ZMO9Zl|+e z9k|o2gGsNRBXLSkrji)GVHM<}y(D;Tcd;krq0pdP?8gm_bRsp7f)FcH1y6L$1BZRo z4_pf7CBLMnc1Xfb*wGZJ5|lZla*yqV#S0~ zQKhE0@+a?=?67_CdvM3Z&0(L}IixK0_KU z9b3fVm^_)=sgaR-iH_^(=0`Cp8FQ0PF_^A)`wC$}-GG*wF`;Pvg0GaVCV+fU(klj& zz+xhC8QR5CO1w<@dY_xF!#{R)34sJ>L%(xZ52Cp+6C>a#sNulgtUMwFPdt2B|7F6< zSp}JLTL8@ENm9iQxk`j*D?KIzA*>@EtCh*fkF_P9%xEc$T$U83AiXcNHq63}a!-#g`Y?7U<3g&|FpUj%vzMgN&-a2P>p-kL z0$>le*7bEKp~EBZ6(Ax)x2)+TG~&ppu`0-Kothkxkf) zxLRz7<=7WH%QElcykkOA7oEM<)f3YTU+>w~(h1>{`I^x}Knf3CFP*9U1Tl9-+aC(fEv42&( z%Kvc{KSwnjvj2-Fi>jHiUXcyzb61Y)mzt6Zp6o)lh6)r`_w3|7x8%sDW0@?0M9c2U zYfF8lJLNDembbmZsPajPR@$^ZG^l~~wde@*2HRuXtVpZAsSK*51s)&P4>d0RK&{m2 zkF_nwve}>UUxB?Xnu!lJ1>irU(@pykpE(!hcDC0NP8v5lf@m)70sBLbQ<|TFxcC;w zBT;Yj$p8k}=9YV2XZg?EPt(c9wgYshkR}$kT%gahf@?B6El&JO#zd}GuEwl)ZRV|bs7&#V zYXqnitm9ennd+WVdtlD`FdOkaQO1siY9tsNIAxN@us3&DR`qhMjKlb>zU}*_l7!x( zv|L4_4pSF=;~-;8(r_W*<)VAa7LC{Y^IU$!a$$DplhF8CqD!k;7T5ABfYnm#xV8bu z^(HJ=F9o|IgOaIf+;}v98sVkh>Em{Joq=78PiVh~GY@luw`L+HckaaPt2>7#myyOr zGx4FUS%P6NeVaJh@YCMtU{o0a)krLB#G)PH`zzLZnA3fcbMCUk+F9(c+Tt+B_>JZF z@1I+$!Ke|#IY;>g)2Z1v)uONKqE@ce27&417~fmie{Lbd!V6m(Hxzh$_js?{)Gn$t zUGSVs&w3SW_KsuVC6Kr98Rm-(Muj7@|+X-VhD(Z)*1!X7oz`LaC4OA4_rUTLq(i)>rsIaB*?lwcaSjodo zS>9Ko7uGg8FFWAVM#Ht42#FWdx!RpJ0t@*riJE@jD52UtYwhN6+!Vs0`K@2X zukY6z^x?a4WS+Xl%J7ddifSBK1rg#dTK8rT)MoMZ%WhLG)|4>PujVwkZ3vQljkwge z42xHsoFAtSsfX&6+srPQq8oJ~Oy4(U^_p6@LtJ6F{e-Hh>nRR8>x zUt=bxv#TL4mby|k!D10B`SdInl%K0@E8gy3n#vVo>*#kX@X5rO06ThF)3{P|Iv7lA9}={q2Z;#dU`#Ayu8{lHZ{~y+t7= zZ@@1-O3hW@F)};ynOcAKM5P7&%h+}5(7LU?zVjozsn5Fdi$>0(L&HcjtO353i&&U$ zV8U6g;-*HBEB|DfT0IV_5xQKzjx0Gj`N8e&yEM65GYe6{i`fyK-xt(`!G~wsDbgyg zQ0W2TTuAQ(azxF(J7rex_;z|wxy&F_8{1;f=<|T9_RKE|N>y!+mL7*>iV~x#JCjxf z$A)&t`wXb%*SH#vA66K>?-Lp-a|Z5g=T9A8nA3SyBJcM)3uw)|2(97m9(>4`SHx8c z(lD~cO6b$wO1XxE%CtfL3t=Te{m3v*eTH%xzVw={a^-1Vsdjdwz&qN_AldiO8A;l~ zikVlXt%s2F`k6P18`Xi2iP=bU4)F%P{7XiXx8lE~z$k*iMA3e0oPnlzHlgd z$Le@4?qlxNv;35@bv*SovT^6&Wb4TAYvY&fEZF6mSd_QwB$NYT>z~$^qeen9bniNg zW>uH|CgvmJ9SJ;(IoNoDP+#}MvCd}^d0e|L$L+*ZaJUB3=+B&88#Z097A#`cc0ol& z4XO_?H55T5k-G?UvV<)k<9#f4;w{-V_sC9CV$`s?T<14sx7uGX{RIVNs@A!z?WjG7 zUdymf_?R?fKt21CRysXahaVrzAquLut9jI2bT%ZPG^_-zEyjBs)EwPw+M0`e$+V0q z^8*zNJ~__Lt~DBW6qtRKellf$O_bII9zpf_RfxaNgW_h)<>YvF{1acb67!u$8c~L< zSR63;f}p69GUHoSSl!Tmd3Jt;#NTtiA$u{R?V){`GuCPEaJpQ$`;Ohs>B9CKKhTFF z=_f+yw-}j5=G@O^UmPDkPQG!uWTNA|Q=JF@+1y+yk9z9C+-6iGN-z0f>71NaU&~3`$%49Rz2aP5`0K6EElv6p zSyc>*45TQm-9K6x%_p&5WT1Cswd^!#X=_%sh!o;AG@_Mt(g^4g2ZLHU7aBY{lddhv zyhd(?1W5d{h+r;ps@bv^x+P)!yQyIIl23iLnM9MJ`!F-0K3^d9cjg2aQyTq zScp%0+mn^0YR&oDw^zsF&~`UFRCr{X`~WK2&M|2mSjr_wsmQA%Riz&;4nx<%qJb7$ zk3~oy%RPJ@Aj7j4Z;xvD25+@}^7%HFR7%xSSsA+qvkmx6^U+*H)6Xp93d7SYzV{1b zU~4(UC$x4>)#ik7DFta+xgz(%VqQ?EfE8Uzb{8F!Ft`0vvi5u8%mZ3BUWxVU1yugb z(=L3d)&>?{P~6j6_9ciFX7=Py{w*f!_a(asW^Jte0FU#_hRKnLX+j`&`J@cf0tG=j zIOoJR5eLyBb;>7E_y6m}9EA0?uW#J*!#nGz8%75zX0nI(B-!vmM#-T+JRSDk)}R}= zj7GpfvH-Qx* zB)JH}cwhtvYPz7ECtYeRi4tDFAP~vXkU6kINQY`_3b|ICbjkUqf4G^0=4t)mGLV`m zh0OB5gBXtxU1}&uZDTU)erdWsez>fU%{`>9yi6JT)Sie@=oS2`bLfxtJf(M$(*Oa> zNIbAY{(ofR`y^xb=jSkLk0#eNH%}ui&f^RIm zQlD8__&EQ!f^c?l6xRBzHRYkk#V5=qrr(a8b3{lm|9!ov9;a|qVKXPUshsf`^P`{t zoql$3Opg=1ZHpf4DK#IP$6Zws|Npv#fbI(-5l3EU7C2=|{-tpe%vP0B0+16X{Od5W$p#z;Ej{0sq;X#C;54mr8A zOI_bfvQbi6l5(gFv*+&ZGj=e{$k7CNvqFg&rxCXv)Q~SU$Uqi}NaGm3zPwZx`Owm} z1JJ`lJ#`YSw_LSNOVcoAPkW*!CWdU))M|`h$w#ri|3NkE{3LV%cNefn;|8zU+o5Q{ z{1Q`f|EiItv9w%Ez`naa)Jy&kox`JIW94e=W%Ax3Oa8bc63KwFxqCtZe!Gh+;?jC^ za8lAKG@6~-Bn;2$YE}p3@S&xoRC^3ogwZ&1RMU)BSLWi`lE-p?O5QOkeG2`NQsX3f zF@K`Ath2X;BAWkkpaAGHbXlcQw=t}b=~u|z^EAvQr|bQy^4O@E+Y8&imKRW1wQ1hg zFI>*#_07$gEFu&=3yZ06YI*qWh%&B3v9idY5+A@GT@?4x+2k)096E`*???CiOI#)@ zkmAVRG)(}Gj$L3I-<^n**q^MeC4`4x$mr{AMy(5~h!IceB@cyJy}5_JedWXV$G_We5^h_eehhPSq5Xf@ThY({&6C8Q@ z2NnZwpy)DK;Aek9a5A|vb)t`5+p1Gx<&4;pVnO|H<{()$`Dflm{Khes^XE=^`BQCq z*dek*R%E0S+7kLiAxp63NNSC`?A0-`F5OG8$M{~Qm#3-HsR4_>Aj0q&1KMdcH-dL| zu-1k7iRLk<3ys^wi%|Zr(mN9qs1a^Zz+p!`XgA;EGMOnJT{k(cZEmBGs%Sx+U*_+e z`Z=E+O+qXuYL&;n=2#eSj}f91>T{jw#Y!yHw*`1ppE+Vaw;%1OHM z!Oi*!vxT-tl48$S31r{R1^O6G&tx6VHIl{lqCtl~CW@)^KNiuy0w6qwC`Tfv)YFTW z8zEFMl%fWHnOrU@Ia)JThZ!IR1tB~J?A<)BkW2ub1(okx|DEO0_bH4Xp4)r*vb$F7IeSq$&n1K=^C0+065l8 z!i`R}&0Spw#nZ_EECSg7>Vj~oO+ZEVS=`*YRez6my}oE(o!;9)j)bICdC_mIcq8O3 z8!Vo+8J({NmJv_$S}Nt!4BuN1!{!o?!%XCB)`>5v1t690-Gjz`G&fIWP+Mb<#I+}M z6T-{8fb(nMrSK`j-om>|sQ})oE$8%&!+rXU zcYZanjo`VB%w)w4Ic^JS+Wa;WG7Tx>FG8^e(uarKH76GokQSLp?n_BXGT32AWW2pO z1K9P-nWBJrLJP^WIBi(|l|MQ16j+;XJfg-d@stZYqEMw~9wlFJZ4n;9L?CYwv`<@Y zTAuFk{gMF*N2Wym*>!b!(n>~Whf6p-PK0WTczQ1Omx^Lbcjm*_zA2Myn*Kw^8;0^! zW=`sx{S9f^k_u>W7*oIAZz>D?{Xg(0L`)0QR`1*sA%`%@Z!ES#Siw2`+QLKb zLWXuZ^*bc%?!vM?8ud%-V>I1SHqU9_?U!VHaD9z^ai&N}fY8*ZMF z;(54zW_NG(L{Pg+7g%*6=sq{LXnGLL%gtEmYU!wVek=gB-yt#USOq?g1E~-8v;&I6 zSa1XGw0nQTlX`J?4uHCJn=Qh$N!af^9^y6%%hg!aZ?3A$O?Nz@LN}TXf(w;DBnqsT zw;UJHOpTR`3v;)wheY8=*qz5fgsJ25N{yF)T($6ZImIddd+OQXF~}eDWfGf_VgJnq zXjo6|?bU5Nh^Md`cD>R!%q^G|P!8|g3Hn53IL73FQE$*}j6^6LrtP9$3R-pr(6Ymm zJIF30*IiBTp)cAU5t+DpOHA=8*=+@2NuQ_J16ZEFK(}cPjJ4lIN994^==YlMPxLC| zEZy`k>O)WbZeUwT0r+7}D@W{(<0CMhb$5p?e-YKkw4ix&iFxJ$bYF!wtw^)#A3qof zlXWK0gdJp(%}k|mEUVgX3t(^{+wst5iHGf;wg%gu%zZfLJH^A^@;O^TeM_yE)Q}(= zKM%`$^k#WL7tjAkF{jXw^J-%~zOM05hnGu9k)1ad9AO_XAPGZ5HyMcJeeiaqm;Scl| z{`riI!GtzPOMI|U=J+;xonbW?^R1oll(ve&8l@8zzHF6@J7qn^m12@sMDHEFlP>|8|Jh}z3i96XKYm^m#dy36!%b1-*m&&y~qaz>EI}lxC zvKaF^&e^SD;UR$=VXPZhR~N2#WAZu?F?V*CE1Z${;u2VPX+DdvJ?a%yoHK9~0DC@J z?M&GL{9Q)r^4*%8QFFCJYwz`8{2Fmf=}?Y3Mbe7az;r`a^OXxv*T;n!bVzBXLX4;t zyj&1jh;hkz4|VV2tOta7!kwqHhUUg|Sg22Zf)}T$I$x|M7RxRna{Dw+a<^x|$@?HN3BJa_!}6BxGhZcj!Jd&0<_rm`9O;eLGL6}(fp zDY=VTGcevA0ZWyTQXeF{(MIq(h0|&EC)FA;?eEq!HCJ=Ju;szlEhn)iZ&&$DshUH4 zLb7msG%{E4bXnF;h%wcGRnf7m@b(4yFX?=%wi#(OY$dCchknw2~Y*P>i@%5&Lj_d{y({T-6^2E-sFRwTtVd-L3;sAf2H*IzB;f=s5^?iyZ}*aN4M@nR`rGn5J!M;~jFZ9LX0IU(D%l-THQ8j3tn^)Jta@ga z>QQoUzjL$@k$S9OvYEpw(d2Bm|61q9ZE#8JpN}c;a{XY2a_I4fz31T;9}@Y{)@yge zned=lxaSu&>U`1L2-nsWQNR*7Y0@<NWGL`l-h9sX;crCNIx@}}NG>zCdkZpV`7*@@a4QVHz}Y>(@NKDQfPwQbJIv5y%x z%ZTIVkD^#LG^5c{Qr8RZDFeLcJHzNfvQdo{Wx!x6$El@)_E1RMSZqlbTgE#4Dxlhn zs-<-Y-_vS6f*O1@c-<=m)C+9okqgs)^COB^Vr0i(-U$<=l$6x$nvmoR?ZL)|cl$dT zi}^$T2+Q$Yxz5mx$?Q_(7kK~L$$_>|bh`ES_P)C0+d)$IS||JrcGgv&%0L>;AJux$ z3(Kj1IMc}pj81b_)-mN`t99id)1Tz1WMR0vc|IkgHyfewAac_9L)VeF3yM8ViK<>t%v zMs9n_wz01Jx4mDp=ns3cP?%U8P;O``Rk8)75Rirx18w%n&}(pem#_86t5AAUK-}=Z zw21MGyZcfV$TFKN)94;T9lpFYQQLX6(d)mOe23gTI55us}AG$j`7P=2JPSc(MDI!c~h1&{lVG$ zPRu!a3h(aD@kiDYMxEjUm`R@bk~WU47pyrR$ z9JeHS?0!ImiWR8t?#6sy8qIX;Qr+m;nM!%}PrSbf9I6VYlBb>IJ*S?(Y6&FZ!~>%Z z{LHzEdWDva)

    A7h`Dfetd|+>F+eAJv%q-FNm(UWLR{t>6=gLxiYJDBl=6GWglAG z*a(%(Uhc28f)Ro8#-^p4F`2Kp1K=<}bj0L|H`?wNlXrjJjnbE2bz^0Ls;*xvjki#f zP9G_q*EF*YKA#i~E_}N4M~lz6Ea9$R{{0J)RB~%k0yhxbdJ&~@EJ;Z4S;OU-B%A6; zkr9)<263^#D)z<^ueX&Dua8C7Wn0n}LO)G+cujfb9A3M)f-u25xi9>APeMDXSFmj@ znnzHF37xOjxaqFDJ&!%Jt5|_2-K!W{(Eu(9k;g9B*a7;ic^RG()tlYXGD7}oUW1P< zi#)>qd>3Kf4&^ejEBm+AeCQcX}D(~+lV4@KFq-xoKhMYw=#J1Y>a?((v&odIB4yr%vZ1tC5o9PVM zZwIqMY{Il47z6{i>GblyJ8aH;BNZlPU|<*+X;HAHBcT69z#m{uLgcq-w~1If>hoC1d>ekNC3PzP#?2^H$$9sn*%6k^A+^*+YUpuJ`ZY0aRNRxVt5hAVo1J z_YhZic;WHU$_aEjM!MwCIR4Nz-4_hE#X8Y zcQ?cAn*eOuuUnzDO|+xAqMU7;*qSCAyYv*M&SDHlQb5ylLq0C;``dY{R6sm>ttx^k zQ$9k$)c*^ZIr^6SR6=5SRsQ*J!3$+2fc3$!%0U1ZXVnE43MEiab6c_t3tM zc<)4`&GnWOGzZ3CIsZ5o^dK!T9I~5{==_rN{+Z(HIyy)AaVJ*#n1YHxqD!=5|JRQG zhpFk`)m40qmQ)m8UWLC>f5u0%TjIn<;28j8uR#W)wy&&QrPXS&D9C0znJ?We>&G{W zmg;{aVaV2+;l{lD0}1@?wgv^{*9p7N6JcIjV1Wp4xRMb!K&VQ6%E+L-BSMAm4CXFI zEvw3Ex$@1jPvY$Eia`U;VdMD%`=R9;!T#9r=;x9ARTw7K9QMNekC^qpJlUIOv7)F! z>VNUepr$_>PNh6&_a#@vBe;No`d(UcSNc974d4-y*xGX8v5QLO^$b63lumCkg`KHD ziNoQb|HJf5KsW!aWJ&o9m>`roSC*!Bvu4wpiOf)aH*)a(SocjH~^;vVe5VL%g&Vg(< z=6~qIzjl6*knqu2f|aW~XQvX)wHUUvYx^U~oLYT0=tO%Oc3*BZS|nHBOq@Q*kKRs~ z676$b;{;vOE>tLY>QYjkjTW{KTKyxhk=Or0BS6@Uq<4MHO4jhH5{ASbWL{=zXyS!f~H*{TNrF$2%WMTeGXa>i+Z`@jF2lFAm1|qVUg6 z>Q1iEzwg%AG(DaXyCiVMTem^4{_Q)@Lzv`denej3Gag>gFz%2m3$TKRrxU#r3|95Q z`Qm03@5WLm08&WSilpjsez>$TLBpI2GJTcfqR-l>g;@+v1t5jrIuf%UYs`sn{ZFS! z`FW6CnYz+r$B4X@jD(Nq@vO_G2UTNcbQEO@lze|%aDU)&q*d;K9!;qnoEw`VP)Lc@ z9REG@HBPS|1me4nU&bq8v^Y?Dc|4I%tJUsR<>iTPn}p0KKV@dW(gdFu+hUCuBKb}L zwfZC5fkcv4!Qu1rLJzGyKVHR85XHyM4#J$;$(@bPcgAr8gQg914H>;X?h>na3Bovl zLKKEK7&Gxsc-Orz!zk`Z9%dHJG`Np9p736l++!=D0OPe7r+i1^Ai0qTuJA1r+rLpt zf$16f7#RpzIhYBg`rrBk7pf5H~>9!`J{Yk3)LW(&gcI7O(8swDxk#atNZ zk!Hg%^AU17>F{~*u6ccxIgAj@sHv27&b6zQQ-&P!+lu}`z_G<*3q#VWTKeNfpokFo z-*FvmQ_fa5w4(**@|Q;{j<+S@G#V5zkEQh&+$%(}#PphSTduJD-rml+8G;!tDaWKU zWG$D|Ku5zAmyhQst?{{1h>aZ!_mS66!A!F7-n`?3t%-~2#-pokEdFzKdzAz<2N4>Z z?dT2%VE+MX#FJ_Nnykz?YI>A72tY0##;sAkvp*c^6i0ViUkcH&+ncc67Mgi~l%5uM zMc2LFOTF>D5|si)HTo8-VewdRj}_LgiZc;0anVB;b0XKyE(CN&Q*>G#DCOL4w=(_N zi_>s2JzMgt)V&f6Y{g9-`C`#L-uqie5ihzUmqlm_fMw@qVYiYS73bU}Gs;rkd{})u z3I9LgoPet>5FaQjx5s7b)h|7=(wb?Zt6(++Z;16KHb?HcwQcwoo>5^e`_|nVVlZs8 z)j6P0BKFHYNc=WmjKz!%n5@o&vI{#v?tbvNMl^pV&C3L?kMxe5shYDI)id4>Mv%q|py0(8)hf&COh= z?#wQ?8!9yTUmj+PRa8VszJ1|t`O-T)uf!I*Yz_W}#yT}OAttIr60m^orbq;SQJd4i9bJmNQO)>_!J*InHsg1D3 znuQA({EP|kFE6`Oe1rEbJ2oa9wMShjpI>b_8vPS}X^?#h`3pw0tA^>fgg21LHb+?1mUW^j`s;OP&xxUAr!3{#F7AR?EVgzo~TCqSKlQLO(LbhRZP zugmXGQjmai4&7W`4dSi|drj0k;_Op3m<0v~FcIpGlgtGW#lRfY%DlAbQa<0{COLb( zKK7PA-m_}H9erf20`rZyZpYhaD0g<*t2gdFc;@)hZUljkANIW)EJ{*hK-%47;Kwkcf^7zwZ|$Wi6K%!rad8vz2r|Qc9y@{mNnK4#ByBn#ebd(Pcu8jZ+Ba{Ra>h zSOqC=v7aN7QW@O6!)t5yDm9-#qO|ww@Q0|YlFx2U5tCM18Z~Q9a!i{2GwRU-%B79I zWQzU~9TxoZIQRA%bpN&R0kf)+X!(zUodjl~f54oFXOHqDF*6%rEYHYBZZa+c&Fkgq zJpdf&wVAlO9Arh6)5hUCDT6vbzK za4l^fgOwBRS3ByHV+U3CLKe;}Y+Xs_%^^zF?A|=N2Fv+uPxPCgWWDq)@!G$c7X<9sjmSrN95NubBzwh@ z-?R92D*uY!`Nygz$s&mVW(-UgHL`%RKouid3nMAe;4sgZ2zWm09-8T7wzpW)zMYmH z@wk=@z~}1IS5k`g+sq!%52rz?kib2?g#uv0H>jxSu-EIP<-q&*=0t9B8h^pwA2Vny zqc%G|F>~;OKLkuC{S~LufEY=Eq;oIC{}V~acTKGI1yah-kDVKxvh~eq%CxF}R@QU{87=|-7Ry!heRYa=(2 zv>?=^R06QOvk?mncQd76M?=$ZZq{47M3^~U=1*mrsHH5FuSFJ)-P`;%8_C09bSN8u z%QH5ER_j!q)23;J)eH)x5w(?wp0YH4J8XTnCnJWoO4TtG8ibL%QNaKcw_}dSVO96i z__XVjh0>;xw(wQcc&2^`1s`!j6NZ*yX?bl8fhwzdmOgwkLd$`|Rx+{UK~lOE4A zIf{q}>h3J!HCS#}N?uiG^oh~pC)P2#*PxD_8Pxy@GXc;va(fP&UfVYZ;-{6FyV_Kr zAS4W?I%ReEhjDHV*qF7@as5Q|nE!8Jr;3&4ABVu99AxWi)L^beCyPqwMAr=tVw9B) z9xfo2oUO{(AAJM@bWAi3byKoozj}IFAAGUmzWn&Sz2&@Eq)%;JI~lZOETG4fJvR7k zIYNHbKw_l=)ax-e?DH2V9k^nGT8oPttm*X+*dadwaR?#=Cqc!l6_a{&+_6E z8JyC~w-o1ShiNcM->N9Nbij2y9c1fGX!TIGw*r$RWWCbp+(|&eFtmw|=b+hT4%_1^ zM0@9W+FWOd(})%-RlPOrjKfpTi%Wk%0AWK1ZfSE7dHf9a%U;zuKpMM+h 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

    }!#koW1%9P321hONiOkGA$>$ca=4CF4Rw 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 z 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 LNkvXXu0mjfKpbq2 literal 72636 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 DRmrlB diff --git a/zh/userguide/images/ide_image.png b/zh/userguide/images/ide_image.png deleted file mode 100755 index 889b19734a0f66effe4547be3ad8c68b084d2ac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260638 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

0@n$^K#+>j!Q!%p*C#@%V}I zd*fRrLAgcGB*0p{uP-}lgX6z&1n_h_{s4h1h{ay>?I^WQ?sX_`*4X-k3em7EX@;kb zYkh}l7k&3*L#!e?CjpAj&M`mLX0n6<)xflJUOQ|o{5R7-V_sm*6C?Qh$Gq9l!S}!R z&8l?RUoU>f-c%!;D|wp z_HR@#53r&__+ptl%f<}8ZSC{6n})OS9-{yl*}3&H3FfX%Cd-YKSGXQd&{5nmG4APN zq6#mPQ{T)a)X(dp>Sl3SLvQ^)T2&yG-h6bU*Z=NB+tCQY=x%@7YjEuP4Un zM=f)D?IQk??1nl-TCKb0$WG0u=Ez}gUNTn+xUsd6TlozymYDOUSL}UdNSswN=L4(q za;k|PLYzfQ?*5KzC$Wfox_zi(&!3v1f6ivhJlXMrH?w7?1yDMZwI@gls^45rwX|&Z z)ljy9gcwV(EY=$p=gWNR6t+iYI!C1%Y8|&Z4`f~%kLJMvYQp^j#*vYniv7Iyf43En z7JFzLY@Obz&+Gwlg^3E~T%Y;$by?(S3sKoHFlxj+r6_n{M;?0LzLYFV$g|>GN>Pam zK|tCMe+e!DGtGC=3k2NiPHqjANp|DDoG5Man%&C|pvH>X8z(*}7gnbdYQ-tZdloj= zKGHA8UrRv3cKt@;=|$Dfb*sC*pEc{zj?eSIlm7%7In%LpM$h8zfC*l+HD~nXW1nxw zEDJy#<$XakdT_ixI^nlE)IM_4!m|47*nHFRF%M|-0gFI&)Zo%;lUC7?EHGN50{+(VtC#{`g|-B9LH$cup)C!$e%f|7!G)~Dze%?r2n9s zGs<*kkYNFCu6Aq>nfr3&ml|D9=s5LV`lS(?mseX2u)F16@)^FN?x8rjxR5$Na2Ty# z@o;?oJ9{udZ>jX(LgNsYGOjnRYSXWmvRRsjKY@>hzZ0Z-^G9XB*69;0;lB9N3Tfv7 zDgGK^z?M=0ZkB7b2(rPuC_Z*J)P0_HbAhqf^7;(euD|-O%lK(p1NZ7iw+rSoAq)%> zz2+jjeAg2BVOIwsrg4pX7-W*2R2EA$sT%zecQbPzKcTw5E>v+RZC?gVz<#J`KAobT z(*9AOb^M5P=U}AC``B)6ZB6C~fhF`Of#N~X)o>@cSF^oV{oft8fz7_fF{<(M{b*`V z#!VSuH+Q&a8b4&x|Jn9N8LXoS2~jhu+v3@i-L{D%Z{ayey0*dGU z>QVUkW+_n@n!3(t{ua6-K@}yr88Rea;IucLc$ta9i$K5a_5;mJ=I-O(g-&B;jQbk} zz17zW$$RJQ3gEF7Sp4k~f29$mIl`J2lj@HG?jrJ`-%aN=(+aFEIUQt#EZAA;TH!sU zxNKViRntEB~G1VaGW9n8=W&nYNQ(4L+c$+drNS@?JFJ zb;i+fi(#k+Vo^+Fe-}h{#B5hzg zqvb6n4T))xljkXCo!204T4v|jlXOe{Sln6{9jTs)&JS@-eR{iDOM=wfDQ{e}M=Hv1 z7jg3VE+l4f|JGR3aG=nxbA+BYnSftp_Ki5!+Wolz-7)!{Id;_B&_=ThKc>y>lY`3t zNy)FQT73A-afx=^P<9oz;&%N@?T=J|fTwK!PY56N=qmf2TVTIpYSKYr-9 zEEm}r&uIqPC`hl&-}WQlO!fH{qkeV7t@pMxY=x{0cf4s2BdXXd6a6@2V6IB+=esB9 zs{YuV_BY&iq%Db(er{Ni4U$s8N}c-(uW#H+u6lIg8dFYTNT$qQ^-j=x+5_FuKw%U$ zqcxS{hoIVu_8+waZ3D;=Er|T}`Qoj~__K!lEd_5|C0H}>UW5XC7S$B@u+#fnr>dLC z)dl9CGke{UqdtX`vF49F;?&JMFi_Je2&sWWF|;^>i8F{;s31 ztQ@bh`wC!QBuGEk)?M{NPz2tc{3HAgr-)$ZE% zmmTnk#?~1{l;yID8aCk9XL{@7n_R@?-(5q@3&)z%YknnIX~*l)kSz(dvifwaEDj6u z?&%Fb)*Fd6^#GWDAGkxSnbJ2mjoS2tt2Lf z&yO1pG_U-<6}y<;yH`4zNx={(%=Myft$AavYjQf_&4ml{$o2lko*j3iy^y4j&uu6& zFY$U@q2prg@Tz7NmSk$U%#~!CzpMn*Yo4a0X!LqWIzg4yOu3E_h+&$B9Fk;8QJ}7w zgeB#?5Jc(xy9uKS0oeRq{b^shEQpWYnkn-P2K=6w$C$i`3jM6%s8R{e zL^sW{^5w=8=_9XNIa$|z5BMozDqy%ip2nVH?&)dNbx+H-3+~(+H$8N6KmR%R7POM8 zBUtT!Eu1w_id^c5oQ1F9LEtxekkjgfKqgIRI{I#r@z#5%g1)tFKi|6-6h#;8ZRzS1 zzTefSw?jB#HF(u)UIF@T4XudhF8dzG;gZ+O-|g9v356%atjUUAgXp9NTLJo~ey}B1 z(zX8S$kOJklDARWP+Ymcr>TBgkq^5PsIrnvclqDeQ&j&uM9?~-bDzI)RJ(EEIS9Ai zX556kT9P+$)z|*-QKVx|#c;0i7@>Cv5pbQhv@%nL;ZQWk3>^|7oLWk?ggb0f$R31d zQghAHbXW$|!f=z{Pt0Rlyk}r^1HrE6Rw3W__UDqnSKi+sh7n9@n80)!!SYO!hDyjS zelUq}(R1pn{7VG-QXh0`D*Ka*gyzWEBQFb^-C2egp}al)F*y-q0thqnl{3AF(Ab@B z6$PW=rmk~FmYkdg^aJA)1Ipxr15yJ&>QSN(lnPy6yTOaOrh-> zUj=crP_=lTnr5T&(Abb;ZWKt4xL0;F1nhx;WrmQh}7_t(_`l z+3#SJ(?GWZe$s#2ki+I(%>Oi))}#^eak;QL;a0h4yGh|?P@eSh4}UxCbw=(Q7Ezcf zLgUfkk-$vsI`dO8UR6-|-VHl!Ad9(h=@sXerr*Q8=UBBHG#%#rbJTHj#=EUsQZxzf zWv*T7om|1V-&QkH?8x}7+FQ)gM0PbldmnuexxHB|S(maUjVUD!7q6c~5#;#IKCsY{ zSlu{mA;i>v3L2V+IviH9F%qzBr4HN=&9%$T$TdYYgKoA2r?Rx5k9{vGfYLON;Cb=)H~5d>8(vA@sN=u?}vPlgji!W+017^zVi|CoW*@W7zR z%MS<9u4TR9U_Q{oJmcg2qEHsA+QAa@65c!AWc2m1AL{h+=z4OyhT4}<&K3$AkJcrP zjo5)MhND@wM94Mr7C=v@>Q)S>u!&xNv!qC zx?{yidS!xE=L4|FMGD*mBxB@;Yo~GRpJQ0wYEBZSBWLaHE zhS@mPchQa4^k6ZH7)i|1@f-IGX2)pFN5RB<2GVL9-$0LJ+7vcqAE=X`bdI?esU!vxI;X7){b-ISGB$4Tvqy|wA`Rc4NyVi6< zoTcOVvo#U#Ujo>RDB=Xe4&aJ4t`4YBI%hune8~Xel_a_s`W`2t%GlrzE~jHa6x1@8 z|EF)CD1q7GLIXgx9Du@2!<^0VLzk;z>|`z9%V|*XYwx|o63Bi#y(dKkzbe2(-QZ29 zR`c5fxH3!Rdw*Jmz1~cxuH$WjxaMou;2?0PgJvpW~L!eeuWu|1tPRyN|K`B)r;sm1G5;EM8IZ+ZJ+{7+O-Xxm0;aTYL9OKz6J^{PyfpX7S++i+4N{ z-7krC?aF2Rl*VGMKC5%oCoGZh9(~>wkwS5s?>H(=g=qDFB9gS`QA~`o7?~w!i zP3LLwrajcyyFci(OQRLh$0xmb{8KE@5K{#wuMuMJ`x?kuDP!abKl{b8#z?L(inj8| zYTa@pRujkYR3GX%3T4?ESx5OjX}3k_TznArHKN{Nv2!^N*%sugHk5pNl0Xq%v?w86Ln+)o63cFQgGq56qFCGl{REoob>6sg49^)QaL3*T{{mR*r- zV%FqZcsX5my5wt_RHq6%7pNy8YQ6+!JLT=g7ix=YZ8JytHf>VlkrLKh?hm;K(E!c^ro7lt zyT7T0YFGtpt<=NT$1&!T=GHel`mu`z|amd>RQGd%yQ;a<+RKUa{I8x(x^nN9|R!W(B9B+a+&Fpf>(- z_@NUiSg#R8DlRM}WCIdb7zRBnbPWX5S|Cyrj~GMJ)F7v}N&|&YWHd@VS~E)x%$ruV z4}b0RH0HRY6-ti&p~)*^{<3t$N)e6zmsA1z{0FqRe-_O`W-&9ap!I*f(c;aMp}+1! zYps11!*LAE1V#k_)l+qQj=S_hp!7oBq#w>b*?mOXt7~MG?j*@I_yYher2x&v zV^7%fglbHgtnh%I6wm>)NH@^S?jC{zKj|Im{U;EvFe$gm@W|{2f;UL%haX+2Cy0`L zh$$Ustr{OpOCQ+uYbdiCzbJJ!pd8mJCL10;a4TZ7nB6-27a%q&Qf>2?J$Kqo+}*ht zv?BqaTYZerJP$Hr_1#EhPz|cG25>?w4B&N6pOuc0@cHXkJ>W4NBD|;6W)(V>v%fSD3PTverpj%TUL|oNm47<{S zdayvYAO%n+pPOyDQeD_-Z zncOxWGRwj#aeHT}xG2bB#BO}@V}-%qIe%j}@L}<^f)@#=3v{@APgw4qmq~+Ewt%blvUFjXd238 zRP#k6Q-m~*RXjQWuQTC)Z{hM@p{ma{Z3eR@dvpa5RDDFV^H}z}4nlin_t|B*5~>V3 zq!;Nw>fW}5!Ef4nB?Eo&qIk--TwT2$qKxTEI1RQXuf>GH2_|e?ZeB;2XLmJRxRuj> z6Vb2&fTG3;6G^hZ|6XHO_9q82s0^(&;MNawyT@HJE(jeni&W0^>+CUxqXlX%)};Z!Ja zUPts%ynlg(XK2Hl`xUCjl#>|N6h}SzPWojwIe6Ib_t)UQ@TSW1t>rxF*$;MOu;N)y zY=8ozZY?|fs!#i*MTPC3pDI974d~Cw$;tnNf{zcIk7``j6vObJ z_I`OpO7+4L3qa!Y3JSuSn#6(A0Z^*{A~*!$>4NqoP#QNp=hh1fzsvpSba8g)RsYXo z>dgJ-yxqW~*&NA>WTBZ5(7rfe0}hNS$1Qmj_x`4nC#iL9k5k%g+3c$whx3A~ea`^@ zHcw<{`Qk#kIbcWoCH*+rWH)_YU~SOWqzc2?`1lJto)H*6ui7 z>1w>Y-lLZAvgsKhk;E-{VdcdZ9 zd1L=5+=WKTxA_0Le_89K;Nc+~UFIoPtf5WN11}4*(`eW(V)JPJ6KRlZD;YbXp|`Tn zZz~YX(E%QmoZX$X*KEE80sYK| z`i}=sSI&G+ZZNMv6w=@rXrgL^`K+a1(lSjP6p+WMF$CA01O1Ycu<7dWrGMQMmfjRP zvqfCdM7{#1(V+onL1A@u!fUoyz(23D{Z3p%BjzU>Yx)n*Kw6E5gszAMFSpHfJJ(s8 zRDiVZU2OH6Z4Z2PzD6Vpu{ED9}ohFJ@eDv>_0(>7r2Il`*)Xhy> z`P|ox1TWX#jNA>SQqShbEOqVLIa~SoL(Q)^Mpn+1gUFMg7 zd9X^Y3~sc4Bu1?Z3V3R;{$!VJva#Hw#Ta`p$fWry@@=+9g}5fXO{ZAcM#^pHY)(}3 z+h+}KtdIZXXho-Q{SdUFxx2(Q#PuV#yEIPbYsnWSoVqFTr-(@$l&C^|mgj3bESbG9pidjd4X_4t+I ztMp}h?K$?(Z;tXVC3>O|NxEa^YRULhZ(|sJoo9g|yQH`B%JLax@q~`cK>~*zXe9fH zJ^FP~66VE2712jrafA}fOgplI6g{U`Y#ao2rr`Z8-X;E}i@`v`hH_X9%6q88D&H6u zJsEHxf4W@F#T6GvM)0%j+(*6m>{V3FA6G8ks}|t^cr@&zl~2cK%DCib$pbXhKX`NN zQFUCna0qbAcW?+cBAgr?hN!A@11c+Aw3=buag};O`to&q{5QyhL;f8!y1AUAsja39 zh?o(l>IRr}v~+KyzY0E-#e1(+z} z)(|&W>&XWEKBv|p9X|VuwapK^?RZnLSF+EHwEbmo+CrObTeAq8KZujEn0NfLz&yc# z7lZF6nt(ydx0URV2#U2rW-P3+wuV$%8%74*HO2voAj6F+}MXM+5!b(_mxzXRwz zPEyz39mdA}cTbdOnYCn_clBDx>Ht{#9z3Djx0I3|C$kz@9&Unr8^*@Qe@5B>Uv7df ze6}AoWFssm1wTsaE02Bos2vct@g4|tXX6E%N|^TZ@JNZx7tdx*?VvtR^JTi3@WPp1 zUU(p!2V6}HzR^jhkcdv|OtLm$zIYO|+0qMVo; zv!+&N0lFS{sb+=jq9yBBIX}6|b5z#c+AcIle2r5=q4s<4?3)kiT8ta58)Dnx1XGfT zN+o=~_c!wa=Fi`H?dh3n7V9@OC}jH4NYVv z6D;;WQti@ULcs3OW9hH}i2&~ug1PB{H?0^n8*CV3Vo({Y=tRB{Ud{#$yv#`0)`4L z%@p2{+&$u_*{p91mFy6u&7HYc;a@gfU}c_rCP=n#Y9ReYpWTh2C6B$$11xDUFF^9N zdrJ8qkz+KRl}=0e(?eqP`P{MrM_w-?9hyBL;mR^?;s}KP00A&2oO!U3@F_O5;&1G` zcR>=}>y5gYZrmxz`~$fL$nl(SuOq_3dcTHs17G}?IS2~VuBY39ZGdT3AOMk6SNaGL zs$Z!H25ZuQCiT^ZUxD<9&wcwf+BZ!?wtLSP!lR>UFTEd#{>qqimK@I5b?jDL9O!-# zS{cRQo)U&|UZ+1obi}s4Oh+B13Rv%S%|p2Uw5t6d3-Deh^0u8Q_5;msigZ8h!Q#+? zn{@9fxUJiE?5`^pOYVE#`)_JM!pZJ3V^Y~o9%RV%pbq-smqtW>`?SIsP{CfAA72wn zdY@;>>K@FR$t0TDEVd-B_YjEQJT0JWF5mi@fe|Vw1fp?v-k7J*BJI3m!yE#UZ@~0kVCJrlPRJUw zPvC~?9U|~P^$kZ)l||QI>jn_T0b_So5I2C`58$(aT?KHGO2N?#^|uru`+mtAZySgu zT(gftmQ`I`+BH+TW!6AE1Uy>_cAm5;oo;$QD&__&Y(KsZ)Qlv#&D_qPwK#!$x1{wa z$CLk~zi~Q-FZM6_d(>B2ZG!9JPQzw4w#mP~dQu28YEMD+lP?d{fFl}Egu9>Y{O@`Mg zq`4`!VDtzwv8Fvgzul_BI1(v-2yBmSh&PJA0xB~?-kH7q#EM-!f8Keo6o*6GNvEQOC%dhSvDP1f*~a_|A8YBH9H$bP4{;ar7)I6VbQf&YO9ewsZXx>HuU`5sFW+!_SsF`9 zCY)`Vlsax{Ec)ydFinH_D6>7dB$j+r2y2=QTHnOvjMN(pTMv9ElH=`uds(x2VUTw7 zM{##9VC!$OcMIH=J|4zj*WIfYvT0hHeiOcB==)pc$oUfC3~6s65)cO?=vs#Va(!`l_ z@M@!%u8%s^KTAuKe&n|$z34yrE~NcVz$&v%P8Zo}H?o;zv4Pe4D8tKfGt@3;YqmaS zXCyeG)@em4aVj4c{G+Rp%9Bn8b@`|TB@LyNxZ9fXTbVM# zqeE4}oDJRBMxb;Xf4tv;2Qyd}`qc5pD=a@WZQ`%X&KnZn^$^B>N1N)|vgS`GW^(x%3A^^YsBx6& zLOOW5?;M2Eg`>xJ_QT}>Gh(k>rP+t4CH|K{0DM&IaruZ|>T${PHAosLu=2LwJ_ee2 zzydC7htghr20+7VP*2qPeyY>G;VcBuMC=Bq$|a9~W6pcR9fAEOpLTq=1F&oWNj#$L zs^!RL(N}GQGD%l#7cZ9H^Z6FOXo?8MJTygl#2i=NvrHh(m!PG6Tdk}}BBF3zzQFVt zoaN#qzRHAz}l z87Vua%yZwM91-e-J$sbTInyu z({hZG=3n#p|KBxxbY8#^oetNEJB2~-f47$IM*4oH@te{EZOJ(O+|5}!TaSG?U+BeF z+wOr$3E%TMCv0CGE+2k%psLxl?aCwVgBI;s-!$USG_s~-E<>9#v=+NmR@iF~KT2)u zE`kO?TL&}F4ojF6vTj3p`2vP<=PyvuqBH%|YS=;_W!tff@X{sOAkDkkrK?;1*FR+9 zHu^wQMW(Hh*{Ly`UpQvsQ564e_G}%FMZb8K*{gLZ1wB?&8&i{y%ghGs0c;j)og&;V zazyo382jDDpPmheL5Cx^WUm{uND+=LBQKs^XadEy6s;8_0lBIBG%Pyc?u}UeL}lus zlhB%``-$38MH@JW0!?GL`3_*ydt>oqL)cr5>W zc_v8$(-<3X+c`<#-5D7D*Gkw^9P)6$^t}^UwGgm}xT!usOL(8ueApBX%89fW2E~MGjnSRUnfbAR@?nMW@LO&p$})^-_V{3 zI^Rl2boRVCe>!>5MLh@Zn0RfPZR3B^4?;GPM)CxNfVm7|hgF!Obq;}XHvz(x8r}~+ z%}Cx8g6s};rY2q~qeUJI-?hCH!Y9v57w2-TT_iMHAHm)$jzrh|LTHu-!EXl=6G@g@o&140_-TV;E)vBYj_#>H%5@&U+KH;uE`bLLkI zB;od8@wk3d@nsU@6v@tP+&PooYT#(~=f>|~q!Ib4_SC@+7Vv>;sK~0hk@lZPDy{RY zhYGDCB%2QY8ZeUr#(fP9jk>zJpLqmHL_eMh0Pu%`g2K+DqnEivxv$w?mW?q9PVl)1 zxl0n^0Qr!_t#oEldEaw+FGcSuZ0ArQ$6q-E2Hj(QmIFlRW?>Ij@7#(Q6=BK-j!HA% zx-g#@w?`KKa*)_~6JC#{8HffTZUatnz_X{Ifc-aa0tUbX1|S|D79t$$h)Si5-?Ox* z*>6RBU#1OBBHe#}Z%(;T_Z29C?tkZ3N+@#Nfxm!@oY{EJrD4>yX-pREj(Dx)X>@oz zi7OPsQ-Lbz>lO=nDd{yD5-=Ur~rf4PT;bh ztPkL{Rjkx-CYn8c_EsxnATsyvcX(@)Gw?%Cm(4msU;jM*Zf0Jaxd5NiuCf)K8|8_| z_!RF=Ny_jC3v(Sr0*$pSYsjHYb=rGF=l*?(O;g6|nLuxht+G+jACjlMDi83nT$@7o zipn1z{YIz3q}C=0EzIz86^nqz*@lRqncqqa%ugwalSh@k2vT89>bRcvsb@E6{L3g* zZ`BjdW}dWmmBdI`^nU6k_?#TR+w_2dPB2!4h7q)#*&h6vU>XUJpt;yH47^9?=UJK6A9+}67>cCVXDj%l68o(e zeHsA?vuWWqBGi>mn_GI z#M1`>;l_q0PWlOekrPF};>WTXN142Nvo2nO$zW4=;8f&R*6k=F_m=x&$c~&k$;(T_dNNQWmy}6TkDwR+`?Rdo6fSHq5)?rkV$cY00z( z0jShS=8I~_%%@IQ7#N&y z+ML=6fbjZ-Z{44;3LlEgI`$adp2G#=WL;e8weDd@KCW7K-{eV@#GC%+TPqRY1uWBe zw$m_Fc}~QVRc#`i3vloqSM@k1J5I_VK-obcENic`mL2lz5h?P{dxZ6!yO+P$SR9n> zdtx1r+oY@l0h>DOhqn7~&Dn2J*PeITR?y{SSErw;gYZWG^U%UTS`-;)UCR44EHHotDSK7vRu@& zg_BrIyllK=46=vF3&~GL?onAw6u%5j|zV?zzP1XrLBq7u`#;Y5}{|_Z$g=LQqEC=9O6FNH`j7a~>rbTI7+?<;< z6!TNZd&ErN>06qL(j4*`W%K;r9;0kx%lm@w*4h4&9DFu5zUnG{Vy>~BKVTc>lT8V& z?NPlt?F%fp+SufnqAe1^emQd~aE8Xl(uFLRkXZS|_&i zHamNu(E%l55vX?p zaz7yO?pZ(>7jiGWYnJj z0ruxQLX1e#`$Qm z$;9+DLiy4Sxega|J{A@R{fgv6R|VMKznUP8ch2*VmzzsL4AwR{P|f!ArUp72L7U|-O*YuA^+&8 zvOmkvs8#Gw&kgZQB8%nYwO_}pq&v6{x@WXPG0r(P(GMvd@_Kfmg+QBzom`=L#KfGi zo?+W9rlkQ56dPKxdcP5JKY2-zFf*nsP_@|=*ALnhl39Hu zmHQ03!tnwXO%e8E1)ASr^fgx~EOUvSH?iiY7|~vZI7xbcM6xX3`ojqh1UyAQ@5xMc zJP-m3M}mR`BxFoMEs&@iV#b;hqb$;&aU~8E_T8F>D{EY(SwKO1>^&LVz8u%GQXN_6 zoxU*TUZ7ERDGB%>Ic8wMQZCBa_6Fx!vNs1={Oh|#HAZ&MWxa1EZ4fCB-Q@IY!y&za zw<#OGpTp%DG2{da%e>~;v>4UClr}fR*`RI+rE`1E;PYbUXHXkwzHKBtWjF`k7; z+!sYN^jsB(@I^gLN}}Xxd2=2-KSFTPa+}>eE@!k&iuB{YF2ZHWiFT9T-DzRr_*o-P zUn0Rdfox`_pc1^KZ(309j+Z@YSjxdKZMS@gF1EEN0co1{H|DezP#nFjHYgSb(<>FO@7C3-ksr{DgsKLitpe*oG zx(zYL4%%rsL(cA`5_PjI)+J6l53S^0G~)6P`YbQDnVf}2BQKog4U4HV4O%+P4}B^2 zl)wro5s|Zw$BXnn((P?kG8-L&ej*ji9ZOQ2*nAEOXPvXR7R#X~9z7zBtPb)lDr=WE zw@3u+#Eiys7{wa+!<6b-bjDv6xM|jQmOF2&T<>7F z(b8aKkA8q^w^?#MY;lw*GzHOZnfo!B6J*9mRa@;n$wA%d7+7U33Wn3)7v%5;tT;F| zqe!0VXKa@5`K;vlrM0RWFL>Yk+#wo2+^vn9Z{?ghuKJ0b4lL2H$9C~-h-5#$queTQ zml;{+gstt#+)5MU@<-Z2ct9CoX$a2}>zsH}X`T50!_(0Ao z$B6?RvKP%=VXw6y^C%wdp(h6?U9WwdK5#?6^1SS`=XI& ziq0jwX>_g7TmR@~_3fk|>j0^b&w&$B&SJ6V!=Had<1N(F_&SOY^~RY(`$;30J~Q6e zY7Zb-m@Av3!7@Szf|*r_m2hO6jD+rY?Vzi3t&Z@!@D z_Io`|-+OeYU6RbmP8-wHuF~|zHFMAoY_PeWIp*+7Pt{rF=BCy3Nuqhn(6wd+&c8=n zQ2G(j{O!P<4hZHf592_8 zHlPRV$5N}lBtHXjD?Uppp*er~;%%5b&Xb%2SE*$@+0y(XDX!$gHHcbRaV`bJz*DMe{BkSC2e-)_$(5IsIi~leCM--*D>pXq zZpA+AcG>mL4Td>?(tGH{@|}=4>(e7b(-#Bxx3LXZN8n-mH4Fdat{aEDm#t`Ud+j^c+1^y&iYkJYLljx0Rv#Rr`QG+O8on!Z_ZNU%P1TP2ZPFRZDVt zJ-y_&^wsYfDR|V!f$nnr&SmSwhGA^9^%SH1{*z4glTo@nc>Ro9(`Z+J7u%B#nkRZW#&qCNR{T z>ODVs6>#d~k_~#(o;b*+7(}KUM$Rf6hFQ?o&yaYyrVbR zUEkuP=pq!L0jwTy$p+z>yPgHf4x|VrvoAZuRKlXRarF2*Q<(%aig2d% zc}*WUI_Hf)WT1S>L*-^6fX@}o&F8=+pv-4&L1n?`fT52w4vaOe%61ptG*h}kk9egT zXRw)XrdhByTMhQ3(_jj+5T|N{75|KR`QUSz4t-59zl&-u<*Dwm7gkMu*cBJ7*$hJ8 zBQU(staBsfW!`K}<3%p68(>hJBQZyq{VHzGiKb{2@-)=t`!pdztoVob|981#nc6hF z%;uZ3r77wcN9OHv8sqRMa6QB$ThHC!*-@y#vB@p7PU%;&SbArave(aPi3`jZ1jHu* zg!?3#)qrhM^g*IjGNqhkf|6`$=k2~o;T$VRBv&aP>M&v2V>PW`bVf6!tfoK6@m*ra zCv}>x0xp{8j)hg@1ojde{GZVUBJ6{+(ea)_h3E5L_M*7JluLt3aLtC|OyJi-!;gbB zSQ0BV6zYCteO+6&=KtyVR3e)t8TfIDE;Q=D@vtHkp8@0BwxP~ zTi2sgJczX?66B^C|E*&8oBvS;g&_-imwUf<-?y1;#yFsaw&R`wbh6`5cgKAHm?~@~ z$Bl;7IXIt8Yss>&H~QRMa(jPF5EFaE4yu*ggD#QHXhM;z<>>suciNJgrTP^O>1W_U zLm=6$2X*>Vo+WE8i&8s0b&!a0e94kHz@0LKg~9l{myZjl;+BGMH-Y=mE_2r7+M_d-C(ClL5<4AJe^hEdc%O4!g zUvVu4X0znRbVhsi#Okw(jMRlq>@B-F)z$w>ka_r7Zt2XK+uMK>{9n-b-|--L+OI8x zU46TzbMaOK=snRL@}y2PjFLEygy&Rk5mG+Kb56GIio)5JXPbm{s|n$huO}`Mf*Q3X z`|Y8fME10#;atS{L5}M<#rr7It!jLJ%?BNRQ6|MN6mLIe0I!X z)D6fnj-1$Ut?FmFC}~(Z^M_jrn=>7WThwb0+`ex5Gt&%$67T<5sy@Il(Ha4pof$(1 zmIBury83hpyy|X8I?uh$cN6AKrcP*|WPqmFqCU%MgZL)2U;f`^75HO@(0>*p|J@e#7-eu9;iG=fv3m3TY~_cHg5o! zylc2b-et}|5DPR)-|~`~s0M?TwtCYYD4A}{Z7%G*;5F_d;x{x=C(k|A$ez##Ob>eW zXEx8DDK;SLr)i9Lfk9p+$nw$JCEeqUwaIIHnvBu)|4yHOM^IQVD_T#$JnlxZGG_z> zdagr?|A&pB;2OseJU!}tr9&TL;m!cGPoIM#(Omdn%#p@R<+eurutdErv8w~S&c<<( zfNgB*racNQC?vtk%qFgHSSH4I+|Bp|+OPZJhj8Hvp?Bb>?~J{1AJkSwW7TvX_CEj# za7DjnTc4}wTX$1aQ={wPZ0J$T<%y$DE<0C+8+Gb@HPYsltGb-HI&gBwMskJl+VZDM z5?)=dGsYqj>hoHG@T`$eXF5)yz*&7I>69qT9k@WD`@?m+HqIN8O=^3bt||Au4ZTW-x`y{j%?cJRjOdT5lezs*cz%NeDh^{G)3V~d#$9IuO?otO8aiddG{ zBA+Wd`q^a9stwhHYC}M-wFE_9hRWxL{Is@f#G8j9|BnUWHyY-q(0Rj|{Fz!I8KqE> z+P~#4ey|v)lgsmI!`$yv0*sb1RP8x<0~YG}+FfV@8$J2!lxSUU|9|J>ze5r~Mhh*9 z81ETc2E#f)T^GL@c>Wz&lf2{t@ph#v$%^sOtI3q31AT~8ipSb=UyHu{w4m}S*~?+( zy;WYZTz9R$qa0YWgs-8Jpgk2LY?^e@H@poh^};8E=K4wv&zG`HWPhof1)Pe;_bzDIVy_52H-zK=44Uq%RCq?_PjVfaju zfN@S6zuYDEZ|w^mu!38Y>!sABqpg(s?0o3#2_G$(ZJgaPfG1%Y-goP=iLe~eNc+^l zY^J%Z$mwd!OAW4BPU-L+p;cEFdOwW%4Ptd2W(1GT$y>r>IsYGarDgx+3;*70qxIl~ z_4f8k)|Yw%@#8c_2j5rW5*?BEnLk079D~tG+K=AzhREx$J=Wt~=Fs}eWG3y2{g@cmGmzkD)HFEQmgi<*AnVlLB>NqDpG&AA?bq2U$OzeB zPjMdM}CVDJ(ntDfWp}dLoQgy$4suw*SyQGfPO2Kx#tg za`ucZ+Udv6$+R*H!pr}E8@`~RcnAQiZzQ;!YO~;C*|WT*Pb)}QiXE`dSG62CYK^d~ zJeWDveop8Y1xk^MX?`hX$o2glKO)YP@uFrLsqflU zFR9~aY9l=8olZ0;EV<9_FVv(Rh?&n!rX1&chG3u+t5~s|=guwTOp}w_RAK6Yp=0>d z$AA71il>kBaa3d|_U*mta($9x_-f_X^h1U)*!Rm{VV`RcpZwpI1E_Nq*@}{MfF}b0 zn*ht8H9s|g2bztC+tgOTy`wyXFpya9vOBb|$=j2@!!;IL5& zr<}M;XvduQG2T}vc0^>Tp-v4Zp{tFQu+LfMiVMmHOS$O-u5K?<=Uvc>)~fX|6lDNt7WRfXWHplAnm39|EFA=2;SiA)!+MuLxDe?Ia#&w zk~~2fYp}+oQ#-yJBcDj%gRzW9Ca65sSYO|G&^orSHjSf(2)XglNSoW7Gx05l7+2vL zQ{tpJr5e-2A2XKkSh>6r3}XhX#z=|ePi{w<7Jx@ah2b4wa66?S zX_6NTsOpGY-o<;2$jzgH`}xCze(ZXLVrV{g)m_i~mbJQZ;ozRnZ)EMkz~QKOI`whn zIMYpHT%KcsLys*b&Z>uKW&8jn~yZfx!E`unh10%+iG@pM_%H_Q;M{5`7@C%zeX)q{-G1$M%fDUX&^0|IUDy zBtYxbb7mIoS)v$4Q+hkGDzGXuCA^b|l*)`bN%cFK4&}g?s{PbbUnxo^2USM9792ig zEyGUewNX+&2mR!A9~d>_Q!mGoyWt+d_OnI*#^6p9|I6PEEV!0lT~7NNKccjkvy<_s)Ru z759$=XB>r=c~1uCio~sMoh@v1F{7LkBcpX43o6Cn=g}1}bK7wr4oLmk7WMrC(kvW5 zuP9$BHAiv$ZF+q$SKo5ITgqkDlJ<`66&sm!mGXAU-5ZQ#-NUtL-5_-VzlPTCZ(cc8 zYHE!1TWGCNFqEhkU}z~3uWkGY^efNOL^qbG4Rs?G!ragJrA?027MGfs8hlt~hp%K_ zpwb?sNS%Po;;7vp z+;wBhWH?=bw`aj{a?6S538#?j8L#*11!Z$CB1oFFI7jTkO?F__k^h*OQTuvdn@Dk> zO{-vWW*SO~RLX~@!;Bb@G^^W8hm-P84G6dVJ~KTnT;n_F^nD1q9K+{YJ5p}9rDxS5 z3&y<)ltgn^&$xH;B4eq)kV9&atv63J=mppFIZHh`)i3m*s`xXn#xdQL<)>1t=2lcO z^UwH)KFB8)l1SBv*p8mtL;r4>k1M6*xju1_v(m+qLm2e5Tsum2XyNF!^sRB%7*M=> zGNH*22{Cfc09{a5}XDtTrt&`41GazOY0Do z)K4IvB(z6Q5N#tzOHIkpUHFIYI5AH$JqkW=u0(>&!QMCtor3?O(lAAf2* z3W9KWd{j@!5Aqv)R#Mf_i5w1-0aDfd}iKwmIHd|1f0Bw0Wiqp#oS!pPk8|M4+i{qw7%13zojE*KA+xAspr# z{81$84{`KH^^TwINT}6#Hk{5nXGI}8r@CSKFS86(?2{+-9qpQ;SV;!#+D{Q8SV)t; z8&lKx#GA4!lYOb9l4$$Y=P*>*m_Rg>8A8F7Y(i9YOaK@!-!IaR)ObKhrw+hItKE@V z{+F|5ZyREd0uX+JA|k{wDO)~#2L}6~P@l8KLI0wH%|2Z!pBcOKF)ub}X*brVt7epX zFOI+5uh)(FM>>Oo6y6e)zx%wx=C-<7CBQN(JNBABXlvI zbO6ej;i+QL%;Rbb_SdR}-H80Ax??XXykM=}*Lacx56Q;LL*NV)er2xm#Ot+;P;e1j*XpXMRn zbBstQ?n=ACi4Lb+wzS8pG717)GJsCgnPx(wE zapx>4S`(?XX*$p#y{JA^W;vwYzFy%*Z}HoW(yefHy7mL|$rETyZkZD{uHec4qTMkK zqMV$XCZiSv6OVO$0l4sEF`MFbQIyCe(`*gbwD7Bot#jQcrR(l5iUzFGBmSoMOQi>= zHLdZ3Tj0e-<3SWT%Q=w81yq3M$c#8* zjRb{(R@=$6wk)@uP8(-d6`4uci@rin%$I|2w@fefk2rEIg$a*Bt1!{cq8uuHbPic( z9~Y(Z*4$?GyQO$<;!dNpNG?wV2; zZ$_jLG;{%1yoUPUmt~}+q6+lNK7Nx9yuurdYl+1z_-fZVli*;Orlp@T=AtfnkomPD zSgJG-%86^R+OI`lCz_(Yrj=`hOf{_1l46n0(~Px^P6c|j>D6_ zmr$n>iR;<)qVBh9k-k4@8GX=^AoFfDUUbjADL5I9-8lUU)$}&KR#R2vw)86(cu*p4 zVGv^Sz|)m`Z_zsTgJjni3C}^f-Y7cp3`h?PP#9#Saz!AQsl8O3xQLdn~ z*^*H9_uo`v2{jq5b+>NP#r{8NOJ@+qyuR5|k=x4`f@)K{y(6I$?e%&kYaev1v{*(d z-?Jhej@mNCwEC9>t3S@RIy^ysye6c3B;mHkIG2gz^5luv`W<<6;>-pApjkj8Cieq* zO4o%KC?8~u8geO4w{bwQ#`Pl51z}NnGMT{YvL%7+P|l>3>F|gKZyWmjUqt;}e&*R# zLU<4_Bb)L^naR8$b*iFc-Fjqx!WsE`R7pfq`O}t(PFK2~KHSNVMtWE*iT%O@uaf)N zU-6W#*Il>O#^3xYjl-Waj_O-OH~w4^c}I@UW^-y}l33_)*;rWdY`ofSt&m&J{2RvP z_S|yd4d#cplXo(s{acpnML1OK4QkS0O>!Px{qEA;t%|DW#Ot-jh#$E0Qdly{wezgI zmd1XPD?RqeoQUj)W*b}i2Xd#gZinJ%hjEHqqXIfsUGK(zC;%1nTBil^GTES4&pKwR zt*E6zqOn$q5l|otd>DIeBnRqJ1G(RND<&h*ja7zZmtZcJ)LWyR^(o|)^F7}j53KtL z9!zAZ-@6t`9y0QXkF0^L=uc@v)_6}xvMjO!MvktMP{gI+=G4}xP=kAPsKudQNDLge zRP`aAIGq3vt9d}i7BVSNcAaZq+}M)u=e6?s%@i#g_wu`}^-^Avn|0oc-o)}zNV{y8R`$~<+IvG4RevtX zRKg}32IdC~wNgoVB2 zxwW>qz0X*AKb>TL!dB3JRe&i+f4| z3`CzE8O+)Ntvjw0N;!g=NZEE9<#&aJV${Wpb6_N%1g$*uR(prk4nYCV549O>G-b3j|;~KW(xTgLk1y^d{{11 zs?vitfh2u)y}?3}5q;aYbr`nPk{`MC5_4hXykOiujPPl11ThnkDFRd;KV*0$ zyLqNoDPHqI|C?PjLVhB~qD%eZ&@8u2v801LO5V0pJPAVXLVRp$NQ(;vuIkq>`oiyM zHqx1?G4TY@+<&<3-qZ6AH-Y_WVJpAodl*8Jsk6SK+uE`I@wL>ti#GI6o!F0;|8(pn z=6{`Tc)?rkv|-xP_z`n>*q_S3W8o|RMz{~5L`p#B>>x)G(2DC0lZAhK``%)`pCV?^ zdAS~;KYo{PFBKTDX?ZyD;_3h7Ujhakn`hn+w}J9zR_`Ft{Vg$<1dG2Bkc#||6tV`k z^nk?C=nbHRRp6apW+ju4nPJ7KM^Wm8mHNLak`A!;XY?lSay7T5dD`U;2=xTico3$j{`XQaYer4kOa3fXxl$`Wf~Ww}BnocoRnTGb)k zCu*OCH)H)<*aZ#RUq?+?bD(CI+`fR%I*kfT^k2%!%M4#T@LxQ@%Crix*xI#fLTF2i z$F3k-SJHws7#Jj*F%47X7>GJ+@YDr@EJO|UiJ<*xv*)o^zm%XZl8%12n-5(o@^Dph z4!kz>XRoQl6s8{ZcJuAeBQz88%*Ee|=~y;RS$Xby%^;KY6`bJVUuzcoLN$AtFz&Uko10Sg{e^TEfZHh zwUdzG8iIQW?(S~ENrJl*+`VxN4#6D)3GTtAgFB78Lql+B8kf6s>OJrG-5-}f-9;5u z^zOCyT64@XpV2iT@wyy8F>w}xaEC)FV>3X$ZYvb=MCyH1jAGxOqT|>>r3~|1qUAwI z_aI(&_)&U-mw8~g+4IwL;&cbh>3$h@>3ixC^>qSP3$@2z5Zf5tG;8raM-}!+Ymm4- zCpd=%kVxqO*tx6nmgMIC!vB#2CRslKTgLL3#b+KubW_4`CgRTph%+Ie?vI+7zV>8k zLv%VV%*%X5)7GC$lgoSY_w0bWdz5%7tj9zvqvB4i9G<{J^SXWL&=7K%c8? zG?s7VtI)3<|MSltt!OU*zrxbvOCe8^(UtovQmOz_?Nn%^T#PqIYHvMV^0ndiA4M|8 zS5alXjlQvXe|YWCmno$XdpK%`jEzkZGSm^7k#+EcfTkN|3|<|wj?R>TF(O)m?P8&c zIo=gvpxMSo0$v*l|F7%r7-1EeEUH5eHn7%So+O&Ki>@)ld ztK+sOCMLvzK~_9Gyc7NR?fHG{VUizg8{1bVx$EJB4RTLw;|XMFn8t~Zc7z|c7|^Hx zaE2`WQfAC}pCfNZY);T6i1Gz_Lg9V%>^;-2gODe}61j4D%>@W-Yj1ENeBDVs@QS|C zYvGuRiDhJKQjP+!8QuZ}m5T`}EawrHCZ}m-zR4y>qq%CM(_awf<)0;LY1@i*fYd0j#jyb+4On5Y zM|8UV_UtsBF_}co$j6jq=G&JnBUi?8BGF}$QiJ1(w6dor(pHAzZh?!L4l*LC znN>EFi43^NWjS14!gzAz%nWHa4aEcc*aw{MA@I;ini! zivD(7NhP>#9-I=SFBDhc(*HF^8TQp$&yB!@uU0!;{8auj7BTQeSJ^fZ2Rs73I$`?F zU)S!CY}XS{A`atk%T}5@{CDuu{;KDi4$bKV(03uNN~<%D=K;TMEA|gBu#3uU-fHE7 zSc<(zTL(ymq8QPFLk2kaYcRRB{-;M*__{=)dz>B>t(52S==BVxdD&_(Wzw6MKRcsl zXX7ha%;l(x;h%*^Y^*eHj~Wa*Cdvt?_J8jwVsDjQ=+SQUVFgIgzX<_y5|M#)oTw;N zAlVCO?9dU%e%8dNeH)35i3Difp^`z_9pQ=8_c9bwSC%!-`WM|Nf1CqgtOh6&l1+PG znc}008-gx%!i6|qltgWcp6;3vxV-pvT@PHaCmGk7V4N2kV>a-LNDDnZ_Vv=P`RgHuMnI^TE17-N^@ z^zRH!3%it>_2q^g$@^prA}21KQRglL8AUlDfoV}ssX0ErhMc=t)jDBnJ02Urilm1g z^BAj@wp)REG+P0>ombC&CZnYQ$7m5$4>DRG&sO-HC?1i!ikPXk#D6NlUf_6(aeBV_ zeZ6+TPerT#Vv%WqrkGmZ<rke9s%S?8&3&uX=D|9gHnK#-vKDy5H>phwn7DF7KJ7Z}og zt|2x~Af4;t$DG5CtzFFLrTSOnYH{J$>bO_Ey{Rnnoo|38p^CY;ALKB{&zhR)kt1!9k61KAq9soJ@7Du9 zA%S7x(;Xi&+e0L-4ALI=+Hei8jiw z@G;uf_pasoGn}B6j~EFl1_hUvf40M>wGudIR@DHF%TERxLjrr*Jt%b9FU;xEocKqZ zI^isz_qiJyI#42DQpH0>u$%Mk)x)_egAt1~16fM!B2S9=%FAPMGqb`r8H<4YRvUVZ zSc>DO3oMN6z9Fp#f)u8z&7VI-z7{&G<)_v~v*uTru=*P67zwxhkC++W|1xZ8Y5a8D z*3NF{sDAwQL&~3@3&ii<^Q$|We+s9p1_&Y~Q#!P~z;(YEw35h`yyDAW;AO?7aq;e+ z>rq_=>OX1Sk-C-j@@`G3##L-+)ah#~7Tg;bUqQvVl1366e?vb;aIc3qk9NM2s4qPJ zX1rSXD-9dkWPIPpviwhWdOps}u?Q>fzbTo8@{I991Atx^z>!}_PZ76ZdH?yuG^V+j zv9#iQ^uf)b-U>(kb`Qrg>mRSgm4gLrINR%#2Uh90a_e4S@7e)&bl~v_?Ad^Pq9 zV&pH{q26KhM=j-RY@ez3-t3-UvJtW&n!b%uSLpn_pG&MAEq6fTz(PkoG5($8BiC@Lv zCo_EUI&PR>Ng)I}T{KAm>*s9sbZxlVdHcmTAbHZ1!vXy0u{)L}r>Gbcg<7t5{@;cF zpI3oF8&fg78VUuCKPjeElu2yCAZ+uHqeA8?U@8UR4aix(`y4rZjAy;Gp5)GC)sm2=p&^uDcj6MRSI5%HW7|#2S zy}TeqCR`oq@bYeo-m9fkuinzp?D*NIuZCWxtFuERmh{u`^iA!Hg1f-zTRpEWg7??Z zLfv1Kp?$T*n>>4XS#8{y&hCp?v z0%Jxm=RX0v7sy}i0b)l3=kQ9PBWbX0is$tHe%Y&&RYh;_H;Hw1xnG0-yW)Y@ehCbX zV>+fY1**I*U%h6~_@PjWTM}LZ=OUG!A#z`pT~nf5xKDCvYW4RS#ul{7*IGaab=K1* zfn~sX#i#VCKDgqog?lOpe^^XxImC(o2vOl(BXMvb?-+B7_Q#Hj?rJuu?@?p*>x&jT z3l#6E{U$GP`0ITTfNJFQY_ybG@+HZ2#BM5vz(hQ#n^ABFj;-lX0U$ zJGJ9_;T{Z1jh~qNvIx;yRO~9A8!7j{@RcwfdYwi(gQXktG-MCEkkmjqucDND9eMOq zpGP?fxKxaKeTo?DdvbruPor@JIfqbmE{G;}T!ez*a_{Vv`4Nx|26iq zGh!(-$jVz>G)VB_LaJ`{gqk$M8W2DNQQ9c`>Uhg|zLI;`fzQy}{^s@ykx@YJo7Ytv zcuUuW?}MRX5K9~G!OeUTtRRe>PXsvM|GTZ)j(N#_k2qf3T^)~%@vSRS0`9xW<|3{? zWg6wp$BoPE%F%Z~)Z55NX;m5RXU$!e&j0Jq`zb-ABy>T&9{)8JQhNHPQeRMcF$>s0 zmd~MX366(U8%_E7aTo)C+pYf6k@+*4vh~%^b6_L?)&V8RTP`MPYgD5`TdnVs=Fh!W zJnaa>Uor%!YE4#+|53DOVUvZwZr|;SV`Xhf^Sa9XV!^4|c#{aZ2P{E8;(8Z4WJU)o z%eexLOq&hjh2G#03K11i64^NfAK-}fk5E?_FPdqU=a&kweOyJ*#>PUaO@QbgphXobSOe0|5{2fL*s7h0uD#k$#V^^MTfMc^wIxKQZm86B$>1c|LTo-Hq;R3G@`tKw~ zN#=r8P*zkY&%cC%FWwKV{7Hy-ah(jf98LNrRfiZ=&k#}0eKBZ zO*s|m%T`_@QTN%&4pwE10!~?FrAxhLN(i*|N9fA(#j=PZbwNu%#?08FS#uMm)66KBA^xioeLCMe< zo%NBsiIMBja1K-wFD_gFY{_}HULf&;8iq%y9^ZiMiPK(RWd)-zyhJWAti*xDVvIE9>Q>llpd7v8p-yeFi zzD7>ZuvTT7&*sovB|!w%bEYKXvQ`}p#gQlrII*`-E4^O0O%@d{U8)5THg(aNhJX`w z*oWnnVvg{4zB*5jLc%cG2eqz6?T@%b*-&U&8bM8e0b2F_QSoaHBTgI!ruCOj(yb?z zZDmDiDD-U01Q{!DrHct_8TR(HJbVxKHL$ARlwa+#Y&5tQGHvjHqb}O-DyYwv{ic%C z2Cn=oqGU1q`a|Z^lRO37g>H{z(N$=Ocx27JYcq_X8Q{_Zls(|f z{>R`0HjjTq9-Sr!GK~}sb#=|wF1-J>DE)i0gp~nMk)s3^6G}eBWmi{-zANhhxT`>- z(2)6*@?nF!zCPOwsIE>;rTRO>g>2`+f+kmqH99bWagheuBqJ2RsHTDwa3BExfL1Nb zjH#qFjj*=`*piPjThg+8CwhsFID))=P}Tih7DTsf=_NAaA{uUDOuPzq)yMd7&~V>X z9s4RQxxr-_6}pL(Qo@qlUoQG{m#qhaT1b8NerT41D(*mkA@_FmG}oOEl_l<=uW7un z?b+W8%C_F*K%G|~>Kc`qX{aQy?WV%N`C7678z`D8bQ_{1LJ%hb5Z}LJ<#>(|aIFAH z>KI`-P-|{f2Rt$XnV(3{J_igPQ~#ggrJ!I^9@*ui#!=ahrqzawcsW$uBf66^ug}9z zgNgx{l5^HU-`R{OTlpdWR3shXW7QD#= z!R_}U1+5|f)_~QBUoj%Ny<-QoedkZe#Vb9}p2IcskvWjD)#ReH_K^?H#QbS1D@|UQ zsv={C@x{&%kdu`GeC}H7Y1-ZKoRKPnHvapgdLm&jc6WDoVc@OZ(r=;lp^wf=bywDk|F5Kbz4c|CEf*tbEwx2WzlP{r7g1c4Q=#KeN*C~`m zJ@LtE$G$?~b$d-(h6b{t#oy(bM|LW>AjZSV3_xsJ6dse;Nz2|p#1F8-0M>xhxWL{- zxfUBftNusfT*?%cPoF+Xuw$Da0xmhH9*lpyv22ee>wjwzhg$aRZ(+R4zC{|q=iPKF zLJG#vO{eW`6z-c+c2Ud1zv5P;xX&Fe8D6dMKE=EGnQyltKq_>pV5yl5yM#gNs}15M#GCN#xkgr|UMRqpGxWD~0QTs5?<~C#sFZo9e0T$SzE8kdRVxp{$ECYCfZ{#C`Kn!2Rh8E9 z{BD-;wr@sjIDg>V<#MGlSv7g??DlIL4Sq1K@bjeM6KTomFqBt(^u;6ZC8+91Fk}-M z%uD6*g%%YQYzCP&lH`P?ajLS2<){GF%SyiX`${FZlF(YEuP7Hf*nKWUHspp9V>=s~ z0Ep>dSXQRSg-+uNJ9-GP2k~j=t8tD5^@MhW^V13E%8ab--YO+h>b%jd z>dv$_Vy2Dp5oPBM{Uu}>{4gHJfkUrC8YJwZpBu1KcxUKWWg)rbC{fy$47s>I4r(Pt zG^qC~ibHD1^_M_btc9rU>CRGv+dln$`nz8Z16ulvw!*^$tWD0 z;m}C+d^gL{1*o;&M)%dt3&Y>d8~U;=H_m>-kM(fe=(->t4(!d9sknEF4rqR=&;Ea=YML4c|&@A>o%`7^(=;Jd9s1-1R|;q&d=zA$LJ^RumfeO*{Hp7BTf zK>PcjbHuNNr`eH`ehB2yFlFulp|@<_@OCE>?jus zv^r6xOBL)N23yQ3z3} zy{+lE^(ifUoLM3Z5=7kbo^$N_0qkhEzOM`)_u>#LL2IY3Nk z@}f~%7$L!O`3i&G^o5Vy3{`l?HSD7B`ZOYVB*SGEI=TQOeTFaifabYmG0YX*2m;a@ zLMr87Wc|t+m=+yIrJ5puNIR%jdB}!Okng=%FKZSALt?jRG18 zD!6*xC7l@q@aG5JacnGGVt+D1+TR5Rvfa+%vXeTwNcF!y@*uzVyamSGj7jeIkkwFQ zwT8J4O4`!|;5u%0+4P$D(& zd4X(j9^geF0St=})<_yJ5NZ?t3bB68u7nhFBs>AEnd$?ee6jiJ;9vwG)E|n;^`~`P^JTb-{&DQwnhN8KW26L<*^_Cf;+eM%eZigAAa<3K2PHvH&M?^ zk07x;xfyGs1U*dWj>;h(z?29;LQU5KMPB&axw1Pfqk#_}l~0S$J=l5w=PZdZTtWq@gz`!fv;e!-sQc6rL4k1_V19A+A7o0rU0Me) zDZaVaq6e%0PU}7YQhDMCvFaJ>uRI)d4oEvCUlfxY{N8k+jlE4=7flBUa_PV1f#h4D zcqMBCBnKcM)+q4+^JTTLh2&dGV_ks@^y_cd#-1I2lq z2>h;(W;zyq)wsHQyFW}#^bC8^_$fW`N_Qo3Ao>neDqMD^PjD?eM)xkpyqc??w=dkp zgb*{_PfZ=H(k+zreV(4KDbVovcMcbQzJNqPly`FC^9p|v}oljd#AUrHI0j47u5F+`)8 zJki>U(f1JXv>#<+DdN!N`q?G>gyNO_fJ`u@`>6B4%bx}#L{E^3SHtT0 zZ=+5(M%%)V{T$6Nai}8^saD%#u>Ru~zWQh_$GIEaR;uqWczPrnab65c?6JAWW#=m5 zd(5=j>-)UmvReQF>eM8!Y3v zHWIh;ykX-{XLycE*P174Id;TW%L#cgZ8~*{lH75vY6v$s(-q-<~p(#7#@>S=GJTKrY8cR#El>tu@lgB7@c)my9duS4LQo_g>l2CCUco@)- zI@{tFU`G?BykeRb|)@2uFmcs19+d91Y`A$|j8L%iG*d)mFi z#it=h*d|@v=DiixR!QayO~$^vhQpTYNcd>A)*ZY05YZlaPa54EJHL$t?bua()5V}! z`NjP}6uZOlq<(;pSX>GAWBPh74p*`3X|22dBaFv;XGTYBYzK+Hvn)jR{45qv*k${z z=7{@PQO5nXRP8{_HO&=e25KWkU)hc(n{s3US6-5Dc*b*8`P zSx(TCcRIgtEc0*u&q0=cZQ^HaUwu{P5LQ2<`}vt31&6EPHFj`PSt=zV=mas z90LtHpmDxA)-(Q}kI+8-gt-;UrMj^+U6(sDlq$RCs9sV zdP$x$HWt0}L_Cpc-p_5ALnS)Xa8-B)bH`QLm|a&I>~Q=Hie(AU5su5Uyn={&W^gah z2lP5VUj<#XCyU}M2JN|SP7^G02t~<1_DEM|gU_enE00^WsnFTl-bQU4m8VN*kgtN{ zT||M!J@1K+K))rU@S)Gc!qbfQpN+0j!ryW31{)|H)}CA;cPSz3Z%YIMt+$^dDB?2z z{4svP84IepRq^M4cAmR?>bJEV!34V=-}QNS!) z7rtUsGlv6}^9?qFa5?*0&<@35q;xk;M(BKLbb240*1z~p`6x5HKD zZ}^L};Gyi`r#2=ze!GFc@>hDHrz7fldRih>Q`9S+$Mzw9MV|d9GLb!sfiIZpgWJokqt52 zVEn16*Zq4%j?&!rVpPA=ze}9F<2%ayj+3PIt-$$L#jSxqSy|J6rB#O4Jl0|_ z?!{9f3=GY+C=TvPb9Q}E73sU(%Y!%%kPY-k;;u$AWGDfW-yl#}s~Q-P!7(sqF3X%B z>mDY`g2xdFV+OVXq)8r+?Hs$)hInR{-nY~}N5}!^|J#qQOK@3A^!#ObYvr=b-h2I-O zqgBfa{S}m?UunR+VE@*gp=_E8xm!H4-0q@!x|-uvN3KIC86n=D^OgXg(?##>sLvsW zod6i{y#HW0bNB?=+l(PIx#&uwxS?+eji43n)%IVCZ|vE0|AA|Iw3bF`c$(;TBmPTs z76zf=SZIso+op3l2<0T#sN}0q==6GwwDa-BNfWM%chh0fGVjDGPw-3xAP9svXiL!RzBt|1fD33f|1N@u-U}GuZ88tKFR;6-kO` z4I>gP>Ck53soPioNsU^WDB2K@GLxK;Gs?G`1QQM41->e@kU5m%3oj*w|2FdFKW-H*Yn8gqmu+^+MgBy&@9)bgW!uw5o*r zGEUH$lrL9(gsZ&C2kC|pHM$T8ZcE|GYT2$z(`gry%4e4TP#UKck{OBH;`%iP=~*=5 zdHnYN>PG{XEv?E<7n^$RW#p~?gTs|SIx$yfoCV`;HSl`U9aE+PXIC zdtoo?>X|KmO11KE?EG-U1qbau+k47yRD-rZSn^hFh3oOw@>+8~t$ewG%PT(|Sw-*H zD2^{Ag1iTOAI|2&?8aUbifv2#gZ3FfO}BUsMziB!n`nIJr5|%wjWiXm3$5Wyj`|2U ziS4g|D`O+LPVzfz{b}DK_dg||#qcfNSrW;J$dUnw*+Zb>3ADH59HV`QsrBeVC&WpM z=V!~mcZ8#K+LU2&0@Ab5>xHfSp?JP|uL?xbPqa~J1?+o;Z}=q zBFlb_gND0OY;@01uL$1z>~aIcsd1ZiU!Dhz#8&f|EFZhJ_sfi(Dtqu9skn~sd}(S- z$(S;R22I$lWayTQ3eHgi*YQ2hTL^EDbaDZ00YyzCGJNw?puAubFCmhztN0rSUA*tP z-H_QdJ30^{Ony$S-YltHhRFDO#pHr(@vEEN}|rrAbWRr?U&I`toc%Dh1Ph7=I{4=thD`i-1XTlgmL@h%zL`AR=$j7 z<(jW`(qsQ}*)W$SeO?DS+%Ow@oydFGBDM}pK0MhoYp1n|U1{<{z|k+I9H8Gesdd^e zL)w4)A(?wUX6P+4og}SF|0o0w+_)4X{vwCH-O|&{bM_B!Ll9$redj~fv%D#2WJ92C z(}6ytbr=lN{kd|6K#Z=G`1~KlZ9E-zb2?tMY5yMItT+!L5|*P$4ynlIi7=`jb2qlb zif`}8Qe-W&ME@NRVik%B$TRG>#R3nBFuC4ZOjYExg(3}P_u(bkwmj$gUa)33CHFLd z^+#Dw0EU6E78H~wZyoHC%@F;oJ*gWX9Cpb-`^)J-$6FC^2qw+ zqf_^oKKfo;ouO5`R!S=jWC^l64P$Pv7i-mR{?xi%PZ7xEoEtO?Fzm+RQ{569KkkWs z9vlV@<=aC1aX{dETj?&KRut5=Q5MmVZ(7NuM)6F~ZSkNKXK~`72&*3vx={RYVk4 z%@Y23z*N3O;rxgN=EV$9{8zKQLHqQ-VvhRM8m&?e9+6xQ0`YU7m*pyAUoJ5FS(3rT zc!G!q{$$HMEfVxbrRWRk4St$t_S+YE@;(UzN_qw_28-06l zZI0&n==!F9KxOw~J7m;bvGEGfLE2sxAa_u!fr~Tx(ak%qJz)#fQC;q(_C$ig)p0!D z(4a8kE9Wb3mD9DZoa)n^A0r(pko#2D%^yD%TT3K>$Hx8Hq8Y$nUs*=~>2uSd|LF-8 z5HC*Cld@bs4`~QL^yj7f4{6=#KZ~73@J_F68TS6y3t%Q<+o*oFIE{F|g6nQ~b@rVV zeyYLbQSaxOejafhh9{)x_yd48VEgyhS0E)rp)hXcyCT`BXvQty>-$sTi<^z!a`EmiE5&JZ{g@+ko&`|&2`}xrsV<*uv^Tp&} z6=XISi5p8!A^>c-#*c@_f8h$C*4zYhn!dfSubonBw-w(o!g4qm+rv}nY89KM!$u*Zj%1+2G)g2q+8OUyamd~>3g z_VYuS{7MAmhr|zfKR?a_)LTG=1Y}7dz3ExZ*OA;xPGj#8Tz+uU@gXONIrN1I5-ue( zN;sK`xP-ne*@VP^h2_koRW?$Nv;RTi_yLSxls~R5ewbbG{f|KUm+!EV6_sAeqf?>i z2;EQR7@lYXc)=5q*}dGV)@zUJj@6u!Byq)Oz9VQSFyb>d0adFUs?-(Ib{=; zx>+wrT1G;s%#HN=Q(**7J|pjp#d}97K#8#mxXZs|W~UwZQf(c#E@1Oc>(SNW4vK^_ z?W>pYo@^A@1cXHVG;SRe8AAOlOTY0VNzy+Q@?`nl-Aalt&U(ek|9c2{T`SJ)%*&(a zWwSe?mg?dl7UO#?RJUt&&5gt(c4%q+FP9+P5Fv++gPPmLnf!Rcd3VfjezObhinzJT zznr=l@R#!z%)UX%*&IY)rzx3sDS35vOL!&FDf3-A@%y2oWs^VoR!*v{JhuPFa1i$9 zEUwFo{p~XOz-_ni2Z3j0HhNdJOQ0qrf{*7;47o$Nt*)H){2ZEA)?99-Vm2wA?)sSW zuzQzqd;eJpDNZ^!ZL|LC)4OcHEHBFswPZLmtN4fSRnweveMj4O9u4e<$M>dSbQc}R z5ks%Y2(tgQxSdZ|#xf#_Q?y|PadpHd8NTf zn{xeKA5RP5jtuY`NfGvPkE>k9tnt}aAvf?3bQeLuC|WZU*pFdQG82PT6Gi79eNG;J ztM37>$&6=1Bgjh|Z%@}IeY$R2!xjYdA%u+WKCZxW*13)$kXNh&|(e*&1d za}z#Ncu8_APP_wx5>9ntW4j26z#!fzhqR3ZA*WxC2cK^;0L9aPR}HYi^-lU0Ym zNjL?wt!4Ty4lvNCdSO7cct$v|H$?ID9a2%&7$Z~2Q+QS#n7~$CIiXsMP zA4&WnrMCp_yH9mh#qEVVhqOgQo+0b78|^gexAFFD6+4XthNfF9L(CasVI$*$X>98W zMV@fRwQB@r^y+Qx{>Cwni+%8#^5F~v=&xV&O`2_6x7n8$m;qT$!Z)XhIk-uJqpDNw zhkkqY&8{@3Pd3dk@8(bp^$*CB{3c>b1yf{Niqew?V+Tl<0Rj5~)h6*PJ>qWS3s*Bf zHiiq1A_g^@U!h~KQxlB5c=X>oNDsf9>0nVY0NP7 zypT>$6_zVDKRkoDSvhi)ol<(g`?u(yf|G|z=#oZ&UMe1l;E+u9z>nq8@^|kZy{Bus zS9!Ib?Xy&AdC8sa<@tWV{5EK=$;^W^?)TFnRoRIQs7krggMfD<->~}ExZq&Wi5%L> zoz;P_Zv0{}VkD%D{QylgMd1w}Az||-Pg!yEA_k<<%**iS0Gs`n^u= zkk$VFbOw9^=Xk*mKb!ky9g_BR#mbD0Kg=b2Pf;?^vlu25Zjmm;?lXjo6N%VSvm zzIH=l6cZf#u(9hqF5P55&ifD5RJA^bCj3_K_kNj}jTz>=OQL(V)N=Y&9@})2lqB1_ z{dCtO_hza3X71^AWuvO9XKJqOI&C&Xwd=S}gj8vYg$j5{4`!+&Z*o32 zHy233UA)D%ZN$DAqgCFkc)POdbbB=Xi$~9~B8zLL2k7%6zhqOZ9Hg^j<=F*`PsKJQ zf$4l`e2?A`#L}enL~A6dM%W&yM(c7{K~DZCPq$1m*CUv*pX6${N}EU$%>J&s7Yn}p zE3^I+LEe})1{9=ucu-Z$9-*F0qGs}RlEv?Ax}iU3G<;i{8>5lY*!s;hN~rZ)<$J`7 zTTq|BGLBrYl?k`nIXghtzP!2u%7S!G3siO|0|pK)ig#Q`tr}!Zou^4ksZX#Up&y|x znx9C0_TnYMK(ZF8t614eYhY=byRf;aoIr^COI?B=aI-48_OQRcSuINGUVNX+A{*f| zehYuT--)y@O1F#;w62mWOB-ads}Z8nOF?9 z&~cU3f&qU{%buaEB08n4FjvH7esKbCt!3fB!}K0sRayz-bn`=(1CT=|8B;@qbT}+67qUu`9nFbP?)`*!vY4@ZOwpW-U-P{Wt0Anh;BaI;z#P?6%POXyMM?7UVpC^61vBw3M53A+&OI92Q(&-n6=$r z8+;QqZ_)B%9xk^ipQ2FoNCUpy!;I{zD@Tf<>>%)=CCwXN-=s zJhIKO@M9fN%4D*BK*j8CaY-I#{E3aQl8x~~i zs=RY-zzV`3BeQrsn&m9?eCV!)oqM#7RuHknjSXGNtQ{6@KNsNutb91u3zCu7YZc$-j zp((qhh`&UG{i7~NHI_)U;DJW;WM?O$fDpB4c^W-O3!wQ+Enq}fl|7iLyt{kCl+z4hECXuZ3GeIZPcKL3e#SmcoC1^yyaufQHk-7b6e}- z8VOkVW4DKx5D=Q8I&LvZlee?vSyb!HVA)i6oDpAJ_N6JORrtDBVePI!Mt`v}_uJrD zIF67NZ5mKd-NHg1OXM_>lCSFKe$zCyQ8ZmW8m%Tad} zflp}XzSaA#Km%kAHGKki;cPVQulMbp>W;0i`Qv-~ZQ8vJdzCf+5XAQ6Md#U}_sqBg zd43#cQVO`X2JKNmddJ}Pcl&8KgH6k~5vo|jScKHA-sc)wLhIgdwAzU_FtXc^uj?CEOk~e z{7$!dwCtcmxz1~T5;lQoRee{6YcNar7tuAk+y{g(+BNE{2L~FXY=4|Q zuhZF;zs;okD?I@ZXV$rGce9RVGnyk-_1$I+kPP-vQ}Pe$DOS{ zd*v?J@0~Y!=1PZu_IqB&;^o|=-gLP?oj=-~@aD2!>_{3Qxt!^bOw#+iLUH~vv?-kJ z`69N0|K9QT?^fPfapZ@D!utu>O4C&flV z__v>*n7zF{-hi#BWkvStov{t-`nCMeAJ0jj;y=1^6IF#y7Hi%QLR}{kAwtpT(lRp1gQ36@i@HVTQgy~}^Uel**!A@~W`RZ6 zGv^sq#&AP{-^%BTD7H3!9Y7DaA`1P8ov*}@z=!V3OcDvItD#^HrZm61D!MCBZ1)?6 zqMUwmua53bwE!q*HOx$Z2}k!}Jj-&nwzdg$RVNKC`f+P(Yf-L+6wz;);GEJasw`HR z(nzln><&gs?wf3+80V}jO0J*CXZ>wIb;Ks;Db=(~*c;g!J&VqUS;EOmo7g&5v&hgt zEzeg6zyx12K0OK`X+7z?+WXrKOqO~Q+ z+H$P2Gza=-Q65J#?;WLha>E`#9FQyoZi%Y8C{7Y2zAEo1B^7pS-sO}Vsht@)_Zl@D zI@ey`TXDhj%$Xd@dp^7y4#LDGa=8DK($4nC==pGn=pR5jr`$0!?Xa;>mbXa`bN5^s zwD-+J9|MuE!RPytL|c+^(?oiUwPrMm%ImGWd_>f#^0{d=Dh506lGZPD+;`T`wSpCmen)Pd@1 zVyfV6er=6cj?iRr&R^WB`3Bi04FLI`x}D1g_=p=IG>{fFEE%zkNyVok<6^RsN#S7`6b(9S6-iU)oNtAjqr3etb4L&?S#~IJf|mk0HEIV zh9E5c&gG0&q{CaBcmY#zS>su`9jL$Ui3d}4*Hg|!-n}ftdTklS+`3?b`qD-OPq`rU zWxnKV&E?7B13zYb>I@}KX>P_Y1%m1^VFhEgcYzE`Gl%TBq37QgGkys9z=feUhwWW7pfzPD4k5a7IBUn@EVDrCgW~#nofUy6PzBK_1kl zMFKj%-gdIVPXN2uNnx>jelLpF?KN<`1AczAasyo|ROPjWP&ks&h2)|Hv(wr=%({XY z129hmPE$a2JepCf^aC{y4{hG#Q_gB{Sj) zsxiETm7P3O`_=U@OKDpL>g*<>{*5)K->T2Vgg$5*jbl|3e6iCEZ3xqCIT{wA&>&w{ zQC|hO7`f(tgLHFrQ!|6_6Kh$eVf=Nujv(hp?KDa3(DT47i`zN^old(7wD+V0mq&Y9 zMgiH5abKzBZg#~)xV!BM%{?!+0n1tJ$`49X0{U8MPu46}k+3KF-@2@6BX1H(ETtn@ zdFA>nOO7n@nhIXq(m0j0FS8?&s`tPB3+wU!iq<_To19+M7Fo{m*_nN`wiM0!7k}k2 z=~Z(;`j^Hz_@Z4zIm2*f-u^&Is4L;$(CM79)))5uzUkL8e)lFnTnqcGI?$zXoRlLf zyek;zig2LQBZLhrUbuO-Cb^J;-0gz_9iOrn<(x}DboD|M_!{=@c&Y71IWwV?;Jlt( zCC+CG6BQW{{(lqN`7zak>xr^VqFBUB{`|0V&`rf_PEQ%kRw+iHa}y@7PA`7VAac6s zhFGTb72d?a91&@FhqYFV-}Kt#Luen#U&-l@W;`|q6lGEj3i`Yw7E!ZzNtnM9^dL`i z+jrcjbUqoE#SCs~b*)IdE-g_i0$l!56v=D~Uhyt5d>0EdzA!_< zHc$$znJ)pex#%S_Z~)J?-UKY5uC1yTM=oO8JP6i-{#0?C_E^O1*@Lo(7!5|Q$jbi_rVH&PS|L)Z}>u{I; zVI(>Xba2QgX&l=M#*_ig3E_3e)qb)-$9?Vz{aX;VJ65#jfz zDZ;Awg^M5S_oh35F`Kkm0U~VaLYVrC5ECooLfRL*4Hh&@cLwM-$A8qfjAY!= z>FSp}dT;Du=(t+UCwC+6yrMIwmT-p2icv6I(Jvdc*8D!vW9{~Gba}-v(8q5J&88`r zOk9eWU7QY9NcV^1_nVaxB@DZv7j<3m8O$A-uqNe~@Ti`F3=_lR4MFc0v)YyL67~@5 zT1$lZMsN?+gPlVv%p%onjcU#?>N}G5ZGM4C7; z;0{WwqIJ}8=ztNzM8|NMAb1^9taUbB$%PKn(s)Bc8vt|SJ58$v`%|A-oeabd5+xEr`-|IQHE*U^<+EfYXPYM#-Q}BMX_Gb!f(HW z=>ub&fQd6PJ(V1G>ftT3rpbX@=d{y;iHN%(Z~x5(2_iVB<&O*U>BKOkuVvXtug84)?%r}t)b6e&hr_MH*J_KUvkjFc4c)2grvCv*YHOt zZrW3rA65_zB-{oxEA1mgx>?MG86vu*&v)k%11)n=J6SMc6jIMOZ`>hp_>5InbXGU}? z`1InD_e+vKk!Xh-^a_04i4bWk+3|gA_Ch#7!z=PlL2%d}JCBLwN8iBsow=Zo_DP&W z=Sv{}*X`j_nq~C(3qlg7&+nm=F{(J|`NVvK))`P@o>7nDV0~3h$e|L2%liQD(@ZtN zG=k&Ya!SZ|CBDw?SO^aeF1}&@lMYP9u;xtdt|o`>M4+#P{VYE)p-wrG?Z?UMf;W#6 zM#kJiq1Q(RWHEBUl-q&~&nGaep*z^B>bklVz*$Z$>K<8A-V_atFIQ(Jo34Y10mFIw zZmJq1^Y+f^-EbB%JYnnE?G}ja$O+NK{vn~om%b-m;-@jbQ3lF?CIbKYGON)TwpwT` z#lD7d!~hg-tj=gx*ygZRk8?oFgJ5Enuct<=WX_NZM)bT9HXC2!gjRrQ{HehQFz*Da z?`XmzV9=t_xb3!7MJ6v14mvY`OCz3bl;*qQt{7LwPsEkADF48@?zmQqcgVkt{HUf`Pd3pTaDbhpdV+i<@~S4SG59OS%1w{dzI_-fhB)#EVNy`-$abq+hr~s_ zXZBVDTX!Saf>bCb+=FV!^AxUe_9|#~y(DBk3X6(JC=!xO0!)akB>35sMDR63?PdMS zP))*dq->W$#n%&cowH7568t4xB@U)eOic}T(e3J<$5eN*!yEH31-FmvC z5zFqMNFq$Tv9WP~g%1#T0*hbTPe(Fvh_3vcXqtP&fX-ZgTMa0VXsw)1q|#b3c#$BD;G~c_N>XvY+GAiEd=&VX;MVf=9*u zW@|xSPnlja7Agi%$=aRP!4G63xm(SP4nl^0;m$&J;0mG!JAWrOBuovF)qbvd3tSK? z^0VC5PJJf(t!HquqZgVsn{WI)nk1uF%P+1v8@2WlqS5m&7Xa-8XzK?6BQX)oxTc8n z?^_iuhY!$5xHTXFJ8e^Qa(ewsi(xa5RFlKHjsKHu_`P2f#?bv(iFhmuqX&j`@7#J- z(ig`&Kk$&6zz3s@?G2Ba2$4#3jWbi7c}STh#E5U3SZW^WKii$*j>MQgLWEtY=338l znyG_(e^qeH1^f`G>`p^*9Ws%h1`r!Nd+Z`~8T~)0CB8`5zvRIPjgzO@Mzv#v{p_Nw zmphFh7rMQp${m7ipTE1;Z80`QbG^A+EN>PK|KKT^Hpe6P^AibqQqG?5H{?_0-&61q z)2@qo`vd)W=!53APIFH8=pM#QQ+#ZEtq^RsB$&u_uE+#VDL#-sWM!Ny#a~Cd7Ee*# z2s8)Da%2$&rx}DREllRQt8SpV6WK zB>L`Pr6(^fgAPA&THN0EzJx6gGxWq{*xnc(6JJX2wxFWIF)jSvvvMQ%BONL@R)*Ia zO#y8Ri_yF|ozZRUyAu1+^z!e`8qEFD(9m!rUN@^#KQA|isp<4-FpQp`eBrDR#S$hR zbbaj)+=x!;Q&ARRI;+AJ#({w3r)^|&ZTAwm`?<0D1k+tIaBtEseYwIk7pJLyqI~p- zhNGeOupWmXYrJkoh#rTIrk_q|)UOZBir;B)w~{ds)+aLz#LUu3C!-&Ch$yZMVv6Uu znH=96fP-%jlx!rAR1m?2w5{Zm+%*f`K?=A-=bp-)qM)t!5fg1UD3?MZhwoCbeKR3a zh`*g3J2KOk>trcFGKQQpr?oW$JuDUv@J187#fMAvVczR0)~VX_in9e{*fpGIg!M0O z&zlhL82so*(pg!XA_#gi{qSPosl&inNJN7D=dfJOP7Ui}M0}Oa@b{&HrPJxaF5e4D zwW5dmH zGhdLOW5s^cW}|8=_6O1J+3otwr{ifpS7m$8E`aZ5z6gn1r+}ytI5u-~PdRu2gOhlJ!&d zrz)zhN7ZS@1^F?06oIz^Y#>1|y83MLP`W~`l~iu2oU(+}0|Z%O0jAE2rcPW`dW4Uj zY1q9SGdPLQkAj1jkJ3Im%z2wUw{KQwt+b!vZE9|=;$Z(t&rTjA9M=VqOAa7VfZYeg z_yv7YCaWb2Kq$L)NJqMnT%UXfb6PGgVmWBW*gqvgM%JRy!#ep-M)z$;d$Ek%;+*aY#Y36A%41HQaYKY=ib%ZxE72N zKRwd)zI9xbUcK?*sn8Xbn)n%sgioYeGoaYLE3y)f-36azmhh#ftqDzC|8lGz1Pl;xWo6TI^(EQY6g zrnpbufuKYyZ!o-@RUkzoUS#j83y@Fd8ducyd}2~?COLQ+synC7^YpxmZAA4&yIh`k zaa}e@b0ynAt%s2{f)BqzErE&Ve)@dvtEVK{(2~P-^x5~#{{CImb++GMCoENX zaTR-$Yo9c|HDM(S9{ylk=vHzhDiJbG_FE;X)Uv3W)Ca$~6ihWL#zWnUI}FKIFLZ{M zOjEY<$t;B%v_CoUZpl9_;jWMfv==ng*h@gXsArm^tAS`c72kc{uW!6};x&#bnngL| zmPlTm+Cd}*C(i8k$iHkVuSs}~?Z75aWGzY6f;BBTQW^Bfpbls^w3f-T2YbQZeh zKV*8?Z;xCr9^HBYzqs#YP#qYC97NVqm}1SQoSetId7{9X?R!bol&zyQV&8nHUH43@ zG@{NVh^k#szR4o1__N;8T(_Jg>}bJWJ+@)3ORI>f>&QI57iM=}BqiDj%N@5LSsX8% z(+;O&Oj{aY+y0s7R;sBrpE%XRA{QZcXR}Kc2s@SM@&8t0!Oo=?q7QS^<7|sf*p55g zpJMM-u}{WF-;V^RsIFIHCO{riD!2*Y`M}N3<5*~JUD)0kpnKf*=9o_8!uQP-S{W8- zy*$6Dd`w9C%rSNMt#OvU*4dWS3)pVz2ZK7=0+;DVr?oLIs}#Eg&G^z^@GmnR#OrS+ zPqOnB{orN_Swu-Vin>ND}9j{%R6Db<)qSv&_3Xts^xQ8 zV-vBWkVx+CgR{1eh&MHZ4dGwbjr(F#++OuCC$0#!=+{Vn>9(f7;G1+fwJ-@-r}FVZ z!hb%rSbsnDY1*G6?OXl71UuVNDY#-+1rdQ=gkfk7HH zeCnHbCM%*`Un}l$zHt4mVoY7(xuB38v#K$L)EnhL(D!-)3`xpj98_Qu6%`F`*S0Kq zNH?T_{Ued=AgfMwZP1P4kXa-9O^662RJPLh+%O`;#Mt4~v^XZ`T+K_DCaTbLK9j9;Ce_TjfkexA?rNO> z;4Pr)2(&F9;?}KvF3Qd`l?iOw^^@C3Ln z0h}8Y1T^wEn-gzBS`ZwU?-3c zNTuIuqE<>}2H+4muA~y1ujd3BkbGIItL_NnZ?&BzR8bDS`z`%a>u(B-I?{!y#TzI$ z%uvO9Ztv84XJywp8d7Fjy0^61H`(pSs)NIpKc)mwu{?vmYvgG#EuK}(R5E7Z%rx|E z8NXz@TuzW&K7^H9psrCVo~H~tyD@CrGnYLDj>|xR^*>H_CQ4Wr}jg7E2|0vg~paN6+N7=-CvVoI<4hL9GkYu$Zwe* z;hNXnQ+28G8B`D|vvPCexA6v3_BUWhnCNvSilrD<=z4=t_ORQ}g4h<5v8(WW&D?Hdy3;o?EP(g{; zHkiuNE^~pPLxg)l?#weC*`Eo~1{~LG)zn=w*-yLU=%yb&Eh!0;Xg`0@F6qilQE+^) zt@tqWuNm!sfQHa>T+$z%q1F(6O#P_pk;hTH+l+mWpz=cli3G=8zJ5xoXEvLvHqRJK zbb-=RkK;2O$&PIdU?4~rgACg%=C4_ z9@EZvN^hC60B3jnKK11CTTeoPFFd5siQx$Xb*Ep&y}^AADTwi&^`cg2oy+t z?^5*#rQFM|So~W&h3y;hZ_%(Q1}wOM%HT5`+EKNAqx3pmQA;wU5vcfvVMV=l$I{D~ogV25fLc^_Lf=X7&x-WT*^I+Ry$j^;GOvGy08!0Bqpumb*L46!D(_G zjyR_vWCHJJbh$1`Y3rNYK=K;ZV-ApOUmi^?G%Kcu_v2e(ynx;f@#2w3_O~;#2UzFl z=fU0t1J%K-69BwdI=8f>1{AnqA+@!&9_kqzA-J=8dYNkTQ31fx}`|7%(7w zSviDoeYA<4KQMa&v1iAwGk(H9TD`ACRhB$k7bf?fDwEe7=Q-|O{pJ4Y;$GMWQj@}Y z!kTSNU$Wrb7nZ4lbOyTC2JJFu*Z3$hfC};GLT3-P;3#k~cXE}w;w^w|MojI>!pgP~ z_O|P8+3EnVdew*a%r6r-F0|eOdtSATmVEERpP0PjN$Hb5En@k2wEli#z}mNWnb%kC zYmE`tAqympjQ=)STw+PyC*Z|k0%u5GFhdCnMA7k zrairfIecjo`~Z!%Gi%h${Xmsssx!S+(MbFJ!zSaOn}!yh6dN@)l--kk#x;d9((bL8 zs@O}yI@P=*3(769j!1GyGadaZo|I{%*74AIu6&CqO-Ltp&3{ts z0BDkp&CO9YWCpz@?r3Xk%bHTydvtg;%9;;A4uBo!{6|{^{Jyk>Pv+9inytU&WY51y zt`u<`Ugy2)LL0ni-=B{t2bha1bMw)_)^o2kf??7^_qJvR6))Mz9)uW;^gk~Rm7c4+ zds6EvON5NVlTduQtfBW(O`79u@1K+5Iw1#6cT&Z_S29R zKxo73wz7P$JGnnOIhjiC^}no{I5d|=lWZ*P#n?oV*ymj8v_wmSCu?fB9kwD8ZBi6@ z9!%M@nVaGh7OdmvV6r>J_{4?glH+YCk6+ja1oFm(t{WFl*ykc6Od9SCEf1wFwIKY` zesR%uFPg{uy$(N9X4nTJaKZkbF%a6pZT`K~q_J z9HUcH3d~<{=iz{@!u9p__nuN!6M(m>`qfe&Xl58qJ^Rx4QJML@lT&Zq&KvCh@3%g6 zvhw`HZ}H%{_u(}#hq~!L0pfRdmxb{^U>k7i@yJm0yN`(U)0E=D&4yLR1j^Ra9Ib1O zfPO$7Rbom>%v{sQg6?S`asdmTQP*QZ!SY^7GJ&P4)*ME>!iu>}UlQCXfAQK!lX$!b zncWcOAx~zlfn&CUR`0jb&kJJ5#9?_X$}7$_aiZaIkb`TR7z!`y}t*NPLy2*nbm@@Yb2Kxe7 z7?Qe~>j?yx{&#=__Y|k2jD+o$;!|;`P{7BLP4|nj2Q@VwH;w6w6b$X4E;Lq(`(p)r zc%F%t6oEfWkjDVT6rjx+VpNhJsZU`1aYD}IQTs3Z9HXv$w8-Fd!+7t<2^yunulZLV zcjn8?v~Bu1*1R&on@GvVF2*N~2U-mkv$|SHWlp3^8DSitaj=~59F^Z`UOeW@e4lz+ zO53c?!kRV&w35^Sc9R?kz+3?KOZG}W%p90}@4F))Dke751`+c;-bDcJV^3Fb4GawJ z7Qg=Ydj8y#pu3bhMgNf=j(}-^Q}pmUui{%B9;~KhD}9}}55@JOx-%m%vWa}VWi!BV* z1X$YvF9djYKJ zWH{1id#N1?jEI8Sop3RGx_|6@2b`>rKG?c9{L{DEaTKznJr~oVeX`~HUpj6vuyK|7 zgm$&n&q4);Rd--=!}O$E<-L$Lf4Tw2a3D>r`gY%a>U1mWa98iG5wda=kU;){0VAo& z-HLnhfb)!=P=;dLZ>a#tEnhvwhLpS0z|nX3%m9$*r@PLbCBR15nVN+-Jt+DT3B=j) zFZ#OWsL4{vS`aa{7hA%eETG*1I8AE_mugEC!@q(oMLo5RCrH|jrwHQyJm(ADIaaa< zfMN|$2mx~@l$k?B)sc!BT|gbCLDXaZ2}rD-Jj(7Z4~@zyRz7#x)Zo}MYHIZR*t*l? z_+D8+kqZOFnai^J?BA_&>Yyo)J}cNCe!$1x%uL$Z+1cVrQ_jxr<>cg-NVm`W#p z6O4B{)NECGb-?0tBBLPR?0$P{!G#H$+V<(>W{lmQe?0@dits}f>twbe89=S(`%OiS zy6C<+1E2ky>vW3V-TxhHKfZGJ=92V$oh~u~~GdibG6Q`r}j5y2tGy0oN5|8eic8RR;36+nw;9&M{{*iy{mwq zO`X%y@F8MAzZEQCSnr6~U+&tTtB*GVsqvRhGW1*f`DgRR`Ja$s3D#b{u}FSBZTq^17$Y;6qS2Mx2GV5@Un=-*vv z7V$gfE=MM~W_)=Ltj{PGl1K6HV{xPKakEOA!?TR`TsueL*?Wf@5=%58H1(Bhab7MH z9TAOambA@igKg);kU&)2QaV&30`?MbM2+u}HwG!W=Bs&=KDX2uD6nMo2-5Q3?(b!7 z%F@46t!W;nAw_-kR;ECgpO&T61M_RdJIh?bTk443p80|qL`sV~n> z$}&rKn&U>Nss^i6fZo$UwXpjJv6}e7y%()VB!+eNMP%uue>{#}KmF3Z%0q2UKj$-8 zwR4^--}>iGTRqqmrT8$^o?f5X7yd6)DwukfV*UGU3#3>>@`g{!71Imwju4+USQ?Opt-BhL|04{%&tuR1oz(Ic3OlzXcxqFV)Wkg(Po!82$YBRY!Or*g$ImGYVMh1>mbF`>q z$va=JsLj*{6Ato_QXoP?OFXb+Lk+6fG?0r%pqwKnuB8!G&2D7*t|JH-1u?d;pki%p z9r~M^j;tEwXaiNH`c=0kHs5y7*;k~-j*=Z3kemVO$$r5SduPg}&jI>9;8@jck8d&?A{i?YTmQx*=y@rw0|$+<{RVa z8!Ojg`ghm8&itcdM9d4*S740VnM&FH=wT*%rrw~gk(h6)$z3;oQz;xNlq^ANOWAiX zFBd2LyddNg25PMbu5BKZT)U_7Ax2(vKJ$LAsj;ioHxpB*$Y#@JIhDCMmGpk!B^Sr{ zl+pH(_cUH~+d-QTv8E@wJk7UD1c;HJC{8E(+0TBCV$HW&VUa+&{w+qTRJ9hXH+3d% zCKrC5^D0`5guRoXl`)m4%TgElhKVE$d-748BGY3;Wyxf^ia)Kgh%kS=pidxA@AJDdw7k+75e8w@wr{L8)Y$mi;tma(oG;**(?|gG z)c@qWaZ4i2ifbq9vU8^#G>oF{y9L}S>n;4AozesjJLJqy1 zbA$fQUdU+hWbc~}ByPTnDydao|NIsL9xwl*)No3GH-qWy_1+(8)hiRK+6a$#>%#(M z7Mlh8M>|6o;`LlX6t-3%Xs1ZQY|A-Jw`d_jMn-DOfi%e0hvcEFQk#mz;LvrdGsJ z#&@=D`eJRK#_sIYx~?jF$$WjL0Npre$e?&@@5L`Ap6Xap_9=((diXlOPG$A+%Krik znZ_M=0UiUd8a8A#swqh3QK6oimnae-_8w55`yV-=R_ef;<*SwVBjjZjw7SR!RSs$r zUp{`u8%`6G8s4fq7wI~x!!%g5Pzcsc`OTKt?UMfTqaa3v?@l+Yzls^*w%x=9RB+PS zfv6^nEkB(xu(?37nfyfZQZ~u;zgz%Hc#kVDlF@r(PO9z0`v@iL(K=i9Ai*V*-$_uP zMCjK!&x7xtyT%@(O6zKCPme1f3L{hb^vw6xZZ3|=1;55jHG0xW`dHFJqg_FCvxCqZ z51NQOl_&HUZwg!v@%0*;hdusH%!MCR-gb%{`($?ZJ4t|X4hQ~Z*1d)Yi<57bK@m6v zY#%!dq@8u;pO)UUk(kqu8tRuVB$6+beT@+GG){7FT6FGPf7=uq!9FYB!x7r!m^_fO za-rV;_QBeRey|QeiJPld($)64B}Lsl-bO=(gGWI(z#cX9NOP$dBW|8rV(9e~hlNF?#X%WJgzEVw>p(CRfj7T8veo8r?}|TpkUm5_TNt_j>=X-P@)`~ zNrM%4z4{_)sb0xoP(7dE`=Qda$aDiifY+EO!s(F3&{G(_ORvpkf;sXA;3EkMi8a?o z`a|i)RBb{S(ueFp*h^NR1OW0?hdH3^I6M;vmMMToMfL)S8c;7Xt2}WgD)#;Wj7$SE zTOf}diOzZz%#=A|@CKZkhk)oM!0Ww{+EP>i25u5^^sSdaET)+13tX|}u)m3y~j`}T~9Jq4TX*Q`ES7TEO6sV8%3#7{QZ7HE$$l29`9tUP=z9hoJ4605l!P^ zYR@iHc&Ph(j5x>v2LJ$47Kbw>C~9{TvL5K;me(>8{J`tyERC~Z_2~mAI#1VRVlcd{ z5A~y}dd#bGOuA&xKfO)lQ(migpc?m2K(`vHx&_Mc-H~;o)3^h6Up``a++wD}*?e>w z?3A!DtRo`defVAXqLBBIeD^CO_^(K$Zk&|8ZzV9O3GraPd--?Akc^4yW0^Nd?xIJ8 zJEq3IGb5dD2g%A!c|TlnPO8|&Qbb_#g-4!$RM_McCc>mDj)Gi~S!rk~_%bHEcwyOHIvV{=)khw5Pj4fW6Em5u!sT~@w z?}#a0Uv%`$toMmsugOf}u8TaS?hHkPh78NwL)_H#`-=*U20GcVKN-G|pg`_-ahNt+ z{~W;0RTwA==mY3#E4Mt?Nrs!x?<((JKPV;Zr*&%8dS$UhqqeEO-S!d^! z*Gm-Po|WcKvaBEN&8wHP_e~g-N>_Qwjlh(*9Q|>cbppbWlWnq4p(8}-NUm4!nDdXM z2A55D^CP!!XxdEu>n?07F`>Xqrcyswt{ASfr&DcAA3iAYG$%N~{bIE-}vW>eiK6&wTpHIl1;L`q8Bek{Zxjp81`*AwRi%2V{q46IN{|;~^KQZ*F&QR_Dl} z{uk2zmBQGK{yLIZyii|`4r2=Z_VimdoGa&Hv~Y;iqt@D_|60Ss>y*)zk7IhUal`5y za41_7wfkiN4t~%pyCwsblU+UQ*-0k)treKVTu`CyoTrLcdE-@fbYk49)|z}8*R~bu zvqY41%UKE+eT1Cn#-26~wwAoZM%;xJiKk!jW#?(HL4$L)q?x$|?GGUl?|piOIQOI{ zG6~1OMrZp0aqSiz1FXZ{%L_;9z@j7c_{+xDBCpj&MUVFj(@#?k-sYuj6x{au6)x#8st9Ue@M-S?z=Qw+af+}DBe3fR z5Vrs>Oc1fXsGrAyme=8yX2Oj9WR$3+`jdU`q=69t=tnh4g+@ic0I-HfyRHHszb%Sn z#c5_JU`Bh;th#kIMAx|6f46x-lG<;n! z*5R@xvKl08Uo;%E;Z`bEt|B!LG!5Vtg#lNy`w-~v?(Wu3L^hGIFj?^uH2(T>^Hakd zozG?ckP8TIKcmp!KMK2`PZQiNY1#%riUv${qY<|c#hh<`m5`9fpsbD5b z2TqG!8BVBmXh8MZWAb;agY9RYyUERAdsi{{;s2#`qWKou3Q=FdgV^c}-+rtf(4#5u zcfT@T)6B`-wW1-Sp~FPNn;w@=eR7qWY9^BS@y*1x5%`!lJsT= zQf~bcWnSeo+;z{XoP_69{BwdwP{bry zMv`7Ql8az>{9|sdQ5H^w+VD)z)C~gJA{-p~@ZZoHYVn~^?>?Wa48UURgaIhwo9BPE zB>%hnS!h!)>XE=XtH_r*_#}<=`6?xM#V^N2dN4w<3PcT zsdMXd9=QY`{%$0=pCQ)t2^R=D-IRn{I+AbMrSP^Y8>(}d+t}WYHL`|hN^m6CKncW} zo;MNF9Ge)7wgNLjQ}lw|IdDMkh%tK!-h|R55nD&UPMgE~1AG4OO7TX-<4TcKrbd#J zc{XfUhP10NQ)<+kzpEo4>q1Z8=qg9|! z@X`oa>yN4)HihT|Jp^Ehb}X^kem}W-t1dNA&BiGBHMc>Bqr-XjMBNBhyK9;W00M-W zNDYA5wfZY;0$f*-sEd@D$X*qeI>J`xp|=1*S<;38LIPVZqrF(9kOsCA->A&al=uxe zG&~x{jkQ`S%5U7im7vTFH10YCX?p)C@&PsxS5gdr;MT4SAGv%&l^zFn99Ua^0TQq6 z8z|=y*U2b!i&e*~+?tmX$Up$5moTVRvnL09p*=;0-=(dRvC|%vdS-)vE==--8I;7e zFP@29we)%;e8dq3@?Jip@HXqgI|b>T9vvNFQ*7f#O$qnSO53%?4AYRN1RP6SrEhaP z?B02k5~ZBX8-c5d{51*+;j{}Fn7ZBxsM`JY8dw8oEB}R007Iakcc2nXp085;`gkrD z5*qah$g=uRPJ{Y)2JynDgI}1jSWPP2$PE&(biUxZ{CF|?6vNRbP}GW+c=zbQzy^C+&7(h92pjcXkAwRoAC4ubJflHS50{?%wh=vm%F< zv>VWzxdts7!PQBi6IozIKOKHWKS7i!g=;*u2#Ku3M#zIL%2|sj5xuij42radZcqe~>WKXmjEpAAiKa{olWof=9gmGS~3Uf>)x|$5n)43gbc@^KLY| z_F2buG69+53e5CzO_6k4QhE7R_ZQN>cLq_tr1PiNUI&MJ%vCvVPvS_w1mXUl){JmI zPmgpVS!%**DM+ZGx5-7V(Mbi#$FJ+BQvu}gD+j`WGWe&sPHg=-5!J^^9hxFfD?;hQ z9HE@*R0UMS5Qlv$eyAHA_q-#%V06#hzh^GyW zggf#mIH?Iakm5a>gYpFMK-lZYW@p(}{$Ydu)r#olUk`L@s?1+u9`q4ieSK+<&E^S^ zI^F=-)9w4&E-MzvXd_5Iu!qt51fGTWW)H}l&HQ!L&a|ksJZK&rkgWSTdS2j>W_l>p zao6!{`5i;({P0+;9>&PYkZp@5$#?U51|X_d}%U%GB%zs$R3Y%9(c|Kj2~ z4$<+)A&lFPlnRS3rS@FC^oj166UM|gRLCF=fBv%Lr1+6nskqizQHDtT6sJE+fl7va zr_1vr$KME+n-8@((d*d%TLMzV;c{BLFv=b0(wHG;GoS8gc~R(uFB%5;a{wNCAFu2m z)L5t_+xfFL!WF$esSBjt2`!x0`Zl8A`L}?M&W(4$^I_}Wy2xIJ1kcJ0;iyoR5zIl$ zXSB%r*LyZ|b+?H8C|H9{pHKcUr{(0NoSpj&go2NXwGZQagY`Dn1?c~$Q+Znt=u~vL z-UDvULPlPsq)Llyx+MFxu;|g@_Mu0o@P zjKPv$i-=QBO83QIy!kCg8*0Ocs@ET$DvXSF7o~}Wv7z+k-gsv!a7=oiIS7B{%$inw zsmtd_XPV}u>M%!W!sg!Qg@IldibaVMORbQp!v;0I#^RJvuFJIj-F@qaTM&;kH_PN zW9kN?ukJR6uunIZwBb#W~*nlw?l!C{iQ})Iq;TSC>9my zc?|(ZhDkO4v0?&mS;b`|rlV=USw*Og96)sW!#UgP_E-o)_?48to6FXm ziw;68`;xa=205*+uK1Gc(b58Ao|E^03=T*Km6_RdbhY&3J>fI= zAY}pNh7@VOd8evX@uUOssQJfAO*-xI z7rIk=Hl3&xk*XMn0srph(Ubd*$F-kc!y$H!D5t5ocXm}-M`ho$#KXaZ1B{D)%faXP!dWF|(WfElKLH}PeQ~IbpG6y8 zOMPj-n}Ng2zSV;#lyLq6yTLni*h_VltK@B_KAm(|JA$CY0Kxq^$?wCh>Kl1vCr19Q zW)J62KG=ER_%6NTegElIcaU)6*aKC(xUscfdHb|k!+0L+WBus`A{at_C@kzCa_8-c z0)ylv7Nv;W(*Eu1>+qtZiWaDve?Xac{lDS)^k$|RU0K+F62IzXW%h_zOXuO#;Jh9` zg(Ba$GJjc{*%IT_c(oiqdzpQe>3bd98S~?bZu=2IC7vmAf~0pE4|T~N>T9dNi=gxm z7{tftF0C#)K{d6w4*RU9BL_QPOS-|YBGV!n2KhMbt&M8g84RDxU=i_@g@nObzboHPPSLn-TN0{~ zFl|{0LqcvW;4`4^%)3JZ^b|j3ZaVUHObH0Ada&MFmG9vipKE7eU-(qJ{UEQz81|6* z2QsI{uF=R|U5G`AghyKuZSTBH%Z$t)(~LdDbaohhsN3g#&ocGUbM3x}N^|lirW8X>J)573!Mf*jB z2HcwBj%iBt+~Nl^d`h`?a)Xt+fFT3KRm=8XxF}M%g#6}Ja<)Wm^`nqr+Vv6I;pxHw z=)qI=5Fuin!|8{6Cc}ldYrVW$q|IZGaT!91rSCI@HjGf7Zx?H^X|X*D3k$2)IyEx> z_q-7#ncF?H zcLr^zZ7!RP=6l*8;h6--!tRe>CDmCp)~onl&(x$hh~J{vwr3Dqf?l-XiFmCUs*)M} z{^jzt9+TY1ib7mAoTyt2>fEZ#xI)EBTSOG$<9Uy-{S0ltdd*7dM)5kEG_o;n3v;Rh z!X*=+YZ3N@d|1yeU-$S0e$JcOWx@&Oyal~478QsZcbk- zyMunP#I!LU@(L69eH5bed^a`v=+Zs=Qe!Mi^m9M!iQt-ik8|N}660S_(b3$l-DGN9 z^Uo9Q=FFGsLXsBnY0SR+mG?y^WdTXbD*`!wkkPV>h#gHdcl&;aRhj}+lJ%IB-IC42 zA(zT%lE)ktOADQmb&o)Le~07k(HckMNg7uVOoC!s+qqViGtIVd^G5i8&!CAId3H(6 z;uM@nm~(AJxHPcK{v=XDEt(fv)^0*?n)~$l4t`zzSp1gk60J_R{j~g=rLpE!O>6TR zDzj*QbEi{{;tdRSWVOkJ3aPs z5fetP%IT&}et%D&)G1Amc=>)G|0S~vQq8SENvYJ~7A`dGQ#E^}?JrKU5-H7mSx^f4 zxpTnYqHwsv=knXy&0_nu3Gl|#m=B_+|E$wLk9MoLqZ7H~o4qtn@p|_cbgir;a>46f zZKHq=%^i(1{PnqkGLbL$L=4mof^xBH+(Sz?v-qcIB{m zG`K!eH?)X*H<$y;BR#(|Id3QajC9}5xd8=u9m+?oXI<=>}%@o#yu15FT zhs^Ab(s8lgYpT2f2Ayddw)R8W^r#0Z+J2qOK1=-TOH1MNg&zh9q8OSFnA!i&WxggL z2N4~Gxx?`NPuqJp`M_+}tv{SQbDnulzSYOK#dEg7s{bNaP$Mbav|}evwAV3QiG?4q zuB3YXG9?q9<mXee5^ls%iD^i3bjaXtJ`}sKc%$^gI7WX!1MYJg z>rL9c8sN+Wj7Z6Hqs28_`a)kq5RH24XmMBny-~5}H>Snbbd9^Vd%NCY-NcjoW2AqU z*I&<)I7gA7>G$u#hmNPmZtv!X_oDP4cLvV+Re2rC&g2NB4i0qF#XS{LcpbA_=Hqc} zBR(toDK)X97rkq>LA>-p0vZz&GoTGh8zHU<^C_g>?X>%De9Ptm*GIooCcRr=&GJGFn|LQi?r*b`~&c6@EA-TmMD^ z^WYosV$m>2gQ|{y(vokiXAoiwm-!%R_TN>fI9rUjh#W;<2YLyy2w>iYHXu@be0?eA z>fIa4Lmsnzb#rxnJSLJl1;P(3rOQ^K*Ym#Rd|*!48_)9bvvVSQ(wj<{GSZz)+5dvL zY{%^vxp9$WG3z*CA%|Ec{m%~{LuiG?n%_D&K#bjRehv{UzMi8T{Js&E6EQ&!X#FC7rT3gBzc z?r9%mlU@;YlrR;80{?s*^Goto$*KRkSc+vUk**K*iH4g`l{Np~3;ev%dg+CZ8~5M;fUaSKV$Mf2qp?<@MZInz5gxEyT%e210xM< zbg?9-;Nar=F*vAvVj4!mr}Z|!Q+ebLU!F>cvVP<`qhvdAWmbY6d#M}Om)zTf4mNXb zIQ|)BeIRi9MtR@JQO^O;pOzS5aP5?}1rjW~;@er^c_o2QA|B-vj?1# zHZsP?W!9M04p5a%UR|weDkz$VE;^IVsrsf&<1z(8KnJowE5Sg+(6Be`lSvb&fk5cu zJ?4Z~q(8PgFM=MwkU~g*%c@VPI1MWB8J)F1fqIQiKr-89yCn|%Lzg}{I@{}Ser#!r za{j~nM}B~d{r>znw1%Ue96KCOvg1-zDqb?n1;{oWrGB#j#4*Js=r!Ir5W!4n< z@SN2YCQcg92eHr%Z<%|>nP*fDVawZMLI=)g8a=f@nM>Hp2s#BIEYYq1k1|SvM3|}Y z_QnU#&`@XqE@5wbxmUCOTR15!@K44&NDX(syvJ?Dyw=9{;*AU*gefoIj>6iVgvh96s zF!lr}zla{&doXP*1VR`=vDG&4MCk&VKJy+B;X7iG^i0td)keaW>w1dX+?uDI2wBX~ zz6lXAe45~o06z$V%7mG?no$nsflQ+FWnF-!D#z-7gx;nrVRv3ie{i5Oh82TE)h!Ut zuIZN43lT8$7cd&B4==@CdIp#Ct{?%Koydm0MQTSI1na{i}bEzB?G9 z`MRCu0>SK!wBwtzwO65nah^E}0M=s4TL zET=;h31{|2`nJ1naG7Y(5GFHtU!W+yapWe)QJ7cks_9!R&3p zGPp@;3)mvf*z?%XOuS{ry&*p~9y3muvWL}kxv9`%Y57bjWIvrNd7N?JSW88lmy{}h zCs<$y^RDzTS+c)Ft?}eC)O+9{{H^m{e4@~wa7+%7BW_)p`|c$WJc;KN_7J>GqKY7L{-%Ts{C7}@t|wb z3+jLUjobYe%FHz_8`20OiUOyjk{q$pCNjsBZ_4HKuN@#w)siK?@yxN>G(E}Vqe59+ zgf76W5;Uo-L&41rb{}llT~-ToCfibOxW)In?YoDdMp}1kG(1g0jicS5m^w2QJ9V#RSnB}|nLR)VJOrBdE$ zkm>rm#*0_}Gj{%IP)Z6GWkShrCylx(1Cv6Qe6cKLg3-sF?QQ*dakQV)t6#!u$@usP z66AltxWiCWQ`0wAk-KJO*9UzX|JSjaqOT~tT3Tx*lQx?YQko(oVrf3A97qZn>xffp za1aZG_!5Z7Rzl25_wso^KZ;3DQBkZaH9he&&oA3R&Nq%I-MN-^YM7&tMtAZM63F82 zZSOsIUL4EJNrihgwaQD01GI7kzcujWO$08!WUb{vj^80f1jI-gMegTEOs-HPk~HY5 z+Ba;UCK#y;4%GK#2~*R|WTdxh(WodbGB0NpA{Lx_5xH^DKQhCIkNg}2Ngopv)2um* zdIWl)e292HWpQN1iEG4;^k*Jcya{NUdIlUOL9bND@a80SHWG3BKcYf%}!o)k-BS3FzEuCKK!V1T%gy!A($v4*ZN_*4a5_A z<{Q6|vkF*H*Z^WP9nEMCCsEkD+3ot{u}`?-Hh6=7w^yB4xc|P`S}SndOIl0)yI8=; zA;lWNFV@xG-tx5#*Q}K=l?hTr#F+b5F$JupWfKegt4GCA^`#R?lT3%^dT>P)RN5)$ z$nsllSK@Md_nW%IA1*y@X#WXve@byTLY%eZ7yKd(wMXWLnG&)xnFrrsn5uA)c$s>? z>dHouV#^;e=Jg{nKxbsX_x@!07QZ9Klj)|r0f4Q9AJOk8Yh_Q{n5{LV)pT(=L&dM+ z8rpxqCwjKWesDmy3U|Nzu70N4iy=}|NIec3?Ey}VK z>mRFK)DrjU0Ar7lTdE{8ut|;BN_%8H!yc0pcS$a_QYP6HU<>ZDTo#}7yp!ILc(Oejw}2SR6{AS!P|ETQXF#% zm1ZcCwBwXQO!~O|3&bu#Zt$6K=E(SLon1@85#Y-FUT&YNO(5hk8B7<| zL%@?voR|}}-~v0p{7%mE0+cd#jm6DtyOYI?1(DXN7449kqTpJxiK~GD#cdWiucLyP%)Wt4nX7^D zL+-{mn8cqFU^D@UjkG&o3qpMs8`*foc5DJaNW-$gr%KsgfxM+4 zn}2k^)8WUWsSU)os$rSs3W>m@!>d&-`YCFmU}2LlS%4NWJ^z3SmbtQzCI-OyWN;NG z!1JXVhTHQ)j`U+VPatflrtYo*c@q1N$v56d?h5OZsf@jmqPGLYgIe}9N=2J8V zU7hsK?F2$K893){r+*awF;r=;YK-El&9&X7;gUgx=DKSDB)oBq$xhdGl=J?~yD3)Z z+qXkFXJaCYm%0NyFY|c&!(Gs}o$a@g)Grg@u$+&0t(7d>Lm*djwp8vqk$zTIOEsBlG-^svQ@EnSVroQN`~f_z3T1nkJ83!vQg86Qya{x zbM=Vzaxs!Z$p1{^jxk~MtSM2uhejK^{Qnlzm& z`8*qv_S>5(?={rjRa4>J2ymNH$F<>VNdm_Hqa)!+J1;J3cp7)Ok@#g^^9e*oKzpVd zy~WyYZkIjC3>|0a$0nsOgxHA&G;h8tDWEXsnB_>gMB80(C9dwxy~RJ@Zpp}jfr;v)7Q+fx5Dv8|jt(0i|q-`Yv0rLK`JETJvT z2rGy z+Eml@&X~y(7+=h;P5OuExG>0&obdk2!aDNnA^A4ifQx{#~?RTS4ITQ=u}> zd$1I?an^>~jq{umSY7jsmyB_;JvL^)7;loS1159pg6iE!>yoT-P(flzbN%+@SHx)j zv;5*({r5}7dQ-{BdnHK*OSXYps@zY2@_M)DD-Am)vKoWSXHCxfKBAp(?@3@qb4}`K z_7t_j?Ix8uxO-i{@~UbRD-FijCkxxLwpQea`d~G<>=m0I4f9M8W2Q1dQ7d7#FE;%> z6ftoTpgDp}4Xe$UK9{E6JxX?a*&22t{4n&VV}B>MP`P`Wk&!rc&C=z99Dc@Z(s#bh z?WmwL7Lcy`CyWUq-m0ZALPx0^%wO7eXsV3B*u=7&x7?Ps?h6fV72k*)w01Bb$aKQk)IhR=pBJO zKAxHU=x+-tJA9tK*O0M8Q$-+DO!y|njLjPmB~c{tIa|5;a%0Kg)YAqg%qx_roIk`7 zh6N(XLGy6b6XCY|ZWDc7%QItFv+B%)jgIG${`$I-;ds9#(Sy=#P7e#POkAtKVQO4x zB41>emmml3KaZDqdF?|R@czs!IDt>300#-eN8=Bedevt>>pfrgM5%XJT6j-F@Z=G(mJE`S=0P zEx9M~60BuwmP(GZ&1R{nTCPIGdRKQ3F5ax(#wP69T75P#;@P}A34wF-ZxODSM_L{Xs=|FWCI{yIVJ(sJ%4Q7_D;3fU z%kV=PX3oayAc>*A9Q~6fuhFw2y%Dx&)%aK`zZ{ldTDm4iFt}O>?to>rT|4%2Om5Dr zIbvsZlJvb!9TGcIxB-qOFu3^NLDsr{a)>7!Zl7U>D}ya%d+)#CWJ0D8ET)13lrNkd zKG$7s9b%jf9%d@F)#S%wT$oZbe45NBdLguA|C?X{v14+U=@AsOgxX**Pp!r~00q){ zd}qH(a96`+Yb`e{gp7Treguzv+S#64sl$Vsa>|x`;<0i2W?+tbBTdx!13#hJl=sD% zo!|v*^w`1T%ekswwyuXz?b?bh@uPw?(PICZppL zRMZK}#kO1T`Sxl-*T&}#?grobpMt4zt2EjOFQ#XJwn7e@Zq~HZ zw=QslBPDqDG7m$;O7JVT5+x%6z$9&759K*yomV+|C(>m^&fMlLLwq&4L6L?B7QZ zM<-cr7EFS8~Iw)QTySyAoFSH`Tr>IwL%=a$W6s?%%%HuPK#d8DSESToYE zzktsbpRCnJo%6~NZ(X6`o~3nv^oD@L`GHmqkkK(-U|C~z?0ay1I9pP`{d(=LN`K|~ zQL#E8Lv;kQHPVKY3aJnu=dt5w$!MCH9+0l>;h3(?YANl*+3Uf=nH3Pu9ec2+<~1H? zTm5L^RI<$)q868F$d-hE0AMRvKqKxpV z8k0j%$dRnA*awvPXRD*=nPe&K-tY)U`~HDwK(j56tC0|M43t@B)gDk(mD7=+W~lWi zTa@EVF&dA|o0cP6G-*Ea)<626+Kxr@RO8N}9zv3n-S)!jV{7w+s&7Yh0XTco@Cm%V zv2Q5G^kXZ2eH)$nZw;KRTVso39Va2-XAfV?cf5<+1X{ucLMaumvC}ut^At&)u=@oQ zH6E9Q_?*ETX=NA(^fBmO=#zd4589W|%SWhZmwp`|;~FI}fxjM1NuaLt@QZ#Q1$O>g zT||vj90Zsdo_&`D#P#fV@(zbmcFt!T2QOGyg=I>=3tqC9D50Vi#Hh~eDK6!#e(N5tl9Y;DZpk2Tl60Jf7e?xhUgUdu(-@q08hVoTsu zq(*cn%;2o=YzEF`p-CJKY0I$=q9?jlQMPIwosCCvBnYHy%rBz?SaK_e*%7dYssI|U zZ@mUZ8b#S((*K2sP zRjIH=gFHLf3xM!xhWq7tzLPNZt4PCB?_(NkrjWY`Sf$KWc6&kv?NUx47dQd7uQ%Ru zy>_!5Ttq%qd&_e6M@8lG1Fs1|ZbucPOM6HUx5X@>A6y$HZoieuLg^4*rDC3`JUs8c z53DLacMaFD zAZlOf9BrdL6(7(VZ5E1oayqlK{SH?&wled6cdxoQ*M4$H{oWfY;$_gR0@hAb?y!Oi zDlHyMKvp29WjNq1O#il{wF_yuxov`@B6rp5xH_}utWx6A)rl9^chc|Q#44I$A>bQ< zihx{eRgss;%ouGPObB)d~yHgc)k$cIXwi@D>ctAo80+<$JN| zshGr9LZXUGGD<7@r2x+iUQOJmVazz zQ#*P_i=ku~Bn0~Pq$_@FwBCCqK=nX0JYp(m{}yFDGYFE)U<1c9NH`k`+T>@(x8An5 zxW^4|?SAzSpa>^D7<6P3Hj6ATbL;R^RkH&@gU>q;c7S-A;8Q+}(S-#xH z={ACtdZIXrcG4<~(X^I~$=$e=OS+AhOY+j#%6)ZgwE>e)=k^BG=jwOQsJwv^uqEzJfilw^@dd1Td};?=ddC6D~@>47&HY=yEr=buU-SajtX8?e`Z@Camr$#D0B zQt2e!?YsRv$@&1-0e-!+65KIPG?!Si#vkO+G@2bTM(pzWH(eH3m7Pt`+!6OsGd6$3 zFM!79yUV;E<6`g`h@l$=rdzyVgQo&jY&j= ztr%+G;)@WtLzba|JsN6rjb)N0T`m=Wk*CzUsRo|7M{LdMsg*q#VwhYXyCAMKgu7Bl zPmPLQN$ z+**dWXpF4?s?J-mgqYyGzG+R0v~_=ADh_dXg#nR$OZ4Ht4+tqv=>GFC&|a<-tk!^+ zO{}lHCkRj(f2~F;i_AcKV~{T28d2vaOBoAyk;BWkfrRszeYV;g*9>23_!KcE5egp7 zuVI4oRqRz)1@4WwuK@WyOGE)?!1T4+Dr(-*f9h&|w->M;sbCHCe3JL<7E4Jta4F(d zI+!Cpk~~Bix1A)lPQqWGb=LXYh6r&USj^#O{9nH?;r3aR0t#JKcw<0b434h8`)pD; z8xK-1M3qaoXsohynPEr$K2}q3Be2@=}B`QM`n$FKekvY-F@kpjW>v(n^3{F^yC&%AU^uPMLj^vpe>waD1 zK^U{dSb`ub6S2~oWlJz%%LBBU+PXK3yDZ@(T_mA&N2SmU)}%A-xx;~%N>LHvSFF%0 zQ;?k$0Ue;NHUwE*b@;vjE^gEaevABw**;ZwifX0Gv)G!6U7!lr5fIrynS|u)`O+H& z39cEesrJN#)VXCZ;JMM$m`QfLvvaF-N|f@JMR0sfb&0V}O3d>=rXg_!qYWbUMSlRL z-&$1^=DQnl2h6mJS_2IQD?1AmE1d!u{~@@?fpuKch3wR(rp{#1^ol< zCh`S30K|+=f7s&)xC0_{J=5k)2@vw(_Lh{yA(xk&WpuE}xvto2`VRw7-Im?KYW6K7 z3cj1m4DjfBv{AZzu5n3ai=pD%)_v4^^{^pKfiVJl`tG7$9BQnPj<hvU1RkP2()B2zd@Yz#*Q%U`#441<|B^=?19c zK9C@Fpt&;)S|^W4fJx2&EZNER=e++R-n67{qIn{Zf=9}{PUICAae^C*UD)y zE6U1CD`r`$&xqnt(#Ou_f)oCi< zO6dY`IkKPN&w$Fx6JMEGL!`S4Iq0X54*ebxF5s@|{%O*C7ohsio7s!C7e$r2Zu11$9-cOp z_!mgZvJ~)df>40@gWxeNNTs!D^*?!YKJ^1{^s00&u;<;tU6}BEimBlvKf)?CoQ1nv z!+oIjxmWxMR#2{Y3T_0h3HnjE*i-D6jpCMmcrp(mZm&;tE~&c<`*vI1p#PK@%W=s# zuZj}(knh29VfNpc1)(E94IdO0F?JX0=va%wFO2m!MFbaeS^13AP38Mmc931Ibcc}e z#K0x=U*qU?xBpHMPT0`Hf%5E10~6fFQLgyuB*x;T)ZI>Isny-T;$llJef0VtEWltq z=cpvcO_Xh=R6K28`HvnG1q_?3~5lN`m)dNR*>JIi) zTM(Y}ys-$#lPx99R_&Xk&gX}r*m;ptF&AG$tI{RKAoWnJP;bQ*1i%x~4k!Ty zf*FZDSo>G8?KjPh_qv&UA{-?)nK=gLCYNFDuK3Fv%ztA+{}-yp>)NsdsvQ8L2@?Yb z!CY!t4JrQ!kCEO3gbWEu$n>xYm|&nKh`YT%PkbW2?*G)Q?}VdTNnnht=>B;;ud{>i z=B?{T8{UbCY6M2Z%&qdBt~G?VdbgmoS*=@aS+6+$#QVswTZizeIc>gF8lOc67Da~&-OK891JI(|eiBm8Ov zbFCwtSIH(+!3=*5(sfJd9vBB2ro^P+6?HT!ldJP%5QIXfqM#E31$@=uf=K#BVm55S zIs}94K?rHhDbDS66UH@*Yf*N)yzW8@D@EFHPg`V!mR!$c;(tY=k$b|6 zw@JvdL{)2bzP_i&H7F4;!#B)j#Zp0x3R>%Z5A~ZDl)-CIl{i(VPO9vy$2OaXVyycB zNUuCliX4j@yINi_C*@ZLW)_2~EXcH!gdQIwS+DZ;@#{3>%gIk^`|o|ABaZW9t1ybS*Rsh# zw$17(jg3__Dz8IqWQNL=s{UW$p}pFXmg?N?okFexjQ!+Fk*bw>94j+1(DR) z@z7L_Vh?vXf&d&UR8-mM>ZDw~bNe%Kt&iFgC!C$4I+b3F>gw72f^v6ew7BnnJB5+a zr7XOTBFp!gA_!5D$yDDpl85u-2vBSdy_amkEUkJMv>=KO_GbbozU3Z!4gE)aDl#`D z*WrC87XT=sN0dH9Dv7*BeebK3g^E&e%5@3km)A_@r^{yQ%cz{VHTPnC0lH9^-uT{EL5-ybidgxNxk%h zE!m92`$&vnGJ`%?Y%UbV7!A05<}C-z$rTLN(?&~|h&8t%Hj;zL+}srA`3!$du(&g+ z_f=~-a&MjW^wDI-ZX1@Ppa&d-4I_T(Cx_b=;(|?2?lGb|mqVX2nxM9v5gFpGOrZY) z2JBgE@1f_+qB9{>L=FUvwYz_-uvh5qxdOZL2*g)3eEX(CZxiIV%omAjYk*_Xa_8Q;E5MLE$v z;s$eT$t-}x5rZTOuNDt9@&159$tNJCbd>wxFB3^lDdZLP?OgY z>n?Zegu5DPiq_4X!d9x}5>{(ny%AD7LK`G&oJP11#**dvC_{E1L z^+>SI6JOiFoA5%L3!{8gGCef6{-4ZDjC`38&GnfA5fYCu%+gWEtbfR)HTDQZiveox*g-p!b&BehuAFUst6F~ zTa>~O8}Xqs0i($Em!(El5w0XeFfi92s8BL;6pw^*2PH73MzXTk$*hYy2YJCPx|4 zt7@#j)q~^zHv)n2^fzJ?pQjT-iE)|z6qut=YQ1!b&pjKR;icTTb)-g%;iuL5R!4bF z$vKm6fH7GRM*@In&FJ&bGh5kNKfFtQmj$q(s#Le`?q`wvhr?v2!+HmHdU>T2CE?nf zbAAMXNyo)HAO)__bJGCa^f3lH*rTEmOqhBL2W0-XHvAbRB}S)j66q>=_jLqqxDg8J zdf3D5uR&s<>G`V;rkj_PSX{a z_bHF46@zU0C`%y1FK*9+)pfYgvTFO29}B)HhwI|~3CVOE(JuMJHZxt*IV6vdD%dAa z6)N_b1YoI5nhNVuNoNR~c}-pU68jXhC9*57Q&aB5KruPPgifr-A9V-JA62fyh>82; z^Bl4Q^HcqLK6b^xza1a0j0gFZvDesNkqZYdTYdS}iqQ4#6jGm-_+xZhM#!t>&cSpw zk*nF3ArM`*%&seYO|hjx>>CSD?TPEk!-WgK$O#&-PD$I)z)(H6P3Z4}Z4Ve4IljJY zQ@vZ`{}GDdAYjuW~8$R+E4wvIKWG7){*El zFP%-R2}aqR_#`kk?v1TFhA>@9BKJh+S_|`en;73=Xupds^HR-FDls4R@5~x0)olI( z;n}`{1hmJ*^rTc|ztdrv|5`1Wf$7vk3{5!v_WOf3N=gCG;BiKjLK2T|({u z{}&WkZa)PSA=HrTU+)}D))W`Y5*=cxl;F+8FUZF|c1K*hu_dH-ME)J!pRXdmf3h6^ zeR0mZ*x#(h|9T-uy9`ck=1+&w>c>@R=tXbd4DToc>!ac?ge8Qaw0BF~_b92sS^?(F zo~cQdkYVyQ{X@>w54^oLj#b}_$B4L2W#CWNMD?ZR45U^6`-bgA`g8Hmi4%M>-6>4m zt?q1@?Ch+!@d1bl(ZeQj@#Lt{X%AG-cY&C%Pk|37({jKJ83woCs-Rt=gV!;7I*6uB zmscm+KcJXVRhF3=-nFYRu$mIRa$BbDzLYq5je0xcIxnTHZ*b_+dwXGay+0~@myHvB zuDkRg4W#0 zG?ZDEeYzv~>rtmlr9lFwXN5>0CMRMc*ufFY0UhcJC zcnwDej^ZJY8X$dVA=W)6Q{hCFHaAZZ3toAG>6JZ);{h{)h2&=0)>uzD6+q`8{O1F3M+cHy7w*!|I!vF5ydJQ6Ah+HPeyURLI#FxSDW_5uD$!;y!$^vQJY1@w+nV)_vc z2$`r|+~N~lAPM-M1b?kkc*YIX6Bh2%(`G;H`5DzTl`7fs#vDEerS5P)0W)^*&c2vU z_FbFCw!tSoeB`BtFf^fXSov#w3Q>QHEg!z|ZAcpnB)6ua00um{n$`cFDdeaZ!pA{EPoX*=Fbm~L3IhJs%E1vHs z_d1yQ>||04msc_VzkK>DAHUZ=Qtp7TK|$CSp2)SrZ3@}C?DC1)8w)l6j*r{(d6>Zq zy6kNx*gvOh=>ZI|=h<|O7a0~#7O#mXjQ%t>7mwjqtX#p%)#+hsuH>V5vgmsU_tqxw zEvNatcm<5qn{t!}XP4OiT6gv?E2?ipa(Xk5NJf)wyineF|+%I;y ztM_WVN)I(6urhJ2^m^e2Itjmf`smnwXk1afGUTGQULRbnlDrzlOL?;J7S0n!s$)&z zWFeDVzUmw8NZ-KuzS#mmRXdD)l%HgYqz?J9P&Amn75AB`az}~xS)Z&^lU!hKIHZv5 zUT;qlkfCK4i-P_2ka$OjJ;VyB{rf7K)(HLTrvwodUhfJN+%G26SIn`@lvdZ*##6eR zE^Cp8z=aQCXk1u&UXaIy?zOAmQj04G=pPRCMltug5i$plbtITx@b3a6Vz?g_NY%sv zK|HHbNtq`S^V{?tb3X^*J37j+Oa`+v@2@YqC2N?)S6ep5x#G?TUROHB)yroO)$PK5 z57B)qT`p}I&PKs--Mw?FBlV@cviK+QA;fek4pdTado<2}w%i}zD|fwix!~+EAp}|U z2Al#zJSKHRoBtO?$xD{i7Ls>ID2SuNQ`=IbY7m&DDI!|!$h=>#&Q#sWiq z=gy(#8|peAQUGKOQtMPhN7NnKQ=Q9Jo>tE|51$Q#gbI2&&F`$L$gl@>bc?-nOP$zM zg-^RNc+X52cI9SEC4y^ogXJu=dA4sJa0ABadxsd`7PVi0mr&4MUnf%Sn$gHJ%H*5Cw}osGp2AX?{tUiSum3-xImF{6Hc!5q}&ygboTUU>Yd$lDl0#5Kjc zhg$g>FD(Bdi(-5B48@{7vYsuz+SbEWT5zg(1efe*ITwoP3@RdCCfr>jCS7@I9ho27 z-LbYcwB2I$7N$2^gP{;#uYM@}rw9i^%R%31TT{`{kgZ(sepu|ypwnB;k?P)0@uk3u z(ZD(f8|VDkDE2?@r7;;3Q|)+XKy+m}8%SKu3%!-mtt^*)qGa~`-R}B|4MbilcRXeO zwc)W1IB;M8M_g6Df!W(VnIhD9CamGk6$;uLmyiT}f>5Vxj<}+8CAtaCv{rt|=t~1l z_6dR%LudFbSCFa7JQi(c2-5tAJjw*Z_f+(!6pT)%r-fW?3V+g(Jvz7FXB@{kU(8c~2 zlpVUGo)Z9^Bh4NK8rpL8UterBd>3#$7PT6;oZ`L*-EdA*;-ndtqywxMi(52OX$*AS z{YSl#nYB)RrIt(csJ|L&bqH4Ny>CF{ZQ}g?RGs^qvvj*4DM^MFU5W=LE;KS@b0@hq z<$0Ap$OK(JOWr`kB_>KG-Ext?b|^W!jWBjr-^sf@kPTjmr68u_NA8bQ;(vAom}-OT zaEf3(<;fO_I)ZF%HE>{XjlC*^$FCr0tNk}KYr=IU>CHVlMBoX9Zs8I z12P31m&9#jy{Q5m)^y_b7Nu$In1-e=W$G$AbLkEtsOhE)6%58oTqRsBjJ-S|YS&JT zdpqsi&)w1=(S57i|+lhA|l*c+VC%gSZph$+D!itXD&= zV6Da#CvJm?@Qt*vY0eokc?S#Fxt8moHjmzMRC^340)39w5p4@pNjQZ-p9*I;i?zEV znNVweP3pOU2r4J{Bq$UYpu-TEHRNp=jeO=}LF`Rf>;%Mx>7|ag?y zd;er)Hs%g`t=`0v=ILk0)?d*(M2Xn?@}thiq+l8WT^Mo$2wYPR+DzSHi? zclA7LS;Q9+IeKPKv>8N4ui*9PC_U`!>gyJbh0b$v+XkKqQ;6J8W(|C9|xP!ntWItLx`p6V}LrU}DV2FpEQuB_ot2q{@ z?VrZ@yK#3=o)f$bD%m~Lg5yVj@vvDGq<_&o@z-&JNebN>KGnZFqWNaqU)Q~c(wDL zT0ca8D97_vlt*!@w!Zxo*|%qbIW)~Oc(_&zE|vH`#H&%FXY<6p5?=1&rB9>nRMmRr zCCq6e^J_P*^1cQr;CjNI&}m%Ry_(B`z&#r#q7`nKr^?>siGe`NJ~Z`ld}@m%EoFNy zRb*g&SP-6H9UDmmfzfQhR-92qx99GZ`)o2c3DQY_>nl;QnDIRA@;KKD=Vh#YWDw-t z)iyGQc1Jx-*t1CtD$bbo^*jSZ77gF0#JArv=OF=UoEO*RD71Mf9q;rg`*_CQkp_`# zHGy0*3tJ&vey;Cx=uMc-E?$w0JZoSWl>zz$5)_M&&IKl?Gi48VyY-f$e;8Y6crIWO zQ?sy5Yx_1G-z(U?BXa~+h7K7H+nGXN%1KX8PYqwG4L)+of|RFSU_c1{cW*oXC2&W1 z#aqsThqsAWKkv;j$f;t)_ebucLa}k~&3;43{fyOyr1s0{&E8c1x^{+g_)yp&nPblB z-TP%`;AOKgH`g<>;V=wg6OG20rvxn`3XaNwGHo@m8kLN<>h7_k|M)ye&Uue7Tr*y` zpB>uyksBMpVDaL)8oht7BqY?A2x`nXU`>-~?`Umx4}2YCa-U}l$7N|*y(c1J+POZ& z<}o#xCHsMciZN(^d%X4J{X>RXH9B0!Ypaq2)R8q&xp-WpV-fY#$BNdd1M4K5u!a}| zKpUFKd>K!_QQKFUFJkHO8AY;{5%;}2-Rkox?+ndp!h_!ZT zx3RVwTb(%ZF1xKJB$U^-R|Z*ZbWFQ%2yG2~Tj|wP$^9`Q`ey4)*r;Ao6C? za3{KYlG^Kx0H-G!jguk0WW**Phs;rP%s%tZ**)HLas`k5sEJ+?6*G}>dbS%FS(wag zY3aKs16p5;1YzDVQ6+m53+kOz*6zIol?qG2_h$l)f{tGAm)8+edL#-Y|6g)LCbCz} z~SVup-W7QU^N{FkVTPJ(~AODHc^VS50iIHB1%S%^r_A%7Q_@R^j2#kFoc5M9vqCiSItyt>#?0yv!Xjw z@DLC%$@R^T1m8_xF)zn#xAyNn!J;II_Sf3$MSDE_5{IgtS+M$ zmjTDqlHFQS2!*RhN?2MN(Pp!QZRG7qjs^sSGCp9%)6O|eQFfK0jf;_~RB@@ZjD&I;E&&T1F{nUw{ zp33OCGMNJxq8x7-%PVnS@2}kV`}*s56zs-YR1G4Y`f1|Rbd;^%yN%djc?A#bCA_(3 zdN^9V(e`Pio8}I`mp4tQ*1ZZj5e+&yVBH}4rte;KB&5qAd?l|V^MW5-Y`Ji}BSy7; zr)(wE*Wgx%-R@7LqxW2fjy!VDqa5U@B0~{T+=+_vGO%Yj-vLc^Pt1r-=##F#1+2f@ zZO>jeWI3LA!=kFZ@pzxvIyZ0*e$!qCA?E~7yuLVON^W(%lMg<3aQYX<_M#6NIbYH@A!4mvY$_AD=PUn;nqA%MGG+|~ZNj8g3n zCrGiXmu)+si8c#k9Vw$V<5de?b5)r1oz@D32woIoK&9o{mylL=jbr{q?>G|~jJ4u{b8h+Ud_jMIzMYnMD6ODOHxf%Dk*U!I&GRW z33Q$wvc;f3VDn#Ty3iMY)guRRpqXnjL8nhA>VMxzr?;ZnEeEX?=g!-Ds ze1H1pQ~Fg-KCE}Hs^07L6Q8)fMHsdCYO^_sCY8H)SqyHH8-$YrFN7yV?}ItIBT!Ib z1V>AUn9ch_Rh3glZsanll;A(nN}CR=$d`Mkhz_wJ2ewE7W>BsYU%rC8DQpl9qGP0^ zl(~22kGIOPO|?Dgnwe*hjT^9MA~u<5dd4jGFq}XJqffJG@Cgjyp<6p@Xs$U%f+`?S z@Yb2p#;hbJc-a?Azd0c5sdAbV?o1_{ENvfe#UaPI%$GGg3N0fWFLfaejLSd~Z%chgt;4R_cu602ZoEu$2`|+Ne?G$7ooA6t;iI82<_5DjX6Txc0IYw|X{9fHLaCy)}#}d0DfM-R$XI$Ea zIa`1kj;TM@BeC_V%G&l)O8CL^Exldp%Kkx`CsZ;1TT}1@y19In8XdVL^sG`$b!x~xN zSPJEJwlUuJE?sbL8HuaWqN)g=VQqT>O%d~Td6@8mqo0$^A97Kmqi5#%dR$ywcnp!b zO=G*beBMVACOyI3**nr{S)n<^LVW+2hSpMV8F41sgG{vr`QX+B`NrJjahr_gcqq0q z(LNwXrQ)72O*lT$ZRH?veE!!{Hw89uDI~k5>{t=BH88SIHr{qk9Pq4`eiqTgiBD3C zy~Phg{b#Uv4LGQc+uu!K@rM&ct5xHk@Zvz&s2WHOIi9K48~%`GOW9b#Q0Hi^J6T+E zjYx#Kax@hKL~xkR?dXPIIJCU-i`Dl09eW6%L^fpnV|M-44Q@e^yK*c(lD<#Mc%$jI*>oM}zIC%}A!3^EJk` z{K$#>o6_NRr5SHL9maEZN`u1yeK!7$105Q6x~M96giWbDcILe`8^hDz_Wy^JU%l9*!3hVxU8Z%dazP6{tLVYoUe669Zb-m$y@A_ta(@&Kz zSvD-ZLuY?B1Xw2eY!`k#vDW#NTdC;V37n|#1Lr9pmDl3Z%kdiex&RkzN2tbh*@KTS zJEoG=JNP&$)3!9!Zla*( zZz}ibU`k77OZqY@v$e!UQcdDO<;2z3@SfGxu>#uk=>aUDzQ1ih>QOCphOmrpLN{ux z)<@)s>P(7z%1?l>&%TpGNgV!Ph%VtGGnCCY_H~cMMM#h9b%WD8C)z$9VVtGcV4L@FDk;Igt`w>KJanL8%q;*Nu zV8Tu+wHDdv!?9iTQY75W^^ilzOX+v`>&#kU3Sh zIa1HN8YL{2o3He&t?y?&nUGJV#-%ciyLwR8n{5>#1&$eNklZdtLf)5qY4=N8#`;fC zhL*Ll<`uv|1K#4klq2UNh2TkgeZ9QtIzd(Xbr%`)Vl`TuyFX+$Sdsl9C5x3DE*Nd`obX z7h>d3-$@-#kTrh$<7XA_i<4Nx>f5J9mJKKGy?EXANmAllh9G_DAksw{>xd@_9iItM zfC7^n%RYX&mTMa(Z|7WDlI&kD*#@*3dG>=-%4k+6<(Z5o$lA&`zjJ;fc_+>RCuB8h znM)lrLcZwDZj{1v9i^zmsMJx!xq3~R4fKd{rkM1WV=Cne)hM$E;3in40{pu(T^fY2OF>V zX06N-8}@Q}g;-jzzORMxo$7Loe6XK-y{vXmZWkjZ96g`CrXuc4xfc4%s{HiFQ^_uJ z7&GwB3faUVZ7n#tVL@U)rF}B+Qg;L~Q_7azGSO8 z>sM~}wrZv_jzdThqR!1G81YubUGRK4UF1H_Dx(KG8Ic+9j*bHsD~8=Z-Wyi86p<|5 z%7xr?{k1$*bMESVy8{qBOn-b?J9sF}aI(RAe{^VV2}U?Ea;PuTdbM?()iJX|G}%z) zr)|M$rNr4oYQBdnm69QIaU>GmGJmi4k)J0|H1yE`kBVc(Nrs4pTHr+1mlx`_=}aS( zQgj^2x1+}1UZc+v&pUF+MSvVk^0?gY3!bl+_HbNx?p9wW^N}0DYH!cS89%-PE8r`~ z;OQGiBX@(7KMj^+Q)st`MZ2Vit~J}ql4=+|mi_G`+D_>0)#eunqgJU98*nOEtarZ% zDFA7LKx39&C;^xhomqJFiG&pXCb!OeJyTgvhjDQWq8zuZH2>G@kP?RKy<)})TI`F` zXdnQ9<;d4<`NBgN7frVi$Af-GaSctHSVcavaEcG&Mo1XFHy z&7?tKP7)Jc6u0gkwp@dKeH9gcpFALsH>A7FcSGiv!e&N0Q>n=p43dtxRHgOnZe^{AZ(?xiyd8zEe zSRiz67lzLgEO*cI-AZe8SCGqZa>U#Ki?aIXmyZg3fFF`*Ph2+#hlonTfLkHYr~Qud z#?BlLZkeKd5vxCcx!Y|qU8+EhBzQM!Eltwd)Y%-D8^dJTuYF8YNQQGSl0N&`^V+7oIQU! z${dyhOZ+6b-4sCdVD*(<90ZxOeD$bl1#IVg+fZ&q{dSt_`(UB*`uYzNc*l3s(!OP@ zLgK|j?G^yfjZ=nMs+OM%F<+w@y3z15FY!2m5D|rE?o31h~>$f zDm7QME@75UdPH7WFxY{E$kBzo!3f$)<^IoLWvm;KyC+Ul%&Xa(OYXPpW#%JDkAAzY zugqPbijY*)wJ4s$jOmqhHWL$sND)dXO;|@GKYml@e>m!deqj;7uII-pz1$G1G2)R* zVAkZ5;%qft1(vie7j>|lzV-pQCxm<=D!WR=eyBVAM`eh569-wPbV5)pcinyI6nc@OjpHbeUEY zcLrKazTEm=zv#~A&$7n8k1>&w3?sx?APWbq07D&~G+xlV?8v5ib}RUh{lrObfZ4q) za&hS5hekJvMo8h@{^#tc;h*#`ukW6gIS1Pj4;OW$6)-DXDMxY$$LofwfP05f78lF; zl&SQV!rj!XU)qA%Zpv;Vt>h10zV6q!3fjdD3JL2}XhHGuzx^pzvM`bs=6crH@a=wl zFalG9lILIv#O(l>gH28?W`~H}BoITt&vU>1{)_~EZN9Eg#~jY!OWoh45}MiaW33zW zTLO)0is)4ub@x=6{M$NlziFWn2=h0_1{-E@{a~!Y2^P{7rk6kvw)N( zNMrTk-3y8or&k4Q!__Uu1bHg1~MQ&5_Zs?}tAW>>-KQ8QS+eVcoJ$Y%4?N2X^vQ9|CRR4bl>UN9AYjT-Y0?E3-(_hI~;Z{P5tM^^if zwuyMFUpBdTzSA>J4x3}2HX8-Rq-|YmEhAmkVrF`ZBXdOo4-KR>baHtHd~p(X!%4U= zEN`wsM&q{_u{Wjm_N?l-yW_f_J$}fO8>ssyEWYv8>z^G>fB1+uVa4nF15^R_+0FED zDM&#}@zNgd`0x$QY#vDt#CT@+$78DG;CO>(KQ#+{rC?GR zV(^{=SYdG;nBzn&S4EipoI^h{-Z`@6ZJQx@haA{Md)r?rg10k!&HZB`tTQo5X1$@O z_;$s8M9b{;P;XAUN>7m$C~Jj6h!{`-D8-D7itgL#O1av}S0s|aG%CLU9~BB!iU8$Y zk&X2DgY&VD;iD_;3&*@z@rK8?y(SRZyTr#WH`d_ez#XSHp-8#)o$O*Y8+2+7k11Q> zsN2(DAKWF**S8piZ2BZ=Z?+vF4}w^OeQ*=yF;ce+yDVi4Q~D#FuI1+RypyA831?wr zbYNY2j|z_y$os4su#e@HvX%mkVSNf}jGVbQX;-J9t6D8}s-REJ+0nFEG*@GB0kHUGHq~fCZg=SVD1V4% z1O!htNl9Dl3}3Oe`-H`pAJ)ROH0FDvsRnR@<~`aA09&Pj74y~Y9)diZCx!`(sB>sj z4MumVT)bS+S7o8)YWn-??IPE>)%4d+`AI1Pbr~%-B4%Z@(?x~LNi)LRAP-4~V32Tg z)a9}YIHLY`rS$63-CI=%)=D;<N>N-)T zt=$T@EUgiZ!u@TX(p#lJ$;;z-)e*KgHJ}Qeizm6c$bCrAKFupjFC`$$`3qtEa;LKz zhK3lyxzc;M3BJKprG|4!fDd(45p5owO=NMF#q%0Ff)JcTE+%LL$wDZoTM1zu34Z-J z49&<0kRcYKL>x>U9TStp;lLP(Mb&V79ogYa!lBRhU^(AiZIX`PNP)mA7*fOGmut6R zs#VB0dp!m_R4l>vt8SX-Ows$C`QmCTU?8-4lIz&}^CO8p5<< zM>gpoe@KBh%^q?ctn1!Z$ODTsj^ni^SZHJOs;-xn8m;uY!$p7G<62_xS zvV-~BT&JUD84oB06Cs*)E;@Kbv#C_gkeU^NA~Lk5uxPAe5aCg3yXzc$ej*8C^O@zfe}~*(zmA&<8_ic2c+#(z%SQ>Gt16)g*qkcFV~&ot9_=f4q>1)D z)cyx>{k`F<#^=wX!s+*_t(PJ<$G#e64@=dB9}RfBxeK&@T3o-}6;#a@7hP(c#uPi1 z+?$I*RFer5|z=K4LEuMltwV5Hu8s=KRaZr=;<7Uj#RiDQQj=MzO`g+ zGe3yTVUtZ+H)F$2jMhDn+nVe=*9v(svaV=|eQ zO!TXvgjbzZLHHa&b(%$HEU=p0x>XbYeuX@M?H&g=rsK&pVQTL>!pM zAN7}vufJ*p`aKb+p`BphPo5I?U|Vt|+^O%;$!0M6~q|GM`U`SvvC=CsSW9rk2))znXQ8`ip7?;hXeAC%Ih9$$!bnZbe)< zTk?SQ3Y4+x;No4wJlX6cGlgn3(0SXL-#IW9 zVTwhfL`JxC_Ee0F z`)H4V3^z;aR!1Ecxi2!L@N(P2i zNoQyF8FUm9!};p6tNY3_>DOFD8m8;(NJ$J|XlU{YD*c5Qg-_b%vNNQ=z~=hb$ctvo_>;h3(ozK+1;YgxeEm?&Ly)E+HgB?`za0+!s z;Ly9)qJ$zowkC&0!R<27A|`J-;^StcVL8Bb)6R1Eq%5i>mK5XFS~aa>_@a4ZtKC4f5zSZv0hEzw?2!e+MaI${5D)k=&pT`0!^eI8nG? zTBghZx1CRyi@&6*QF(lyqu1Qu{2)G;Uz-Z1 zbCIpVV(I6Q4U@+%4^@|_qfe|~)o(HLs-ywQ1E}<)-3UIP+yDlfEeUqW)Ajl}p@vnah<9d6!Jg|?v zzgll65CSER=5qhjL%oVw;FsK;dxI1u$Ly)j;D%UzN84Y|jsD)$aJW-(K5>0@%LnQO zK4WDy3w-@;ox_=}>#J+mPy2^TS;nR>rfz)BR~i?(OA9+nlgLPcH+ADf0&ol1cnzpV z!T#TpQMk7Z1=1JW=C_%9f}r@^HoNnwb2V!`w|f%KYik)yStAm zY=?h_)VwdB8c|2rnZ@tBN4) z@BARb;LvM_k%tN%ZUXD>hGen}{YcW5pr_go2}{9ZmhbvSu4W4Fr6Bu|*7acuVd2s?DP{QUqZe{bOqF1Dw#Fp@+5}0>bovLM^sM zSug9P5lU%1);^yZRAM}f&7-VLs?J2th7dR5eGU@T>1D5(chFBxj6x&@e@9di*DQ-r zt(KrBt42m35KHcI+3etRcW*s9NIAy)WqE&cj11(-ya7dxth1|?pIY_tfkpa=&`p=>M z0^ukc>FyK12a3>7N2o0eyhw+zhDt>~pv#N^?)HUySuWS}uZ*ikulZ31A zJLNgKgMN8g)f8{-nar^uidzqMO@{s)GUtv-OS7!GbE}`BUUpwJg(KW}#I>+>a1cIc z&T@W(I9rwAf@gGJb%o7#YTI@N7(0Yeer9LikqtpY(kWoD?*825d}iOd?txmZY*MH3 zL-KS)&HzHN|I6wLcPISYwZfs;`u?NCE8gT9)57kmSQ+RDXDATNOx-mfr9|?NlpcJ& zHcNo|>I{SYHO|wbh-`M>>Tcit8|dSUkJ_Z{tA0jfOZMm%zI8-FJB{7aMGg#Q|HRKb#a@b&=OzhloG$ z>jl(wMefB;dLu6;#p)lh{X|D-X9PN$`$At*x&!+|3d`MzjLJ~72ox{X<>Zcfa8{?@ zc7U9(FW{*nZ?wG$&6x-}CNOIyql438KH0+TzT|kUs95o>i{;|L{uXyvB3I{37Z_bSu>BSD*OX9%Xp|*$b&ZZhG%_%NtZgeDIpcoo&EMP|rPt;8q)EKe z=}Sa6Oe`r$nQkX&i6?!w`7QnaYPAd7GKyXU*aRk5vhHv6O;sR-QEw$;pW zgf)g+ezcPQis-D~^0$eDkR`ob|NmHaRk_2#iOH{Y{(z4WluK$+@0F3B?b?&Ji{6nb zf_u`cuk>!uH@=K)nf!7YqMPSlSYd z?XoaVVr!9y1C*k+q>)X{3jIXW3A0V>WMl!mY7O|7{>zysKJe?2qAGue%MX=oRhs9m2y&T&Uc6+)!3PGQHb)1KVJf)2YV{f)C4T zBk{+^f}M@*^;&{x5cl5rjo=(!*YTawC_zp~V$_&cJp)n8n$If*tX4N4sKz5kdcln<}4v*4STT&kNr|O*RyqigP=`jO5)ZG#i zb|-$SDiZ}xQyqJ@@!ww78L5I^ltaI$=@Ovekpbar|s0SVk&n9i*aSp#_;@;CC?Rskm6~}PsZ@(CDTi2I7ieW;jzdBYH z_+})o!s6%)G2uJv+VT?OgTKQ3)YSBoZlC{0ltWaE z5592%| z>zd_{a<5od^$cN;L5cK?j(cbw{xOucs8!}|Zq0s`$MXGb0*f^QRBL^DtP!uOVX{71 zuC(wL$4bPMU&4+fE0F|l#}0BT{q*?Z6hr!tWM(Xo0+u|>$vah1!XE@uZG^_+TejVC z%e3A8P;YXa#*}3wX?i8Py$S`F+AP>6+BS7#|l;}%I>mhA-(SZd&*nV7uW6pz>( zc$vcIxQ=~rD`aEylqKH3{IV%k-R-;saPYE8*}bPR>q{Dc5!hvl;|^Bswr5j&j2h|8BxuSdP+wW zU*BNUJ6^GEAsNL8zuR-oMF@;d8k-YuU$h8~5q6>>v*#X`hrSH1$X+EXeb)m@Ce-x4 zK9%V=%u$+XMkiP4BU9$Hk%Zx7*wYroEk~T#Co@c1cQE^k0YI$y_e;35Wuyqvg}HuD z<I&ts46b z`XH)vTQ#*%6)2Iww3fLw$Y;fNT-4u<%i|>X7Kiz3;(+BQ-f(ab-scwT4okijr+m+) z?~-WrjFjzhtJ5CGL$iH1264P6=+>M+^sdIrTkYm7CXI*gA=K1KfM=KG_G=&Rk4l`J zy+k=2nyP85gMJC^&h!E&$%WP01Cx^Qg&iAlTC6Z$x}HE~u5@Xoog}ac5;UB%1Wbt9 zN@X{CDKnoSQi!VhN|@dnrz5cpJKLXz4kh2b^o7Meo*TU=_;_sb{tK4dL8yv+PUhn~ zvK##I2^9Ujmby&X^-&Bb()HJ?2nD3LrE-MZW)qHk zF=Xhp3j2+b9KyfZF5B94c98aiG~kcv0mwfJ56%4i@IkvyuimVDiw@#zNJ<>A)()QQ zjHaM)$r-gc6TSxw%G2qcnG8`l)%IZVDz0OYnsA)qP-37PjUVk@K_wA+8LLVqEW>*Z zkv0&fhPRAvHj|N* zUyOsKk=XFe0?JphcW+xFVhV}q`N_v(ASBqD?T}98Vx0$RA!4G>;X;G0Z{2@%t@c(s z0+6`2i6Nsu6dM5fUPtgW>T_{G#gc2NRVUVa;&H8!6_LLH#Y^z7;F=ZGB%3bY#ieg9*r)z+-T7D@G^Q#N(H|rm{%E`^Op$S7l`(ikl}> zB|)hampuvV)lf$mbQk$DFXB$P%%X=!obA%V^c7~h!^6$BwYj7IL+8YUW%fa1V5W=IyG|y zwJJ@{`T0IxUGk5hXu>a#l5_+sMQ;N7%@c+2z&Ld_Gk6;$hrjWQ$G4nDugKEtOYm#l z0kfA2PBKS`S}hn&zy*)0J!YevZaa6luGYPaS=xMeh55o$9-v2Zg;qo)Zcpjf3haF1 zgOnYO#TrbtCeeBHjiEiyZ%AdFVCD2i8|owJd2RZtHQV*%G&YS_KL^*tUI6Bm7HF_} z_Y^24H{X-x)dX8{bi20f`kEIlXzyKuDrc@l{!hVh)!L)S3h3|ppFNKSA_~e~$ouZ= zHSR6#^Tq%xjF-He@6P9 zq)(>jyPxwhM=(gg7b`w9oeA(pI=*DpvgKvQP_80Tu1X?BMg7h#`r#1`O(X%8yr~S6 zNg+c$r^$~@c`A@boNfHx=NLL(Zj&DyG4kuSt4LV)=S0~FEVL|u7=JndpmH+-S`k4u&y zcH}ZE z=IjauJn=`DbRY-m5s*(T0@#AvT8C(YBSQ>Qe$HRBgk zX49_>%d+fr2Uu-PG7QdsyJ8AZ&>+cAy6i7=78*}o_Q}6uzm?J?Rcv8doV-P!%)jl0 z6vb^}|L!m1Lb&7umKl{~f0UGNQ)&L+w+V>$iHj-x{>5Mrf0Tp~&-g*w23AA34XCIYc1d2?ETP~k$WF(bUs*vpa41re=LJy zzLxMzC=shp=haC9-f-hLMk?C$vQC6eT&`th13fOQcj`tzBt2yscDF?*ESpX)w=A;- zrveZkD=!M%Qs1o163Bh|{14F%7EZcjHiE*#hc8`hO5+Zf8gVEnx}tNX zk%K}*H=2$hxa9bL`T0gY6f(35N^SUoH@W*NOoVwd{XzrRM_-G|Rhay^v7XwOD2Yq` zf5&jhA0BVb`1D$ilP|Lep6?k|-08nQJQtrRQ`TNACTje{Ka&24j!}${v*+aGXn3+R zGLo*^zJ5QDUYBtBRU&z&R5R4udmh1Ao30}3N`BE?2KoqIDZT0Q`Z5#Jum75pGd6KH zQ6u-MuC5+ik__hyOqRCQw-s48J^lTtR8&VFM3mc<1U28r0eiOzyZ^5-nm(I>P9wG> z75)TaNFRUJME=;@0%{DwdwmJ_r(otkT%+)wMW{552RSl2`h&eadd*`~b@s-e;JLY^ z1UlKqTYe)UBdfCgO*I*FnNkPD9f+P>-P|C6Hf5WRZ|pq{-&knhI~~l&nJpC*7$c?& zF;6JJpe#J10qBN(ksa?2=R0;2PG{cm636s+mo7CS=&FFAYkP%`$PZ2Gxu!P~>(^OB zLucfywlrzTlF*?!J?u^3d%c0bzFE$r+a?n{YKidHTi3qTjxY*1aoc_4%au*j*S2CB z8szd3Zo8*@(lKi-oF=%6D=y%WsIM3abnow+Ch0J#gtHnRF*4*z{_mCuRx!SpBI%8h zBwha9l|Y$4>w41_$A&R$TU>#~Q?uL~!BYs*SNG{h^yoI+N;auTAh@WRRx!t&T-e=@ zwe25_P)yq5?C=f%Ej-k`MkKQ-U{bD;&W9u=|2X)_FUBgUb$I<6>PrT=;?i?KV z8LBoOp-AkSPZjty!1SHV&B=W)e6?4cvismJmb#FDvi={xRH!g@clT|~i1 zNc9Bq5=50PieK!##q;=8S~Bs5Ad`1SN@vT|-NS>EwED*u({+X?gWErelPE){l_JPD zv+0XigY<~4ASd7@3|vK5TQe0>u+xZvS2CU!#?3^*bj72tu{;D+OJ)V8=lLy zD@LE7VXNb|yEXjS^uMvxLKzlW73k)sJ>RF*y}ifni0Lb>{TW*Y3Qp=Y&78(87|!ep z{Cd>z2;ZRuKi(d8aoVd}VSPOIs;Ecn*Cwc4@lK&uh7M0&@SYd33J@S_s)j=<>v)aA zb-}*)t3^SU@^fI_T=fGLCY5S$o&jqWAIIZ-6dt^N=UmP8U~SblPr|*KhxWq__N!{o z-~~8FhlJ6$KU2oo(577S=zDjNoA-Wq=Tg@ZWNfXgLA>hIH7NqUK%ln6m#+QMw1{=R zzP_$fW6I@mb4K^3;8moiS&f+S8|iqaif^-Dr4TbqD;!R=s$NIN`%ifm?hlgl24UtqES&6GM@F5Sa;+U-TjB=mISlwgx-NdvSAu+LctVxQtm5^>Qa zM!@&K>7T<^oAxK(&JffwQcy{DEoS$6{fW|%WV!mtBwK{@VhI!3a1S(lMn^&Z$&2r(DPM8zdRw~ zkdzkeTaMGN+BnMvFJ2<8B728T*>zK<40jF}1yABx{8gNYR|Wq<2*AZm zSXmH}b@9hu=={5BR0F64`#%i;|LA|(_V=v{kl6oVhu`7UI@T;+s@Cxf ztvWz~Hr3*A==H|sb@w;(`af;{d3hLJP7M_MT8l;g&|6-=Uh2JCzuEfeP_e-viJB!& z#VSuF(-7@!THfM|qT5P0ck$2^;mZ}N35|{+50V&s>#ju`BpuE#@3Ef*czO*X0lLaV zDxJMb2j3>SKtNDFXp-nMRQOWSKoVkyW1bwg5zOvsZ<6?a@#Opc)drEAw$%qSo`l!J zYmyS9VC&}mmSPjov8NGc2de|?>0Q2IoAj|)dY)IR+dMm-mb)-}a(D~>*Kf~$CUEI2cv%rPNcog|N-@$9i2Fe4W`aX?@|I@DO3o zxJBQ%LB$)0R5npd#HGkr8rsr=iV5$Md1Q?kCJ<8)tD#)c=b57TC~SnfrSPa2@RJ@{$g^tk$u!9@pBvUmyJt1do65@LgMQ;4H~FUS8`5ofX>s z`>;VVo%aA;6kzZ-MnAl_@KI!F(k3+(FBuuj6M1(eE88qL%{_3P44Au!bWpOa>+ro z$}Ip^FVyRsg~DrDBF}V`Nu@KJ8Jva@-A$Z9l|znn|Bey=2u;~^vVhe)$y38XmZ9}t zS*}=~mF#cDeub@mSBf8z8h6td1ioxGvl)P>{YRUkQITQ&ZRScFX5yK9+7&!B8Dq0( z!p2)SpM?m7cuYrJSVNwqquFHpP;Y8A`L!|ObDwmD^2_NW8xg(<_!?3Ka~>iVYeT`lbYp{c;q?!q z)>&M=lo#fS*0CV_ER8%@$AVYmBD6wT|HFjf@iQVUEf6n0R>J(O!OG_5@-V30)L;dV z*{)x{s#BzTtOs1H^Oll=J1B5b)4I?I_=9``PaeDZH7JN|>yuGcSHA%Y8r)^$OC6>@ zxDs%xj;okiW1zTz8Fuu5T-HHOQoWgWX^Vv4g^V=Z%_a+fkrm}iz;I{3VKAdNkc5C&l z8;F1|mGpw+QAIg8+y1BeGj$I}qZrRkm`IymnN8d5nZZcnmc0lM%F%`mWW#I|EPjsE z$s^b`!!u~}MtT#mW{KGP*1y6k9@(#lkBgj?I|?e66@v=fr%WBf+plTkE2^hWF$CV7P$w8{UxE59#)ua0+b=%wl@8zBf0&25B!Ysh)ok z>?qb@nO(XGwIV8eALC_?&w0r4eC5Prd-jbLOBy8MYszd~qD8H&gB?t0$FW#{nl82H zez*>NP(;354lGh`pL6%CcM%@imf)ZKmCNpM@XkxXe^S7U*4pgRR^e;iD`An5)#-qP zsMPnjNpCv4E^J=H^7g;F_e=YpBOxEf4F}U-m{}W2? z>w>+{kCt~oZi2OOl0P3;PMD#fsqO2XUIq)U3k6iPfK1lE``%w@yYo0Xv(8L0kqs~IRX+5@xdYJE{;qaO*L%r=n8Hyzd}eZCBTq_=t>eE29;V4^U(%TWDd7@qySB6-#wEVAg!F zB>soZi13b%Abr5fQ+6-%@59r0Pwld*^=v4l5c#lIcH>x}9Y6#F76W2nqK;BbZ4cEE zW4h@|pU3J~cp)MOL%~$O*WCOBRYr+tYMmE*SDTr__Oq>VfGy$@#F@D02r=SjSJ3UX znb4|9s?D{P3v*{HS+QS>1Tzr_=sL!-gh#}!}oqNT-VOQ@55ev zCnXQ7byxI%P*M?|12e(g)XJ$gDTs1;%ACd7jcm1$I;J@55C!gh>PfvLWa;r4mLCB42U(tLGUqf}`@ zHtE-lE-cV^d6SgEQto*KXpY5}kMJN$^SFB3`q>H6B71K>@Wl2(Uv)^QwsCZIJaNu^ z6l-Yy#5m!kTIL3nekip{@*S_NY+mVDk6MKLr$>nSQaiKv%lsCmWq#rn_1b!&t5*+u zZHW)kl%2)Sdp;ZjU?bI=daCddIcPt%L|?i2SOaq^{>d$|qCIvcxIE&Chc4(+OVRlg z9_S%8k?lh;gorsKqa=a#2%~=3N~GlF@s)$+ThsBIwfw|uNGRw1zS%S#()RPaqYoco zb(YVE_|@mEe3#`dsvFZ5}sGRw?(OC5riK}7`wg!iJ9qP%*47n>TgNJ z5>%hNMqQ#T;Iv%O-+RpR9v))BCRQ!0!}=ELGJ&j(8k>QL23dt;$l>D7VM*RAL%qdU z-!Yz9#Z>`mO@WPW#4tmv+@rS-y$e>H0&Takg_uCt&Y1+s!aZ+?k^Y(&rJ)XAWRpyJS+zZ*y|jAUj%nlw>r_bVu?)@k z@Tbev#5a5FEf;unR{=4J7e9G;ptrzO10n8Vl+)g+<;8jY?zaM^)?@Q4IAjgM1z zZ^hi>Z9c@hG9lHRoSkG!4}BAMHX@k84=3i>5p#E^+~{oD<284PV6gVQB7uaJ4jz`Z z(p3k&yZMC&ZQ%S#K|$I@^2w9%!(tt0F&a!aQ#EoZ8exsJ*87#vyhk;L{Xp-n3-^H( z5C|8W?f6U23eu^fOonZdqI)s-g`u%q>dh-5Ieif9N~#*4JI1orYtK|7@h5oMhBy)3 z-YO`E0Diyc7D);`UUKeL{SXXS|B&`pbh;V&H7newFH-+zj%cY8!= zUEt~8Uf*78NY+xxX&!1EhgnwIfZe{#Qeb;bt0x)ji6e@s@=A}GttgH*MX{aq@`y6PL%8(!gsrigSR zadk{gV_ZPcLR^I>Y(slZj+H~|O7~rTSpFWEVO%P%(9nB{XRVKA{2MEqSFcoYoRP|nah52bWUb{^t=2-^z9jnk}hq7S9r_E zPaVT8WRA|)vJ!to_>l{*)!ABi;0B^A< z5Apq#rL!Ne!>1`u4z10R2P+-&a*Y&Wq{b%i-fF7qJ(baU5K~KOhFRwRjj9U4qG$PT z^Q!-IoE_2TuutbV822Wx;37alwcawWGtP^|f>W;da!+RZ1pHOG$~%7|RRB0oq^(TW zgl^3+l`PR7aLLksf+D+sFd{stsP{6bS$A`E=OV8;S?}=iY;X2URRl#*5fu1Iyj|1x z^duF)1lGBpC>2ZR(#Y?yqd=}SrwnilMB5+JiG1n~OX6b6{C3r@~wT#`TNO;$7j7XE&Xq`HRNX!n17uB>8yn|yK{*6I#n z4hR;jJc|l8G9$+}3 z;{AX|H5D)(0a%-6Mv=pXn(P=rm|~z{$N%~8W9MN-g@G+ zVNG|4nhvPKq51fV*`#H|X`nC6-`HpFMtFZvm<^;7nMpR<^xW*v08VJ^0F_3-;J@PUrFCUMnRR5 z$nji&20i8MAi@sYD3|tvVUM|F)CQSObXr>40~Ra|R(+8;6rMRtrcFhqs(sqPr}{h# z9y~|DqYLHx9>=GV{s;zAsWK4Vq3uHb_Y}gwY+)9T{9dbdfWpe;1Zpe;)3cKNNSfB%D}O` zh9!qbUxrHe!)%Z6>orZd#kr)(Js#?W!^hqYTFmL`J+IftGm_7NU+r$(t<+0^N$3z& zC3=(1&v1@}dXm<~p(kxsB)3#&t*;U;twT5JO^qTUfbpyc!EP7fsEylwhO@&`TVJe= zoX&;_L+-?8A{N=R!x?1R4Bmi*eOWlAxm+h8KQC`JADUM=P)rrZWD_;*-Y0 zM{&-+gIt~Ev{fY;h3)g2*?aI~*sK~XSXX7n%2aX~K94bqa$Cv%7zWD*9z8 zdwaYGJq}gJXS)U`hvY_} zWK1y5VyD_mY(o~#hDi^y=o$@RIa4-3i1JS&L7=T#aPWH|5iU2Tqlozx%SHgY-BMsS z=$u_RCi5dADMr?DMEHwi-!o;&tjkl0^^63N(u0jf?2L3?K<1q8ui^mhBD8%Cwh~O` z2W^gb_S{)6n+xx5_1qyc%KF=Y;Q;GEA(vDxc0{%cmq#zlp44% z`s217h_BWpKA#@{iXt}t`IDC0v3T0u6ibx5+@*{$zI2u!G07A!C(?jv}QCb##V!k|HjF_-%4m>Qc@s-eEqm>o; z%Nai>A&Wp{-Yc@%;!nHoH5&S}S#$IRX{PdM!AK+<@?2YQ};aZ^e`t!~6 zmI9UI%i~26U{qH&kNNOJe>u$pmaknt;V|lb1a5Osd8iTHsQHpQNLp_Jn{q~E5{S3m$`dIhw7Sqjx-qbr!kl zwy}n6T92mE`@xw_WYXnrV809)Nb|zROr6idc{_I~hEfjXj*DS1S(WBD=} z8^`?w@DdHmE@Wk*VOAfE)K^6oouA{t@&U3(EeU43q@Bw{e&72$7vwlyx!xG|iWQN2 zy~;weIB&A#H0Q)Dt6*W?O{vh+`^gOwz$W*kGhV)NQmX(VmV{q zyZTt9Tn*(FGyj>`m0`u^V?#5YD<03OecdpH|6Up3r-u`kg&bY3S<%Jvv&uI zQEw=R$xXNJh*KXL(jO_22T?_?eC#-u8>B<~9`99ISU#uJ_=laPfFEKvm{b_(n(ld` zl#^(A7ZRJ^43vOnoyUDXab?P)Na zHVJtZ1p?bK_2q8X_ zhS%f>n0-rGbUTURcSPEhf90lgIlfo#c>9JvE>o>tkOSDa*IdH=FQ|E4A6vQ>PJ!>t)IY{E^?LMcMYbS-n{92ik5iRk8vvw?T z$1|r@Yp6;Fo!<_6S75rreqNua0xHO)fng?WycgeNw(2lA41_szJn^DXE_NRmW#1>h zF>o%C#JP@7_5lk;)^uP$(AqKX0Fm7ZQhiyQ9-BtIA`~7RAKiK0G#l=0Nj9oyq%>T3 zt1B{xOEzCKssif{{t!y&EuME`bD1Gm!OL!qzCz5+!CQc7Q4dxsDYoReWIH9Xvqo|a zvYBtMRf0-=k40Fhl;vQur5++VX?zpc4}q;%70VCq90KXBUAx*QOqA1EQ8$=JO6@;B zv~GfK@?`0Z3@d`pb}lSc;h z&G51atTzR3daxZ~riiWe_bOpz>bOB~eQzJBj@GNVXWgf}GNQhVZHQ!)mHk@$VlviZ z&72s7byI&vxDmFZ{b)PjJjYU z2TwfjLSXDcuj)qx^f|~~F5k-?-S26s-i8|W#GoCJbH2BBQNN)%o|XQxp&mv5>2v~Z z;ry`OuJ^HXwkAWjX|Cm3=SEA2Q@Ce;Xq`J+|HSgz_+ayl;Ndr1qJl`de@H-40X6etRyG;LmsLQSzn50t0ci zhUult9`A+p!-+YQOyc`zjW`G>qP(|FT>hm5tj364M@xpuTd(BIpeEbfK!kAs z60iZK@_W22RRG+Jxo>hu|McfqA4`DQjCh!HWCaiN z%It3|3sN|UQx7*sHZ4;3QrEd7*M7rVtlhE34ABR|ut_|*yhrakJB7Yh-laEU$T{vl zq*P|eKsnKBnMH&qdpw2VmN~nV@ll<#skDF@rIt+C^E009#*