新闻详情

新闻详情

首页 / 资讯中心 / 详情

图像分割做国土分类:U-Net遥感影像语义分割实战

发布时间:2026/9/28 2:48:13来源:尧图网络
图像分割做国土分类:U-Net遥感影像语义分割实战
简介这是一份基于图像分割的卫星遥感图像国土分类Python项目源码面向计算机相关专业在做课程设计、期末大作业的学生以及需要项目实战练习的开发者。项目围绕国土利用分类任务整合了数据加载、预处理、模型训练等完整流程涉及PSPNet、DeepLabV3与DeepLabV3等常用分割网络并配备了针对水陆区域的预处理脚本便于掌握遥感图像分割与分类的落地方法。资源共12个文件以8个py源码脚本为核心另含2个log训练日志、1个txt数据说明和1张png展示海报压缩包仅2.49MB结构紧凑、便于快速部署。所有源码已严格调试下载即可直接运行目前已有158人学习。相比零散教程这份源码给出从数据准备、预处理到深度模型训练与日志分析的完整链路适合直接作为课程设计基础框架也可在真实遥感数据上继续扩展调优能有效节省环境搭建和排错时间。1. 用图像分割做国土分类课程设计选它划算在哪把一张卫星遥感图输入程序输出一张和原图同尺寸的“地类图”每个像素标成耕地、林地、建筑、水体或裸地——这就是基于图像分割的卫星遥感图像国土分类一个用 Python 实现起来非常有展示度的课程设计题目。它在图像分割方向上做了最典型的像素级应用不是告诉你“图里有什么”而是告诉你“每一个点属于什么”。相比普通图像分类它有更清晰的评判标准、更直观的彩色结果图还能带出数据预处理、模型训练、可视化评估一整条工程链路。适合想在课程设计里同时体现算法理解和工程能力、又不想背太重业务包袱的人。2. 国土分类的本质是像素级分割从问题到算法选型2.1 为什么一张图一个标签不够用普通图像分类模型的输出层是一个全连接层最后给出“这张图属于哪个类”的单一标签。你输入一张农田照片它输出“农田”两个字这对相册分类、目标识别这类场景够用。但遥感影像不一样一张 1024x1024 的影像里可能有十几栋房子、几块农田、一条河、一片林子。你让分类模型用一个标签去概括整张图标注阶段就会开始打架——这块区域标成耕地还是建设用地边界上的人工地物算哪一类模型训练时也会反复震荡因为同样的影像内容换了位置标签却对不上。国土分类真正要解决的是“地图上每一个坐标点落在什么地类上”这是一个像素级预测问题也就是图像分割里的语义分割。输入是 C×H×W 的多波段影像输出是 H×W 的掩码矩阵每个像素取值 0 到 N-1N 是类别总数。类别定义一般围绕土地利用/土地覆盖展开常见的是五类耕地、林地、建设用地、水体、裸地。如果你拿到的是城市范围影像也可以把建设用地拆成房屋、道路、广场把耕地拆成水田、旱地类别越细对分割模型的压力越大课程设计的标注成本也越高。从模型结构上看普通分类网络的尾部是全局池化加全连接空间信息被压缩掉分割网络则要把特征图上采样回原图分辨率。两者不是简单换一个损失函数就能互相转换的。这也是为什么很多课程设计一开始套用分类模型做遥感识别最后发现边界一片糊——因为结构上就走错了路。2.2 分割方案哪家强U-Net 凭什么当课程设计首选图像分割算法可以分三个层次来看。第一层是传统图像处理Otsu 阈值、区域生长、K-means 聚类。Otsu 适合单波段灰度图做二类分割对“水体/非水体”这种对比强烈的场景还能用但多类别国土分类基本无能为力。K-means 不需要标注直接对光谱特征聚类能用来做无监督摸底看看影像里大致能分几类但聚类结果和真实地物的对应关系不稳定每次运行结果都可能漂移。第二层是深度学习里的经典分割网络FCN 是开山之作用卷积替代全连接但上采样倍数大时细节丢失严重。U-Net 针对这个问题做了对称编码-解码结构用跨越连接把编码器各层的细节特征拼到解码器对应层对小数据集和精细边界都更友好。第三层是更强但更重的方案比如 DeepLabV3 用空洞卷积金字塔捕捉多尺度上下文SegFormer 用 Transformer 做全局建模效果通常更好但代码量和调参复杂度也上去了。方案是否需要标注边界精细度实现成本适合场景Otsu 阈值否低很低快速摸底、二类分割K-means 聚类无监督低低光谱聚类探索FCN是中中理解分割原理U-Net是高中课程设计首选DeepLabV3是高较高想冲高指标我的建议是课程设计选 U-Net理由很实际结构清晰encoder 和 decoder 对称跳过连接一张图能讲明白参数量适中单张消费级显卡就能训对几百到几千张小 patch 的数据集能收敛不依赖任何预训练权重也能跑出一个能看的 baseline。如果你后面想拔高分数可以在同一个数据集上再跑一个 DeepLabV3 或 PSPNet 做对比实验但主体架构用 U-Net 最稳。2.3 先定类别和指标IoU 比 Accuracy 诚实动手写代码之前必须先定两件事类别清单和评估指标。类别清单决定了掩码文件的像素值定义。建议用 0 表示背景或“其他”1 到 N-1 表示具体地类同时准备一个类别到颜色的映射表例如水体蓝色、林地绿色、建设用地灰色。没有颜色映射表后面可视化预测结果时只能用灰度图答辩时观众很难一眼看清效果。评估指标是课程设计报告里最能体现专业度的地方。语义分割最常用 IoUIntersection over Union公式是IoU TP / (TP FP FN)也就是预测区域和真实区域的重叠面积除以两者并集面积。单个类别的 IoU 只能反映一类分得好不好把所有类别的 IoU 取平均得到 mIoU这是分割任务的主指标。为什么不直接看 Accuracy遥感影像里大面积的连片耕地或林地占比很高如果模型把所有像素都预测成耕地Pixel Accuracy 也能到 70% 以上看着像模像样实际上建设用地和水体全错了。IoU 对每一类都做独立计算大类占便宜、小类吃亏的问题比 Accuracy 轻得多。课程设计报告里贴 mIoU 和各类别 IoU同时附上混淆矩阵比只贴一张 loss 曲线图有说服力得多。3. 遥感图像预处理与数据集制作跑不出结果多半卡在这里3.1 用 rasterio 读多波段影像别直接转 uint8遥感影像和普通照片最大的区别是多波段和宽位深。常见的 Sentinel-2、Landsat 影像通常有多个波段单波段值域经常是 uint16也就是 0 到 65535直接用 OpenCV 的 imread 读会丢失信息因为 imread 默认按 8 位解码。我一般用 rasterio 读它原生支持多波段、地理坐标和 NoData。import rasterio import numpy as np from pathlib import Path src_path Path(data/input/landsat8.tif) with rasterio.open(src_path) as src: img src.read() # 返回 (C, H, W) profile src.profile # 保存元数据后面写结果图要用 nodata src.nodata print(影像 shape:, img.shape) # 例如 (4, 1024, 1024) print(dtype:, img.dtype) # 常见 uint16、float32 # 取前三个波段转 RGB 预览 rgb img[:3].transpose(1, 2, 0) rgb (rgb - rgb.min()) / (rgb.max() - rgb.min() 1e-9)逻辑说明src.read()返回的数组维度是 (波段数, 高, 宽)和 PyTorch 默认的 CHW 一致但不和 OpenCV 的 HWC 一致做可视化或转 numpy 时记得transpose(1, 2, 0)。归一化要用全图 min-max不要每个 patch 单独归一化否则 patch 之间的亮度标准不一致训练时模型会认为亮度是类别特征预测时换一张图就翻车。参数说明nodata要单独处理常见做法是先把 NoData 像素置为 0在掩码里也把对应位置标成背景类。如果影像本身就是 RGB 三波段且值域在 0 到 255可以省掉归一化但推荐还是转 float32 并归一化到 0 到 1能加快收敛。3.2 滑动窗口裁剪 patch256 还是 512步长怎么设大影像不能直接整张丢进网络显存不够也没有必要。常见做法是滑动窗口裁剪成固定大小的 patch再按 patch 训练。patch 尺寸选 256 还是 512取决于你的显存和地物尺度。256 对小房子、小地块更友好但感受野小容易漏掉大面积农田的上下文512 上下文更完整但显存占用约是 256 的四倍。课程设计默认 256batch size 可以开到 8 到 16GTX 1060 级别的卡也能跑。步长等于 patch 大小时是硬切patch 之间没有重叠步长小于 patch 大小时有重叠能增加样本量但也带来重复训练。import numpy as np from pathlib import Path PATCH_SIZE 256 STRIDE 256 def crop_patches(img, mask, save_dir, prefix): 把一张大图和对应的掩码同步裁剪成 patch c, h, w img.shape idx 0 for y in range(0, h, STRIDE): for x in range(0, w, STRIDE): p_img img[:, y:yPATCH_SIZE, x:xPATCH_SIZE] p_mask mask[y:yPATCH_SIZE, x:xPATCH_SIZE] if p_img.shape[1] ! PATCH_SIZE or p_img.shape[2] ! PATCH_SIZE: continue # 边缘不足一个 patch 直接丢弃 np.save(save_dir / f{prefix}_{idx}_img.npy, p_img) np.save(save_dir / f{prefix}_{idx}_mask.npy, p_mask) idx 1 # 假设 img 和 mask 已经同步读过 crop_patches(img, mask, Path(data/patches), scene_01)逻辑说明y和x同时作用于 img 和 mask保证裁剪位置一一对应。边缘不足 256 的 patch 直接跳过而不是用 padding 补零因为补零区域进入网络后会产生假边界预测时会出现黑边。两个np.save分别保存图像和掩码文件名用同一个idx关联。参数说明STRIDE设成 256 是最省事的选择样本不重叠如果数据量少可以改成 192 或 128 制造重叠 patch相当于数据增强。PATCH_SIZE从 256 提到 512 时建议 batch size 减半否则显存很容易爆。3.3 数据增强图像和掩码要同一个变换遥感影像方向不敏感水平翻转、垂直翻转、90 度旋转都是安全的增强方式因为地物不会因为翻转而改变类别。亮度和对比度扰动也常用但要小心幅度过大把水体变耕地。我一般用 albumentations它最大的好处是保证图像和掩码走同一个随机变换。import albumentations as A train_transform A.Compose([ A.HorizontalFlip(p0.5), A.VerticalFlip(p0.5), A.RandomRotate90(p0.5), A.RandomBrightnessContrast(brightness_limit0.2, contrast_limit0.2, p0.3), ]) # 假设 img 是 (H, W, C)mask 是 (H, W) aug train_transform(imagergb, maskmask) aug_img aug[image].transpose(2, 0, 1) # 转回 CHW aug_mask aug[mask]逻辑说明albumentations 的Compose接收的是 HWC 格式图像和 HW 格式掩码所以用完要转回 CHW。翻转和旋转类增强不会改变像素值分布适合所有地类亮度扰动不能太大否则原来很暗的建筑物区可能被模型识成水体或阴影。如果你用的是 PyTorch 原生的torchvision.transforms必须手动保证图像和掩码使用同一个随机种子否则增强后两者错位训练不收敛是小事可视化结果里边界错乱才是大问题。参数说明brightness_limit和contrast_limit建议控制在 0.2 以内遥感影像的光谱反射率有其物理含义增强幅度过大会引入虚假的光谱组合。要不要加高斯噪声加了能提高鲁棒性但对水体这类低纹理区域噪声容易淹没边界课程设计里可加可不加。4. 用 PyTorch 搭 U-Net 并训练课程设计最核心的一段4.1 U-Net 网络代码普通卷积块和跳过连接最关键U-Net 本质是编码器提取语义、解码器恢复分辨率、跳过连接补充细节。编码器每层包含两次卷积中间用最大池化下采样解码器用转置卷积上采样再和编码器对应层拼接。重点是torch.cat拼接的位置和通道数拼接后通道翻倍后续卷积要按翻倍后的通道数配置。import torch import torch.nn as nn class DoubleConv(nn.Module): def __init__(self, in_ch, out_ch): super().__init__() self.conv nn.Sequential( nn.Conv2d(in_ch, out_ch, 3, padding1), nn.BatchNorm2d(out_ch), nn.ReLU(inplaceTrue), nn.Conv2d(out_ch, out_ch, 3, padding1), nn.BatchNorm2d(out_ch), nn.ReLU(inplaceTrue), ) def forward(self, x): return self.conv(x) class UNet(nn.Module): def __init__(self, in_channels3, num_classes5): super().__init__() self.enc1 DoubleConv(in_channels, 64) self.enc2 DoubleConv(64, 128) self.enc3 DoubleConv(128, 256) self.enc4 DoubleConv(256, 512) self.pool nn.MaxPool2d(2) self.bottleneck DoubleConv(512, 1024) self.up4 nn.ConvTranspose2d(1024, 512, 2, stride2) self.dec4 DoubleConv(1024, 512) self.up3 nn.ConvTranspose2d(512, 256, 2, stride2) self.dec3 DoubleConv(512, 256) self.up2 nn.ConvTranspose2d(256, 128, 2, stride2) self.dec2 DoubleConv(256, 128) self.up1 nn.ConvTranspose2d(128, 64, 2, stride2) self.dec1 DoubleConv(128, 64) self.out nn.Conv2d(64, num_classes, 1) def forward(self, x): e1 self.enc1(x) e2 self.enc2(self.pool(e1)) e3 self.enc3(self.pool(e2)) e4 self.enc4(self.pool(e3)) b self.bottleneck(self.pool(e4)) d4 self.dec4(torch.cat([self.up4(b), e4], dim1)) d3 self.dec3(torch.cat([self.up3(d4), e3], dim1)) d2 self.dec2(torch.cat([self.up2(d3), e2], dim1)) d1 self.dec1(torch.cat([self.up1(d2), e1], dim1)) return self.out(d1)逻辑说明forward里每层先池化再进下一层跳跃连接拼接的是池化前的结果比如e4是enc4的输出d4解码时要把上采样后的b和e4拼起来通道数是 5125121024所以dec4第一层卷积输入是 1024 通道。最后的out用 1x1 卷积把 64 通道映射到类别数不做 softmax因为损失函数里会用CrossEntropyLoss自带 softmax。参数说明in_channels3对应 RGB 三波段如果影像不是 RGB 而是多光谱你可以把前三个波段继续当 RGB 用也可以改成in_channels波段数。第一个编码层的通道数 64 是经验值显存紧张可以改成 32但精度会下降。num_classes必须和掩码的最大值加一一致否则训练直接报错。4.2 损失函数交叉熵配 Dice类别不均衡的解法遥感分割最常见的翻车点是类别不均衡。建设用地和水体在影像里占比通常很低交叉熵损失会被耕地、林地这种大类牵着走。解决办法一是给类别加权二是叠加 Dice Loss。Dice Loss 对每个类别的预测区域和真实区域计算重叠率天然不受像素数量影响两类损失组合起来效果更稳。class DiceLoss(nn.Module): def __init__(self, smooth1.0): super().__init__() self.smooth smooth def forward(self, probs, targets): num_classes probs.shape[1] targets_onehot torch.eye(num_classes, deviceprobs.device)[targets].permute(0, 3, 1, 2) dice 0.0 for i in range(num_classes): p probs[:, i, :, :] t targets_onehot[:, i, :, :] intersection (p * t).sum() union p.sum() t.sum() dice (2 * intersection self.smooth) / (union self.smooth) return 1 - dice / num_classes class CombinedLoss(nn.Module): def __init__(self, class_weightsNone, dice_weight0.3): super().__init__() self.ce nn.CrossEntropyLoss(weightclass_weights) self.dice DiceLoss() self.dice_weight dice_weight def forward(self, logits, targets): return self.ce(logits, targets) self.dice_weight * self.dice(logits.softmax(dim1), targets)逻辑说明DiceLoss先把真实掩码转成 one-hot 格式然后对每个类别单独算 Dice 系数1 减去平均 Dice 就是损失。交叉熵部分可以直接接受 logitsDice 部分传入 softmax 后的概率因为 Dice 需要在 0 到 1 之间的概率上计算。dice_weight控制两部分的相对权重0.3 是常见起点。参数说明class_weights可以用torch.bincount统计训练集掩码里每个类别的像素占比取倒数并归一化。如果不想手动统计可以先不加权重只靠 Dice 拉一把效果通常也够。4.3 训练循环验证集算 mIoU保留最优权重训练循环本身不复杂但有两个习惯要注意一是每个 epoch 结束都要在验证集上算 mIoU而不是只看训练 loss二是只保存验证集 mIoU 最高的权重防止最后几轮过拟合把结果带坏。def evaluate(model, loader, device, num_classes5): 返回验证集 mIoU 和各类别 IoU model.eval() cm np.zeros((num_classes, num_classes), dtypenp.int64) with torch.no_grad(): for imgs, masks in loader: logits model(imgs.to(device)) pred logits.argmax(1).cpu().numpy().flatten() mask masks.numpy().flatten() cm np.bincount(mask * num_classes pred, minlengthnum_classes * num_classes).reshape(num_classes, num_classes) ious [] for i in range(num_classes): tp cm[i, i] fp cm[:, i].sum() - tp fn cm[i, :].sum() - tp ious.append(tp / (tp fp fn 1e-9)) model.train() return np.mean(ious), ious model UNet(in_channels3, num_classes5).to(device) optimizer torch.optim.Adam(model.parameters(), lr1e-4) scheduler torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, patience3) criterion CombinedLoss() best_miou 0.0 for epoch in range(30): model.train() total_loss 0.0 for imgs, masks in train_loader: imgs imgs.to(device) masks masks.to(device).long() logits model(imgs) loss criterion(logits, masks) optimizer.zero_grad() loss.backward() optimizer.step() total_loss loss.item() val_miou, val_ious evaluate(model, val_loader, device) scheduler.step(val_miou) if val_miou best_miou: best_miou val_miou torch.save(model.state_dict(), best_model.pth) print(fEpoch {epoch} | loss {total_loss / len(train_loader):.4f} | mIoU {val_miou:.4f})逻辑说明evaluate使用混淆矩阵统计每个类别的 TP、FP、FN最后统一算 IoU比在 batch 内逐次取平均更准确因为每个 batch 的类别分布不同。训练时模型处于model.train()状态验证时切到model.eval()否则 BatchNorm 在验证模式下会更新统计量导致结果抖动。ReduceLROnPlateau在验证集 mIoU 连续 3 个 epoch 不涨时降低学习率这是遥感分割里比固定学习率省心很多的设置。参数说明lr1e-4适合 Adam 配 U-Net比这个高容易震荡比这个低收敛太慢。30个 epoch 是起步小数据集上 50 到 80 个 epoch 更稳具体看验证集 mIoU 是否还在上升。如果显存不够在 DataLoader 里把batch_size从 16 调到 8而不是去调小 patch。5. 避坑遥感分割课程设计最容易翻车的 5 个地方5.1 显存不够代码还没跑起来就 OOM现象训练第一个 batch 就报CUDA out of memory或者跑到一半被系统杀掉。原因patch 太大、batch 太大、输入通道太多三者叠加直接顶爆显存。遥感影像即使裁剪到 256x256如果是 8 波段或 10 波段解码器早期层的内存占用会明显高于普通 RGB 图像。解决优先把 batch size 降到 4 或 2看能不能跑起来再不行把 patch 从 256 降到 224最后考虑只取前三个波段做输入放弃多余波段。PyTorch 的torch.cuda.amp混合精度对显存帮助很大代码只多两行课程设计里完全可以用。5.2 mIoU 一直卡在 0.1 附近不涨现象训练 loss 在下降但验证集 mIoU 始终很低预测结果基本是一团噪声。原因类别严重不均衡模型把所有像素都学成了占比最大的类别小类别完全没被优化。还有一种可能是掩码文件里类别编号不连续比如类值是 1、3、7而模型输出是 0、1、2这种情况下损失函数计算时对应关系错位训练永远学不对。解决先用np.unique(mask)检查掩码像素值确认是 0 到 N-1 的连续整数。如果是类别不均衡给CrossEntropyLoss传入class_weights或者用前面写的组合损失。还可以先把训练集里各类别的像素占比打印出来占比低于 5% 的类别重点关照。5.3 预测大图出现网格状接缝现象把预测 patch 拼回大图后边界处出现明显横竖纹地块边界在 patch 边缘断裂。原因推理时每个 patch 独立预测边缘像素看不到足够的上下文patch 和 patch 之间预测不一致。步长等于 patch 时尤其明显。解决推理阶段用重叠滑动窗口也就是步长小于 patch 大小重叠区域把多个 patch 的预测概率取平均再做 argmax。代码在第 6 章给出。另一个副作用是推理时间变长但课程设计不要求实时性多等几秒可以接受。5.4 全部预测成同一个类模型退化现象训练一段时间后预测 mask 全是一个颜色mIoU 突然跌到接近 0之前还能看的边界全没了。原因学习率太大导致损失震荡模型塌缩到局部最优或者训练和验证时对影像的归一化不一致模型看到的分布完全变化还有一个容易被忽略的原因是标签里有错位某些 patch 的 img 和 mask 不是同一个区域模型学到了“图像和标签无关”干脆输出最稳妥的大类。解决先可视化检查数据随机挑几对img和mask拼在一起看确认没有错位。然后学习率降到 1e-5 重新训练同时检查归一化代码是否对训练集和验证集使用了同一套统计量。如果数据本身是对的模型退化通常就是学习率问题。5.5 图像和掩码方向不一致现象可视化增强后的图像房子是正的但掩码里的建筑区域转了 90 度或者翻到了另一侧。原因图像和掩码用了不同的随机变换比如自己写翻转代码时对图像和掩码分别调用了random.random()两次随机结果不同图像水平翻转了但掩码没有。解决用 albumentations 这类保证图像和掩码共享随机状态的库或者自己写代码时固定一个随机种子再对两者同时做变换。判断是否错位最快的方法是把增强前后的图像和掩码叠加显示透明度过一层就能看到轮廓是否吻合。6. 从能跑到能答辩重叠窗口拼图与源码组织6.1 预测大图怎么拼让接缝消失的滑动窗口推理阶段想要减少接缝思路是重叠采样加概率平均。每个位置被多个窗口覆盖每个窗口独立推理得到各类别概率最终把概率累加后取 argmax。这个技巧比先预测 patch 再拼接整洁得多也是我在最终交付时一定会做的处理。def predict_full_image(model, img, device, patch_size256, overlap64): 重叠滑窗预测返回整张大图的类别 mask c, h, w img.shape num_classes 5 step patch_size - overlap prob_map np.zeros((num_classes, h, w), dtypenp.float32) model.eval() with torch.no_grad(): for y in range(0, h - patch_size 1, step): for x in range(0, w - patch_size 1, step): patch img[:, y:ypatch_size, x:xpatch_size] patch_tensor torch.from_numpy(patch).unsqueeze(0).float().to(device) logits model(patch_tensor) prob torch.softmax(logits, dim1).squeeze(0).cpu().numpy() prob_map[:, y:ypatch_size, x:xpatch_size] prob return prob_map.argmax(axis0)逻辑说明step等于patch_size - overlap重叠区域会累加多个 patch 的概率最后argmax相当于多个模型的局部投票接缝处的预测会更平滑。prob_map用 float32 累加不会溢出但推理时间会比硬切多一倍左右属于典型的以时间换质量。6.2 源码目录与答辩演示让老师顺着你的脚本走课程设计源码的组织方式直接影响老师能不能快速看懂你的项目。我习惯把源码拆成四个文件dataset.py负责数据读取和增强model.py放网络结构train.py放训练和验证逻辑predict.py负责大图推理和可视化。另加一个README.md写清楚环境依赖、数据集格式和运行命令。不要把所有代码塞进一个文件里跑到底那样即使结果好老师追问时你也很难自圆其说。答辩演示时先跑一次predict.py输出一张彩色分类图再贴一张训练过程里 mIoU 曲线最后把best_model.pth拿上台演示。只要代码能按 README 一键跑通结果图边界干净、mIoU 有上升趋势这门课程设计基本就稳了。这些年我自己的习惯是每次改完模型先看一眼推断结果里最薄的类别比如道路画得对不对再看 mIoU因为指标可以协商图错了就是错了。这套流程也希望能帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Transformer 在中文简历解析中的工程优化实践 2026/9/28 3:46:29

Transformer 在中文简历解析中的工程优化实践

2026 年 NLP 工程落地数据显示,通用 Transformer 模型在无优化状态下,中文简历实体解析 F1 分值仅为 78.2%,长文本字段错位、口语化字段识别失效、布局干扰误判是核心落地痛点【《2026 中文垂直 NLP 工程落地白皮书》】。结合我观察的招聘 AI…

阅读更多 →
KubeVela command Trait 实战指南:精确覆盖 Pod 容器 Command 与 Args 2026/9/28 3:46:29

KubeVela command Trait 实战指南:精确覆盖 Pod 容器 Command 与 Args

云原生DevOps运维微服务 【免费下载链接】kubevela The Modern Application Platform. 项目地址: https://gitcode.com/gh_mirrors/ku/kubevela 点击查看 免费下载 导读 KubeVela 内置的 command trait 允许你在 Application 的组件上直接覆盖工作负载 Pod 中容器…

阅读更多 →
3分钟上手 Inpaint-web:免费开源的浏览器端图像修复与超分辨率工具 2026/9/28 3:46:29

3分钟上手 Inpaint-web:免费开源的浏览器端图像修复与超分辨率工具

3分钟上手 Inpaint-web:免费开源的浏览器端图像修复与超分辨率工具 【免费下载链接】inpaint-web A free and open-source inpainting & image-upscaling tool powered by webgpu and wasm on the browser。| 基于 Webgpu 技术和 wasm 技术的免费开源 inpaintin…

阅读更多 →
一键导入1000+站点AI黑名单,净化图像搜索结果:uBlockOrigin与uBlacklist过滤列表 2026/9/28 3:46:29

一键导入1000+站点AI黑名单,净化图像搜索结果:uBlockOrigin与uBlacklist过滤列表

一键导入1000站点AI黑名单,净化图像搜索结果:uBlockOrigin与uBlacklist过滤列表 【免费下载链接】uBlockOrigin-HUGE-AI-Blocklist A huge blocklist of manually curated sites that contain AI generated imagery for uBlock Origin & uBlacklist.…

阅读更多 →
从 0 到 1 开出第一家虚拟商品店:acg-faka 发卡系统落地实操 2026/9/28 3:46:29

从 0 到 1 开出第一家虚拟商品店:acg-faka 发卡系统落地实操

从 0 到 1 开出第一家虚拟商品店:acg-faka 发卡系统落地实操 【免费下载链接】acg-faka 个人发卡源码,发卡系统,二次元发卡系统,二次元发卡源码,发卡程序,动漫发卡,PHP发卡源码,异次…

阅读更多 →
用 Gopeed 下载管理器跑满带宽:从安装到无人值守的完整指南 2026/9/28 3:46:23

用 Gopeed 下载管理器跑满带宽:从安装到无人值守的完整指南

用 Gopeed 下载管理器跑满带宽:从安装到无人值守的完整指南 【免费下载链接】gopeed A fast, modern download manager for HTTP, BitTorrent, Magnet, and ed2k. Cross-platform, built with Golang and Flutter. 项目地址: https://gitcode.com/GitHub_Trendin…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉