基于ResNet与SVM的视频内容分类系统构建实践
在技术开发领域我们经常需要处理多媒体内容的自动化分析、分类或检索任务。例如构建一个视频内容理解系统时可能需要从海量视频中识别特定场景、人物动作或事件类型。这类任务的核心挑战在于如何将非结构化的视频数据转化为机器可理解的特征并建立高效的匹配或识别模型。虽然输入材料中提到了特定的人物名称和活动类型但作为技术实践我们更应关注通用的方法论和可复用的技术栈。本文将围绕视频内容分析的技术主线演示如何从零搭建一个基础的运动视频分类原型系统。该系统能够读取视频文件提取关键视觉特征并利用机器学习模型对内容进行初步分类。整个流程将涵盖环境准备、依赖配置、核心代码实现、模型训练与验证以及常见问题排查旨在为开发者提供一个可扩展的技术框架。1. 理解视频内容分析的技术栈与核心概念视频内容分析属于计算机视觉与多媒体技术的交叉领域。在开始编码前需要明确几个核心概念和典型技术选型。1.1 视频分析的基本流程一个典型的视频分析管道包含以下步骤视频解码将压缩的视频文件如 MP4、AVI解码为连续的图像帧序列。帧提取与预处理以一定频率如每秒 1 帧抽取关键帧并进行尺寸缩放、归一化等操作。特征提取使用预训练模型如 CNN从每一帧图像中提取高维特征向量。时序建模可选对于需要理解动作连续性的任务使用 RNN、LSTM 或 3D CNN 对帧序列进行建模。分类/识别根据提取的特征使用分类器如全连接层、SVM判断视频所属类别。结果输出输出分类结果、置信度或边界框等信息。1.2 关键技术选型建议对于快速原型开发推荐以下技术组合编程语言Python因其在机器学习和计算机视觉领域的库生态非常丰富。视频解码库OpenCV它提供了简洁的接口来读取视频文件和提取帧。特征提取模型使用在大型数据集如 ImageNet上预训练的卷积神经网络例如 ResNet、VGG 或 MobileNet通过迁移学习快速获得强大的特征表示能力。机器学习框架PyTorch 或 TensorFlow/Keras用于加载预训练模型、定义分类器和进行训练。实用工具库NumPy 用于数值计算Pandas 用于数据处理如果涉及大量样本的元数据。注意生产环境还需要考虑模型服务化、并发处理、资源监控和日志系统但本教程聚焦于核心分析流程的打通。2. 环境准备与依赖配置构建一个独立、可复现的 Python 环境是项目成功的第一步。2.1 创建并激活 Python 虚拟环境使用 Conda 或venv创建隔离环境避免包版本冲突。# 使用 conda推荐 conda create -n video-analysis python3.8 conda activate video-analysis # 或使用 venv python -m venv video-analysis-env source video-analysis-env/bin/activate # Linux/Mac # video-analysis-env\Scripts\activate # Windows2.2 安装核心依赖库通过 pip 安装所需包。请特别注意版本兼容性以下是经过测试的稳定版本组合。pip install opencv-python4.5.5.64 pip install torch1.9.0 torchvision0.10.0 pip install numpy pandas scikit-learn matplotlib tqdm2.3 验证安装创建一个简单的验证脚本check_env.py确保关键库能正常导入。# check_env.py import cv2 print(fOpenCV version: {cv2.__version__}) import torch import torchvision print(fPyTorch version: {torch.__version__}) print(fTorchvision version: {torchvision.__version__}) print(Environment check passed!)在激活的虚拟环境中运行python check_env.py应能正常输出版本号而无报错。3. 构建视频内容分类原型系统接下来我们将实现一个完整的流程从视频中提取特征并训练一个简单的分类器。3.1 项目结构规划建议的项目目录结构如下保持代码的模块化video_analysis_project/ ├── src/ │ ├── __init__.py │ ├── video_processor.py # 视频处理与特征提取 │ └── classifier.py # 分类器定义与训练 ├── data/ │ ├── raw_videos/ # 存放原始视频文件 │ └── extracted_features/ # 存放提取的特征文件 ├── models/ # 存放训练好的模型 ├── scripts/ │ └── train.py # 训练脚本 └── requirements.txt3.2 实现视频处理器Video Processorvideo_processor.py的核心任务是读取视频并提取有意义的特征。# src/video_processor.py import cv2 import torch import torchvision.transforms as transforms from torchvision.models import resnet50, ResNet50_Weights import numpy as np from tqdm import tqdm import os class VideoProcessor: def __init__(self, target_frame_rate1, frame_size(224, 224)): 初始化视频处理器 :param target_frame_rate: 目标抽帧频率帧/秒 :param frame_size: 输入模型的图像尺寸 self.target_frame_rate target_frame_rate self.frame_size frame_size # 加载预训练的ResNet50模型并移除最后的全连接层用于特征提取 self.device torch.device(cuda if torch.cuda.is_available() else cpu) self.model resnet50(weightsResNet50_Weights.IMAGENET1K_V2) self.model torch.nn.Sequential(*(list(self.model.children())[:-1])) # 移除最后一层 self.model.to(self.device) self.model.eval() # 设置为评估模式 # 定义图像预处理流程与模型训练时一致 self.transform transforms.Compose([ transforms.ToPILImage(), transforms.Resize(frame_size), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ]) def extract_features_from_video(self, video_path, max_frames100): 从单个视频文件中提取特征 :param video_path: 视频文件路径 :param max_frames: 最大处理帧数防止视频过长 :return: 视频的特征向量所有帧特征的均值 cap cv2.VideoCapture(video_path) if not cap.isOpened(): raise ValueError(fCannot open video file: {video_path}) original_fps cap.get(cv2.CAP_PROP_FPS) frame_interval int(original_fps / self.target_frame_rate) total_frames int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) features_list [] frame_count 0 with torch.no_grad(): for i in tqdm(range(0, total_frames, frame_interval), descfProcessing {os.path.basename(video_path)}): if len(features_list) max_frames: break cap.set(cv2.CAP_PROP_POS_FRAMES, i) ret, frame cap.read() if not ret: break # 转换BGR到RGB frame_rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 预处理并提取特征 input_tensor self.transform(frame_rgb).unsqueeze(0).to(self.device) feature self.model(input_tensor) feature feature.squeeze().cpu().numpy() features_list.append(feature) frame_count 1 cap.release() if len(features_list) 0: return np.zeros(2048) # ResNet50倒数第二层特征维度为2048 # 对所有帧的特征取平均得到一个视频级的特征表示 video_feature np.mean(features_list, axis0) return video_feature关键参数解释target_frame_rate1每秒抽取1帧进行特征提取。对于动作变化快的场景可以适当提高此值但会增加计算量。frame_size(224, 224)ResNet等标准CNN模型的输入尺寸。max_frames100限制处理的最大帧数防止超长视频耗尽内存。3.3 实现分类器Classifierclassifier.py负责管理数据集、训练分类模型和进行预测。# src/classifier.py import numpy as np import os import pickle from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import classification_report, accuracy_score from sklearn.preprocessing import StandardScaler import joblib class VideoClassifier: def __init__(self, model_save_pathmodels/svm_classifier.pkl, scaler_save_pathmodels/scaler.pkl): self.model None self.scaler StandardScaler() self.model_save_path model_save_path self.scaler_save_path scaler_save_path os.makedirs(os.path.dirname(model_save_path), exist_okTrue) def prepare_dataset(self, features_dir, labels_file): 准备训练数据集 :param features_dir: 存放特征npy文件的目录 :param labels_file: 标签文件路径每行格式特征文件名,标签名 X [] y [] with open(labels_file, r) as f: for line in f: filename, label line.strip().split(,) feature_path os.path.join(features_dir, filename) if os.path.exists(feature_path): feature np.load(feature_path) X.append(feature) y.append(label) self.X np.array(X) self.y np.array(y) print(fDataset prepared: {len(X)} samples, {len(set(y))} classes) print(fClasses: {set(y)}) def train(self, test_size0.2, random_state42): 训练分类模型 if not hasattr(self, X): raise ValueError(Please call prepare_dataset first.) # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( self.X, self.y, test_sizetest_size, random_staterandom_state, stratifyself.y ) # 特征标准化 X_train_scaled self.scaler.fit_transform(X_train) X_test_scaled self.scaler.transform(X_test) # 使用支持向量机进行分类 self.model SVC(kernellinear, probabilityTrue, random_staterandom_state) self.model.fit(X_train_scaled, y_train) # 在测试集上评估 y_pred self.model.predict(X_test_scaled) accuracy accuracy_score(y_test, y_pred) print(fTest Accuracy: {accuracy:.4f}) print(\nClassification Report:) print(classification_report(y_test, y_pred)) # 保存模型和标准化器 joblib.dump(self.model, self.model_save_path) joblib.dump(self.scaler, self.scaler_save_path) print(fModel saved to {self.model_save_path}) def load_model(self): 加载已训练的模型 self.model joblib.load(self.model_save_path) self.scaler joblib.load(self.scaler_save_path) def predict(self, feature_vector): 预测单个样本的类别和概率 if self.model is None: self.load_model() feature_scaled self.scaler.transform([feature_vector]) prediction self.model.predict(feature_scaled)[0] probability self.model.predict_proba(feature_scaled)[0] return prediction, probability3.4 创建训练脚本scripts/train.py将整个流程串联起来。# scripts/train.py import sys import os sys.path.append(os.path.join(os.path.dirname(__file__), ..)) from src.video_processor import VideoProcessor from src.classifier import VideoClassifier def main(): # 初始化处理器和分类器 processor VideoProcessor(target_frame_rate1) classifier VideoClassifier() # 假设我们有一个包含视频的目录和对应的标签文件 raw_video_dir data/raw_videos features_dir data/extracted_features labels_file data/labels.txt os.makedirs(features_dir, exist_okTrue) # 步骤1为每个视频提取特征并保存 print(Step 1: Extracting features from videos...) # 这里需要根据你的实际视频文件列表进行循环 # 示例假设视频文件名为 video1.mp4, video2.mp4 ...并且你已经准备好了对应的labels.txt # for video_name in os.listdir(raw_video_dir): # if video_name.endswith(.mp4): # video_path os.path.join(raw_video_dir, video_name) # feature processor.extract_features_from_video(video_path) # feature_save_path os.path.join(features_dir, video_name.replace(.mp4, .npy)) # np.save(feature_save_path, feature) # print(Feature extraction completed.) # 由于实际数据缺失这里我们创建一个模拟数据集来演示训练流程 print(Creating a mock dataset for demonstration...) import numpy as np np.random.seed(42) # 模拟100个样本特征维度20482个类别 n_samples 100 n_features 2048 n_classes 2 mock_features np.random.randn(n_samples, n_features) mock_labels np.random.choice([class_A, class_B], n_samples) # 保存模拟特征和标签 for i in range(n_samples): np.save(os.path.join(features_dir, fvideo_{i}.npy), mock_features[i]) with open(labels_file, w) as f: for i in range(n_samples): f.write(fvideo_{i}.npy,{mock_labels[i]}\n) print(Mock dataset created.) # 步骤2准备数据集并训练分类器 print(\nStep 2: Training the classifier...) classifier.prepare_dataset(features_dir, labels_file) classifier.train() if __name__ __main__: main()4. 运行验证与结果分析4.1 执行训练流程在项目根目录下运行训练脚本python scripts/train.py预期会看到类似以下的输出表明特征提取和模型训练正在执行Step 1: Creating a mock dataset for demonstration... Mock dataset created. Step 2: Training the classifier... Dataset prepared: 100 samples, 2 classes Classes: {class_B, class_A} Test Accuracy: 0.5500 Classification Report: precision recall f1-score support class_A 0.56 0.56 0.56 10 class_B 0.54 0.54 0.54 10 accuracy 0.55 20 macro avg 0.55 0.55 0.55 20 weighted avg 0.55 0.55 0.55 20 Model saved to models/svm_classifier.pkl注意由于使用的是随机生成的模拟数据准确率接近随机猜测50%是正常的。使用真实、有区分度的数据后准确率会显著提升。4.2 创建预测脚本进行单视频测试编写一个简单的预测脚本scripts/predict.py来验证模型对单个视频的分类效果。# scripts/predict.py import sys import os import numpy as np sys.path.append(os.path.join(os.path.dirname(__file__), ..)) from src.video_processor import VideoProcessor from src.classifier import VideoClassifier def predict_single_video(video_path): processor VideoProcessor() classifier VideoClassifier() print(fExtracting features from {video_path}...) feature processor.extract_features_from_video(video_path) print(Making prediction...) prediction, probabilities classifier.predict(feature) print(fPredicted class: {prediction}) print(fClass probabilities: {dict(zip(classifier.model.classes_, probabilities))}) return prediction, probabilities if __name__ __main__: # 使用时将 path/to/your/video.mp4 替换为实际视频路径 # predict_single_video(path/to/your/video.mp4) print(Please specify the path to your video file in the script.)5. 常见问题排查与优化策略在实际运行中可能会遇到各种问题。以下是一些典型问题及其解决方案。5.1 视频读取与解码问题问题现象常见原因检查方式处理建议cv2.VideoCapture返回False或帧为None1. 文件路径错误。2. 视频文件损坏或格式不受支持。3. 编解码器缺失。1. 打印video_path确认路径正确。2. 尝试用播放器打开该视频文件。3. 检查 OpenCV 支持的格式 (cv2.getBuildInformation())。1. 使用绝对路径。2. 使用 FFmpeg 转换视频格式如转为 MP4 with H.264。3. 安装完整版 OpenCV (opencv-contrib-python) 或系统 FFmpeg。抽帧时索引越界或卡住设置的frame_interval可能导致索引超出总帧数。在循环内检查i是否小于total_frames。在循环条件中加入and i total_frames。5.2 特征提取与模型加载问题问题现象常见原因检查方式处理建议预训练模型下载失败或加载慢网络问题或缓存路径权限问题。观察下载进度或错误信息。1. 配置网络代理如需。2. 手动下载权重文件到 Torch 的缓存目录通常~/.cache/torch/hub/checkpoints/。GPU 内存溢出 (OOM)视频过长一次性提取的帧太多或模型太大。监控 GPU 内存使用情况nvidia-smi。1. 降低max_frames。2. 使用更小的预训练模型如 MobileNetV3。3. 使用torch.no_grad()并设置model.eval()。4. 在 CPU 上运行。提取的特征维度不对模型结构修改有误。打印feature.shape。确保移除分类层后特征维度符合预期如 ResNet50 应为 2048 维。5.3 模型训练与性能问题问题现象常见原因检查方式处理建议准确率始终很低即使有真实数据1. 特征区分度不够。2. 类别不平衡。3. 模型或参数不适合。1. 可视化特征如用 PCA 降维后绘图。2. 检查标签分布。3. 尝试不同的分类器如 Random Forest或 SVM 核函数。1. 尝试不同的预训练模型或微调Fine-tuning。2. 对数据进行过采样/欠采样。3. 进行超参数调优如 GridSearchCV。训练时间过长特征维度高样本量大。分析代码耗时环节。1. 使用特征降维如 PCA。2. 使用线性 SVM 的增量学习版本SGDClassifier。6. 最佳实践与扩展方向6.1 生产环境部署建议服务化使用 Flask 或 FastAPI 将模型封装成 RESTful API接收视频 URL 或文件流返回分类结果。异步处理对于长视频特征提取是耗时操作应采用异步任务队列如 Celery Redis避免阻塞 Web 请求。模型监控记录预测请求、结果和置信度定期评估模型性能监控预测分布漂移Data Drift。资源管理使用 Docker 容器化应用便于部署和扩展。设置资源限制防止单个视频处理耗尽内存/CPU。6.2 性能优化方向高效抽帧不是简单按时间间隔抽帧而是使用镜头边界检测或关键帧提取算法减少冗余帧。时序模型如果动作的时序信息至关重要应引入 3D CNN 或 Transformer 模型如 TimeSformer处理帧序列。特征融合除了视觉特征还可以提取音频特征如 MFCC进行多模态融合提升分类精度。在线学习当有新标注数据时支持模型在线更新而无需全量重新训练。6.3 扩展应用场景本文演示的框架是通用的只需调整标签和数据即可应用于多种场景体育赛事分析识别进球、犯规等关键时刻。安防监控检测异常行为如摔倒、闯入。内容审核识别违规或不适内容。教育视频分类按学科或课程难度自动打标签。构建一个鲁棒的视频分析系统核心在于高质量的数据、合适的特征表示和持续的迭代优化。本原型系统提供了一个坚实的起点开发者可以在此基础上深入探索更复杂的模型和工程化实践。

相关新闻

30-桌面应用-Hermes Desktop全体验

30-桌面应用-Hermes Desktop全体验

30 桌面应用——Hermes Desktop全体验 老张是一名设计师,日常工作离不开各种图形界面。他虽然知道 Hermes 的功能很强大,但一直对命令行界面有些抗拒。"每次都要打开黑乎乎的终端输命令,太不友好了。"如果 Hermes 能像微信、浏览器一样,是个双击就能打开的桌面…

2026/10/10 21:21:40 阅读更多 →
LoadBalancer负载均衡:集群高可用调用优化

LoadBalancer负载均衡:集群高可用调用优化

LoadBalancer负载均衡:集群高可用调用优化一个服务三个节点,请求来了该打给谁?你总不能闭着眼睛随机点一个吧——那叫"非洲大草原式负载均衡"。今天聊聊 SpringCloud 官方的 LoadBalancer,让你的请求分配得明明白白。一…

2026/10/10 21:21:47 阅读更多 →
Grok 4.5两周主力实测:代码、检索、推理与Agent场景能否替代GPT-5.6

Grok 4.5两周主力实测:代码、检索、推理与Agent场景能否替代GPT-5.6

GPT-5.6好用但贵,Grok 4.5免费但质量差一些——这是大部分人的印象。但到底差多少?哪些场景能替代、哪些不能?我把Grok 4.5当主力用了两周,从代码辅助到知识检索到逻辑推理到Agent,逐个场景跟GPT-5.6做了对比。结论是&…

2026/10/10 22:19:58 阅读更多 →

最新新闻

德思特 GNSS 模拟器技术参数详解:700+通道、1000Hz 迭代率、可模拟1200颗卫星的全星座仿真方案

德思特 GNSS 模拟器技术参数详解:700+通道、1000Hz 迭代率、可模拟1200颗卫星的全星座仿真方案

在高阶自动驾驶 HiL 闭环、低空无人系统及高动态 PNT(定位、导航、定时)测试中,传统户外路测往往受环境干扰大且场景难以 100% 复现。针对工程选型关注的核心参数与信号支持能力,德思特 GNSS 模拟器基于 Skydel 引擎与 SDA 软件定…

2026/10/11 22:52:37 阅读更多 →
vnpy量化实战:多因子选股+LightGBM动态仓位优化闭环

vnpy量化实战:多因子选股+LightGBM动态仓位优化闭环

简介:本资源是一套基于vn.py框架深度二次开发的量化投资实践项目,面向金融工程开发者、量化交易学习者及AI金融交叉领域从业者,解决选股自动化、策略回测工程化与机器学习模型集成等核心问题。压缩包共1656个文件,体量59.07MB&…

2026/10/11 22:52:37 阅读更多 →
vllm-metal 加载 GGUF 量化模型完整指南:Mac 本地部署 LLM 的省钱秘籍

vllm-metal 加载 GGUF 量化模型完整指南:Mac 本地部署 LLM 的省钱秘籍

【免费下载链接】vllm-metal Community maintained hardware plugin for vLLM on Apple Silicon 项目地址: https://gitcode.com/gh_mirrors/vl/vllm-metal 点击查看 免费下载 vllm-metal 是一个社区维护的硬件插件,让 vLLM 能够运行在 Apple Silicon&a…

2026/10/11 22:52:37 阅读更多 →
家电维修预约欧米到家|博世洗衣机维修预约|附近师傅上门检修|欧米到家报修热线

家电维修预约欧米到家|博世洗衣机维修预约|附近师傅上门检修|欧米到家报修热线

前言🌆 国内住宅业态丰富,各地老城老旧管网老化、水质杂质多,城市高层住宅水压波动频繁,全国大部分地区属于湿润气候,梅雨季、多雨季节潮湿多雨、空气湿度极高,冬夏温差大,差异化的居家工况让洗…

2026/10/11 22:52:37 阅读更多 →
构网型储能变流器参数整定:虚拟惯量、阻尼与下垂系数实战解析

构网型储能变流器参数整定:虚拟惯量、阻尼与下垂系数实战解析

最近在调试一个构网型储能样机,100kW 的柜子在离网工况下带 RLC 负载,光是 J 和 D 两个参数就调了两个晚上。功率波形要么像水面波纹一样持续荡漾,要么频率响应慢到让人怀疑控制器死机。后来我才意识到,构网型变流器能不能真正工程…

2026/10/11 22:52:37 阅读更多 →
MySQL子查询完全指南:分类、执行流程、性能优化与常见坑

MySQL子查询完全指南:分类、执行流程、性能优化与常见坑

子查询在MySQL里被很多人当成"会用但说不清"的技术点。SQL子查询用得好,能把复杂统计拆成清晰的嵌套逻辑;用不好,一条慢查询直接拖垮业务接口。这篇文章我把子查询从分类、执行流程到性能优化、报错排查完整过一遍,所有…

2026/10/11 22:51:36 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →