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

【变化检测】基于ChangeStar建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下:

1、LEVIR-CD数据集介绍及下载
2、运行环境安装
3、ChangeStar模型训练与预测
4、Onnx运行及可视化

运行环境:Python=3.8,torch1.12.0+cu113,onnxruntime-gpu=1.12.0
likyoo变化检测源码:https://github.com/likyoo/open-cd
使用情况:代码风格属于openmmlab那套,通过修改配置文件config进行模型选择和训练、环境配置简单、训练速度一般。
训练资源消耗:默认参数配置,且batch_size为8时,显存占用11G左右,RTX4080迭代40000大概1.5小时。
ONNX推理:显存占用2G左右,RTX4080推理耗时约68ms

1 LEVIR-CD数据集介绍

1.1 简介

LEVIR-CD 由 637 个超高分辨率(VHR,0.5m/像素)谷歌地球(GE)图像块对组成,大小为 1024 × 1024 像素。这些时间跨度为 5 到 14 年的双时态图像具有显着的土地利用变化,尤其是建筑增长。LEVIR-CD涵盖别墅住宅、高层公寓、小型车库、大型仓库等各类建筑。在这里,我们关注与建筑相关的变化,包括建筑增长(从土壤/草地/硬化地面或在建建筑到新的建筑区域的变化)和建筑衰退。这些双时态图像由遥感图像解释专家使用二进制标签(1 表示变化,0 表示不变)进行注释。我们数据集中的每个样本都由一个注释者进行注释,然后由另一个进行双重检查以生成高质量的注释。
数据来源:https://justchenhao.github.io/LEVIR/
论文地址:https://www.mdpi.com/2072-4292/12/10/1662
快速下载链接:https://aistudio.baidu.com/datasetdetail/104390/1

1.2 示例

在这里插入图片描述

2 运行环境安装

2.1 基础环境安装

【超详细】跑通YOLOv8之深度学习环境配置1-Anaconda安装
【超详细】跑通YOLOv8之深度学习环境配置2-CUDA安装

创建Python环境及换源可借鉴如下:
【超详细】跑通YOLOv8之深度学习环境配置3-YOLOv8安装

2.2 likyoo变化检测代码环境安装

2.2.1 代码下载

Git:git clone https://github.com/likyoo/open-cd.git
在这里插入图片描述

2.2.2 环境安装
# 1 创建环境
conda create -n likyoo python=3.8
conda activate likyoo# 2 安装torch
# 方式1:
conda install pytorch==1.12.0 torchvision==0.13.0 torchaudio==0.12.0 cudatoolkit=11.3 -c pytorch
# 方式2:
pip install torch==1.12.0+cu113 torchvision==0.13.0+cu113 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu113# 3 验证torch安装是否为gpu版
import torch
print(torch.__version__)  # 打印torch版本
print(torch.cuda.is_available())  # True即为成功
print(torch.version.cuda)
print(torch.backends.cudnn.version())# 4 安装其他依赖库
cd ./open-cd-main# 4.1 安装 OpenMMLab 相关工具
pip install -U openmim
mim install mmengine
mim install "mmcv==2.0.0"
mim install "mmpretrain>=1.0.0rc7"  # (本地安装版本为1.2.0)
pip install "mmsegmentation==1.2.2"
pip install "mmdet==3.0.0"# 4.2 编译安装open-cd
pip install -v -e .# 5 可能缺少的库
pip install ftfy

3 ChangeStar模型训练与预测

3.1 ChangeStar模型介绍

3.1.1 简介

在这里插入图片描述

摘要:对于高空间分辨率(HSR)遥感图像,基于双时相的监督学习在利用大量双时相图像进行变化检测时总是占据主导地位。然而,对于大规模的双时相HSR遥感图像进行双时相标注是昂贵且耗时的。在这篇论文中,我们从利用未配对图像中的对象变化作为监督信号的角度提出了单时相监督学习(STAR)方法,用于变化检测。STAR使我们仅使用未配对标注图像就能训练出高精度的变化检测器,并推广到现实世界的双时相图像。为了评估STAR的有效性,我们设计了一个简单但有效的变化检测器,称为ChangeStar,它可以通过ChangeMixin模块重用任何深度语义分割架构。全面的实验结果表明,在单时相监督下,ChangeStar在与基线的比较中表现出明显的优势,在双时相监督下实现了更优越的性能。代码可在https://github.com/Z-Zheng/ChangeStar上获取。
论文地址:https://arxiv.org/abs/2108.07002
主要贡献包括

  1. 提出单时相监督学习(STAR):为了解决高空间分辨率(HSR)遥感图像变化检测中成对标记图像的昂贵和耗时问题,论文提出了一种新的单时相监督学习方法。这种方法利用未成对图像中的对象变化作为监督信号,从而训练出高精度的变化检测器。
  2. 设计ChangeStar变化检测器:论文设计了一个简单但有效的变化检测器ChangeStar,它可以通过ChangeMixin模块重用任何深度语义分割架构。这使得ChangeStar能够在不进行特定架构设计的情况下,利用现有的优秀语义分割架构来辅助变化检测。
  3. 探索时序对称性:为了进一步稳定学习过程,论文探索并利用了时序对称性这一归纳偏置,以减轻未成对图像中缺少位置一致性条件导致的过拟合问题。
  4. 实验验证:通过在两个HSR遥感建筑变化检测数据集上的实验,论文证明了ChangeStar在单时相监督和双时相监督下的性能都优于基线方法。
3.1.2 模型结构

在这里插入图片描述

3.1.3 实验结果

在这里插入图片描述

3.2 模型训练与预测

3.2.1 修改训练配置文件

(1)选择训练配置
在这里插入图片描述

(2)修改configs\common\standard_256x256_40k_levircd.py
关键修改:输入数据集路径data_root一定要对!!!
batch_size和迭代数量等按自己需要调整,预测为1024大小。
在这里插入图片描述

3.2.2 模型训练与测试
# 训练,--config配置文件+保存文件夹名
python tools/train.py configs/changestar/changestar_farseg_1x96_256x256_40k_levircd.py --work-dir ./work_dirs/changestar# 测试==》得到评价指标
python tools/test.py configs/changestar/changestar_farseg_1x96_256x256_40k_levircd.py  ./work_dirs/changestar/iter_40000.pth

在这里插入图片描述

3.2.3 结果显示
# 测试==》得到结果图
python tools/test.py configs/changestar/changestar_farseg_1x96_256x256_40k_levircd.py  ./work_dirs/changestar/iter_40000.pth --show-dir tmp_infer

在这里插入图片描述

4 Onnx运行及可视化

4.1 Onnx导出静态和动态文件

【特别注意】:该模型有两个输出,因此导出代码需进行适当修改和调整!!!
调整如下(结果见netron结构可视化):
在这里插入图片描述

(1)修改tools/export.py脚本,导出onnx,复制如下内容【修改了输入尺寸和增加一个动态onnx导出】:

# Copyright (c) Open-CD. All rights reserved.
import argparse
import loggingimport torch
from mmengine import Config
from mmengine.registry import MODELS, init_default_scopelogging.basicConfig(level=logging.INFO)
logger = logging.getLogger('opencd')def main(args):# must be called before using opencdinit_default_scope('opencd')config_path = args.configcheckpoint_path = args.checkpointinputs = args.inputsmodel_name = args.model_namemodel_name_dy = args.model_name_dyconfig = Config.fromfile(config_path, import_custom_modules=True)model = MODELS.build(config.model)ckpt = torch.load(checkpoint_path)state_dict = ckpt['state_dict']model.load_state_dict(state_dict, strict=True)model.eval()input_shape0 = tuple(map(int, inputs[0].split(',')))input_shape1 = tuple(map(int, inputs[1].split(',')))input0 = torch.rand(input_shape0)input1 = torch.rand(input_shape1)images = torch.concat((input0, input1), dim=1).to(args.device)model.to(args.device)# 导出静态onnxtorch.onnx.export(model,(images),model_name,input_names=['images'],output_names=['output1', 'output2'],verbose=False,opset_version=11,)# 导出动态onnxtorch.onnx.export(model,(images),model_name_dy,input_names=['images'],output_names=['output1', 'output2'],verbose=False,opset_version=11,dynamic_axes={"images": {0 :"batch_size", 2: "input_height", 3: "input_width"},"output1": {0 :"batch_size", 2: "output_height", 3: "output_width"},"output2": {0 :"batch_size", 2: "output_height", 3: "output_width"}})if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--config', '-c', type=str, default='')parser.add_argument('--checkpoint', '-m', type=str, default='')parser.add_argument('--device', type=str, default='cpu')parser.add_argument('--inputs','-i',type=str,nargs='+',default=['1,3,1024,1024', '1,3,1024,1024'])parser.add_argument('--model-name', '-mn', type=str, default='model.onnx')parser.add_argument('--model-name_dy', '-mndy', type=str, default='model_dy.onnx')args = parser.parse_args()logger.info(args)main(args)

运行命令如下【结果生成两个onnx文件】:

# 注意报错ValueError: SyncBatchNorm expected input tensor to be on GPU
# 解决措施:device选择GPU进行导出
python tools/export.py --config configs/changestar/changestar_farseg_1x96_256x256_40k_levircd.py --checkpoint ./work_dirs/changestar/iter_40000.pth  --device cuda:0

(2)查看模型结构
https://netron.app/
静态onnx
在这里插入图片描述

动态onnx
在这里插入图片描述

注意:其中的[1,6,1024,1024]表示两个[1,3,1024,1024]堆叠一起输入,输出有两个,推理模式三种,默认t1t2即输出output1,t2t1即输出output2,mean即取两者均值。

4.2 Onnx运行及可视化

4.2.1 Onnx推理运行

注意:由于LEVIR-CD图像为1024*1024大小,输入改成1024输入。

import os
import cv2
import time
import argparse
import numpy as np
import onnxruntime as ort  # 使用onnxruntime推理用上,pip install onnxruntime-gpu -i https://pypi.tuna.tsinghua.edu.cn/simpleclass CD(object):def __init__(self, onnx_model, in_shape=1024):self.in_shape = in_shape  # 图像输入尺度self.mean = [0.485, 0.456, 0.406]  # 定义均值和标准差(确保它们与图像数据的范围相匹配)  self.std = [0.229, 0.224, 0.225]  # 基于0-1范围的# 构建onnxruntime推理引擎self.ort_session = ort.InferenceSession(onnx_model,providers=['CUDAExecutionProvider', 'CPUExecutionProvider']if ort.get_device() == 'GPU' else ['CPUExecutionProvider'])# 归一化 def normalize(self, image, mean, std):  # 如果均值和标准差是基于0-255范围的图像计算的,那么需要先将图像转换为0-1范围  image = image / 255.0  image = image.astype(np.float32)  image_normalized = np.zeros_like(image)  for i in range(3):  # 对于 RGB 的每个通道  image_normalized[:, :, i] = (image[:, :, i] - mean[i]) / std[i]  return image_normalizeddef preprocess(self, img_a, img_b):# resize为1024大小if img_a.shape[0] != self.in_shape and img_a.shape[1] != self.in_shape:img_a = cv2.resize(img_a, (self.in_shape, self.in_shape), interpolation=cv2.INTER_LINEAR)if img_b.shape[0] != self.in_shape and img_b.shape[1] != self.in_shape:img_b = cv2.resize(img_b, (self.in_shape, self.in_shape), interpolation=cv2.INTER_LINEAR)# 应用归一化  img_a = self.normalize(img_a, self.mean, self.std)img_b = self.normalize(img_b, self.mean, self.std)img_a = np.ascontiguousarray(np.einsum('HWC->CHW', img_a)[::-1], dtype=np.single)  # (1024, 1024, 3)-->(3, 1024, 1024), BGR-->RGBimg_b = np.ascontiguousarray(np.einsum('HWC->CHW', img_b)[::-1], dtype=np.single)  # np.single 和 np.float32 是等价的img_a = img_a[None] if len(img_a.shape) == 3 else img_a  # (1, 3, 1024, 1024)img_b = img_b[None] if len(img_b.shape) == 3 else img_bconcat_img = np.concatenate((img_a, img_b), axis=1) return  concat_img# 推理def infer(self, img_a, img_b):concat_img = self.preprocess(img_a, img_b)  # (1024, 1024, 3)+(1024, 1024, 3) --> (1, 6, 1024, 1024)preds = self.ort_session.run(None, {self.ort_session.get_inputs()[0].name: concat_img})[0]  # (1, 1, 256, 256) if preds.shape[1] == 1:out_img = (np.clip(preds[0][0], 0, 1) * 255).astype("uint8") out_img = cv2.resize(out_img, (img_a.shape[1], img_a.shape[0]))else:out_img = (np.argmax(preds, axis=1)[0] * 255).astype("uint8")return out_imgif __name__ == '__main__':# Create an argument parser to handle command-line argumentsparser = argparse.ArgumentParser()parser.add_argument('--model', type=str, default='weights/model_dy.onnx', help='Path to ONNX model')parser.add_argument('--source_A', type=str, default=str('E:/datasets/LEVIR-CD/test/A/test_7.png'), help='A期图像')parser.add_argument('--source_B', type=str, default=str('E:/datasets/LEVIR-CD/test/B/test_7.png'), help='B期图像')parser.add_argument('--in_shape', type=int, default=1024, help='输入模型图像尺度')args = parser.parse_args()# 实例化变化检测模型cd= CD(args.model, args.in_shape)# Read image by OpenCVimg_a = cv2.imread(args.source_A)img_b = cv2.imread(args.source_B)# 推理+输出t1 = time.time()out = cd.infer(img_a, img_b)print('推理耗时:{}'.format(time.time() - t1))# 保存结果cv2.imwrite('./result/test_7_res.png', out)
4.2.2 结果可视化

在这里插入图片描述

4.2.3 进一步处理:

(1)可加入腐蚀膨胀处理,消除一些小白点等区域;
(2)将变化区域绘制在第二期图上,便于观察;

相关文章:

【变化检测】基于ChangeStar建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下: 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、ChangeStar模型训练与预测 4、Onnx运行及可视化 运行环境:Python3.8,torch1.12.0cu113,onnxruntime-gpu1.12.0 likyoo变化检测源码:https://github.c…...

kafka动态认证 自定义认证 安全认证-亲测成功

kafka动态认证 自定义认证 安全认证-亲测成功 背景 Kafka默认是没有安全机制的,一直在裸奔。用户认证功能,是一个成熟组件不可或缺的功能。在0.9版本以前kafka是没有用户认证模块的(或者说只有SSL),好在kafka0.9版本…...

航空航司reese84逆向

reese84逆向 Reese84 是一种用于保护网站防止自动化爬虫抓取的防护机制,尤其是在航空公司网站等需要严格保护数据的平台上广泛使用。这种机制通过复杂的指纹识别和行为分析技术来检测和阻止非人类的互动。例如,Reese84 可以通过分析访问者的浏览器指纹、…...

【HTTP】请求“报头”,Referer 和 Cookie

Referer 描述了当前这个页面是从哪里来的(从哪个页面跳转过来的) 浏览器中,直接输入 URL/点击收藏夹打开的网页,此时是没有 referer。当你在 sogou 页面进行搜索时,新进入的网页就会有 referer 有一个非常典型的用…...

使用sqoop报错

报错一: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf 这个错误表示在执行与 Hive 相关的操作时,程序无法找 org.apache.hadoop.hive.conf.HiveConf 这个类。这个类是 Hive 的配置类,它用…...

一个简单的基于C语言的HTTP代理服务器的案例

一个简单的基于C语言的HTTP代理服务器的案例。这个代理服务器可以接收客户端的HTTP请求&#xff0c;并将请求转发到目标服务器&#xff0c;然后将服务器的响应返回给客户端。 1. 代理服务器的主要代码 #include <stdio.h> #include <stdlib.h> #include <stri…...

Linux学习-Ansible(二)

基本配置 #主机清单文件 [rootharbor ansible]# cat hostlist [web] 192.168.29.161 192.168.29.162 [es] 192.168.29.171 192.168.29.172 192.168.29.173 #查看所有被管理的主机 [rootharbor ansible]# ansible all --list-hostshosts (5):192.168.29.161192.168.29.162192.1…...

[SDX35]SDX35硬件使用512MB内存,实际只初始化256MB问题分析及解决方案

SDX35 SDX35介绍 SDX35设备是一种多模调制解调器芯片,支持 4G/5G sub-6 技术。它是一个4nm芯片专为实现卓越的性能和能效而设计。它包括一个 1.9 GHz Cortex-A7 应用处理器。 SDX35主要特性 ■ 3GPP Rel. 17 with 5G Reduced Capability (RedCap) support. Backward compati…...

S3C2440中断

一、中断执行的流程 soc中断的执行流程 1、中断源发生中断请求 2、CPU检查该中断是否被屏蔽&#xff0c;以及总中断是否被屏蔽 3、考察中断优先级 4、保护现场 5、执行中断服务函数 6、恢复现场 二、中断初始化 1、设置中断模式&#xff08;INTMOD&#xff09;寄存器(…...

编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MinGW版)

参考 GitHub - thecodemonkey86/qt_mysql_driver: Typical symptom: QMYSQL driver not loaded. Solution: get pre-built Qt SQL driver plug-in required to establish a connection to MySQL / MariaDB using Qt. Download qsqlmysql.dll binaries built from official Qt …...

SQLyou基础用法讲解

文章目录 SQLyog 基础知识讲解 1. 数据定义语言 (DDL)创建数据库创建表修改表删除表 2. 数据操作语言 (DML)插入数据批量插入数据更新数据条件更新删除数据条件删除 3. 数据查询语言 (DQL)查询数据查询所有数据使用排序使用聚合函数分组查询使用 HAVING 子句 4. 事务5. 索引创建…...

Can‘t get Kerberos realm

近期封装Ozone客户端&#xff0c;需要走kerberos登陆&#xff0c;遇到了一个问题&#xff0c;花了很长时间解决。记录一下&#xff0c;跟网上能搜到的解决方案不大一样。 先看有问题的代码 Configuration config new Configuration();ConfigurationUtils.setHadoopConfig(conf…...

[python]从零开始的PySide安装配置教程

一、PySide是什么&#xff1f; PySide 是 Qt for Python 项目的一部分&#xff0c;它提供了与 PyQt 类似的功能&#xff0c;使开发者能够使用 Python 编程语言来构建基于 Qt 的图形用户界面 (GUI) 应用程序。PySide 是由 Qt 公司官方维护的&#xff0c;而 PyQt 则是由第三方开发…...

LeetCode[中等] 74.搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…...

overleaf如何下载论文的pdf

用overleaf写完英文论文后&#xff0c;要将论文保存为PDF格式 点击图片中的下载按钮 然后选择一个路径保存论文的PDF格式即可。...

Java 每日一刊(第13期):this super static

“优秀的代码不仅仅是给机器看的&#xff0c;更是给人看的。” 前言 这里是分享 Java 相关内容的专刊&#xff0c;每日一更。 本期将为大家带来以下内容&#xff1a; this 关键字super 关键字static 关键字 this 关键字 this 关键字是 Java 中最常见的关键字之一&#xf…...

关于一些Spring的配置的作用

文章目录 spring.profiles.activejmx.default-domainmain.allow-bean-definition-overridingmain.allow-circular-referencescloud.nacoscloud.nacos.configcloud.nacos.shared-configsmvc.pathmatch.matching-strategy spring:profiles:active: ${config.profile}# include…...

利用Python与Ansible实现高效网络配置管理

利用Python与Ansible实现高效网络配置管理 在当今复杂多变的网络环境中&#xff0c;自动化配置管理工具成为了IT运维团队不可或缺的工具。Python以其强大的编程能力和丰富的库支持&#xff0c;结合Ansible这一流行的自动化运维工具&#xff0c;能够极大地提升网络配置管理的效…...

JDBC技术在不同数据库系统中的兼容性及Java数据库交互技术概览

目录 1. JDBC技术在不同数据库系统中的兼容性 2. 除了JDBC&#xff0c;还有哪些技术可以实现Java与数据库的交互&#xff1f; 3. 结论 在Java应用程序中&#xff0c;数据库交互是一个核心功能。Java Database Connectivity (JDBC) 是实现这一功能的标准技术之一。然而&#…...

双击热备 Electron网页客户端

安装流程&#xff1a; 1.下载node.js安装包进行安装 2.点击Next; 3.勾选&#xff0c;点击Next; 4.选择安装目录 5.选择Online 模式 6.下一步执行安装 。 7.运行cmd,执行命令 path 和 node --version&#xff0c;查看配置路径和版本 8.Goland安装插件node.js 9.配置运行…...

indel_snp_ssr_primer

indel标记使用 1.得到vcf文件 2.提取指定区域vcf文件并压缩构建索引 bcftools view -r <CHROM>:<START>-<END> input.vcf -o output.vcf bgzip -c all.filtered.indel.vcf > all.filtered.indel.vcf.gz tabix -p vcf all.filtered.indel.vcf.gz3.准备参…...

关于无法下载Qt离线安装包的说明

不知道出于什么原因考虑&#xff0c;Qt官方目前不提供离线的安装包下载&#xff0c;意味着网上各种文章提供的各种下载地址都失效了&#xff0c;会提示Download from your IP address is not allowed&#xff0c;当然目前可以在线安装&#xff0c;但是据说只提供了从5.15开始的…...

NLua性能对比:C#注册函数 vs 纯Lua实现

引言 在NLua开发中&#xff0c;我们常面临一个重要选择&#xff1a;将C#函数注册到Lua环境调用&#xff0c;还是直接在Lua中实现逻辑&#xff1f; 直觉告诉我们&#xff0c;C#作为编译型语言性能更高&#xff0c;但跨语言调用的开销是否会影响整体性能&#xff1f;本文通过基准…...

Rust 开发的一些GUI库

最近考虑用Rust干点什么&#xff0c;于是搜集了下资料——根据2025年最新调研结果和社区实践&#xff0c;Rust GUI库生态已形成多个成熟度不同的解决方案。以下是当前主流的GUI库分类及特点分析&#xff0c;结合跨平台支持、开发体验和实际应用场景进行综合评估&#xff1a; 一…...

3D建模的全景图谱:从55个工具到元宇宙的数字革命

3D建模已从专业工程师的工具箱演变为全民创作的数字语言。从代码驱动的精确建模到AI自动生成纹理&#xff0c;从开源协作到程序化生成城市&#xff0c;技术正重塑我们创造虚拟世界的方式。本文将系统解析55个核心3D建模工具/插件&#xff0c;涵盖在线编辑器、开源软件、程序化生…...

(25年5.28)ChatGPT Plus充值教程与实用指南:附国内外使用案例与模型排行

更多具体来源&#xff1a;查看原文 ChatGPT Plus 充值教程 由于国内卡无法直接充值 chatgpt&#xff0c;通常需要借助虚拟卡。目前咱们常用的方式是通过虚拟卡平台获取。因平台审核要求这里不细说&#xff0c;具体看原文。 ChatGPT Plus主要使用方向 ChatGPT Plus 提供了更…...

MySQL数据高效集成到金蝶云星空的技术分享

MySQL数据集成到金蝶云星空的技术案例分享&#xff1a;SR新建调拨单内部供应商-深圳天一 在企业信息化系统中&#xff0c;数据的高效流动和准确对接是实现业务流程自动化的关键。本文将聚焦于一个具体的系统对接集成案例——将MySQL中的数据集成到金蝶云星空&#xff0c;以支持…...

K8S Pod调度方法实例

以下是一篇面向企业用户、兼具通俗易懂和实战深度的 Kubernetes Pod 调度方法详解博文大纲与正文示例。全文采用“图文&#xff08;代码块&#xff09;并茂 问答穿插 类比”方式&#xff0c;模拟了真实终端操作及输出&#xff0c;便于读者快速上手。 一、引言 为什么要关注 P…...

OpenCV CUDA模块图像过滤------创建一个 Scharr 滤波器函数createScharrFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于创建一个 Scharr 滤波器&#xff08;基于 CUDA 加速&#xff09;&#xff0c;用于图像的一阶导数计算。它常用于边缘检测任务中&#…...

Java 大视界 -- 基于 Java 的大数据分布式存储在视频会议系统海量视频数据存储与回放中的应用(263)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...