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

部署系列六基于nndeploy的深度学习 图像降噪unet部署

文章目录

    • 1.直接在源代码demo中修改
    • 2. 如何修改呢?
      • 3. 修改 graph
      • 4. 总结

https://github.com/DeployAI/nndeploy
https://nndeploy-zh.readthedocs.io/zh/latest/introduction/index.html

通过以上2个官方链接对nndeploy基本的使用方法应该有所了解了。
下面就是利用nndeploy跑一个图像降噪的unet类型网络。

为了方便,直接修改源码然后重新编译了一个demo。大家理解就好,可以自己整理完善,创建新的demo, 因为我这里没有创建新的deno,而是直接修改 yolov5的相关代码。

1.直接在源代码demo中修改

源代码如果你想运行yolo5是一个目标检测模型,可以通过下面的命令:
onnxruntime:115ms
./install/lib/demo_nndeploy_detect --name NNDEPLOY_YOLOV5 --inference_type kInferenceTypeOnnxRuntime --device_type kDeviceTypeCodeX86:0 --model_type kModelTypeOnnx --is_path --model_value …/…/yolov5s.onnx --input_type kInputTypeImage --input_path …/…/sample.jpg --output_path …/…/sample_output.jpg

openvino:57ms
./install/lib/demo_nndeploy_detect --name NNDEPLOY_YOLOV5 --inference_type kInferenceTypeOpenVino --device_type kDeviceTypeCodeX86:0 --model_type kModelTypeOnnx --is_path --model_value …/…/yolov5s.onnx --input_type kInputTypeImage --input_path …/…/sample.jpg --output_path …/…/sample_output.jpg

mnn:78ms
./install/lib/demo_nndeploy_detect --name NNDEPLOY_YOLOV5 --inference_type kInferenceTypeMnn --device_type kDeviceTypeCodeX86:0 --model_type kModelTypeMnn --is_path --model_value …/…/yolov5s.mnn --input_type kInputTypeImage --input_path …/…/sample.jpg --output_path …/…/sample_output.jpg

tensorrt: 17ms
./install/lib/demo_nndeploy_detect --name NNDEPLOY_YOLOV5 --inference_type kInferenceTypeTensorRt --device_type kDeviceTypeCodeCuda:0 --model_type kModelTypeOnnx --is_path --model_value …/…/yolov5s.onnx --input_type kInputTypeImage --input_path …/…/sample.jpg --output_path …/…/sample_output.jpg

然后我直接修改源码然后编译后通过下面的命令 可以运行 unet denoise model

tensorrt
./install/lib/demo_nndeploy_detect --name NNDEPLOY_YOLOV5 --inference_type kInferenceTypeTensorRt --device_type kDeviceTypeCodeCuda:0 --model_type kModelTypeOnnx --is_path --model_value /home/tony/nndeploy/mymodel/scripts/unet8.opt.onnx --input_type kInputTypeImage --input_path …/…/1007_01_06_40_000101.png --output_path …/…/sample_output.jpg

onnxruntime
./install/lib/demo_nndeploy_detect --name NNDEPLOY_YOLOV5 --inference_type kInferenceTypeOnnxRuntime --device_type kDeviceTypeCodeX86:0 --model_type kModelTypeOnnx --is_path --model_value /home/tony/nndeploy/mymodel/scripts/unet8.opt.onnx --input_type kInputTypeImage --input_path …/…/1007_01_06_40_000101.png --output_path …/…/sample_output.jpg

openvino:
./install/lib/demo_nndeploy_detect --name NNDEPLOY_YOLOV5 --inference_type kInferenceTypeOpenVino --device_type kDeviceTypeCodeX86:0 --model_type kModelTypeOnnx --is_path --model_value /home/tony/nndeploy/mymodel/scripts/unet8.opt.onnx --input_type kInputTypeImage --input_path …/…/1007_01_06_40_000101.png --output_path …/…/sample_output.jpg

MNN:
./install/lib/demo_nndeploy_detect --name NNDEPLOY_YOLOV5 --inference_type kInferenceTypeMnn --device_type kDeviceTypeCodeX86:0 --model_type kModelTypeMnn --is_path --model_value /home/tony/nndeploy/mymodel/scripts/unet8.opt.mnn --input_type kInputTypeImage --input_path …/…/1007_01_06_40_000101.png --output_path …/…/sample_output.jpg

TNN:
./install/lib/demo_nndeploy_detect --name NNDEPLOY_YOLOV5 --inference_type kInferenceTypeTnn --device_type kDeviceTypeCodeX86:0 --model_type kModelTypeTnn --is_path --model_value /home/tony/nndeploy/mymodel/scripts/unet8.sim.tnnproto,/home/tony/nndeploy/mymodel/scripts/unet8.sim.tnnmodel --input_type kInputTypeImage --input_path …/…/1007_01_06_40_000101.png --output_path …/…/sample_output.jpg

2. 如何修改呢?

首先明白我的模型,输入输出都是 c,h,w, 0-1, float32
首先修改demo.cc:
设置了graph的 input和output :都是 h, w, c , 0-1, float32
输入是 h,w,c float32
输出也是h,w,c float32

一个完整的graph包括:

  1. 前处理需要完成 从 h,w,c foat32 -> c, h, w float32
    2.然后infer跑model;:输入输出都是 c,h,w, 0-1, float32
    3.那么后处理需要完成 从 c, h, w,float32 -> h, w, c, float32

其实使用一个框架,要获取到 模型输入和输出的指针,然后可以用opencv进行前后预处理,很多框架都有自己的前后处理(我不太喜欢用,感觉不清晰有学习成本)
在这里插入图片描述
完整代码:

#include "flag.h"
#include "nndeploy/base/glic_stl_include.h"
#include "nndeploy/base/time_profiler.h"
#include "nndeploy/dag/node.h"
#include "nndeploy/device/device.h"
#include "nndeploy/model/detect/yolo/yolo.h"using namespace nndeploy;cv::Mat drawBox(cv::Mat &cv_mat, model::DetectResult &result) {// float w_ratio = float(cv_mat.cols) / float(640);// float h_ratio = float(cv_mat.rows) / float(640);float w_ratio = float(cv_mat.cols);float h_ratio = float(cv_mat.rows);const int CNUM = 80;cv::RNG rng(0xFFFFFFFF);cv::Scalar_<int> randColor[CNUM];for (int i = 0; i < CNUM; i++)rng.fill(randColor[i], cv::RNG::UNIFORM, 0, 256);int i = -1;for (auto bbox : result.bboxs_) {std::array<float, 4> box;box[0] = bbox.bbox_[0];  // 640.0;box[2] = bbox.bbox_[2];  // 640.0;box[1] = bbox.bbox_[1];  // 640.0;box[3] = bbox.bbox_[3];  // 640.0;box[0] *= w_ratio;box[2] *= w_ratio;box[1] *= h_ratio;box[3] *= h_ratio;int width = box[2] - box[0];int height = box[3] - box[1];int id = bbox.label_id_;NNDEPLOY_LOGE("box[0]:%f, box[1]:%f, width :%d, height :%d\n", box[0],box[1], width, height);cv::Point p = cv::Point(box[0], box[1]);cv::Rect rect = cv::Rect(box[0], box[1], width, height);cv::rectangle(cv_mat, rect, randColor[id]);std::string text = " ID:" + std::to_string(id);cv::putText(cv_mat, text, p, cv::FONT_HERSHEY_PLAIN, 1, randColor[id]);}return cv_mat;
}//
int main(int argc, char *argv[]) {gflags::ParseCommandLineNonHelpFlags(&argc, &argv, true);if (demo::FLAGS_usage) {demo::showUsage();return -1;}// 检测模型的有向无环图graph名称,例如:// NNDEPLOY_YOLOV5/NNDEPLOY_YOLOV6/NNDEPLOY_YOLOV8std::string name = demo::getName();// 推理后端类型,例如:// kInferenceTypeOpenVino / kInferenceTypeTensorRt / kInferenceTypeOnnxRuntimebase::InferenceType inference_type = demo::getInferenceType();// 推理设备类型,例如:// kDeviceTypeCodeX86:0/kDeviceTypeCodeCuda:0/...base::DeviceType device_type = demo::getDeviceType();// 模型类型,例如:// kModelTypeOnnx/kModelTypeMnn/...base::ModelType model_type = demo::getModelType();// 模型是否是路径bool is_path = demo::isPath();// 模型路径或者模型字符串std::vector<std::string> model_value = demo::getModelValue();// 有向无环图graph的输入边packertdag::Edge input("detect_in");// 有向无环图graph的输出边packertdag::Edge output("detect_out");// 创建检测模型有向无环图graphdag::Graph *graph =dag::createGraph(name, inference_type, device_type, &input, &output,model_type, is_path, model_value);if (graph == nullptr) {NNDEPLOY_LOGE("graph is nullptr");return -1;}// 初始化有向无环图graphNNDEPLOY_TIME_POINT_START("graph->init()");base::Status status = graph->init();if (status != base::kStatusCodeOk) {NNDEPLOY_LOGE("graph init failed");return -1;}NNDEPLOY_TIME_POINT_END("graph->init()");// 有向无环图graph的输入图片路径std::string input_path = demo::getInputPath();// opencv读图cv::Mat input_mat = cv::imread(input_path);int img_h = input_mat.rows;int img_w = input_mat.cols;input_mat.convertTo(input_mat, CV_32FC3, 1.0/255);// 将图片写入有向无环图graph输入边input.set(input_mat);// 定义有向无环图graph的输出结果cv::Mat result(img_h, img_w, CV_32FC3);//model::DetectResult result;// 将输出结果写入有向无环图graph输出边output.set(result);// 有向无环图Graphz运行NNDEPLOY_TIME_POINT_START("graph->run()");status = graph->run();if (status != base::kStatusCodeOk) {NNDEPLOY_LOGE("graph run failed");return -1;}NNDEPLOY_TIME_POINT_END("graph->run()");//drawBox(input_mat, result);std::string ouput_path = demo::getOutputPath();result.convertTo(result, CV_8UC3, 255);//cv::imwrite("ret.png", output);cv::imwrite(ouput_path, result);// 有向无环图graphz反初始化NNDEPLOY_TIME_POINT_START("graph->deinit()");status = graph->deinit();if (status != base::kStatusCodeOk) {NNDEPLOY_LOGE("graph deinit failed");return -1;}NNDEPLOY_TIME_POINT_END("graph->deinit()");NNDEPLOY_TIME_PROFILER_PRINT("detetct time profiler");// 有向无环图graphz销毁delete graph;NNDEPLOY_LOGE("hello world!\n");return 0;
}

3. 修改 graph

一个完整的graph包括:

  1. 前处理需要完成 从 h,w,c foat32 -> c, h, w float32
    2.然后infer跑model;:输入输出都是 c,h,w, 0-1, float32
    3.那么后处理需要完成 从 c, h, w,float32 -> h, w, c, float32

dag::Graph* createYoloV5Graph(const std::string& name,
base::InferenceType inference_type,
base::DeviceType device_type, dag::Edge* input,
dag::Edge* output, base::ModelType model_type,
bool is_path,
std::vectorstd::string model_value)
中修改前后处理函数即可。

前处理,infer , 后处理是一个 graph , 也就是demo中完整的图。
demo中的input和output是 完整的图的输入输出。

然后前处理,infer, 后处理 内部也有自己的input和output,不要搞混淆了。

比如模型infer输入,输出都是c,h,w, float32的结果,
后处理 input是 c,h,w float32 的数据,output转换为 h,w,c float32的数据(对应上面的cv::Mat result(img_h, img_w, CV_32FC3);)

那么我们修改 后处理函数为

base::Status YoloPostProcess::runV5V6() {// data, img_data 就是输入和输出的指针,将图像从c,h,w转为h,w,c device::Tensor* tensor = inputs_[0]->getTensor();float* data = (float*)tensor->getPtr();int batch = tensor->getBatch();int channel = tensor->getChannel();int height = tensor->getHeight();int width = tensor->getWidth();
NNDEPLOY_LOGE("batch:%d, channel:%d, height:%d, width:%d. (%f,%f,%f))\n", batch,  channel, height, width, data[0], data[1], data[2]);
cv::Mat* dst = outputs_[0]->getCvMat();
NNDEPLOY_LOGE("mat  channel:%d, height:%d, width:%d.\n", dst->channels(),   dst->rows, dst->cols);auto* img_data = (float*)dst->data;for (int h = 0; h < height; h++){for (int w = 0; w < width; w++){for (int c = 0; c < 3; c++){int in_index = h * width * 3 + w * 3 + c;int out_index = c * width * height + h * width + w;// if (w < 10)//   if(h < 10)//     printf("%.2f,", data[out_index]);img_data[in_index] = data[out_index];}}// if(h < 10)//   printf("\n");}return base::kStatusCodeOk;
}

前处理也是同样的道理。

4. 总结

前后处理都完成后,进重新编译,得到的./install/lib/demo_nndeploy_detect 就是处理 UNET类型的输入输出了, 不能处理目标检测网络了,目标检测的输入是 uint8 image, 输出的是一系列目标框,对应的前后处理都是不同的。
1080P的图像, 在我训练的降噪model(未量化)上 基于openvino在 amd的Ryzen Embedded上可以跑到30-60ms。
降噪前后对比:降噪最重要是不损失细节且可以提升清晰度。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

相关文章:

部署系列六基于nndeploy的深度学习 图像降噪unet部署

文章目录 1.直接在源代码demo中修改2. 如何修改呢&#xff1f;3. 修改 graph4. 总结 https://github.com/DeployAI/nndeploy https://nndeploy-zh.readthedocs.io/zh/latest/introduction/index.html 通过以上2个官方链接对nndeploy基本的使用方法应该有所了解了。 下面就是利用…...

使用 ClickHouse 做日志分析

原作&#xff1a;Monika Singh & Pradeep Chhetri 这是我们在 Monitorama 2022 上发表的演讲的改编稿。您可以在此处找到包含演讲者笔记的幻灯片和此处的视频。 当 Cloudflare 的请求抛出错误时&#xff0c;信息会记录在我们的 requests_error 管道中。错误日志用于帮助解…...

华为ospf路由协议防环和次优路径中一些难点问题分析

第一种情况是ar3的/0/0/2口和ar4的0/0/2口发布在区域1时&#xff0c;当ar1连接ar2的线断了以后&#xff0c;骨干区域就断了&#xff0c;1.1.1.1到2.2.2.2就断了&#xff0c;ping不通了。但ar5和ar6可以ping通2.2.2.2和1.1.1.1&#xff0c;ar3和ar4不可以ping通2.2.2.2和1.1.1.1…...

python-opencv划痕检测-续

python-opencv划痕检测-续 这次划痕检测&#xff0c;是上一次划痕检测的续集。 处理的图像如下&#xff1a; 这次划痕检测&#xff0c;我们经过如下几步: 第一步&#xff1a;读取灰度图像 第二步&#xff1a;进行均值滤波 第三步&#xff1a;进行图像差分 第四步&#xff1…...

c++[string实现、反思]

我的码云 我的string码云 分析总结 1.项目结构 所有的类和函数需要在namespace中实现&#xff0c;要和string高度对应 private:char* _str;//字符串size_t _size;//有效长度size_t _capacity;//总空间&#xff0c;包括\0const static size_t npos-1;2.定义变量 <1> 所…...

c++版本opencv计算灰度图像的轮廓点

代码 #include<iostream> #include<opencv.hpp>int main() {std::string imgPath("D:\\prostate_run\\result_US_20230804_141531\\mask\\us\\104.bmp");cv::Mat imgGray cv::imread(imgPath, 0);cv::Mat kernel cv::getStructuringElement(cv::MORPH…...

【05】ES6:函数的扩展

一、函数参数的默认值 ES6 允许为函数的参数设置默认值&#xff0c;即直接写在参数定义的后面。 1、基本用法 默认值的生效条件 不传参数&#xff0c;或者明确的传递 undefined 作为参数&#xff0c;只有这两种情况下&#xff0c;默认值才会生效。 注意&#xff1a;null 就…...

Ubuntu20.04安装搜狗输入法

1、安装包下载 搜狗输入法linux-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://shurufa.sogou.com/linux点击立即下载&#xff0c;根据自己的硬件选择deb安装包。 2、输入法安装 当第一步完成以后&#xff0c;页面会自动跳转至搜狗的安装…...

linux的基础命令

文章目录 linux的基础命令一、linux的目录结构&#xff08;一&#xff09;Linux路径的描述方式 二、Linux命令入门&#xff08;一&#xff09;Linux命令基础格式 三、ls命令&#xff08;一&#xff09;HOME目录和工作目录&#xff08;二&#xff09;ls命令的参数1.ls命令的-a选…...

linux查询某个进程使用的内存量

linux查询某个进程使用的内存量 查进程用的内存&#xff0c;查看进程占用的内存量&#xff0c;centos查询内存使用 查某个进程id使用的内存量 ps -p 24450 -o rss | awk {print int($1/1024)"MB"} 该命令的含义是&#xff1a; ps -p 24450: 查找进程ID为24450的进…...

list的总结

目录 1.什么是list 1.1list 的优势和劣势 优势&#xff1a; 劣势&#xff1a; 2.构造函数 2.1 default (1) 2.2 fill (2) 2.3 range (3) 2.4 copy (4) 3.list iterator的使用 3.1. begin() 3.2. end() 3.3迭代器遍历 4. list容量函数 4.1. empty() 4.2. siz…...

c语言数字转圈

数字转圈 题干输入整数 N&#xff08;1≤N≤9&#xff09;&#xff0c;输出如下 N 阶方阵。 若输入5显示如下方阵&#xff1a; * 1** 2** 3** 4** 5* *16**17**18**19** 6* *15**24**25**20** 7* *14**23**22**21** 8* *13**12**11**10** 9*输入样例3输出样例* 1*…...

Apache Superset数据分析平台如何实现公网实时远程访问数据【内网穿透】

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…...

HarmonyOS应用开发实战—登录页面【ArkTS】

文章目录 本页面实战效果预览图一.HarmonyOS应用开发1.1HarmonyOS 详解1.2 ArkTS详解二.HarmonyOS应用开发实战—登录页面【ArkTS】2.1 ArkTS页面源码2.2 代码解析2.3 心得本页面实战效果预览图 一.HarmonyOS应用开发 1.1HarmonyOS 详解 HarmonyOS(鸿蒙操作系统)是华为公司…...

@RequestMapping

目录 作用&#xff1a; 位置&#xff1a; 属性 1.value 2.method 3.params 4.header 作用&#xff1a; 该注解是一个用来处理请求地址映射的注解。 位置&#xff1a; 可用于映射一个请求或一个方法&#xff0c;可以用在类或方法上。 用于方法上&#xff0c;表示在类的…...

操作系统 应用题 例题+参考答案(考研真题)

1.&#xff08;考研真题&#xff09;一个多道批处理系统中仅有P1和P2两个作业&#xff0c;P2比P1晚5ms到达&#xff0c;它们的计算和I/O操作顺序如下。 P1&#xff1a;计算60ms&#xff0c;I/O 80ms&#xff0c;计算20ms。 P2&#xff1a;计算120ms&#xff0c;I/O 40ms&…...

免费获取GPT-4的五种工具

不可否认&#xff0c;由OpenAI带来的GPT-4已是全球最受欢迎的、功能最强大的大语言模型&#xff08;LLM&#xff09;之一。大多数人都需要使用ChatGPT Plus的订阅服务去访问GPT-4。为此&#xff0c;他们通常需要每月支付20美元。那么问题来了&#xff0c;如果您不想每月有这笔支…...

XTU OJ 1146 矩阵乘法学习笔记

原题 题目描述 给你两个矩阵A(n*k),B(k*m),请求A*B。 输入 第一行是一个整数K&#xff0c;表示样例的个数。 每个样例包含两个矩阵A和B。 每个矩阵的第一行是两个整数n,m,(1≤n,m≤10)表示矩阵的行和列 以后的n行&#xff0c;每行m个整数&#xff0c;每个整数的绝对值不超过…...

基于官方YOLOv4开发构建目标检测模型超详细实战教程【以自建缺陷检测数据集为例】

本文是关于基于YOLOv4开发构建目标检测模型的超详细实战教程&#xff0c;超详细实战教程相关的博文在前文有相应的系列&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a;《基于yolov7开发实践实例分割模型超详细教程》 《YOLOv7基于自己的数据集从零构建模型完整训练、…...

1、Docker概述与安装

相关资源网站&#xff1a; ● docker官网&#xff1a;http://www.docker.com ● Docker Hub仓库官网: https://hub.docker.com/ 注意&#xff0c;如果只是想看Docker的安装&#xff0c;可以直接往下拉跳转到Docker架构与安装章节下的Docker具体安装步骤&#xff0c;一步步带你安…...

RPC项目

KrpcProvider的Run()整体理解服务端&#xff08;RPC Provider&#xff09;将自身提供的「服务 方法」注册到 ZooKeeper&#xff1b;客户端&#xff08;RPC Consumer&#xff09;调用服务前&#xff0c;先去 ZooKeeper 查对应「服务方法」绑定的 IP:Port&#xff1b;客户端拿到…...

7个技巧彻底释放你的硬件潜能:原神帧率解锁工具深度解析

7个技巧彻底释放你的硬件潜能&#xff1a;原神帧率解锁工具深度解析 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 当你的显卡和显示器都支持144Hz甚至更高刷新率&#xff0c;而游戏却被…...

AUTOSAR 架构如何赋能汽车功能安全:机制、实战与代码实现【深度长文】

目录 核心前提:功能安全与AUTOSAR的核心关联 第一部分:AUTOSAR 架构赋能汽车功能安全的核心机制(底层逻辑全解析) 1.1 硬件层:功能安全的物理基础(故障防护的第一道防线) 1.1.1 硬件冗余设计(适配ASIL C/D级要求) 1.1.2 硬件故障检测与上报机制 1.1.3 硬件级安全…...

用Open3D处理点云数据?从“灯.pcd”开始你的第一个3D数据分析项目

用Open3D处理点云数据&#xff1a;从“灯.pcd”开启3D分析实战 当你第一次面对三维点云数据时&#xff0c;那种密密麻麻的坐标点阵可能让人望而生畏。但别担心&#xff0c;Open3D就像给你的3D数据配了一副智能眼镜——它能将这些抽象的数字转化为可视化的立体世界。今天我们就用…...

从天线设计到声学分析:手把手教你用Python贝塞尔函数解决5个经典工程问题

从天线设计到声学分析&#xff1a;手把手教你用Python贝塞尔函数解决5个经典工程问题 在工程实践中&#xff0c;圆柱对称问题和波动现象无处不在——从微波天线的辐射模式到声学换能器的指向特性&#xff0c;从光纤中的光场分布到机械振动膜的模态分析。这些看似迥异的场景背后…...

别再手动算积分了!用MATLAB integral函数搞定这6种‘奇葩’积分(含分段、无穷限)

别再手动算积分了&#xff01;用MATLAB integral函数搞定这6种‘奇葩’积分&#xff08;含分段、无穷限&#xff09; 在科研计算和工程仿真中&#xff0c;积分问题就像隐藏在数据背后的幽灵——当你在信号处理中分析频谱特性时&#xff0c;在物理建模中求解场分布时&#xff0c…...

碧蓝航线自动化助手:5步轻松实现24/7智能托管

碧蓝航线自动化助手&#xff1a;5步轻松实现24/7智能托管 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为碧蓝航线的重…...

Java项目Loom化实战:3步完成Spring WebFlux与虚拟线程深度整合(含生产级架构图)

第一章&#xff1a;Java项目Loom响应式编程转型指南Project Loom 为 Java 带来了轻量级虚拟线程&#xff08;Virtual Threads&#xff09;和结构化并发模型&#xff0c;与响应式编程范式&#xff08;如 Project Reactor 或 R2DBC&#xff09;并非互斥&#xff0c;而是可协同演进…...

R语言实战:5分钟用KEGGREST包搞定人类代谢通路基因列表(附完整代码与Rdata文件)

R语言实战&#xff1a;5分钟用KEGGREST包搞定人类代谢通路基因列表&#xff08;附完整代码与Rdata文件&#xff09; 在生物信息学研究中&#xff0c;快速获取可靠的基因列表是许多分析流程的第一步。无论是进行富集分析、构建代谢网络&#xff0c;还是简单的数据探索&#xff0…...

【路由器配置-路由表配置】

路由器配置-路由表配置 一、路由来源二、配置 一、路由来源 优先级数字越小越优先。 1.直连路由&#xff1a;接口配了 IP 并 UP&#xff0c;自动生成&#xff0c;优先级最高&#xff08;0&#xff09;。 2.静态路由&#xff08;Static&#xff09;&#xff1a;手动配置&#x…...