-
2025-09-5 16:38 基于DeepSeek+Cherry Studio构建模拟面试助手有一说一,操作手册很详细,容易上手,但是华为云开发者空间的云主机的复制粘贴功能太傻了,需要优化,很难用,尤其 mac
-
【朝推夜训】松材线虫病高清图片切分检测我们以 Jetson Orin Nano 为例,介绍如何使用Python在资源受限的嵌入式设备上实现高清大图切分检测。一、模型导出1. 安装 Cmake,创建 24G swap 空间模型导出时依赖更高版本的Cmake,这里我们直接编译安装:sudo apt update sudo apt install libssl-dev git clone -b v3.25.1 https://github.com/Kitware/CMake.git cd CMake ./bootstrap && make && sudo make install cmake --version交换空间是操作系统用来拓展可用内存的一种机制,可以在内存不足的情况下继续运行,避免程序崩溃或者系统卡死,但是交换空间的访问速度远低于物理内存!禁用Jetson设备上的ZRAM交换配置:ZRAM会将内存页面压缩并存储在内存中,以减少对磁盘的依赖。sudo systemctl disable nvzramconfig使用fallocate创建一个24GB大小的文件,位于/var/24GB.swap路径。sudo fallocate -l 24G /var/24GB.swap设置交换空间格式sudo mkswap /var/24GB.swap启用交换空间sudo swapon /var/24GB.swap永久自启交换空间echo "/var/24GB.swap none swap sw 0 0" | sudo tee -a /etc/fstab重启系统后,系统交换空间增加至24GB:sudo reboot 2. 安装 ultralytics,创建 TensorRT 软连接pip install ultralytics pip install tqdm pandas pip install onnx==1.12.0 onnxslim==0.1.65 protobuf==3.20.1 pip install onnx-simplifier==0.3.10 pip install /home/vsuav/Downloads/onnxruntime_gpu-1.12.1-cp38-cp38-linux_aarch64.whl导出TensorRT模型时依赖其Python安装包,一般在系统Python目录下,以Jetson Orin Nano为例,我们可以建立软连接指向TensorRT安装路径:sudo ln -s /usr/lib/python3.8/dist-packages/tensorrt* /home/vsuav/miniconda3/envs/py38/lib/python3.8/site-packages3. 导出 TensorRT FP16 精度的模型from ultralytics import YOLO model = YOLO("yolov8-1_640x640_amd64_fp32.pt") model.export( format="engine", workspace=4, imgsz=640, half=True, device=0, batch=1 ) 二、切分检测1. 安装 SAHI 库pip install sahi==0.11.18这里我们使用0.11.18版本,修改/home/vsuav/miniconda3/envs/py38/lib/python3.8/site-packages/sahi/models/yolov8.py文件,注释掉第33行代码使其能够加载导出的Engine模型。class Yolov8DetectionModel(DetectionModel): def check_dependencies(self) -> None: check_requirements(["ultralytics"]) def load_model(self): """ Detection model is initialized and set to self.model. """ from ultralytics import YOLO try: model = YOLO(self.model_path) # model.to(self.device) self.set_model(model) except Exception as e: raise TypeError("model_path is not a valid yolov8 model path: ", e) 2. 运行检测代码加载模型import cv2 import numpy as np import matplotlib.pyplot as plt from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction detection_model = AutoDetectionModel.from_pretrained( model_type='yolov8', model_path="yolov8-1_640x640_amd64_fp16.engine", confidence_threshold=0.45 ) WARNING ⚠️ Unable to automatically guess model task, assuming 'task=detect'. Explicitly define task for your model, i.e. 'task=detect', 'segment', 'classify','pose' or 'obb'. Loading yolov8-1_640x640_amd64_fp16.engine for TensorRT inference... [09/04/2025-11:27:15] [TRT] [I] Loaded engine size: 51 MiB [09/04/2025-11:27:17] [TRT] [I] [MemUsageChange] Init cuDNN: CPU +616, GPU +757, now: CPU 1052, GPU 5537 (MiB) [09/04/2025-11:27:17] [TRT] [I] [MemUsageChange] TensorRT-managed allocation in engine deserialization: CPU +0, GPU +49, now: CPU 0, GPU 49 (MiB) [09/04/2025-11:27:17] [TRT] [I] [MemUsageChange] Init cuDNN: CPU +0, GPU +29, now: CPU 1001, GPU 5519 (MiB) [09/04/2025-11:27:18] [TRT] [I] [MemUsageChange] TensorRT-managed allocation in IExecutionContext creation: CPU +0, GPU +27, now: CPU 0, GPU 76 (MiB) 图片切分检测image_path = "28c56c0b-3ff7-4997-88b3-5a8330f7ea88.jpeg" result = get_sliced_prediction( image_path, detection_model, slice_height = 640, slice_width = 640, overlap_height_ratio = 0.2, overlap_width_ratio = 0.2, perform_standard_pred = True, postprocess_class_agnostic = True, postprocess_match_threshold = 0.55, ) Performing prediction on 6 slices. Loading yolov8-1_640x640_amd64_fp16.engine for TensorRT inference... [09/04/2025-11:27:20] [TRT] [I] The logger passed into createInferRuntime differs from one already provided for an existing builder, runtime, or refitter. Uses of the global logger, returned by nvinfer1::getLogger(), will return the existing value. [09/04/2025-11:27:20] [TRT] [I] Loaded engine size: 51 MiB [09/04/2025-11:27:20] [TRT] [I] [MemUsageChange] Init cuDNN: CPU +0, GPU +32, now: CPU 1581, GPU 6577 (MiB) [09/04/2025-11:27:20] [TRT] [I] [MemUsageChange] TensorRT-managed allocation in engine deserialization: CPU +0, GPU +50, now: CPU 0, GPU 126 (MiB) [09/04/2025-11:27:20] [TRT] [I] [MemUsageChange] Init cuDNN: CPU +0, GPU +6, now: CPU 1530, GPU 6537 (MiB) [09/04/2025-11:27:20] [TRT] [I] [MemUsageChange] TensorRT-managed allocation in IExecutionContext creation: CPU +1, GPU +27, now: CPU 1, GPU 153 (MiB) 导出检测结果result.export_visuals(export_dir="output/", file_name="sliced_result") result_img_split = cv2.imread("output/sliced_result.png") plt.imshow(result_img_split[:, :, ::-1]) plt.axis('off') plt.show() 三、小结该方案成功在Jetson Orin Nano设备上运行,能够有效处理高清大图的松材线虫病检测任务,在保证检测精度的同时充分利用了嵌入式设备的硬件资源,为林业病虫害防治提供了实用的技术方案。
-
人工智能具有广泛的应用性、深刻的变革性和强大的溢出带动性,正深刻改变人们的生产生活方式,为经济社会发展注入了强大的新动能,如何正确看待和理解人工智能?
-
模型验证可以说是模型部署前保证其“身心健康”的体检报告。首先,我们来看看Benchmark工具用于精度验证的核心逻辑。当我们将一个训练好的模型(例如在PyTorch或TensorFlow中训练)转换为部署框架格式(如ONNX、TensorRT、TFLite)时,由于运算符实现、计算精度(FP32到FP16/INT8)、优化策略等的不同,理论上必然会在数值上引入微小的误差。Benchmark工具的工作就是定量地测量这种误差,确保其处于可接受的范围内,防止模型“带病上岗”。它的工作原理是一个严谨的闭环:固定输入 -> 转换后模型推理 -> 输出与标杆对比 -> 生成精度报告。这里的“标杆数据”(Golden Data)特指由原始未转换的、我们认为正确的模型在相同输入下产生的输出,它作为我们比较的基准真理(Ground Truth)。接下来,我们聚焦到两种核心的相似度度量指标,它们从不同维度告诉我们新模型和标杆模型有多“像”。1. 余弦相似度(Cosine Similarity):衡量“方向”的一致性您可以想象一下高维空间中的两个向量(即模型的输出数据),我们并不直接关心它们的绝对长度或大小,而是更关心它们所指的方向是否一致。余弦相似度就是计算这两个向量之间夹角余弦值。它的取值范围在[-1, 1]之间,值越接近1,代表两个向量的方向越一致,意味着模型在“判断”上是一致的。例如,在一个分类模型中,输出可能是一个概率向量[0.85, 0.1, 0.05](表示85%概率是类别1)和标杆[0.82, 0.12, 0.06]。它们的绝对值有微小差异,但指向的最大概率类别相同,整体分布形态相似,这时余弦相似度会非常高。这个指标非常擅长捕捉输出模式的整体结构性相似,对绝对数值的微小差异不敏感。2. 平均相对误差(Mean Relative Error, MRE):衡量“数值”的精确性与余弦相似度互补,平均相对误差则深入到每个数值点,进行逐元素的、精准的误差测量。它的计算方式是:先计算标杆值与实际值之间绝对差的绝对值,然后用这个绝对值除以标杆值的绝对值(目的是进行归一化,消除数值本身大小的影响),最后对所有数据点求平均。公式大致为:MRE = mean( |(Y_benchmark - Y_infer)| / |Y_benchmark| )。MRE得到一个百分比形式的数值,值越接近0%,说明数值精度越高。它非常敏感于数值的微小波动,能够发现那些余弦相似度可能忽略掉的细微数值偏差。一个高的余弦相似度配上一个低的MRE,才是模型转换成功的黄金标准。综上,一个专业的Benchmark工具会同时使用这两项指标来给我们呈现一份全面的“体检报告”。余弦相似度确保模型“没犯原则性错误”(思路是对的),而平均相对误差则确保它“细节处理到位”(计算是准的)。在实际的模型部署流程中,我们会为这两项指标设定阈值(例如,余弦相似度 > 0.99 且 MRE < 1%),只有通过测试的模型才会被放心地部署到生产环境中,从而保证算法应用的效果与研发阶段的预期高度一致。
-
Netron 是一个专门用于神经网络模型可视化和分析的免费工具,它通过直观的图形界面帮助用户理解和调试模型结构。这个网站(netron.app)提供了在线版本,同时也支持离线桌面端应用,覆盖了Windows、macOS和Linux系统。它的核心功能是解析并可视化各种主流深度学习框架的模型文件,让你无需深入代码即可窥探模型内部架构。Netron 支持绝大多数常见的模型格式,包括但不限于 ONNX、TensorFlow(SavedModel、.pb)、PyTorch(.pt、.pth)、Keras(.h5)、Caffe、Core ML,以及 TensorFlow Lite 等。如果你有一个训练好的AI模型文件,直接拖拽到 Netron 中,它会自动解析并生成结构图,显示每一层的类型(如卷积层、全连接层、激活函数等)、输入输出维度、参数数量等关键信息。这对于模型调试、转换优化或知识共享非常有用。Netron 的突出优势在于它的轻量化和交互性。你无需配置任何环境,打开网页或应用即可加载模型,通过点击节点展开细节,甚至支持模型运算符的逐层查看。例如,你可以快速验证模型是否正确剪枝、量化,或检查中间层的通道数是否符合预期。不过需要注意的是,在线版对文件大小有限制(通常建议小于1GB),超大模型建议使用桌面端处理。总之,Netron 是深度学习工程师、研究者甚至学生的“瑞士军刀”,它降低了理解复杂模型的门槛,让黑盒变得透明。如果你有一个AI模型文件,不妨直接打开 netron.app 试一下——拖拽文件,瞬间就能看到整个计算图的脉络,非常直观!
-
传统的图像识别流程:繁琐且脆弱的“特征工程”在深度学习崛起之前,主流的图像识别方法(如支持向量机SVM)严重依赖于手工设计的特征提取器(Hand-crafted Features)。这个过程可以概括为:预处理:对原始图像进行灰度化、归一化、滤波去噪、图像增强等操作,旨在减少无关变量的干扰。特征提取:这是最核心、最复杂也最需要专家知识的环节。算法工程师需要设计各种复杂的算子,从图像中抽取出“被认为”对分类有用的信息。例如:SIFT (尺度不变特征变换):提取图像中的关键点,并计算其方向梯度直方图作为特征描述符。对旋转、尺度缩放有一定的不变性。HOG (方向梯度直方图):通过计算和统计图像局部区域的梯度方向直方图来构成特征,常用于行人检测。SURF、ORB等等。分类:将上一步提取出的特征向量(一串数字)输入到分类器(如SVM)中进行训练或预测。这种方法的问题在于:脆弱性:这些手工特征往往是针对特定任务设计的(比如HOG对行人有效,但对猫脸可能就无效),泛化能力极差。换一个场景或任务,整个特征提取流程可能就要推倒重来。信息损失:特征提取过程是一个高度压缩和筛选的过程,它很可能在早期就丢弃了大量对后续分类看似无关、实则关键的信息。复杂度高:严重依赖专家的先验知识,试错成本高昂。CNN的革命:端到端的“表示学习”CNN的出现完全颠覆了上述范式。它的强大之处在于,它将特征提取和分类这两个原本分离的步骤融合到了一个统一的、端到端(End-to-End)的神经网络中。“直接输入”的真相:所谓“直接输入原始图像”,更准确的理解是,CNN将原本需要人工设计的特征提取器,替换成了一系列可以通过数据自动学习到的卷积核(Filters)。输入的是图像的原始像素值,但第一层卷积层就开始自动进行特征提取了。分层递进的特征抽象:浅层卷积层:学习到的是非常底层的、局部的特征,如边缘、角点、颜色、纹理等。这类似于传统算法中的SIFT或HOG所做的事情,但它是自动学出来的。中层卷积层:将底层的特征组合成更复杂的模式,如眼睛、鼻子、轮子、窗户等部件。深层卷积层:进一步组合中层特征,形成更加抽象和全局的表示,如一张脸、一辆车、一栋房子的轮廓。全连接层:最终利用这些高度抽象的特征进行分类决策。自动化的优势:通过反向传播算法和梯度下降,整个网络的所有卷积核参数都朝着最终任务(如图像分类)的目标进行优化。网络自己学会了一套从原始像素到最终类别的最优特征提取方案。这套方案最大限度地保留了有用信息,并且因为是从海量数据中学得的,其泛化能力远超任何手工设计的特征。总结来说:CNN并非不需要“处理”,而是它将最复杂的“特征提取”这种预处理工作,从依靠人类专家的“手工设计”变成了依靠数据和算力的“自动学习”。我们依然会做一些如图像尺寸归一化、数据标准化等基础预处理,但彻底告别了那个需要绞尽脑汁设计SIFT、HOG特征描述子的时代。这正是CNN能够广泛应用的根本原因——它极大地降低了开发高效图像识别系统的技术门槛,并将性能提升到了前所未有的高度。
-
从最根本的拓扑结构定义上来说,神经网络可以分为前馈神经网络(Feedforward Neural Network) 和反馈/循环神经网络(Recurrent Neural Network, RNN) 两大类。比如,介绍CNN时强调其“前馈”特性,并非废话,而是一个重要的区分性定义。前馈神经网络(如CNN、标准DNN):信号从输入层到输出层单向流动,没有环路。数据像流水线一样一层传向下一层,处理完毕后即得到结果。这类网络主要用于处理空间信息(如图像、结构化的数据),关注“是什么”(What)。反馈/循环神经网络(如RNN、LSTM):网络内部存在环路,使得信息可以持久化,即上一时刻的隐藏状态可以作为输入影响到下一时刻的输出。这类网络主要用于处理序列信息(如语言、语音、时间序列),关注“接下来是什么”(What’s next)。
-
回归和分类是机器学习让计算机从数据中学习“预测”的两种最基本、最不同的范式。 它们的核心区别在于“我们想要模型输出什么”。回归问题:预测一个“量”想象一下,你是一位经验丰富的房地产估价师。给你一套房子的信息(面积、地段、房间数、房龄等),你的任务是估计出这套房子合理的市场价格。问题的本质:你预测的目标——房价——是一个连续的数值。它可以是180万,也可以是180.5万,甚至是180.52万。这个数字在理论上可以有无限多的可能取值(在一定范围内)。AI模型的任务:机器学习模型在这里的任务就是学习房屋特征(如面积)与这个连续目标值(房价)之间的映射关系或数学函数。它试图画出一条最符合所有历史数据点的“趋势线”。生活中的其他例子:预测天气:明天的气温会是多少度?预测趋势:未来三个月某只股票的股价走势如何?评估效果:根据广告投入预算,预测产品销量会增长多少?为什么用均方误差?因为均方误差完美地衡量了“预测值”和“真实值”这两个数字之间的差距。它的计算方式是 (预测值 - 真实值)^2。如果模型预测房价是181万,而真实成交价是180万,那么这个误差就是 (1)^2 = 1。这个误差值本身也是一个连续的量,非常适合用来指导模型通过梯度下降等算法,一点点地修正自身的参数,让预测的数值越来越接近真实值。它的目标就是“对准那个准确的数字”。分类问题:预测一个“标签”现在,换一个场景。你是一位医生,正在查看一位患者的医学影像(比如X光片)。你的任务是判断这张影像是否显示有肿瘤,即做出“是”或“否”的诊断。问题的本质:你预测的目标不是一个数值,而是一个离散的类别或标签。在这个例子中,标签是有限的、互斥的选项:{“有肿瘤”, “无肿瘤”}。这叫做二分类。当然,类别也可以更多,比如识别手写数字(0-9共10个类别)、判断一幅图像是猫、狗还是汽车等。AI模型的任务:模型的任务不再是拟合一个函数输出具体数值,而是计算输入数据属于各个可能类别的“概率”。比如,模型可能会输出:有肿瘤的概率是90%,无肿瘤的概率是10%。最终,我们选择概率最高的那个类别作为最终的预测结果(“有肿瘤”)。生活中的其他例子:垃圾邮件过滤:判断一封邮件是“垃圾邮件”还是“正常邮件”。图像识别:识别一张照片中的物体是“猫”还是“狗”。情感分析:判断一条商品评论是“正面”、“负面”还是“中性”。为什么用交叉熵误差?因为交叉熵衡量的是两个概率分布之间的差异。在分类任务中,模型的输出是一个概率分布(如[0.9, 0.1]),而真实标签我们可以用一个“one-hot”编码表示(如[1, 0],代表100%是“有肿瘤”)。交叉熵误差会重点关注“模型赋予正确类别的概率”有多大。如果模型给正确类别的概率很低(比如只有0.1),交叉熵会给出一个非常巨大的惩罚(误差值很大),强烈地告诉模型:“你错得太离谱了,赶紧调整参数!”。如果模型给出的概率很高(0.9),交叉熵会给出一个很小的惩罚,说:“嗯,差不多对了,再微调一下就好”。相比之下,均方误差在这里就显得“力不从心”且不直接。它会对所有输出值都进行平方差计算,反应不够灵敏,可能导致模型优化缓慢甚至陷入局部最优。交叉熵的目标是“拉高正确标签的概率,压低错误标签的概率”,这与分类任务的目标完全一致。最后一言以蔽之:回归是 “是多少?” 的问题,输出是连续数值,用均方误差衡量“数值差”。分类是 “是啥?” 的问题,输出是离散标签,用交叉熵误差衡量“概率分布差”。为不同任务选择合适的误差函数(或称损失函数),确保模型能够最高效、最准确地进行学习。
-
人工智能神经网络的核心思想源于对生物大脑中神经元的仿生学启发。生物神经元通过树突接收信号,在细胞体内进行整合,当电位超过某个阈值时便通过轴突产生输出。为了在数学和计算机上实现这一抽象概念,科学家于1958年提出了感知机模型,它成为了第一个人工神经元的数学模型。感知机模拟了这一过程:它对多个输入信号进行加权求和,并将结果馈入一个简单的阈值函数(如输出0/1或-1/1的阶跃/符号函数),从而产生一个清晰的二元决策。为了衡量这个决策的好坏并引导其学习,损失函数被引入,它量化了模型预测与真实答案之间的差距,为优化提供了明确的方向。然而,单层感知机有一个致命的缺陷:它只能学习一条直线(或一个超平面)来划分世界,无法解决诸如“异或”问题等简单的线性不可分问题。这一局限性几乎一度让整个神经网络研究领域陷入寒冬。为了突破这一根本性瓶颈,研究者们在感知机的基础上进行了深度的架构革新,从而诞生了现代神经网络的概念。这项革新主要体现在三个维度。首先,也是最重要的,是引入了隐藏层。在输入与输出之间加入一层或多层“隐藏”的神经元,使得网络能够学习输入特征的层次化组合。第一层隐藏层可能学习一些基础特征,而后继层则将这些基础特征组合成更复杂、更抽象的高级概念,极大地增强了模型的表达能力和理解水平。其次,输出层发生了演变,不再局限于单个神经元。一个神经网络可以拥有多个输出神经元,使其能够同时解决更多样化的任务。例如,在识别手写数字时,输出层可以有10个神经元,分别对应数字0到9的概率,从而直接解决多分类问题。这种扩展使神经网络从单一的二元判决器演变为一个通用的多功能预测机器。最后,为了能够训练这种多层结构,激活函数发生了根本性的进化。简单、不可微的阶跃函数被一系列复杂、平滑的非线性函数(如Sigmoid、Tanh,以及后来更有效的ReLU)所取代。这一变革是至关重要的技术前提,它使得基于链式法则的反向传播算法得以应用,误差梯度可以顺畅地穿过隐藏层反向流动,从而高效地更新所有层中的权重参数。
-
NO.2 篇 知识库/RAG能力详解 <ModelArts Versatile-AI原生应用引擎 体验入口>华为开发者空间 -- 开发平台 --Versatile Agent ( 请在PC端打开 ) 什么是AI AgentAI Agent人工智能体,是一种能够自主感知环境、制定目标、规划行动、执行任务并持续学习的智能程序或系统。比如,告诉AI Agent帮忙下单一份外卖,它就可以直接调用 APP选择外卖,再调用支付程序下单支付,无需人类去指定每一步的操作。从本质上来讲,大模型作为大脑发号施令,推理能力决定它的决策能力上限,工具模块决定他行动能力的上限、可完成任务的横向宽度、操作场域。而记忆(Memory)模块作为信息存储库,将多次交互的短期和长期信息保存与共享,决定了它规划和决策的准确度与速度,从而实现更个性化的响应。 · AI Agent之ModelArts VersatileModelArts Versatile-AI原生应用引擎是一站式企业级全生命周期的智能体平台,为企业专属大模型应用开发的工具链,提供灵活的画布式AI Agent开发能力,让Agent能够准确解决复杂的业务场景问题。提供从Agent开发,使用,运营和运维的全生命周期管理能力。 快速了解 AI Agent—知识库/RAG · 知识库——信息的“蓄水池”知识库是组织、存储及管理知识的系统,涵盖文档、图片、视频等信息的分类整理,可以帮助用户高效管理大量的信息。在Agent中添加知识库,使其与用户提供的专业知识库进行交互,可以显著提升Agent的准确度和专业度。知识库的数据来源分为直接接入源数据和选择知识数据集两种。 专业领域的知识库已不再是简单的数据堆砌,需要智能化、高效率的知识管理和利用。知识库具体指的是存储过往交互、知识片段和任务状态(可能利用向量数据库)。知识库本身是静态的存储,要让其中的知识,尤其是海量非结构化知识,能够被大模型或RAG系统高效地理解和利用,就需要更智能的检索技术——这正是向量数据库大显身手之处。 --结构化知识库:通常指关系型数据库(如 MySQL、PostgreSQL),数据以表格形式组织,具有严格的模式和关系定义,擅长存储交易,记录、用户信息等高度规整的数据。--非结构化知识库:存储文档、PDF、PPT、网页、图片、音视频等原始形态的数据。文件系统、文档管理系统、对象存储等都属于此类。它们容量巨大,但信息组织相对松散,直接利用效率较低。 · 知识数据集知识数据集是组成知识库的重要元素,其核心是将零散知识(如文档、图片、视频等)加工成结构化知识单元:通过本地上传或OBS接入数据,经预处理后切片拆分为更小的知识单元,并配置索引以便Agent快速定位所需知识。完成知识数据集创建后,将其关联至知识库,形成可调用的知识体系。 · RAG——为模型注入精准信息RAG(Retrieval-Augmented Generation)即检索增强生成,是一种结合信息检索与文本生成的人工智能技术框架,通过动态引入外部知识库来增强大语言模型的输出质量,旨在解决大语言模型在回答问题时,因知识更新不及时、缺乏特定领域知识或事实性错误等问题,通过在生成回答之前检索相关外部知识源来增强回答的准确性和可靠性。RAG可以在 AI 接收到问题时,动态地从外部知识库中查找相关信息,然后把这些信息加到提示词里一起交给 AI 处理,从而提高回答质量。RAG本质上是通过工程化手段,解决LLM知识更新困难的问题。其核心手段是利用外挂于LLM的知识数据库(通常使用向量数据库)存储未在训练数据集中出现的新数据、领域数据等。通常而言,RAG将知识问答分成三个阶段:索引、知识检索、基于内容的问答。其应用优势在于解决大模型幻觉问题,提升专业领域回答准确性;支持私有化知识库与通用模型的融合应用;相比微调更具成本效益和灵活性。 RAG类型:VectorRAG(向量RAG)、GraphRAG(知识图谱RAG)--VectorRAG(向量检索增强生成)向量RAG,是一种结合了向量化和大语言模型的RAG技术。VectorRAG将非结构化的数据转化为结构化的向量空间,利用向量库实现高效的信息检索。技术原理:通过向量数据库将文本数据转换为高维向量,基于语义相似度检索相关片段核心优势:处理非结构化文本效率高(如文档问答、FAQ系统);实现简单且计算资源需求较低 -- GraphRAG(基于图谱的检索增强生成)知识图谱RAG,是一种结合了知识图谱和大语言模型的RAG技术。GraphRAG能够处理各种类型的文档,从中提取实体(文档中具体的对象或概念)、关系以及文本内容构建知识图谱(一种结构化的知识表示方式),从而增强大语言模型对复杂信息的理解和推理能力。技术原理:构建知识图谱存储实体关系,通过图数据库(如Neo4j)执行多跳推理检索核心优势:擅长处理结构化/半结构化数据(如知识图谱问答);支持复杂逻辑推理和全局语义理解 · RAG(检索增强生成)与知识库的关系——通过技术互补实现协同增效功能定位的差异与互补:知识库作为静态信息存储系统,主要承担结构化数据的精确检索功能(如企业文档查询),而RAG则通过动态检索外部知识库内容,结合大语言模型生成自然语言回答。这种组合既保留了知识库的检索效率,又解决了大模型的幻觉问题。 技术实现的依赖关系:RAG通常以知识库为数据基础,通过知识库文档分块及向量化存储、用户查询时进行语义相似度检索、将检索结果作为上下文输入大模型生成最终答案等流程实现知识增强,这种架构使得知识库成为RAG的“数据基础设施”。 在智能体架构中,知识库是静态的知识载体,而RAG是动态的知识调用机制。两者的结合实现了“存储-检索-生成”的闭环,既扩展了大模型的能力边界,又保障了输出的准确性与可追溯性。未来随着多模态知识库的发展,RAG的应用场景将进一步扩展。 ModelArts Versatile--AI原生应用引擎 知识库/RAG的竞争力优势Versatile Agent沉淀行业Know-How(专长),通过知识工程提升大模型的表现,进一步支撑行业应用创新。行业/企业经验提取,持续积累企业场景经验模板,动态经验知识库迭代。知识库RAG 技术优势01超高效率:企业知识库持续学习,天级迭代;场景学习,周级迭代;领域学习,季度级迭代。 02 RAG: 领域知识库&检索引擎,让大模型输出结果更可靠。RAG检索增强实践成效:准确率从50%提升到83%。输出结果准确率提升明显;行业知识动态持续更新;检索生成结果速度更快。 03 接入多类实时知识库,更实时、更准确的生成式答案ModelArts Versatile-AI原生应用引擎接入多类型知识库,充分获取企业最新知识,增强实时性和准确性;灵活可配置的融合检索策略。 04 行业知识赋能大模型ModelArts Versatile-AI原生应用引擎通过RAG赋能增强大模型行业知识,提升行业理解能力和业务准确性。融入企业业务场景,从企业业务场景经验提取,“经验模板” 迭代优化,形成企业经验模板库(专属知识库)。 相关特性知识数据集管理:接入源数据、数据加工、知识数据集基础操作知识库管理:接入源数据或选择知识数据集、知识库的基础操作、索引字段配置、检索方式、能力开放。三方知识库接入:三方知识库API接入- 适配第三方图数据库。 --选择知识数据集-创建知识库:在“选择知识数据集”面板,勾选目标数据集,并选择数据集版本及索引配置。当知识库RAG类型为“VectorRAG”时,按照混合检索、语义检索、全文检索多模式开展。当知识库RAG类型为“GraphRAG”时,默认为“语义检索”方式。--接入数据源-创建知识库:选择数据源的接入方式,支持以下两种方式,01 本地上传:数据文件在本地,从本地选择文件进行上传;02 OBS接入:数据文件存放在华为云OBS桶,从OBS桶接入数据。 知识飞轮 技术优势超高效率,知识飞轮帮助企业知识库周级创建、天级迭代。--数据积累与回流:采集增量业务数据和用户反馈数据,提炼知识,提供给大模型,支撑大模型能力持续增强。--多轮迭代机制:支持天级持续学习(自动)、周级场景学习、季度级领域学习三轮循环迭代机制,持续提升模型能力、应用效果。 针对反馈数据的提炼和学习,ModelArts Versatile-AI原生应用引擎通过多工具预集成、主流模型集成、业务应用信息抽取插件、智能应用反馈插件、自动化调度等能力构建知识飞轮,将业务人员在日常作业过程中积累的增量数据和用户反馈提炼为企业知识,不断供给大模型开展多轮循环学习实现天级迭代,持续提升智能应用体验与效果。 Versatile--AI原生应用引擎 知识库/RAG 主要解决什么问题(知识中心) 结构化知识存储领域知识库(如医疗术语库、法律条款)提供专业认知基础企业知识库(产品手册、业务流程)支撑特定场景服务用户画像知识库(偏好记录、行为模式)实现个性化交互动态知识演进短期记忆沉淀为长期知识(如对话摘要转为用户特征向量)通过知识图谱自动更新实体关系(如新增"用户-宠物-用品"关联) 功能边界突破突破LLM原生知识限制(通过企业私域知识库回答内部流程问题)支持多模态知识融合(图文知识库+语音交互记忆)持续学习基础为模型微调提供高质量训练数据(清洗后的用户交互记录)构建可解释的知识溯源链条(决策依据可关联到具体知识条目) ModelArts Versatile-AI原生应用引擎知识中心,内置知识库+RAG技术突破大模型的知识局限和幻觉问题。它的核心思想并非让模型死记硬背所有知识,而是赋予它"按需查找"的能力,极大地提升了大模型在特定领域或依赖精确事实场景下的表现力和可靠性,巧妙地将大模型的强大语言生成能力与结构化/非结构化外部知识源的丰富性结合起来,实现了"1+1>2"的效果。同时提升了 AI 的交互能力,还为其在各种复杂场景中的应用提供了可能性,包括上下文连续性、复杂任务处理、长期项目管理、认知能力增强等能力。 结语ModelArts Versatile-AI原生应用引擎,以知识库融合RAG技术,担当智能体大脑的“第二存储”,搭建与业务场景融合的知识库,融会贯通行业特有经验沉淀,实现快速检索访问获取信息,增强Agent自主执行能力与结果可靠性。通过知识工程提升大模型的表现,进一步支撑行业应用创新。同时,Versatile助力广大开发者将Agent开发简化并内化成基础技能,快速搭建各领域智能应用,辐射千行万业,变革智能生产力。 点击可前往>>华为云ModelArts Versatile-AI原生应用 引擎官网 系列文章推荐:AI Agent智能体系列解读 | ModelArts Versatile插件类——MCP/工具能力详解
-
在对maptr模型进行导出并部署到mdc610平台时,在onnx到om时出现非常多警告,如下:转换命令:atc --model=maptr_tiny_r50_24e_bevformer.onnx --framework=5 --output=maptr_tiny_r50_24e_bevformer --input_shape="0:1,1,6,3,480,800;2:1,6,4,4" --soc_version=Ascend610我们可以拿到om权重,但是这个om权重在netron中无法可视化,如下:对于onnx文件,可以通过check并正常推理(能得到精度相当高的推理结果)log文件见附件请问大佬们,这里的警告需要在意(修改)吗?(我应该怎么检查错误和进行修改?) (或者,这里的警告会对后续在mdc610上的部署产生问题吗?如果不会,或许我们可以不在意?)
-
8月份人工智能【FAQ合集】来了!为什么卷积神经网络在图像分类中优于传统机器学习方法?CNN中的卷积层是如何提取不同层次特征的?为什么要在CNN中引入池化层,它的作用是什么?卷积神经网络是如何处理平移不变性的?CNN在目标检测任务中面临的主要挑战是什么?如何通过数据增强提升CNN的泛化能力?卷积核的大小对模型性能有什么影响?为什么深层CNN容易出现梯度消失问题?批归一化(Batch Normalization)在CNN中起什么作用?为什么CNN比全连接网络更适合处理图像?在医学图像中,CNN如何实现病灶自动检测?CNN在小样本学习中存在哪些局限?如何通过迁移学习提升CNN在特定任务中的表现?为什么轻量化CNN对移动端应用非常重要?卷积神经网络能否有效处理序列数据?为什么深度CNN容易过拟合?在CNN中引入残差结构的优势是什么?如何解释CNN中每一层学到的特征?为什么多尺度特征对目标检测中的CNN很重要?卷积神经网络未来可能会在哪些方向突破?为什么卷积神经网络能够减少模型参数量?在CNN中使用Stride(步幅)会带来什么影响?为什么深层CNN需要使用激活函数?在目标检测中,CNN如何结合区域提议方法?在目标检测中,CNN如何结合区域提议方法?为什么卷积神经网络在处理一维信号(如语音、EEG)时同样有效?为什么卷积神经网络在处理一维信号(如语音、EEG)时同样有效?国产CPU与英伟达差距在哪里?为什么这么多年了赶不上如何在边缘设备上搭建深度学习开发环境?边缘AI与常规AI有什么区别?如何提升图像分类模型的泛化能力?如何提升YOLO模型对小目标的检测效果?常见的目标检测跟踪算法有哪些?如何提升目标检测模型在边缘设备上的性能?模型Int8量化所需要的的图片数量一般是多少,如何降低模型量化所带来的精度损失?训练目标检测模型的数据集一般多少张可以达到最优效果?YOLO已经出到13了为什么大家都还在用v8?大模型主流的开发语言有哪些?想要学习大模型开发又没有足够的算力该怎么办?为什么在人员密集的场景下,为什么DeepSort跟踪器的性能变得很差?有没有适配边缘设备上的目标跟踪算法,同时保证精度和速度?随着低空经济的爆发,无人机AI算法应该部署在机载、边缘还是云端,各有什么优势?如果要入门AI,应该先学习Python,还是C++?Jetson系列的开发板可用于YOLO模型训练吗?模型的输入尺寸变大,占用的显存会变高吗?如果要进行实时的目标检测,至少需要多少Tops的算力?对于烟雾等不规则形状物体的识别,目标检测和图像分割哪个效果更好?在深度学习领域,有哪些高性能的模型推理框架?对图像切分检测结果进行后处理时,GREEDYNMM、NMM、NMS、LSNMS有什么区别?
-
猫脸关键点检测(ModelBox)一、模型训练与转换ResNet50V2是改进版的深度卷积神经网络,基于 ResNet 架构发展而来。它采用前置激活(将 BN 和 ReLU 移至卷积前)与身份映射,优化了信息传播和模型训练性能。作为 50 层深度的网络,ResNet50V2 广泛应用于图像分类、目标检测等任务,支持迁移学习,适合快速适配新数据集,具有良好的泛化能力和较高准确率。模型的训练与转换教程已经开放在AI Gallery中,其中包含训练数据、训练代码、模型转换脚本。在ModelArts的Notebook环境中训练后,再转换成对应平台的模型格式:onnx格式可以用在Windows设备上,RK系列设备上需要转换为rknn格式。二、应用开发1. 创建工程在ModelBox sdk目录下使用create.bat创建ResNet50V2工程:PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t server -n ResNet50V2 ... success: create ResNet50V2 in D:\modelbox-win10-x64-1.5.3\workspacecreate.bat工具的参数中,-t参数,表示所创建实例的类型,包括server(ModelBox工程)、python(Python功能单元)、c++(C++功能单元)、infer(推理功能单元)等;-n参数,表示所创建实例的名称;-s参数,表示将使用后面参数值代表的模板创建工程,而不是创建空的工程。2. 创建推理功能单元在ModelBox sdk目录下使用create.bat创建resnet50v2_infer推理功能单元:PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t infer -n resnet50_infer -p ResNet50V2 ... success: create infer resnet50_infer in D:\modelbox-win10-x64-1.5.3\workspace\ResNet50V2/model/resnet50_infercreate.bat工具使用时,-t infer即表示创建的是推理功能单元;-n xxx_infer表示创建的功能单元名称为xxx_infer;-p表示所创建的功能单元属于ResNet50V2应用。下载转换好的ResNet50V2.onnx模型到ResNet50V2\model目录下,修改推理功能单元resnet50v2_infer.toml模型的配置文件:# Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. [base] name = "resnet50_infer" device = "cpu" version = "1.0.0" description = "your description" entry = "./ResNet50V2.onnx" # model file path, use relative path type = "inference" virtual_type = "onnx" # inference engine type: win10 now only support onnx group_type = "Inference" # flowunit group attribution, do not change # Input ports description [input] [input.input1] # input port number, Format is input.input[N] name = "Input" # input port name type = "float" # input port data type ,e.g. float or uint8 device = "cpu" # input buffer type: cpu, win10 now copy input from cpu # Output ports description [output] [output.output1] # output port number, Format is output.output[N] name = "Output" # output port name type = "float" # output port data type ,e.g. float or uint83. 创建后处理功能单元在ModelBox sdk目录下使用create.bat创建resnet50v2_post后处理功能单元:PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t python -n resnet50v2_post -p ResNet50V2 ... success: create python resnet50v2_post in D:\modelbox-win10-x64-1.5.3\workspace\ResNet50V2/etc/flowunit/resnet50v2_postcreate.bat工具使用时,-t python即表示创建的是通用功能单元;-n xxx_post表示创建的功能单元名称为xxx_post;-p表示所创建的功能单元属于ResNet50V2应用。a. 修改配置文件我们的模型有一个输入和输出,总共包含猫脸的9个关键点:# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. # Basic config [base] name = "resnet50v2_post" # The FlowUnit name device = "cpu" # The flowunit runs on cpu version = "1.0.0" # The version of the flowunit type = "python" # Fixed value, do not change description = "description" # The description of the flowunit entry = "resnet50v2_post@resnet50v2_postFlowUnit" # Python flowunit entry function group_type = "Generic" # flowunit group attribution, change as Input/Output/Image/Generic ... # Flowunit Type stream = false # Whether the flowunit is a stream flowunit condition = false # Whether the flowunit is a condition flowunit collapse = false # Whether the flowunit is a collapse flowunit collapse_all = false # Whether the flowunit will collapse all the data expand = false # Whether the flowunit is a expand flowunit # The default Flowunit config [config] keypoints = 9 # Input ports description [input] [input.input1] # Input port number, the format is input.input[N] name = "in_feat" # Input port name type = "float" # Input port type # Output ports description [output] [output.output1] # Output port number, the format is output.output[N] name = "out_data" # Output port name type = "string" # Output port typeb. 修改逻辑代码# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. #!/usr/bin/env python # -*- coding: utf-8 -*- import _flowunit as modelbox import numpy as np import json class resnet50v2_postFlowUnit(modelbox.FlowUnit): # Derived from modelbox.FlowUnit def __init__(self): super().__init__() def open(self, config): # Open the flowunit to obtain configuration information self.params = {} self.params['keypoints'] = config.get_int('keypoints') return modelbox.Status.StatusCode.STATUS_SUCCESS def process(self, data_context): # Process the data in_data = data_context.input("in_feat") out_data = data_context.output("out_data") # resnet50v2_post process code. # Remove the following code and add your own code here. for buffer_feat in in_data: feat_data = np.array(buffer_feat.as_object(), copy=False) keypoints = feat_data.reshape(-1, 2).tolist() result = {"keypoints": keypoints} result_str = json.dumps(result) out_buffer = modelbox.Buffer(self.get_bind_device(), result_str) out_data.push_back(out_buffer) return modelbox.Status.StatusCode.STATUS_SUCCESS def close(self): # Close the flowunit return modelbox.Status() def data_pre(self, data_context): # Before streaming data starts return modelbox.Status() def data_post(self, data_context): # After streaming data ends return modelbox.Status() def data_group_pre(self, data_context): # Before all streaming data starts return modelbox.Status() def data_group_post(self, data_context): # After all streaming data ends return modelbox.Status() 4. 修改应用的流程图ResNet50V2工程graph目录下存放流程图,默认的流程图ResNet50V2.toml与工程同名:# Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. [driver] dir = ["${HILENS_APP_ROOT}/etc/flowunit", "${HILENS_APP_ROOT}/etc/flowunit/cpp", "${HILENS_APP_ROOT}/model", "${HILENS_MB_SDK_PATH}/flowunit"] skip-default = true [profile] profile=false trace=false dir="${HILENS_DATA_DIR}/mb_profile" [graph] format = "graphviz" graphconf = """digraph ResNet50V2 { node [shape=Mrecord] queue_size = 4 batch_size = 1 input1[type=input,flowunit=input,device=cpu,deviceid=0] httpserver_sync_receive[type=flowunit, flowunit=httpserver_sync_receive_v2, device=cpu, deviceid=0, time_out_ms=5000, endpoint="http://0.0.0.0:1234/v1/ResNet50V2", max_requests=100] image_decoder[type=flowunit, flowunit=image_decoder, device=cpu, key="image_base64", queue_size=4] image_resize[type=flowunit, flowunit=resize, device=cpu, deviceid=0, image_width=224, image_height=224] normalize[type=flowunit, flowunit=normalize, device=cpu, deviceid=0, standard_deviation_inverse="0.003921568627450,0.003921568627450,0.003921568627450"] resnet50v2_infer[type=flowunit, flowunit=resnet50v2_infer, device=cpu, deviceid=0, batch_size=1] resnet50v2_post[type=flowunit, flowunit=resnet50v2_post, device=cpu, deviceid=0] httpserver_sync_reply[type=flowunit, flowunit=httpserver_sync_reply_v2, device=cpu, deviceid=0] input1:input -> httpserver_sync_receive:in_url httpserver_sync_receive:out_request_info -> image_decoder:in_encoded_image image_decoder:out_image -> image_resize:in_image image_resize:out_image -> normalize:in_data normalize:out_data -> resnet50v2_infer:Input resnet50v2_infer:Output -> resnet50v2_post:in_feat resnet50v2_post:out_data -> httpserver_sync_reply:in_reply_info }""" [flow] desc = "ResNet50V2 run in modelbox-win10-x64" 在命令行中运行.\create.bat -t editor即可打开ModelBox图编排界面,可以实时修改并查看项目的流程图:PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t editor5. 运行应用在ResNet50V2工程目录下执行.\bin\main.bat运行应用:PS D:\modelbox-win10-x64-1.5.3> cd D:\modelbox-win10-x64-1.5.3\workspace\ResNet50V2 PS D:\modelbox-win10-x64-1.5.3\workspace\ResNet50V2> .\bin\main.bat在ResNet50V2工程data目录下新建test_http.py测试脚本:#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. import os import cv2 import json import base64 import http.client class HttpConfig: '''http调用的参数配置''' def __init__(self, host_ip, port, url, img_base64_str): self.hostIP = host_ip self.Port = port self.httpMethod = "POST" self.requstURL = url self.headerdata = { "Content-Type": "application/json" } self.test_data = { "image_base64": img_base64_str } self.body = json.dumps(self.test_data) def read_image(img_path): '''读取图片数据并转为base64编码的字符串''' img_data = cv2.imread(img_path) img_data = cv2.cvtColor(img_data, cv2.COLOR_BGR2RGB) img_str = cv2.imencode('.jpg', img_data)[1].tobytes() img_bin = base64.b64encode(img_str) img_base64_str = str(img_bin, encoding='utf8') return img_data, img_base64_str def test_image(img_path, ip, port, url): '''单张图片测试''' img_data, img_base64_str = read_image(img_path) http_config = HttpConfig(ip, port, url, img_base64_str) conn = http.client.HTTPConnection(host=http_config.hostIP, port=http_config.Port) conn.request(method=http_config.httpMethod, url=http_config.requstURL, body=http_config.body, headers=http_config.headerdata) response = conn.getresponse().read().decode() print('response: ', response) result = json.loads(response) w, h = img_data.shape[1], img_data.shape[0] for x, y in result["keypoints"]: if x > 0 and y > 0: cv2.circle(img_data, (int(x * w), int(y * h)), 5, (0, 255, 0), -1) cv2.imwrite('./result-' + os.path.basename(img_path), img_data[..., ::-1]) if __name__ == "__main__": port = 1234 ip = "127.0.0.1" url = "/v1/ResNet50V2" img_folder = './test_imgs' file_list = os.listdir(img_folder) for img_file in file_list: print("\n================ {} ================".format(img_file)) img_path = os.path.join(img_folder, img_file) test_image(img_path, ip, port, url) 在ResNet50V2工程data目录下新建test_imgs文件夹存放测试图片:在另一个终端中进入ResNet50V2工程目录data文件夹下运行test_http.py脚本发起HTTP请求测试:PS D:\modelbox-win10-x64-1.5.3> cd D:\modelbox-win10-x64-1.5.3\workspace\ResNet50V2\data PS D:\modelbox-win10-x64-1.5.3\workspace\ResNet50V2\data> D:\modelbox-win10-x64-1.5.3\python-embed\python.exe .\test_http.py ================ 2256.jpg ================ response: {"keypoints": [[0.19147011637687683, 0.26770520210266113], [0.29639703035354614, 0.26533427834510803], [0.24554343521595, 0.35762542486190796], [0.11009970307350159, 0.2090619057416916], [0.08408773690462112, 0.09547536075115204], [0.17451311647891998, 0.169035404920578], [0.2880205512046814, 0.168979212641716], [0.3739408254623413, 0.0717596635222435], [0.34669068455696106, 0.20229394733905792]]} ================ 6899.jpg ================ response: {"keypoints": [[0.3829421401023865, 0.41393953561782837], [0.47102952003479004, 0.42683106660842896], [0.4321300983428955, 0.5082458853721619], [0.3185971677303314, 0.36286458373069763], [0.33502572774887085, 0.2243150770664215], [0.3852037489414215, 0.29658034443855286], [0.4819968640804291, 0.30954840779304504], [0.5504774451255798, 0.2711380124092102], [0.5290539264678955, 0.3962092399597168]]} 在ResNet50V2工程data目录下即可查看测试图片的推理结果:三、小结本节介绍了如何使用ModelArts和ModelBox训练开发一个ResNet50V2猫脸关键点检测的AI应用,我们只需要准备模型文件以及简单的配置即可创建一个HTTP服务。同时我们可以了解到ResNet50V2网络的基本结构、数据处理和模型训练方法,以及对应推理应用的逻辑。----转自博客:https://bbs.huaweicloud.com/blogs/451999
-
果蔬病虫害分割(ModelBox)一、模型训练与转换FCN(全卷积网络,Fully Convolutional Networks)是用于语义分割任务的一种深度学习模型架构,引入了跳跃结构(Skip Architecture),通过融合浅层和深层的特征图,保留更多的细节信息,提升分割精度。此外,FCN还利用多尺度上下文聚合,捕捉不同层级的特征,增强了对不同大小目标的识别能力。FCN的成功推动了语义分割领域的发展,成为后续许多先进模型的基础。模型的训练与转换教程已经开放在AI Gallery中,其中包含训练数据、训练代码、模型转换脚本。在ModelArts的Notebook环境中训练后,再转换成对应平台的模型格式:onnx格式可以用在Windows设备上,RK系列设备上需要转换为rknn格式。二、应用开发1. 创建工程在ModelBox sdk目录下使用create.bat创建FCN工程:PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t server -n FCN ... success: create FCN in D:\modelbox-win10-x64-1.5.3\workspacecreate.bat工具的参数中,-t参数,表示所创建实例的类型,包括server(ModelBox工程)、python(Python功能单元)、c++(C++功能单元)、infer(推理功能单元)等;-n参数,表示所创建实例的名称;-s参数,表示将使用后面参数值代表的模板创建工程,而不是创建空的工程。2. 创建推理功能单元在ModelBox sdk目录下使用create.bat创建fcn_infer推理功能单元:PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t infer -n fcn_infer -p FCN ... success: create infer fcn_infer in D:\modelbox-win10-x64-1.5.3\workspace\FCN/model/fcn_infercreate.bat工具使用时,-t infer即表示创建的是推理功能单元;-n xxx_infer表示创建的功能单元名称为xxx_infer;-p表示所创建的功能单元属于FCN应用。下载转换好的FCN.onnx模型到FCN\model目录下,修改推理功能单元fcn_infer.toml模型的配置文件:# Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. [base] name = "fcn_infer" device = "cpu" version = "1.0.0" description = "your description" entry = "./FCN.onnx" # model file path, use relative path type = "inference" virtual_type = "onnx" # inference engine type: win10 now only support onnx group_type = "Inference" # flowunit group attribution, do not change # Input ports description [input] [input.input1] # input port number, Format is input.input[N] name = "Input" # input port name type = "float" # input port data type ,e.g. float or uint8 device = "cpu" # input buffer type: cpu, win10 now copy input from cpu # Output ports description [output] [output.output1] # output port number, Format is output.output[N] name = "Output" # output port name type = "float" # output port data type ,e.g. float or uint83. 创建后处理功能单元在ModelBox sdk目录下使用create.bat创建fcn_post后处理功能单元:PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t python -n fcn_post -p FCN ... success: create python fcn_post in D:\modelbox-win10-x64-1.5.3\workspace\FCN/etc/flowunit/fcn_postcreate.bat工具使用时,-t python即表示创建的是通用功能单元;-n xxx_post表示创建的功能单元名称为xxx_post;-p表示所创建的功能单元属于FCN应用。a. 修改配置文件我们的模型有一个输入和输出,对116种果蔬病虫害进行分割,加上背景总共是117类:# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. # Basic config [base] name = "fcn_post" # The FlowUnit name device = "cpu" # The flowunit runs on cpu version = "1.0.0" # The version of the flowunit type = "python" # Fixed value, do not change description = "description" # The description of the flowunit entry = "fcn_post@fcn_postFlowUnit" # Python flowunit entry function group_type = "Generic" # flowunit group attribution, change as Input/Output/Image/Generic ... # Flowunit Type stream = false # Whether the flowunit is a stream flowunit condition = false # Whether the flowunit is a condition flowunit collapse = false # Whether the flowunit is a collapse flowunit collapse_all = false # Whether the flowunit will collapse all the data expand = false # Whether the flowunit is a expand flowunit # The default Flowunit config [config] num_classes = 117 net_w = 224 net_h = 224 # Input ports description [input] [input.input1] # Input port number, the format is input.input[N] name = "in_image" # Input port name type = "uint8" # Input port type [input.input2] # Input port number, the format is input.input[N] name = "in_feat" # Input port name type = "float" # Input port type # Output ports description [output] [output.output1] # Output port number, the format is output.output[N] name = "out_image" # Output port name type = "uint8" # Output port typeb. 修改逻辑代码# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. #!/usr/bin/env python # -*- coding: utf-8 -*- import _flowunit as modelbox import numpy as np import cv2 class fcn_postFlowUnit(modelbox.FlowUnit): # Derived from modelbox.FlowUnit def __init__(self): super().__init__() def open(self, config): # Open the flowunit to obtain configuration information self.params = {} self.params['num_classes'] = config.get_int('num_classes') self.params['net_w'] = config.get_int('net_w') self.params['net_h'] = config.get_int('net_h') return modelbox.Status.StatusCode.STATUS_SUCCESS def process(self, data_context): # Process the data in_image = data_context.input("in_image") in_feat = data_context.input("in_feat") out_image = data_context.output("out_image") # fcn_post process code. # Remove the following code and add your own code here. for buffer_image, buffer_feat in zip(in_image, in_feat): channel = buffer_image.get('channel') width = buffer_image.get('width') height = buffer_image.get('height') image = np.array(buffer_image.as_object(), dtype=np.uint8, copy=False) image = image.reshape(height, width, channel) feat = np.array(buffer_feat.as_object(), dtype=np.float32, copy=False) feat = feat.reshape(self.params['net_h'], self.params['net_w'], self.params['num_classes']) mask = np.argmax(feat, axis=-1).astype(np.uint8) mask = cv2.resize(mask, (width, height), interpolation=cv2.INTER_NEAREST) overlay = np.zeros_like(image) for i in range(1, self.params['num_classes']): color = np.random.randint(0, 255, (3,)).tolist() overlay[mask==i] = color result_image = cv2.addWeighted(image[..., ::-1], 0.5, overlay, 0.5, 0) add_buffer = modelbox.Buffer(self.get_bind_device(), result_image) add_buffer.copy_meta(buffer_image) out_image.push_back(add_buffer) return modelbox.Status.StatusCode.STATUS_SUCCESS def close(self): # Close the flowunit return modelbox.Status() def data_pre(self, data_context): # Before streaming data starts return modelbox.Status() def data_post(self, data_context): # After streaming data ends return modelbox.Status() def data_group_pre(self, data_context): # Before all streaming data starts return modelbox.Status() def data_group_post(self, data_context): # After all streaming data ends return modelbox.Status() 4. 修改应用的流程图FCN工程graph目录下存放流程图,默认的流程图FCN.toml与工程同名:# Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. [driver] dir = ["${HILENS_APP_ROOT}/etc/flowunit", "${HILENS_APP_ROOT}/etc/flowunit/cpp", "${HILENS_APP_ROOT}/model", "${HILENS_MB_SDK_PATH}/flowunit"] skip-default = true [profile] profile=false trace=false dir="${HILENS_DATA_DIR}/mb_profile" [graph] format = "graphviz" graphconf = """digraph FCN { node [shape=Mrecord] queue_size = 4 batch_size = 1 input1[type=input,flowunit=input,device=cpu,deviceid=0] httpserver_sync_receive[type=flowunit, flowunit=httpserver_sync_receive_v2, device=cpu, deviceid=0, time_out_ms=5000, endpoint="http://0.0.0.0:1234/v1/FCN", max_requests=100] image_decoder[type=flowunit, flowunit=image_decoder, device=cpu, key="image_base64", queue_size=4] image_resize[type=flowunit, flowunit=resize, device=cpu, deviceid=0, image_width=224, image_height=224] normalize[type=flowunit, flowunit=normalize, device=cpu, deviceid=0, standard_deviation_inverse="0.003921568627450,0.003921568627450,0.003921568627450"] fcn_infer[type=flowunit, flowunit=fcn_infer, device=cpu, deviceid=0, batch_size=1] fcn_post[type=flowunit, flowunit=fcn_post, device=cpu, deviceid=0] httpserver_sync_reply[type=flowunit, flowunit=httpserver_sync_reply_v2, device=cpu, deviceid=0] input1:input -> httpserver_sync_receive:in_url httpserver_sync_receive:out_request_info -> image_decoder:in_encoded_image image_decoder:out_image -> image_resize:in_image image_resize:out_image -> normalize:in_data normalize:out_data -> fcn_infer:Input image_decoder:out_image -> fcn_post:in_image fcn_infer:Output -> fcn_post:in_feat fcn_post:out_image -> httpserver_sync_reply:in_reply_info }""" [flow] desc = "FCN run in modelbox-win10-x64" 在命令行中运行.\create.bat -t editor即可打开ModelBox图编排界面,可以实时修改并查看项目的流程图:PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t editor5. 运行应用在FCN工程目录下执行.\bin\main.bat运行应用:PS D:\modelbox-win10-x64-1.5.3> cd D:\modelbox-win10-x64-1.5.3\workspace\FCN PS D:\modelbox-win10-x64-1.5.3\workspace\FCN> .\bin\main.bat在FCN工程data目录下新建test_http.py测试脚本:import cv2 import json import base64 import requests import numpy as np if __name__ == "__main__": port = 1234 ip = "127.0.0.1" url = "/v1/FCN" img_path = "apple_black_rot_google_0056.jpg" img_data = cv2.imread(img_path) img_data = cv2.cvtColor(img_data, cv2.COLOR_BGR2RGB) img_str = cv2.imencode('.jpg', img_data)[1].tobytes() img = base64.b64encode(img_str) img_base64_str = str(img, encoding='utf8') params = {"image_base64": img_base64_str} response = requests.post(f'http://{ip}:{port}{url}', data=json.dumps(params), headers={"Content-Type": "application/json"}) h, w, c = img_data.shape img_array = np.frombuffer(response.content, np.uint8) img_array = img_array.reshape((h, -1, c)) cv2.imwrite("res.jpg", img_array) 在FCN工程data目录下存放测试图片:在另一个终端中进入FCN工程目录data文件夹下:PS D:\modelbox-win10-x64-1.5.3> cd D:\modelbox-win10-x64-1.5.3\workspace\FCN\data首先安装requests依赖包:PS D:\modelbox-win10-x64-1.5.3\workspace\FCN\data> D:\modelbox-win10-x64-1.5.3\python-embed\python.exe -m pip install requests然后运行test_http.py脚本发起HTTP请求测试:PS D:\modelbox-win10-x64-1.5.3\workspace\FCN\data> D:\modelbox-win10-x64-1.5.3\python-embed\python.exe .\test_http.py测试图片的分割结果res.jpg将保存在FCN工程data目录下:三、小结本节介绍了如何使用ModelArts和ModelBox训练开发一个FCN果蔬病虫害分割的AI应用,我们只需要准备模型文件以及简单的配置即可创建一个HTTP服务。同时我们可以了解到FCN网络的基本结构、数据处理和模型训练方法,以及对应推理应用的逻辑。----转自博客:https://bbs.huaweicloud.com/blogs/449045
-
深海鱼类检测(ModelBox)一、模型训练和转换YOLOX是YOLO系列的优化版本,引入了解耦头、数据增强、无锚点以及标签分类等目标检测领域的优秀进展,拥有较好的精度表现,同时对工程部署友好。模型的训练与转换教程已经开放在AI Gallery中,其中包含训练数据、训练代码、模型转换脚本。在ModelArts的Notebook环境中训练后,再转换成对应平台的模型格式:onnx格式可以用在Windows设备上,RK系列设备上需要转换为rknn格式。二、ModelBox 应用开发1. 创建工程在ModelBox sdk目录下使用create.bat创建fish_det工程:PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t server -n fish_det -s car_det ... success: create fish_det in D:\modelbox-win10-x64-1.5.3\workspacecreate.bat工具的参数中,-t参数,表示所创建实例的类型,包括server(ModelBox工程)、python(Python功能单元)、c++(C++功能单元)、infer(推理功能单元)等;-n参数,表示所创建实例的名称;-s参数,表示将使用后面参数值代表的模板创建工程,而不是创建空的工程。2. 修改推理功能单元下载转换好的yolox_fish.onnx模型到fish_det\model目录下,修改推理功能单元yolox_infer.toml模型的配置文件:# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. [base] name = "yolox_infer" device = "cpu" version = "1.0.0" description = "fish detection" entry = "./yolox_fish.onnx" # model file path, use relative path type = "inference" virtual_type = "onnx" # inference engine type: win10 now only support onnx group_type = "Inference" # flowunit group attribution, do not change # input port description, suporrt multiple input ports [input] [input.input1] name = "input" type = "float" device = "cpu" # output port description, suporrt multiple output ports [output] [output.output1] name = "output" type = "float" 3. 修改后处理功能单元我们的模型的输入大小为320,类别数量是1,修改fish_det\etc\flowunit\yolox_post目录下的yolox_post.toml配置文件:# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. # Basic config [base] name = "yolox_post" # The FlowUnit name device = "cpu" # The device the flowunit runs on,cpu,cuda,ascend。 version = "1.0.0" # The version of the flowunit description = "description" # The description of the flowunit entry = "yolox_post@yolox_postFlowUnit" # Python flowunit entry function type = "python" # Fixed value group_type = "Generic" # flowunit group attribution, change as Input/Output/Image/Generic ... # Flowunit Type stream = false # Whether the flowunit is a stream flowunit condition = false # Whether the flowunit is a condition flowunit collapse = false # Whether the flowunit is a collapse flowunit collapse_all = false # Whether the flowunit will collapse all the data expand = false # Whether the flowunit is a expand flowunit [config] net_h = 320 net_w = 320 num_classes = 1 strides = ['8', '16', '32'] conf_threshold = 0.25 iou_threshold = 0.45 [input] [input.input1] name = "in_feat" type = "float" [output] [output.output1] name = "out_data" type = "string" 4. 修改绘图功能单元我们这里只有一个类别,所以修改coco_car_labels = [0]只检测鱼这个类别:... def decode_car_bboxes(self, bbox_str, input_shape): try: coco_car_labels = [0] # fish det_result = json.loads(bbox_str)['det_result'] if (det_result == "None"): return [] bboxes = json.loads(det_result) car_bboxes = list(filter(lambda x: int(x[5]) in coco_car_labels, bboxes)) except Exception as ex: modelbox.error(str(ex)) return [] else: for bbox in car_bboxes: bbox[0] = int(bbox[0] * input_shape[1]) bbox[1] = int(bbox[1] * input_shape[0]) bbox[2] = int(bbox[2] * input_shape[1]) bbox[3] = int(bbox[3] * input_shape[0]) return car_bboxes ... 5. 修改应用的流程图修改image_resize图像预处理功能单元参数image_width=320, image_height=320与模型的输入大小保持一致:# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. [driver] dir = ["${HILENS_APP_ROOT}/etc/flowunit", "${HILENS_APP_ROOT}/etc/flowunit/cpp", "${HILENS_APP_ROOT}/model", "${HILENS_MB_SDK_PATH}/flowunit"] skip-default = true [profile] profile=false trace=false dir="${HILENS_DATA_DIR}/mb_profile" [graph] format = "graphviz" graphconf = """digraph fish_det { node [shape=Mrecord] queue_size = 1 batch_size = 1 input1[type=input,flowunit=input,device=cpu,deviceid=0] data_source_parser[type=flowunit, flowunit=data_source_parser, device=cpu, deviceid=0] video_demuxer[type=flowunit, flowunit=video_demuxer, device=cpu, deviceid=0] video_decoder[type=flowunit, flowunit=video_decoder, device=cpu, deviceid=0, pix_fmt=bgr] image_resize[type=flowunit, flowunit=resize, device=cpu, deviceid=0, image_width=320, image_height=320] image_transpose[type=flowunit, flowunit=packed_planar_transpose, device=cpu, deviceid=0] normalize[type=flowunit, flowunit=normalize, device=cpu, deviceid=0, standard_deviation_inverse="1,1,1"] car_detection[type=flowunit, flowunit=yolox_infer, device=cpu, deviceid=0, batch_size = 1] yolox_post[type=flowunit, flowunit=yolox_post, device=cpu, deviceid=0] draw_car_bbox[type=flowunit, flowunit=draw_car_bbox, device=cpu, deviceid=0] video_out[type=flowunit, flowunit=video_out, device=cpu, deviceid=0] input1:input -> data_source_parser:in_data data_source_parser:out_video_url -> video_demuxer:in_video_url video_demuxer:out_video_packet -> video_decoder:in_video_packet video_decoder:out_video_frame -> image_resize:in_image image_resize:out_image -> image_transpose:in_image image_transpose:out_image -> normalize:in_data normalize:out_data -> car_detection:input car_detection:output -> yolox_post:in_feat video_decoder:out_video_frame -> draw_car_bbox:in_image yolox_post:out_data -> draw_car_bbox:in_bbox draw_car_bbox:out_image -> video_out:in_video_frame }""" [flow] desc = "fish_det run in modelbox-win10-x64" 在命令行中运行.\create.bat -t editor即可打开ModelBox图编排界面,可以实时修改并查看项目的流程图:PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t editor6. 配置应用的输入输出下载测试视频到fish_det\data目录下,修改应用fish_det\bin\mock_task.toml配置文件:# 用于本地mock文件读取任务,脚本中已经配置了IVA_SVC_CONFIG环境变量, 添加了此文件路径 ########### 请确定使用linux的路径类型,比如在windows上要用 D:/xxx/xxx 不能用D:\xxx\xxx ########### # 任务的参数为一个压缩并转义后的json字符串 # 直接写需要转义双引号, 也可以用 content_file 添加一个json文件 [common] content = "{\"param_str\":\"string param\",\"param_int\":10,\"param_float\":10.5}" # 任务输入配置,mock模拟目前仅支持一路rtsp或者本地url, 当前支持以下几种输入方式: # 1. rtsp摄像头或rtsp视频流:type="rtsp", url="rtsp://xxx.xxx" (type为rtsp的时候,支持视频中断自动重连) # 2. 设备自带摄像头或者USB摄像头:type="url",url="摄像头编号,比如 0 或者 1 等" (需配合local_camera功能单元使用) # 3. 本地视频文件:type="url",url="视频文件路径" (可以是相对路径 -- 相对这个mock_task.toml文件, 也支持从环境变量${HILENS_APP_ROOT}所在目录文件输入) # 4. http服务:type="url", url="http://xxx.xxx"(指的是任务作为http服务启动,此处需填写对外暴露的http服务地址,需配合httpserver类的功能单元使用) [input] type = "url" url = "${HILENS_APP_ROOT}/data/Test_ROV_video_h264_decim.mp4" # 任务输出配置,当前支持以下几种输出方式: # 1. rtsp视频流:type="local", url="rtsp://xxx.xxx" # 2. 本地屏幕:type="local", url="0:xxx" (设备需要接显示器,系统需要安装桌面) # 3. 本地视频文件:type="local",url="视频文件路径" (可以是相对路径——相对这个mock_task.toml文件, 也支持输出到环境变量${HILENS_DATA_DIR}所在目录或子目录) # 4. http服务:type="webhook", url="http://xxx.xxx" (指的是任务产生的数据上报给某个http服务,此处需填写上传的http服务地址) [output] type = "local" url = "0" 7. 运行应用在fish_det工程目录下执行.\bin\main.bat运行应用,本地屏幕上会自动弹出鱼群的实时检测画面:PS D:\modelbox-win10-x64-1.5.3> cd D:\modelbox-win10-x64-1.5.3\workspace\fish_det PS D:\modelbox-win10-x64-1.5.3\workspace\fish_det> .\bin\main.bat三、小结本节介绍了如何使用ModelArts和ModelBox训练开发一个YOLOX鱼类目标检测的AI应用,我们只需要准备模型并配置对应的toml文件,即可快速实现模型的高效推理和部署。 ----转自博客:https://bbs.huaweicloud.com/blogs/449038
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签