第二十一周:Mask R-CNN

Mask R-CNN

  • 摘要
  • Abstract
  • 文章信息
  • 研究动机
  • Mask RCNN
    • RoIPool与RoIAlign
  • 双线性插值
  • Mask Branch(FCN)
  • 其他细节
    • Mask RCNN损失
    • Mask分支预测
  • 网络搭建
  • 创新点与不足
  • 总结

摘要

本篇博客介绍了Mask R-CNN,这是一种用于实例分割的模型,能够在目标检测的基础上实现像素级分割。其核心思想是在Faster R-CNN框架中引入一个并行的Mask分支,同时完成目标检测(分类和边界框回归)和实例分割(像素级掩码生成)。针对Faster R-CNN中RoIPool导致的特征图与原始图像空间不对齐问题,Mask R-CNN提出了RoIAlign技术,通过双线性插值消除量化误差,显著提升了分割精度。此外,Mask分支采用全卷积网络(FCN)结构,能够高效地生成目标的二值掩码。但Mask R-CNN也存在一些不足,如计算复杂度高、对小目标分割效果有限、数据需求高等。未来的改进方向包括优化模型效率(如轻量化设计)、提升小目标分割能力(如引入多尺度特征融合)以及探索无监督或弱监督学习方法以降低数据标注成本。

Abstract

This blog introduces Mask R-CNN, a model designed for instance segmentation that achieves pixel-level segmentation on top of object detection. Its core idea is to introduce a parallel Mask branch into the Faster R-CNN framework, enabling simultaneous object detection (classification and bounding box regression) and instance segmentation (pixel-level mask generation). To address the misalignment issue between feature maps and the original image caused by RoIPool in Faster R-CNN, Mask R-CNN proposes RoIAlign, which eliminates quantization errors through bilinear interpolation, significantly improving segmentation accuracy. Additionally, the Mask branch adopts a Fully Convolutional Network (FCN) structure, efficiently generating binary masks for targets. However, Mask R-CNN also has some limitations, such as high computational complexity, limited effectiveness in segmenting small objects, and high data requirements. Future improvements may include optimizing model efficiency (e.g., lightweight design), enhancing small object segmentation (e.g., multi-scale feature fusion), and exploring unsupervised or weakly supervised learning methods to reduce data annotation costs.


文章信息

Title:Mask R-CNN
Author:Kaiming He, Georgia Gkioxari, Piotr Dollar, Ross Girshick
Source:https://arxiv.org/abs/1703.06870


研究动机

在 Mask R-CNN提出之前,计算机视觉领域中的目标检测和语义分割任务的效果都取得了明显提升。语义分割是在不区分实例的情况下对每个像素进行分类。而实例分割既是语义分割,又是一种检测的形式,其目标是将每个像素分类为一类固定的类别,而不区分对象。本文为了实现简洁、快速的实例分割,将目标检测方法与语义分割方法相结合,使用目标检测来得到边界框并对边界框中的目标进行分类,再对每个边界框中的物体进行像素级分类(生成二值掩码)。

Mask RCNN

The method, called Mask R-CNN, extends Faster R-CNN by adding a branch for predicting an object mask in parallel with the existing branch for bounding box recognition.

Mask RCNN是在Faster RCNN的基础上添加一个掩码分支(FCN),用于预测每个感兴趣区域(ROI)上的分割掩码,与现有的分类和边界框回归分支并行。掩模分支是应用于每个RoI的小FCN,预测像素级的分割掩码。
在这里插入图片描述
上图是Mask RCNN网络的框架图,其中“class box”所在分支是是Faster RCNN,下面的分支扩展的掩码分支。与Faster RCNN的的区别除了添加了掩码分支外,原本的RoIPool被替换成了RoIAlign,这可以减少定位误差,二者具体对比见下文。
另外,文中给出了两种结构的Mask分支,一种是打击FPN的,一种是不带的。结构如下:
在这里插入图片描述
不带FPN结构的mask分支与 class、box 分支共用 RoIAlign 部分。
而不带FPN结构的mask分支与class、box分支不共用RoIAlign部分。在训练过程中,对于class, box分支RoIAlign将RPN(Region Proposal Network)得到的Proposals池化到7x7大小,而对于Mask分支RoIAlign将Proposals池化到14x14大小。

RoIPool与RoIAlign

Faster R-CNN was not designed for pixel-to-pixel alignment between network inputs and outputs. This is most evident in how RoIPool, the de facto core operation for attending to instances, performs coarse spatial quantization for feature extraction.

在 Faster RCNN 中,用到的是RoIPool操作,其将RPN得到的Proposal池化到固定大小。这个过程在计算中涉及取整操作,导致定位有偏差(Mask RCNN论文中称为misalignment问题)。
下面以一个例子说明RoIPool的计算流程。
在这里插入图片描述
假设通过RPN得到了一个Proposal,它在原图上的左上角坐标是(10,10),右下角的坐标是 ( 124 , 124 ) ,对应要映射的特征层相对原图的步距为32,要求通过RoIPool得到的输出大小为 2 × 2 2\times 2 2×2,具体步骤如下:

  1. 将proposal映射到特征层上,左上角计算为 ( 10 32 , 10 32 ) (\frac {10}{32},\frac {10}{32}) (3210,3210),四舍五入取整的左上角坐标为 ( 0 , 0 ) (0,0) (0,0),右下角计算为 ( 124 32 , 124 32 ) (\frac {124}{32},\frac {124}{32}) (32124,32124),四舍五入取整的右下角坐标为 ( 4 , 4 ) (4,4) (4,4)。映射到特征图上为上面的黑色框部分(第0到第4行,第0到第4列)
  2. 因为RoIPool的期望输出大小为 2 × 2 2\times 2 2×2,但第一步映射到特征图上的大小为 5 × 5 5\times 5 5×5,不能均分,所以划分后的区域又大又小。如上图所示的划分方法,每个区域的大小都不一样。
  3. 对第二步划分后的每个区域中实施maxpool操作,得到固定大小的输出,如上图蓝色区域。

其中,第一步在计算proposal映射到特征图和第二步按输出对特征图上的proposal划分区域时都涉及取整操作,可能导致定位结果有偏差,进而影响后续的检测效果。
为了解决这个问题,Mask RCNN的作者提出了用RoIAlign来代替原本的RoIPool,以获得更精确的定位信息。
RoIAlign 的计算过程其实与RoIPool相似,但其计算位置和划分区域时并不进行取整,在最后计算输出时用双线性插值法。
为方便说明二者的差别,还是以上面的假设为例,说明RoIAlign的计算过程:

在这里插入图片描述
采样率是指每个子区域采样点的个数,为方便说明这里设置为1.

  1. 将proposal映射到特征层上,左上角坐标为 ( 10 32 , 10 32 ) (\frac {10}{32},\frac {10}{32}) (3210,3210),写成小数为 ( 0.3125 , 0.3125 ) (0.3125,0.3125) (0.3125,0.3125),不进行四舍五入,同理,右下角坐标映射为 ( 3.875 , 3.875 ) (3.875,3.875) (3.875,3.875)。得到的映射图为图中大的蓝色框区域。
  2. 因为RoIPool的期望输出大小为 2 × 2 2\times 2 2×2,所以将映射的Proposal划分为2x2四个子区域,是对映射区域的均分,不使用四舍五入取整,得到的结果入图中蓝色区域中的划分。
  3. 为每个字区域分配采样点,采样点需均匀分布在子区域内。这里设置每个子区域采样一个点,即子区域的中心点。计算每个子区域中每个采样点的值(具体是用双线性插值方法计算),每个子区域内所有样本点的均值作为此子区域的输出。

RoIAlign整个计算过程中不涉及取整操作,所以其得到的特征图与原始图像得以高度对齐。
在这里插入图片描述

作者也在文中提到,将RoIPool替换成RoIAlign后,分割的Mask准确率相对提升了10%到50%(见下图d),并且将预测Mask和class进行了解耦,解耦后也带来了很大的提升(见下图b)。

双线性插值

双线性插值(bilinear interpolation),又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。在数字图像和音频处理领域都有应用。

在图像处理中,双线性插值法考虑围绕未知像素的计算位置的 2 × 2 2\times 2 2×2 最近邻域的已知像素。然后对这4个像素进行加权平均,以得出其最终的内插值。
现对双线性插值的公式进行推导:
如下图,已知P的位置,求其像素值, 已知相邻 2 × 2 2\times 2 2×2 的像素区域对应位置和像素值,其中坐下角像素区域标号为11,左上角像素区域标号为12,右下角像素区域标号为21,右上角像素区域标号为22。
双线性插值
Q是对应像素的中心点
双线性插值计算
双线性插值其实就是目标像素值相邻四个像素的像素值加权和值。
在这里插入图片描述
当目标元素与某个相邻元素的距离越近,目标元素元素与该相邻像素的对角像素组成的矩形框面积大小就越大,该相邻像素对应的权重值就越大。

Mask Branch(FCN)

Mask分支分为带FPN和不带FPN两种,下图中左边是不带RPN的,右边是带RPN的,图中灰色部分为原Faster R-CNN预测box, class信息的分支,白色部分为Mask分支。
Mask分支
实际应用中,带FPN的Mask分支较常见,下图为其详细结构:
在这里插入图片描述
FCN是对每个像素针对每个类别都会预测一个分数,然后通过softmax得到每个类别的概率(不同类别之间存在竞争关系),哪个概率高就将该像素分配给哪个类别。但在Mask R-CNN中,作者将预测Mask和class进行了解耦,即对输入的RoI针对每个类别都单独预测一个Mask,最终根据box, cls分支预测的classes信息来选择对应类别的Mask(不同类别之间不存在竞争关系)。作者说解耦后带来了很大的提升。
另外还需要注意一个细节:训练网络的时候输入Mask分支的目标是由RPN提供的,即Proposals,但在预测的时候输入Mask分支的目标是由Fast R-CNN提供的(即预测的最终目标)。并且训练时采用的Proposals全部是Fast R-CNN阶段匹配到的正样本。

其他细节

Mask RCNN损失

Mask R-CNN的损失就是在Faster R-CNN的基础上加上了Mask分支上的损失,即:
在这里插入图片描述
Mask分支上的损失就是二值交叉熵损失(Binary Cross Entropy)。
如下图所示,假设通过RPN得到了一个Proposal(图中黑色的矩形框),通过RoIAlign后得到对应的特征信息(shape为14x14xC),接着通过Mask Branch预测每个类别的Mask信息得到图中的logits(logits通过sigmoid激活函数后,所有值都被映射到0至1之间,是网络预测的输出)。通过Fast R-CNN分支正负样本匹配过程我们能够知道该Proposal的GT类别为猫(cat),所以将logits中对应类别猫的预测mask(shape为28x28)提取出来。然后根据Proposal在原图对应的GT上裁剪并缩放到28x28大小,得到图中的GT mask(对应目标区域为1,背景区域为0)。最后计算logits中预测类别为猫的mask与GT mask的BCELoss(BinaryCrossEntropyLoss)即可。
在这里插入图片描述

Mask分支预测

在真正预测推理的时候,输入Mask分支的目标是由Fast R-CNN分支提供的。
在这里插入图片描述
如上图所示,首先,通过Fast R-CNN分支生成目标的边界框信息和类别预测结果。随后,将这些边界框信息输入到Mask分支中,生成目标的logits(未归一化的概率值)。根据Fast R-CNN分支提供的类别信息,从logits中提取出对应类别的Mask(形状为28x28,经过sigmoid激活函数处理后,其值范围在0到1之间)。接下来,使用双线性插值将Mask缩放到与预测边界框相同的尺寸,并将其映射到原始图像中的对应区域。为了将Mask转换为二值图,设定一个阈值(通常为0.5),将大于阈值的区域标记为前景,其余区域标记为背景。最终,对于每个检测到的目标,可以在原始图像中绘制出其边界框、类别标签以及对应的Mask信息。

网络搭建

  1. 骨干网络搭建,使用 ResNet50 作为骨干网络,并结合 FPN(Feature Pyramid Network)提取多尺度特征。
class Backbone(nn.Module):def __init__(self):super(Backbone, self).__init__()# 加载预训练的 ResNet50resnet = resnet50(pretrained=True)# 提取 ResNet 的前四个阶段(去掉最后的全连接层和平均池化层)self.layer0 = nn.Sequential(resnet.conv1, resnet.bn1, resnet.relu, resnet.maxpool)self.layer1 = resnet.layer1self.layer2 = resnet.layer2self.layer3 = resnet.layer3self.layer4 = resnet.layer4def forward(self, x):# 提取多尺度特征c1 = self.layer0(x)  # [batch_size, 256, H/4, W/4]c2 = self.layer1(c1)  # [batch_size, 512, H/8, W/8]c3 = self.layer2(c2)  # [batch_size, 1024, H/16, W/16]c4 = self.layer3(c3)  # [batch_size, 2048, H/32, W/32]return c1, c2, c3, c4
  1. 搭建FPN(Feature Pyramid Network),用于生成多尺度的特征金字塔。
class FPN(nn.Module):def __init__(self, in_channels_list, out_channels):super(FPN, self).__init__()# 定义 lateral 和 output 卷积层self.lateral_convs = nn.ModuleList()self.output_convs = nn.ModuleList()for in_channels in in_channels_list:self.lateral_convs.append(nn.Conv2d(in_channels, out_channels, kernel_size=1))self.output_convs.append(nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1))def forward(self, c1, c2, c3, c4):# 自顶向下生成特征金字塔p4 = self.lateral_convs[3](c4)  # [batch_size, 256, H/32, W/32]p3 = self.lateral_convs[2](c3) + F.interpolate(p4, scale_factor=2, mode="nearest")  # [batch_size, 256, H/16, W/16]p2 = self.lateral_convs[1](c2) + F.interpolate(p3, scale_factor=2, mode="nearest")  # [batch_size, 256, H/8, W/8]p1 = self.lateral_convs[0](c1) + F.interpolate(p2, scale_factor=2, mode="nearest")  # [batch_size, 256, H/4, W/4]# 对每个金字塔层进行输出卷积p4 = self.output_convs[3](p4)p3 = self.output_convs[2](p3)p2 = self.output_convs[1](p2)p1 = self.output_convs[0](p1)return p1, p2, p3, p4
  1. 搭建RPN(Region Proposal Network),用于生成候选区域。
class RPN(nn.Module):def __init__(self, in_channels, num_anchors):super(RPN, self).__init__()# 定义 RPN 的卷积层self.conv = nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1)# 定义分类头和回归头self.cls_logits = nn.Conv2d(in_channels, num_anchors, kernel_size=1)self.bbox_pred = nn.Conv2d(in_channels, num_anchors * 4, kernel_size=1)def forward(self, x):# 前向传播x = self.conv(x)logits = self.cls_logits(x)  # 分类分数bbox_deltas = self.bbox_pred(x)  # 边界框偏移量return logits, bbox_deltas
  1. 搭建RoIAlign(Region of Interest Align),用于将候选区域映射到固定大小的特征图。
class RoIAlign(nn.Module):def __init__(self, output_size):super(RoIAlign, self).__init__()self.output_size = output_sizedef forward(self, features, rois):# 使用 RoIAlign 操作return ops.roi_align(features, rois, self.output_size)
  1. 搭建Head Network(头部网络),包括分类头、边界框回归头和掩码头。
class RoIAlign(nn.Module):def __init__(self, output_size):super(RoIAlign, self).__init__()self.output_size = output_sizedef forward(self, features, rois):# 使用 RoIAlign 操作return ops.roi_align(features, rois, self.output_size)
class MaskRCNNHead(nn.Module):def __init__(self, in_channels, num_classes):super(MaskRCNNHead, self).__init__()# 定义卷积层self.conv1 = nn.Conv2d(in_channels, 256, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(256, 256, kernel_size=3, padding=1)self.conv3 = nn.Conv2d(256, 256, kernel_size=3, padding=1)# 定义输出卷积层self.mask_pred = nn.Conv2d(256, num_classes, kernel_size=1)def forward(self, x):# 前向传播x = torch.relu(self.conv1(x))x = torch.relu(self.conv2(x))x = torch.relu(self.conv3(x))masks = self.mask_pred(x)  # 掩码预测return masks
  1. 完整的Mask RCNN模型:
class MaskRCNN(nn.Module):def __init__(self, num_classes):super(MaskRCNN, self).__init__()# Backbone + FPNself.backbone = Backbone()self.fpn = FPN(in_channels_list=[256, 512, 1024, 2048], out_channels=256)# RPNself.rpn = RPN(in_channels=256, num_anchors=9)# RoIAlignself.roi_align = RoIAlign(output_size=7)# Head Networkself.fast_rcnn_head = FastRCNNHead(in_channels=256, num_classes=num_classes)self.mask_rcnn_head = MaskRCNNHead(in_channels=256, num_classes=num_classes)def forward(self, x):# 提取特征c1, c2, c3, c4 = self.backbone(x)p1, p2, p3, p4 = self.fpn(c1, c2, c3, c4)# RPN 生成候选区域rpn_logits, rpn_bbox_deltas = self.rpn(p4)# RoIAlignrois = self.generate_rois(rpn_bbox_deltas)  # 生成候选区域roi_features = self.roi_align(p4, rois)# Head Networkcls_logits, bbox_deltas = self.fast_rcnn_head(roi_features)masks = self.mask_rcnn_head(roi_features)return cls_logits, bbox_deltas, masksdef generate_rois(self, bbox_deltas):# 生成候选区域(这里简化实现)return torch.rand(10, 4)  # 假设生成 10 个候选区域

创新点与不足

Mask RCNN在Faster R-CNN的基础上增加了一个并行的Mask分支,用于生成每个目标的像素级分割掩码,实现了目标检测与实例分割的统一框架。用RoIAlign替代RoIPool,解决了特征图与原始图像之间的空间不对齐问题,显著提升了分割精度。另外,Mask分支的计算开销小,且模型设计灵活,可扩展至其他任务(如人体姿态估计、关键点检测)。
但由于增加了Mask分支和RoIAlign操作,推理速度较慢,难以满足实时性要求高的场景。而且对于小目标或密集目标,Mask分支的分割精度可能下降,尤其是当目标边界不清晰时。

总结

Mask R-CNN通过结合目标检测和像素级分割,实现了高效的实例分割,其核心创新在于引入Mask分支和RoIAlign层。Mask R-CNN的实现流程分为以下几个步骤:首先,通过主干网络(如ResNet-FPN)提取多尺度特征图;接着,利用区域建议网络(RPN)生成候选区域;然后,通过RoIAlign技术将候选区域映射到特征图上,并提取固定大小的特征;最后,分别通过分类分支、回归分支和Mask分支生成目标的类别、边界框和像素级掩码。尽管存在计算复杂度高、对小目标处理能力有限等不足,但其高精度和灵活性使其在计算机视觉领域得到了广泛应用。后续研究(如PointRend、CondInst等)针对其不足进行了进一步优化,推动了实例分割技术的发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7854.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows本地部署(DeepSeek-R1-Distill-Qwen-1.5B)模型

文章目录 Windows本地部署(DeepSeek-R1-Distill-Qwen-1.5B)模型本机环境运行环境安装安装 WSL2,启用linux 系统进入linux 系统后,安装以下软件安装 Anaconda3安装 CUDA安装 pip创建虚拟环境并安装 vllm 模型下载模型运行部署模型测…

Java 大视界 -- Java 大数据在元宇宙中的关键技术与应用场景(65)

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

【QT】 控件 -- 显示类

🔥 目录 [TOC]( 🔥 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 🔥 1. 前言 之前我在上一篇文章【QT】…

大数据之路:阿里巴巴大数据实践(1)

第一章 总述 第二章 日志采集 2.1 浏览器的页面日志采集 览器的页面型产品/服务的日志采集可分为如下两大类 (1)页面浏览(展现)日志采集。顾名思义,页面浏览日志是指:一个页面被浏览器加载呈现时采集的日…

定时器按键tim_key模版

低优先级放在高优先级内势必是程序卡死 把高优先级放到低优先级内,会使程序卡死 可修改 Debuger调试方法 Pwm rcc #include "my_main.h" uint8_t led_sta0x10; char text[30]; void LED_Disp(uint8_t dsLED) {HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPI…

Linux的权限和一些shell原理

目录 shell的原理 Linux权限 sudo命令提权 权限 文件的属性 ⽂件类型: 基本权限: chmod改权限 umask chown 该拥有者 chgrp 改所属组 最后: 目录权限 粘滞位 shell的原理 我们广义上的Linux系统 Linux内核Linux外壳 Linux严格…

【ComfyUI专栏】ComfyUI 部署Kolors

什么是Kolors?我相信一定会有朋友可能第一次听说这个生图的模型,开始我也很难想象,这竟然是快手推出的可灵AI的项目,我们可以直接利用模型来生成图片和视频。 大家可以通过直接访问可灵AI的网址获取到可灵的项目,但是对于我们来说我们需要基于ComfyUI来生成必要的图片和视…

vue3+elementPlus之后台管理系统(从0到1)(day4-完结)

面包屑 创建一个面包屑组件 将路由导入然后格式化map对象 key-value 将当前路由的key和value获取然后存入list数组中 遍历list数据&#xff0c;渲染内容 <!--BreadcrumbCom.vue--> <template><el-breadcrumb separator">"><el-breadcrum…

非根目录部署 nextjs 项目,资源文件 请求404 的问题

最近在学习next项目编写的代码放到服务器上静态资源404 先分析问题 到服务器上查看是有资源目录的是不是项目配置有问题是不是nginx配置有问题 经过排查1和2是没有问题的目前来看只有3 检查一下nginx配置 尝试着把静态资源的配置禁用 问题解决 我的next项目用的是pm2管理…

【Leetcode刷题记录】15.三数之和

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。 请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三…

豆包 MarsCode + 开源 = ?AI 助力开源社区新人成长

来源&#xff5c;豆包 MarsCode “开源” 这个词&#xff0c;对开发者来说&#xff0c;可能是入门时的第一步&#xff0c;也可能是追求极致技术的终点。无数优秀的开源项目不仅推动了技术的进步&#xff0c;也成为开发者学习和成长的宝藏&#xff0c;但同时也因为其规模庞大、代…

【Linux】IPC:匿名管道、命名管道、共享内存

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、管道2、进程池3、命名管道4、共享内存 1、管道 我们知道进程具有独立性&#xff0c;但是在一些场景中进程间也需要通信&#…

python生成图片和pdf,快速

1、下载安装 pip install imgkit pip install pdfkit2、wkhtmltopdf工具包&#xff0c;下载安装 下载地址&#xff1a;https://wkhtmltopdf.org/downloads.html 3、生成图片 import imgkit path_wkimg rD:\app\wkhtmltopdf\bin\wkhtmltoimage.exe # 工具路径&#xff0c;安…

location的使用规则

1、基于URL的location 负责均衡配置 后端集群中的web服务器&#xff0c;必须要有对应的目录和文件才能被访问到 http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream default_pool {server 10.0.0.7:…

ComfyUI实现老照片修复——AI修复老照片(ComfyUI-ReActor / ReSwapper)解决天坑问题及加速pip下载

AI修复老照片&#xff0c;试试吧&#xff0c;不一定好~~哈哈 2023年4月曾用过ComfyUI&#xff0c;当时就感慨这个工具和虚幻的蓝图很像&#xff0c;以后肯定是专业人玩的。 2024年我写代码去了&#xff0c;AI做图没太关注&#xff0c;没想到&#xff0c;现在ComfyUI真的变成了工…

基于C++的DPU医疗领域编程初探

一、大型医院数据处理困境与 DPU 的崛起 在数字化浪潮的席卷下,医疗行业正经历着深刻变革,大型医院作为医疗服务的核心枢纽,积累了海量的数据,涵盖患者的基本信息、诊断记录、检验报告、影像资料等多个维度。这些数据不仅规模庞大,而且增长速度迅猛,传统的中央处理器(C…

C#新语法

目录 顶级语句&#xff08;C#9.0&#xff09; using 全局using指令&#xff08;C#10.0&#xff09; using资源管理问题 using声明&#xff08;C#8.0&#xff09; using声明陷阱 错误写法 正确写法 文件范围的命名空间声明&#xff08;C#10.0&#xff09; 可空引用类型…

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel

WPF基础 | WPF 布局系统深度剖析&#xff1a;从 Grid 到 StackPanel 一、前言二、Grid 布局&#xff1a;万能的布局王者2.1 Grid 布局基础&#xff1a;构建网格世界2.2 子元素定位与跨行列&#xff1a;布局的精细操控2.3 自适应布局&#xff1a;灵活应变的秘诀 三、StackPanel…

基于微信小程序的网上订餐管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

网盘资源查找工具---AI功能

01 软件介绍 这是一款融入了ai技术的网盘搜索神器&#xff0c;可以让你更快&#xff0c;更精准的找到自己需要的文件&#xff0c;不管你是找影视&#xff0c;音乐&#xff0c;还是找软件或者学习资料都可以&#xff0c;欢迎前来使用。 02 功能展示 该软件非常简洁&#xff…