引言

注意力是人类认知的核心,它决定了我们如何处理海量感官信息、分配有限的心理资源。从驾驶时对路况的监控,到阅读时对文字的聚焦,注意力无处不在。然而,如何用数学模型捕捉注意力的动态特性?如何让计算机“看见”注意力的分布?本文介绍了一个完整的C++项目,基于认知心理学理论(特征整合理论、引导搜索模型、偏置竞争模型等),构建了一个包含超过30个变量的人脑注意力数学模型,并使用OpenCV实现了实时可视化。

本项目不仅是对注意力理论的编程实践,更是一个可交互的研究平台。你可以调整认知负荷、疲劳水平、任务目标,观察注意力焦点的变化,探索在不同条件下人脑如何分配注意资源。代码完整、注释详尽,适合对计算机视觉、认知建模感兴趣的开发者深入研究。

1. 理论基础与变量体系

1.1 注意力建模的理论依据

  • 特征整合理论(Treisman & Gelade, 1980):注意首先并行提取颜色、方向等基本特征,然后通过聚焦注意将特征整合为对象。

  • 引导搜索模型(Wolfe, 1994):自下而上的显著性(刺激驱动)和自上而下的目标导向共同引导注意。

  • 偏置竞争模型(Desimone & Duncan, 1995):多个刺激在神经表征中竞争,注意通过增强目标、抑制干扰来偏置竞争。

  • 空间注意资源池理论:注意资源分布在视野中,焦点处资源多,外围逐渐衰减。

基于这些理论,我们设计了以下变量体系:

1.2 变量分类(共34个核心变量)

类别 变量名 含义
空间注意力 spatial_attention_map_ 空间注意分布图(二维浮点矩阵)
attention_focus_ 注意焦点坐标
attention_radius_ 注意广度(半径)
spatial_resource_distribution_ 空间资源分布(受疲劳、警觉影响)
特征权重 color_weight[3] RGB三通道颜色特征的权重
orientation_weight[8] 8个方向(0°,45°,…,315°)的权重
motion_weight 运动特征的权重
shape_weight 形状特征的权重
texture_weight 纹理特征的权重
时间动态 attention_oscillation_freq_ 注意振荡频率(模拟α波)
attention_pulse_phase_ 注意脉冲相位
attention_dwell_time_ 注意驻留时间
attention_shift_speed_ 注意转移速度
temporal_modulation_map_ 时间调制图(按相位增强/抑制)
任务相关 task_goal_template_ 任务目标模板(空间优先图)
task_target_region_ 任务目标区域
task_priority_ 任务优先级
expected_position_bias_ 预期位置偏差(如中心偏好)
memory_template_strength_ 记忆模板强度
认知控制 executive_control_strength_ 执行控制强度
distractor_inhibition_ 分心抑制能力
working_memory_load_ 工作记忆负载
total_cognitive_resources_ 总认知资源
current_resource_allocation_ 当前资源分配
生理状态 alertness_level_ 警觉水平
fatigue_level_ 疲劳程度
emotional_valence_ 情绪效价
arousal_level_ 唤醒水平
circadian_rhythm_factor_ 昼夜节律因子
环境输入 stimulus_saliency_ 刺激显著性图
stimulus_novelty_ 刺激新奇性
stimulus_consistency_ 刺激一致性
stimulus_complexity_ 刺激复杂性
综合变量 integrated_attention_map_ 最终整合的注意力图
competition_bias_map_ 竞争偏置图(侧抑制)
top_down_influence_ 自上而下影响系数
bottom_up_influence_ 自下而上影响系数
competitive_interaction_strength_ 竞争交互强度

注:实际实现中部分变量为派生变量或中间变量,总数超过30。

2. 系统架构与设计

2.1 整体框架

项目采用经典的面向对象设计,核心类为 AttentionModel,负责所有变量的维护和更新逻辑。AttentionVisualizer 类负责可视化交互和场景生成。主循环中,每一帧输入图像经过模型更新,输出注意力热图、显著性图、特征权重图等,并在多个窗口中显示。

2.2 类结构

  • AttentionModel.hpp/cpp:模型核心,包含所有变量声明和算法实现。

  • main.cpp:包含 AttentionVisualizer 类和主函数,处理用户交互、实时显示。

2.3 核心算法流程

每一帧的处理流程如下:

输入图像 → 特征提取(颜色、方向、运动、强度、纹理) → 计算自下而上显著性
       → 计算自上而下调制(任务目标、预期位置、空间资源)
       → 更新时间动态(振荡相位、新奇性衰减)
       → 更新生理状态(疲劳积累、昼夜节律)
       → 应用竞争交互(侧抑制)
       → 整合所有映射 → 归一化 → 更新注意焦点
       → 可视化输出

3. 核心代码实现详解

3.1 特征提取与显著性计算

颜色特征

使用Lab颜色空间,提取a通道(红绿对立)、b通道(蓝黄对立)和色彩鲜明度。这模拟了视觉皮层对颜色对立的编码。

cv::Mat AttentionModel::extractColorFeatures(const cv::Mat& frame) const {
    cv::Mat lab;
    cv::cvtColor(frame, lab, cv::COLOR_BGR2Lab);
    std::vector<cv::Mat> channels(3);
    cv::split(lab, channels);
    
    cv::Mat color_features(frame_height_, frame_width_, CV_32FC3);
    for (int y = 0; y < frame_height_; ++y) {
        for (int x = 0; x < frame_width_; ++x) {
            cv::Vec3f& feat = color_features.at<cv::Vec3f>(y, x);
            feat[0] = channels[1].at<uchar>(y, x) / 255.0f;
            feat[1] = channels[2].at<uchar>(y, x) / 255.0f;
            feat[2] = std::abs(channels[1].at<uchar>(y, x) - 128) / 128.0f;
        }
    }
    return color_features;
}
方向特征

通过Sobel算子计算梯度幅值和方向,将方向量化到8个bin,实现方向选择性响应。

cv::Mat AttentionModel::extractOrientationFeatures(const cv::Mat& frame) const {
    // ... 计算梯度幅值和角度
    cv::Mat orientation_features(frame_height_, frame_width_, CV_32FC(8));
    // 对每个像素,根据角度分配到相邻两个方向
    return orientation_features;
}
运动特征

利用Farneback光流法计算两帧之间的光流幅值,作为运动显著性。

cv::Mat AttentionModel::extractMotionFeatures(const cv::Mat& current_frame,
                                            const cv::Mat& previous_frame) const {
    cv::Mat flow;
    cv::calcOpticalFlowFarneback(prev_gray, curr_gray, flow, 0.5, 3, 15, 3, 5, 1.2, 0);
    // 计算光流幅值并归一化
    return motion_magnitude;
}
自下而上显著性融合

将各种特征图按权重加权求和,并加入新奇性和复杂性调制。

void AttentionModel::computeBottomUpSaliency(const cv::Mat& frame) {
    // 提取颜色、方向、运动、强度、纹理显著性
    // 加权融合
    stimulus_saliency_.at<float>(y, x) = 
        color_val * 0.3f + orientation_val * 0.25f + 
        motion_val * feature_weights_.motion_weight * 0.2f +
        intensity_val * 0.15f + texture_val * 0.1f;
    // 加入新奇性、复杂性调制
}

3.2 自上而下调制

任务目标模板

如果设置了任务目标区域,生成以目标为中心的高斯分布,权重受执行控制强度影响。

void AttentionModel::computeTopDownModulation() {
    if (task_priority_ > 0 && task_target_region_.area() > 0) {
        cv::Point center = (task_target_region_.tl() + task_target_region_.br()) / 2;
        cv::circle(task_map, center, 
                   static_cast<int>(attention_radius_ * task_priority_), 1.0f, -1);
        cv::GaussianBlur(task_map, task_goal_template_, cv::Size(31, 31), 15.0);
    }
    // 预期位置偏差(中心偏好)
}
空间资源分布

根据疲劳、警觉性和注意焦点,生成空间资源分布图(焦点处资源多,外围衰减)。

3.3 时间动态与生理状态

  • 注意振荡:以8Hz的频率调制全局注意力,模拟α节律。

  • 新奇性衰减:刺激新奇性随时间指数衰减。

  • 疲劳积累:随时间增加疲劳,降低警觉性。

  • 昼夜节律:模拟一天中的警觉波动。

void AttentionModel::updateTemporalDynamics(float delta_time) {
    attention_pulse_phase_ += attention_oscillation_freq_ * delta_time * 2 * CV_PI;
    temporal_modulation_ = 0.5f + 0.5f * sin(attention_pulse_phase_);
    stimulus_novelty_ *= exp(-delta_time * 0.5f);
}

void AttentionModel::updatePhysiologicalState(float delta_time) {
    fatigue_level_ += delta_time * 0.001f;
    alertness_level_ = circadian_rhythm_factor_ * (1.0f - fatigue_level_);
    // ... 
}

3.4 竞争交互与整合

  • 侧抑制:通过高斯模糊计算局部邻域的平均显著性,从原图中减去,模拟神经元间的抑制。

  • 整合:将自下而上显著性、任务目标、预期偏差、时间调制、竞争偏置按各自影响因子加权求和,并乘以空间资源分布。

void AttentionModel::integrateAttentionMaps() {
    integrated_attention_map_ = 
        stimulus_saliency_ * bottom_up_influence_ * arousal_level_ +
        task_goal_template_ * top_down_influence_ * executive_control_strength_ +
        expected_position_bias_ * 0.1f +
        temporal_modulation_map_ * 0.2f +
        competition_bias_map_ * competitive_interaction_strength_;
    // 应用空间资源分布
    integrated_attention_map_ = integrated_attention_map_.mul(spatial_resource_distribution_);
    // 添加噪声
}

3.5 可视化与交互

AttentionVisualizer 类生成包含多个动态物体的测试场景,并在四个窗口中显示:

  • Input Scene:原始场景,叠加注意焦点(白色圆圈)。

  • Attention Model:整合注意力热图(JET颜色映射)。

  • Saliency Map:自下而上显著性热图(HOT颜色映射)。

  • Feature Weights:显示当前特征权重和生理状态的条形图。

控制面板(OpenCV滑动条)允许实时调整认知负荷、疲劳水平、唤醒水平,直观观察模型变化。

4. 编译与运行

4.1 环境要求

  • C++17编译器(gcc/clang/msvc)

  • OpenCV 4.x(需包含contrib模块,用于光流)

  • CMake 3.10+

4.2 CMakeLists.txt 关键配置

find_package(OpenCV REQUIRED)
add_executable(AttentionSimulation main.cpp AttentionModel.cpp)
target_link_libraries(AttentionSimulation ${OpenCV_LIBS})

4.3 构建步骤

mkdir build && cd build
cmake ..
make -j4
./AttentionSimulation

4.4 运行效果

程序启动后,你将看到四个窗口和一个控制面板。红色方块在移动,绿色方块静止,蓝色纹理区域提供复杂刺激,黄色框为任务目标。注意焦点(白色圆圈)会随着刺激和任务变化而移动。你可以拖动控制面板的滑动条,观察注意力图的变化。


第一张:输入场景(带注意焦点);第二张:注意力热图(红色为高注意区域);第三张:特征权重与控制面板。

5. 结果分析与讨论

5.1 观察现象

  • 自下而上驱动:当红色方块快速运动时,显著性图在方块位置出现高亮,注意力被吸引过去。

  • 自上而下驱动:当设置任务目标(黄色框)且任务优先级高时,即使黄色框区域没有高显著性,注意力也会偏向该区域。

  • 疲劳影响:将疲劳水平调高,注意力的空间分布变得弥散,焦点抖动加剧。

  • 认知负荷:增加认知负荷,执行控制强度下降,任务目标的影响减弱。

5.2 模型意义

该模型将多种认知理论统一在一个计算框架内,能够模拟注意力在多种因素下的动态变化。对于人机交互、自动驾驶、注意力缺陷研究等领域,这种模型可以作为预测人眼注视点的参考。

5.3 局限性与改进方向

  • 简化假设:当前模型对视觉特征的提取较为基础,可引入深度神经网络特征(如VGG)提升显著性准确性。

  • 缺乏学习机制:记忆模板固定,可加入强化学习,使模型能根据任务经验调整权重。

  • 实时性优化:光流计算较慢,可改用更快的运动估计算法。

  • 更多生理参数:如心率、瞳孔直径等可进一步整合。

6. 总结

本文详细介绍了基于30+变量的人脑注意力数学模型的C++实现,涵盖了从理论到代码的完整过程。通过OpenCV可视化,我们能够直观地观察注意力在各种因素作用下的动态分布。这个项目不仅是一个学习认知建模的绝佳示例,也为未来的智能系统提供了生物启发的注意力机制参考。


作者信息本文由佳木逢钺原创,发布于CSDN博客。欢迎交流讨论,转载请注明出处。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐