本节摘要:感知与输入是智能体的「眼睛和耳朵」,是一切行动的信息入口。本节拆解感知系统的四个组成部分——传感器、数据预处理、特征提取、输入表示,并沿图像、文本、音频三条链路各走一遍完整处理流程(OpenCV+ResNet、NLTK+Word2Vec、Librosa+MFCC),最后讨论多模态融合、实时性、隐私等挑战。
阅读完本节,你应当能够:
设想一个无人驾驶系统:摄像头拍到了路牌,但它「看见」的只是一堆像素矩阵。要让系统真正「知道」前方是限速标志,需要把像素变成特征、把特征变成语义、把语义交给决策。感知模块干的就是这条链路。SOURCE 原文打了个比方:感知与输入是智能体的眼睛和耳朵,是智能体与环境交互的桥梁,也是智能水平高低的关键决定因素之一。
为什么感知这么要紧?因为它的输出直接决定决策质量。感知给的是脏数据,后面的推理、规划、行动全跟着错。经典的「garbage in, garbage out」在智能体上体现得尤其彻底——感知错误会沿着整个闭环放大。反过来,感知质量上去了,即使决策算法朴素一点,整体表现也可能不错。这就是为什么这两年大家反复强调「多模态感知」——单一的视觉或文本,对复杂环境的理解始终有天花板。
这四个部分不是独立流水线,而是有反馈的关系。比如「输入表示」选得好,会反过来降低「特征提取」的压力——用词向量表示文本,就省去了手工构造语法树的工作。再比如「数据增强」不只是预处理技巧,它在数据不足时直接决定感知模型的泛化能力。设计感知系统时,常见顺序是:先定「输入表示」要什么形式,再倒推「特征提取」该用深度还是手工,最后选传感器和预处理手段——表示决定下游,越早定越好。
SOURCE 原文用 OpenCV + 预训练 ResNet50 走了一遍图像感知:
import cv2 import numpy as np from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input img = cv2.imread('image.jpg') # 采集 img = cv2.resize(img, (224, 224)) # 预处理:缩放 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 预处理:BGR→RGB img = np.expand_dims(np.array(img), axis=0) # 预处理:加 batch 维 img = preprocess_input(img) # 预处理:归一化 model = ResNet50(weights='imagenet', include_top=False, pooling='avg') features = model.predict(img).flatten() # 特征提取 + 向量表示
这条链路的工程要点都在注释里:缩放对齐模型输入尺寸(224×224);BGR 转 RGB 因为预训练模型在 RGB 上训练;加 batch 维是因为模型按批量处理;include_top=False 丢掉分类层只留特征表示;pooling='avg' 把卷积输出平均池化成固定长度向量。每一步的错误都会在下一环节放大——比如忘记颜色空间转换,识别精度立刻崩。
为什么用预训练模型而不是自己训?答案在数据量和成本。ImageNet 上训一个 ResNet50 需要数百万张图和多块 GPU 跑数天;而 weights='imagenet' 一行代码就把学好的特征搬过来。这种「迁移」思维是感知工程的核心效率杠杆——你的任务通常只需要在通用特征之上做一层微调。SOURCE 里 preprocess_input 与模型权重配套,这也提醒我们:预训练模型自带「输入规矩」,换库换模型时预处理逻辑要跟着换,不能张冠李戴。
特征向量拿来做相似度比较也是常见用途。两个图像各自抽成向量,算余弦相似度,就能判断「像不像」——这是图像检索、重复检测、姿态估计下游任务的地基。SOURCE 强调「向量维度较高,一般不直接打印内容」,意思是特征向量是机器之间交流的语言,人类看不看都行,重要的是它在向量空间里的位置关系。
感知输出的形式决定了后续决策模块的接法。向量表示直接进神经网络决策器;图表示进图神经网络或符号推理;序列表示进 RNN/Transformer;多模态表示要设计专门的融合层。SOURCE 原文用一句话点透:感知结果被传递给智能体的其他模块进行后续处理——它画的那张感知流程图(环境→传感器→采集→预处理→特征→情境理解→感知结果→智能体内部)里,最后一环是「智能体内部」,意思就是感知到决策之间还有一段「情境理解」的过渡:把特征和上下文信息结合,判断「当前环境状态是什么、意味着什么」。这一段衔接在 2.2 节知识表示与推理里会正式展开,这里先留个接口——感知的职责是「把物理信号变成可计算的语义」,至于「语义之后怎么用」,是后面几节的事。
import nltk from nltk.corpus import stopwords from nltk.tokenize import word_tokenize import gensim.downloader as api text = "This is an example sentence for text perception." tokens = word_tokenize(text.lower()) # 预处理:小写+分词 stop_words = set(stopwords.words('english')) # 预处理:停用词 filtered = [w for w in tokens if w not in stop_words and w.isalnum()] model = api.load('word2vec-google-news-300') # 特征:预训练词向量 vecs = [model[w] if w in model else np.zeros(model.vector_size) for w in filtered] text_vec = np.mean(vecs, axis=0) # 表示:向量平均
词不在词汇表时用零向量兜底、最后取平均——这是「把所有词压成一个固定长度向量」的最简做法。真实系统会换成 RNN/Transformer 做上下文编码,但「分词→去停用词→向量化→池化」的四步骨架不变。
这条链路里最容易忽略的细节是「为什么先小写再去停用词」——顺序是有讲究的。先小写统一形态,再分词,再去停用词(the、a、is 这类高频但无实义的词),最后过滤掉非字母数字字符。顺序反了会出现「The」和「the」被当成两个词、标点干扰分词的问题。word2vec-google-news-300 这个模型名里藏着两个信息:训练语料是 Google News(领域匹配很重要,新闻里的词义和医学文本里的词义不一样),维度是 300(词向量维度是超参数,太大过拟合、太小信息不足)。换领域时,直接复用新闻语料的词向量可能效果不佳——这和图像里「预训练权重要匹配领域」是同一个道理。
import librosa y, sr = librosa.load('audio.wav') # 采集:波形+采样率 mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=20) # 特征:梅尔频率倒谱系数 audio_features = mfccs # 表示:特征矩阵直接使用
MFCC 是音频信号处理最经典的特征,n_mfcc=20 表示取 20 维系数。它把「每一帧的声音长什么样」压缩成一组系数,语音识别、声纹识别都离不开它。
| 模态 | 常用库 | 关键特征 | 典型任务 |
|---|---|---|---|
| 图像 | OpenCV, TensorFlow/PyTorch | ResNet 特征、Canny 边缘 | 物体识别、场景理解 |
| 文本 | NLTK, spaCy, gensim | 词向量、TF-IDF | 意图识别、情感分析 |
| 音频 | Librosa, 深度学习框架 | MFCC | 语音识别、声源定位 |
| 多模态 | Transformer 家族 | 跨模态融合向量 | 视频理解、人机交互 |
实际项目的选择原则是「先保采集质量,再谈特征」。传感器分辨率低、噪声大,再好的特征工程也救不回来;传感器数据干净,朴素特征也可能够用。预训练模型的取舍也很关键:weights='imagenet' 的 ResNet 直接可用,省训练成本,但领域差异大(比如医学影像)时需要微调。SOURCE 里 cv2.Canny(gray_img, 100, 200) 的边缘检测用阈值 100/200,这类超参数在不同光照下要重新调——没有「一次调好到处用」的万能参数。
⚠️ 常见坑:把原始数据直接喂模型,跳过归一化。图像不归一化、文本不做小写和去停用词,模型训练不稳定、推理结果波动大。SOURCE 的三个示例无一例外都做了预处理——这是有意为之的示范。
💡 关键直觉:感知链路的四个环节本质是「从物理信号到语义的逐级抽象」。能理解每一步在「抽象什么」,就能迁移到任何新模态——新传感器无非是「采集→清洗→提特征→换表示」的重演。
SOURCE 明确列出了感知面临的挑战:噪声与不确定性(图像模糊、音频失真、文本歧义)、多模态融合(怎么利用模态互补性)、实时性与效率(自动驾驶/机器人必须低延迟)、泛化与适应(未知环境也要能用)、隐私与安全(摄像头、麦克风采集涉个人数据)。
对应的趋势:更强的传感器(更高分辨率、更低功耗)、深度学习驱动(更深网络、更强预训练)、自监督/无监督学习(降低对标注数据的依赖)、神经符号结合(感知+推理)、边缘计算与分布式感知(降延迟、护隐私)。这些趋势会在第 5、6 章反复出现——比如对话系统的多模态感知(5.3 节)、具身智能的感知-行动循环(6.2 节)。感知不是独立模块,它的每一次进步都会传导到整个智能体链条。
做工程时建议把「感知质量评估」当一道独立工序来做:不只看最终任务指标,还要单独验证感知输出的质量(识别准确率、特征区分度、表示稳定性)。很多智能体「决策看起来笨」,根因其实在感知——决策算法再好,喂进来的特征是错的也白搭。把感知和决策分开评测,问题定位会快得多。
感知拿到了「环境是什么」,下一节看智能体怎么把感知结果存成知识、并从中推出新结论。