当前位置: 首页 > news >正文

OpenCV DNN 模块使用指南

OpenCV DNN 模块使用指南

一、模块概述

OpenCV 的 DNN(深度神经网络)模块为开发者提供了强大的深度学习功能,能够加载并运行多种格式的预训练深度学习模型。此模块广泛应用于图像分类、目标检测、语义分割等众多计算机视觉任务。接下来,我们会详细介绍该模块的主要类和函数,以及它们在不同应用场景中的具体实现。

二、主要函数及类详解

(一)模型加载函数

1. cv.dnn.readNetFromCaffe()
  • 功能:用于加载由 Caffe 框架训练得到的深度学习模型。Caffe 是一个广泛使用的深度学习框架,其模型通常由一个 .prototxt 文件(定义网络结构)和一个 .caffemodel 文件(存储训练好的权重)组成。
  • 参数
    • prototxt:Caffe 模型的网络结构文件路径,后缀为 .prototxt
    • caffeModel:Caffe 模型的权重文件路径,后缀为 .caffemodel
  • 返回值:返回一个 cv.dnn_Net 对象,可用于后续的前向传播等操作。
示例代码

python

import cv2 as cv# 加载 Caffe 模型
prototxt_path = 'deploy.prototxt'
caffemodel_path = 'model.caffemodel'
net = cv.dnn.readNetFromCaffe(prototxt_path, caffemodel_path)
2. cv.dnn.readNetFromTensorflow()
  • 功能:用于加载由 TensorFlow 框架训练得到的深度学习模型。TensorFlow 模型一般以 .pb 文件(Protocol Buffers 格式,包含模型的图结构和权重)的形式存在。
  • 参数
    • model:TensorFlow 模型的 .pb 文件路径。
    • config(可选):TensorFlow 模型的配置文件路径,通常为 .pbtxt 文件。
  • 返回值:同样返回一个 cv.dnn_Net 对象。
示例代码

python

import cv2 as cv# 加载 TensorFlow 模型
model_path = 'frozen_inference_graph.pb'
config_path = 'graph.pbtxt'
net = cv.dnn.readNetFromTensorflow(model_path, config_path)

(二)前向传播函数:net.forward()

  • 功能:对输入的数据进行前向传播,即让数据通过加载的深度学习模型,得到模型的输出结果。
  • 参数
    • outputName(可选):指定要获取的输出层名称。如果不指定,将返回所有输出层的结果。
  • 返回值:返回模型的输出结果,通常是一个包含多个数组的列表,每个数组对应一个输出层的结果。
示例代码

python

import cv2 as cv
import numpy as np# 假设已经加载了模型
prototxt_path = 'deploy.prototxt'
caffemodel_path = 'model.caffemodel'
net = cv.dnn.readNetFromCaffe(prototxt_path, caffemodel_path)# 读取图像
image = cv.imread('test_image.jpg')
blob = cv.dnn.blobFromImage(image, scalefactor=1.0, size=(224, 224), mean=(104, 117, 123))# 设置输入数据
net.setInput(blob)# 进行前向传播
output = net.forward()

三、应用场景实现

(一)图像分类

图像分类的目标是将输入的图像归类到预定义的类别中。以下是一个使用预训练的 Caffe 模型进行图像分类的示例:

python

import cv2 as cv
import numpy as np# 加载 Caffe 模型
prototxt_path = 'squeezenet.prototxt'
caffemodel_path = 'squeezenet.caffemodel'
net = cv.dnn.readNetFromCaffe(prototxt_path, caffemodel_path)# 读取图像
image = cv.imread('test_image.jpg')
blob = cv.dnn.blobFromImage(image, scalefactor=1.0, size=(227, 227), mean=(104, 117, 123))# 设置输入数据
net.setInput(blob)# 进行前向传播
output = net.forward()# 获取预测结果
predicted_class = np.argmax(output)# 打印预测结果
print(f"预测类别索引: {predicted_class}")

(二)目标检测

目标检测是在图像中找出特定目标的位置和类别。以下是一个使用预训练的 TensorFlow 模型进行目标检测的示例:

python

import cv2 as cv
import numpy as np# 加载 TensorFlow 模型
model_path = 'frozen_inference_graph.pb'
config_path = 'graph.pbtxt'
net = cv.dnn.readNetFromTensorflow(model_path, config_path)# 读取图像
image = cv.imread('test_image.jpg')
height, width = image.shape[:2]
blob = cv.dnn.blobFromImage(image, size=(300, 300), swapRB=True, crop=False)# 设置输入数据
net.setInput(blob)# 进行前向传播
output = net.forward()# 处理检测结果
for detection in output[0, 0]:confidence = detection[2]if confidence > 0.5:class_id = int(detection[1])box = detection[3:7] * np.array([width, height, width, height])(startX, startY, endX, endY) = box.astype("int")# 绘制检测框和标签cv.rectangle(image, (startX, startY), (endX, endY), (0, 255, 0), 2)label = f"Class {class_id}: {confidence * 100:.2f}%"cv.putText(image, label, (startX, startY - 10), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)# 显示结果图像
cv.imshow("Object Detection", image)
cv.waitKey(0)
cv.destroyAllWindows()

(三)语义分割

语义分割是将图像中的每个像素归类到不同的类别中。以下是一个使用预训练的模型进行语义分割的示例:

python

import cv2 as cv
import numpy as np# 加载模型(假设是 Caffe 模型)
prototxt_path = 'segnet.prototxt'
caffemodel_path = 'segnet.caffemodel'
net = cv.dnn.readNetFromCaffe(prototxt_path, caffemodel_path)# 读取图像
image = cv.imread('test_image.jpg')
blob = cv.dnn.blobFromImage(image, scalefactor=1.0, size=(512, 512), mean=(104, 117, 123))# 设置输入数据
net.setInput(blob)# 进行前向传播
output = net.forward()# 获取分割结果
segmentation_mask = np.argmax(output[0], axis=0)# 可视化分割结果
colored_mask = np.zeros((segmentation_mask.shape[0], segmentation_mask.shape[1], 3), dtype=np.uint8)
# 为不同类别分配不同颜色
for class_id in np.unique(segmentation_mask):colored_mask[segmentation_mask == class_id] = np.random.randint(0, 255, 3)# 叠加分割结果到原始图像上
alpha = 0.5
result = cv.addWeighted(image, 1 - alpha, colored_mask, alpha, 0)# 显示结果图像
cv.imshow("Semantic Segmentation", result)
cv.waitKey(0)
cv.destroyAllWindows()

四、注意事项

  • 模型兼容性:要确保加载的模型文件与使用的加载函数兼容,例如使用 cv.dnn.readNetFromCaffe() 加载 Caffe 模型,使用 cv.dnn.readNetFromTensorflow() 加载 TensorFlow 模型。
  • 输入数据预处理:不同的模型可能对输入数据有不同的要求,如输入图像的尺寸、均值归一化等。在使用 cv.dnn.blobFromImage() 函数时,要根据模型的要求设置合适的参数。
  • 资源消耗:深度学习模型通常需要较大的计算资源和内存。如果在资源有限的设备上运行,可能会出现性能问题,可以考虑使用轻量级的模型或进行模型量化。

通过以上内容,你可以了解 OpenCV DNN 模块的主要功能和使用方法,以及如何在图像分类、目标检测、语义分割等应用场景中运用该模块进行深度学习任务。

相关文章:

OpenCV DNN 模块使用指南

OpenCV DNN 模块使用指南 一、模块概述 OpenCV 的 DNN(深度神经网络)模块为开发者提供了强大的深度学习功能,能够加载并运行多种格式的预训练深度学习模型。此模块广泛应用于图像分类、目标检测、语义分割等众多计算机视觉任务。接下来&…...

温度(Temperature)在大模型输出中的作用与底层原理

温度(Temperature)在大模型输出中的作用与底层原理 在深度学习领域,尤其是自然语言处理(NLP)中,大型语言模型(LLM)的输出生成通常依赖于概率分布的采样。温度(temperatu…...

智能汽车图像及视频处理方案,支持视频智能拍摄能力

美摄科技,作为智能汽车图像及视频处理领域的先行者,凭借其卓越的技术实力和前瞻性的设计理念,为全球智能汽车制造商带来了一场视觉盛宴的革新。我们自豪地推出——美摄科技智能汽车图像及视频处理方案,一个集高效性、智能化、画质…...

一文讲清 C++ CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)

CRTP是 C 中的一种模板元编程技术,其核心原理是通过模板继承和静态多态,在编译期实现基类对派生类成员的访问,从而避免运行时虚函数调用的开销。 1. CRTP 的基本结构 CRTP 的核心思想是:基类是一个模板类,其模板参数…...

如何用Function Calling解锁OpenAI的「真实世界」交互能力?(附Node.js 实战)

一、Function Calling:大模型的「手脚延伸器」 1.1 核心定义 Function Calling是OpenAI在2023年6月13日推出的革命性功能(对应模型版本gpt-3.5-turbo-0613和gpt-4-0613),允许开发者通过自然语言指令触发预定义函数,实…...

MySQL:float,decimal(1)

会四舍五入 无符号浮点数 更改321zyy1下的salary 为float类型 decimal:...

基于DrissionPage的DY无水印视频采集

基于DrissionPage的Dy无水印视频采集技术解析 目录 一、项目背景与痛点分析 1.1 典型应用场景1.2 传统方案痛点对比1.3 需求分析流程图二、系统架构设计 2.1 核心架构图2.2 执行流程图解三、开发环境配置 3.1 版本要求3.2 环境搭建指南四、实现流程详解 4.1 主要处理阶段4.2 关…...

yt-dlp工具下载视频使用方法

使用 yt-dlp 下载有土播视频时,可以很容易地同时下载字幕文件。 下面是详细操作说明: 一、下载视频并同时下载字幕: 基础命令: yt-dlp --write-subs 视频链接示例: yt-dlp --write-subs https://www.youdubo.com/wa…...

canvas数据标注功能简单实现:矩形、圆形

背景说明 基于UI同学的设计,在市面上找不到刚刚好的数据标注工具,遂决定自行开发。目前需求是实现图片的矩形、圆形标注,并获取标注的坐标信息,使用canvas可以比较方便的实现该功能。 主要功能 选中图形,进行拖动 使…...

Linux与HTTP报头属性和请求方式

HTTP报头属性、请求方式 本篇介绍 在上一节深入HTTP序列化和反序列化已经详细讲解了HTTP是如何进行序列化和反序列化的,但是上一节对请求报头和响应报头的具体内容并没有做出具体的说明,本节就会基于这个问题继续探讨HttpServer;另外在介绍…...

WordPress漏洞

一,后台修改模板拿WebShell 1,安装好靶场后访问 2,在如图所示的位置选择一个php文件写入一句话木马,我们这里选择在404.php中写入 3,访问404.php 二,上传主题拿WebShell 1,找到如图所示的页面…...

go命令使用

查看配置信息 go env配置go国内源 export GO111MODULEon export GOPROXYhttps://goproxy.cn测试 go install github.com/jesseduffield/lazydockerlatesthttps://github.com/jesseduffield/lazydocker...

uniapp vue3使用uniapp的生命周期

使用uniapp的onLoad等生命周期 // 需要引入 import { onLoad , onShow } from dcloudio/uni-app; // 箭头函数 onLoad(()>{//内容 })使用vue生命周期 vue官方文档:https://cn.vuejs.org/api/options-lifecycle.html import { ref,onMounted } from vue; onMou…...

nginx vue history模式 try_files

server {listen 80;server_name localhost chat.test.com;#配置根目录location / {root /temp/test;#index index.html index.htm;try_files $uri $uri/ /index.html;add_header Content-Security-Policy upgrade-insecure-requests;}} https://blog.csdn.net/xutongbao/…...

【css酷炫效果】纯CSS实现悬浮弹性按钮

【css酷炫效果】纯CSS实现悬浮弹性按钮 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492020 缘 创作随缘,不定时更新。 创作背景 刚看到csdn出活动了&…...

MySQL自动化配置工具开发:探索如何用脚本实现MySQL一键安装与配置,提升运维效率

引言 MySQL作为最流行的开源关系型数据库之一,广泛应用于各类业务场景。然而,手动安装和配置MySQL不仅耗时,还容易出错。为了提高运维效率,开发一款MySQL自动化配置工具显得尤为重要。本文将探索如何通过脚本实现MySQL的一键安装与配置,并提供具体的配置脚本文档和关键参…...

如何查看安卓版本号的方法(例如查看是13、12、11、10...)

开发过程中需要了解到安卓版本号是多少,那么以下有三种方法可以知晓安卓手机的Android版本号。 方法1:手机设置直接查看 1.打开【设置】 --> 滑动到手机最底部 --> 点击【关于手机】或 【系统】--> 选择【Android版本】 2.直接查看版本号&am…...

ubuntu 解挂载时提示 “umount: /home/xx/Applications/yy: target is busy.”

问题如题所示,我挂载一个squanfs文件系统到指定目录,当我使用完后,准备解挂载时,提示umount: /home/xx/Applications/yy: target is busy.,具体的如图所示, 这种提示通常是表明这个路径的内容正在被某些进…...

Java XML与JSON相互转换详解

目录 一、为什么需要XML与JSON转换二、使用Jackson库进行转换1. 添加依赖2. XML转JSON3. JSON转XML三、注意事项在现代软件开发中,数据格式的转换是一项常见的任务,特别是在处理不同系统或服务之间的数据交换时。XML(可扩展标记语言)和JSON(JavaScript对象表示法)是两种广…...

[AI速读]用持续集成(CI)优化芯片验证环境:Jenkins与EDA工具的实战指南

在芯片验证中,回归测试(Regression Test)是确保设计稳定性的关键步骤。但随着设计复杂度增加,手动管理海量测试用例、分析日志和覆盖率数据变得异常耗时。本文将介绍如何利用持续集成(CI)工具Jenkins,结合EDA验证环境(如Cadence vManager),实现自动化测试与结果分析,…...

Java-SpringBootWeb入门、Spring官方脚手架连接不上解决方法

一. Spring 官网:Spring | Home Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能(Spring全家桶) Spring Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率 。 二. Spring Boot入…...

WEB攻防-PHP反序列化-字符串逃逸

目录 前置知识 字符串逃逸-减少 字符串逃逸-增多 前置知识 1.PHP 在反序列化时,语法是以 ; 作为字段的分隔,以 } 作为结尾,在结束符}之后的任何内容不会影响反序列化的后的结果 class people{ public $namelili; public $age20; } var_du…...

Android第五次面试总结(网络篇)

一、引言:为什么需要 DNS? 在浏览器输入www.example.com的瞬间,一场跨越全球的数字接力赛悄然启动。DNS(域名系统)如同互联网的 “电话号码簿”,将人类可读的域名转化为机器可识别的 IP 地址。本文将以工程…...

全网首创/纯Qt/C++实现国标GB28181服务/实时视频/云台控制/预置位/录像回放和下载/事件订阅/语音对讲

一、前言说明 用纯Qt来实现这个GB28181的想法很久了,具体可以追溯到2014年,一晃十年都过去了,总算是整体的框架和逻辑都打通了,总归还是杂七杂八的事情多,无法静下心来研究具体的协议,最开始初步了解协议后…...

详解MySQL的事务实现机制

MySQL事务实现机制 1. 锁机制2. Redo Log(重做日志)3. Undo Log(撤销日志)4. MVCC(多版本并发控制)综合事务处理流程 在MySQL中(主要以InnoDB为例),事务的实现依赖于多个…...

什么是 BA ?BA怎么样?BA和BI是什么关系?

前几天有朋友在评论区提到了BA这个角色,具体是干什么的,我大概来说一下。 什么是BA BA 英文的全称是Business Analyst,从字面上意思就是商业分析师,做过商业智能BI项目的应该比较了解。实际上以我个人的经验,BA 的角…...

Junit在测试过程中的使用方式,具体使用在项目测试中的重点说明

JUnit 是一个广泛使用的 Java 单元测试框架,主要用于编写和运行可重复的测试。以下是 JUnit 在项目测试中的使用方式和重点说明: 1. 基本使用 场景:测试一个简单的 Java 类。 示例: import org.junit.Test; import static org.junit.Assert.*;public class CalculatorTe…...

网络安全之前端学习(HTML篇)

前言:网络安全中有一个漏洞叫xss漏洞,就是利用网页引发弹窗,这就要求我们看得懂源码,所以我会持续更新前端学习,可以不精通,但是一定要会,主要掌握HTML,css,js这三项技术…...

Lineageos 22.1(Android 15)实现负一屏

一、前言 方案是参考的这位大佬的,大家可以去付费订阅支持一波。我大概理一下Android15的修改。 大佬的方案代码 二、Android15适配调整 1.bp调整,加入aidl引入,这样make之后就可以索引代码了 filegroup {name: "launcher-src"…...

Redisson分布式锁(超时释放及锁续期)

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...

SQL授予用户查询某个模式或者具体某个表

例如:需要给sjzt授权查询这个模式下的这个表的操作 数据库:DB_HZ_HYZHFZ 模式:hn_proxy 服务注册表:hn_proxy."serverrg" 账号:sjzt -- 登录到目标数据库 DB_HZ_HYZHFZ -- 授予权限给账号 sjzt 在模式 hn_proxy 中访问…...

Burp Suite 代理配置与网络通信

目录 1. 引言 2. Burp 代理基础配置 2.1 浏览器代理设置 2.2 Burp 监听端口配置 2.3 常见错误排查 3. 网络问题解决 3.1 端口占用检查 3.2 防火墙配置 3.3 证书信任问题 4. 虚拟机环境配置 4.1 NAT 模式与端口转发 4.2 桥接模式配置 4.3 跨设备访问测试 5. 技术概…...

PyCharm安装redis,python安装redis,PyCharm使用失败问题

报错信息 Usage: D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] -r [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip instal…...

使用命令行工具控制wireshark对抓包文件进行针对性处理的总结

近日,工作中有开发对抓包文件进行针对性过滤的小程序的需求,兜兜转转踩了很多坑后还是绕回了wireshark。 作为最出名的开源软件之一,wireshark也具有使用命令行进行操作的功能,这就是我们今天会总结到的“tshark.exe”。 通常&a…...

【STM32实物】基于STM32的太阳能充电宝设计

基于STM32的太阳能充电宝设计 演示视频: 基于STM32的太阳能充电宝设计 硬件组成: 系统硬件包括主控 STM32F103C8T6、0.96 OLED 显示屏、蜂鸣器、电源自锁开关、温度传感器 DS18B20、继电器、5 V DC 升压模块 、TB4056、18650锂电池、9 V太阳能板、稳压降压 5 V三极管。 功能…...

NLP 与常见的nlp应用

自然语言处理(NLP)是一个广泛的领域,它不仅包括自然语言理解(NLU),还涉及一系列其他任务和子领域。以下是NLP领域中的主要组成部分及其相关任务: 1. 自然语言理解(NLU) …...

基于javaweb的SSM+Maven宠物领养宠物商城流浪动物管理系统与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

Java数据类型 Arrays VS ArraysList VS LikedList 解析

在学习Java过程中,在刷题时总是搞不清楚这三种数据结构的区别,打算写篇文章记录一下 Arrays VS ArrayList ArrayList VS LinkedList 总结 Arrays VS ArrayList ArraysArrayList类型Java的基本数据类型Java集合框架中的一个类,实现了List接…...

C++进阶(一)

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 本篇博客是讲解函数的重载以及引用的知识点的。 文章目录 前言 1.函数重载 1.1何为函数重载 1.2函数重载的作用 1.3函数重载的实现 2.引用 2.1何为引用 2.2定义引用 2.3引用特性 2.4常引用 2…...

Elasticsearch 在航空行业:数据管理的游戏规则改变者

作者:来自 Elastic Adam La Roche 数字化客户体验不再是奢侈品,而是欧洲航空公司必不可少的需求。它推动了客户满意度,提升了运营效率,并创造了可持续的竞争优势。随着行业的不断发展,优先投资前沿数字技术和平台的航空…...

Powershell WSL部署ubuntu22.04.5子系统

前提条件WSL 安装 wsl 安装参考1wsl 安装csdn参考2wsl 百度网盘离线下载 本地目录安装ubuntu22.04.5 子系统 powershell 管理员打开执行(实现,下载安装ubuntu子系统,用户创建,远程ssh登录设置,防火墙端口开放)子系统IP 查看方法wsl...

华为网路设备学习-16 虚拟路由器冗余协议(VRRP)

VRRP是针对干线上三层网络设备(如:路由器、防火墙等)的网络虚拟化技术,提供冗余和状态监测等功能。确保在网络中的单点故障发生时,能够快速切换到备份设备,从而保证网络通信的连续性和可靠性。‌ VRRP通过…...

SQLark中如何进行数据筛选与排序

本文将为你介绍在 SQLark 中如何进行数据筛选与排序,掌握这些操作能够极大提升你的工作效率。 SQLark官网链接:www.sqlark.com 数据筛选 在数据库操作中,数据筛选是一项关键功能,它依据特定条件对数据进行过滤,帮助用户从海量数据…...

slq-labs日志

上次写了第五关的布尔盲注,和双查询报错注入,还有其他报错注入的方法 一.extractvalue函数 extractvalue函数 原理 extractvalue 是一个在 XML 数据中提取值的 MySQL 内置函数。它的语法为: EXTRACTVALUE(xml, xpath_expr)xml 是 XML 字符…...

Webrtc编译官方示例实现视频通话

Webrtc编译官方示例实现视频通话 前言 webrtc官网demo中给了一个供我们学习和应用webrtc的一个很好的例子:peerconnection,这期我们就来编译和运行下这个程序看看视频通话的效果以。 1、打开源码工程 继上期源码编译完成后,我们使用vs打开…...

对接SaToken @SaCheckEL 鉴权注解

对接SaToken SaCheckEL 鉴权注解 文章目录 对接SaToken SaCheckEL 鉴权注解前言一、引入插件和配置SaToken属性配置二、配置1.自定义SaTokenInterceptor并注入Bean2.WebMvcConfig配置SaTokenInterceptor,拦截所有请求路径 三、重载SaToken权限接口和方法注入SaCheck…...

【数据结构】顺序表(附源码)

数据结构之顺序表 1、线性表2、顺序表2.1 概念与结构2.2 顺序表的分类 3、动态顺序表3.1 结构3.2 初始化3.3 容量检查3.4 尾部插入数据3.5 删除尾部数据3.6 头部插入数据3.7 头部删除数据3.8 任意位置pos插入数据3.9 任意位置pos删除数据3.10 查找 4、动态顺序表实现的源码 1、…...

java使用Apache POI 操作word文档

项目背景: 当我们对一些word文档(该文档包含很多的标题比如 1.1 ,1.2 , 1.2.1.1, 1.2.2.3)当我们删除其中一项或者几项时,需要手动的对后续的进行补充。该功能主要是对标题进行自动的补充。 具…...

【Linux网络编程】网络基础

目录 1、OSI分层思想2、数据的封装3、ip地址ipv4的ip地址分类:为什么这样划分?举例 4、端口号5、tcp三次握手为什么需要三次握手?tcp连接的标识为什么 IP 地址不能单独标识一条连接? 6、tcp四次挥手为什么需要四次挥手为什么需要三…...

国内首家,百度智能云千帆AppBuilder全面兼容MCP协议

百度智能云千帆 AppBuilder 已兼容 MCP 协议!作为国内首家支持 MCP 协议的大模型应用开发平台(Claude、LangGraph、Cursor、Cline、N8N等海外平台已支持),千帆 AppBuilder 完成兼容后,用户可通过千帆 AppBuilder 轻松调…...