基于LSTM的五类动作识别源码包:从视频特征提取到可视化全流程
简介这份资源面向深度学习入门者、课程设计与毕业设计学生以及需要快速验证行为识别方案的技术人员提供一套可直接运行的五类动作识别项目源码。项目覆盖jump、walk、pickup、salute、wave五种日常动作并实现LSTM、TA-LSTM、SA-LSTM、STA-LSTM四种网络结构每类模型均配有训练好的权重文件与准确率、损失曲线图便于对比不同结构的训练表现。压缩包共41个文件约27.99MB包含10个Python脚本、5个h5权重、6个mp4动作样本、14张png可视化图表以及数据集目录、模型定义目录和说明文档结构清晰覆盖数据预处理、模型训练、验证与单视频预测全流程。已有44人学习关注。读者可借助现成代码与权重快速复现实验理解时序建模与注意力机制在视频分析中的差异并在此基础上替换数据集或调整网络完成自己的课题验证。1. 含5类动作识别的LSTM系列模型源码包从视频到可视化图表的完整落地路径手里有一批标注好的动作视频想用 LSTM 做五分类动作识别却卡在“视频怎么变成 LSTM 吃得下的张量”这一步——这是很多做行为识别方向的开发者都会遇到的场景。含5类动作识别的LSTM系列模型源码包本质上解决的就是这条链路从原始视频抽帧、关键点或特征序列提取到 LSTM/LSTMAttention 等系列模型训练再到混淆矩阵、准确率曲线、时序预测对比图等可视化图表输出。它适合两类人一类是刚接触时序动作识别、想跑通一个完整 pipeline 的新手另一类是已有 CNN 特征提取能力、想把时序建模部分补齐的熟手。这篇笔记不讲空泛概念只讲这条链路怎么搭、参数怎么设、哪里容易翻车。2. 五类动作识别为什么选 LSTM时序建模的选型逻辑与数据准备2.1 LSTM 在动作识别里的定位它到底吃的是什么数据动作识别按输入形态大致分三条路一是直接把视频帧堆叠送进 3D CNN二是先用 CNN 逐帧提特征再把特征序列交给时序模型三是基于骨架关键点序列做时序分类。LSTM 系列模型主要吃的是后两种——定长的特征序列。也就是说LSTM 本身不处理原始像素它处理的是形状为(batch, timesteps, feature_dim)的三维张量。理解这一点很关键因为它决定了整个数据准备的方向。假设你有 5 类动作每类动作视频长度不一那么你需要先确定一个统一的timesteps比如 30 帧或 60 帧。短于这个长度的序列做填充长于这个长度的做采样或截断。feature_dim则取决于你用什么特征如果用 CNN 提特征可能是 512 或 2048如果用骨架关键点可能是 2×17×3 展平后的维度。常见做法是先用一个轻量 CNN如 MobileNet 或 ResNet 的某一层对每帧提特征缓存成.npy文件训练 LSTM 时直接读缓存。这样避免每个 epoch 都重新过一遍 CNN训练速度能差出好几倍。我一般会先把所有视频抽帧、提特征、存成(N, T, D)的大数组再按类别分目录训练时用Dataset按索引取。2.2 五类动作数据集的目录结构与抽帧脚本源码包类项目最怕目录乱。我习惯按下面的结构组织后面写 DataLoader 时直接按这个约定走dataset/ train/ action_01/ video_001.mp4 video_002.mp4 action_02/ ... action_05/ val/ action_01/ ... features/ train/ action_01/ video_001.npy ...抽帧和提特征用一个脚本搞定核心是控制采样密度。下面是一个可复现的抽帧提特征骨架import cv2 import numpy as np import os from torchvision import models, transforms import torch # 统一采样帧数短补长截 TARGET_FRAMES 30 # 特征维度取决于所用CNN这里以ResNet18的512维为例 FEAT_DIM 512 def sample_frames(video_path, targetTARGET_FRAMES): cap cv2.VideoCapture(video_path) frames [] while True: ret, frame cap.read() if not ret: break frames.append(frame) cap.release() total len(frames) if total 0: return None # 均匀采样索引保证时序覆盖均匀 idxs np.linspace(0, total - 1, target).astype(int) return [frames[i] for i in idxs] def extract_features(frames, model, device): preprocess transforms.Compose([ transforms.ToPILImage(), transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) batch torch.stack([preprocess(f) for f in frames]).to(device) with torch.no_grad(): # 取全局平均池化后的特征形状 (T, 512) feats model(batch) return feats.cpu().numpy() # 初始化去掉分类头的ResNet18 backbone models.resnet18(pretrainedTrue) backbone.fc torch.nn.Identity() backbone.eval().to(cuda if torch.cuda.is_available() else cpu)这段代码的逻辑说明sample_frames用np.linspace做均匀采样而不是取前 30 帧或随机取这样能保证动作的完整时序被覆盖。extract_features里把fc层替换成Identity输出就是 512 维特征。参数上TARGET_FRAMES设 30 是五类动作识别的常见起点动作周期短可以降到 16长动作可以升到 60但要注意 LSTM 的序列长度和显存占用是线性关系。注意抽帧时如果视频本身帧率很低比如 15fps均匀采样 30 帧可能覆盖不到 2 秒这时要结合动作的实际时长调整TARGET_FRAMES不要盲目套用。2.3 特征缓存与标签映射避免训练时重复读视频提完特征后每个视频对应一个(30, 512)的.npy文件。训练时用Dataset读这些文件同时把五类动作映射成 0 到 4 的整数标签。这里有个容易忽略的点类别顺序必须固定训练集和验证集用同一套映射否则混淆矩阵的轴会对不上。import numpy as np from torch.utils.data import Dataset CLASS_MAP {action_01: 0, action_02: 1, action_03: 2, action_04: 3, action_05: 4} class ActionDataset(Dataset): def __init__(self, feature_root): self.samples [] for cls_name, label in CLASS_MAP.items(): cls_dir os.path.join(feature_root, cls_name) for fname in os.listdir(cls_dir): if fname.endswith(.npy): self.samples.append( (os.path.join(cls_dir, fname), label)) def __len__(self): return len(self.samples) def __getitem__(self, idx): path, label self.samples[idx] feat np.load(path) # 形状 (30, 512) return torch.tensor(feat, dtypetorch.float32), label逻辑上CLASS_MAP是全局唯一的标签定义ActionDataset只负责按路径读特征和返回标签。参数方面feature_root指向features/train或features/val。如果特征维度不是 512比如用了 ResNet50 就是 2048那 LSTM 的input_size要同步改这个后面模型定义时会再提。3. LSTM系列模型源码包的核心实现从单层LSTM到Attention变体3.1 单层LSTM基线最小可跑通的模型定义源码包里通常不会只给一个模型而是给一组对比模型方便你看出不同结构的差异。最基础的基线是单层 LSTM 接全连接分类头。它的作用是先跑通链路确认数据没问题再往上加结构。import torch.nn as nn class LSTMClassifier(nn.Module): def __init__(self, input_size512, hidden_size256, num_layers1, num_classes5, dropout0.3): super().__init__() self.lstm nn.LSTM( input_sizeinput_size, hidden_sizehidden_size, num_layersnum_layers, batch_firstTrue, dropoutdropout if num_layers 1 else 0 ) self.classifier nn.Sequential( nn.Dropout(dropout), nn.Linear(hidden_size, num_classes) ) def forward(self, x): # x: (batch, timesteps, input_size) out, (h_n, c_n) self.lstm(x) # 取最后一个时间步的隐状态做分类 last out[:, -1, :] return self.classifier(last)逻辑说明batch_firstTrue让输入形状是(batch, T, D)和前面 Dataset 返回的形状一致。out[:, -1, :]取最后一个时间步这是最常用的池化方式。参数上hidden_size256是五分类任务的常见起点数据量小可以降到 128数据量大可以升到 512。num_layers1时dropout不生效这是 PyTorch 的行为不要误以为设了没用。3.2 双向LSTM与Attention变体什么场景下值得加单层 LSTM 跑通后常见的两个升级方向是双向 LSTM 和加 Attention。双向 LSTM 适合动作的上下文信息前后都重要的场景比如“拿起-放下”这类动作后面的帧能帮助理解前面的帧。Attention 则适合序列里有少数关键帧决定分类结果的场景比如某个动作只在中间几帧有明显特征。class BiLSTMAttention(nn.Module): def __init__(self, input_size512, hidden_size256, num_classes5, dropout0.3): super().__init__() self.bilstm nn.LSTM( input_sizeinput_size, hidden_sizehidden_size, num_layers2, batch_firstTrue, bidirectionalTrue, dropoutdropout ) # 双向输出维度是 hidden_size * 2 self.attn nn.Linear(hidden_size * 2, 1) self.classifier nn.Sequential( nn.Dropout(dropout), nn.Linear(hidden_size * 2, num_classes) ) def forward(self, x): out, _ self.bilstm(x) # (batch, T, hidden*2) # 计算每个时间步的注意力权重 score self.attn(out) # (batch, T, 1) weight torch.softmax(score, dim1) # 加权求和得到序列表示 context torch.sum(out * weight, dim1) return self.classifier(context)逻辑说明bidirectionalTrue让输出维度翻倍所以attn和classifier的输入维度都是hidden_size * 2。torch.softmax(score, dim1)在时间维度上归一化保证权重和为 1。参数上双向 LSTM 的num_layers2时dropout才生效这里设 0.3 是防止过拟合的常见值。Attention 的引入会让模型多出少量参数但训练时间增加不明显适合作为默认升级项。3.3 训练循环与关键超参学习率、批次大小、早停模型定义好后训练循环里有几个参数直接决定能不能收敛。我一般用 Adam 优化器学习率从 1e-3 开始配合ReduceLROnPlateau在验证损失不降时减半。批次大小设 16 或 32取决于显存。早停的耐心值设 10 个 epoch避免过拟合。from torch.optim import Adam from torch.optim.lr_scheduler import ReduceLROnPlateau import torch.nn as nn device cuda if torch.cuda.is_available() else cpu model BiLSTMAttention().to(device) optimizer Adam(model.parameters(), lr1e-3, weight_decay1e-4) scheduler ReduceLROnPlateau(optimizer, modemin, factor0.5, patience5) criterion nn.CrossEntropyLoss() best_val_loss float(inf) patience_counter 0 EARLY_STOP_PATIENCE 10 for epoch in range(100): model.train() for feat, label in train_loader: feat, label feat.to(device), label.to(device) optimizer.zero_grad() logits model(feat) loss criterion(logits, label) loss.backward() # 梯度裁剪防止LSTM梯度爆炸 nn.utils.clip_grad_norm_(model.parameters(), max_norm5.0) optimizer.step() # 验证阶段 model.eval() val_loss 0.0 with torch.no_grad(): for feat, label in val_loader: feat, label feat.to(device), label.to(device) logits model(feat) val_loss criterion(logits, label).item() val_loss / len(val_loader) scheduler.step(val_loss) if val_loss best_val_loss: best_val_loss val_loss torch.save(model.state_dict(), best_model.pth) patience_counter 0 else: patience_counter 1 if patience_counter EARLY_STOP_PATIENCE: break逻辑说明clip_grad_norm_的max_norm5.0是 LSTM 训练的常用值能有效防止梯度爆炸导致的 loss 变 NaN。weight_decay1e-4是轻量正则化。ReduceLROnPlateau的patience5表示验证损失连续 5 个 epoch 不降就减半学习率。早停的EARLY_STOP_PATIENCE10是经验值数据量小可以降到 5数据量大可以升到 15。注意如果训练 loss 一直不降先检查特征是否归一化、标签是否对错位再调学习率。LSTM 对输入尺度敏感特征没归一化时学习率要设得更小。4. 可视化图表怎么出混淆矩阵、准确率曲线与时序预测对比4.1 混淆矩阵与分类报告看出哪两类容易混五分类任务里最容易出问题的是两个动作在时序上相似比如“挥手”和“举手”。混淆矩阵能直接暴露这个问题。源码包里一般会提供sklearn的confusion_matrix和classification_report封装。import matplotlib.pyplot as plt import seaborn as sns from sklearn.metrics import confusion_matrix, classification_report import numpy as np def plot_confusion(y_true, y_pred, class_names): cm confusion_matrix(y_true, y_pred) plt.figure(figsize(8, 6)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabelsclass_names, yticklabelsclass_names) plt.xlabel(Predicted) plt.ylabel(True) plt.title(Confusion Matrix) plt.tight_layout() plt.savefig(confusion_matrix.png, dpi150) plt.close() # 同时打印分类报告 print(classification_report(y_true, y_pred, target_namesclass_names))逻辑说明sns.heatmap的annotTrue会在格子里显示数值fmtd保证显示整数。class_names要和CLASS_MAP的顺序一致。参数上dpi150是论文插图常用的分辨率再高文件会很大。分类报告里的f1-score比准确率更能反映类别不均衡时的真实表现。4.2 训练曲线与学习率变化判断过拟合和欠拟合准确率曲线和损失曲线是判断模型状态最直接的工具。我习惯把训练和验证的 loss、accuracy 画在同一张图里同时把学习率变化也画出来方便对应。def plot_curves(train_losses, val_losses, train_accs, val_accs, lrs): fig, axes plt.subplots(1, 3, figsize(18, 5)) epochs range(1, len(train_losses) 1) axes[0].plot(epochs, train_losses, labelTrain Loss) axes[0].plot(epochs, val_losses, labelVal Loss) axes[0].set_xlabel(Epoch) axes[0].set_ylabel(Loss) axes[0].legend() axes[1].plot(epochs, train_accs, labelTrain Acc) axes[1].plot(epochs, val_accs, labelVal Acc) axes[1].set_xlabel(Epoch) axes[1].set_ylabel(Accuracy) axes[1].legend() axes[2].plot(epochs, lrs, labelLR, colorgreen) axes[2].set_xlabel(Epoch) axes[2].set_ylabel(Learning Rate) axes[2].legend() plt.tight_layout() plt.savefig(training_curves.png, dpi150) plt.close()逻辑说明三张子图分别对应损失、准确率、学习率。train_losses和val_losses在每个 epoch 结束后追加。参数上如果验证损失先降后升说明过拟合可以加 dropout 或减模型容量如果两者都居高不下说明欠拟合可以加层或加特征维度。4.3 时序预测对比图单样本的逐帧预测可视化这个图在源码包里容易被忽略但对调试很有用。它展示的是某个验证样本在每个时间步上的预测概率变化能看出模型是在哪几帧“犹豫”的。def plot_temporal_prediction(model, sample_feat, true_label, class_names, device): model.eval() with torch.no_grad(): feat sample_feat.unsqueeze(0).to(device) # 取LSTM每个时间步的输出做逐帧分类 out, _ model.bilstm(feat) score model.attn(out) weight torch.softmax(score, dim1) context torch.sum(out * weight, dim1) probs torch.softmax(model.classifier(context), dim1) probs probs.squeeze(0).cpu().numpy() plt.figure(figsize(10, 4)) plt.bar(class_names, probs) plt.axhline(y1/len(class_names), colorr, linestyle--, labelRandom) plt.title(fTrue: {class_names[true_label]}) plt.ylabel(Probability) plt.legend() plt.tight_layout() plt.savefig(temporal_prediction.png, dpi150) plt.close()逻辑说明这里展示的是整个序列加权后的分类概率分布axhline画的是随机猜测的基线五分类是 0.2。参数上sample_feat是单个(30, 512)的特征。如果要做逐帧预测曲线可以把classifier作用到每个时间步的out上画出(T, num_classes)的曲线但要注意双向 LSTM 的每个时间步已经包含了前后文信息。5. 避坑与排查五类动作识别训练中最容易翻车的五个点5.1 现象训练准确率很高验证准确率只有随机水平原因最常见的是特征和标签错位。比如ActionDataset里os.listdir的顺序在不同系统上不一致导致特征文件和标签对不上。另一个原因是抽帧时视频读取失败返回了空列表特征文件是空的或全零。解决在__getitem__里加断言检查特征形状assert feat.shape (30, 512)。同时打印前几个样本的标签和文件名人工核对。如果用的是缓存特征重新生成一遍并检查文件大小是否一致。5.2 现象loss 变成 NaN训练直接中断原因LSTM 的梯度爆炸或者学习率设得太大。特征没有归一化时输入尺度过大也会导致这个问题。解决加clip_grad_norm_(model.parameters(), max_norm5.0)学习率从 1e-3 降到 1e-4 试。检查特征是否做了标准化np.load出来的特征如果均值不在 0 附近先做(feat - mean) / std。5.3 现象混淆矩阵里某两类几乎完全混在一起原因这两类动作在时序特征上区分度不够或者采样帧数太少关键动作段没被覆盖到。解决先看这两类的视频确认动作本身是否真的相似。如果是增加TARGET_FRAMES到 60或者换用更强的 CNN 特征如 ResNet50。也可以在 Attention 层加可视化看模型关注的是哪些帧。5.4 现象训练速度极慢一个 epoch 要几十分钟原因没有缓存特征每个 epoch 都在重新读视频和过 CNN。或者num_workers设成了 0数据加载是单线程。解决先把特征提完存成.npy训练时只读特征。DataLoader的num_workers设成 4 或 8pin_memoryTrue。如果特征文件很多可以用np.memmap或 HDF5 合并成一个大文件减少小文件读取开销。5.5 现象可视化图表保存后是空白或乱码原因matplotlib在无图形界面的服务器上默认后端不支持显示或者中文字体缺失导致标签变成方块。解决在脚本开头加import matplotlib; matplotlib.use(Agg)强制用非交互后端。中文字体问题可以设plt.rcParams[font.sans-serif] [DejaVu Sans]或者把类别名改成英文。保存时用plt.savefig而不是plt.show。6. 从跑通到用好LSTM动作识别的进阶调优与验证习惯跑通五类动作识别的 LSTM 源码包只是起点真正决定效果的是后面这些调优动作。我自己的习惯是先固定数据 pipeline再调模型结构最后调超参。顺序反了很容易在错误的数据上调出一个“看起来不错”的模型换一批数据就崩。第一个进阶方向是特征层面的替换。源码包里默认用 ResNet18 提特征但你可以换成时序更敏感的 backbone比如在 ImageNet 上预训练的 SlowFast 或 TSM。替换后input_size要同步改LSTM 的hidden_size也可以适当加大。验证方法是固定 LSTM 结构不变只换特征看验证集准确率的变化。如果换了更强的特征但准确率没涨说明瓶颈在时序建模不在特征。第二个方向是序列长度的自适应。固定TARGET_FRAMES30对短动作可能冗余对长动作可能不够。可以按动作类别分别设不同的采样帧数或者用可变长度序列配合pack_padded_sequence。后者需要 Dataset 返回真实长度训练时用nn.utils.rnn.pack_padded_sequence打包LSTM 会自动忽略填充部分。这个改动对准确率的提升在动作时长差异大的数据集上比较明显。第三个方向是交叉验证。五类动作如果每类样本数不多单次划分验证集的结果波动会很大。我一般用 5 折交叉验证每折都保存混淆矩阵和准确率最后看均值和方差。方差大的类别说明样本代表性不够需要补数据或做数据增强。数据增强在时序特征上可以做时间抖动、随机裁剪、加高斯噪声但要注意不要破坏动作的时序逻辑。验证习惯上我坚持每跑完一个模型就存三样东西best_model.pth、confusion_matrix.png、training_curves.png。这三个文件放在以时间戳命名的目录里后面对比不同模型时直接翻图比翻日志快得多。另外验证集和测试集要严格分开测试集只在最后跑一次不要用它来调参否则那个准确率就是自欺欺人。最后一个具体技巧如果五类动作里有明显的不均衡比如某一类样本数是其他的三倍CrossEntropyLoss要加weight参数权重按类别频率的倒数设置。同时看分类报告时重点看macro avg的 f1而不是accuracy。这个细节在源码包里经常被忽略但实际项目里几乎每次都会遇到。我自己踩过最深的一个坑是早期为了省事把验证集也拿去提特征时用了和训练集一样的归一化参数结果验证集的分布和训练集不一致准确率虚高。后来改成归一化参数只在训练集上统计再应用到验证集和测试集结果才真实。这个习惯希望你能一开始就养成。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Ventoy 多合一启动盘实战:一次部署,镜像即拷即用

Ventoy 多合一启动盘实战:一次部署,镜像即拷即用

简介:Ventoy 是一款开源的可启动 U 盘制作工具,面向系统运维、装机测试与多系统启动盘需求的技术人员。它解决的核心痛点是无需反复格式化磁盘,只需将 ISO/WIM/IMG/VHD(x)/EFI 等镜像文件复制到 U 盘即可启动,并支持一次放入多个镜…

2026/10/13 1:59:18 阅读更多 →
Win10下用VS2017与CMake编译OpenCV 4.5.1并集成contrib模块的完整指南

Win10下用VS2017与CMake编译OpenCV 4.5.1并集成contrib模块的完整指南

简介:一份专为Windows平台计算机视觉开发者准备的OpenCV 4.5.1contrib重新编译成果,基于win10、VS2017与CMake构建,解决在官方发行版中无法直接使用SIFT、SURF等contrib模块功能的痛点。包体为RAR压缩包,共992个文件、约47.65MB&a…

2026/10/13 1:59:18 阅读更多 →
STM32CubeIDE集成RT-Thread实战:从裸机到多任务调度

STM32CubeIDE集成RT-Thread实战:从裸机到多任务调度

/* 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 1:59:18 阅读更多 →

最新新闻

SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0学生信息管理系统实战

SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0学生信息管理系统实战

接手过一个学生信息管理系统的小项目,技术栈正好是SpringBoot2 Vue3 MyBatis-Plus MySQL8.0,标题里这套组合一眼看去很常见,但真正从零落地的时候,细节远比想象中多。当初团队里有人建议用老掉牙的JSP那套,也有人建…

2026/10/13 2:34:32 阅读更多 →
SpringBoot+Vue私房菜定制上门服务系统开发实战解析

SpringBoot+Vue私房菜定制上门服务系统开发实战解析

一个 SpringBoot Vue 的私房菜定制上门服务系统,光看标题可能觉得就是一个普通的管理系统,但真正动手做过的人会知道,这类“定制 上门 多角色”的业务模型,远比表面看起来复杂。它不是简单的 CRUD 堆砌,订单状态的流…

2026/10/13 2:34:32 阅读更多 →
ModernZ键盘快捷键绑定教程:input.conf中script-binding与script-message完全指南

ModernZ键盘快捷键绑定教程:input.conf中script-binding与script-message完全指南

音视频UI组件 【免费下载链接】ModernZ A sleek and modern OSC for mpv. This project is a fork of ModernX that enhances functionality by adding more features while preserving the core standards of mpvs OSC. 项目地址: https://gitcode.com/gh_mirrors/…

2026/10/13 2:34:32 阅读更多 →
数据结构第一章重难点全梳理:逻辑结构、存储结构与复杂度分析

数据结构第一章重难点全梳理:逻辑结构、存储结构与复杂度分析

很多人在学一门新课程时,最容易忽略的偏偏是第一张。第一张通常看起来“全是概念、没有代码”,感觉像是空话,于是翻两页就过去了,等后面真正写程序、做算法题时才发现什么都对不上。这次我把自己重新整理的《数据结构》第一章笔记…

2026/10/13 2:34:32 阅读更多 →
修仙AI小镇xianxia-AI-town:大模型驱动的修仙模拟器,NPC与玩家为何能平权?完整解读

修仙AI小镇xianxia-AI-town:大模型驱动的修仙模拟器,NPC与玩家为何能平权?完整解读

【免费下载链接】xianxia-AI-town-AI- 大模型驱动的npc决策,npc和玩家平权 项目地址: https://gitcode.com/gh_mirrors/xi/xianxia-AI-town-AI- 点击查看 免费下载 修仙AI小镇(xianxia-AI-town)是一款大模型驱动的修仙模拟游戏&a…

2026/10/13 2:34:32 阅读更多 →
SpringBoot+Vue学生成绩分析与可视化平台全解析

SpringBoot+Vue学生成绩分析与可视化平台全解析

每年毕业季我都能在技术社区里看到大量和“成绩管理系统”相关的提问,这个题目属于那种“看起来老套、实则非常能打”的典型选题。特别是把Java、Vue、SpringBoot这三个词绑在一起的时候,它考查的已经不只是“会写增删改查”,而是完整的前后端…

2026/10/13 2:33:32 阅读更多 →

日新闻

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

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

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

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/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

2026/10/12 0:16:38 阅读更多 →
影刀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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →