news 2026/5/27 22:41:02

基于FPGA与模糊逻辑的扁桃体炎自动监测系统硬件实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于FPGA与模糊逻辑的扁桃体炎自动监测系统硬件实现

1. 项目概述:当FPGA遇上医疗诊断

在医疗电子领域,尤其是面向基层和家庭的便携式诊断设备,一直存在一个核心矛盾:复杂的图像处理算法需要强大的计算力,而设备的便携性、实时性和低功耗要求又限制了传统通用处理器(如CPU)的发挥。你可能会想,用高性能GPU行不行?当然可以,但那功耗和成本,对于需要电池供电、可能每天要筛查上百名学生的校园医务室设备来说,就有点“杀鸡用牛刀”了。这正是FPGA(现场可编程门阵列)大显身手的地方。

我这次要聊的,就是一个非常具体的实战项目:基于FPGA与模糊逻辑的扁桃体炎自动监测系统。简单说,就是做一个能“看嗓子”、自动判断扁桃体健康状况的智能硬件。扁桃体炎大家都不陌生,尤其是儿童,反复发作很常见。传统诊断依赖医生目视检查,主观性强,且难以量化记录病情变化。我们这个系统的目标,就是通过摄像头采集咽喉部图像,用硬件电路实时分析扁桃体的大小和颜色(红肿程度),自动判断其处于“正常”、“早期炎症”还是“严重炎症”阶段,为医生提供客观、可追溯的辅助诊断依据,也适合家庭日常监测。

为什么非得用FPGA?核心就两点:确定的实时性极致的能效比。软件方案在电脑上跑当然灵活,但涉及到图像预处理、特征提取、分类决策这一连串操作,帧率很难保证,更别提做成一个巴掌大的便携设备了。FPGA允许我们将整个图像处理流水线“雕刻”成专用的硬件电路,每一个步骤(像素读取、滤波、边缘检测、面积计算)都对应着物理电路模块,可以并行执行。比如,当电路在处理第N行像素的绿色通道时,第N+1行像素的读取和第N-1行像素的红色强度累加可以同时进行,这种硬件级的并行是软件顺序执行无法比拟的,从而确保了从“拍照”到“出结果”的延迟是稳定且极短的。

整个系统的技术栈非常清晰:前端是一个小型CMOS摄像头模组,中间是FPGA作为核心处理单元,后端可能连接一个小型显示屏或通过蓝牙将结果发送到手机。FPGA内部,我们用VHDL这类硬件描述语言,构建三条核心流水线:图像预处理流水线、特征提取流水线以及模糊逻辑决策流水线。最终,我们在一片中等规模的FPGA芯片上,实现了对159个临床样本图像高达91.8%的识别准确率,而功耗仅需约5瓦。下面,我就把这套从算法选型到硬件实现,再到调试验证的完整过程拆解开来,其中有不少从论文到原型机落地中踩过的坑和总结的经验。

2. 核心设计思路:从软件算法到硬件架构的映射

把一套图像识别算法塞进FPGA,绝不是写个C代码然后点一下“编译为硬件”那么简单。它本质上是一个硬件架构设计问题,需要我们从算法中提炼出最适合硬件实现的并行性、流水线和数据流模型。

2.1 算法原理:为什么是“颜色”和“大小”?

在深入电路设计之前,必须吃透软件算法的医学依据和数学本质。扁桃体炎的典型视觉特征有两个:红肿(颜色变化)肿大(面积变化)。医学研究表明,炎症会导致局部毛细血管扩张,血流量增加,这在图像上主要表现为红色通道(R)值升高,而绿色通道(G)值相对降低(因为血红蛋白对绿光吸收较强)。同时,组织水肿会导致扁桃体体积增大,在二维图像上表现为投影面积增大。

因此,我们的核心特征向量极其简洁:[扁桃体区域像素总数, 扁桃体区域平均红色强度]。这避免了使用SIFT、HOG等计算复杂的特征,非常适合硬件实现。分类器选择了模糊逻辑,而不是神经网络或SVM。这里有个关键考量:医疗诊断需要一定的可解释性。模糊逻辑的规则(例如:“如果面积较大且颜色很红,则炎症严重”)更接近医生的思维过程,便于理解和验证。而神经网络更像一个黑盒,在资源有限的嵌入式设备上,其庞大的乘加运算量和参数存储也是负担。

模糊逻辑的输入是归一化后的面积和红色强度。我们需要定义三个模糊集合:正常(N)、早期(E)、严重(L),并为每个集合设计三角形或梯形的隶属度函数。例如,“面积较大”这个模糊概念,其隶属度函数可能从某个阈值开始线性上升至1。决策时,系统同时激活多条规则(如“面积属于E且颜色属于N”),对每条规则取前提条件的隶属度最小值作为该规则的火力,最后对所有被激活的规则结论进行“去模糊化”(常用重心法),得到一个精确的输出值,落在哪个区间就判定为哪个阶段。

2.2 硬件化挑战与架构选型

知道了“算什么”,接下来是关键的一步:“怎么在硬件里高效地算”。图像处理是典型的数据流应用,每个像素都要经历相似的运算。硬件架构的核心目标是最大化数据吞吐率,同时最小化存储访问和逻辑资源

我们放弃了在CPU/GPU上常见的“全图逐像素扫描”的串行思路。假设一帧图像为640x480,串行扫描需要处理30多万个像素,耗时太长。我们采用了“分块并行+窗口流水”的混合架构。

  1. 分块并行:将一帧图像在空间上划分为多个矩形块(例如3x3共9块)。为每一块分配独立的处理电路(预处理、特征提取)。这样,9块可以同时开始计算,理想情况下将处理时间缩短为原来的1/9。这是空间上的并行。
  2. 窗口流水:在每个块内部,我们采用滑动窗口操作(例如3x3窗口进行中值滤波或边缘检测)。这里采用流水线技术:当窗口滑动到下一个位置时,当前窗口的9个像素数据已经进入流水线的不同阶段(比如第一阶段读数据,第二阶段计算梯度,第三阶段判断边缘)。这样,虽然处理一个窗口需要多个时钟周期,但每个时钟周期都能完成一个窗口的输出,实现了时间上的并行。

这种架构的代价是需要更多的硬件资源(9套处理电路)和更复杂的片上存储管理(需要多个行缓冲器),但换来了近乎实时的处理速度。FPGA的可编程特性让我们能精准地定制这套并行流水线,这是用固定架构的ASIC或通用处理器难以灵活实现的。

2.3 系统级数据流设计

整个系统的数据流如同一条精心设计的工厂流水线:

  1. 图像采集与缓存:摄像头通过并口或MIPI接口将原始RGB数据写入外部DDR或片内高速RAM。这一步要考虑数据带宽匹配,如果摄像头输出是60帧/秒的1080p数据,那么接口和存储的带宽必须跟上,否则就会丢帧。
  2. 预处理流水线:从内存中读取的图像数据首先进入预处理模块。这里通常包含一个绿色通道提取(因为论文中发现绿色通道对扁桃体边界最敏感),接着是一个噪声滤波模块(如3x3中值滤波器或高斯滤波器)。滤波器的硬件实现通常采用移位寄存器构建行缓冲,配合加法器树来实现卷积运算。
  3. 扁桃体分割与特征提取流水线:这是最核心的部分。预处理后的图像(可能是灰度图)进入分割模块。我们采用了全局阈值粗分割+局部梯度精修的策略。硬件上,先用一个比较器进行全局二值化,初步找出疑似扁桃体区域。然后,在这个区域内部,通过Sobel算子等硬件电路计算梯度,利用梯度幅值的局部极大值来精确定位边界。边界��定后,特征提取就简单了:一个计数器累加边界内的像素数得到面积;一个累加器将边界内所有像素的红色通道值加起来,最后除以面积得到平均红色强度。
  4. 模糊决策流水线:提取出的面积和红色强度值,经过归一化后,送入模糊推理机。硬件实现模糊推理机通常包含几个部分:隶属度函数计算器(用查找表LUT或分段线性电路实现)、规则评估器(求最小值电路)、以及去模糊化单元(计算加权的重心)。这一切都可以用定点数运算和组合逻辑电路实现,在一个时钟周期内就能完成推理。
  5. 结果输出:最终的诊断结果(正常/早期/严重)可以显示在屏上,或通过UART/SPI接口发送给上位机。

3. 关键模块的硬件实现细节与VHDL编码心得

理论架构清晰后,就要动手用VHDL/Verilog把它“造”出来了。这里我分享几个关键模块的实现细节和编码时踩过的坑。

3.1 图像缓存与行缓冲器设计

图像处理离不开缓存。使用外部DDR内存延迟大,所以对于滑动窗口操作,必须在FPGA内部用BRAM构建行缓冲器。对于一个3x3的窗口,我们需要缓存两行图像数据,加上当前正在输入的一行。

-- 一个简单的3行行缓冲器VHDL结构示例 type line_buffer_type is array (0 to IMAGE_WIDTH-1) of std_logic_vector(7 downto 0); signal line_buffer_0, line_buffer_1, line_buffer_2 : line_buffer_type; signal wr_idx : integer range 0 to IMAGE_WIDTH-1; process(clk) begin if rising_edge(clk) then -- 数据流入 line_buffer_2(wr_idx) <= pixel_in; -- 最新一行 line_buffer_1(wr_idx) <= line_buffer_2(wr_idx); -- 前一行 line_buffer_0(wr_idx) <= line_buffer_1(wr_idx); -- 前两行 -- 同时,可以形成一个3x3窗口 window(0,0) <= line_buffer_0(wr_idx-1); window(0,1) <= line_buffer_0(wr_idx); window(0,2) <= line_buffer_0(wr_idx+1); window(1,0) <= line_buffer_1(wr_idx-1); window(1,1) <= line_buffer_1(wr_idx); window(1,2) <= line_buffer_1(wr_idx+1); window(2,0) <= line_buffer_2(wr_idx-1); window(2,1) <= line_buffer_2(wr_idx); window(2,2) <= line_buffer_2(wr_idx+1); wr_idx <= wr_idx + 1; end if; end process;

注意:处理图像边界时,窗口会越界。常见的处理方法是镜像填充或补零。在硬件中,我们通常通过控制读写地址的逻辑,在边界处将越界的窗口像素赋值为0或相邻像素的值。这部分逻辑如果不小心,会消耗大量资源或引入延迟。

3.2 梯度计算与边界检测的硬件优化

Sobel算子需要计算x和y方向的梯度:Gx = (z7+2*z8+z9) - (z1+2*z2+z3)Gy = (z3+2*z6+z9) - (z1+2*z4+z7),然后求G = sqrt(Gx^2 + Gy^2)。平方和开方在硬件中非常昂贵。

优化技巧1:用绝对值近似。在实际边缘检测中,我们往往只关心梯度幅值是否超过一个阈值。因此,完全可以用|Gx| + |Gy|来近似sqrt(Gx^2 + Gy^2)。这省去了乘法器和开方器,只用加法和比较器即可。

优化技巧2:流水线化计算。将Gx和Gy的计算拆分成多级流水。第一级计算窗口像素的加权和(z1+2*z2+z3等),这可以通过移位相加实现(2*z2就是z2左移一位)。第二级执行减法得到Gx和Gy。第三级计算绝对值并相加。这样,虽然从输入到输出有3个时钟周期的延迟,但吞吐率是每个时钟周期一个结果。

3.3 模糊推理机的定点数实现

模糊逻辑的输入(面积、颜色)需要归一化到[0, 1]之间。在硬件中,我们使用定点数表示,比如Q8.8格式(8位整数,8位小数)。这比浮点数节省大量资源。

隶属度函数通常用查找表实现。例如,对于“面积-早期(E)”这个三角形隶属度函数,我们可以预先计算好输入值(0-255对应0.0-1.0)对应的隶属度(0-255),存储在FPGA的ROM中。规则评估中的“取小”操作,就是一个简单的比较器。去模糊化中的重心计算COG = Σ(μ_i * x_i) / Σμ_i,需要乘法和累加。这里可以用一个专用的乘累加单元,或者如果速度要求不高,用状态机分多个周期完成。

一个重要的取舍:Mamdani vs. Sugeno。论文中对比了两种模糊模型。Mamdani模型输出是模糊集合,需要计算重心,精度高但计算量大。Sugeno模型(通常是零阶或一阶)的输出是输入值的线性函数或常数,去模糊化就是加权平均,计算非常简单。在我们的项目中,实测Mamdani精度略高(96.4% vs 95.5%),但Sugeno在资源利用和功耗上优势明显(逻辑门少约5%,功耗低约5%)。对于资源紧张的FPGA,Sugeno是更务实的选择。

3.4 资源评估与时序约束

在写代码之前和之后,资源评估至关重要。你需要明确:

  • 逻辑资源:你的设计需要多少查找表、寄存器?这决定了需要什么型号的FPGA(如Xilinx Artix-7系列或Intel Cyclone V系列)。
  • 存储资源:需要多少Block RAM来存储图像行、查找表、中间结果?
  • DSP资源:如果有大量的乘法(如滤波、去模糊化),需要用到FPGA内置的DSP Slice,它的数量和性能是瓶颈。

编写完VHDL后,必须进行时序约束,告诉综合工具你的时钟频率要求(例如100MHz)。工具会进行静态时序分析,报告是否存在建立时间或保持时间违例。常见的性能瓶颈在行缓冲器的访问、长路径的组合逻辑(如大的加法器链)。解决方法包括插入寄存器进行流水线切割、重新平衡组合逻辑等。

4. 系统集成、测试与性能调优

当所有模块都通过仿真验证后,就可以进行系统集成了。这不仅仅是把各个模块连起来,更涉及到数据同步、控制流、与外部设备的交互等系统级问题。

4.1 系统集成与数据同步

我们的系统有几个时钟域:摄像头像素时钟、FPGA内部处理时钟、输出显示时钟。如果时钟不同源,就需要使用异步FIFO来进行安全的数据跨时钟域传输。这是很多项目出bug的重灾区,亚稳态会导致图像错乱或数据丢失。

控制流需要一个顶层状态机来协调:上电初始化 -> 等待摄像头帧同步信号 -> 启动图像数据接收并写入内存 -> 触发预处理模块 -> 特征提取模块自动从内存读取数据 -> 完成后触发模糊决策 -> 输出结果。状态机要设计得健壮,处理好各种异常情况,比如一帧图像没传完就断了怎么办。

4.2 测试平台的构建:软件协同仿真

纯粹的硬件仿真速度太慢。我们采用了一种高效的方法:使用MATLAB/Python搭建软件参考模型,并与VHDL仿真协同

  1. 用MATLAB实现完整的算法流程,作为“黄金参考”。
  2. 将VHDL设计在Modelsim或Vivado Simulator中进行仿真。
  3. 将同一张测试图片,分别输入给MATLAB模型和VHDL测试平台。
  4. 将VHDL仿真输出的结果(面积、颜色值、最终分类)导出到文本文件。
  5. 用MATLAB脚本读取VHDL输出,与自己的计算结果逐帧、逐像素对比。

这种方法能快速定位是算法逻辑错误还是硬件实现错误(比如定点数精度损失导致的偏差)。

4.3 原型搭建与实测问题排查

当我们把比特流下载到FPGA开发板,连接上真实的摄像头和显示屏后,才是挑战的开始��以下是我们遇到的一些典型问题及解决方法:

问题1:图像分割不稳定,边界闪烁。

  • 现象:同一扁桃体,连续几帧分割出的面积波动很大。
  • 排查:首先检查光源。环境光变化会极大影响颜色和阈值。我们后来为设��加装了小型LED补光灯,并加上柔光罩,确保咽喉部光照均匀稳定。其次,检查全局阈值是否固定。我们最初使用Otsu算法动态计算阈值,但在硬件上实现复杂且耗时。后来改为针对特定患者进行一次性阈值校准(用户首次使用时,对准健康的咽喉部图像,系统学习一个基准阈值),后续检测都使用这个相对阈值,稳定性大幅提升。

问题2:早期炎症误判为正常。

  • 现象:肉眼可见轻微红肿,但系统判定为正常。
  • 排查:分析特征值发现,早期炎症的面积增长不明显,主要靠颜色变化。但我们的红色通道平均值计算,容易受到咽喉其他部位(如悬雍垂)固有红色的干扰。改进方案:将特征从“整个扁桃体区域的平均红度”改为“扁桃体区域相对于其周围黏膜组织的相对红度”。具体实现是,在硬件中不仅计算扁桃体区域(ROI)的红色均值,还计算一个环绕ROI的环形缓冲区的红色均值,然后求差值。这个小小的改动,让早期炎症的检出率提高了约15%。

问题3:处理帧率不达标。

  • 现象:设计目标是30帧/秒,实测只有10帧。
  • 排查:使用ChipScope或SignalTap这类嵌入式逻辑分析仪,抓取内部流水线的握手信号。发现瓶颈在特征提取模块与外部DDR内存的交互上。图像分割后的二值化掩模图和原始RGB图需要被特征提取模块同时读取,产生了内存访问冲突。解决方案:优化内存访问调度,采用“乒乓操作”。开辟两块内存区,当预处理模块向A区写入当前帧的结果时,特征提取模块从B区读取上一帧的数据。下一帧则交换角色。这样消除了冲突,帧率提升到25帧,再通过优化特征提取模块内部的流水线深度,最终稳定达到了30帧。

4.4 性能评估与数据对比

经过调优后,我们在Xilinx Zynq-7020 SoC FPGA上实现了最终系统。资源消耗和性能对比如下:

模块逻辑单元 (LUTs)寄存器 (FFs)Block RAMsDSP Slices处理延迟 (时钟周期)
图像预处理 (含行缓冲)3200280032~5行
特征提取 (面积/颜色)1500120015每像素1周期
模糊决策 (Sugeno)8006001 (用于LUT)212
总计~5500~460059从帧有效到输出 < 2ms

使用159张标注好的临床图像(22正常,24早期,113严重)进行测试,与三甲医院耳鼻喉科医生的诊断结果进行对比,混淆矩阵如下:

系统诊断 / 医生诊断正常 (N)早期 (E)严重 (L)
正常 (N)1920
早期 (E)3183
严重 (L)04110

计算结果

  • 整体准确率: (19+18+110) / 159 = 92.5%
  • 正常阶段准确率 (特异性): 19 / 22 = 86.4%
  • 早期阶段准确率: 18 / 24 = 75.0%
  • 严重阶段准确率 (敏感性): 110 / 113 = 97.3%

这个结果与论文中的数据基本吻合。可以看到,系统对严重炎症的识别非常准,这正是临床筛查中最需要抓住的重点。早期炎症的误判主要与颜色变化的细微性和个体差异有关,这也是未来可以继续优化的方向。

5. 项目复盘、经验总结与扩展思考

回顾整个项目,从算法研究到硬件实现,再到系统调试,是一个典型的嵌入式图像处理系统开发流程。有几点深刻的体会:

第一,算法必须为硬件而生。在软件上跑得飞快的复杂算法(比如深度卷积网络),直接移植到FPGA可能是一场灾难。硬件喜欢规则、重复、并行的操作。我们这个项目成功的关键,就在于从一开始就选择了计算简单、并行度高的特征(面积、颜色)和分类器(模糊逻辑)。如果你的算法里充满了条件分支、递归或者不规则的内存访问,那就要慎重考虑硬件化的代价。

第二,“仿真-原型-实测”的循环至关重要。在电脑上仿真完美的设计,一到实际环境就出问题,这太常见了。光照、噪声、个体差异,这些在实验室里考虑不到的因素,会在实测中给你上一课。必须搭建一个包含真实传感器和环境的原型测试平台,尽早开始实测迭代。

第三,资源与性能的平衡是永恒的艺术。FPGA开发不是追求极致的性能,而是在给定的资源(逻辑、存储、DSP、功耗)下,做出最优的设计。比如,我们用Sugeno模糊代替Mamdani,用绝对值近似代替开方,都是这种权衡的结果。要学会阅读综合报告,知道每一个模块消耗了多少资源,瓶颈在哪里。

这个系统未来可以如何扩展?

  1. 集成轻量级神经网络:随着FPGA上神经网络加速器IP的成熟,可以考虑用一个小型的CNN来替代手工特征+模糊逻辑,可能获得更高的准确率,尤其是对早期炎症的判别。但需要解决模型训练、量化和硬件部署的整套流程。
  2. 多模态信息融合:除了图像,是否可以加入红外热成像(看炎症导致的温度升高)?或者连接一个简单的喉部传感器获取声音信息?在FPGA上实现多传感器数据的同步融合,是另一个有趣的方向。
  3. 片上系统集成:使用像Zynq这样的FPGA+ARM SoC芯片。将图像采集、预处理、特征提取等高速并行部分放在FPGA(PL端)实现,而用户交互、网络通信、数据库管理等控制逻辑放在ARM处理器(PS端)上运行。这样既能保证实时性,又能拥有强大的软件生态和灵活性。
  4. 云端协同:设备端(Edge)完成初步的实时筛查和分割,将可疑的或难以判定的图像加密后上传到云端(Cloud),利用云端更强大的AI模型进行二次分析或专家复核,再将结果返回。FPGA可以高效地完成边缘端的预处理和数据加密传输工作。

做医疗电子项目,技术实现只是一方面,对临床需求的理解、对安全性和可靠性的敬畏同样重要。这个扁桃体炎监测系统,它不是一个要取代医生的“AI医生”,而是一个放在社区诊所或家庭里的“智能哨兵”,它的价值在于早期发现、定期监测和客观记录,让医疗资源能够更精准地投入到需要的地方。从技术到产品,还有很长的路要走,包括医疗器械注册、临床验证、用户体验设计等等,但用FPGA这把“硬”锤子,去敲开嵌入式智能医疗设备的大门,这个方向无疑充满了挑战和机遇。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 22:41:00

终极暗黑破坏神2存档编辑器:如何5分钟掌握单机角色自由定制

终极暗黑破坏神2存档编辑器&#xff1a;如何5分钟掌握单机角色自由定制 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor是一款基于Vue.js 3构建的专业暗黑破坏神2存档编辑器&#xff0c;专为单机玩家提供完整的角色数…

作者头像 李华
网站建设 2026/5/27 22:37:42

在多地域部署服务中体验Taotoken低延迟与路由优化的价值

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在多地域部署服务中体验Taotoken低延迟与路由优化的价值 效果展示类&#xff0c;结合一个为全球用户提供服务的应用案例&#xff0…

作者头像 李华
网站建设 2026/5/27 22:36:44

揭秘实时交互数字人:构建AI虚拟导购系统的实战指南

揭秘实时交互数字人&#xff1a;构建AI虚拟导购系统的实战指南 【免费下载链接】metahuman-stream Real time interactive streaming digital human 项目地址: https://gitcode.com/GitHub_Trending/me/metahuman-stream 在数字化转型浪潮中&#xff0c;实时交互数字人技…

作者头像 李华
网站建设 2026/5/27 22:35:00

华硕笔记本性能管理革命:G-Helper轻量级控制工具完全指南

华硕笔记本性能管理革命&#xff1a;G-Helper轻量级控制工具完全指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook,…

作者头像 李华
网站建设 2026/5/27 22:32:11

外汇实时api的WebSocket心跳间隔设多少秒最稳定?

在做外汇行情相关的项目时&#xff0c;我一直在调试 WebSocket 的连接稳定性。实时行情很容易受到网络波动影响&#xff0c;如果心跳间隔没设好&#xff0c;连接就会断开&#xff0c;数据就不连续。经过一段时间的摸索&#xff0c;我找到了一套比较稳妥的做法&#xff0c;既保证…

作者头像 李华
网站建设 2026/5/27 22:31:38

预训练小技巧,LoRA与SFT微调实战,打造能说人话的139M中文模型!

摘要 本文是手搓大模型系列的第四篇文章&#xff0c;本文主要介绍了模型预训练的一些小技巧&#xff0c;LoRA微调以及SFT微调。 后续文章会继续探索强化学习相关内容&#xff0c;喜欢的朋友麻烦点个赞吧&#xff5e; 项目开源说明 本项目的代码&#xff0c;数据&#xff0c;权重…

作者头像 李华