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

PyTorch框架——基于深度学习EfficientDeRain神经网络AI去雨滴图像增强系统

第一步:EfficientDeRain介绍

        EfficientDeRain 是一个针对单张图像去雨的开源项目,该项目由清华大学的研究团队提出,主要用于处理图像中的雨水干扰,恢复图像的真实场景

核心功能

        图像去雨:EfficientDeRain 通过学习像素级的膨胀滤波,有效去除图像中的雨水干扰,恢复清晰图像。
        高效率:项目设计考虑到了效率,能够在较短的时间内处理大量图像,适用于需要快速处理的应用场景。
        可扩展性:项目提供了多种数据集的预训练模型,支持自定义数据集的训练,方便用户根据具体需求进行优化。

第二步:LYT-Net网络结构

        该算法的原理非常简单,最重要的思想是把去雨看为图像的逐像素滤波问题。而滤波操作是高度优化的操作,在GPU上的实现必定非常快。

看懂下面这张图,即可完全理解作者的算法思想:

        图像经深度卷积网络学习逐像素的卷积核参数,然后与原图做卷积即得最终的去雨后图像,训练的时候需要(有雨、无雨)的图像对。

        作者指出,尽管上述思想没有问题,但因为逐像素卷积核大小的问题,如果只学习普通卷积核(即每个像素预测三个通道的3x(3x3)个参数)如上图中的(a)部分,对于雨条较大的图像很难取得满意的效果,因为毕竟卷积的过程是寻找周围非雨条像素赋以高权重的加权,卷积核如果没有覆盖到非雨条像素,肯定效果不好。

        为在尺度上应对大雨条,所以作者做了改进,让神经网络预测多尺度的空洞卷积核,如(b)子图中是预测4个尺度的空洞卷积核,空洞卷积后再把结果加权,获得最终的去雨图像。

        所以算法的核心思路可总结为:学习多尺度空洞卷积+图像加权融合

第三步:模型代码展示

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np# ----------------------------------------
#         Initialize the networks
# ----------------------------------------
def weights_init(net, init_type = 'normal', init_gain = 0.02):"""Initialize network weights.Parameters:net (network)   -- network to be initializedinit_type (str) -- the name of an initialization method: normal | xavier | kaiming | orthogonalinit_gain (float)    -- scaling factor for normal, xavier and orthogonalIn our paper, we choose the default setting: zero mean Gaussian distribution with a standard deviation of 0.02"""def init_func(m):classname = m.__class__.__name__if hasattr(m, 'weight') and classname.find('Conv') != -1:if init_type == 'normal':torch.nn.init.normal_(m.weight.data, 0.0, init_gain)elif init_type == 'xavier':torch.nn.init.xavier_normal_(m.weight.data, gain = init_gain)elif init_type == 'kaiming':torch.nn.init.kaiming_normal_(m.weight.data, a = 0, mode = 'fan_in')elif init_type == 'orthogonal':torch.nn.init.orthogonal_(m.weight.data, gain = init_gain)else:raise NotImplementedError('initialization method [%s] is not implemented' % init_type)elif classname.find('BatchNorm2d') != -1:torch.nn.init.normal_(m.weight.data, 1.0, 0.02)torch.nn.init.constant_(m.bias.data, 0.0)# apply the initialization function <init_func>print('initialize network with %s type' % init_type)net.apply(init_func)# ----------------------------------------
#      Kernel Prediction Network (KPN)
# ----------------------------------------
class Basic(nn.Module):def __init__(self, in_ch, out_ch, g=16, channel_att=False, spatial_att=False):super(Basic, self).__init__()self.channel_att = channel_attself.spatial_att = spatial_attself.conv1 = nn.Sequential(nn.Conv2d(in_channels=in_ch, out_channels=out_ch, kernel_size=3, stride=1, padding=1),# nn.BatchNorm2d(out_ch),nn.ReLU(),nn.Conv2d(in_channels=out_ch, out_channels=out_ch, kernel_size=3, stride=1, padding=1),# nn.BatchNorm2d(out_ch),nn.ReLU(),nn.Conv2d(in_channels=out_ch, out_channels=out_ch, kernel_size=3, stride=1, padding=1),# nn.BatchNorm2d(out_ch),nn.ReLU())if channel_att:self.att_c = nn.Sequential(nn.Conv2d(2*out_ch, out_ch//g, 1, 1, 0),nn.ReLU(),nn.Conv2d(out_ch//g, out_ch, 1, 1, 0),nn.Sigmoid())if spatial_att:self.att_s = nn.Sequential(nn.Conv2d(in_channels=2, out_channels=1, kernel_size=7, stride=1, padding=3),nn.Sigmoid())def forward(self, data):"""Forward function.:param data::return: tensor"""fm = self.conv1(data)if self.channel_att:# fm_pool = F.adaptive_avg_pool2d(fm, (1, 1)) + F.adaptive_max_pool2d(fm, (1, 1))fm_pool = torch.cat([F.adaptive_avg_pool2d(fm, (1, 1)), F.adaptive_max_pool2d(fm, (1, 1))], dim=1)att = self.att_c(fm_pool)fm = fm * attif self.spatial_att:fm_pool = torch.cat([torch.mean(fm, dim=1, keepdim=True), torch.max(fm, dim=1, keepdim=True)[0]], dim=1)att = self.att_s(fm_pool)fm = fm * attreturn fmclass KPN(nn.Module):def __init__(self, color=True, burst_length=1, blind_est=True, kernel_size=[5], sep_conv=False,channel_att=False, spatial_att=False, upMode='bilinear', core_bias=False):super(KPN, self).__init__()self.upMode = upModeself.burst_length = burst_lengthself.core_bias = core_biasself.color_channel = 3 if color else 1in_channel = (3 if color else 1) * (burst_length if blind_est else burst_length+1)out_channel = (3 if color else 1) * (2 * sum(kernel_size) if sep_conv else np.sum(np.array(kernel_size) ** 2)) * burst_lengthif core_bias:out_channel += (3 if color else 1) * burst_length# 各个卷积层定义# 2~5层都是均值池化+3层卷积self.conv1 = Basic(in_channel, 64, channel_att=False, spatial_att=False)self.conv2 = Basic(64, 128, channel_att=False, spatial_att=False)self.conv3 = Basic(128, 256, channel_att=False, spatial_att=False)self.conv4 = Basic(256, 512, channel_att=False, spatial_att=False)self.conv5 = Basic(512, 512, channel_att=False, spatial_att=False)# 6~8层要先上采样再卷积self.conv6 = Basic(512+512, 512, channel_att=channel_att, spatial_att=spatial_att)self.conv7 = Basic(256+512, 256, channel_att=channel_att, spatial_att=spatial_att)self.conv8 = Basic(256+128, out_channel, channel_att=channel_att, spatial_att=spatial_att)self.outc = nn.Conv2d(out_channel, out_channel, 1, 1, 0)self.kernel_pred = KernelConv(kernel_size, sep_conv, self.core_bias)self.conv_final = nn.Conv2d(in_channels=12, out_channels=3, kernel_size=3, stride=1, padding=1)# 前向传播函数def forward(self, data_with_est, data, white_level=1.0):"""forward and obtain pred image directly:param data_with_est: if not blind estimation, it is same as data:param data::return: pred_img_i and img_pred"""conv1 = self.conv1(data_with_est)conv2 = self.conv2(F.avg_pool2d(conv1, kernel_size=2, stride=2))conv3 = self.conv3(F.avg_pool2d(conv2, kernel_size=2, stride=2))conv4 = self.conv4(F.avg_pool2d(conv3, kernel_size=2, stride=2))conv5 = self.conv5(F.avg_pool2d(conv4, kernel_size=2, stride=2))# 开始上采样  同时要进行skip connectionconv6 = self.conv6(torch.cat([conv4, F.interpolate(conv5, scale_factor=2, mode=self.upMode)], dim=1))conv7 = self.conv7(torch.cat([conv3, F.interpolate(conv6, scale_factor=2, mode=self.upMode)], dim=1))#print(conv7.size())conv8 = self.conv8(torch.cat([conv2, F.interpolate(conv7, scale_factor=2, mode=self.upMode)], dim=1))# return channel K*K*Ncore = self.outc(F.interpolate(conv8, scale_factor=2, mode=self.upMode))pred1 = self.kernel_pred(data, core, white_level, rate=1)pred2 = self.kernel_pred(data, core, white_level, rate=2)pred3 = self.kernel_pred(data, core, white_level, rate=3)pred4 = self.kernel_pred(data, core, white_level, rate=4)pred_cat = torch.cat([torch.cat([torch.cat([pred1, pred2], dim=1), pred3], dim=1), pred4], dim=1)pred = self.conv_final(pred_cat)#pred = self.kernel_pred(data, core, white_level, rate=1)return predclass KernelConv(nn.Module):"""the class of computing prediction"""def __init__(self, kernel_size=[5], sep_conv=False, core_bias=False):super(KernelConv, self).__init__()self.kernel_size = sorted(kernel_size)self.sep_conv = sep_convself.core_bias = core_biasdef _sep_conv_core(self, core, batch_size, N, color, height, width):"""convert the sep_conv core to conv2d core2p --> p^2:param core: shape: batch*(N*2*K)*height*width:return:"""kernel_total = sum(self.kernel_size)core = core.view(batch_size, N, -1, color, height, width)if not self.core_bias:core_1, core_2 = torch.split(core, kernel_total, dim=2)else:core_1, core_2, core_3 = torch.split(core, kernel_total, dim=2)# output corecore_out = {}cur = 0for K in self.kernel_size:t1 = core_1[:, :, cur:cur + K, ...].view(batch_size, N, K, 1, 3, height, width)t2 = core_2[:, :, cur:cur + K, ...].view(batch_size, N, 1, K, 3, height, width)core_out[K] = torch.einsum('ijklno,ijlmno->ijkmno', [t1, t2]).view(batch_size, N, K * K, color, height, width)cur += K# it is a dictreturn core_out, None if not self.core_bias else core_3.squeeze()def _convert_dict(self, core, batch_size, N, color, height, width):"""make sure the core to be a dict, generally, only one kind of kernel size is suitable for the func.:param core: shape: batch_size*(N*K*K)*height*width:return: core_out, a dict"""core_out = {}core = core.view(batch_size, N, -1, color, height, width)core_out[self.kernel_size[0]] = core[:, :, 0:self.kernel_size[0]**2, ...]bias = None if not self.core_bias else core[:, :, -1, ...]return core_out, biasdef forward(self, frames, core, white_level=1.0, rate=1):"""compute the pred image according to core and frames:param frames: [batch_size, N, 3, height, width]:param core: [batch_size, N, dict(kernel), 3, height, width]:return:"""if len(frames.size()) == 5:batch_size, N, color, height, width = frames.size()else:batch_size, N, height, width = frames.size()color = 1frames = frames.view(batch_size, N, color, height, width)if self.sep_conv:core, bias = self._sep_conv_core(core, batch_size, N, color, height, width)else:core, bias = self._convert_dict(core, batch_size, N, color, height, width)img_stack = []pred_img = []kernel = self.kernel_size[::-1]for index, K in enumerate(kernel):if not img_stack:padding_num = (K//2) * rateframe_pad = F.pad(frames, [padding_num, padding_num, padding_num, padding_num])for i in range(0, K):for j in range(0, K):img_stack.append(frame_pad[..., i*rate:i*rate + height, j*rate:j*rate + width])img_stack = torch.stack(img_stack, dim=2)else:k_diff = (kernel[index - 1] - kernel[index]) // 2img_stack = img_stack[:, :, k_diff:-k_diff, ...]# print('img_stack:', img_stack.size())pred_img.append(torch.sum(core[K].mul(img_stack), dim=2, keepdim=False))pred_img = torch.stack(pred_img, dim=0)# print('pred_stack:', pred_img.size())pred_img_i = torch.mean(pred_img, dim=0, keepdim=False)#print("pred_img_i", pred_img_i.size())# N = 1pred_img_i = pred_img_i.squeeze(2)#print("pred_img_i", pred_img_i.size())# if bias is permittedif self.core_bias:if bias is None:raise ValueError('The bias should not be None.')pred_img_i += bias# print('white_level', white_level.size())pred_img_i = pred_img_i / white_level#pred_img = torch.mean(pred_img_i, dim=1, keepdim=True)# print('pred_img:', pred_img.size())# print('pred_img_i:', pred_img_i.size())return pred_img_iclass LossFunc(nn.Module):"""loss function of KPN"""def __init__(self, coeff_basic=1.0, coeff_anneal=1.0, gradient_L1=True, alpha=0.9998, beta=100):super(LossFunc, self).__init__()self.coeff_basic = coeff_basicself.coeff_anneal = coeff_annealself.loss_basic = LossBasic(gradient_L1)self.loss_anneal = LossAnneal(alpha, beta)def forward(self, pred_img_i, pred_img, ground_truth, global_step):"""forward function of loss_func:param frames: frame_1 ~ frame_N, shape: [batch, N, 3, height, width]:param core: a dict coverted by ......:param ground_truth: shape [batch, 3, height, width]:param global_step: int:return: loss"""return self.coeff_basic * self.loss_basic(pred_img, ground_truth), self.coeff_anneal * self.loss_anneal(global_step, pred_img_i, ground_truth)class LossBasic(nn.Module):"""Basic loss function."""def __init__(self, gradient_L1=True):super(LossBasic, self).__init__()self.l1_loss = nn.L1Loss()self.l2_loss = nn.MSELoss()self.gradient = TensorGradient(gradient_L1)def forward(self, pred, ground_truth):return self.l2_loss(pred, ground_truth) + \self.l1_loss(self.gradient(pred), self.gradient(ground_truth))class LossAnneal(nn.Module):"""anneal loss function"""def __init__(self, alpha=0.9998, beta=100):super(LossAnneal, self).__init__()self.global_step = 0self.loss_func = LossBasic(gradient_L1=True)self.alpha = alphaself.beta = betadef forward(self, global_step, pred_i, ground_truth):""":param global_step: int:param pred_i: [batch_size, N, 3, height, width]:param ground_truth: [batch_size, 3, height, width]:return:"""loss = 0for i in range(pred_i.size(1)):loss += self.loss_func(pred_i[:, i, ...], ground_truth)loss /= pred_i.size(1)return self.beta * self.alpha ** global_step * lossclass TensorGradient(nn.Module):"""the gradient of tensor"""def __init__(self, L1=True):super(TensorGradient, self).__init__()self.L1 = L1def forward(self, img):w, h = img.size(-2), img.size(-1)l = F.pad(img, [1, 0, 0, 0])r = F.pad(img, [0, 1, 0, 0])u = F.pad(img, [0, 0, 1, 0])d = F.pad(img, [0, 0, 0, 1])if self.L1:return torch.abs((l - r)[..., 0:w, 0:h]) + torch.abs((u - d)[..., 0:w, 0:h])else:return torch.sqrt(torch.pow((l - r)[..., 0:w, 0:h], 2) + torch.pow((u - d)[..., 0:w, 0:h], 2))if __name__ == '__main__':kpn = KPN().cuda()a = torch.randn(4, 3, 224, 224).cuda()b = kpn(a, a)print(b.shape)

第四步:运行

第五步:整个工程的内容

 项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷

PyTorch框架——基于深度学习EfficientDeRain神经网络AI去雨滴图像增强系统_哔哩哔哩_bilibili

相关文章:

PyTorch框架——基于深度学习EfficientDeRain神经网络AI去雨滴图像增强系统

第一步&#xff1a;EfficientDeRain介绍 EfficientDeRain 是一个针对单张图像去雨的开源项目&#xff0c;该项目由清华大学的研究团队提出&#xff0c;主要用于处理图像中的雨水干扰&#xff0c;恢复图像的真实场景 核心功能 图像去雨&#xff1a;EfficientDeRain 通过学习像素…...

写一个类模板三个模板参数K,V,M,参数是函数(函数参数、lambda传参、函数指针)

cal是类的成员函数。cal的3个入参是func1(K&#xff09;&#xff0c;func2&#xff08;K&#xff0c;V&#xff09;&#xff0c;func3(K&#xff0c;V&#xff0c;M)&#xff0c;请写出cal&#xff0c;并在main函数中调用cal 在您给出的要求中&#xff0c;cal成员函数并不直接…...

国内Ubuntu环境Docker部署Stable Diffusion入坑记录

国内Ubuntu环境Docker部署Stable Diffusion入坑记录 本文旨在记录使用dockerpython进行部署 stable-diffusion-webui 项目时遇到的一些问题&#xff0c;以及解决方案&#xff0c;原项目地址: https://github.com/AUTOMATIC1111/stable-diffusion-webui 问题一览&#xff1a; …...

现代光学基础6

总结自老师的ppt yt6 半导体激光器开卷考试学习资料 目录 半导体激光器边发射半导体激光器垂直腔面发射激光器&#xff08;VCSEL&#xff09;激光产生条件&#xff08;激光原理&#xff09;半导体激光器的水容器模型有源半导体区域类型和载流子注入发光二极管&#xff08;L…...

解决HBuilderX报错:未安装内置终端插件,是否下载?或使用外部命令行打开。

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 错误描述 在HBuilderX中执行npm run build总是提醒下载插件&#xff1b;图示如下&#xff1a; 但是&#xff0c;下载总是失败。运行项目时候依然弹出上述提醒。 解决方案 …...

基于Java的超级玛丽游戏的设计与实现【源码+文档+部署讲解】

目 录 1、绪论 1.1背景以及现状 1.2 Java语言的特点 1.3 系统运行环境及开发软件&#xff1a; 1.4 可行性的分析 1.4.1 技术可行性 1.4.2 经济可行性 1.4.3 操作可行性 2、 需求分析 2.1 用户需求分析 2.2功能需求分析 2.3界面设计需求分析…...

Spring Boot项目中使用单一动态SQL方法可能带来的问题

1. 查询计划缓存的影响 深入分析 数据库系统通常会对常量SQL语句进行编译并缓存其执行计划以提高性能。对于动态生成的SQL语句&#xff0c;由于每次构建的SQL字符串可能不同&#xff0c;这会导致查询计划无法被有效利用&#xff0c;从而需要重新解析、优化和编译&#xff0c;…...

conan从sourceforge.net下载软件失败

从sourceforge.net下载软件&#xff0c;经常会没有开始下载就返回了。 原因是&#xff1a; 自动选择的镜像站不能打开。 在浏览器中&#xff0c;我们可以手动选择站点尝试&#xff0c;但是conan就不行了。 手动选择一个站点&#xff0c;能够有文件保存窗口弹出&#xff0c;之后…...

通过爬虫方式实现视频号助手发布视频

1、将真实的cookie贴到解压后目录中cookie.txt文件里,修改python代码里的user_agent和video_path, cover_path等变量的值,最后运行python脚本即可; 2、运行之前根据import提示安装一些常见依赖,比如requests等; 3、2025年1月份最新版; 代码如下: import json import…...

springboot525基于MVC框架自习室管理和预约系统设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装自习室管理和预约系统软件来发挥其高效地信息处理的作用&am…...

“大数据+职业本科”:VR虚拟仿真实训室的发展前景

在新时代背景下&#xff0c;随着科技的飞速进步和产业结构的不断升级&#xff0c;职业教育正迎来前所未有的变革。“大数据职业本科”的新型教育模式&#xff0c;结合VR&#xff08;虚拟现实&#xff09;技术的广泛应用&#xff0c;为实训教学开辟了崭新的道路&#xff0c;尤其…...

Python 数据可视化的完整指南

目录 一、为什么选择 Python 进行数据可视化? 二、常用 Python 可视化库及其特点 三、常用图表类型及其代码示例 折线图:用于展示数据随时间或其他连续变量的变化趋势。 柱状图:用于比较不同类别的数据大小。 散点图:用于展示两个变量之间的关系,并发现数据中的模式…...

滑动窗口。

1456 定长子串中元音的最大数目 采用滑动窗口。每次移动一个位置&#xff0c;判断当前窗口内的子串内目标元素的个数&#xff0c;若比之前更大就更新结果。 如何判断是否更新结果&#xff1f;也即&#xff0c;如何判断当前窗口内所含目标元素个数&#xff0c;是否为遍历到这个…...

【Python运维】用Python和Ansible实现高效的自动化服务器配置管理

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着云计算和大规模数据中心的兴起,自动化配置管理已经成为现代IT运维中不可或缺的一部分。通过自动化,企业可以大幅提高效率,降低人为错…...

Chapter4.2:Normalizing activations with layer normalization

文章目录 4 Implementing a GPT model from Scratch To Generate Text4.2 Normalizing activations with layer normalization 4 Implementing a GPT model from Scratch To Generate Text 4.2 Normalizing activations with layer normalization 通过层归一化&#xff08;La…...

EA工具学习使用笔记 ———— 插入图片或UI

文章目录 介绍导入使用方法一方法二方法3介绍 在使用EA的过程中,我们可以EA的图像管理器自定义图像,从而创建有吸引力的图表。也可以通过图像管理器快速扩展可用图像的范围。方法是导入一个捆绑的基于uml的图像剪辑艺术集合作为图像库文件。EA的图像库下载链接为: 导入 Doc…...

[2474].第04节:Activiti官方画流程图方式

我的后端学习大纲 Activiti大纲 1.安装位置&#xff1a; 2.启动&#xff1a;...

JVM和异常

Java 虚拟机&#xff08;Java Virtual Machine&#xff0c;简称 JVM&#xff09; 概述 JVM 是运行 Java 字节码的虚拟计算机&#xff0c;它是 Java 程序能够实现 “一次编写&#xff0c;到处运行&#xff08;Write Once, Run Anywhere&#xff09;” 特性的关键所在。Java 程…...

Harmony OS开发-ArkUI框架速成四

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java相关开发、鸿蒙开发、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 1.图标库 1.1 图标库概述 HarmonyOS 图标库为 HarmonyOS 开发者提供丰富的在线图…...

卡码网 ACM答题编程模板

背景&#xff1a; input() 在 ACM 编程中的底层调用原理 1. input() 的核心原理 在 Python 中&#xff0c;input() 的底层实现依赖于标准输入流 sys.stdin。每次调用 input() 时&#xff0c;Python 会从 sys.stdin 中读取一行字符串&#xff0c;直到遇到换行符 \n 或文件结束…...

逆向入门(6)汇编篇-外挂初体验

代码分析部分 游戏里面还是体验了不少自己CV来的外挂的&#xff0c;自己编写的程序还是头一次体验&#xff0c;程序源码如下 void startAcctack() {printf("开始攻击\n");// 获取当前系统时间time_t now time(0); // 获取当前时间的时间戳struct tm *local_time …...

Vulnhub靶场(Earth)

项目地址 https://download.vulnhub.com/theplanets/Earth.ova.torrent 搭建靶机 官网下载.ova文件双击vm打开导入 获取靶机IP kail终端输入 arp-scan -l 获取靶机 IP 192.168.131.184 信息收集 端口扫描 sudo nmap -sC -sV -p- 192.168.131.184 可以看到开启22端口&…...

CSP初赛知识学习计划

CSP初赛知识学习计划 学习目标 在20天内系统掌握CSP初赛所需的计算机基础知识、编程概念、数据结构、算法等内容&#xff0c;为初赛取得优异成绩奠定坚实基础。 资料收集 整理的CSP知识点文档。相关教材&#xff0c;如《信息学奥赛一本通》等。在线编程学习平台&#xff0c…...

信息科技伦理与道德1:研究方法

1 问题描述 1.1 讨论&#xff1f; 请挑一项信息技术&#xff0c;谈一谈为什么认为他是道德的/不道德的&#xff0c;或者根据使用场景才能判断是否道德。判断的依据是什么&#xff08;自身的道德准则&#xff09;&#xff1f;为什么你觉得你的道德准则是合理的&#xff0c;其他…...

高中数学部分基础知识

文章目录 一、集合二、一元二次方程三、函数四、指数函数五、对数函数六、三角函数1、角度和弧度2、三角函数 高中知识体系丰富&#xff0c;虽然毕业后再也没用过&#xff0c;但是很多数学逻辑还是非常经典的&#xff0c;能够启发我们如何制作逻辑工具去解决现实问题。以下做出…...

机器人领域的一些仿真器

模拟工具和环境对于开发、测试和验证可变形物体操作策略至关重要。这些工具提供了一个受控的虚拟环境&#xff0c;用于评估各种算法和模型的性能&#xff0c;并生成用于训练和测试数据驱动模型的合成数据。 Bullet Physics Library 用于可变形物体模拟的一个流行的物理引擎是 B…...

5大常见高并发限流算法选型浅析

高并发场景下&#xff0c;如何确保系统稳定运行&#xff0c;成为了每一个开发工程师必须面对的挑战。**你是否曾因系统崩溃、请求超时或资源耗尽而头疼不已&#xff1f;**高并发限流算法或许能帮你解决这些难题。 在处理高并发请求时&#xff0c;应该如何选择合适的限流算法呢…...

深入刨析数据结构之排序(下)

目录 1.内部排序 1.5选择排序 1.5.1简单选择排序 1.5.2树形选择排序 1.6堆排序 1.7归并排序 1.7.1递归归并 1.7.2非递归归并 1.8计数排序 1.9基数排序 常见内部排序的总结&#xff1a; 1.内部排序 1.5选择排序 选择排序&#xff08;Selection Sort&#xff09;的基…...

特殊数据类型的深度分析:JSON、数组和 HSTORE 的实用价值

title: 特殊数据类型的深度分析:JSON、数组和 HSTORE 的实用价值 date: 2025/1/4 updated: 2025/1/4 author: cmdragon excerpt: 随着数据管理需求的多样化,许多现代数据库系统开始支持特殊数据类型,以满足更多复杂应用场景的需求。在 PostgreSQL 中,JSON、数组和 HSTOR…...

PCA降维算法详细推导

关于一个小小的PCA的推导 文章目录 关于一个小小的PCA的推导1 谱分解 (spectral decomposition)2 奇异矩阵(singular matrix)3 酉相似(unitary similarity)4 酉矩阵5 共轭变换6 酉等价7 矩阵的迹的计算以及PCA算法推导8 幂等矩阵(idempotent matrix)9 Von Neumanns 迹不等式 [w…...