第2章 — 深度学习方法与多模态特征工程

本章以工程化、可直接运行的方式讲解文本、音频、视觉三类模态的特征提取与优化要点,以及如何在多模态数据加载、对齐与内存受限场景下构建高效流水线。不含数学公式,重点落在实践技巧、陷阱与一套完整可执行的示例代码上(脚本会在没有真实数据时自动生成小样本以便演示)。请先按下方说明安装依赖,然后直接运行示例脚本。


2.1 文本模态:Transformer 特征提取与优化(实战要点)

要点总结(工程角度)

  • 优先使用预训练 Transformer(如 BERT / RoBERTa / DistilBERT)做句子/片段级 embedding。

  • 特征提取时进入推理模式(model.eval()、torch.no_grad()),并开启混合精度(如果有 GPU)以节省显存。

  • 池化策略:取 [CLS]、平均池化、最大池化或 attention pooling;要与下游任务对齐(例如短文本用 [CLS] 足够,长文本用滑窗 + pool)。

  • 文本长度截断与滑窗:长文本用重叠滑窗再池化,避免截断丢信息。

  • Batch-level tokenization:尽可能批量 tokenize 并在 DataLoader 的 collate_fn 中做 padding,减少 CPU-GPU 反复切换。

  • 冻结策略:若数据少,先冻结大部分 Transformer 层,仅微调顶部,减少过拟合与显存需求;若数据量充足,逐层解冻。

  • 离线缓存:把文本 embedding 缓存到磁盘(HDF5/LMDB)以便重复训练/调试时跳过重复计算。

常见实现陷阱

  • 直接把 Transformer 输出维度和其它模态拼接而不归一化,往往导致某个模态主导训练(需要 LayerNorm/小 MLP 投影)。

  • 在 CPU 上对大量文本循环调用 tokenizer 而没有 batch 化会非常慢。


2.2 音频模态:频谱与声学特征深度分析(实战要点)

要点总结

  • 两条主路线:传统声学特征(MFCC、Mel-spectrogram、Chroma)或端到端预训练声学模型(wav2vec2, HuBERT 等)。

  • 频谱特征:Mel-spectrogram 是最常用的通用表征,适合 CNN/Transformer 输入;在生成时注意采样率统一与窗长/步幅选择。

  • 端到端预训练:wav2vec2 能直接输出高质量帧级或片段级 embedding,适合情感、说话人等任务。

  • 数据增强:加背景噪声、随机裁切、音量扰动、时间/频率掩码(SpecAugment)能显著提升鲁棒性。

  • 端到端输入长度控制:采用滑窗(frame-level)或池化策略来对齐文本/视觉帧。

  • 实时/低延迟:使用较少的帧堆栈和轻量化模型,或在推理时降采样降低延迟。

性能/资源优化

  • 使用 librosa 或 torchaudio 生成频谱,torchaudio 在 GPU 上有更优选项(当集成到训练图时)。

  • 缓存 mel-spectrogram 到磁盘(压缩或量化),在训练时直接读取以减少重复 CPU 开销。

常见陷阱

  • 采样率不一致导致频谱失真;务必在入口统一采样率并记录原始时间轴以便对齐。

  • 忽略语音能量/沉默片段,会让模型学到不相关的噪声特征;可以按能量阈值做剪枝或在损失里降低影响。


2.3 视觉模态:CNN / Vision Transformer 特征提取(实战要点)

要点总结

  • 视觉特征两条主流路径:经典 CNN(ResNet / EfficientNet)或 ViT / Swin Transformer。

  • 若需要人脸/关键点等结构化信息,先用轻量检测器/关键点网络提取局部特征,再融合全局视觉表征。

  • 视频处理:常见策略是提取关键帧、均匀采样帧、或用预训练的时序模型(I3D、SlowFast)得到时序特征。

  • 池化策略:帧级特征可做时序平均、加权池化或基于 attention 的加权池化。

  • 性能优化:采用半精度、模型蒸馏、剪枝或 MobileNet/EfficientNet-Nano 在边缘设备上部署。

  • 帧预处理:统一分辨率、颜色归一化(使用训练时的均值与方差),避免在训练/推理间不一致。

常见陷阱

  • 在视频场景下把每帧独立处理导致 I/O 成为瓶颈:应使用批量读取并配合多进程 DataLoader。

  • 直接把原始图像向量拼接会导致维度巨大,应先用小 MLP/线性投影压缩。


2.4 多模态数据加载、对齐与内存优化策略(工程化实现要点)

对齐原则(工程做法)

  • 所有模态都应保留绝对时间轴(如毫秒级时间戳)。

  • 对齐方法示例:按主模态时间轴重采样(例如以视频帧为基准,把音频频谱池化到每帧对应窗口),或把文本 token 映射到时间区间后与帧/音频片段对齐。

  • 对齐策略依场景而定:对话以文本为主、视频会议以音视频帧为主。

内存优化与 I/O 策略

  • 延迟加载(Lazy Loading):只在需要时加载原始文件并在 GPU 可用前完成预处理。

  • 特征缓存:把昂贵计算(Transformer embedding、mel-spectrogram、CNN 特征)写到 HDF5/LMDB/Parquet,再在训练时直接读取。HDF5 支持压缩与内存映射(mmap),适合大规模数据。

  • 内存映射:对大 numpy 数组使用 numpy.memmap 或通过 HDF5 让系统管理内存页,这样不必把整个数据集读入 RAM。

  • Batch-level prefetch & pin_memory:DataLoader 使用 num_workers>0 与 pin_memory=True 提升 CPU->GPU 传输效率;同时使用较大的 batch 做更好 GPU 利用。

  • 合并 I/O 操作:把小文件合并到一个大容器(例如 LMDB)以减少文件系统开销。

  • Mixed Precision & Gradient Checkpointing:在训练阶段使用半精度与 checkpointing 节省显存。特征提取阶段同样可用半精度。

  • 合理选择数据类型:将缓存特征从 float32 转为 float16 或 int8(量化)来节省 2x-4x 存储。

鲁棒训练实践

  • 数据加载层模拟缺失模态与噪声(随机抹掉模态、添加噪声、混合背景音),训练模型适应真实场景。

  • 在缓存阶段记录模态完整性/质量标记(如音频 SNR、视频模糊度),训练时把这些标记用作模态可信度的输入。


完整可执行示例脚本(multimodal_feature_pipeline.py)

下面是一份自包含的、可直接运行的 Python 脚本。它演示了文本、音频、视觉特征提取、缓存、以及多模态 Dataset 与对齐策略。脚本会在 ./demo_data/ 下查找样本;若没有真实数据会自动生成少量合成样本以做演示。请按注释运行。

依赖安装(建议在虚拟环境):
pip install torch torchvision transformers timm librosa soundfile opencv-python h5py numpy tqdm


#!/usr/bin/env python3 """ multimodal_feature_pipeline.py 说明: - 演示文本/音频/视觉三模态的特征提取、缓存、对齐与高效 DataLoader。 - 若 ./demo_data/ 不存在真实数据,会自动生成少量合成示例以便演示。 - 运行: python multimodal_feature_pipeline.py """ import os import sys import json import math import time import random import pathlib import h5py import numpy as np from tqdm import tqdm # 需要的深度学习/音频/视觉库 import torch from torch.utils.data import Dataset, DataLoader from transformers import AutoTokenizer, AutoModel import torchvision.transforms as T import torchvision.models as models import timm # optional: for ViT import librosa import soundfile as sf from PIL import Image, ImageDraw, ImageFont import cv2 # ------------------------------ # 配置区(可以修改) # ------------------------------ DATA_DIR = pathlib.Path("./demo_data") CACHE_DIR = pathlib.Path("./cache_features") CACHE_DIR.mkdir(exist_ok=True) HDF5_PATH = CACHE_DIR / "features_cache.h5" SAMPLE_RATE = 16000 DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") BATCH_SIZE = 8 NUM_WORKERS = 2 # DataLoader 的 num_workers TEXT_MODEL_NAME = "sentence-transformers/all-MiniLM-L6-v2" # 小型 sentence-transformer,适合示例 VISUAL_MODEL_NAME = "resnet18" USE_TIMM_VIT = False # 若想用 ViT 可设置 True(需 timm 支持对应预训练权重) AUDIO_N_MELS = 64 # ------------------------------ # 如果没有数据,自动生成简单合成样本以演示(2 个样本) # 每个样本包含:text.txt, audio.wav, frames/*.jpg, meta.json (timestamps) # ------------------------------ def generate_demo_data(): DATA_DIR.mkdir(exist_ok=True) for i in range(2): sample_dir = DATA_DIR / f"sample_{i:02d}" sample_dir.mkdir(exist_ok=True) # 文本 text = [ "I am very happy today!", "I feel a bit upset about the meeting.", "This is a neutral statement." ][i % 3] (sample_dir / "text.txt").write_text(text, encoding="utf-8") # 音频:生成一个短音频(sine + noise),写 wav duration = 2.0 + i * 0.5 sr = SAMPLE_RATE t = np.linspace(0, duration, int(sr*duration), endpoint=False) tone = 0.1 * np.sin(2 * np.pi * (220 + i*80) * t) noise = 0.01 * np.random.randn(len(t)) audio = tone + noise sf.write(str(sample_dir / "audio.wav"), audio.astype(np.float32), sr) # frames:生成 8 张简单图片,记录时间戳(均匀) frame_dir = sample_dir / "frames" frame_dir.mkdir(exist_ok=True) n_frames = 8 for f in range(n_frames): img = Image.new("RGB", (224,224), color=(int(30+f*20),120,150)) draw = ImageDraw.Draw(img) draw.text((10,10), f"Sample {i} Frame {f}", fill=(255,255,255)) img.save(frame_dir / f"frame_{f:03d}.jpg") # metadata:frame timestamps in seconds timestamps = {"frame_timestamps": [round(j * (duration / n_frames), 4) for j in range(n_frames)], "audio_duration": duration} (sample_dir / "meta.json").write_text(json.dumps(timestamps), encoding="utf-8") # 生成示例数据(若目录不存在) if not DATA_DIR.exists() or len(list(DATA_DIR.glob("sample_*"))) == 0: print("No demo data found — generating demo samples...") generate_demo_data() # ------------------------------ # TextFeatureExtractor:批量 tokenization + transformer embedding 缓存策略 # ------------------------------ class TextFeatureExtractor: def __init__(self, model_name=TEXT_MODEL_NAME, device=DEVICE, fp16=False): print("Loading text model:", model_name) self.tokenizer = AutoTokenizer.from_pretrained(model_name) self.model = AutoModel.from_pretrained(model_name).to(device) self.model.eval() self.device = device self.fp16 = fp16 def encode_batch(self, texts): # texts: list[str] enc = self.tokenizer(texts, padding=True, truncation=True, return_tensors="pt") input_ids = enc["input_ids"].to(self.device) attn = enc["attention_mask"].to(self.device) with torch.no_grad(): if self.fp16 and self.device.type == "cuda": with torch.cuda.amp.autocast(): out = self.model(input_ids=input_ids, attention_mask=attn, return_dict=True) else: out = self.model(input_ids=input_ids, attention_mask=attn, return_dict=True) # pooling: mean pooling over token embeddings (ignores padding) last_hidden = out.last_hidden_state # B x T x D attn = attn.unsqueeze(-1) sum_emb = (last_hidden * attn).sum(dim=1) lengths = attn.sum(dim=1).clamp(min=1) pooled = sum_emb / lengths return pooled.cpu().numpy() # return numpy array # ------------------------------ # AudioFeatureExtractor:mel-spectrogram + optional wav2vec path # ------------------------------ class AudioFeatureExtractor: def __init__(self, sr=SAMPLE_RATE, n_mels=AUDIO_N_MELS): self.sr = sr self.n_mels = n_mels def load_audio(self, path): y, sr = librosa.load(path, sr=self.sr) return y def extract_mel(self, y): # compute mel spectrogram (power -> log) S = librosa.feature.melspectrogram(y=y, sr=self.sr, n_mels=self.n_mels, n_fft=1024, hop_length=512) logS = librosa.power_to_db(S, ref=np.max) # return shape (n_mels, T) return logS.astype(np.float32) def frame_level_pool(self, mel, frame_timestamps, audio_duration): # Align mel frames to desired frame timestamps. # mel has time bins; compute time for each mel frame and pool mel frames whose time in window. # Simpler策略:compute time axis and sample mel at nearest time n_frames = mel.shape[1] mel_times = np.linspace(0.0, audio_duration, num=n_frames) # For each desired frame timestamp, pick nearest mel column and return vector cols = [] for ts in frame_timestamps: idx = np.abs(mel_times - ts).argmin() cols.append(mel[:, idx]) return np.stack(cols, axis=0) # frames x n_mels # ------------------------------ # VisualFeatureExtractor:使用 ResNet18(或 ViT via timm) # ------------------------------ class VisualFeatureExtractor: def __init__(self, model_name=VISUAL_MODEL_NAME, device=DEVICE, use_timm_vit=False): self.device = device self.use_timm_vit = use_timm_vit if use_timm_vit: print("Loading ViT via timm") self.model = timm.create_model("vit_base_patch16_224", pretrained=True) self.model.reset_classifier(0) self.transform = T.Compose([ T.Resize(256), T.CenterCrop(224), T.ToTensor(), T.Normalize(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225]) ]) else: print("Loading ResNet18 from torchvision") self.model = models.resnet18(pretrained=True) self.model.fc = torch.nn.Identity() # get penultimate features self.transform = T.Compose([ T.Resize(224), T.CenterCrop(224), T.ToTensor(), T.Normalize(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225]) ]) self.model.to(device) self.model.eval() def extract_frames(self, frame_paths): imgs = [] for p in frame_paths: img = Image.open(p).convert("RGB") imgs.append(self.transform(img)) batch = torch.stack(imgs).to(self.device) with torch.no_grad(): feats = self.model(batch) return feats.cpu().numpy() # N x D # ------------------------------ # Feature cache helper (HDF5-based). 简易实现:以 sample 为一级 key,存储 text/audio/visual arrays # 优点:单文件存储、支持压缩、可 memory-map 读取部分数据 # ------------------------------ class FeatureCache: def __init__(self, h5path=HDF5_PATH): self.h5path = str(h5path) self.h5 = None def open(self, mode="a"): self.h5 = h5py.File(self.h5path, mode) def close(self): if self.h5 is not None: self.h5.close() self.h5 = None def has(self, sample_id): return (sample_id in self.h5) def write(self, sample_id, features: dict): """ features: dict of name -> numpy array """ grp = self.h5.require_group(sample_id) for k, v in features.items(): if k in grp: del grp[k] grp.create_dataset(k, data=v, compression="gzip") def read(self, sample_id, key): return self.h5[sample_id][key][()] # ------------------------------ # MultimodalDataset:加载原始文件、调用各 modality extractor(或从缓存读取),并执行对齐返回统一帧级特征 # ------------------------------ class MultimodalDataset(Dataset): def __init__(self, data_root=DATA_DIR, cache: FeatureCache=None, text_extractor: TextFeatureExtractor=None, audio_extractor: AudioFeatureExtractor=None, visual_extractor: VisualFeatureExtractor=None, use_cache=True): self.data_root = pathlib.Path(data_root) self.samples = sorted([p for p in self.data_root.glob("sample_*") if p.is_dir()]) self.cache = cache self.text_extractor = text_extractor self.audio_extractor = audio_extractor self.visual_extractor = visual_extractor self.use_cache = use_cache def __len__(self): return len(self.samples) def _read_meta(self, sample_dir): meta = json.loads((sample_dir / "meta.json").read_text(encoding="utf-8")) return meta def __getitem__(self, idx): sample_dir = self.samples[idx] sid = sample_dir.name # lazy open cache if self.cache is not None and self.cache.h5 is None: self.cache.open(mode="a") # if using cache and features exist, load them if self.use_cache and self.cache is not None and self.cache.has(sid): text_emb = self.cache.read(sid, "text") audio_frame_feats = self.cache.read(sid, "audio_frames") visual_frame_feats = self.cache.read(sid, "visual_frames") meta = self._read_meta(sample_dir) return {"id": sid, "text_emb": text_emb, "audio_frames": audio_frame_feats, "visual_frames": visual_frame_feats, "meta": meta} # else compute features # text text_path = sample_dir / "text.txt" text = text_path.read_text(encoding="utf-8").strip() text_emb = self.text_extractor.encode_batch([text])[0] # (D,) # audio audio_path = sample_dir / "audio.wav" meta = self._read_meta(sample_dir) audio = self.audio_extractor.load_audio(str(audio_path)) mel = self.audio_extractor.extract_mel(audio) # get audio features per frame timestamps frame_ts = meta["frame_timestamps"] audio_frame_feats = self.audio_extractor.frame_level_pool(mel, frame_ts, meta["audio_duration"]) # visual frames frame_files = sorted((sample_dir / "frames").glob("*.jpg")) visual_frame_feats = self.visual_extractor.extract_frames([str(p) for p in frame_files]) # cache features if self.cache is not None: self.cache.write(sid, {"text": text_emb, "audio_frames": audio_frame_feats, "visual_frames": visual_frame_feats}) return {"id": sid, "text_emb": text_emb, "audio_frames": audio_frame_feats, "visual_frames": visual_frame_feats, "meta": meta} # ------------------------------ # collate_fn:把不同帧数量的样本 pad 到同一长度并返回 masks # ------------------------------ def collate_fn(batch): # batch: list of dicts ids = [b["id"] for b in batch] text_embs = np.stack([b["text_emb"] for b in batch], axis=0) # B x Dtext # frames may have different lengths; pad to max_len vis = [b["visual_frames"] for b in batch] aud = [b["audio_frames"] for b in batch] lengths = [v.shape[0] for v in vis] max_len = max(lengths) # features dims vis_dim = vis[0].shape[1] aud_dim = aud[0].shape[1] vis_padded = np.zeros((len(batch), max_len, vis_dim), dtype=np.float32) aud_padded = np.zeros((len(batch), max_len, aud_dim), dtype=np.float32) mask = np.zeros((len(batch), max_len), dtype=np.float32) for i,(v,a) in enumerate(zip(vis,aud)): L = v.shape[0] vis_padded[i,:L,:] = v aud_padded[i,:L,:] = a mask[i,:L] = 1.0 out = { "ids": ids, "text_emb": torch.from_numpy(text_embs), "visual_frames": torch.from_numpy(vis_padded), "audio_frames": torch.from_numpy(aud_padded), "mask": torch.from_numpy(mask) } return out # ------------------------------ # 演示主流程(build cache, then iterate DataLoader) # ------------------------------ def main_demo(): print("Device:", DEVICE) # 初始化 extractors text_ext = TextFeatureExtractor(device=DEVICE, fp16=False) audio_ext = AudioFeatureExtractor(sr=SAMPLE_RATE, n_mels=AUDIO_N_MELS) visual_ext = VisualFeatureExtractor(device=DEVICE, use_timm_vit=USE_TIMM_VIT) # cache hdf5 cache = FeatureCache() cache.open(mode="a") # dataset(会在第一次读取时写入 cache) ds = MultimodalDataset(data_root=DATA_DIR, cache=cache, text_extractor=text_ext, audio_extractor=audio_ext, visual_extractor=visual_ext, use_cache=True) # DataLoader dl = DataLoader(ds, batch_size=BATCH_SIZE, shuffle=False, num_workers=NUM_WORKERS, collate_fn=collate_fn, pin_memory=True) # Iterate once to build/validate cache and show shapes print("Iterating data loader to demonstrate shapes and alignment...") for batch in dl: print("Batch IDs:", batch["ids"]) print("Text emb shape:", batch["text_emb"].shape) print("Visual frames shape:", batch["visual_frames"].shape) print("Audio frames shape:", batch["audio_frames"].shape) print("Mask shape:", batch["mask"].shape) # Example of per-frame fusion: concat audio+visual per frame, and broadcast text per frame B, T, Vd = batch["visual_frames"].shape Ad = batch["audio_frames"].shape[-1] Td = batch["text_emb"].shape[-1] # naive fusion tensor: B x T x (Vd + Ad + Td) text_broadcast = batch["text_emb"].unsqueeze(1).expand(-1, T, -1) fused = torch.cat([batch["visual_frames"], batch["audio_frames"], text_broadcast], dim=-1) print("Fused per-frame shape (example):", fused.shape) break cache.close() print("Demo finished. Cached features stored at:", HDF5_PATH) if __name__ == "__main__": main_demo()


扩展与工程化建议(可直接落地的优化清单)

  1. 生产级缓存:

    • 用 LMDB 存大量小对象,或用 HDF5(大数组)+压缩。

    • 缓存时将 float32 -> float16 以节省空间(注意精度需求)。

  2. 并行化特征构建:

    • 在离线预处理阶段,用多进程批量提取并写入缓存(注意 HDF5 多进程写入要防护,可以采取每个进程写单独文件,最后合并索引的策略)。

  3. 多层对齐:

    • 文本 token → 时间映射(如果可得文本时间戳),然后把 token-level embedding pool 到视觉/音频帧时间窗口里。

    • 在无法精确对齐时使用 attention-based matching:把音频/视觉片段当成 key/value,文本当 query,训练中学习 soft alignment。

  4. 内存/显存控制:

    • 训练时使用 torch.cuda.amp、梯度累积(accumulate)和 checkpointing。

    • 推理时导出为 TorchScript 或 ONNX,启用半精度。

  5. 鲁棒性策略:

    • 在 DataLoader 层模拟缺失模态;在训练损失中加入模态不确定性正则(即自适应降低低质量模态权重)。

    • 在缓存阶段计算并记录模态质量指标(SNR、motion blur score 等),作为训练条件输入。


小结

  • 本章给出工程化的、完整可运行示例,覆盖文本 Transformer 池化策略、音频的 mel-spectrogram 处理、视觉 CNN 特征提取,以及多模态缓存/对齐/批处理的实际代码。

  • 通过延迟加载 + HDF5 缓存 + DataLoader 并行预取 + 合理池化/对齐策略,可以在资源受限场景中把训练/推理流水线做到既高效又稳健。

  • 下一步可以把此流水线接入真实数据集(IEMOCAP、CMU-MOSI、CMU-MOSEI、AVEC 等),并实现训练端的多模态模型(例如 Cross-Modal Transformer / AGFN 风格的可信度门控模块)。

(多模态 / 多维度)特征融合 文章目录模式分类中的特征融合方法引入现状 ( < 2017)算法基于贝叶斯理论的特征融合算法决策级水平融合(*)特征级水平融合 模式分类中的特征融合方法 引入 传统模式识别思路:特征工程(特征提取、特征降维、特征融合等)、分类器设计、训练测试 特征如:颜色特征、SIFT特征、HOG特征、HOF特征、GIST特征等 分类器如:KNN、SVM,Random Forest、CNN等 特征分为:人工设计的特征 和 深度特征,前者特点鲜明意义明确,后者面向具体问题(即理解为 提取的特征 是针对CNN训练时侧重 阅读详情

相关推荐

多模态融合中特征对齐的技术方法与应用案例

本文深入探讨了多模态融合领域中特征对齐这一关键技术。首先介绍了多模态融合以及特征对齐的基本概念,接着详细阐述了多种常见的特征对齐技术方法,包括基于深度学习的方法等。同时,通过具体的应用案例展示了特征对齐在不同场景下的实际效果,并给出了相应的代码示例辅助理解。希望能为相关领域的研究者和开发者提供有益的参考。

2301_76297596的博客 1702

【AI深究】特征工程(Feature Engineering)深度解析:原理、算法与工程实践|核心原理、主流方法、数学表达、未来趋势|归一化与标准化、降维、文本、时间、类别型、AutoFE|未来前沿

大家好,我是爱酱。本篇延续将会系统梳理特征工程(Feature Engineering)的定义、核心流程、主流方法、数学表达、工程实践与未来趋势,结合数学公式,帮助你全面理解这一机器学习与AI落地的“灵魂工程”。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

AI人工智能爱酱~你的AI学习好帮手~ 5312

智能分析:多模态分析_(3).多模态特征表示与提取

在上一节中,我们讨论了多模态数据的基本概念和应用场景。多模态数据包含了多种类型的信息,如图像、文本、音频和视频等。为了有效地利用这些信息,我们需要对其进行特征表示和提取。本节将详细介绍多模态特征表示与提取的原理和方法,并通过具体的代码示例来说明如何在实际项目中应用这些技术。

zhubeibei168的博客 1173

手势识别基础:手势识别的特征提取方法_9.多模态特征融合

多模态特征融合是手势识别领域中提高系统准确性和鲁棒性的有效方法。通过## 9.6 总结多模态特征融合是手势识别领域中提高系统准确性和鲁棒性的有效方法。通过将多种不同模态的数据(如图像、声音、深度信息等)进行结合,可以充分利用不同模态之间的互补信息,从而提升识别性能。本节详细介绍了多模态特征融合的三种主要方法:早期融合、晚期融合和混合融合,并提供了具体的代码示例。

zhubeibei168的博客 1305

ADS中HB仿真自动优化报错问题解决心得

在ADS HB仿真中自动优化出现报错被强制暂停,解决方法如下

yyyyyyyyyyjy的博客 6544

手把手教你设计反激开关电源:从整流滤波到PCB布局的实战避坑指南

本文是一份反激开关电源的实战设计指南,重点解析了从整流滤波电路到PCB布局的关键细节与常见陷阱。文章深入探讨了输入保护元件协同设计、EMI滤波器优化、整流桥与滤波电容选型,并详细阐述了如何通过优化PCB布局来确保安规、最小化功率回路面积以控制噪声,旨在帮助工程师和爱好者规避设计误区,提升电源的可靠性与性能。

yhn45678901的博客 692

别怕,“卷积”其实很简单

首先给大家讲一个关于卷积的小故事:小明是杭州某互联网大厂的员工,每天996十分辛苦,但小明最近爱上了打台球,经常不在工位。这天,小明的主管让小明改一个需求,小明却到楼下找产品部小丽打台球去了,被主管发现,他非常气愤,扇了小明一巴掌(注意,这就是输入信号,脉冲)。于是小明脸上会渐渐地(贱贱地)鼓起来一个包,小明的脸就是一个系统,而鼓起来的包就是小明的脸对巴掌的响应。好,这样就和信号系统建立起来意义对应的联系。

Machine Learning with Tutors 3184

基于深度学习的火焰检测系统:YOLOv8 + UI界面 + 数据集详解

YOLO(You Only Look Once)是一种端到端的目标检测算法,其最大优势在于将目标检测任务转化为一个回归问题,可以在一次前向传播中同时完成目标定位和分类。YOLOv8是YOLO系列中的最新版本,相比之前的版本,YOLOv8在精度和推理速度上都做了显著提升,特别是在小物体检测方面表现更加优秀。实时性:YOLOv8具有较高的推理速度,适用于实时火焰检测。高精度:相较于YOLOv7,YOLOv8在精度和小物体检测上有所改进。简单易用:YOLOv8的API简单直观,易于集成和使用。

YOLO 660

YOLOv10改进策略【注意力机制篇】| 2024 蒙特卡罗注意力(MCAttn)模块,提高小目标的关注度

本文记录的是基于蒙特卡罗注意力(MCAttn)模块的YOLOv10目标检测改进方法研究。利用提高的跨尺度特征提取能力,使模型能够更好地传递和融合提取的多尺度特征,提高对小目标的关注度。Exploiting Scale-Variant Attention for Segmenting Small Medical Objects使用一种基于随机采样的池化操作来生成尺度无关的注意力图。它从三个不同尺度(3×33×33×3、2×22×22×2和1×11×11×1,即池化张量)中随机选择一个1×11×11×1注意力图

Limiiiing的博客 2189

某头部金融APP防护机制逆向实录:从反调试到TEE加密的全链路攻防拆解

金融APP安全防护体系深度破解分析 本文详细拆解了某头部金融APP的三重防御机制破解过程。首先通过Frida绕过反调试技术,包括ptrace自我绑定、TracerPid检测和debuggerd监控;随后针对12种Root检测方法(如su文件检查、Magisk检测等)进行环境伪装,通过Hook系统调用伪造安全环境;最后逆向分析TEE加密模块,解密关键接口参数。整个破解过程涉及静态分析、动态调试和代码注入技术,揭示了金融级APP安全防护的实现原理与突破方法(注:所有操作均获授权,仅用于安全研究)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1400

【首发独家】华为OD机试 - 服务中心选址、服务中心的最佳位置(C 语言解题)

最近更新的博客 华为 od 2023 | 什么是华为 od,od 薪资待遇,od 机试题清单 华为 OD 机试真题大全,用 Python 解华为机试题 | 机试宝典 【华为 OD 机试】全流程解析+经验分享,题型分享,防作弊指南 华为 od 机试,独家整理 已参加机试人员的实战技巧 本篇华为 OD 机试题解:服务中心选址、服务中心的最佳位置

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

FANUC机器人_CRX协作机器人的开机和示教器的初始化设置基本步骤(二)

FANUC机器人_CRX协作机器人的开机和示教器的初始化设置基本步骤

Robot_PLC_HMI_Automation 2733

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 第一章 引言与领域概览
下一篇: 第三章 — 多模态融合范式与固有局限
VectorShift
博客等级 码龄1年 1839粉丝 1109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VectorShift

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值