From 58f6f6c754267cb59128b54670f409475b351454 Mon Sep 17 00:00:00 2001 From: Zheng-Bicheng Date: Wed, 25 Sep 2024 10:27:53 +0800 Subject: [PATCH 01/27] Update PaddleDetection Python --- README.md | 7 +- configs/LZ-Picodet.yaml | 25 +++++ example/periphery/adc/README.md | 2 +- example/periphery/gpio/README.md | 2 +- example/periphery/usart/README.md | 2 +- example/vision/classification/README.md | 2 +- .../vision/classification/python/README.md | 2 +- ...t_paddleclas.py => test_classification.py} | 6 +- example/vision/detetcion/README.md | 49 ++++++++ example/vision/detetcion/python/README.md | 106 ++++++++++++++++++ .../vision/detetcion/python/test_detection.py | 44 ++++++++ 11 files changed, 237 insertions(+), 10 deletions(-) create mode 100644 configs/LZ-Picodet.yaml rename example/vision/classification/python/{test_paddleclas.py => test_classification.py} (86%) create mode 100644 example/vision/detetcion/README.md create mode 100644 example/vision/detetcion/python/README.md create mode 100644 example/vision/detetcion/python/test_detection.py diff --git a/README.md b/README.md index 4c39c5e..ee1e946 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,9 @@ * [凌智视觉模块烧录镜像指南](./docs/introductory_tutorial/burn_image.md) * [凌智视觉模块连接设备指南](./docs/introductory_tutorial/connect_device_using_ssh.md) +* [凌智视觉模块 Python 开发环境搭建指南](./docs/introductory_tutorial/python_development_environment.md) + ## 🔌 外设控制教程 @@ -43,7 +46,7 @@ Lockzhiner Vision Module 拥有丰富的 IO 接口,其接口图片如下图所 这一部分教程将引导你从零开始训练并部署各种深度学习模型,包括分类模型、检测模型、分割模型和 OCR 模型。通过这些实战教程,你将学习到如何利用 Lockzhiner Vision Module 的高性能计算能力以及借助 Paddle 生态系统的丰富资源,轻松实现视觉任务的训练和部署。 * [分类模型部署指南](./example/vision/classification/README.md) -* [检测模型部署指南(支持中)]() +* [检测模型部署指南](./example/vision/detetcion/README.md) * [分割模型部署指南(支持中)]() * [OCR 模型部署指南(支持中)]() diff --git a/configs/LZ-Picodet.yaml b/configs/LZ-Picodet.yaml new file mode 100644 index 0000000..9ef9bd1 --- /dev/null +++ b/configs/LZ-Picodet.yaml @@ -0,0 +1,25 @@ +config: + mean: + - 0.406 + - 0.485 + - 0.456 + std: + - 0.225 + - 0.224 + - 0.229 + +load_onnx: + inputs: + - x + input_size_list: + - + - 1 + - 3 + - 320 + - 320 + outputs: + - p2o.DequantizeLinear.881 + +build: + do_quantization: false + dataset: \ No newline at end of file diff --git a/example/periphery/adc/README.md b/example/periphery/adc/README.md index 59a4291..ab65dab 100644 --- a/example/periphery/adc/README.md +++ b/example/periphery/adc/README.md @@ -53,5 +53,5 @@ 请参考以下教程使用 C++ 或 Python 在凌智视觉模块上部署 ADC 例程: -* [凌智视觉模块 ADC C++ 部署指南](./cpp/README.md) + * [凌智视觉模块 ADC Python 部署指南](./python/README.md) \ No newline at end of file diff --git a/example/periphery/gpio/README.md b/example/periphery/gpio/README.md index c0d31b1..f436160 100644 --- a/example/periphery/gpio/README.md +++ b/example/periphery/gpio/README.md @@ -62,5 +62,5 @@ GPIO(General Purpose Input/Output,通用输入/输出)是一种在嵌入 请参考以下教程使用 C++ 或 Python 在凌智视觉模块上部署 GPIO 例程: -- [凌智视觉模块 GPIO C++ 部署指南](./cpp/README.md) + - [凌智视觉模块 GPIO Python 部署指南](./python/README.md) diff --git a/example/periphery/usart/README.md b/example/periphery/usart/README.md index bd0f7e7..9698468 100644 --- a/example/periphery/usart/README.md +++ b/example/periphery/usart/README.md @@ -51,5 +51,5 @@ 请参考以下教程使用 C++ 或 Python 在凌智视觉模块上部署串口例程: -- [凌智视觉模块串口 C++ 部署指南](./cpp/README.md) + - [凌智视觉模块串口 Python 部署指南](./python/README.md) \ No newline at end of file diff --git a/example/vision/classification/README.md b/example/vision/classification/README.md index 2959a30..f3f3943 100644 --- a/example/vision/classification/README.md +++ b/example/vision/classification/README.md @@ -211,7 +211,7 @@ AI Studio 是基于百度深度学习开源平台飞桨的人工智能学习与 训练完模型后,请参考以下教程使用 C++ 或 Python 在凌智视觉模块上部署分类模型例程: -* [凌智视觉模块分类模型 C++ 部署指南](./cpp/README.md) + * [凌智视觉模块分类模型 Python 部署指南](./python/README.md) ## 5 各模型性能指标 diff --git a/example/vision/classification/python/README.md b/example/vision/classification/python/README.md index 708452d..7df673b 100644 --- a/example/vision/classification/python/README.md +++ b/example/vision/classification/python/README.md @@ -169,7 +169,7 @@ if __name__ == "__main__": 请使用 Electerm Ssh 并在命令行中执行以下命令: ```bash -python test_paddleclas.py LZ-MobileNetV3.rknn +python test_classification.py LZ-MobileNetV3.rknn ``` 运行程序后,屏幕上开始打印标签索引,分类置信度,并在一段时间后输出 FPS 值 diff --git a/example/vision/classification/python/test_paddleclas.py b/example/vision/classification/python/test_classification.py similarity index 86% rename from example/vision/classification/python/test_paddleclas.py rename to example/vision/classification/python/test_classification.py index c24bf90..1540b5c 100644 --- a/example/vision/classification/python/test_paddleclas.py +++ b/example/vision/classification/python/test_classification.py @@ -6,7 +6,7 @@ import sys if __name__ == "__main__": args = sys.argv if len(args) != 2: - print("Need model path. Example: python test_paddleclas.py LZ-MobileNetV3.rknn") + print("Need model path. Example: python test_classification.py LZ-MobileNetV3.rknn") exit(1) model = PaddleClas() @@ -23,14 +23,14 @@ if __name__ == "__main__": read_index = 0 total_time_ms = 0 for i in range(30): - start_time = time.time() ret, mat = video_capture.read() if ret is False: continue + start_time = time.time() result = model.predict(mat) end_time = time.time() total_time_ms += end_time - start_time read_index += 1 - print(result.label_id, result.confidence) + print(result.label_id, result.score) print(f"FPS is {1.0 / (total_time_ms/read_index)}") diff --git a/example/vision/detetcion/README.md b/example/vision/detetcion/README.md new file mode 100644 index 0000000..1087caa --- /dev/null +++ b/example/vision/detetcion/README.md @@ -0,0 +1,49 @@ +

凌智视觉模块检测模型部署指南

+ +发布版本:V0.0.0 + +日期:2024-09-11 + +文件密级:□绝密 □秘密 □内部资料 ■公开 + +--- + +**免责声明** + +本文档按**现状**提供,福州凌睿智捷电子有限公司(以下简称**本公司**)不对本文档中的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、适用性及非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。 + +由于产品版本升级或其他原因,本文档可能在未经任何通知的情况下不定期更新或修改。 + +**读者对象** + +本教程适用于以下工程师: + +- 技术支持工程师 +- 软件开发工程师 + +**修订记录** + +| **日期** | **版本** | **作者** | **修改说明** | +| :--------- | -------- | -------- | ------------ | +| 2024/09/11 | 0.0.0 | 郑必城 | 初始版本 | + +## 1 简介 + +## 2 图像数据标注 + +## 3 使用 AIStudio 训练检测模型 + +## 4 在凌智视觉模块上部署模型 + +训练完模型后,请参考以下教程使用 C++ 或 Python 在凌智视觉模块上部署分类模型例程: + + +* [凌智视觉模块检测模型 Python 部署指南](./python/README.md) + +## 5 各模型性能指标 + +以下测试数据为模型执行 Predict 函数运行 1000 次耗时的平均时间 + +| 检测模型 | FPS(帧/s) | 精度(%) | +|:-------:|:----:|:----:| +|LZ-Picodet||| \ No newline at end of file diff --git a/example/vision/detetcion/python/README.md b/example/vision/detetcion/python/README.md new file mode 100644 index 0000000..8e90375 --- /dev/null +++ b/example/vision/detetcion/python/README.md @@ -0,0 +1,106 @@ +

凌智视觉模块检测模型 Python 部署指南

+ +发布版本:V0.0.0 + +日期:2024-09-11 + +文件密级:□绝密 □秘密 □内部资料 ■公开 + +--- + +**免责声明** + +本文档按**现状**提供,福州凌睿智捷电子有限公司(以下简称**本公司**)不对本文档中的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、适用性及非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。 + +由于产品版本升级或其他原因,本文档可能在未经任何通知的情况下不定期更新或修改。 + +**读者对象** + +本教程适用于以下工程师: + +- 技术支持工程师 +- 软件开发工程师 + +**修订记录** + +| **日期** | **版本** | **作者** | **修改说明** | +| :--------- | -------- | -------- | ------------ | +| 2024/09/11 | 0.0.0 | 郑必城 | 初始版本 | + +## 1 简介 + +接下来让我们基于 Python 来部署 PaddleDetection 分类模型。在开始本章节前: + +- 请确保你已经参考 [凌智视觉模块检测模型部署指南](../README.md) 对模型进行了充分训练。 +- 请确保你已经按照 [开发环境搭建指南](../../../../docs/introductory_tutorial/python_development_environment.md) 正确配置了开发环境。 + +## 2 Python API 文档 + +```python +``` + +## 3 项目介绍 + +为了方便大家入手,我们做了一个简易的图像分类例程。该程序可以使用摄像头进行端到端推理。 + +```python +from lockzhiner_vision_module.cv2 import VideoCapture +from lockzhiner_vision_module.vision import PaddleClas +import time + +if __name__ == "__main__": + model = PaddleClas() + if model.initialize("LZ-MobileNetV2_x0_25.rknn") is False: + print("Failed to initialize PaddleClas") + exit(1) + + video_capture = VideoCapture() + if video_capture.open(0) is False: + print("Failed to open capture") + exit(1) + + while True: + read_index = 0 + total_time_ms = 0 + for i in range(30): + ret, mat = video_capture.read() + if ret is False: + continue + + start_time = time.time() + result = model.predict(mat) + end_time = time.time() + total_time_ms += (end_time - start_time) + read_index += 1 + print(result.label_id, result.confidence) + print(f"FPS is {1.0 / (total_time_ms/read_index)}") +``` + +## 4 上传并测试 Python 程序 + +参考 [连接设备指南](../../../../docs/introductory_tutorial/connect_device_using_ssh.md) 正确连接 Lockzhiner Vision Module 设备。 + +![](../../../../docs/introductory_tutorial/images/connect_device_using_ssh/ssh_success.png) + +请使用 Electerm Sftp 依次上传以下两个文件: + +- 进入存放 **test_paddleclas.py** 脚本文件的目录,将 **test_paddleclas.py** 上传到 Lockzhiner Vision Module +- 进入存放 **LZ-MobileNetV2_x0_25.rknn(也可能是其他模型)** 模型存放的目录(模型存放在训练模型后下载的 output 文件夹内),将 **LZ-MobileNetV2_x0_25.rknn** 上传到 Lockzhiner Vision Module + +![](images/stfp_0.png) + +![](images/stfp_1.png) + +请使用 Electerm Ssh 并在命令行中执行以下命令: + +```bash +python test_paddleclas.py LZ-MobileNetV3.rknn +``` + +运行程序后,屏幕上开始打印标签索引,分类置信度,并在一段时间后输出 FPS 值 + +![alt text](result_0.png) + +## 5 其他 + +如果你需要使用 C++ 来部署 PaddleClas 请参考[凌智视觉模块分类模型 C++ 部署指南](../cpp/README.md)。 diff --git a/example/vision/detetcion/python/test_detection.py b/example/vision/detetcion/python/test_detection.py new file mode 100644 index 0000000..2966372 --- /dev/null +++ b/example/vision/detetcion/python/test_detection.py @@ -0,0 +1,44 @@ +from lockzhiner_vision_module.cv2 import VideoCapture +from lockzhiner_vision_module.vision import PaddleDetection +import time +import sys + +if __name__ == "__main__": + args = sys.argv + if len(args) != 2: + print("Need model path. Example: python test_detection.py LZ-MobileNetV3.rknn") + exit(1) + + model = PaddleDetection() + if model.initialize(args[1]) is False: + print("Failed to initialize PaddleClas") + exit(1) + + video_capture = VideoCapture() + if video_capture.open(0) is False: + print("Failed to open capture") + exit(1) + + while True: + read_index = 0 + total_time_ms = 0 + for i in range(30): + ret, mat = video_capture.read() + if ret is False: + continue + + start_time = time.time() + result = model.predict(mat) + end_time = time.time() + total_time_ms += end_time - start_time + read_index += 1 + + print(f"result size is {result.size()}") + for i in range(result.size()): + box = result.boxes[i] + score = result.scores[i] + label_id = result.label_ids[i] + print( + f"(x,y,w,h,score,label_id)[{i}]: [{box.x},{box.y},{box.width},{box.height},{score},{label_id}]" + ) + print(f"FPS is {1.0 / (total_time_ms/read_index)}") -- Gitee From d21d7ad668e9d6f85cc7cf08b083feafdf34fe99 Mon Sep 17 00:00:00 2001 From: Zheng-Bicheng Date: Wed, 25 Sep 2024 10:31:00 +0800 Subject: [PATCH 02/27] Update python example --- .../vision/classification/python/README.md | 16 +++++++++---- example/vision/detetcion/python/README.md | 24 +++++++++++++++---- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/example/vision/classification/python/README.md b/example/vision/classification/python/README.md index 7df673b..4599d79 100644 --- a/example/vision/classification/python/README.md +++ b/example/vision/classification/python/README.md @@ -64,14 +64,14 @@ class ClassificationResult: return self.classification_result.label_id @property - def confidence(self): + def score(self): """ 获取分类结果的标签 ID。 Returns: float: 分类结果的置信度,表示识别结果的可靠程度,范围为 0 到 1。 """ - return self.classification_result.confidence + return self.classification_result.score class PaddleClas: @@ -122,10 +122,16 @@ class PaddleClas: from lockzhiner_vision_module.cv2 import VideoCapture from lockzhiner_vision_module.vision import PaddleClas import time +import sys if __name__ == "__main__": + args = sys.argv + if len(args) != 2: + print("Need model path. Example: python test_classification.py LZ-MobileNetV3.rknn") + exit(1) + model = PaddleClas() - if model.initialize("LZ-MobileNetV2_x0_25.rknn") is False: + if model.initialize(args[1]) is False: print("Failed to initialize PaddleClas") exit(1) @@ -145,9 +151,9 @@ if __name__ == "__main__": start_time = time.time() result = model.predict(mat) end_time = time.time() - total_time_ms += (end_time - start_time) + total_time_ms += end_time - start_time read_index += 1 - print(result.label_id, result.confidence) + print(result.label_id, result.score) print(f"FPS is {1.0 / (total_time_ms/read_index)}") ``` diff --git a/example/vision/detetcion/python/README.md b/example/vision/detetcion/python/README.md index 8e90375..a690b6f 100644 --- a/example/vision/detetcion/python/README.md +++ b/example/vision/detetcion/python/README.md @@ -45,12 +45,18 @@ ```python from lockzhiner_vision_module.cv2 import VideoCapture -from lockzhiner_vision_module.vision import PaddleClas +from lockzhiner_vision_module.vision import PaddleDetection import time +import sys if __name__ == "__main__": - model = PaddleClas() - if model.initialize("LZ-MobileNetV2_x0_25.rknn") is False: + args = sys.argv + if len(args) != 2: + print("Need model path. Example: python test_detection.py LZ-MobileNetV3.rknn") + exit(1) + + model = PaddleDetection() + if model.initialize(args[1]) is False: print("Failed to initialize PaddleClas") exit(1) @@ -70,9 +76,17 @@ if __name__ == "__main__": start_time = time.time() result = model.predict(mat) end_time = time.time() - total_time_ms += (end_time - start_time) + total_time_ms += end_time - start_time read_index += 1 - print(result.label_id, result.confidence) + + print(f"result size is {result.size()}") + for i in range(result.size()): + box = result.boxes[i] + score = result.scores[i] + label_id = result.label_ids[i] + print( + f"(x,y,w,h,score,label_id)[{i}]: [{box.x},{box.y},{box.width},{box.height},{score},{label_id}]" + ) print(f"FPS is {1.0 / (total_time_ms/read_index)}") ``` -- Gitee From 050f1da0dbd564f0bb527d622869d406bbc52f0a Mon Sep 17 00:00:00 2001 From: Zheng-Bicheng Date: Wed, 25 Sep 2024 11:05:31 +0800 Subject: [PATCH 03/27] Update Capture Python Example --- example/periphery/capture/README.md | 202 +------------- .../capture/{ => cpp}/CMakeLists.txt | 0 example/periphery/capture/cpp/README.md | 261 ++++++++++++++++++ .../{ => cpp}/images/build_example.png | Bin .../capture/{ => cpp}/images/result_0.png | Bin .../capture/{ => cpp}/images/sftp.png | Bin .../capture/{ => cpp}/test_capture.cc | 0 example/periphery/capture/python/README.md | 101 +++++++ .../periphery/capture/python/test_capture.py | 32 +++ 9 files changed, 399 insertions(+), 197 deletions(-) rename example/periphery/capture/{ => cpp}/CMakeLists.txt (100%) create mode 100644 example/periphery/capture/cpp/README.md rename example/periphery/capture/{ => cpp}/images/build_example.png (100%) rename example/periphery/capture/{ => cpp}/images/result_0.png (100%) rename example/periphery/capture/{ => cpp}/images/sftp.png (100%) rename example/periphery/capture/{ => cpp}/test_capture.cc (100%) create mode 100644 example/periphery/capture/python/README.md create mode 100644 example/periphery/capture/python/test_capture.py diff --git a/example/periphery/capture/README.md b/example/periphery/capture/README.md index a1be379..1717a63 100644 --- a/example/periphery/capture/README.md +++ b/example/periphery/capture/README.md @@ -1,4 +1,4 @@ -

凌智视觉模块摄像头使用指南

+

凌智视觉模块摄像头部署指南

发布版本:V0.0.0 @@ -59,203 +59,11 @@ Lockzhiner Vision Module 上自带了一个摄像头,该摄像头可以支持 在开始这个章节前,请确保: -- 你已经按照 [开发环境搭建指南](../../../docs/introductory_tutorial/development_environment.md) 正确配置了开发环境。 - 点击 [凌智视觉模块图片传输助手下载地址](https://gitee.com/LockzhinerAI/LockzhinerVisionModule/releases/download/v0.0.0/LockzhinerVisionModuleImageFetcher_v0.0.0.exe) 下载凌智视觉模块图片传输助手。 -## 4 API 文档 +## 4 在凌智视觉模块上部署摄像头例程 -### 4.1 读取摄像头文档 +请参考以下教程使用 C++ 或 Python 在凌智视觉模块上部署摄像头例程: -凌智视觉模块使用 opencv-mobile 来读取摄像头数据。关于摄像头读取,请参考传统的 OpenCV 摄像头 API 来实现,需要注意的是: - -- 受限于运行内存,请使用我们编译的 [OpenCV Mobile](https://gitee.com/LockzhinerAI/opencv-mobile) 库来代替传统的 OpenCV 库 -- LockzhinerVisionModule 只有一个摄像头,因此在打开摄像头时,不管输入什么参数,都只会打开这个摄像头 -- 配置摄像头长宽时,请保证长和宽都是 8 的倍数 - -### 4.2 传输摄像头数据文档 - -为了让大家直观的看到摄像头获取的数据,我们编写了凌智视觉模块图片传输助手。关于 Lockzhiner Vision Module 中的图片发送 API,请参考以下文档: - -```cpp -/** - * @brief Edit 类提供了对摄像头数据的控制接口。 - * - * 需要注意的是, Edit 传输的数据必须使用 Lockzhiner Vision Module 图片获取助手来接收 - */ -class Edit { - public: - Edit() = default; - ~Edit() = default; - - /** - * @brief 接收客户端连接 - * - * 此函数尝试阻塞等待客户端连接。 - * 成功时返回 true,失败时返回 false。 - * - * @return bool 指示操作是否成功。 - */ - bool StartAndAcceptConnection(); - - /** - * @brief 输出图片 - * - * 此函数尝试向客户端传输图片数据 - * 成功时返回 true,失败时返回 false。 - * - * @return bool 指示操作是否成功。 - */ - bool Print(const cv::Mat &mat); - - private: - int server_fd_; - int port_ = 6868; - int new_socket_; - - void BuildPacket(const cv::Mat &mat, uint8_t *buffer, uint64_t size); - bool Write(const void *buf, size_t len); -}; -``` - -## 5 项目介绍 - -为了方便大家入手,我们做了一个简易的图片传输例程。该例程接收 Lockzhiner Vision Module 图片获取助手的连接并向其传输图片数据。 - -```cmake -# CMake最低版本要求 -cmake_minimum_required(VERSION 3.10) - -project(test_adc) - -# 定义项目根目录路径 -set(PROJECT_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../..") -# 定义 OpenCV SDK 路径 -set(OpenCV_ROOT_PATH "${PROJECT_ROOT_PATH}/third_party/opencv-mobile-4.10.0-lockzhiner-vision-module") -set(OpenCV_DIR "${OpenCV_ROOT_PATH}/lib/cmake/opencv4") -find_package(OpenCV REQUIRED) -set(OPENCV_LIBRARIES "${OpenCV_LIBS}") -# 定义 LockzhinerVisionModule SDK 路径 -set(LockzhinerVisionModule_ROOT_PATH "${PROJECT_ROOT_PATH}/third_party/lockzhiner_vision_module_sdk") -set(LockzhinerVisionModule_DIR "${LockzhinerVisionModule_ROOT_PATH}/lib/cmake/lockzhiner_vision_module") -find_package(LockzhinerVisionModule REQUIRED) - -# 配置摄像头数据 -add_executable(Test-Capture test_capture.cc) -target_include_directories(Test-Capture PRIVATE ${LOCKZHINER_VISION_MODULE_INCLUDE_DIRS}) -target_link_libraries(Test-Capture PRIVATE ${OPENCV_LIBRARIES} ${LOCKZHINER_VISION_MODULE_LIBRARIES}) -``` - -读取并传输摄像头数据的核心代码如下: - -```cpp -#include - -#include -#include -#include -#include - -int main(int argc, char *argv[]) { - int width = 640; - int height = 480; - if (argc == 3) { - width = atoi(argv[1]); - height = atoi(argv[2]); - } - - lockzhiner_vision_module::edit::Edit edit; - // 打开服务器并阻塞接收客户端连接 - if (!edit.StartAndAcceptConnection()) { - std::cout << "Failed to start and accept connection" << std::endl; - return 1; - } - std::cout << "Succeed to connect device" << std::endl; - - cv::VideoCapture cap; - // 设置摄像头长宽 - cap.set(cv::CAP_PROP_FRAME_WIDTH, width); - cap.set(cv::CAP_PROP_FRAME_HEIGHT, height); - // 打开摄像头 - cap.open(0); - - const int w = cap.get(cv::CAP_PROP_FRAME_WIDTH); - const int h = cap.get(cv::CAP_PROP_FRAME_HEIGHT); - cv::Mat temp_mat; - while (true) { - cap >> temp_mat; - // 判断获取的图片是否为空 - if (temp_mat.empty()) { - continue; - } - // 向客户端输出图片 - if (!edit.Print(temp_mat)) { - std::cout << "Failed to print to edit" << std::endl; - break; - } - } - return 0; -} -``` - -## 6 编译项目 - -使用 Docker Destop 打开 LockzhinerVisionModule 容器并执行以下命令来编译项目 - -```bash -# 进入 Demo 目录 -cd /LockzhinerVisionModuleWorkSpace/LockzhinerVisionModule/example/periphery/capture - -# 创建编译目录 -rm -rf build && mkdir build && cd build - -# 配置交叉编译工具链 -export TOOLCHAIN_ROOT_PATH=${PWD}/../../../../../arm-rockchip830-linux-uclibcgnueabihf - -# 使用 cmake 配置项目 -cmake -DCMAKE_TOOLCHAIN_FILE=../../../../toolchains/arm-rockchip830-linux-uclibcgnueabihf.toolchain.cmake \ - -DCMAKE_BUILD_TYPE=Release \ - .. - -# 执行编译 -make -j8 -``` - -![](images/build_example.png) - -## 7 执行摄像头测试程序 - -参考 [连接设备指南](../../../docs/introductory_tutorial/connect_device_using_ssh.md) 正确连接 Lockzhiner Vision Module 设备。 - -![](../../../docs/introductory_tutorial/images/connect_device_using_ssh/ssh_success.png) - -参考之前的例程,将 **Test-Capture** 传输到 Lockzhiner Vision Module 上 - -![](images/sftp.png) - -传输完成后执行以下代码 - -```bash -chmod +x ./Test-Capture -./Test-Capture -``` - -代码开启后程序将阻塞并等待摄像头连接 - -![](images/result_0.png) - -打开下载的 Lockzhiner Vision Module 图片获取助手,点击连接设备 - -![](images/result_1.png) - -成功连接设备后,将出现摄像头的画面 - -> 提示: -> 如果摄像头的画面不够清晰,请尝试轻轻转动摄像头来调整合适的焦距 - -![](images/result_2.png) - -点击拍照保存可以将图片保存到程序保存路径下的 **LockzhinerVisionModuleImages** 文件夹中 - -![](images/result_3.png) - -你可以点击**打开保存文件夹**按钮来快速打开这个文件夹 + +* [凌智视觉模块摄像头 Python 部署指南](./python/README.md) \ No newline at end of file diff --git a/example/periphery/capture/CMakeLists.txt b/example/periphery/capture/cpp/CMakeLists.txt similarity index 100% rename from example/periphery/capture/CMakeLists.txt rename to example/periphery/capture/cpp/CMakeLists.txt diff --git a/example/periphery/capture/cpp/README.md b/example/periphery/capture/cpp/README.md new file mode 100644 index 0000000..a1be379 --- /dev/null +++ b/example/periphery/capture/cpp/README.md @@ -0,0 +1,261 @@ +

凌智视觉模块摄像头使用指南

+ +发布版本:V0.0.0 + +日期:2024-09-04 + +文件密级:□绝密 □秘密 □内部资料 ■公开 + +--- + +**免责声明** + +本文档按**现状**提供,福州凌睿智捷电子有限公司(以下简称**本公司**)不对本文档中的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、适用性及非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。 + +由于产品版本升级或其他原因,本文档可能在未经任何通知的情况下不定期更新或修改。 + +**读者对象** + +本教程适用于以下工程师: + +- 技术支持工程师 +- 软件开发工程师 + +**修订记录** + +| **日期** | **版本** | **作者** | **修改说明** | +| :--------- | -------- | -------- | ------------ | +| 2024/09/04 | 0.0.0 | 郑必城 | 初始版本 | + +## 1 简介 + +Lockzhiner Vision Module 上自带了一个摄像头,该摄像头可以支持最大 **2304x1296(16:9)** 的分辨率。本章节中,我们将教会你如何使用 Lockzhiner Vision Module 读取 摄像头数据,并使用 Lockzhiner Vision Module 传输图片到本地,方便保存数据。 + +## 2 数据表 + +受限于解码能力,Lockzhiner Vision Module 在不同的分辨率下,摄像头的帧率是不一样的,具体可以参考如下表格: + +### 2.1 长宽比为 4:3 + +| 摄像头分辨率| FPS | +| :----: | :----: | +| 480x360(4:3) | 25 | +| 640x480(4:3) | 25 | +| 960x720(4:3) | 14 | +| 1280x960(4:3) | 13 | +| 1920x1440(4:3) | 13 | + +### 2.2 长宽比为 16:9 + +| 摄像头分辨率| FPS | +| :----: | :----: | +| 480x270(16:9) | 25 | +| 640x360(16:9) | 25 | +| 960x540(16:9) | 25 | +| 1280x720(16:9) | 15 | +| 1920x1080(16:9) | 12 | + +## 3 前期准备 + +在开始这个章节前,请确保: + +- 你已经按照 [开发环境搭建指南](../../../docs/introductory_tutorial/development_environment.md) 正确配置了开发环境。 +- 点击 [凌智视觉模块图片传输助手下载地址](https://gitee.com/LockzhinerAI/LockzhinerVisionModule/releases/download/v0.0.0/LockzhinerVisionModuleImageFetcher_v0.0.0.exe) 下载凌智视觉模块图片传输助手。 + +## 4 API 文档 + +### 4.1 读取摄像头文档 + +凌智视觉模块使用 opencv-mobile 来读取摄像头数据。关于摄像头读取,请参考传统的 OpenCV 摄像头 API 来实现,需要注意的是: + +- 受限于运行内存,请使用我们编译的 [OpenCV Mobile](https://gitee.com/LockzhinerAI/opencv-mobile) 库来代替传统的 OpenCV 库 +- LockzhinerVisionModule 只有一个摄像头,因此在打开摄像头时,不管输入什么参数,都只会打开这个摄像头 +- 配置摄像头长宽时,请保证长和宽都是 8 的倍数 + +### 4.2 传输摄像头数据文档 + +为了让大家直观的看到摄像头获取的数据,我们编写了凌智视觉模块图片传输助手。关于 Lockzhiner Vision Module 中的图片发送 API,请参考以下文档: + +```cpp +/** + * @brief Edit 类提供了对摄像头数据的控制接口。 + * + * 需要注意的是, Edit 传输的数据必须使用 Lockzhiner Vision Module 图片获取助手来接收 + */ +class Edit { + public: + Edit() = default; + ~Edit() = default; + + /** + * @brief 接收客户端连接 + * + * 此函数尝试阻塞等待客户端连接。 + * 成功时返回 true,失败时返回 false。 + * + * @return bool 指示操作是否成功。 + */ + bool StartAndAcceptConnection(); + + /** + * @brief 输出图片 + * + * 此函数尝试向客户端传输图片数据 + * 成功时返回 true,失败时返回 false。 + * + * @return bool 指示操作是否成功。 + */ + bool Print(const cv::Mat &mat); + + private: + int server_fd_; + int port_ = 6868; + int new_socket_; + + void BuildPacket(const cv::Mat &mat, uint8_t *buffer, uint64_t size); + bool Write(const void *buf, size_t len); +}; +``` + +## 5 项目介绍 + +为了方便大家入手,我们做了一个简易的图片传输例程。该例程接收 Lockzhiner Vision Module 图片获取助手的连接并向其传输图片数据。 + +```cmake +# CMake最低版本要求 +cmake_minimum_required(VERSION 3.10) + +project(test_adc) + +# 定义项目根目录路径 +set(PROJECT_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../..") +# 定义 OpenCV SDK 路径 +set(OpenCV_ROOT_PATH "${PROJECT_ROOT_PATH}/third_party/opencv-mobile-4.10.0-lockzhiner-vision-module") +set(OpenCV_DIR "${OpenCV_ROOT_PATH}/lib/cmake/opencv4") +find_package(OpenCV REQUIRED) +set(OPENCV_LIBRARIES "${OpenCV_LIBS}") +# 定义 LockzhinerVisionModule SDK 路径 +set(LockzhinerVisionModule_ROOT_PATH "${PROJECT_ROOT_PATH}/third_party/lockzhiner_vision_module_sdk") +set(LockzhinerVisionModule_DIR "${LockzhinerVisionModule_ROOT_PATH}/lib/cmake/lockzhiner_vision_module") +find_package(LockzhinerVisionModule REQUIRED) + +# 配置摄像头数据 +add_executable(Test-Capture test_capture.cc) +target_include_directories(Test-Capture PRIVATE ${LOCKZHINER_VISION_MODULE_INCLUDE_DIRS}) +target_link_libraries(Test-Capture PRIVATE ${OPENCV_LIBRARIES} ${LOCKZHINER_VISION_MODULE_LIBRARIES}) +``` + +读取并传输摄像头数据的核心代码如下: + +```cpp +#include + +#include +#include +#include +#include + +int main(int argc, char *argv[]) { + int width = 640; + int height = 480; + if (argc == 3) { + width = atoi(argv[1]); + height = atoi(argv[2]); + } + + lockzhiner_vision_module::edit::Edit edit; + // 打开服务器并阻塞接收客户端连接 + if (!edit.StartAndAcceptConnection()) { + std::cout << "Failed to start and accept connection" << std::endl; + return 1; + } + std::cout << "Succeed to connect device" << std::endl; + + cv::VideoCapture cap; + // 设置摄像头长宽 + cap.set(cv::CAP_PROP_FRAME_WIDTH, width); + cap.set(cv::CAP_PROP_FRAME_HEIGHT, height); + // 打开摄像头 + cap.open(0); + + const int w = cap.get(cv::CAP_PROP_FRAME_WIDTH); + const int h = cap.get(cv::CAP_PROP_FRAME_HEIGHT); + cv::Mat temp_mat; + while (true) { + cap >> temp_mat; + // 判断获取的图片是否为空 + if (temp_mat.empty()) { + continue; + } + // 向客户端输出图片 + if (!edit.Print(temp_mat)) { + std::cout << "Failed to print to edit" << std::endl; + break; + } + } + return 0; +} +``` + +## 6 编译项目 + +使用 Docker Destop 打开 LockzhinerVisionModule 容器并执行以下命令来编译项目 + +```bash +# 进入 Demo 目录 +cd /LockzhinerVisionModuleWorkSpace/LockzhinerVisionModule/example/periphery/capture + +# 创建编译目录 +rm -rf build && mkdir build && cd build + +# 配置交叉编译工具链 +export TOOLCHAIN_ROOT_PATH=${PWD}/../../../../../arm-rockchip830-linux-uclibcgnueabihf + +# 使用 cmake 配置项目 +cmake -DCMAKE_TOOLCHAIN_FILE=../../../../toolchains/arm-rockchip830-linux-uclibcgnueabihf.toolchain.cmake \ + -DCMAKE_BUILD_TYPE=Release \ + .. + +# 执行编译 +make -j8 +``` + +![](images/build_example.png) + +## 7 执行摄像头测试程序 + +参考 [连接设备指南](../../../docs/introductory_tutorial/connect_device_using_ssh.md) 正确连接 Lockzhiner Vision Module 设备。 + +![](../../../docs/introductory_tutorial/images/connect_device_using_ssh/ssh_success.png) + +参考之前的例程,将 **Test-Capture** 传输到 Lockzhiner Vision Module 上 + +![](images/sftp.png) + +传输完成后执行以下代码 + +```bash +chmod +x ./Test-Capture +./Test-Capture +``` + +代码开启后程序将阻塞并等待摄像头连接 + +![](images/result_0.png) + +打开下载的 Lockzhiner Vision Module 图片获取助手,点击连接设备 + +![](images/result_1.png) + +成功连接设备后,将出现摄像头的画面 + +> 提示: +> 如果摄像头的画面不够清晰,请尝试轻轻转动摄像头来调整合适的焦距 + +![](images/result_2.png) + +点击拍照保存可以将图片保存到程序保存路径下的 **LockzhinerVisionModuleImages** 文件夹中 + +![](images/result_3.png) + +你可以点击**打开保存文件夹**按钮来快速打开这个文件夹 diff --git a/example/periphery/capture/images/build_example.png b/example/periphery/capture/cpp/images/build_example.png similarity index 100% rename from example/periphery/capture/images/build_example.png rename to example/periphery/capture/cpp/images/build_example.png diff --git a/example/periphery/capture/images/result_0.png b/example/periphery/capture/cpp/images/result_0.png similarity index 100% rename from example/periphery/capture/images/result_0.png rename to example/periphery/capture/cpp/images/result_0.png diff --git a/example/periphery/capture/images/sftp.png b/example/periphery/capture/cpp/images/sftp.png similarity index 100% rename from example/periphery/capture/images/sftp.png rename to example/periphery/capture/cpp/images/sftp.png diff --git a/example/periphery/capture/test_capture.cc b/example/periphery/capture/cpp/test_capture.cc similarity index 100% rename from example/periphery/capture/test_capture.cc rename to example/periphery/capture/cpp/test_capture.cc diff --git a/example/periphery/capture/python/README.md b/example/periphery/capture/python/README.md new file mode 100644 index 0000000..29d31f8 --- /dev/null +++ b/example/periphery/capture/python/README.md @@ -0,0 +1,101 @@ +

凌智视觉模块摄像头 Python 部署指南

+ +发布版本:V0.0.0 + +日期:2024-09-25 + +文件密级:□绝密 □秘密 □内部资料 ■公开 + +--- + +**免责声明** + +本文档按**现状**提供,福州凌睿智捷电子有限公司(以下简称**本公司**)不对本文档中的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、适用性及非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。 + +由于产品版本升级或其他原因,本文档可能在未经任何通知的情况下不定期更新或修改。 + +**读者对象** + +本教程适用于以下工程师: + +- 技术支持工程师 +- 软件开发工程师 + +**修订记录** + +| **日期** | **版本** | **作者** | **修改说明** | +| :--------- | -------- | -------- | ------------ | +| 2024/09/25 | 0.0.0 | 郑必城 | 初始版本 | + +## 1 简介 + +Lockzhiner Vision Module 上自带了一个摄像头,该摄像头可以支持最大 **2304x1296(16:9)** 的分辨率。本章节中,我们将教会你如何使用 Lockzhiner Vision Module 读取 摄像头数据,并使用 Lockzhiner Vision Module 传输图片到本地,方便保存数据。 + +## 2 前期准备 + +在开始这个章节前,请确保: + +- 你已经按照 [开发环境搭建指南](../../../../docs/introductory_tutorial/python_development_environment.md) 正确配置了开发环境。 +- 点击 [凌智视觉模块图片传输助手下载地址](https://gitee.com/LockzhinerAI/LockzhinerVisionModule/releases/download/v0.0.0/LockzhinerVisionModuleImageFetcher_v0.0.0.exe) 下载凌智视觉模块图片传输助手。 + +## 4 API 文档 + +### 4.1 读取摄像头文档 + +读取摄像头的 API 对齐了 OpenCV,具体 API 文档如下: + +```python + +``` + +### 4.2 传输摄像头数据文档 + +为了让大家直观的看到摄像头获取的数据,我们编写了凌智视觉模块图片传输助手。关于 Lockzhiner Vision Module 中的图片发送 API,请参考以下文档: + +```python + +``` + +## 5 项目介绍 + +为了方便大家入手,我们做了一个简易的图片传输例程。该例程接收 Lockzhiner Vision Module 图片获取助手的连接并向其传输图片数据。 + +```cpp +``` + +## 6 执行摄像头测试程序 + +参考 [连接设备指南](../../../../docs/introductory_tutorial/connect_device_using_ssh.md) 正确连接 Lockzhiner Vision Module 设备。 + +![](../../../../docs/introductory_tutorial/images/connect_device_using_ssh/ssh_success.png) + +参考之前的例程,将 **test_capture.py** 传输到 Lockzhiner Vision Module 上 + +![](images/sftp.png) + +传输完成后,返回代码执行界面,执行以下代码 + +```bash +python ./test_capture.py +``` + +代码开启后程序将阻塞并等待摄像头连接 + +![](images/result_0.png) + +打开下载的 Lockzhiner Vision Module 图片获取助手,点击连接设备 + +![](../images/result_1.png) + +成功连接设备后,将出现摄像头的画面 + +> 提示: +> 如果摄像头的画面不够清晰,请尝试轻轻转动摄像头来调整合适的焦距 + +![](../images/result_2.png) + +点击拍照保存可以将图片保存到程序保存路径下的 **LockzhinerVisionModuleImages** 文件夹中 + +![](../images/result_3.png) + +你可以点击**打开保存文件夹**按钮来快速打开这个文件夹 diff --git a/example/periphery/capture/python/test_capture.py b/example/periphery/capture/python/test_capture.py new file mode 100644 index 0000000..c14b8a3 --- /dev/null +++ b/example/periphery/capture/python/test_capture.py @@ -0,0 +1,32 @@ +from lockzhiner_vision_module.cv2 import VideoCapture +from lockzhiner_vision_module.edit import Edit +import time +import sys + +if __name__ == "__main__": + args = sys.argv + if len(args) != 1: + print("Need model path. Example: python test_capture.py") + exit(1) + + edit = Edit() + edit.start_and_accept_connection() + + video_capture = VideoCapture() + if video_capture.open(0) is False: + print("Failed to open capture") + exit(1) + + while True: + read_index = 0 + total_time_ms = 0 + for i in range(30): + start_time = time.time() + ret, mat = video_capture.read() + if ret is False: + continue + end_time = time.time() + edit.print(mat) + total_time_ms += end_time - start_time + read_index += 1 + print(f"FPS is {1.0 / (total_time_ms/read_index)}") -- Gitee From 7de2c587625c69a21b4c521b882555eee07fda33 Mon Sep 17 00:00:00 2001 From: Zheng-Bicheng Date: Wed, 25 Sep 2024 11:26:33 +0800 Subject: [PATCH 04/27] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20API=20=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/periphery/capture/python/README.md | 70 +++++++++- example/vision/detetcion/python/README.md | 154 +++++++++++++++++++++ 2 files changed, 222 insertions(+), 2 deletions(-) diff --git a/example/periphery/capture/python/README.md b/example/periphery/capture/python/README.md index 29d31f8..b70b1df 100644 --- a/example/periphery/capture/python/README.md +++ b/example/periphery/capture/python/README.md @@ -45,7 +45,50 @@ Lockzhiner Vision Module 上自带了一个摄像头,该摄像头可以支持 读取摄像头的 API 对齐了 OpenCV,具体 API 文档如下: ```python - +class VideoCapture: + """ + OpenCV 摄像头类 + """ + def __init__(self): + self.video_capture = cv2.VideoCapture() + + def open(self, index=0): + """ + 打开摄像头 + + Returns: + bool: 摄像头打开过程过是否出现逻辑错误 + """ + return self.video_capture.open(index) + + def isOpened(self): + """ + 判断摄像头是否打开成功 + + Returns: + bool: 摄像头是否打开成功 + """ + return self.video_capture.isOpened() + + def read(self): + """ + 读取摄像头数据 + + Returns: + bool: 摄像头是否成功读取到数据 + cv::Mat: 摄像头读取的图像数据 + """ + mat = self.video_capture.read() + return not mat.empty(), mat + + def release(self): + """ + 关闭摄像头 + + Returns: + bool: 是否释放成功 + """ + return self.video_capture.release() ``` ### 4.2 传输摄像头数据文档 @@ -53,7 +96,30 @@ Lockzhiner Vision Module 上自带了一个摄像头,该摄像头可以支持 为了让大家直观的看到摄像头获取的数据,我们编写了凌智视觉模块图片传输助手。关于 Lockzhiner Vision Module 中的图片发送 API,请参考以下文档: ```python - +class Edit: + """ + 图片数据传输类,用于传输 CV::Mat 到凌智图片传输助手 + """ + def __init__(self): + self.edit = edit.Edit() + + def start_and_accept_connection(self): + """ + 阻塞等待凌智图片传输助手的连接请求 + """ + return self.edit.start_and_accept_connection() + + def print(self, mat): + """ + 传输图片到凌智图片传输助手 + + Args: + mat (cv::Mat): OpenCV 图片 Array + + Returns: + bool: 传输是否成功 + """ + return self.edit.print(mat) ``` ## 5 项目介绍 diff --git a/example/vision/detetcion/python/README.md b/example/vision/detetcion/python/README.md index a690b6f..4005419 100644 --- a/example/vision/detetcion/python/README.md +++ b/example/vision/detetcion/python/README.md @@ -37,6 +37,160 @@ ## 2 Python API 文档 ```python +class Rect: + def __init__(self): + self.rect = cv2.Rect() + + def empty(self): + return self.rect.empty() + + @property + def x(self): + """ + 获取矩形左上角坐标点的 x 坐标 + + Returns: + int: 获取矩形左上角坐标点的 x 坐标 + """ + return self.rect.x + + @property + def y(self): + """ + 获取矩形左上角坐标点的 y 坐标 + + Returns: + int: 获取矩形左上角坐标点的 y 坐标 + """ + return self.rect.y + + @property + def width(self): + """ + 获取矩形的宽 + + Returns: + int: 获取矩形的宽 + """ + return self.rect.width + + @property + def height(self): + """ + 获取矩形的高 + + Returns: + int: 获取矩形的高 + """ + return self.rect.height + + +class DetectionResult: + """ + 分类结果类,用于封装和处理目标检测结果数据。 + + 该类主要提供了一个包装层,用于访问和管理由视觉模块产生的分类结果。 + """ + + def __init__(self): + self.detection_result = vision.DetectionResult() + + def empty(self): + """ + 判断结果类中是否存在结果(是否为空) + + Returns: + bool: 结果类中是否存在结果(是否为空) + """ + return self.detection_result.empty() + + @property + def size(self): + """ + 获取目标检测模型检测出来的目标总数 + + Returns: + size_t: 目标检测模型检测出来的目标总数 + """ + return self.detection_result.size() + + @property + def boxes(self): + """ + 获取目标检测模型检测出来的矩形框信息 + + Returns: + Rect: 矩形框信息 + """ + return self.detection_result.boxes + + @property + def scores(self): + """ + 获取目标检测模型检测出来的得分信息 + + Returns: + float: 得分信息 + """ + return self.detection_result.scores + + @property + def label_ids(self): + """ + 获取目标检测模型检测出来的分类标签信息 + + Returns: + int: 分类标签信息 + """ + return self.detection_result.label_ids + +class PaddleDetection: + """ + PaddleDetection 类 - 用于目标检测的 PaddlePaddle 模型封装。 + + 该类封装了 PaddleDetection 框架下的目标检测模型,提供了初始化和预测的方法。 + """ + + def __init__(self): + """ + 构造函数 - 初始化 PaddleDetection 对象。 + """ + self.model = vision.PaddleDetection() + + def initialize(self, model_path): + """ + 初始化模型 - 加载预训练的 PaddlePaddle 模型。 + + Args: + model_path (str): 模型文件的路径。 + + Returns: + bool: 初始化是否成功。 + """ + return self.model.initialize(model_path) + + def set_threshold(self, score_threshold=0.5, nms_threshold=0.5): + """ + 设置目标检测阈值 + + Args: + score_threshold (float): 目标检测得分阈值,默认为 0.5 + nms_threshold (float): 目标检测 NMS 阈值,默认为 0.5 + + """ + self.model.initialize(score_threshold, nms_threshold) + + def predict(self, input_mat): + """ + 进行预测 - 使用加载的模型对输入数据进行分类预测。 + + Args: + input_mat (cv2.Mat): 输入的图像数据,通常是一个 cv2.Mat 变量。 + + Returns: + DetectionResult: 预测结果对象,包含了分类的标签、置信度等信息。 + """ + return self.model.predict(input_mat) ``` ## 3 项目介绍 -- Gitee From cb712a9850e70aee2147c1096e5264497ad92b1e Mon Sep 17 00:00:00 2001 From: Zheng-Bicheng Date: Wed, 25 Sep 2024 16:26:46 +0800 Subject: [PATCH 05/27] Update --- example/periphery/capture/python/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/example/periphery/capture/python/README.md b/example/periphery/capture/python/README.md index b70b1df..d81f1c7 100644 --- a/example/periphery/capture/python/README.md +++ b/example/periphery/capture/python/README.md @@ -38,9 +38,9 @@ Lockzhiner Vision Module 上自带了一个摄像头,该摄像头可以支持 - 你已经按照 [开发环境搭建指南](../../../../docs/introductory_tutorial/python_development_environment.md) 正确配置了开发环境。 - 点击 [凌智视觉模块图片传输助手下载地址](https://gitee.com/LockzhinerAI/LockzhinerVisionModule/releases/download/v0.0.0/LockzhinerVisionModuleImageFetcher_v0.0.0.exe) 下载凌智视觉模块图片传输助手。 -## 4 API 文档 +## 3 API 文档 -### 4.1 读取摄像头文档 +### 3.1 读取摄像头文档 读取摄像头的 API 对齐了 OpenCV,具体 API 文档如下: @@ -91,7 +91,7 @@ class VideoCapture: return self.video_capture.release() ``` -### 4.2 传输摄像头数据文档 +### 3.2 传输摄像头数据文档 为了让大家直观的看到摄像头获取的数据,我们编写了凌智视觉模块图片传输助手。关于 Lockzhiner Vision Module 中的图片发送 API,请参考以下文档: @@ -122,14 +122,14 @@ class Edit: return self.edit.print(mat) ``` -## 5 项目介绍 +## 4 项目介绍 为了方便大家入手,我们做了一个简易的图片传输例程。该例程接收 Lockzhiner Vision Module 图片获取助手的连接并向其传输图片数据。 ```cpp ``` -## 6 执行摄像头测试程序 +## 5 执行摄像头测试程序 参考 [连接设备指南](../../../../docs/introductory_tutorial/connect_device_using_ssh.md) 正确连接 Lockzhiner Vision Module 设备。 -- Gitee From 4afd533ac5d8702544879e4c374584dd12b24ecb Mon Sep 17 00:00:00 2001 From: Zheng-Bicheng Date: Wed, 25 Sep 2024 16:27:51 +0800 Subject: [PATCH 06/27] update --- configs/LZ-Picodet.yaml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/configs/LZ-Picodet.yaml b/configs/LZ-Picodet.yaml index 9ef9bd1..591bc4e 100644 --- a/configs/LZ-Picodet.yaml +++ b/configs/LZ-Picodet.yaml @@ -1,6 +1,6 @@ config: mean: - - 0.406 + - 0.406 - 0.485 - 0.456 std: @@ -10,7 +10,7 @@ config: load_onnx: inputs: - - x + - image input_size_list: - - 1 @@ -18,7 +18,14 @@ load_onnx: - 320 - 320 outputs: - - p2o.DequantizeLinear.881 + - p2o.DequantizeLinear.1705 + - p2o.DequantizeLinear.1707 + - p2o.DequantizeLinear.1619 + - p2o.DequantizeLinear.1621 + - p2o.DequantizeLinear.1533 + - p2o.DequantizeLinear.1535 + - p2o.DequantizeLinear.1445 + - p2o.DequantizeLinear.1447 build: do_quantization: false -- Gitee From 735254f6163952a9d34f9477e1768c02e2154d43 Mon Sep 17 00:00:00 2001 From: Zheng-Bicheng Date: Thu, 26 Sep 2024 14:33:47 +0800 Subject: [PATCH 07/27] update preprocess mean and std --- configs/LZ-MobileNetV3.yaml | 12 ++++++------ configs/LZ-Picodet.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/configs/LZ-MobileNetV3.yaml b/configs/LZ-MobileNetV3.yaml index 12d2f24..cf097aa 100644 --- a/configs/LZ-MobileNetV3.yaml +++ b/configs/LZ-MobileNetV3.yaml @@ -1,12 +1,12 @@ config: mean: - - 0.5 - - 0.5 - - 0.5 + - 0.406 + - 0.456 + - 0.485 std: - - 0.5 - - 0.5 - - 0.5 + - 0.225 + - 0.224 + - 0.229 load_onnx: inputs: diff --git a/configs/LZ-Picodet.yaml b/configs/LZ-Picodet.yaml index 591bc4e..af327bb 100644 --- a/configs/LZ-Picodet.yaml +++ b/configs/LZ-Picodet.yaml @@ -1,8 +1,8 @@ config: mean: - 0.406 - - 0.485 - 0.456 + - 0.485 std: - 0.225 - 0.224 -- Gitee From 6fe0a98e6ef0f096f692f499285cbaa6a05e5efd Mon Sep 17 00:00:00 2001 From: Zheng-Bicheng Date: Thu, 26 Sep 2024 17:06:53 +0800 Subject: [PATCH 08/27] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=89=8B=E5=86=99?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E8=AF=86=E5=88=AB=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 31 ++++---- example/special/digit_handwritten_rec.md | 50 ++++++++++++ example/special/python/README.md | 76 +++++++++++++++++++ .../python/test_digit_handwritten_rec.py | 34 +++++++++ example/vision/classification/README.md | 10 +-- 5 files changed, 179 insertions(+), 22 deletions(-) create mode 100644 example/special/digit_handwritten_rec.md create mode 100644 example/special/python/README.md create mode 100644 example/special/python/test_digit_handwritten_rec.py diff --git a/README.md b/README.md index ee1e946..10a40e7 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ ## 🔄 最新日志 - ## 💡 入门学习教程 这一部分教程旨在为你提供一个系统化的学习路径,帮助你快速上手 Lockzhiner Vision Module。通过一系列详细的教程,你将学会如何烧录镜像、连接设备、搭建开发环境和编写简单的程序。 @@ -24,7 +23,7 @@ 如果你需要开发 C++ 程序,请参考以下教程搭建开发环境: * [凌智视觉模块 C++ 开发环境搭建指南](./docs/introductory_tutorial/cpp_development_environment.md) -* [基于 C++ 编写 Hello World 程序](./example/hello_world/README.md) +* [基于 C++ 编写 Hello World 程序](./example/hello_world) --> ## 🔌 外设控制教程 @@ -35,26 +34,26 @@ Lockzhiner Vision Module 拥有丰富的 IO 接口,其接口图片如下图所 为了帮助你快速上手教程,我们提供了一系列的外设控制例程,你可以点击链接快速学习 -* [凌智视觉模块串口使用指南](./example/periphery/usart/README.md) -* [凌智视觉模块 ADC 使用指南](./example/periphery/adc/README.md) -* [凌智视觉模块 PWM 使用指南](./example/periphery/pwm/README.md) -* [凌智视觉模块 GPIO 使用指南](./example/periphery/gpio/README.md) -* [凌智视觉模块摄像头使用指南](./example/periphery/capture/README.md) +* [凌智视觉模块串口使用指南](./example/periphery/usart) +* [凌智视觉模块 ADC 使用指南](./example/periphery/adc) +* [凌智视觉模块 PWM 使用指南](./example/periphery/pwm) +* [凌智视觉模块 GPIO 使用指南](./example/periphery/gpio) +* [凌智视觉模块摄像头使用指南](./example/periphery/capture) ## 🧠 深度学习视觉部署教程 这一部分教程将引导你从零开始训练并部署各种深度学习模型,包括分类模型、检测模型、分割模型和 OCR 模型。通过这些实战教程,你将学习到如何利用 Lockzhiner Vision Module 的高性能计算能力以及借助 Paddle 生态系统的丰富资源,轻松实现视觉任务的训练和部署。 -* [分类模型部署指南](./example/vision/classification/README.md) -* [检测模型部署指南](./example/vision/detetcion/README.md) -* [分割模型部署指南(支持中)]() -* [OCR 模型部署指南(支持中)]() +* [凌智视觉模块分类模型部署指南](./example/vision/classification) +* [凌智视觉模块检测模型部署指南](./example/vision/detetcion) + + -## 👍 特色模型部署教程 +## 👍 特色部署教程 -* [手写数字检测部署指南(支持中)]() -* [人脸佩戴口罩检测部署指南(支持中)]() -* [二维码识别与检测部署指南(支持中)]() +* [凌智视觉模块手写数字识别部署指南]() + + ## 🐛 Bug反馈 @@ -84,4 +83,4 @@ Lockzhiner Vision Module 拥有丰富的 IO 接口,其接口图片如下图所 ## 📜 开源协议 -Lockzhiner Vision Module 全系列仓库遵循 [Apache License Version 2.0](./LICENSE)。 \ No newline at end of file +Lockzhiner Vision Module 全系列仓库遵循 [Apache License Version 2.0](./LICENSE)。 diff --git a/example/special/digit_handwritten_rec.md b/example/special/digit_handwritten_rec.md new file mode 100644 index 0000000..eb01e20 --- /dev/null +++ b/example/special/digit_handwritten_rec.md @@ -0,0 +1,50 @@ +

凌智视觉模块手写数字识别部署指南

+ +发布版本:V0.0.0 + +日期:2024-09-26 + +文件密级:□绝密 □秘密 □内部资料 ■公开 + +--- + +**免责声明** + +本文档按**现状**提供,福州凌睿智捷电子有限公司(以下简称**本公司**)不对本文档中的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、适用性及非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。 + +由于产品版本升级或其他原因,本文档可能在未经任何通知的情况下不定期更新或修改。 + +**读者对象** + +本教程适用于以下工程师: + +- 技术支持工程师 +- 软件开发工程师 + +**修订记录** + +| **日期** | **版本** | **作者** | **修改说明** | +| :--------- | -------- | -------- | ------------ | +| 2024/09/26 | 0.0.0 | 郑必城 | 初始版本 | + +## 1 简介 + +手写数字识别是经常使用到的功能之一。竞品 K210 和 OpenMV 提供了 Mnist 数字识别的案例,但是这些案例基于非真实环境的数据集,因此没办法直接在真实环境中使用,为了解决这个问题,我们基于 [凌智视觉模块分类模型部署指南](../vision/classification) 训练了凌智视觉模块专用的模型,可以实现实时的数字识别功能。 + +## 2 运行前的准备 + +- 请确保你已经下载了 [凌智视觉模块手写数字识别模型](https://gitee.com/LockzhinerAI/LockzhinerVisionModule/releases/download/v0.0.0/LZ-DigitHandRecog.rknn) + +## 3 在凌智视觉模块上部署模型 + +下载模型后,请参考以下教程使用 Python 在凌智视觉模块上部署分类模型例程: + +- [凌智视觉模块分类模型 Python 部署指南](./python) + +## 4 模型性能指标 + +以下测试数据为模型执行 Predict 函数运行 1000 次耗时的平均时间 + +| 分类模型 | FPS(帧/s) | 精度(%) | +|:-------:|:----:|:----:| +|LZ-DigitHandRecog|35|96.74| diff --git a/example/special/python/README.md b/example/special/python/README.md new file mode 100644 index 0000000..1e1f535 --- /dev/null +++ b/example/special/python/README.md @@ -0,0 +1,76 @@ +

凌智视觉模块手写数字识别 Python 部署指南

+ +发布版本:V0.0.0 + +日期:2024-09-26 + +文件密级:□绝密 □秘密 □内部资料 ■公开 + +--- + +**免责声明** + +本文档按**现状**提供,福州凌睿智捷电子有限公司(以下简称**本公司**)不对本文档中的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、适用性及非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。 + +由于产品版本升级或其他原因,本文档可能在未经任何通知的情况下不定期更新或修改。 + +**读者对象** + +本教程适用于以下工程师: + +- 技术支持工程师 +- 软件开发工程师 + +**修订记录** + +| **日期** | **版本** | **作者** | **修改说明** | +| :--------- | -------- | -------- | ------------ | +| 2024/09/26 | 0.0.0 | 郑必城 | 初始版本 | + +## 1 简介 + +接下来让我们基于 Python 来部署手写数字模型。在开始本章节前: + +- 请确保你已经参考 [凌智视觉模块手写数字识别部署指南](../README.md) 正确下载了模型。 +- 请确保你已经参考 [凌智视觉模块摄像头部署指南](../../periphery/capture/README.md) 正确下载了凌智视觉模块图片传输助手。 +- 请确保你已经按照 [开发环境搭建指南](../../../../docs/introductory_tutorial/python_development_environment.md) 正确配置了开发环境。 + +## 2 Python API 文档 + +同[分类模型 Python 部署 API 文档](../../vision/classification/python/README.md) + +## 3 项目介绍 + +为了方便大家入手,我们做了一个简易的手写数字识别例程。该程序可以使用摄像头进行端到端推理,并可视化推理结果到凌智视觉模块图片传输助手。 + +```python +``` + +## 4 上传并测试 Python 程序 + +参考 [连接设备指南](../../../../docs/introductory_tutorial/connect_device_using_ssh.md) 正确连接 Lockzhiner Vision Module 设备。 + +![](../../../../docs/introductory_tutorial/images/connect_device_using_ssh/ssh_success.png) + +请使用 Electerm Sftp 依次上传以下两个文件: + +- 进入存放 **test_paddleclas.py** 脚本文件的目录,将 **test_paddleclas.py** 上传到 Lockzhiner Vision Module +- 进入存放 **LZ-MobileNetV2_x0_25.rknn(也可能是其他模型)** 模型存放的目录(模型存放在训练模型后下载的 output 文件夹内),将 **LZ-MobileNetV2_x0_25.rknn** 上传到 Lockzhiner Vision Module + +![](images/stfp_0.png) + +![](images/stfp_1.png) + +请使用 Electerm Ssh 并在命令行中执行以下命令: + +```bash +python test_classification.py LZ-MobileNetV3.rknn +``` + +运行程序后,屏幕上开始打印标签索引,分类置信度,并在一段时间后输出 FPS 值 + +![alt text](result_0.png) + +## 5 其他 + +如果你需要使用 C++ 来部署 PaddleClas 请参考[凌智视觉模块分类模型 C++ 部署指南](../cpp/README.md)。 diff --git a/example/special/python/test_digit_handwritten_rec.py b/example/special/python/test_digit_handwritten_rec.py new file mode 100644 index 0000000..ee14a09 --- /dev/null +++ b/example/special/python/test_digit_handwritten_rec.py @@ -0,0 +1,34 @@ +from lockzhiner_vision_module.cv2 import VideoCapture +from lockzhiner_vision_module.vision import PaddleClas, visualize +from lockzhiner_vision_module.edit import Edit +import sys + +if __name__ == "__main__": + args = sys.argv + if len(args) != 2: + print("Need model path. Example: python test_digit_handwritten_rec.py LZ-DigitHandRecog.rknn") + exit(1) + + edit = Edit() + edit.start_and_accept_connection() + + model = PaddleClas() + if model.initialize(args[1]) is False: + print("Failed to initialize PaddleClas") + exit(1) + + video_capture = VideoCapture() + if video_capture.open(0) is False: + print("Failed to open capture") + exit(1) + + while True: + ret, mat = video_capture.read() + if ret is False: + continue + + result = model.predict(mat) + print(f"The label_id is {result.label_id} and the score is {result.score}") + + vis_mat = visualize(mat, result) + edit.print(vis_mat) \ No newline at end of file diff --git a/example/vision/classification/README.md b/example/vision/classification/README.md index f3f3943..e7a5e16 100644 --- a/example/vision/classification/README.md +++ b/example/vision/classification/README.md @@ -47,7 +47,7 @@ Labelme 是一个 python 语言编写,带有图形界面的图像标注软件 ### 2.2 标注前的准备 -首先,请参考 [摄像头使用指南](./example/periphery/capture/README.md) 利用 **Lockzhiner Vision Module 图片获取助手** 拍摄你需要进行标注的图片,如下图所示: +首先,请参考 [摄像头使用指南](./example/periphery/capture) 利用 **Lockzhiner Vision Module 图片获取助手** 拍摄你需要进行标注的图片,如下图所示: ![](images/capture_images.png) @@ -211,8 +211,8 @@ AI Studio 是基于百度深度学习开源平台飞桨的人工智能学习与 训练完模型后,请参考以下教程使用 C++ 或 Python 在凌智视觉模块上部署分类模型例程: - -* [凌智视觉模块分类模型 Python 部署指南](./python/README.md) + +- [凌智视觉模块分类模型 Python 部署指南](./python) ## 5 各模型性能指标 @@ -220,6 +220,4 @@ AI Studio 是基于百度深度学习开源平台飞桨的人工智能学习与 | 分类模型 | FPS(帧/s) | 精度(%) | |:-------:|:----:|:----:| -|LZ-MobileNetV2_x0_25|70.57|53.21| -|LZ-MobileNetV2_x0_5|63.48|65.03| -|LZ-MobileNetV2_x1_0|49.44|72.15| \ No newline at end of file +|LZ-MobileNetV3|40|75.32| -- Gitee From 9b4d7ee5287f99e6cc72586009d60c3ae81f89a2 Mon Sep 17 00:00:00 2001 From: Zheng-Bicheng Date: Thu, 26 Sep 2024 17:20:02 +0800 Subject: [PATCH 09/27] Update docs --- example/special/python/README.md | 54 ++++++++++++++---- example/special/python/images/result_0.png | Bin 0 -> 424432 bytes example/special/python/images/stfp.png | Bin 0 -> 162348 bytes .../vision/classification/python/README.md | 10 ++-- 4 files changed, 48 insertions(+), 16 deletions(-) create mode 100644 example/special/python/images/result_0.png create mode 100644 example/special/python/images/stfp.png diff --git a/example/special/python/README.md b/example/special/python/README.md index 1e1f535..ce98ee7 100644 --- a/example/special/python/README.md +++ b/example/special/python/README.md @@ -44,33 +44,65 @@ 为了方便大家入手,我们做了一个简易的手写数字识别例程。该程序可以使用摄像头进行端到端推理,并可视化推理结果到凌智视觉模块图片传输助手。 ```python +from lockzhiner_vision_module.cv2 import VideoCapture +from lockzhiner_vision_module.vision import PaddleClas, visualize +from lockzhiner_vision_module.edit import Edit +import sys + +if __name__ == "__main__": + args = sys.argv + if len(args) != 2: + print("Need model path. Example: python test_digit_handwritten_rec.py LZ-DigitHandRecog.rknn") + exit(1) + + edit = Edit() + edit.start_and_accept_connection() + + model = PaddleClas() + if model.initialize(args[1]) is False: + print("Failed to initialize PaddleClas") + exit(1) + + video_capture = VideoCapture() + if video_capture.open(0) is False: + print("Failed to open capture") + exit(1) + + while True: + ret, mat = video_capture.read() + if ret is False: + continue + + result = model.predict(mat) + print(f"The label_id is {result.label_id} and the score is {result.score}") + + vis_mat = visualize(mat, result) + edit.print(vis_mat) ``` ## 4 上传并测试 Python 程序 参考 [连接设备指南](../../../../docs/introductory_tutorial/connect_device_using_ssh.md) 正确连接 Lockzhiner Vision Module 设备。 -![](../../../../docs/introductory_tutorial/images/connect_device_using_ssh/ssh_success.png) +![](../../../docs/introductory_tutorial/images/connect_device_using_ssh/ssh_success.png) 请使用 Electerm Sftp 依次上传以下两个文件: -- 进入存放 **test_paddleclas.py** 脚本文件的目录,将 **test_paddleclas.py** 上传到 Lockzhiner Vision Module -- 进入存放 **LZ-MobileNetV2_x0_25.rknn(也可能是其他模型)** 模型存放的目录(模型存放在训练模型后下载的 output 文件夹内),将 **LZ-MobileNetV2_x0_25.rknn** 上传到 Lockzhiner Vision Module +- 进入存放 **test_digit_handwritten_rec.py** 脚本文件的目录,将 **test_digit_handwritten_rec.py** 上传到 Lockzhiner Vision Module +- 进入存放 **LZ-DigitHandRecog.rknn** 模型存放的目录(模型存放在训练模型后下载的 output 文件夹内),将 **LZ-DigitHandRecog.rknn** 上传到 Lockzhiner Vision Module -![](images/stfp_0.png) - -![](images/stfp_1.png) +![](images/stfp.png) 请使用 Electerm Ssh 并在命令行中执行以下命令: ```bash -python test_classification.py LZ-MobileNetV3.rknn +python test_digit_handwritten_rec.py LZ-DigitHandRecog.rknn ``` -运行程序后,屏幕上开始打印标签索引,分类置信度,并在一段时间后输出 FPS 值 +运行程序后,使用凌智视觉模块图片传输助手连接设备,屏幕上开始打印标签索引和置信度,凌智视觉模块图片传输助手出现可视化的结果 -![alt text](result_0.png) +![alt text](images/result_0.png) -## 5 其他 + -如果你需要使用 C++ 来部署 PaddleClas 请参考[凌智视觉模块分类模型 C++ 部署指南](../cpp/README.md)。 + diff --git a/example/special/python/images/result_0.png b/example/special/python/images/result_0.png new file mode 100644 index 0000000000000000000000000000000000000000..c09e7e8b48da89ec1db2442a8bb9285c651d3c17 GIT binary patch literal 424432 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 {WbLG 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