基于Transformer的医学图像分割flask框架机器学习算法
✅源码获取--------------------【点击左上方头像在置顶文章上方的wx】联系我们-------------✌网站介绍✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。✌服务范围大数据、机器学习、Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app等设计与开发。随着医学影像技术的快速发展医学图像分割在临床诊断、治疗规划以及医学研究中扮演着越来越重要的角色。准确的图像分割能够为医生提供更精确的病灶信息有助于制定个性化的治疗方案。然而医学图像分割面临诸多挑战如图像噪声、复杂的解剖结构以及类间模糊边界等。近年来基于Transformer的深度学习模型在自然语言处理领域取得了显著成功其在图像处理领域的应用也逐渐受到关注。本文基于Flask框架和Transformer模型构建了一个医学图像分割系统。背景和意义在于通过引入先进的Transformer模型提高医学图像分割的准确性和鲁棒性为临床诊断和治疗提供更有力的支持。本文的主要内容包括利用Transformer模型提取医学图像的深层次特征结合Flask框架实现Web端的图像分割结果展示和用户交互。本项目采取的技术路线是首先收集医学图像数据集然后使用预训练的Transformer模型进行特征提取接着构建图像分割模型最后通过Flask框架实现系统的Web端展示和用户交互功能。具体情况是系统首先从医学图像数据库中获取原始图像数据使用预训练的Transformer模型进行特征提取生成特征向量。然后采用TransUNet 和 MobileViT等图像分割网络进行模型训练和优化生成图像分割模型。最后通过Flask框架搭建Web服务器使用HTML、CSS和JavaScript实现前端页面设计展示图像分割结果并提供用户交互功能如图像上传、分割结果展示等。本文详细阐述了系统的架构设计、关键技术和实现流程并通过实验验证了系统的有效性和实用性。该系统不仅提高了医学图像分割的准确性和鲁棒性还为医生和研究人员提供了便捷的图像分割工具具有重要的应用价值。模型训练与优化TransUNet的训练过程TransUNet模型结合了Transformer和UNet的特点用于图像分割。模型首先通过CNN编码器类似ResNet提取多尺度特征然后利用Transformer编码器处理这些特征增强特征表示能力。解码器部分采用简化的UNet结构结合跳跃连接恢复空间信息。模型支持内存优化可在必要时减少Transformer层数和释放中间变量。输出通过分类头生成分割结果确保与输入尺寸一致。该模型适用于需要高效特征提取和精细分割任务的场景。class TransUNet(nn.Module):def __init__(self,img_size416,in_channels3,out_channels1,embed_dim768,patch_size16,num_transformer_layers12,num_heads12,mlp_ratio4,dropout_rate0.1,attn_dropout_rate0.0,decoder_channels(256, 128, 64, 32, 16),memory_efficientTrue, # 添加内存优化选项):TransUNet模型参数:img_size (int): 输入图像大小in_channels (int): 输入通道数out_channels (int): 输出通道数分类数embed_dim (int): Transformer嵌入维度patch_size (int): 分块大小num_transformer_layers (int): Transformer层数num_heads (int): 注意力头数mlp_ratio (int): MLP隐藏层维度与嵌入维度的比率dropout_rate (float): Dropout比率attn_dropout_rate (float): 注意力Dropout比率decoder_channels (tuple): 解码器通道数memory_efficient (bool): 是否使用内存优化模式super(TransUNet, self).__init__()# 简化初始化信息打印print(f初始化TransUNet: {img_size}x{img_size}, 输入{in_channels}, 输出{out_channels}, Transformer层{num_transformer_layers})self.img_size img_sizeself.patch_size patch_sizeself.embed_dim embed_dimself.memory_efficient memory_efficient# CNN编码器 (ResNet-like)self.encoder1 ConvBlock(in_channels, 32, kernel_size3) # 416x416self.pool1 nn.MaxPool2d(kernel_size2, stride2)self.encoder2 ConvBlock(32, 64, kernel_size3) # 208x208self.pool2 nn.MaxPool2d(kernel_size2, stride2)self.encoder3 ConvBlock(64, 128, kernel_size3) # 104x104self.pool3 nn.MaxPool2d(kernel_size2, stride2)self.encoder4 ConvBlock(128, 256, kernel_size3) # 52x52self.pool4 nn.MaxPool2d(kernel_size2, stride2)self.encoder5 ConvBlock(256, 512, kernel_size3) # 26x26# 定义跳跃连接的通道数与编码器输出通道数一致self.skip_channels (256, 128, 64, 32) # e4, e3, e2, e1# Transformer编码器self.patch_embed PatchEmbed(img_sizeimg_size // 16, # 26x26patch_size1,in_channels512,embed_dimembed_dim)# 位置编码self.pos_embed nn.Parameter(torch.zeros(1, (img_size // 16) ** 2, embed_dim))self.pos_drop nn.Dropout(dropout_rate)# Transformer块 - 如果内存优化模式则减少Transformer层数if memory_efficient and num_transformer_layers 6:print(f内存优化将Transformer层数从{num_transformer_layers}减少到6)num_transformer_layers 6mlp_dim int(embed_dim * mlp_ratio)self.transformer_blocks nn.Sequential(*[TransformerBlock(dimembed_dim,headsnum_heads,dim_headembed_dim // num_heads,mlp_dimmlp_dim,dropoutdropout_rate)for _ in range(num_transformer_layers)])# 解码器self.decoder_channels decoder_channels# 修改确保conv_more输出通道数与第一个解码器通道数匹配self.conv_more ConvBlock(embed_dim, decoder_channels[0])# 使用新的简化解码器self.decoder SimpleUNetDecoder(self.skip_channels, self.decoder_channels)# 分类头self.segmentation_head nn.Conv2d(decoder_channels[-1], out_channels, kernel_size1)def forward(self, x):# 保存输入尺寸用于验证输出尺寸input_size x.shape[2:]B x.size(0) # 批量大小# CNN编码器e1 self.encoder1(x) # 416x416e1_pool self.pool1(e1)e2 self.encoder2(e1_pool) # 208x208e2_pool self.pool2(e2)e3 self.encoder3(e2_pool) # 104x104e3_pool self.pool3(e3)e4 self.encoder4(e3_pool) # 52x52e4_pool self.pool4(e4)e5 self.encoder5(e4_pool) # 26x26# 只在第一次前向传播或调试模式时打印if not hasattr(self, printed_shapes):print(f编码器特征图尺寸: e1{e1.shape}, e2{e2.shape}, e3{e3.shape}, e4{e4.shape}, e5{e5.shape})actual_skip_channels [e4.size(1), e3.size(1), e2.size(1), e1.size(1)]print(f实际跳跃连接通道数: {actual_skip_channels}, 配置的跳跃连接通道数: {self.skip_channels})self.printed_shapes True# 内存优化在不需要时释放中间变量if self.memory_efficient:del xtorch.cuda.empty_cache() if torch.cuda.is_available() else None# Transformer编码器x self.patch_embed(e5) # (B, N, embed_dim)x x self.pos_embedx self.pos_drop(x)# 内存优化在不需要时释放中间变量if self.memory_efficient:del e5torch.cuda.empty_cache() if torch.cuda.is_available() else Nonex self.transformer_blocks(x)# 重塑为2D特征图x x.transpose(1, 2).reshape(B, -1, self.img_size# 解码器路径x self.conv_more(x)# 跳跃连接 - 从大到小排序skips [e4, e3, e2, e1]# 使用解码器x self.decoder(x, skips)# 打印分割头信息print(f分割头预期输入通道数: {self.decoder_channels[-1]}, 实际输入: x.shape{x.shape})# 分类头logits self.segmentation_head(x)# 检查输出尺寸是否与输入尺寸匹配if logits.shape[2:] ! input_size:print(f调整输出尺寸从 {logits.shape[2:]} 到 {input_size})logits F.interpolate(logits, sizeinput_size, modebilinear, align_cornersTrue)# 只在第一次前向传播时打印if not hasattr(self, printed_output):print(f最终输出尺寸: {logits.shape})self.printed_output Truereturn logitsMobileViT的训练过程MobileViT模型结合了MobileNet和Transformer的优势适用于图像分割任务。模型首先通过卷积层提取基础特征然后通过多个阶段的MobileNet块和MobileViT块逐步降低特征图尺寸并增加通道数同时利用Transformer增强特征表示。解码器部分采用U-Net风格通过上采样和跳跃连接恢复空间信息确保输出与输入尺寸一致。模型支持灵活的参数配置如维度、通道数和深度等可根据任务需求调整。最终通过分类头生成分割结果适用于需要高效且精确分割的场景。class MobileViT(nn.Module):def __init__(self,img_size416,in_channels3,out_channels1,dims[96, 120, 144],channels[16, 32, 48, 64, 80, 96, 384],num_classes1000,expansion4,kernel_size3,patch_size(2, 2),depths[2, 4, 3],**kwargs):MobileViT模型参数:img_size (int): 输入图像大小in_channels (int): 输入通道数out_channels (int): 输出通道数分类数dims (list): Transformer维度列表channels (list): 卷积通道列表num_classes (int): 分类数量expansion (int): 扩展比例kernel_size (int): 卷积核大小patch_size (tuple): 分块大小depths (list): Transformer深度列表super().__init__()# 打印初始化信息用于调试print(f初始化MobileViT模型输入大小: {img_size}x{img_size}输入通道: {in_channels}输出通道: {out_channels})self.img_size img_sizeself.channels channels # 将channels保存为实例变量# 初始卷积层self.conv1 nn.Conv2d(in_channels, channels[0], kernel_size3, stride2, padding1)self.bn1 nn.BatchNorm2d(channels[0])self.relu nn.ReLU(inplaceTrue)# MobileNetV2 MobileViT架构self.stage1 nn.Sequential(MobileNetBlock(channels[0], channels[1], stride1, expansionexpansion),MobileNetBlock(channels[1], channels[2], stride2, expansionexpansion),MobileNetBlock(channels[2], channels[3], stride1, expansionexpansion))self.stage2 nn.Sequential(MobileNetBlock(channels[3], channels[4], stride2, expansionexpansion),MobileViTBlock(dim384,depthdepths[0],channelchannels[4],kernel_sizekernel_size,patch_sizepatch_size,mlp_dimint(384 * 2),transformer_dim384 * patch_size[0] * patch_size[1]))self.stage3 nn.Sequential(MobileNetBlock(channels[4], channels[5], stride2, expansionexpansion),MobileViTBlock(dim384,depthdepths[1],channelchannels[5],kernel_sizekernel_size,patch_sizepatch_size,mlp_dimint(384 * 4),transformer_dim384 * patch_size[0] * patch_size[1]))self.stage4 nn.Sequential(MobileNetBlock(channels[5], channels[6], stride2, expansionexpansion),MobileViTBlock(dim384,depthdepths[2],channelchannels[6],kernel_sizekernel_size,patch_size(1, 1),mlp_dimint(384 * 4),transformer_dim384))# 解码器 (U-Net风格)self.decoder_channels [256, 128, 64, 32, 16]# 上采样路径self.upconv1 UpConv(channels[6], self.decoder_channels[0])self.dec1 ConvBlock(self.decoder_channels[0] channels[5], self.decoder_channels[0])self.upconv2 UpConv(self.decoder_channels[0], self.decoder_channels[1])self.dec2 ConvBlock(self.decoder_channels[1] channels[4], self.decoder_channels[1])self.upconv3 UpConv(self.decoder_channels[1], self.decoder_channels[2])self.dec3 ConvBlock(self.decoder_channels[2] channels[3], self.decoder_channels[2])self.upconv4 UpConv(self.decoder_channels[2], self.decoder_channels[3])self.dec4 ConvBlock(self.decoder_channels[3] channels[1], self.decoder_channels[3])self.upconv5 UpConv(self.decoder_channels[3], self.decoder_channels[4])self.dec5 ConvBlock(self.decoder_channels[4] channels[0], self.decoder_channels[4])# 分类头self.segmentation_head nn.Conv2d(self.decoder_channels[4], out_channels, kernel_size1)def forward(self, x):# 打印输入形状用于调试print(fMobileViT input shape: {x.shape})# 编码器路径x0 self.relu(self.bn1(self.conv1(x))) # [B, 16, 208, 208]x1 self.stage1(x0) # [B, 64, 104, 104]x2 self.stage2(x1) # [B, 80, 52, 52]x3 self.stage3(x2) # [B, 96, 26, 26]x4 self.stage4(x3) # [B, 384, 13, 13]# 打印特征图形状用于调试print(f特征图形状: x0{x0.shape}, x1{x1.shape}, x2{x2.shape}, x3{x3.shape}, x4{x4.shape})# 解码器路径d1 self.upconv1(x4)print(f上采样1后: d1{d1.shape})d1 torch.cat([d1, x3], dim1)print(f拼接1后: d1{d1.shape})d1 self.dec1(d1)print(f解码器1后: d1{d1.shape})d2 self.upconv2(d1)print(f上采样2后: d2{d2.shape})d2 torch.cat([d2, x2], dim1)print(f拼接2后: d2{d2.shape})d2 self.dec2(d2)print(f解码器2后: d2{d2.shape})d3 self.upconv3(d2)print(f上采样3后: d3{d3.shape})d3 torch.cat([d3, x1], dim1)print(f拼接3后: d3{d3.shape})d3 self.dec3(d3)print(f解码器3后: d3{d3.shape})d4 self.upconv4(d3)print(f上采样4后: d4{d4.shape})# 获取x0的通道数x0_channels x0.size(1)print(fx0的通道数: {x0_channels})# 修改: 由于通道数不匹配我们重新定义dec4# 首先创建新的解码器块通道数与实际输入相匹配actual_input_channels self.decoder_channels[3] x0_channelsprint(f实际输入通道数: {actual_input_channels})# 使用原始的self.dec4但是需要确保通道数正确d4 torch.cat([d4, torch.nn.functional.interpolate(x0, sized4.shape[2:], modebilinear, align_cornersTrue)], dim1)print(f拼接4后: d4{d4.shape} (预期通道数: {self.decoder_channels[3] self.channels[1]}))# 如果通道数不匹配我们需要创建一个新的卷积块if d4.size(1) ! self.decoder_channels[3] self.channels[1]:print(f通道数不匹配创建新的卷积块)d4_conv nn.Sequential(nn.Conv2d(d4.size(1), self.decoder_channels[3], kernel_size3, padding1, biasFalse),nn.BatchNorm2d(self.decoder_channels[3]),nn.ReLU(inplaceTrue),nn.Conv2d(self.decoder_channels[3], self.decoder_channels[3], kernel_size3, padding1, biasFalse),nn.BatchNorm2d(self.decoder_channels[3]),nn.ReLU(inplaceTrue)).to(d4.device)d4 d4_conv(d4)else:d4 self.dec4(d4)print(f解码器4后: d4{d4.shape})d5 self.upconv5(d4)print(f上采样5后: d5{d5.shape})d5 torch.cat([d5, torch.nn.functional.interpolate(x0, sized5.shape[2:], modebilinear, align_cornersTrue)], dim1)print(f拼接5后: d5{d5.shape} (预期通道数: {self.decoder_channels[4] self.channels[0]}))# 如果通道数不匹配我们需要创建一个新的卷积块if d5.size(1) ! self.decoder_channels[4] self.channels[0]:print(f通道数不匹配创建新的卷积块)d5_conv nn.Sequential(nn.Conv2d(d5.size(1), self.decoder_channels[4], kernel_size3, padding1, biasFalse),nn.BatchNorm2d(self.decoder_channels[4]),nn.ReLU(inplaceTrue),nn.Conv2d(self.decoder_channels[4], self.decoder_channels[4], kernel_size3, padding1, biasFalse),nn.BatchNorm2d(self.decoder_channels[4]),nn.ReLU(inplaceTrue)).to(d5.device)d5 d5_conv(d5)else:d5 self.dec5(d5)print(f解码器5后: d5{d5.shape})# 分类头logits self.segmentation_head(d5)# 打印输出形状用于调试print(fMobileViT输出形状: {logits.shape})return logits实验结果对比分析分割结果可视化展示在相同的实验环境和参数设置下对TransUNet 和 MobileViT 算法两种模型在医学图像分割任务中进行了对比实验。实验结果如下图所示图 4-1 TransUNet模型分割结果图 4-2 MobileViT模型分割结果模型评估指标对比分析模型评估界面展示了两个深度学习模型TransUNet和MobileViT在医学图像分割任务上的性能比较。从左到右列出了每个模型的准确率(Accuracy)、Dice系数、IoU(交并比)、灵敏度(Sensitivity)、特异度(Specificity)、精确度(Precision)以及F1分数等关键评价指标。具体来说TransUNet模型在所有评估维度上均表现出色其准确率为0.9771Dice系数为0.7588IoU为0.6113灵敏度为0.6500特异度为0.9612精确度为0.9000F1分数为0.7673。MobileViT模型的整体表现略逊于TransUNet但其准确率仍高达0.9143Dice系数为0.7263IoU为0.5702灵敏度和特异度分别为0.6500和0.9632精确度为0.9000F1分数为0.7250。综上所述虽然两个模型都在医学图像分割领域展现出了较高的性能水平但TransUNet模型在各方面的综合表现更为优异。图 4-3 模型评估指标对比图 4-4 模型指标结果可视化

相关新闻

Feign实体传参失败原因与解决方案:序列化契约一致性详解

Feign实体传参失败原因与解决方案:序列化契约一致性详解

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

2026/10/15 3:51:44 阅读更多 →
录像机接显示器实况提示资源不足排查指导

录像机接显示器实况提示资源不足排查指导

一、问题现象录像机接显示器实况提示资源不足二、组网三、关键点四、排查步骤一般是编码参数超出录像机解码能力,若录像机接多个显示器,所有显示器解码实况总和不能超出录像机的解码能力,可按照以下方法调试。步骤一:通过官网或者…

2026/10/15 3:51:44 阅读更多 →
深入解析 Reto 9:用多语言实现 Heterograma、Isograma 与 Pangrama 文本检测

深入解析 Reto 9:用多语言实现 Heterograma、Isograma 与 Pangrama 文本检测

示例工程 【免费下载链接】retos-programacion-2023 Ejercicios de cdigo semanales en 2023 de la comunidad MoureDev para practicar lgica en cualquier lenguaje de programacin. 项目地址: https://gitcode.com/gh_mirrors/re/retos-programacion-2023 点击查…

2026/10/15 3:50:44 阅读更多 →

最新新闻

模板代码生成工具:从元数据到可用接口的完整实现

模板代码生成工具:从元数据到可用接口的完整实现

1. 为什么需要模板代码生成工具:一大半重复代码其实不该手写做后端开发的朋友应该都有过这种体验:新项目启动,建表、写实体、写Mapper、写Service接口和实现、写Controller,然后前端再把列表页、表单页、弹窗、状态标签挨个撸一遍…

2026/10/15 4:45:53 阅读更多 →
桶排序全解析:原理、复杂度与工程实践

桶排序全解析:原理、复杂度与工程实践

1. 从"把数据扔进格子里"说起:桶排序的第一性原理如果你接触排序算法有一阵子,大概率听说过这句话:"桶排序在数据分布均匀的时候能做到接近O(n)"。但很多人学完快排、归并之后,对桶排序的印象只剩下一个模糊的…

2026/10/15 4:45:53 阅读更多 →
ET 200MP模拟量输出模块AQ 4xU/I ST选型接线调试指南

ET 200MP模拟量输出模块AQ 4xU/I ST选型接线调试指南

简介:西门子SIMATIC S7-1500/ET 200MP模拟量输出模块AQ 4xU/I ST设备手册,面向工业自动化领域的工程技术人员、系统集成商与运维人员。内容聚焦模拟量输出模块在制造、能源、交通等场景下的选型、接线、参数设置与调试问题,帮助用户实现精准的…

2026/10/15 4:45:53 阅读更多 →
Windows开机自启全攻略:启动文件夹、注册表、任务计划与服务详解

Windows开机自启全攻略:启动文件夹、注册表、任务计划与服务详解

1. 开机自启这件事,远不止把快捷方式拖进启动文件夹那么简单很多人第一次接触开机自启,都是因为某个小工具每次重启后都要手动打开,烦得不行。于是上网一搜,看到最多的答案就是“把快捷方式拖进启动文件夹”,照做之后确…

2026/10/15 4:45:53 阅读更多 →
基于地点相似度的POI推荐与路径重组MATLAB实现

基于地点相似度的POI推荐与路径重组MATLAB实现

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

2026/10/15 4:45:53 阅读更多 →
延迟优化实战:从毫秒级到微秒级的系统性能提升路径

延迟优化实战:从毫秒级到微秒级的系统性能提升路径

1. 我为什么折腾到微秒级:被延迟拖垮的业务,往往都死得悄无声息很多人做性能优化,跑到“毫秒级”就收工了,觉得接口P99能压到5ms以内已经是了不起的成就。但如果你在真正的高并发业务链路里待过,就会明白:当…

2026/10/15 4:44:53 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29: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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →