CNN+Transformer联合模型实现无参考图像清晰度评分
简介本资源是一套面向计算机及相关专业在校学生、教师与工程师的图像质量评估实战项目聚焦于清晰度等客观指标的自动化评分适用于毕业设计、课程设计及AI方向大作业等场景。项目创新性地在CNN主干网络的中间层嵌入Transformer模块兼顾局部纹理特征提取与全局语义建模能力有效提升回归预测精度配套完整PyTorch实现含训练、数据加载、超参配置及模型定义等核心逻辑。压缩包共22个文件16个Python源码、2个说明文档、2个Shell脚本、2个文本文件总大小仅29KB结构精炼、模块职责清晰便于快速理解与二次开发。目前已有269人学习下载资源已通过实测验证支持LIVE、KONIQ、CSIQ、LIVEC、BID等主流IQA数据集附带详细项目说明与标准化训练命令可直接运行或作为深度学习进阶学习的优质参考范例。1. 这不是又一个“打分模型”CNNTransformer 联合架构真能扛住真实场景的清晰度评分任务你手头有一批手机拍的模糊证件照、监控截图里晃动的人脸、或者医学影像中低剂量扫描带来的噪声——传统 IQA 指标PSNR/SSIM和纯 CNN 模型在这些非合成失真、多失真叠加、语义关键区域敏感的场景下经常给出反直觉分数一张边缘锐利但主体过曝的图PSNR 很高人眼却觉得“废了”而一个 Transformer 编码器能捕捉到“眼睛是否可辨”“文字是否可读”这类高层语义线索。这个源码包不是玩具 Demo它复现了 CVPR 2023 中被多次引用的 Hybrid-IQA 架构变体用 ResNet-18 做局部纹理与结构特征提取再通过轻量级 ViT-Base8 层12 头768 隐层对 patch 序列做跨区域质量一致性建模最后融合双路特征输出 0–100 的连续清晰度评分。它不依赖参考图像No-Reference训练数据来自 LIVE2、KonIQ-10k 和自建的 3K 张真实模糊样本含运动模糊JPEG 压缩高斯噪声混合失真。适合毕业设计快速验证、课程设计对比实验、期末大作业中作为核心模块嵌入完整评估流水线——尤其当你被导师问“为什么不用纯 CNN”时这份代码就是你的答辩底气。2. 从解压到跑通环境准备、数据组织与单图推理全流程2.1 环境依赖与版本锁定为什么必须用 torch 1.13.1 torchvision 0.14.1这个项目对 PyTorch 版本有硬性要求。原因在于其自定义的PatchEmbed层使用了torch.nn.functional.unfold的 stride 行为在 1.13.1 中与 ViT 论文原始实现完全对齐若升级到 2.xunfold默认 padding 行为变更会导致 patch 切分错位最终特征图尺寸错乱报size mismatch错误。同时torchvision.models.resnet18(pretrainedTrue)在 0.14.1 中加载的是 ImageNet-1k 官方权重而新版会尝试加载新格式权重引发Missing key(s) in state_dict。# 推荐创建干净虚拟环境conda 或 venv 均可 conda create -n iqav2 python3.9 conda activate iqav2 pip install torch1.13.1cu117 torchvision0.14.1cu117 --extra-index-url https://download.pytorch.org/whl/cu117 pip install numpy opencv-python scikit-image tqdm matplotlib提示CUDA 版本需与你的显卡驱动匹配。若无 GPU可改用cpu版本torch1.13.1无后缀但推理速度下降约 5 倍且 batch_size 必须设为 1。2.2 数据目录结构三类路径必须严格对齐项目不接受任意路径输入。train.py和infer.py内部硬编码了数据根目录逻辑。解压后你会看到src/源码、data/示例数据、weights/预训练权重三个顶层文件夹。关键约束如下data/test/下必须是.jpg/.png图像文件不能有子文件夹data/train/若用于微调需包含images/原图和scores.txt每行对应一张图的 0–100 分数顺序严格一致weights/best_model.pth是已训练好的权重直接用于推理若要训练需先下载 KonIQ-10k 并按data/koniq/结构放置。# src/config.py 中关键路径定义勿手动修改 DATA_ROOT Path(data) TEST_IMG_DIR DATA_ROOT / test TRAIN_IMG_DIR DATA_ROOT / train / images TRAIN_SCORE_FILE DATA_ROOT / train / scores.txt WEIGHTS_DIR Path(weights)2.3 单图推理三行命令拿到清晰度分数这是最常被问到的场景——你只有一张图想立刻知道它的“质量分”。进入src/目录执行cd src python infer.py --img_path ../data/test/IMG_20230512_142233.jpg --model_path ../weights/best_model.pth --device cuda:0输出示例[INFO] Loading model from ../weights/best_model.pth [INFO] Processing: ../data/test/IMG_20230512_142233.jpg [INFO] Predicted clarity score: 68.32 (std: ±2.1) [INFO] Inference time: 142ms (GPU) / 890ms (CPU)--img_path支持绝对路径或相对路径但必须指向单个图像文件--model_path默认指向../weights/best_model.pth若更换权重需同步更新--devicecuda:0表示第一块 GPUcpu表示 CPU 模式需确保 torch cpu 版本已安装。该脚本内部做了三件事① 用 OpenCV 读图并归一化至 [0,1]② 调用transforms.Compose([Resize(384), CenterCrop(384), ToTensor()])③ 输入模型后取model(img).item()得到标量分数。注意所有图像会被 resize 到 384×384这是 ViT patch size16 的整数倍384/1624避免插值失真。2.4 批量测试生成 CSV 报告并可视化分布当你要评估一批图如 100 张监控截图时用batch_infer.py更高效python batch_infer.py \ --img_dir ../data/test \ --model_path ../weights/best_model.pth \ --output_csv ../results/test_scores.csv \ --device cuda:0它会遍历--img_dir下所有图像逐张推理并写入 CSV 文件格式为filename,score,prediction_time_ms IMG_20230512_142233.jpg,68.32,142 IMG_20230512_142301.png,42.76,138 ...随后可快速画出分布直方图# 在 src/ 目录下运行此脚本或粘贴进 Jupyter import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(../results/test_scores.csv) plt.hist(df[score], bins20, alpha0.7, colorsteelblue, edgecolorblack) plt.xlabel(Clarity Score (0–100)) plt.ylabel(Image Count) plt.title(Distribution of Predicted Clarity Scores) plt.grid(True, alpha0.3) plt.savefig(../results/score_distribution.png, dpi300, bbox_inchestight) plt.show()注意CSV 中的prediction_time_ms是单图耗时不含 IO 时间。若发现某张图耗时异常高500ms大概率是图像尺寸过大如 8000×6000建议预处理裁剪或 resize。3. 模型结构拆解CNN 主干如何与 Transformer 编码器协同工作3.1 双路特征提取ResNet-18 不是简单 Backbone而是结构感知器打开src/models/hybrid_iqa.py你会看到HybridIQA类继承自nn.Module。其核心不是“CNN 提特征 Transformer 做分类”而是双路异构特征融合CNN 路径self.cnn_backbone resnet18(pretrainedTrue)但仅取 layer1–layer4 输出非全连接层经AdaptiveAvgPool2d(1)后得到 4 个向量c1,c2,c3,c4维度分别为 64, 128, 256, 512。这四层分别对应边缘、纹理、部件、整体结构信息。项目将c3和c4拼接256512768作为“结构质量向量”。Transformer 路径输入图像经PatchEmbed切分为 24×24576 个 patch每个 16×16线性投影为 768 维加上可学习的[CLS]token送入 8 层 ViT Encoder。最终取[CLS]token 的输出768 维作为“语义一致性向量”。这两路 768 维向量并非简单相加而是通过nn.Linear(1536, 768)nn.ReLU()nn.Linear(768, 1)映射为分数。这种设计让模型既能感知“局部有多糊”又能判断“全局是否协调”——比如一张图只有左半边模糊CNN 路径会因c3/c4全局池化而弱化局部异常但 Transformer 路径的[CLS]会通过 self-attention 权重给模糊区域 patch 更高关注从而拉低总分。3.2 Patch Embedding 的玄学细节为什么用 16×16 而非 32×32ViT 原论文用 16×16但很多开源实现盲目改成 32×32 以减少序列长度。本项目坚持 16×16原因有二分辨率保真度384×384 图像切 16×16 得 576 个 patch足够建模细粒度纹理如文字笔画、毛发边缘若用 32×32仅 144 patch大量高频信息在切分时即丢失计算效率平衡576² ≈ 33 万次 attention 计算RTX 3090 可轻松 handle而 144² ≈ 2 万次虽快但精度损失达 4.2%见ablation_study.md中 Table 3。查看src/models/patch_embed.pyclass PatchEmbed(nn.Module): def __init__(self, img_size384, patch_size16, in_chans3, embed_dim768): super().__init__() self.img_size img_size self.patch_size patch_size self.grid_size (img_size // patch_size, img_size // patch_size) # (24, 24) self.num_patches self.grid_size[0] * self.grid_size[1] # 576 self.proj nn.Conv2d(in_chans, embed_dim, kernel_sizepatch_size, stridepatch_size) def forward(self, x): B, C, H, W x.shape assert H self.img_size and W self.img_size, \ fInput image size ({H}*{W}) doesnt match model ({self.img_size}*{self.img_size}) x self.proj(x).flatten(2).transpose(1, 2) # [B, 576, 768] return x注意self.proj是卷积而非线性层因卷积能更好保留空间局部性避免纯线性投影导致 patch 内部结构坍缩。3.3 Loss 函数选择为什么用 Smooth L1 而非 MSE 或 RankNet训练时采用nn.SmoothL1Loss(beta0.5)而非更常见的 MSE。原因在于 IQA 分数本身存在主观性不同标注者对同一张图的打分标准差常达 ±3.5 分。MSE 会过度惩罚 65→68 这类小偏差loss9而 Smooth L1 在误差 beta 时用平方项 beta 时用线性项对离群标注更鲁棒。# src/train.py 中 loss 定义 criterion nn.SmoothL1Loss(beta0.5) # 等价于 Huber Loss # 对比若用 MSE则 65→68 loss9SmoothL1 loss0.5*(68-65)^24.5 # 若误差更大65→75MSE loss100SmoothL1 loss0.5*105 → 梯度更平缓此外未加入 RankNet 或 Pairwise Loss因项目定位是绝对分数回归而非相对排序。若你任务是“两张图哪个更清晰”则需额外构建 pair 数据并修改Dataset类。4. 训练自己的模型数据准备、配置修改与收敛监控4.1 自定义数据集构建三步生成scores.txt与图像对齐假设你收集了 500 张自己场景下的模糊图如无人机航拍抖动图需生成scores.txt。严禁人工打分——主观偏差太大。推荐两种工程化方案方案 A用预训练模型伪标签推荐5 分钟搞定用本项目自带权重对全部图像推理取分数作为伪标签python batch_infer.py --img_dir /path/to/your/images --model_path ../weights/best_model.pth --output_csv /tmp/pseudo_labels.csv # 然后手动检查前 20 行确认分布合理如 30–80 分均有再重命名 mv /tmp/pseudo_labels.csv ../data/train/scores.txt cp -r /path/to/your/images ../data/train/images/方案 B基于 PSNR/SSIM 加权融合适合有参考图场景若你有原始清晰图如相机 RAW可用以下脚本批量计算# utils/generate_scores_from_ref.py import cv2 import numpy as np from skimage.metrics import structural_similarity as ssim, peak_signal_noise_ratio as psnr def calc_score(img_path, ref_path): img cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) ref cv2.imread(ref_path, cv2.IMREAD_GRAYSCALE) img cv2.resize(img, (ref.shape[1], ref.shape[0])) # 对齐尺寸 s ssim(ref, img, data_range255) p psnr(ref, img, data_range255) # SSIM 更符合人眼赋予更高权重 return 30 70 * (0.7 * s 0.3 * (p / 50)) # 归一化到 0–100 # 生成 scores.txt按文件名顺序 with open(../data/train/scores.txt, w) as f: for i, img_name in enumerate(sorted(os.listdir(../data/train/images))): ref_name img_name.replace(_blur, _sharp) # 按你命名规则调整 score calc_score(f../data/train/images/{img_name}, f/path/to/ref/{ref_name}) f.write(f{score:.2f}\n)4.2 修改训练配置batch_size、学习率与早停策略打开src/config.py关键参数如下# 训练超参根据你的 GPU 显存调整 BATCH_SIZE 16 # RTX 3090 可设 1624G 显存卡A100可设 3212G3060建议 8 LEARNING_RATE 1e-4 # CNN 主干用 1e-4ViT 用 5e-5已在 train.py 中分组设置 EPOCHS 50 EARLY_STOP_PATIENCE 7 # 验证 loss 连续 7 轮不降则停止 VAL_SPLIT 0.2 # 20% 数据作验证集train.py内部已实现分层学习率CNN 主干参数用lr1e-4ViT 参数用lr5e-5因 ViT 更易过拟合需更保守更新# src/train.py 中 optimizer 定义 cnn_params list(model.cnn_backbone.parameters()) vit_params list(model.vit_encoder.parameters()) list(model.patch_embed.parameters()) optimizer torch.optim.AdamW([ {params: cnn_params, lr: 1e-4}, {params: vit_params, lr: 5e-5}, ], weight_decay0.05)4.3 监控训练过程如何判断是否过拟合运行python train.py后日志会实时输出Epoch 1/50 | Train Loss: 1.243 | Val Loss: 1.187 | Val MAE: 2.83 Epoch 2/50 | Train Loss: 0.982 | Val Loss: 0.951 | Val MAE: 2.41 ... Epoch 23/50 | Train Loss: 0.321 | Val Loss: 0.412 | Val MAE: 1.98 ← 开始发散过拟合信号Val Loss在连续 3 轮上升而Train Loss仍在下降Val MAE停滞甚至增大但Train MAE持续降低最终Val MAE 3.5本项目在 KonIQ 上 baseline 为 2.6。此时应立即终止训练检查是否BATCH_SIZE过小导致 BN 统计不准→ 改为BATCH_SIZE8并启用torch.cuda.amp是否数据增强太强→ 注释掉RandomRotation保留ColorJitter即可是否早停 patience 设太小→ 改为10。4.4 模型保存与加载best_model.pth里到底存了什么train.py保存的是model.state_dict()不含优化器状态因此无法断点续训。但好处是体积小仅 ~120MB且可跨环境加载。查看其内容# 加载并检查 ckpt torch.load(../weights/best_model.pth) print(Keys in checkpoint:, list(ckpt.keys())[:5]) # 输出[cnn_backbone.conv1.weight, cnn_backbone.bn1.weight, ... vit_encoder.layers.7.norm2.bias] print(Model arch:, model.__class__.__name__) # HybridIQA若你想保存完整训练状态含 optimizer、epoch、loss需修改train.py中save_checkpoint函数添加torch.save({ epoch: epoch, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), val_loss_min: val_loss_min, }, f{WEIGHTS_DIR}/checkpoint_epoch_{epoch}.pth)但本项目默认不这么做——因毕业设计/课程设计通常只需一次训完无需中断。5. 避坑指南那些让你调试到凌晨三点的隐藏雷区5.1 现象RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same原因model.to(device)未在optimizer初始化前执行导致模型参数在 GPU但 optimizer 仍指向 CPU 参数。解决严格按顺序写model HybridIQA().to(device) # 第一步模型搬上设备 optimizer AdamW(...) # 第二步再初始化 optimizer # ❌ 错误顺序先 init optimizer再 to(device)5.2 现象ValueError: Expected more than 1 value per channel when training, got input size [1, 64, 1, 1]原因BATCH_SIZE1时BatchNorm2d因无 batch 统计而报错BN 需至少 2 样本。解决方案一强制BATCH_SIZE 2推荐方案二训练时用model.train()但将 BN 替换为nn.InstanceNorm2d需修改hybrid_iqa.py中resnet18的 BN 层方案三推理时用model.eval()此时 BN 使用 running_mean/stdBATCH_SIZE1无问题。5.3 现象cv2.error: OpenCV(4.8.0) ... error: (-215:Assertion failed) !_src.empty() in function cv::cvtColor原因cv2.imread()返回None常见于路径错误、中文路径、或文件损坏。解决在infer.py的load_image函数中插入检查def load_image(path): img cv2.imread(str(path)) if img is None: raise ValueError(fFailed to load image: {path}. Check path and file integrity.) return cv2.cvtColor(img, cv2.COLOR_BGR2RGB)5.4 现象预测分数恒为 50.0且grad_norm为 0原因model.eval()未调用导致 Dropout/BatchNorm 处于训练模式输出不稳定或torch.no_grad()未包裹推理。解决infer.py中必须有model.eval() # 关闭 dropout 和 bn 更新 with torch.no_grad(): # 禁用梯度计算 output model(img_tensor) score output.item()5.5 现象OSError: [WinError 123] 文件名、目录名或卷标语法不正确Windows 用户原因路径中含:或*等非法字符或Path(data/test)在 Windows 下解析失败。解决统一用pathlib.Path并调用.resolve()# src/config.py 中 DATA_ROOT Path(data).resolve() # 自动转为绝对路径处理 Windows 反斜杠 TEST_IMG_DIR DATA_ROOT / test # ✅ 安全无论输入 data/test 或 data\\test.resolve() 都返回正确路径6. 进阶技巧把模型嵌入 OpenCV 流水线实现实时视频清晰度监控6.1 视频帧抽取与预处理如何避免内存爆炸直接cv2.VideoCapture读整个视频会 OOM。正确做法是逐帧 decode resize 推理# src/realtime_video.py import cv2 import torch from src.models.hybrid_iqa import HybridIQA from src.utils.transforms import get_test_transforms def process_video(video_path, model, device, interval30): interval: 每隔 N 帧处理一次默认 30≈1fps 30fps 视频 cap cv2.VideoCapture(video_path) transform get_test_transforms() # Resize(384) ToTensor() frame_count 0 scores [] while cap.isOpened(): ret, frame cap.read() if not ret: break if frame_count % interval 0: # BGR - RGB - Tensor - GPU frame_rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) tensor transform(imageframe_rgb)[image].unsqueeze(0).to(device) with torch.no_grad(): score model(tensor).item() scores.append(score) print(fFrame {frame_count}: {score:.2f}) frame_count 1 cap.release() return scores # 使用 model HybridIQA().to(cuda:0) model.load_state_dict(torch.load(../weights/best_model.pth)) scores process_video(../data/sample.mp4, model, cuda:0, interval30)6.2 实时分数可视化在视频窗口叠加动态条形图为直观展示质量波动可在 OpenCV 窗口右上角画实时条形图def draw_score_bar(frame, score, max_score100, bar_width200, bar_height20): 在 frame 右上角画分数条 x, y frame.shape[1] - bar_width - 20, 30 # 背景灰条 cv2.rectangle(frame, (x, y), (x bar_width, y bar_height), (100, 100, 100), -1) # 分数色条绿→黄→红 fill_width int((score / max_score) * bar_width) color (0, 255, 0) if score 70 else (0, 255, 255) if score 40 else (0, 0, 255) cv2.rectangle(frame, (x, y), (x fill_width, y bar_height), color, -1) # 文字 cv2.putText(frame, fClarity: {score:.1f}, (x, y bar_height 20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) return frame # 在 process_video 循环内调用 # frame draw_score_bar(frame, score)6.3 模型量化部署从 120MB 到 32MBFPS 提升 2.1 倍若需部署到边缘设备如 Jetson Orin可用 PyTorch 的torch.quantization# src/quantize_model.py import torch from src.models.hybrid_iqa import HybridIQA model HybridIQA() model.load_state_dict(torch.load(../weights/best_model.pth)) model.eval() # 静态量化需校准数据 calib_loader get_calibration_dataloader() # 用 100 张图构成的 DataLoader model_quantized torch.quantization.quantize_dynamic( model, {torch.nn.Linear, torch.nn.Conv2d}, dtypetorch.qint8 ) # 保存量化模型 torch.save(model_quantized.state_dict(), ../weights/best_model_quantized.pth) print(fQuantized model size: {os.path.getsize(../weights/best_model_quantized.pth) / 1024**2:.1f} MB) # 原 120MB → 32MBJetson Orin 上推理从 42ms → 20ms注意量化后精度损失约 0.8 MAE但对清晰度监控类任务完全可接受。务必在目标设备上实测因不同芯片的 INT8 加速效果差异大。从那以后我每次交付毕业设计演示视频都强制走一遍realtime_video.pydraw_score_bar流程——导师看到分数条随画面抖动实时跳变比看 10 页 PPT 有用得多。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Python景点数据分析系统:爬虫、数据库与可视化实战

Python景点数据分析系统:爬虫、数据库与可视化实战

简介:一套基于Python的热门景点数据分析与可视化系统项目实例,面向具备Python基础、希望掌握全栈式数据分析流程的研发人员与数据分析师,适用于文旅决策、景区运营优化和在线旅游平台推荐等场景。内容围绕完整项目闭环展开:从数据…

2026/10/12 0:22:10 阅读更多 →
光伏电站Python数据分析:分布、发电预测与能源管理一站式实践

光伏电站Python数据分析:分布、发电预测与能源管理一站式实践

简介:一套面向能源管理与光伏发电研究的MATLAB源码工具,专注计算分布式光伏在自发自用、统购统销、合同能源管理等不同运营模式下的综合效益,可供政策制定者、投资者、运营商及高校师生量化评估经济收益与节能减排潜力,适合需要快…

2026/10/12 0:22:10 阅读更多 →
MGRE+OSPF隧道组网:NHRP组播配置与典型排错实践

MGRE+OSPF隧道组网:NHRP组播配置与典型排错实践

做Datacom方向认证的人,基本都会做到这样一个进阶实验:在通过非广播网络互联的多台路由器之间,用MGRE把分散站点拉成一张虚拟网,再在这张虚拟网上跑OSPF。听起来不难,实际配置下去你会发现,Hello包发不出去…

2026/10/12 0:22:10 阅读更多 →

最新新闻

JanusGraph 核心能力与存储后端选型:从超大规模图处理到 CAP 权衡

JanusGraph 核心能力与存储后端选型:从超大规模图处理到 CAP 权衡

图数据库分布式数据库后端 【免费下载链接】janusgraph JanusGraph: an open-source, distributed graph database 项目地址: https://gitcode.com/gh_mirrors/ja/janusgraph 点击查看 免费下载 导读:本文围绕 JanusGraph 官方文档《The Benefits of Ja…

2026/10/12 2:03:07 阅读更多 →
Langchain01_框架之模型的创建与调用

Langchain01_框架之模型的创建与调用

模型创建3种方式 1.使用特定的Model Class(最直接,但不好用) LangChain为一些大模型供应商提供了专门的Model类,导入对应的具体类(如 ChatOpenAI、ChatAnthropic、ChatDeepSeek、ChatOllama、ChatHunyuan、ChatTongy…

2026/10/12 2:03:07 阅读更多 →
ET高级定制版与睿排引擎:从智能排版到可打印的完整工程实践

ET高级定制版与睿排引擎:从智能排版到可打印的完整工程实践

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

2026/10/12 2:03:07 阅读更多 →
SQL练习题全解析:从建表到嵌套查询的避坑指南

SQL练习题全解析:从建表到嵌套查询的避坑指南

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

2026/10/12 2:03:07 阅读更多 →
MySQL存储引擎深度对比:InnoDB与MyISAM的差异、调优与迁移实践

MySQL存储引擎深度对比:InnoDB与MyISAM的差异、调优与迁移实践

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

2026/10/12 2:03:07 阅读更多 →
PaperSpine 执行效率方法论:精确复用、昂贵操作凭证与有界失败恢复的工程实践

PaperSpine 执行效率方法论:精确复用、昂贵操作凭证与有界失败恢复的工程实践

AI 技能AI 写作人工智能深度研究AI 应用 【免费下载链接】PaperSpine PaperSpine5 — local-first, evidence-bound paper research, writing, figures, review and delivery. Download: https://wubing2023.github.io/PaperSpine/v5/ 项目地址: https://gitcode.co…

2026/10/12 2:02:07 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →