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

C# OnnxRuntime 部署 RMBG-2.0 实现高精度背景去除

目录说明RMBG-2.0 是什么BiRefNet 架构的核心思想效果模型信息项目代码下载模型下载说明背景去除是图像处理中的一个经典难题。从早期的颜色键控、GrabCut到如今基于深度学习的分割模型技术的演进让抠图这件事变得越来越智能。而在众多背景去除方案中BRIA AI 开源的 RMBG-2.0 凭借其极高的精度和良好的工程化能力成为当前这一领域备受关注的选择。本文将介绍如何在 C# 中使用 ONNX Runtime 部署 RMBG-2.0 模型实现高精度的图像背景去除输出带透明通道的 PNG 图片。全文包含完整的代码实现适合希望将 AI 抠图能力集成到 .NET 应用中的开发者参考。RMBG-2.0 是什么RMBG-2.0Remove Background 2.0是 BRIA AI 推出的新一代图像背景移除模型基于 BiRefNetBilateral Reference Network双边参考网络架构设计。相比前代 RMBG v1.4准确率从 73.94% 大幅提升至 90.14%超越了不少商业付费工具BiRefNet 架构的核心思想传统图像分割模型往往把任务简化为“给每个像素打标签”——是前景就是 1是背景就是 0。这种单向分类思维在处理发丝、纱巾、玻璃反光等边界模糊区域时天然存在歧义。BiRefNet 换了一种思路它不直接预测分割图而是构建一个双向参考系统——前景参考分支聚焦于主体内部结构背景参考分支同步分析周围环境两个分支在特征空间进行交叉调制共同完成高保真分割。具体来说BiRefNet 由两个核心模块构成定位模块Localization Module, LM 负责理解全局语义、生成语义图恢复模块Restoration Module, RM 负责边缘细节的精修通过边缘感知注意力机制实现对发丝级细节的精细处理。这种设计使得 RMBG-2.0 在保持计算效率的同时能够精准处理复杂边缘。效果模型信息Model Properties----------------------------------------------------------------------------------------Inputs-------------------------namepixel_valuestensorFloat[1, 3, -1, -1]---------------------------------------------------------------Outputs-------------------------namealphastensorFloat[1, 1, -1, -1]---------------------------------------------------------------项目代码using Microsoft.ML.OnnxRuntime;using Microsoft.ML.OnnxRuntime.Tensors;using OpenCvSharp;using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Imaging;using System.Linq;using System.Windows.Forms;namespace Onnx_Demo{public partial class Form1 : Form{public Form1(){InitializeComponent();}string fileFilter *.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png;string image_path ;string startupPath;DateTime dt1 DateTime.Now;DateTime dt2 DateTime.Now;string model_path;Mat image; // 原始图像BGRMat result_image_with_alpha; // 最终带有透明背景的图像SessionOptions options;InferenceSession onnx_session;Tensorfloat input_tensor;ListNamedOnnxValue input_container;IDisposableReadOnlyCollectionDisposableNamedOnnxValue result_infer;int inpHeight, inpWidth;// RMBG-2.0 预处理参数private readonly float[] mean new float[] { 0.485f, 0.456f, 0.406f };private readonly float[] std new float[] { 0.229f, 0.224f, 0.225f };private void button1_Click(object sender, EventArgs e){OpenFileDialog ofd new OpenFileDialog();ofd.Filter fileFilter;if (ofd.ShowDialog() ! DialogResult.OK) return;pictureBox1.Image null;image_path ofd.FileName;pictureBox1.Image new Bitmap(image_path);textBox1.Text ;image new Mat(image_path);pictureBox2.Image null;}private void button2_Click(object sender, EventArgs e){if (image_path ){return;}button2.Enabled false;pictureBox2.Image null;textBox1.Text ;Application.DoEvents();// 读取原始图像BGRimage new Mat(image_path);int originalWidth image.Cols;int originalHeight image.Rows;// ------------------ 预处理 ------------------// 1. 转换为RGBMat rgb new Mat();Cv2.CvtColor(image, rgb, ColorConversionCodes.BGR2RGB);// 2. Resize到模型输入尺寸1024x1024Mat resized new Mat();Cv2.Resize(rgb, resized, new OpenCvSharp.Size(inpWidth, inpHeight));// 3. 转换为浮点并归一化到 [0,1]resized.ConvertTo(resized, MatType.CV_32FC3, 1.0 / 255.0);// 4. 分离通道并应用标准化 (value - mean) / stdMat[] channels Cv2.Split(resized); // R, G, Bfloat[] inputData new float[3 * inpHeight * inpWidth];int channelSize inpHeight * inpWidth;for (int c 0; c 3; c){float[] channelData new float[channelSize];System.Runtime.InteropServices.Marshal.Copy(channels[c].Data, channelData, 0, channelSize);// 标准化每个通道for (int i 0; i channelSize; i){channelData[i] (channelData[i] - mean[c]) / std[c];}Array.Copy(channelData, 0, inputData, c * channelSize, channelSize);}// 创建输入张量 (1, 3, H, W)input_tensor new DenseTensorfloat(inputData, new[] { 1, 3, inpHeight, inpWidth });// 将输入放入容器使用正确的输入名称 pixel_valuesinput_container.Clear();input_container.Add(NamedOnnxValue.CreateFromTensor(pixel_values, input_tensor));// ------------------ 推理 ------------------dt1 DateTime.Now;result_infer onnx_session.Run(input_container);dt2 DateTime.Now;// 按输出名称 alphas 获取结果var output result_infer.First(x x.Name alphas).AsTensorfloat();int[] outShape output.Dimensions.ToArray();int outH outShape[2];int outW outShape[3];float[] predFloat output.ToArray().Select(x (float)x).ToArray();// 创建单通道 MatAlpha 蒙版值域 [0,1]Mat alphaMat new Mat(outH, outW, MatType.CV_32FC1, predFloat);// ------------------ 后处理 ------------------// 1. 双线性插值到原始尺寸Mat maskResized new Mat();Cv2.Resize(alphaMat, maskResized, new OpenCvSharp.Size(originalWidth, originalHeight), interpolation: InterpolationFlags.Linear);// 2. 确保值在 [0,1] 范围内sigmoid输出理论如此防止溢出Cv2.Threshold(maskResized, maskResized, 1.0, 1.0, ThresholdTypes.Trunc);Cv2.Threshold(maskResized, maskResized, 0.0, 0.0, ThresholdTypes.Tozero);// 3. 转换为8位单通道alpha 0~255Mat alphaMask new Mat();maskResized.ConvertTo(alphaMask, MatType.CV_8UC1, 255.0);// ------------------ 合成透明背景图像 ------------------// 原始图像BGR转为 BGRAMat rgba new Mat();Cv2.CvtColor(image, rgba, ColorConversionCodes.BGR2BGRA);// 替换 alpha 通道Mat[] bgraChannels Cv2.Split(rgba);bgraChannels[3] alphaMask;Cv2.Merge(bgraChannels, rgba);result_image_with_alpha rgba.Clone();// 显示最终图像PictureBox 支持透明通道显示pictureBox2.Image new Bitmap(rgba.ToMemoryStream());textBox1.Text 推理耗时: (dt2 - dt1).TotalMilliseconds ms;button2.Enabled true;}private void Form1_Load(object sender, EventArgs e){startupPath System.Windows.Forms.Application.StartupPath;model_path model/model.onnx; // 请确保模型文件存在于此路径// 创建会话使用 CPU可根据需要改为 CUDAoptions new SessionOptions();options.LogSeverityLevel OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;options.AppendExecutionProvider_CPU(0);onnx_session new InferenceSession(model_path, options);input_container new ListNamedOnnxValue();// 模型固定输入尺寸inpHeight 1024;inpWidth 1024;// 测试图片路径可选image_path test_img/1.jpg;if (System.IO.File.Exists(image_path)){pictureBox1.Image new Bitmap(image_path);image new Mat(image_path);}}private void pictureBox1_DoubleClick(object sender, EventArgs e){Common.ShowNormalImg(pictureBox1.Image);}private void pictureBox2_DoubleClick(object sender, EventArgs e){Common.ShowNormalImg(pictureBox2.Image);}SaveFileDialog sdf new SaveFileDialog();private void button3_Click(object sender, EventArgs e){if (result_image_with_alpha null || result_image_with_alpha.Empty()){MessageBox.Show(请先进行推理);return;}sdf.Title 保存透明背景图片;sdf.Filter PNG图片 (*.png)|*.png|JPEG图片 (*.jpg)|*.jpg|BMP图片 (*.bmp)|*.bmp;sdf.FilterIndex 1; // 默认 PNG保留透明度if (sdf.ShowDialog() DialogResult.OK){string ext System.IO.Path.GetExtension(sdf.FileName).ToLower();ImageFormat format ImageFormat.Png;if (ext .jpg || ext .jpeg)format ImageFormat.Jpeg;else if (ext .bmp)format ImageFormat.Bmp;using (var stream result_image_with_alpha.ToMemoryStream())using (var bitmap new Bitmap(stream)){bitmap.Save(sdf.FileName, format);}MessageBox.Show(保存成功位置 sdf.FileName);}}}}using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Windows.Forms; namespace Onnx_Demo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } string fileFilter *.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png; string image_path ; string startupPath; DateTime dt1 DateTime.Now; DateTime dt2 DateTime.Now; string model_path; Mat image; // 原始图像BGR Mat result_image_with_alpha; // 最终带有透明背景的图像 SessionOptions options; InferenceSession onnx_session; Tensorfloat input_tensor; ListNamedOnnxValue input_container; IDisposableReadOnlyCollectionDisposableNamedOnnxValue result_infer; int inpHeight, inpWidth; // RMBG-2.0 预处理参数 private readonly float[] mean new float[] { 0.485f, 0.456f, 0.406f }; private readonly float[] std new float[] { 0.229f, 0.224f, 0.225f }; private void button1_Click(object sender, EventArgs e) { OpenFileDialog ofd new OpenFileDialog(); ofd.Filter fileFilter; if (ofd.ShowDialog() ! DialogResult.OK) return; pictureBox1.Image null; image_path ofd.FileName; pictureBox1.Image new Bitmap(image_path); textBox1.Text ; image new Mat(image_path); pictureBox2.Image null; } private void button2_Click(object sender, EventArgs e) { if (image_path ) { return; } button2.Enabled false; pictureBox2.Image null; textBox1.Text ; Application.DoEvents(); // 读取原始图像BGR image new Mat(image_path); int originalWidth image.Cols; int originalHeight image.Rows; // ------------------ 预处理 ------------------ // 1. 转换为RGB Mat rgb new Mat(); Cv2.CvtColor(image, rgb, ColorConversionCodes.BGR2RGB); // 2. Resize到模型输入尺寸1024x1024 Mat resized new Mat(); Cv2.Resize(rgb, resized, new OpenCvSharp.Size(inpWidth, inpHeight)); // 3. 转换为浮点并归一化到 [0,1] resized.ConvertTo(resized, MatType.CV_32FC3, 1.0 / 255.0); // 4. 分离通道并应用标准化 (value - mean) / std Mat[] channels Cv2.Split(resized); // R, G, B float[] inputData new float[3 * inpHeight * inpWidth]; int channelSize inpHeight * inpWidth; for (int c 0; c 3; c) { float[] channelData new float[channelSize]; System.Runtime.InteropServices.Marshal.Copy(channels[c].Data, channelData, 0, channelSize); // 标准化每个通道 for (int i 0; i channelSize; i) { channelData[i] (channelData[i] - mean[c]) / std[c]; } Array.Copy(channelData, 0, inputData, c * channelSize, channelSize); } // 创建输入张量 (1, 3, H, W) input_tensor new DenseTensorfloat(inputData, new[] { 1, 3, inpHeight, inpWidth }); // 将输入放入容器使用正确的输入名称 pixel_values input_container.Clear(); input_container.Add(NamedOnnxValue.CreateFromTensor(pixel_values, input_tensor)); // ------------------ 推理 ------------------ dt1 DateTime.Now; result_infer onnx_session.Run(input_container); dt2 DateTime.Now; // 按输出名称 alphas 获取结果 var output result_infer.First(x x.Name alphas).AsTensorfloat(); int[] outShape output.Dimensions.ToArray(); int outH outShape[2]; int outW outShape[3]; float[] predFloat output.ToArray().Select(x (float)x).ToArray(); // 创建单通道 MatAlpha 蒙版值域 [0,1] Mat alphaMat new Mat(outH, outW, MatType.CV_32FC1, predFloat); // ------------------ 后处理 ------------------ // 1. 双线性插值到原始尺寸 Mat maskResized new Mat(); Cv2.Resize(alphaMat, maskResized, new OpenCvSharp.Size(originalWidth, originalHeight), interpolation: InterpolationFlags.Linear); // 2. 确保值在 [0,1] 范围内sigmoid输出理论如此防止溢出 Cv2.Threshold(maskResized, maskResized, 1.0, 1.0, ThresholdTypes.Trunc); Cv2.Threshold(maskResized, maskResized, 0.0, 0.0, ThresholdTypes.Tozero); // 3. 转换为8位单通道alpha 0~255 Mat alphaMask new Mat(); maskResized.ConvertTo(alphaMask, MatType.CV_8UC1, 255.0); // ------------------ 合成透明背景图像 ------------------ // 原始图像BGR转为 BGRA Mat rgba new Mat(); Cv2.CvtColor(image, rgba, ColorConversionCodes.BGR2BGRA); // 替换 alpha 通道 Mat[] bgraChannels Cv2.Split(rgba); bgraChannels[3] alphaMask; Cv2.Merge(bgraChannels, rgba); result_image_with_alpha rgba.Clone(); // 显示最终图像PictureBox 支持透明通道显示 pictureBox2.Image new Bitmap(rgba.ToMemoryStream()); textBox1.Text 推理耗时: (dt2 - dt1).TotalMilliseconds ms; button2.Enabled true; } private void Form1_Load(object sender, EventArgs e) { startupPath System.Windows.Forms.Application.StartupPath; model_path model/model.onnx; // 请确保模型文件存在于此路径 // 创建会话使用 CPU可根据需要改为 CUDA options new SessionOptions(); options.LogSeverityLevel OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO; options.AppendExecutionProvider_CPU(0); onnx_session new InferenceSession(model_path, options); input_container new ListNamedOnnxValue(); // 模型固定输入尺寸 inpHeight 1024; inpWidth 1024; // 测试图片路径可选 image_path test_img/1.jpg; if (System.IO.File.Exists(image_path)) { pictureBox1.Image new Bitmap(image_path); image new Mat(image_path); } } private void pictureBox1_DoubleClick(object sender, EventArgs e) { Common.ShowNormalImg(pictureBox1.Image); } private void pictureBox2_DoubleClick(object sender, EventArgs e) { Common.ShowNormalImg(pictureBox2.Image); } SaveFileDialog sdf new SaveFileDialog(); private void button3_Click(object sender, EventArgs e) { if (result_image_with_alpha null || result_image_with_alpha.Empty()) { MessageBox.Show(请先进行推理); return; } sdf.Title 保存透明背景图片; sdf.Filter PNG图片 (*.png)|*.png|JPEG图片 (*.jpg)|*.jpg|BMP图片 (*.bmp)|*.bmp; sdf.FilterIndex 1; // 默认 PNG保留透明度 if (sdf.ShowDialog() DialogResult.OK) { string ext System.IO.Path.GetExtension(sdf.FileName).ToLower(); ImageFormat format ImageFormat.Png; if (ext .jpg || ext .jpeg) format ImageFormat.Jpeg; else if (ext .bmp) format ImageFormat.Bmp; using (var stream result_image_with_alpha.ToMemoryStream()) using (var bitmap new Bitmap(stream)) { bitmap.Save(sdf.FileName, format); } MessageBox.Show(保存成功位置 sdf.FileName); } } } }下载源码下载模型下载通过网盘分享的文件RMBG-2.0 模型链接: https://pan.baidu.com/s/12pA3YBoDQqVEEO-PkDBg8w?pwdtqj7 提取码: tqj7

相关文章:

C# OnnxRuntime 部署 RMBG-2.0 实现高精度背景去除

目录 说明 RMBG-2.0 是什么 BiRefNet 架构的核心思想 效果 模型信息 项目 代码 下载 模型下载 说明 背景去除是图像处理中的一个经典难题。从早期的颜色键控、GrabCut,到如今基于深度学习的分割模型,技术的演进让抠图这件事变得越来越智能。而…...

OpenClaw备份策略:gemma-3-12b-it自动化数据保护方案

OpenClaw备份策略:gemma-3-12b-it自动化数据保护方案 1. 为什么需要AI驱动的自动化备份? 上个月我的移动硬盘突然罢工,导致三个月的项目文档全部丢失。这次惨痛经历让我意识到:传统备份方案存在两个致命缺陷——依赖人工记忆和缺…...

OpenClaw免费模型推荐与配置指南!

OpenClaw免费模型推荐与配置指南 OpenClaw(小龙虾)作为开源 AI 智能体框架,本身不内置大模型,而是支持灵活对接各类 AI 服务。本文整理了 2026 年最新的完全免费、好用稳定的模型方案,涵盖云端 API 和本地私有化部署,附带详细的配置步骤,帮你零成本玩转 OpenClaw。 一…...

主键、外键和约束:让数据库“有规矩”才能不出错!|转行学DB第5天

为什么你的表里会混进“奇怪的数据”?三分钟搞懂数据库的“家规”大家好呀!我是数据库小学妹👋一个正在从设计转行学数据库的"萌新"。 前几篇我们学会了建表、插数据、查数据。但有个问题一直让我头疼:我怎么保证同一张…...

第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--多策略混合算法

前言 全球校园人工智能算法精英大赛”是江苏省人工智能学会举办的面向全球具有正式学籍的全日制高等院校及以上在校学生举办的算法竞赛。其中的算法巅峰赛属于产业命题赛道,这是第3赛季,这次优化题的主题是 “碳中和”。 回顾 第七届全球校园人工智能算…...

鸿蒙_ArkUI组件同时支持双击和单击事件

我们常用的点击事件是onClick,想要实现双击需要用TapGesture手势实现,那么如果一个组件同时需要支持单击和双击,则需要使用GestureGroup,我们新建一个页面来测试一下:Entry Component struct TestDoubleClick {State m…...

动态规划——01背包问题、完全背包(python、一维DP)

01-背包问题:从最大容量开始,从后往前遍历背包容量每种物品只能选择一次。物品种类为n,背包容量为k。从最大容量开始,从后往前遍历背包容量,小于当前物品容量的背包大小不遍历,即遍历到w[i]即可。&#xff…...

3.一文看懂反向传播:从单个神经元到 PyTorch 自动求导

反向求导,多层次对应一个神经,单个神经元场景 学习这一篇的前提是,已经学会了梯度算法和线性结构算法,不明白的可以去看我之前的文章。 前面看不懂的,直接跳转到 “ 反向传播的流程 ” 底层的数学算法 z 是中间变量 u …...

【国家卫健委《医疗卫生机构数据安全管理指南》强制落地倒计时】:PHP脱敏工具未升级?3类高危场景已触发监管预警!

第一章:国家卫健委《医疗卫生机构数据安全管理指南》强制落地背景与合规红线近年来,医疗健康数据泄露事件频发,患者隐私保护压力陡增。2023年12月,国家卫生健康委员会正式印发《医疗卫生机构数据安全管理指南》(国卫办…...

string的特性及使用

string这个词很容易让我们联想到str,也就是字符串,实际上string和字符串的关联性还是很强的。 很多字符串的题目都是string类的形式出现的,日常工作中为了方便使用都是用的string类, 标准string类 使用string类时,必须…...

(文档)第121讲:Oracle兼容工具—orafce使用技巧

目标 • orafce概述 • orafce安装 • orafce应用案例 orafce概述 orafce(Oracle Functions for PostgreSQL)是一个开源项目,旨在为 PostgreSQL 数据库提供一些 Oracle 数据库中缺失或行为不同的函数。该项目通过在 PostgreSQL 中实现这些函数,帮助…...

QGIS之四十三python处理数据

1、调出Python控制台 2、新建python脚本 右边的窗口可以拉过来 3、让AI根据你的需求写python脚本 比如要进行文本转shp,让AI写python脚本,拷贝脚本进来,保存文件 4、执行脚本...

工业以太网无线网桥 SG-WX-Bridge v2.0|免布线、一对多、即插即用,工业现场无线通信神器

工厂布线麻烦、距离远、施工成本高?设备移动频繁、有线网扯来扯去易损坏?三格电子SG-WX-Bridge v2.0 工业以太网无线网桥,专为工业现场打造,把有线网变无线,1 台 AP 最多带 8 台 STA,Profinet/EtherNet/IP/…...

机器学习经验总结整理

1.一个标准的机器学习项目流程(一定要记住顺序)很多新手觉得乱,是因为没按流程想问题。做任何项目,脑子里要有这根“流水线”:定义问题 → 是分类还是回归还是聚类?业务目标是什么?获取数据 → …...

千问3.5-27B模型微调实战:提升OpenClaw任务成功率

千问3.5-27B模型微调实战:提升OpenClaw任务成功率 1. 为什么需要微调千问3.5-27B? 当我第一次将OpenClaw接入千问3.5-27B时,发现它在简单任务上表现不错,但遇到复杂操作链时经常"卡壳"。比如让它整理一周的会议录音文…...

【国家级数字农业项目技术白皮书节选】:PHP轻量化时序数据处理框架如何扛住每秒8700+传感器上报?

第一章:农业 PHP 物联网数据可视化案例在智慧农业实践中,PHP 作为轻量级服务端语言,常被用于快速构建物联网数据聚合与可视化看板。本案例基于 ESP32 传感器节点采集土壤湿度、环境温湿度及光照强度,通过 HTTP POST 将 JSON 数据推…...

Arduino RTCtime库:标准time.h兼容的DS1307/DS3231驱动

1. 项目概述RTCtime 是一款专为 Arduino 平台设计的实时时钟(RTC)驱动库,核心目标是在硬件 RTC 模块与标准 C 运行时时间系统之间建立语义一致、类型兼容的桥梁。它并非一个独立的时间计算引擎,而是对底层硬件寄存器操作的封装层&…...

2026年全网视频去水印实测:6款消除字幕工具上手,哪款更适合你

短视频剪辑、素材二创时,画面里的顽固字幕、平台角标总是破坏整体质感,找对去字幕工具能直接拉高成品效率。这次我们亲测了市面上 6 款关注度较高的视频消除字幕工具,从便捷性、处理效果、隐私安全、批量能力、平台兼容五个维度逐一拆解&…...

加入csdn 5周年

不知不觉,已经是5年过去了,今天在b站刷了个视频大有感触,决定也用csdn记录一点东西,而不是一直把东西放在github上面或者是本地...

Idiap研究院:让语音识别AI学会聆听对话历史,压缩音频记忆

语音识别技术在我们的生活中越来越常见,从手机语音助手到客服电话,从会议记录到智能搜索。但你有没有想过,为什么这些系统有时候会犯一些很明显的错误?比如当你在和语音助手对话时,明明在前一句话中提到了"张三&q…...

方差的数学意义

方差(Variance)是统计学中一个非常基础且核心的概念。简单来说,它的数学意义就是衡量一组数据的离散程度,或者叫波动性。 如果说“平均值”(均值)告诉我们数据的中心在哪里,那么“方差”告诉我们…...

从月损耗20万到年增收300万:零售老板180天蜕变

李老板在二线城市经营着5家社区超市,年营收5000万,利润却越来越薄。一个残酷的数字让他夜不能寐:因线上线下系统割裂、手工操作繁多,每月生鲜损耗和运营错漏造成的损失超过20万元。他意识到,不变革,就是在慢…...

OpenClaw+Qwen3.5-9B组合优势:3个不可替代的使用场景

OpenClawQwen3.5-9B组合优势:3个不可替代的使用场景 1. 为什么选择OpenClawQwen3.5-9B组合 去年夏天,当我第一次尝试用Python脚本自动化处理医疗研究数据时,遇到了一个尴尬的问题:要么忍受公有云API的数据隐私风险,要…...

GLM-. 全面支持与 Gemini CLI 集成:HagiCode 的多模型进化之路估

1. 流图:数据的河流 如果把传统的堆叠面积图想象成一块块整齐堆叠的积木,那么流图就像一条蜿蜒流淌的河流,河道的宽窄变化自然流畅,波峰波谷过渡平滑。 它特别适合展示多个类别数据随时间的变化趋势,尤其是当你想强调整…...

使用Dify对接自己开发的mcp

先要有自己开发的mcp,然后部署到服务器 如何开发自己的mcp:Java使用spring Ai集成的mcp开发自己的mcp-CSDN博客 使用Dify对接mcp服务 Dify如何接入MCP工具_dify如何使用mcp工具-CSDN博客 基本上都差不多, 只说一点:如果一直报…...

eVTOL 研制必读 | 厘清研制保证与设计保证的边界

在很多航空企业里,经常会出现一种现象:项目团队在谈“研制保证体系”,管理层在谈“设计保证系统”;技术人员在强调 ARP4754A/B,组织层面却在说 DOA 合规。大家都在讲“保证”,却未必在讲同一件事。结果是什…...

无人外卖店

本项目以智能无人柜云值守模式,布局写字楼、社区等外卖密集区,24小时运营,对接美团、饿了么平台,主打预制餐饮品、零食等标准化商品。...

如何快速搭建个人数字图书馆:Talebook私有书库终极指南

如何快速搭建个人数字图书馆:Talebook私有书库终极指南 【免费下载链接】talebook 一个简单好用的个人书库 项目地址: https://gitcode.com/gh_mirrors/ta/talebook 想要拥有一个属于自己的数字图书馆吗?Talebook是一个基于Calibre的简单好用的个…...

问题解决策略基础算法实现训练1

问题 A: C 语言习题 字符串排序 [提交] [状态]题目描述 输入nnn个字符串,将它们按字母由小到大的顺序排列并输出。编写三个函数实现, 用于输出inputnnn个字符串, 用于排序sortstrnnn个字符串, 用于输出outputnnn个字符…...

当Windows 10的OneDrive无法彻底卸载时,这个批处理脚本是你的终极解决方案

当Windows 10的OneDrive无法彻底卸载时,这个批处理脚本是你的终极解决方案 【免费下载链接】OneDrive-Uninstaller Batch script to completely uninstall OneDrive in Windows 10 项目地址: https://gitcode.com/gh_mirrors/on/OneDrive-Uninstaller 你是否…...