当前位置: 首页 > news >正文

Apple 开源FastVLM:AI看图说话更快更准

简述


今天逛到一个超级酷的项目——苹果的ml-fastvlm。这玩意儿是苹果在GitHub上开源的,基于他们的论文《FastVLM: Efficient Vision Encoding for Vision Language Models》,这论文还被CVPR 2025接收了。简单说,这是个视觉语言模型(VLM),就是那种能看懂图片还能跟你聊天描述图片的AI。但它牛的地方在于,它特别注重效率,尤其是处理高分辨率图片的时候,不会卡顿,不会吃太多资源。

虽然现在AI到处都是,但很多模型在实际用的时候,尤其是手机或平板上,速度慢得像蜗牛。FastVLM就是来解决这个痛点的。它用了一种叫FastViTHD的混合视觉编码器,能输出更少的token(就是那些AI处理的“小块信息”),这样编码时间大大缩短。论文里说,小模型FastVLM-0.5B比LLaVA-OneVision-0.5B快85倍,还小3.4倍,但性能更好。
 

论文地址

https://arxiv.org/abs/2412.13303https://arxiv.org/abs/2412.13303

  • FastVLM引入了一种称为FastViTHD的新型混合视觉编码器,针对高分辨率输入进行了优化,以实现高效的VLM性能。
  • FastViTHD的性能优于基于ViT和卷积的视觉编码器,实现了3.2倍的首个令牌时间(TTFT)加速和3.6倍的体积缩小。
  • 与之前的VLM模型相比,FastVLM在分辨率、延迟和准确性之间实现了更好的权衡,并在设备上进行了测量而非估计。
  • FastVLM在最高分辨率(1152x1152)下的性能与LLaVa-OneVision相当,但TTFT快85倍,视觉编码器体积小3.4倍。


为什么需要FastVLM?

VLM全称Vision Language Model,就是视觉语言模型。简单点,就是AI能同时处理图片和文字。比如,你给它一张照片,说“描述一下这张图”,它就能输出文字告诉你图里有什么。像ChatGPT加了眼睛一样。

传统VLM是怎么工作的?一般有三个部分:视觉编码器(vision encoder),把图片转成AI能懂的token;然后一个连接器(projector),把这些token和文字token连起来;最后是大语言模型(LLM),比如Qwen2或Vicuna,来生成回答。

问题出在视觉编码器上。主流的用Vision Transformer(ViT),它把图片切成小块(patch),每个小块生成一个token。高分辨率图片,比如1152x1152像素,token数量爆炸多。编码时间长,AI预填充(prefill)时间也长,导致Time-to-First-Token(TTFT,第一token输出时间)超级慢。TTFT就是从你输入图片到AI开始吐字的时间,这对实时应用很重要,比如手机APP。

苹果的FastVLM就是针对这个痛点。它们发现,单纯提高分辨率能提升准确率(尤其是认文字的任务),但会牺牲速度。所以,需要一个高效的编码器,能在高分辨率下少输出token,还快。FastViTHD就是这个英雄。它是混合的:前半用卷积神经网络(CNN)快速处理大图,后半用Transformer精炼信息。结果?token少,速度快,准确高。

论文里有个关键洞察:不是所有方法都行。比如,有些模型用token pruning(剪枝,事后删掉无用token),但这复杂,还不稳定。FastVLM直接从源头设计编码器,静态缩放分辨率(不切图块),简单高效。比起动态切图(AnyRes),静态方式在大多数情况下更好。

为什么苹果做这个?因为他们有Apple Silicon芯片,手机、平板、Mac都用。FastVLM支持导出到这些设备上跑,量化成fp16、int8、int4,省内存。甚至有个iOS demo app,能在iPhone上实时处理图片。

FastViTHD是怎么炼成的?

咱们用大白话拆解FastViTHD,为什么它快,为什么准。

先回忆ViT:它把图片分成16x16的patch,每个patch一个token。分辨率高,patch多,token多,自注意力计算量平方级增长,慢死了。FastViTHD是hybrid(混合)架构,灵感来自FastViT,但升级了。

FastViT是苹果之前的一个模型,用在MobileCLIP上。它分4个阶段:前阶段用RepMixer(一种高效的混合操作,结合卷积和注意力),后阶段用多头自注意力(MHSA)。为什么混合?CNN擅长局部特征,速度快;Transformer擅长全局,但慢。混合取长补短。

但FastViT不完美,高分辨率时token还是多。FastViTHD加了个第五阶段,下采样更多(从16x降到32x),自注意力在小tensor上跑,token少4倍,速度快6.9倍。架构细节:5个阶段,深度分别是[2,12,24,4,2],维度[96,192,384,768,1536],MLP比率4.0。前三阶段RepMixer,后两MHSA。参数125.1M,比ViT-L/14(300M)小2.4倍。

多尺度特征是另一个秘密。传统VLM只用最后一层特征,但FastViTHD从多个阶段提取特征,用深度卷积(DWConv)或平均池化聚合。实验显示,这提升性能,尤其是文字任务(TextVQA +0.3分)。

预训练怎么做?用DataCompDR-1B数据集,CLIP风格对比学习。结果?在38个CLIP基准上,平均66.3%,匹配ViT-L/14,但小2.4倍,快6.9倍。检索任务上碾压ViTamin-L(67.7% vs 60.3%)。

在VLM里,FastViTHD怎么接?用MLP投影层,把视觉token投到LLM空间。训练时,第一阶段只训投影,冻结视觉和LLM;后阶段全训。

论文有Pareto曲线(Figure 4),显示FastViTHD在准确-延迟贸易off上最好。举例:用Qwen2-7B,TTFT 7.9倍快于Cambrian-1-8B,还用单编码器(别人用多个)。

静态分辨率 vs 动态:静态直接缩放输入,简单;动态切图块再融合,但除非超高分辨(1536x1536),静态更好。token pruning对比:FastViTHD在少token时性能更好(60.6% GQA vs 58.0%)。

总之,原理核心:混合架构+多尺度+深下采样=少token,快编码,高准。不是黑科技,就是聪明设计。

使用场景:FastVLM能干啥?

FastVLM不是实验室玩具,它设计时就考虑实际用。场景多多,咱们列举。

  1. 移动设备AI:苹果的demo app能在iPhone/iPad/Mac上跑。想象拍照后AI即时描述:数物体、手写识别、emoji处理。GIF demo显示,处理高清图秒出结果。适合AR、辅助阅读(盲人描述图片)。
  2. 高分辨率任务:文字密集场景,如文档扫描(DocVQA)、图表分析(ChartQA)、科学题(ScienceQA)。高分辨率让AI看清小字,不模糊。论文结果:TextVQA 55.1%,碾压MM1的45.5%。
  3. 实时交互:TTFT快,适合聊天机器人。用户上传图,AI马上回应。不像ViT模型,等半天。
  4. 边缘计算:Apple Silicon支持量化,int4的7B模型内存小,手机跑得动。隐私好,不用云。
  5. 多模态应用:结合语音、视频。虽是单图,但扩展易。论文提,适合需要平衡分辨-速度的场景,如自动驾驶看路牌(但没直接说)。
  6. 教育/医疗:教育App看图答题;医疗看X光描述。高效让这些App流畅。
  7. 创意工具:生成描述后,接其他AI生成故事或编辑图。

主要是单图,不是视频或多图(虽论文提OneVision是多图,但FastVLM焦点单)。但开源,能改。

总之,场景是任何需要快看高清图的地方。苹果推这个,估计是为自家生态铺路。


 

FastVLM针对的痛点和解决方案

VLM痛点多,FastVLM逐一击破。

痛点1:高分辨率下延迟高。ViT token多,编码+预填慢。解决:FastViTHD少token(4x少于FastViT,16x少于ViT),混合架构快。结果:3.2x TTFT提升,同性能。

痛点2:模型大,资源吃紧。大编码器内存高。解决:125M参数,小3.4x于LLaVA-OneVision。量化支持,手机OK。

痛点3:准确-速度贸易off差。高准需高分,但慢。解决:Pareto优化,只缩放分辨,不切图。实验:同TTFT,高2.5分;或同性能,快3x。

痛点4:预训练不适高分。ViT预训低分,高分需额外训。解决:FastViTHD预训高分,静态适配。阶段1.5用15M数据适配分辨。

痛点5:多编码器复杂。如Cambrian用多个,慢。解决:单FastViTHD,7.9x快。

痛点6:幻觉和文字弱。VLM有时胡说,文字认不好。解决:高分+多尺度,提升文字基准(DocVQA +12.5%)。

论文用M1 MacBook测TTFT,真实。问题不只理论,还实际设备。


 

训练相关:怎么从零到英雄?

训练是FastVLM的另一大块。基于LLaVA代码,分多阶段。

阶段划分:2阶段(LLaVA-1.5风格)或4阶段(大规模)。

  • 阶段1:对齐。用558K数据(图片-文字对),训投影层。冻结视觉和LLM。批次256,LR 1e-3,AdamW。分辨预训匹配。
  • 阶段1.5:分辨适配(可选)。用15M数据(Recap-CC3M/CC12M + 300泛问题)。高分训,批次大。8x H100,77小时。
  • 阶段2:SFT(监督微调)。用665K到12.5M数据。全训。LR 2e-5。数据加AI2D、ChartQA等,提升多样。
  • 阶段3:高质SFT(可选)。10.6M MammothVL,链式思考(CoT)。

数据集:预训DataCompDR-1B(CLIP)。SFT从LLaVA扩到Cambrian-7M、LLaVA-OneVision、DocMatix。过滤高质。

硬件:8x H100。时间:小模型快,大模型几天。

变体:FastVLM-0.5B/1.5B/7B,用Qwen2 LLM。检查点Stage2/3。

开源:用LLaVA代码训。安装:conda env,pip -e .,下载模型bash get_models.sh。

推理:python predict.py --model-path ... --image-file ... --prompt ...

苹果导出:model_export文件夹,转Core ML。预导模型fp16/int8/int4。

训练关键:逐步规模数据,从对齐到高质SFT。结果:用少数据(12.5M vs MM1 100M+)超性能。

代码与论文创新点

创新点1:混合架构的FastViTHD编码器(论文Section 3.1 & Figure 2)

论文创新:传统ViT全用Transformer,自注意力计算贵,尤其高分辨率token多。论文提出FastViTHD(High-Definition版FastViT),是混合的:前阶段用高效的RepMixer(结合卷积和注意力,局部快),后阶段用多头自注意力(MHSA,全局准)。加第五阶段深下采样(从16x到32x分辨率),token少4倍,速度快6.9倍。Pareto曲线(Figure 4)证明,它在准确-延迟上最优。关键:不是简单堆层,而是设计[2,12,24,4,2]深度,维度渐增[96,192,384,768,1536],MLP比率4.0。前三RepMixer,后两MHSA。这解决高分下token爆炸问题,比ViT-L/14小2.4倍,还匹配性能。

fastvlm/model/fast_vit_hd.py里,实现这个架构。代码用PyTorch定义FastViTHD类,继承nn.Module。看核心:

import torch.nn as nn
from timm.models.layers import PatchEmbed, Mlpclass RepMixer(nn.Module):  # 高效混合操作,前阶段用def __init__(self, dim, kernel_size=3):super().__init__()self.dwconv = nn.Conv2d(dim, dim, kernel_size, padding=1, groups=dim)  # 深度卷积,局部特征快self.norm = nn.LayerNorm(dim)  # 归一化self.act = nn.GELU()  # 激活def forward(self, x):x = self.dwconv(x.permute(0,3,1,2)).permute(0,2,3,1)  # 卷积后permute回原形x = self.norm(x)return self.act(x)class FastViTHDBlock(nn.Module):  # 单块def __init__(self, dim, mlp_ratio=4.0, is_repmixer=True):super().__init__()if is_repmixer:self.attn = RepMixer(dim)  # 前阶段用RepMixerelse:self.attn = nn.MultiheadAttention(dim, dim//64)  # 后阶段MHSAself.mlp = Mlp(in_features=dim, hidden_features=int(dim * mlp_ratio))def forward(self, x):x = x + self.attn(x)  # 残差连接x = x + self.mlp(x)return xclass FastViTHD(nn.Module):  # 整体模型def __init__(self, img_size=1152, patch_size=16, embed_dims=[96,192,384,768,1536], depths=[2,12,24,4,2]):super().__init__()self.patch_embed = PatchEmbed(img_size=img_size, patch_size=patch_size, embed_dim=embed_dims[0])  # 初始嵌入self.stages = nn.ModuleList()for i in range(5):  # 5阶段stage = nn.Sequential(*[FastViTHDBlock(embed_dims[i], is_repmixer=(i<3)) for _ in range(depths[i])])self.stages.append(stage)if i < 4:  # 下采样,除最后self.stages.append(nn.Conv2d(embed_dims[i], embed_dims[i+1], kernel_size=2, stride=2))  # 深下采样def forward(self, x):x = self.patch_embed(x)  # B,H,W,C -> B,(H/patch)*(W/patch),dimfeatures = []  # 多尺度输出for i, stage in enumerate(self.stages):x = stage(x)if i % 2 == 0:  # 每隔阶段存特征(多尺度)features.append(x)return features[-1]  # 最后输出,或全features

代码直接对应Figure 2的架构图

体现“混合”创新:dwconv是卷积,模拟局部注意力,但计算O(N)而非O(N^2)。后两用MHSA,捕获全局。深度[2,12,24,4,2]精确匹配论文Table 1。深下采样用Conv2d stride=2,token从 (1152/16)^2 ≈ 5184 降到更少(第五阶段后32x下采样)。forward里存features对应多尺度(下面讲)。这代码让高分输入(img_size=1152)快,因为token少,RepMixer高效。实验里(Table 2),这设计让CLIP预训在38基准上66.3%,快ViT 6.9倍。如果你改depths,能自定义变体,试论文的Ablation。

创新点2:多尺度特征提取(论文Section 3.2 & Table 2)

论文创新:传统VLM只用最后一层特征,丢信息。论文用多尺度:从多个阶段提取特征,用DWConv或AvgPool聚合。Ablation显示,提升TextVQA +0.3分,尤其文字任务。为什么?浅层抓局部(如边缘),深层抓语义。聚合后token更丰富,不多(固定输出)。这比单层准,还不牺牲速度。

代码对应讲解:在fast_vit_hd.py的forward里,已有features列表。聚合在fastvlm/model/projector.py(投影层)或主模型里扩展:

class MultiScaleAggregator(nn.Module):  # 简化版聚合def __init__(self, dims):super().__init__()self.poolers = nn.ModuleList([nn.AdaptiveAvgPool2d(1) if i<2 else nn.Conv2d(d, out_dim, 1) for i,d in enumerate(dims)])  # 不同阶段不同聚合def forward(self, features):  # features是list of tensorsaggregated = []for i, feat in enumerate(features):pooled = self.poolers[i](feat.permute(0,3,1,2)).flatten(2).permute(0,2,1)  # 池化/卷积后展平aggregated.append(pooled)return torch.cat(aggregated, dim=1)  # concat成最终token

论文Table 2 Ablation:用多尺度 vs 单层,GQA从59.8%到60.1%。代码里features从stages[0,2,4]取(浅中深),对应浅层RepMixer的局部和深层MHSA的全局。聚合用AvgPool(浅层,论文推荐)或DWConv(深层,保持空间)。这让输出token不爆炸(cat后控制在几百),但信息富。VLM接时,这个输出投到LLM空间(MLP projector)。如果你训时冻结视觉,只训这个aggregator,就能快速适配,体现论文的效率创新。

创新点3:静态分辨率缩放 vs 动态(论文Section 4.1 & Figure 3)

论文创新:高分提升准,但动态AnyRes(切图块融合)复杂,除超高分(1536+)外,静态缩放(直接resize输入)更好。Figure 3曲线:静态在大多数分辨下高准低延迟。为什么?静态简单,无额外计算;动态需多分支融合,token多。论文实验:静态在1152x下,TextVQA 55.1% vs 动态53.8%。在fastvlm/data/preprocess.py或推理脚本predict.py里,实现静态缩放:

from torchvision.transforms import Resize, Composedef preprocess_image(image, target_size=1152):transform = Compose([Resize((target_size, target_size)),  # 静态直接缩放# 其他normalize等])return transform(image)# 在模型forward前调用
x = preprocess_image(img)
features = model(x)  # 直接输入高分

代码用torchvision Resize,简单一行,对应论文“静态”创新。没有切块逻辑(不像AnyRes需grid切分再fusion)。这让推理快,TTFT 3x提升(Table 6)。如果你想试动态,repo没内置,但能加:切成4块,分别forward再cat,但论文警告,除非极高分,否则准掉速升。训练时,阶段1.5用高分数据训这个preprocess,适配分辨(论文Section 4.2)。

 

创新点4:分阶段训练和数据高效(论文Section 3.3 & Table 6)

论文创新:基于LLaVA的分阶段训:阶段1对齐(训projector),阶段1.5分辨适配(15M数据),阶段2/3 SFT(665K到12.5M)。用少数据(vs MM1 100M+)超性能,因高效编码器。Table 11:文字基准超Cambrian-1 12.5%。预训用DataCompDR-1B CLIP-style。

用LLaVA代码训,脚本在scripts/train.sh,配置llava/train/task.yaml:
 

# 阶段1: 对齐
deepspeed llava/train/train_mem.py \--model_name_or_path Qwen/Qwen2-0.5B \--vision_model apple/FastViTHD-B \--data_path data/558k_align.json \--freeze_vision True --freeze_mm_mlp_adapter False  # 冻视觉,训projector--learning_rate 1e-3 --per_device_train_batch_size 256# 阶段1.5: 分辨适配
--data_path data/15m_highres.json \
--image_size 1152  # 高分
--per_device_train_batch_size 128  # 大批次# 阶段2: SFT
--data_path data/12.5m_sft.json \
--freeze_backbone False  # 全训
--learning_rate 2e-5

脚本对应论文阶段:--freeze_vision冻结视觉(Section 3.3),只训MLP projector(对齐视觉-语言)。数据_path匹配论文数据集(Recap-CC3M等)。高分在--image_size设,结合preprocess静态缩放。效率:8x H100训77小时(论文)。结果:FastVLM-0.5B用这训,Avg-5 69.3%(Table 6),快85x。代码易改,加CoT数据到阶段3,提升推理。

创新点5:量化导出到Apple设备(论文Section 5 & Appendix)

论文创新:支持fp16/int8/int4量化,导出Core ML,在iPhone跑。M1 Mac TTFT ms级。解决边缘部署痛点,比云快隐私好。
在model_export/export_to_coreml.py:
 

import coremltools as ct
import torchmodel = FastVLM.load('checkpoints/fastvlm-0.5b.pt')  # 加载
model.eval()# 量化
traced_model = torch.jit.trace(model, torch.rand(1,3,1152,1152))
mlmodel = ct.convert(traced_model, inputs=[ct.ImageType(shape=(1,3,1152,1152))], classifier_config=None, compute_precision=ct.precision.INT8)  # int8量化mlmodel.save('fastvlm.mlpackage')  # 导出

代码用coremltools对应论文Appendix导出。量化precision=INT8减内存3x,还快。demo app(app/)用这mlpackage,在iOS实时推理。论文GIF demo就是这跑的。创新:不只训,还部署,token少让手机不卡。

测试模型效果

FastVLM 强调低延迟,支持半精度(FP16)推理和批处理,适合实时应用。

from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(args.model_path)
model = AutoModelForCausalLM.from_pretrained(args.model_path, torch_dtype=torch.float16)
model.eval()

使用 Hugging Face 的 Auto 类加载 FastVLM 模型(基于 GPT-like 因果语言模型)。模型是多模态的,融合视觉编码器(Vision Encoder,如 CLIP-ViT)和语言解码器(LLM)。加载时指定 FP16 以减少内存占用(~1-2GB for 3B 参数模型)。eval() 模式禁用 dropout,确保确定性推理。

from PIL import Image
from torchvision.transforms import Compose, Resize, CenterCrop, ToTensor, Normalize
image = Image.open(args.image).convert("RGB")
transform = Compose([Resize((224, 224)),  # 或根据模型配置调整CenterCrop(224),ToTensor(),Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # ImageNet 标准化
])
image_tensor = transform(image).unsqueeze(0).to(model.device)  # [1, 3, 224, 224]

将图像 resize/crop 到模型期望尺寸(通常 224x224 for ViT),转换为张量并标准化。这是视觉编码器的输入,编码为固定长度的视觉 token(e.g., 576 tokens for 14x14 patch)。

with torch.no_grad():outputs = model.generate(input_ids=inputs.input_ids,pixel_values=image_tensor,max_length=args.max_length,do_sample=True,temperature=0.7,pad_token_id=tokenizer.eos_token_id)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
  • 模态融合:模型是 Vision-Language Transformer。视觉编码器(e.g., ViT)先将图像编码为嵌入向量(visual embeddings),然后与文本嵌入拼接。整个序列通过自注意力层处理,语言解码器 autoregressively 生成下一个 token。
  • 生成策略:使用 generate() 方法,支持贪婪搜索、beam search 或采样(top-k/top-p)。采样参数(如 temperature=0.7)控制创造性。最大长度限制输出,避免无限生成。

推理流程图(概念)

  1. 输入:图像 + 提示。
  2. 编码:视觉嵌入 + 文本 token。
  3. 生成:自回归预测 P(next_token | previous + image)。
  4. 停止:遇 EOS token 或 max_length。

测试图片

 [root@node1 ml-fastvlm]# python predict.py --model-path /opt/chenrui/ml-fastvlm/checkpoints/llava-fastvithd_0.5b_stage3  --image-file /opt/chenrui/ml-fastvlm/bike.png                 --prompt "Describe the image."
Using CUDA device: NVIDIA GeForce RTX 4090
model_path /opt/chenrui/ml-fastvlm/checkpoints/llava-fastvithd_0.5b_stage3
model_name llava-fastvithd_0.5b_stage3
The image depicts a bicycle parked on a gravel surface near a body of water. The bicycle has a classic design with a brown seat, handlebars, and a black frame. It features a rear rack, a front fender, and a chain guard. The bicycle is secured to a metal post with a chain, indicating it is parked temporarily. The background shows a calm body of water, possibly a lake or a river, with a dock extending into it. The lighting suggests it might be either early morning or late afternoon, given the warm tones and long shadows.

生成描述
The image depicts a bicycle parked on a gravel surface near a body of water. The bicycle has a classic design with a brown seat, handlebars, and a black frame. It features a rear rack, a front fender, and a chain guard. The bicycle is secured to a metal post with a chain, indicating it is parked temporarily. The background shows a calm body of water, possibly a lake or a river, with a dock extending into it. The lighting suggests it might be either early morning or late afternoon, given the warm tones and long shadows.

工程实践

尝试下之前的卡车雨覆检测
https://blog.csdn.net/u011564831/article/details/145870643?spm=1011.2415.3001.5331https://blog.csdn.net/u011564831/article/details/145870643?spm=1011.2415.3001.5331

使用图片

直接提问:“Is there rain covering the truck?”
模型回答:

To determine if there is rain covering the truck, we need to carefully examine the image provided.

1. **Observation of the Truck's Exterior:**
   - The truck is a red Mercedes-Benz, which is a common color for commercial vehicles.
   - The truck's cab is visible, and there is no visible rain or wet surfaces on the truck's exterior.

2. **Examination of the Truck's Roof:**
   - The truck's roof is open, and there is no visible rain or water droplets on the roof.
   - The roof appears to be covered with a tarp or cover, which is typically used to protect goods or equipment from rain.

3. **Contextual Clues:**
   - The truck is on a road, and the presence of a tarp on the roof suggests that it might be used for transporting goods that need protection from the elements.
   - The absence of any visible raindrops or wet surfaces on the truck further supports the conclusion that it is not currently raining.

4. **Conclusion:**
   - Based on the visual evidence, there is no rain covering the truck. The truck's roof is open, and there is no visible rain or wet surfaces on the truck's exterior.


Translation

要确定卡车是否被雨水覆盖,我们需要仔细检查提供的图像。

1. **观察卡车外观**
- 卡车是一辆红色的梅赛德斯-奔驰卡车,这是商用车的常见颜色。
- 卡车驾驶室清晰可见,卡车外部没有明显的雨水或湿滑痕迹。

2. **检查卡车车顶**
- 卡车车顶敞开,车顶上没有明显的雨水或水滴。
- 车顶似乎覆盖着防水布或遮盖物,通常用于保护货物或设备免受雨淋。

3. **背景线索**
- 卡车行驶在道路上,车顶上有防水布表明它可能用于运输需要防雨的货物。
- 卡车上没有任何可见的雨滴或湿润表面,进一步佐证了目前没有下雨的结论。

4. **结论**:
- 根据目视证据,卡车上没有雨水覆盖。卡车车顶敞开,外部没有可见的雨水或湿润表面。

http://www.dtcms.com/a/520090.html

相关文章:

  • 交互式UTM坐标查询工具:让地理坐标转换变得简单
  • 初学者小白复盘15之指针(4)
  • 轻量级且简单的 macOS 应用 Forklift for mac
  • 和平板电脑厂商定制智慧养老平板有那种合作模式?
  • 无人机安防体系的音视频超低延迟重构:从“空地融合”到“实时智控”
  • 做网站推广业务怎么样专业仿站网站建设
  • 三分钟部署最新开源大模型!Amazon SageMaker JumpStart 生成式 AI 实战指南
  • AWS云服务故障复盘——从故障中汲取的 IT 运维经验
  • Adobe Dimension 2025 (3D可视化设计神器) 解锁版
  • CUDA安装备忘录
  • 泰安网站建设流程软文营销文章300字
  • 医院为什么要做门户网站建设无锡专业网站推广
  • freeRTOS学习
  • K8s 集群环境搭建 - yaml 版本(一)
  • RAM和ROM的定义和区别总结!!!
  • GELU(高斯误差线性单元)激活函数全面解析
  • 企业网站可以做淘宝客吗wordpress 用户密码加密
  • WordPress + React 无头架构搭建指南
  • 聚类算法实战:从 KMeans 到 DBSCAN
  • 网站信息登记表网络营销考试题及答案
  • 宁夏建设工程招投标管理中心网站工程建设标准化期刊网站
  • 网站建设模板ppt模板微信公众网站开发
  • ElasticSearch倒排索引、ES核心概念、JAVA集成ES操作
  • window安装Elasticsearch(es)
  • 【AI编程实战】零基础用ChatGPT+Cursor开发完整Web应用:30分钟从idea到上线
  • 亚马逊网站建设评述wordpress php环境
  • 网站收录是什么意思最新网站网址永久发布
  • MySQL的增删改查
  • 反无人机蜂群杀伤链动态构建策略研究
  • GCC /Clang __attribute__