SRGAN图像超分实战:原理、训练与部署避坑指南
简介SRGAN是一种基于生成对抗网络的图像超分辨率方法专注解决大倍数放大时难以恢复高频纹理细节的问题。与仅最小化均方误差的传统方案不同其通过对抗损失和内容损失组成的感知损失函数推动输出接近自然图像流形在公开基准上实现了4倍放大的照片级逼真效果。本包共1198个文件压缩包156MB以10个Python脚本、2个PyTorch模型权重、5个XML配置、4张样例图片及大量tfevents训练日志文件为主同时包含部分pyc编译文件与无扩展名数据文件便于直接运行复现或改造研究。资源已吸引2543人学习适合深度学习研究者、图像处理学习者快速上手SRGAN源码借助预训练权重开展超分辨率实验并通过训练日志对比不同策略下的感知质量表现。1. SRGAN把模糊图变清晰的生成对抗网络到底值不值得下手里有一批老照片或者监控截图想放大用双三次插值一放大边缘锯齿和涂抹感立刻上来。SRGANSuper-Resolution GAN是 2017 年 CVPR 上提出的图像超分辨率重建方案核心思路是用生成器把低分辨率图放大 4 倍再用判别器去区分“生成的超分图”和“真实高清图”两者对抗训练逼着生成器输出在纹理和细节上更像真图的放大结果。它和传统超分算法的最大差别在于不追求像素误差最低而是追求人眼看起来更自然。适合正在做图像处理、深度学习落地或者需要批量修复低清素材的从业者。这篇笔记我会把原理、训练流程、推理部署和踩过的坑一次讲清楚。2. 原理与选型理由生成器、判别器与感知损失2.1 生成器结构残差堆叠与亚像素上采样SRGAN 的生成器是典型的深度残差网络主体由 16 个 Residual Block 堆叠而成每个残差块内部是两层 3×3 卷积卷积后接 BatchNorm 和 PReLU 激活。输入的低分辨率图先经过一层卷积提取特征进入残差堆叠最后通过两个 PixelShuffle亚像素卷积模块完成 4 倍上采样输出高清图。我做推理时经常把生成器结构打印出来核对维度常见做法是先确认低分辨率输入是 3 通道、尺寸 96×96经过特征提取后通道数升到 64再经过残差块保持通道不变最后在 PixelShuffle 阶段把通道数从 256 重排成 64×2×2 的空间尺寸逐步放大到 384×384。这样设计的好处是上采样参数由网络自己学习相比传统转置卷积亚像素卷积不会在放大边缘引入明显的棋盘伪影。import torch import torch.nn as nn class ResidualBlock(nn.Module): def __init__(self, channels64): super().__init__() self.conv1 nn.Conv2d(channels, channels, 3, 1, 1) self.bn1 nn.BatchNorm2d(channels) self.prelu nn.PReLU(channels) self.conv2 nn.Conv2d(channels, channels, 3, 1, 1) self.bn2 nn.BatchNorm2d(channels) def forward(self, x): identity x out self.prelu(self.bn1(self.conv1(x))) out self.bn2(self.conv2(out)) return out identity代码里的 ResidualBlock 是生成器的基础构件卷积层 padding 设为 1 是为了保持特征图尺寸不变这样残差连接可以直接相加。PReLU 的参数是逐通道学习的比 ReLU 多了一点表达能力在超分任务里能让梯度流动更平稳。实际训练时BatchNorm 在小 batch 下容易出问题后面避坑章我会专门讲很多后续改进版本干脆去掉了 BN。2.2 判别器与感知损失为什么单用 MSE 不行判别器网络采用 VGG 风格的结构输入一张图超分结果或真实高清图经过多次卷积加 LeakyReLU通道数逐级翻倍最后接全连接层输出一个 0 到 1 之间的概率值判断输入是真图还是生成图。对抗训练的意义在于让生成器学会“骗过”判别器从而输出更锐利的边缘和真实纹理。如果只用 MSE 作为损失函数训练收敛后 PSNR 指标很好看但图像会非常平滑缺失高频细节人眼看起来像隔着一层雾。SRGAN 引入了感知损失Perceptual Loss做法是把生成图和真实图同时送入预训练的 VGG19 网络在特定特征层通常是 relu5_4计算特征图的均方误差让生成图在特征空间里逼近真实图而不是在像素空间里逼近。感知损失加对抗损失再加一点 MSE三部分按权重组合才是完整的 SRGAN 目标函数。vgg torchvision.models.vgg19(pretrainedTrue).features.to(device) # 取 relu5_4 层的特征输出 feat_extractor nn.Sequential(*list(vgg[:35])).eval() def perceptual_loss(fake, real): fake_feat feat_extractor(fake) real_feat feat_extractor(real) return nn.functional.mse_loss(fake_feat, real_feat)上面是感知损失的常见实现把 VGG19 的前 35 层截出来当作特征提取器输入需要先归一化到 VGG 预训练时的分布也就是减均值除方差很多新人在这里翻车后面避坑章节我会强调。特征层选得越深保留的语义信息越多纹理细节越丰富选得太浅则容易退化成像素级匹配所以实践中一般固定用 relu5_4 或者同时取多层做加权。2.3 损失加权与训练节奏的现实选择实际训练时总损失可以写成 L L_mse 0.006 * L_perceptual 0.001 * L_gan这三个权重不是拍脑袋定的是原作者在 DIV2K 数据集上调出来的经验值。我一般会先固定 MSE 和感知损失把生成器预训练 50 个 epoch等生成图轮廓稳定后再把判别器加进来。如果一开始就上对抗损失生成器很容易被判别器带偏训练过程非常剧烈loss 曲线像心电图。训练节奏上还有个细节判别器的学习率设置通常比生成器低一个数量级生成器用 1e-4判别器用 1e-5。这样做的理由是防止判别器太强把生成器的梯度直接压没导致生成器学不到任何东西。很多公开代码里只写了默认学习率没有说明两阶段训练的必要性新手照着跑很容易在第二阶段发现生成图开始出现彩色噪点。3. 数据准备与训练全流程从数据集到可复现的训练脚本3.1 数据集选择与预处理HR 和 LR 怎么配对SRGAN 训练需要成对的高清图HR和低清图LR常用数据集是 DIV2K、Flickr2K如果做通用超分这两个数据集基本够用。训练时从 HR 图上随机裁剪 patch比如 96×96 或 128×128然后用双三次插值缩放到 24×24 或 32×32 作为 LR 输入这样模型学习的目标就是从 4 倍下采样还原出原图。做数据预处理时我一般会固定一个随机种子保证每次实验的 HR-LR 配对一致否则换一次 seed 训练结果就变了复现都不好复现。数据增强方面随机水平翻转、垂直翻转、90 度旋转是默认操作能有效提升数据多样性。注意 LR 图的下采样方式要和推理时保持一致如果训练用双三次推理时也必须是双三次换成最近邻或者别的插值算法结果会明显变差。import torch from torch.utils.data import Dataset from PIL import Image import torchvision.transforms as T class SRDataset(Dataset): def __init__(self, hr_paths, lr_scale4, patch_size96): self.hr_paths hr_paths self.lr_scale lr_scale self.patch_size patch_size self.crop T.RandomCrop(patch_size) self.flip T.RandomHorizontalFlip() def __len__(self): return len(self.hr_paths) def __getitem__(self, idx): hr Image.open(self.hr_paths[idx]).convert(RGB) # 随机裁剪一个大块再缩小成 LR保证 LR 和 HR 严格对齐 hr_patch self.crop(hr) lr_patch hr_patch.resize( (self.patch_size // self.lr_scale, self.patch_size // self.lr_scale), Image.BICUBIC ) hr_tensor T.ToTensor()(hr_patch) * 2.0 - 1.0 lr_tensor T.ToTensor()(lr_patch) * 2.0 - 1.0 return self.flip(lr_tensor), self.flip(hr_tensor)这段代码是数据加载的核心逻辑先裁 HR patch 再缩成 LR比先缩放全图再裁 patch 要合理得多因为后者无法保证每个 patch 的下采样过程完全一致。归一化到 [-1,1] 是 SRGAN 训练的标准做法因为生成器的输出层用了 Tanh 激活输出范围就是 [-1,1]对不上就会导致颜色发灰。翻转操作要同时作用于 LR 和 HR所以代码里先转成 tensor 再一起翻转避免只翻一个。3.2 两阶段训练先 MSE 预训练再加对抗微调训练脚本我拆成两段。第一阶段只用 MSE 损失训练生成器优化器用 Adam学习率 1e-4跑 50 个 epoch这一步的目的让生成器先把图像结构恢复出来不至于一上来就被判别器刁难。第二阶段把判别器接进来生成器学习率降到 1e-5判别器学习率 1e-6同时加入感知损失和对抗损失再跑 50 到 100 个 epoch。两阶段训练不是可选项是保证稳定的必选项我见过不少人跳过第一阶段结果生成图一度全是高频噪点。训练循环里要注意梯度累积和梯度裁剪的配合。生成器输入 LR 图得到超分图分别计算 MSE 损失、感知损失和对抗损失三者加权相加后反向传播。判别器则单独拿超分图和 HR 图做真假二分类只回传判别器的损失。两个网络的优化器要分开维护不能混在一个 backward 里。for epoch in range(start_epoch, total_epochs): for lr, hr in dataloader: lr, hr lr.to(device), hr.to(device) # 训练生成器MSE 感知 对抗 fake_hr generator(lr) mse_loss nn.MSELoss()(fake_hr, hr) feat_loss perceptual_loss(fake_hr, hr) fake_prob discriminator(fake_hr) adversarial_loss nn.BCEWithLogitsLoss()(fake_prob, torch.ones_like(fake_prob)) g_loss mse_loss 0.006 * feat_loss 0.001 * adversarial_loss opt_g.zero_grad() g_loss.backward() torch.nn.utils.clip_grad_norm_(generator.parameters(), 1.0) opt_g.step() # 训练判别器真图判真假图判假 fake_prob discriminator(fake_hr.detach()) real_prob discriminator(hr) real_loss nn.BCEWithLogitsLoss()(real_prob, torch.ones_like(real_prob)) fake_loss nn.BCEWithLogitsLoss()(fake_prob, torch.zeros_like(fake_prob)) d_loss (real_loss fake_loss) * 0.5 opt_d.zero_grad() d_loss.backward() opt_d.step()生成器训练时fake_hr 传入判别器得到概率目标是让判别器输出接近 1也就是“骗过它”判别器训练时需要把生成结果 detach 掉阻断梯度回传到生成器。BCEWithLogitsLoss 内部已经自带 Sigmoid所以判别器最后一层不需要额外加 Sigmoid 激活加了反而会导致数值不稳定。梯度裁剪我只加了生成器最大值设 1.0防止感知损失偶尔跳一个大梯度把网络参数冲飞。3.3 训练监控与 checkpoint 管理训练过程要跟踪的指标至少有三个生成器总损失、判别器损失、验证集上的 PSNR。PSNR 只衡量像素误差不代表感知质量但它能直观反映训练是否正常通常训练到某个阶段 PSNR 会略微下降这是因为对抗损失开始影响输出让纹理变得锐利而牺牲了像素精度这是正常现象不要一看 PSNR 降了就慌。Checkpoint 我习惯每个 epoch 存一次生成器和优化器状态文件名带上 epoch 数和当前 PSNR保留最近 5 个就够训练后期每次存都要占好几个 G 的磁盘。恢复训练时要同时加载生成器、判别器和两个优化器的状态字典我的做法是把它们包在一个字典里方便一次性恢复避免加载漏了导致训练状态错乱。参数第一阶段第二阶段生成器学习率1e-41e-5判别器学习率无1e-6损失权重MSE1MSE1, 感知0.006, 对抗0.001训练 epoch50100批大小1616Patch 尺寸96×9696×96优化器AdamAdam这张表是我常用的一套稳定参数组合适合单卡 12G 显存的环境。如果你的显卡显存不够可以把 patch 降到 64×64 或者批大小降到 8梯度累积到等效 16 的批大小即可不要直接复制别人 32G 显存上的配置很容易 OOM。4. 推理与效果评估把模型用起来的完整流程4.1 推理脚本任意尺寸图片的处理方式训练完成后推理阶段的核心是加载生成器权重对输入图片做预处理后前向推理再把输出反归一化保存。有两点要特别注意一是输入 LR 图的尺寸最好能被 4 整除超分尺度是 4如果不能整除边缘会多出来一小块视觉上有明显黑边二是先对整图跑一遍如果显存不足再切块推理切块时相邻块之间要留 overlap避免拼接处出现接缝伪影。import torch from PIL import Image import torchvision.transforms as T def inference(generator, lr_path, output_path, devicecuda): lr Image.open(lr_path).convert(RGB) lr T.ToTensor()(lr).unsqueeze(0).to(device) * 2.0 - 1.0 with torch.no_grad(): sr generator(lr) sr (sr 1.0) / 2.0 # 反归一化 sr_img T.ToPILImage()(sr.squeeze(0).cpu()) sr_img.save(output_path)推理代码本身不复杂但反归一化那一步最容易出错。训练时数据是 [0,1] 映射到 [-1,1]所以输出要加 1 再除以 2才能变回正常图像范围。我在实际项目里还遇到过颜色偏紫的情况就是因为忘了把输出范围还原直接把 [-1,1] 的值交给 PIL 保存PIL 会自动按整型处理颜色就乱了。4.2 评估指标PSNR、SSIM 和 LPIPS定量评估超分结果有两条路线。传统指标 PSNR 和 SSIM 计算速度快适合对比不同模型在同一数据集上的像素精度但它们对感知质量的反映有限PSNR 高不代表看着舒服。感知指标 LPIPS 用深度网络特征距离来衡量两张图的相似度和人眼主观评分相关性更好如果你想发表成果或者做严格的模型对比LPIPS 是必须加上的一项。我一般会在测试集上同时计算这三项并把生成图单独拎出来做视觉检查。评估代码很简单用 skimage 的 peak_signal_noise_ratio 和 structural_similarity 函数就能算 PSNR 和 SSIMLPIPS 需要单独装包并加载 AlexNet 骨干网络。跑测试集的时候注意生成图和 HR 图的尺寸必须一致SRGAN 输出尺寸严格等于 LR 尺寸乘以 4不要做多余缩放。4.3 部署与加速ONNX、TensorRT 与批处理模型落地到生产环境通常需要把 PyTorch 权重转成 ONNX再用 TensorRT 做半精度推理这样单张 1080P 图的推理时间能压缩到几十毫秒。导出 ONNX 时要固定输入尺寸SRGAN 对动态尺寸支持不友好因为 PixelShuffle 虽然支持任意尺寸但 TensorRT 的某些插件层对动态形状适配不好常见做法是固定一个最大尺寸比如 960×540小于这个尺寸的输入先补零再推理。torch.onnx.export( generator, torch.randn(1, 3, 240, 135).to(device), srgan.onnx, input_names[lr], output_names[sr], opset_version11 )导出时的输入形状决定了后续推理的固定尺寸我习惯按目标场景选一个通用分辨率比如 4 倍放大后正好是 1080P那么输入就是 960×540。注意导出前要把生成器切到 eval 模式并关闭梯度否则导出的图里会包含训练节点的信息TensorRT 转换时可能报错。批处理时把多张 LR 图堆成一个 batch 同步推理吞吐量能明显提升。5. SRGAN 训练的避坑与常见问题排查5.1 生成图颜色发灰或发暗现象是超分结果整体灰蒙蒙的亮度、色彩都偏向中间值明显不如输入的真实图片鲜艳。原因一般是预处理归一化和反归一化没对齐训练时把 HR 和 LR 都映射到了 [-1,1]但推理时忘了把输出加 1 除以 2 还原回 [0,1] 范围就直接存图。解决方法是检查推理链路里的归一化参数在输出后强制加上反归一化并打印输出张量的数值范围确认是不是落在 [0,1] 区间。那之后我每次写完推理代码都要先拿一张固定测试图跑一遍观察输出的 min/max 值是否合理避免这种基础错误。5.2 判别器 loss 迅速降到 0生成器不更新现象是训练一开始判别器准确率就接近 99%loss 掉到接近 0生成器怎么训练都学不动。原因是判别器学得太快了或者生成器还没预训练好就把对抗损失加大导致判别器轻松分辨出真假生成器梯度传不回来或方向不对。解决方法是先确认生成器是否完成了第一阶段的 MSE 预训练如果没预训练就上对抗重来把判别器的学习率从 1e-6 再降到 1e-7同时把对抗损失权重从 0.001 降到 0.0005让生成器在里面多游一会儿。我见过不少人在这一步放弃 SRGAN其实是节奏问题不是模型问题。5.3 生成图出现高频噪点和彩色斑点现象是 4 倍放大结果里出现密密麻麻的彩色噪点像是镜头脏了纹理里掺杂着明显的伪影。原因是感知损失特征层选得太浅或者对抗损失权重过大生成器为了骗过判别器直接往图像里注入频率很高的噪声纹理。解决方法是把 VGG 特征层从浅层换到 relu5_4对抗损失权重调回 0.001 以下。如果是训练后期突然出现考虑是不是判别器训练过度生成器开始走极端策略。这时候最好的做法是回滚到上一个效果好的 checkpoint调低判别器学习率后再继续训练。5.4 显存溢出与批大小限制现象是训练刚开始就报 CUDA out of memory输入尺寸和 batch size 加起来超过显存上限。原因很简单96×96 的 patch 配合 16 的 batch在 12G 显存上有时也扛不住因为生成器和判别器同时驻留显存中间特征图占用叠加在一起。解决方法是先把 batch size 降到 8显存还不够就降到 4 并用梯度累积凑到等效 16也可以把 patch 尺寸从 96 降到 64这两招通常能把显存占用压下来。用 PyTorch 的意义就在于灵活不用硬扛原版的配置训练效果不会差太多。5.5 加载预训练权重时 key 不匹配现象是从别人的开源模型加载权重时报 missing keys 和 unexpected keys部分层没法对齐。原因是不同实现里模块命名不一致比如有人把残差块命名为 resblock有人命名为 body还有人在生成器里加了额外的卷积层。解决方法是不要用 strictTrue 加载把不匹配的层打印出来后决定是删掉还是随机初始化最后重新跑一段短训练让新权重适应。我一般会在代码里加一个过滤逻辑只加载 key 完全匹配的参数不匹配的层用本仓库自己的初始化方式。6. 进阶做一次消融实验验证哪些模块真正起作用当你已经能顺利训练出一个 SRGAN 模型时下一步别急着换数据集刷指标先在自己手上做一轮消融实验搞清楚哪些设计对你手里的场景真正有用。实验方法很简单以同一个数据集为基础按变量逐个拆。第一个版本只保留生成器和 MSE 损失第二个版本在第一个基础上加感知损失第三个版本再加判别器第四个版本尝试去掉 BatchNorm。每训练一个版本跑到同等的 epoch用 LPIPS 和 PSNR 同时评估。把四个版本的生成图放到一起对比你通常会发现一个反常的结果加了判别器后 LPIPS 变好了但 PSNR 反而下降这说明模型在感知质量与像素精度之间做了取舍恰恰印证了 SRGAN 的核心假设也是向别人解释为什么超分不能只看 PSNR 的最有力证据。如果去掉 BatchNorm 的版本在你的数据集上效果更好别惊讶很多后续超分模型确实砍掉了 BN因为 BN 在小 batch 场景下统计噪声大反而限制了生成器的表达。做消融实验时要注意控制变量比如固定学习率、固定 patch 尺寸、固定训练轮数只改变你想要验证的那个模块。如果不控制这些条件实验结果没法归因到具体模块上。我在实际项目中做过一次类似的验证最后发现对于纹理密集的卫星图像感知损失的权重需要从 0.006 提高 到 0.01 才能有明显视觉增益。从那以后我每次训练超分模型都强制走一遍完整流程数据配对MSE 预训练加感知损失和对抗损失微调最后用 LPIPS 验收缺一步都不踏实。希望这些踩坑记录能帮你在复现 SRGAN 时少走几段弯路。本文还有配套的精品资源点击获取

相关新闻

Python批量插入div:静态HTML自动化处理实战

Python批量插入div:静态HTML自动化处理实战

接手过一批老项目页面的同学应该都有同感:几十个静态 HTML 文件,结构长得几乎一样,但就是不能直接全局替换,因为每个页面的局部差异大得让人头疼。最近我就遇到一个这样的需求——需要在一批 HTML 文件里的指定位置统一插入一个自…

2026/10/10 17:01:54 阅读更多 →
航空发动机剩余寿命预测:LSTM时序建模实战指南

航空发动机剩余寿命预测:LSTM时序建模实战指南

简介:本资源是一套基于LSTM算法的航空发动机剩余使用寿命(RUL)预测完整实现方案,面向深度学习初学者、故障预测方向研究者及航空航天领域工程技术人员。针对多源传感器数据噪声大、时序依赖性强、传统RNN易梯度消失等难点&#xf…

2026/10/10 17:01:54 阅读更多 →
基于微信小程序的考试系统开发实战:架构、核心链路与避坑指南

基于微信小程序的考试系统开发实战:架构、核心链路与避坑指南

简介:这套基于微信小程序的考试系统设计与实现项目,可作为计算机专业毕业设计、课程设计或实训参考。系统后台采用SSM框架与MySQL数据库,小程序端使用微信开发者工具开发,管理员端覆盖用户管理、考试资料管理、用户交流、试卷管理…

2026/10/10 17:00:53 阅读更多 →

最新新闻

Java八种基本类型全解析:从内存布局到线上避坑实战

Java八种基本类型全解析:从内存布局到线上避坑实战

Java的八种基本类型,这个话题放在互联网上一搜一大把,但相信我,很多人在第一年学完就忘得干干净净。我自己带过几个人,面试时问int占几个字节,有人能回答上来,再问int的上限是多少、为什么负数下限比正数上…

2026/10/10 20:55:38 阅读更多 →
给AI对话助手外挂长期记忆:claude-mem架构与实战

给AI对话助手外挂长期记忆:claude-mem架构与实战

claude-mem 这名字起得相当直白——mem 就是 memory,把这个小工具和主流通用对话助手(下文就统一叫“模型助手”吧)放在一起,它的定位立刻清晰:给没有长期记忆的对话系统补上一块“外挂记忆”。我自己长期重度使用这类…

2026/10/10 20:55:38 阅读更多 →
微信点餐小程序毕设:SSM+MySQL全栈实战指南

微信点餐小程序毕设:SSM+MySQL全栈实战指南

简介:这是一套面向计算机专业本科生的微信点餐小程序毕业设计全栈开发资源,适用于课程设计、毕设选题与Java小程序技术栈综合实践。项目采用微信小程序前端(WXML/WXSS/JS) SSM(SpringSpringMVCMyBatis)后端…

2026/10/10 20:55:38 阅读更多 →
AnyPS5技术解析:PS5硬件约束下的跨运行时抽象实践

AnyPS5技术解析:PS5硬件约束下的跨运行时抽象实践

项目标题:“AnyPS5”这个名称本身带有强烈的指向性与模糊性并存的特征——它既像一个技术代号,又像一句口号;既暗示兼容性、泛用性(“Any”),又锚定在特定硬件生态(“PS5”)。但必须…

2026/10/10 20:55:38 阅读更多 →
Java Web动漫之家系统实战:从设计到部署避坑指南

Java Web动漫之家系统实战:从设计到部署避坑指南

简介:Java动漫之家系统设计与实现是一套面向动漫爱好者在线互动平台的完整开发设计方案,适用于JavaWeb课程设计、毕业设计或快速搭建动漫资源社区的项目预研。该方案以SSM框架为核心,结合MySQL数据存储与HTML5前端交互,从系统背景…

2026/10/10 20:55:38 阅读更多 →
免费开源 vs 截图 API 月入 2000 美金:独立开发的两条变现路线

免费开源 vs 截图 API 月入 2000 美金:独立开发的两条变现路线

免费开源 vs 截图 API 月入 2000 美金:独立开发的两条变现路线 【免费下载链接】tendedero Screenshots, hung out to dry. A tiny native macOS app that hangs every screenshot on a line at the top of your screen. 项目地址: https://gitcode.com/gh_mirror…

2026/10/10 20:54:37 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →