【Bug已解决】Is there any way I can download the pre-trained models available in PyTorch to a… 解决方案
【Bug已解决】Is there any way I can download the pre-trained models available in PyTorch to a specific path? 解决方案问题描述在使用 PyTorch 的torchvision.models或torch.hub加载预训练模型时模型文件默认下载到~/.cache/torch/hub/checkpoints/或~/.torch/models/目录。许多开发者需要将预训练模型下载到指定路径原因包括服务器上用户主目录空间有限需要将大模型存储到数据盘多用户共享环境需要将模型放在共享目录离线环境需要提前下载模型到指定位置CI/CD 环境中需要缓存模型以加速构建自定义模型管理流程需要统一存储路径然而PyTorch 并没有提供一个简单直接的下载到指定路径的参数。开发者经常遇到以下问题不知道如何更改默认下载路径在离线环境中无法加载模型多次下载同一模型浪费时间在 Docker 容器中路径映射问题TORCH_HOME环境变量不生效本文将系统介绍多种将预训练模型下载到指定路径的方法并提供完整的离线加载方案。错误复现错误场景一默认下载路径不可写import torchvision.models as models # 尝试加载预训练模型 try: model models.resnet50(weightsmodels.ResNet50_Weights.DEFAULT) print(Model loaded successfully) except Exception as e: print(fError: {e}) # 可能的错误: # OSError: [Errno 30] Read-only file system: /root/.cache/torch/hub/checkpoints # 或 PermissionError: [Errno 13] Permission denied错误场景二离线环境无法下载import torchvision.models as models # 在没有网络的环境中 try: model models.resnet50(weightsmodels.ResNet50_Weights.DEFAULT) except Exception as e: print(fError: {e}) # urllib.error.URLError: urlopen error [Errno -3] Temporary failure in name resolution # 或 ConnectionError错误场景三不知道模型下载到了哪里import torchvision.models as models import torch # 加载模型 model models.resnet50(weightsmodels.ResNet50_Weights.DEFAULT) # 模型下载到了哪里 # 默认路径: ~/.cache/torch/hub/checkpoints/resnet50-0676ba61.pth # 但很多开发者不知道这个路径 import os default_path os.path.expanduser(~/.cache/torch/hub/checkpoints/) print(fDefault download path: {default_path}) if os.path.exists(default_path): print(fFiles: {os.listdir(default_path)})错误场景四TORCH_HOME 设置不生效import os # 设置环境变量但可能在 import torch 之后设置不生效 os.environ[TORCH_HOME] /data/models/torch import torch import torchvision.models as models # 检查实际路径 print(fHub dir: {torch.hub.get_dir()}) # 可能仍然是 ~/.cache/torch/hub 而不是 /data/models/torch/hub根因分析1. PyTorch 的模型下载机制PyTorch 加载预训练模型的过程检查本地缓存首先检查TORCH_HOME/hub/checkpoints/目录下是否已有模型文件下载模型如果本地没有从远程 URL 下载加载模型将下载的权重文件加载到模型结构中默认的TORCH_HOME路径Linux/macOS:~/.cache/torch/Windows:C:\Users\username\.cache\torch\2. 环境变量的读取时机TORCH_HOME环境变量在import torch时被读取。如果在import torch之后设置环境变量不会生效。# 错误先 import 再设置 import torch os.environ[TORCH_HOME] /data/models # 太晚了 # 正确先设置再 import import os os.environ[TORCH_HOME] /data/models import torch3. torchvision.models 的权重下载torchvision.models中的预训练模型权重存储在 GitHub Releases 或其他 CDN 上。每个模型有对应的 URL下载后缓存到checkpoints子目录。# torchvision 内部的下载逻辑简化版 def load_state_dict_from_url(url, model_dirNone, ...): if model_dir is None: # 使用默认路径: TORCH_HOME/hub/checkpoints hub_dir torch.hub.get_dir() model_dir os.path.join(hub_dir, checkpoints) os.makedirs(model_dir, exist_okTrue) filename os.path.basename(url) cached_file os.path.join(model_dir, filename) if not os.path.exists(cached_file): # 下载文件 download_url_to_file(url, cached_file, ...) return torch.load(cached_file)4. torch.hub 的机制torch.hub.load()用于加载 GitHub 上的模型仓库下载的代码缓存到TORCH_HOME/hub/目录权重文件缓存到checkpoints子目录。解决方案方案一设置 TORCH_HOME 环境变量import os # 必须在 import torch 之前设置 os.environ[TORCH_HOME] /data/models/torch import torch import torchvision.models as models # 验证路径 print(fHub directory: {torch.hub.get_dir()}) # 输出: /data/models/torch/hub # 加载模型将下载到指定路径 model models.resnet50(weightsmodels.ResNet50_Weights.DEFAULT) print(Model loaded!)也可以在命令行中设置export TORCH_HOME/data/models/torch python your_script.py方案二使用 torch.hub.set_dir()import torch # 在代码中设置 hub 目录 custom_dir /data/models/torch torch.hub.set_dir(custom_dir) print(fHub directory: {torch.hub.get_dir()}) # 输出: /data/models/torch import torchvision.models as models model models.resnet50(weightsmodels.ResNet50_Weights.DEFAULT)方案三手动下载并加载import torch import torchvision.models as models import os import urllib.request def download_model_to_path(url, target_path): 手动下载模型到指定路径 os.makedirs(os.path.dirname(target_path), exist_okTrue) if os.path.exists(target_path): print(fModel already exists: {target_path}) return target_path print(fDownloading model from {url} to {target_path}...) urllib.request.urlretrieve(url, target_path) print(fDownload complete: {target_path}) return target_path # ResNet50 的权重 URL resnet50_url https://download.pytorch.org/models/resnet50-0676ba61.pth target_path /data/models/pretrained/resnet50.pth # 下载 download_model_to_path(resnet50_url, target_path) # 手动加载 model models.resnet50(weightsNone) # 不下载权重 state_dict torch.load(target_path, map_locationcpu) model.load_state_dict(state_dict) print(Model loaded from custom path!)方案四离线加载方案import torch import torchvision.models as models import os class OfflineModelLoader: 离线模型加载器。 从指定目录加载预训练模型不依赖网络。 def __init__(self, model_dir/data/models/pretrained): self.model_dir model_dir os.makedirs(model_dir, exist_okTrue) def load_resnet(self, model_nameresnet50, **kwargs): 加载 ResNet 模型 # 模型名到文件名的映射 filename_map { resnet18: resnet18-f37072fd.pth, resnet34: resnet34-b627a593.pth, resnet50: resnet50-0676ba61.pth, resnet101: resnet101-63fe2227.pth, resnet152: resnet152-394f9c45.pth, } filename filename_map.get(model_name) if not filename: raise ValueError(fUnknown model: {model_name}) model_path os.path.join(self.model_dir, filename) if not os.path.exists(model_path): raise FileNotFoundError( fModel file not found: {model_path}\n fPlease download it first. ) # 创建模型结构不加载预训练权重 model_fn getattr(models, model_name) model model_fn(weightsNone, **kwargs) # 加载权重 state_dict torch.load(model_path, map_locationcpu) model.load_state_dict(state_dict) return model def list_available_models(self): 列出本地可用的模型 if os.path.exists(self.model_dir): return os.listdir(self.model_dir) return [] # 使用 loader OfflineModelLoader(/data/models/pretrained) print(fAvailable models: {loader.list_available_models()}) model loader.load_resnet(resnet50)完整修复代码以下是一个完整的预训练模型管理器支持下载到指定路径、离线加载、缓存管理import torch import torchvision.models as models import os import urllib.request import hashlib from typing import Optional, Dict, List import json # # 1. 预训练模型管理器 # class PretrainedModelManager: 预训练模型管理器。 - 支持下载到指定路径 - 支持离线加载 - 支持缓存管理 - 支持多模型管理 # torchvision 预训练模型的 URL 映射 MODEL_URLS { resnet18: https://download.pytorch.org/models/resnet18-f37072fd.pth, resnet34: https://download.pytorch.org/models/resnet34-b627a593.pth, resnet50: https://download.pytorch.org/models/resnet50-0676ba61.pth, resnet101: https://download.pytorch.org/models/resnet101-63fe2227.pth, resnet152: https://download.pytorch.org/models/resnet152-394f9c45.pth, vgg16: https://download.pytorch.org/models/vgg16-397923af.pth, vgg19: https://download.pytorch.org/models/vgg19-dcbb9e9d.pth, mobilenet_v2: https://download.pytorch.org/models/mobilenet_v2-b0353104.pth, mobilenet_v3_large: https://download.pytorch.org/models/mobilenet_v3_large-8738ca79.pth, efficientnet_b0: https://download.pytorch.org/models/efficientnet_b0_rwightman-3dd342df.pth, efficientnet_b7: https://download.pytorch.org/models/efficientnet_b7_lukemelas-dcc49843.pth, densenet121: https://download.pytorch.org/models/densenet121-a639ec97.pth, wide_resnet50_2: https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth, } def __init__(self, cache_dir: str None): Args: cache_dir: 模型缓存目录。默认为 ~/.cache/torch/hub/checkpoints if cache_dir is None: cache_dir os.path.join(os.path.expanduser(~), .cache, torch, hub, checkpoints) self.cache_dir cache_dir os.makedirs(self.cache_dir, exist_okTrue) # 元数据文件 self.metadata_file os.path.join(self.cache_dir, model_metadata.json) self.metadata self._load_metadata() def _load_metadata(self) - Dict: 加载元数据 if os.path.exists(self.metadata_file): with open(self.metadata_file, r) as f: return json.load(f) return {} def _save_metadata(self): 保存元数据 with open(self.metadata_file, w) as f: json.dump(self.metadata, f, indent2) def download_model(self, model_name: str, force: bool False) - str: 下载预训练模型到缓存目录。 Args: model_name: 模型名称 force: 是否强制重新下载 Returns: 模型文件路径 if model_name not in self.MODEL_URLS: raise ValueError(fUnknown model: {model_name}. fAvailable: {list(self.MODEL_URLS.keys())}) url self.MODEL_URLS[model_name] filename os.path.basename(url) filepath os.path.join(self.cache_dir, filename) if os.path.exists(filepath) and not force: print(fModel already cached: {filepath}) return filepath print(fDownloading {model_name} from {url}...) print(fTarget path: {filepath}) # 下载 try: urllib.request.urlretrieve(url, filepath) file_size os.path.getsize(filepath) / (1024 * 1024) print(fDownload complete! Size: {file_size:.1f} MB) # 计算文件哈希 file_hash self._compute_hash(filepath) # 更新元数据 self.metadata[model_name] { url: url, filename: filename, filepath: filepath, size_mb: round(file_size, 1), hash: file_hash, download_time: os.path.getmtime(filepath), } self._save_metadata() return filepath except Exception as e: print(fDownload failed: {e}) if os.path.exists(filepath): os.remove(filepath) raise def _compute_hash(self, filepath: str, algorithm: str sha256) - str: 计算文件哈希 hasher hashlib.new(algorithm) with open(filepath, rb) as f: while True: chunk f.read(65536) if not chunk: break hasher.update(chunk) return hasher.hexdigest() def load_model(self, model_name: str, download_if_missing: bool True, **model_kwargs) - torch.nn.Module: 加载预训练模型。 Args: model_name: 模型名称 download_if_missing: 如果本地没有是否自动下载 model_kwargs: 模型参数 Returns: 加载好权重的模型 if model_name not in self.MODEL_URLS: raise ValueError(fUnknown model: {model_name}) url self.MODEL_URLS[model_name] filename os.path.basename(url) filepath os.path.join(self.cache_dir, filename) if not os.path.exists(filepath): if download_if_missing: self.download_model(model_name) else: raise FileNotFoundError( fModel file not found: {filepath}\n fSet download_if_missingTrue to download automatically. ) # 创建模型结构 model_fn getattr(models, model_name) model model_fn(weightsNone, **model_kwargs) # 加载权重 state_dict torch.load(filepath, map_locationcpu) model.load_state_dict(state_dict) return model def list_cached_models(self) - List[Dict]: 列出已缓存的模型 cached [] for model_name, info in self.metadata.items(): filepath info.get(filepath, ) exists os.path.exists(filepath) cached.append({ name: model_name, filename: info.get(filename, ), size_mb: info.get(size_mb, 0), exists: exists, hash: info.get(hash, )[:16] ..., }) return cached def list_available_models(self) - List[str]: 列出所有可用的模型 return list(self.MODEL_URLS.keys()) def remove_model(self, model_name: str): 删除缓存的模型 if model_name in self.metadata: filepath self.metadata[model_name].get(filepath) if filepath and os.path.exists(filepath): os.remove(filepath) print(fRemoved: {filepath}) del self.metadata[model_name] self._save_metadata() else: print(fModel not in metadata: {model_name}) def clear_cache(self): 清空所有缓存 for model_name in list(self.metadata.keys()): self.remove_model(model_name) print(Cache cleared.) def get_cache_size(self) - float: 获取缓存总大小MB total 0 for info in self.metadata.values(): filepath info.get(filepath, ) if os.path.exists(filepath): total os.path.getsize(filepath) return total / (1024 * 1024) def verify_model(self, model_name: str) - bool: 验证模型文件完整性 if model_name not in self.metadata: return False info self.metadata[model_name] filepath info.get(filepath, ) if not os.path.exists(filepath): return False current_hash self._compute_hash(filepath) stored_hash info.get(hash, ) return current_hash stored_hash # # 2. 环境配置工具 # class TorchEnvConfig: PyTorch 环境配置工具。 staticmethod def set_torch_home(path: str): 设置 TORCH_HOME 环境变量 os.environ[TORCH_HOME] path os.makedirs(os.path.join(path, hub, checkpoints), exist_okTrue) print(fTORCH_HOME set to: {path}) staticmethod def set_hub_dir(path: str): 设置 hub 目录 import torch torch.hub.set_dir(path) print(fHub directory set to: {torch.hub.get_dir()}) staticmethod def get_current_paths(): 获取当前路径配置 import torch return { TORCH_HOME: os.environ.get(TORCH_HOME, Not set), hub_dir: torch.hub.get_dir(), checkpoints_dir: os.path.join(torch.hub.get_dir(), checkpoints), } staticmethod def print_info(): 打印当前环境信息 import torch paths TorchEnvConfig.get_current_paths() print( * 50) print(PyTorch Environment Info) print( * 50) print(fPyTorch version: {torch.__version__}) print(fCUDA available: {torch.cuda.is_available()}) for key, value in paths.items(): print(f{key}: {value}) print( * 50) # # 3. 批量下载工具 # def batch_download_models(model_names: List[str], target_dir: str): 批量下载多个预训练模型。 Args: model_names: 模型名称列表 target_dir: 目标目录 manager PretrainedModelManager(cache_dirtarget_dir) print(fDownloading {len(model_names)} models to: {target_dir}\n) success [] failed [] for name in model_names: try: print(f--- {name} ---) manager.download_model(name) success.append(name) except Exception as e: print(fFailed: {e}) failed.append(name) print() print( * 50) print(fDownload Summary:) print(f Success: {len(success)} - {success}) print(f Failed: {len(failed)} - {failed}) print(f Total cache size: {manager.get_cache_size():.1f} MB) return success, failed # # 4. 主程序 # def main(): print(PyTorch Pretrained Model Path Management) print( * 60) # 1. 显示当前环境 TorchEnvConfig.print_info() # 2. 创建模型管理器指定自定义路径 custom_path os.path.expanduser(~/my_models/torch_pretrained) manager PretrainedModelManager(cache_dircustom_path) print(f\nCache directory: {manager.cache_dir}) print(fAvailable models: {manager.list_available_models()}) # 3. 下载一个模型 print(\n--- Downloading ResNet18 ---) try: model_path manager.download_model(resnet18) print(fModel saved to: {model_path}) except Exception as e: print(fDownload failed (expected in offline env): {e}) # 4. 加载模型 print(\n--- Loading Model ---) try: model manager.load_model(resnet18, download_if_missingTrue) print(fModel loaded successfully!) print(fModel type: {type(model).__name__}) print(fParameters: {sum(p.numel() for p in model.parameters()):,}) except Exception as e: print(fLoad failed: {e}) # 5. 列出缓存 print(\n--- Cached Models ---) cached manager.list_cached_models() for m in cached: print(f {m[name]}: {m[size_mb]}MB, exists{m[exists]}) print(f\nTotal cache size: {manager.get_cache_size():.1f} MB) # 6. 验证模型 print(\n--- Model Verification ---) for name in [m[name] for m in cached]: valid manager.verify_model(name) print(f {name}: {Valid if valid else Invalid}) # 7. 演示离线加载 print(\n--- Offline Loading Demo ---) try: model manager.load_model(resnet18, download_if_missingFalse) print(Offline load successful!) except FileNotFoundError as e: print(fOffline load failed: {e}) if __name__ __main__: main()常见陷阱与注意事项1. 环境变量设置时机TORCH_HOME必须在import torch之前设置。如果在 Jupyter Notebook 中需要在第一个单元格中设置然后重启内核。# 正确 import os os.environ[TORCH_HOME] /data/models import torch # 错误 import torch os.environ[TORCH_HOME] /data/models # 不生效2. torchvision 版本差异不同版本的 torchvision 使用不同的 API 加载预训练权重# torchvision 0.13 (新 API) model models.resnet50(weightsmodels.ResNet50_Weights.DEFAULT) model models.resnet50(weightsmodels.ResNet50_Weights.IMAGENET1K_V1) # torchvision 0.13 (旧 API已弃用) model models.resnet50(pretrainedTrue)3. 权重文件的命名不同版本的 torchvision 可能为同一模型使用不同的权重文件名。下载时确保使用与你的 torchvision 版本匹配的 URL。4. map_location 的重要性加载模型时使用map_locationcpu可以避免在没有 GPU 的环境中报错# 安全的加载方式 state_dict torch.load(filepath, map_locationcpu) model.load_state_dict(state_dict)5. Docker 中的路径映射在 Docker 中使用自定义模型路径时需要将宿主机目录映射到容器中docker run -v /host/models:/container/models \ -e TORCH_HOME/container/models/torch \ your_image6. 多进程环境下的下载竞争在多进程训练中多个进程可能同时尝试下载同一模型。使用文件锁或提前下载来避免竞争import fcntl def safe_download(url, filepath): lock_file filepath .lock with open(lock_file, w) as f: fcntl.flock(f, fcntl.LOCK_EX) # 排他锁 if not os.path.exists(filepath): urllib.request.urlretrieve(url, filepath) fcntl.flock(f, fcntl.LOCK_UN)7. Hugging Face 模型的路径Hugging Face Transformers 使用不同的缓存机制from transformers import AutoModel # 设置缓存目录 model AutoModel.from_pretrained(bert-base-uncased, cache_dir/data/models/hf)8. 模型哈希验证下载后验证模型文件的哈希值确保文件完整import hashlib def verify_file(filepath, expected_hash): hasher hashlib.sha256() with open(filepath, rb) as f: for chunk in iter(lambda: f.read(65536), b): hasher.update(chunk) return hasher.hexdigest() expected_hash9. 模型版本管理不同版本的预训练权重可能有不同的性能表现。建议记录使用的权重版本# 记录模型版本 model_info { name: resnet50, weights: IMAGENET1K_V1, url: https://download.pytorch.org/models/resnet50-0676ba61.pth, hash: sha256:..., }总结将 PyTorch 预训练模型下载到指定路径的方法设置TORCH_HOME环境变量最简单的方法在import torch之前设置。影响所有 PyTorch 模型的下载路径。使用torch.hub.set_dir()在代码中动态设置适合需要根据条件选择路径的场景。手动下载并加载最灵活的方法完全控制下载路径和加载过程。适合离线环境和自定义管理。使用模型管理器本文提供的PretrainedModelManager类封装了下载、加载、缓存管理、完整性验证等功能适合生产环境使用。最佳实践在项目初始化时统一设置模型路径使用元数据文件记录模型版本和哈希在 CI/CD 中提前下载模型运行时离线加载在多用户环境中使用共享路径定期验证模型文件完整性通过本文的方法你可以完全控制预训练模型的存储位置适应各种部署环境和需求。

相关新闻

COMSOL多孔介质粒子追踪仿真:从流场耦合到捕获效率完整案例

COMSOL多孔介质粒子追踪仿真:从流场耦合到捕获效率完整案例

做多孔介质里粒子追踪仿真,我最初的踩坑几乎都在网格和收敛上。后来把COMSOL里流体流动模块和粒子追踪模块的耦合关系吃透了,才开始真正能拿到"能用来写论文、能跟实验对上数"的轨迹结果。这篇就用一个完整的案例,从物理原理、几何…

2026/10/13 21:56:43 阅读更多 →
用Python生成隐藏式微信号动态GIF:五种动效实现与踩坑指南

用Python生成隐藏式微信号动态GIF:五种动效实现与踩坑指南

某次行业交流会上,我在一个展位的接待台前站了很久。台上立牌印的不是普通二维码,而是一张循环播放的动态GIF:画面先是偏暗的一块底板,一道亮条从左扫到右,扫过的地方“显影”出一串微信号,扫完又暗回去&am…

2026/10/13 21:56:43 阅读更多 →
Python Pillow图像处理实战:从基础操作到批量脚本

Python Pillow图像处理实战:从基础操作到批量脚本

想处理图片但不想每次打开 Photoshop 来回点鼠标?用 Python 的 Pillow 写几行脚本,就能完成批量改尺寸、加水印、转格式、打滤镜这些活儿。Pillow 是 Python 生态里最常用的图像处理库,也是对新手最友好、文档最齐全的一个。你不需要懂图像编…

2026/10/13 21:56:43 阅读更多 →

最新新闻

NPOI+Unity:Word模板占位符替换与docx处理完整实战

NPOI+Unity:Word模板占位符替换与docx处理完整实战

接了个内部工具需求,用户要在不装Office的Windows机器上,用Unity客户端打开一份Word模板,把模板里的【项目名称】【客户单位】【编制人】【日期】这类占位符替换成实际内容,然后另存为新文档,供后续打印和归档。起初我…

2026/10/13 22:54:13 阅读更多 →
SpringBoot东阳非遗木雕文化交流网站:从毕设选题到数字化传承的实现

SpringBoot东阳非遗木雕文化交流网站:从毕设选题到数字化传承的实现

每年到了毕设答辩季,选题群里总会出现两类人:一类拿着电商系统换个皮肤到处问行不行,另一类想找个"有文化含量又不太难实现"的题目。我自己的SpringBoot东阳非遗木雕文化交流网站,基本属于第二类。它从表面看很像"…

2026/10/13 22:54:13 阅读更多 →
PMXT 与 Telonex 怎么选?prediction-market-backtesting 预测市场回测数据供应商完整选型指南

PMXT 与 Telonex 怎么选?prediction-market-backtesting 预测市场回测数据供应商完整选型指南

【免费下载链接】prediction-market-backtesting An extension for Nautilus Trader 项目地址: https://gitcode.com/gh_mirrors/pr/prediction-market-backtesting 点击查看 免费下载 prediction-market-backtesting 是一个构建在 NautilusTrader 之上的 Polymark…

2026/10/13 22:54:13 阅读更多 →
Grafana Mimir Compartments 架构深度解析:以读写分区将单租户扩展到百亿级活跃序列

Grafana Mimir Compartments 架构深度解析:以读写分区将单租户扩展到百亿级活跃序列

时序数据库后端数据存储可观测性云原生 【免费下载链接】mimir Grafana Mimir provides horizontally scalable, highly available, multi-tenant, long-term storage for Prometheus. 项目地址: https://gitcode.com/gh_mirrors/mimir/mimir 点击查看 免费下载 导…

2026/10/13 22:54:13 阅读更多 →
Pollinations DreamShaper GPU 路由:从 Sana 别名到 Vast 双 Worker 的自托管图像推理链路

Pollinations DreamShaper GPU 路由:从 Sana 别名到 Vast 双 Worker 的自托管图像推理链路

AI 应用媒体生成后端前端 【免费下载链接】pollinations Your Friendly Open-Source Gen-AI Platform 项目地址: https://gitcode.com/gh_mirrors/po/pollinations 点击查看 免费下载 本篇指南围绕 operations/infrastructure/gpu/dreamshaper/SERVERS.md 展开&…

2026/10/13 22:54:13 阅读更多 →
写作工具越简单越好?我在纯文本里找回了专注与效率

写作工具越简单越好?我在纯文本里找回了专注与效率

1. 从“不要赶路”到“还在赶路”:一轮纯文本工具带来的节奏反思写下这个标题的时候,我刚结束一趟长途自驾。回来之后,我打开一个新建的纯文本文件,把所有碎碎念倒进去,然后盯着光标发呆——这和出发前计划好的“路上写…

2026/10/13 22:53:12 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →