【2021集创赛】Arm杯二等奖-基于Arm核的智慧病房手势识别方案

团队介绍

参赛单位:上海交通大学
队伍名称:芯灵手巧
指导老师:王琴、景乃锋
参赛队员:林圣凯、林新源、莫志文
总决赛奖项:二等奖

1.项目概述

1.1 选题背景

我们的选题背景是考虑到很多卧床病人不便于独自向医护人员提出护理请求,因此我们想到在FPGA上部署智能SOC,实现手势识别功能,从而使病人可以使用手势来发出护理请求。
在这里插入图片描述

1.2 方案设计

我们共实现了两套方案,其中一套数据通路是从板载摄像头输入,HDMI显示图像,加速器处理后将结果上传上位机
另一套是由小程序采集图像,经服务器、上位机传至加速器,再经由原路返回小程序
在这里插入图片描述

1.3 项目工作

我们完成了赛方要求实现的所有基本功能,如表所示。
另外,我们超额完成了网口输入视频流功能、针对医疗应用场景的上位机与小程序设计,同时我们的系统支持不同权重用于不同应用,使得系统应用拓展性进一步提升。
在这里插入图片描述

1.4 性能参数

我们的项目已经在Artix-7 200T开发板上实现,在资源开销方面,我们使用了200t开发板三成以下的寄存器和DSP,大约一半的查找表,以及约六成的BRAM。我们的加速器可以每秒处理73帧左右,在测试集上的检测精度达到了约96%。我们的系统工作在50MHz的时钟频率,vivado实现之后显示其板级功耗为2.138W,可计算出能效比为34.14fps/W,经过测试,该能效比远远高于使用GPU或CPU推理时的能效比。
在这里插入图片描述

2.硬件介绍

2.1 整体架构

我们的整体系统包括图像采集与显示子系统以及加速器子系统两大部分。
在这里插入图片描述

2.2 图像输入与显示子系统

我们的图像采集与显示子系统 可以经由摄像头或网口输入图像,经过MUX选择之后送入加速器。由此我们实现了多数据通路功能。
在这里插入图片描述

特别地,我们的网口支持360Mbps的网口速率,并在板上实现了UDP、IP、MAC层的接收功能,该部分电路与板载的PHY芯片配合实现了完整以太网接收功能。
在这里插入图片描述

2.3 加速器子系统

加速器子系统包括加速器及外围缓存。
视频流由buffer输入,推理结果输出到CPU进行展示。
我们使用了Ping-pong buffer使图像输入、计算并行,提高性能。
在这里插入图片描述

2.4 加速器子系统的优化

在复赛之后,我们团队对系统进行了优化。为提高性能,加速器使用100MHz的时钟,为了解决跨时钟域与加速器通信的问题,我们使用AHB时钟转换接口控制加速器。我们利用加速器权重稀疏性,大幅减少BRAM占用。
为解决权重输入的控制问题,我们对权重按规律分组之后,降低了控制难度。
在这里插入图片描述

经过了上述优化,我们通过划分时钟域提升了推理帧率,提升幅度达94.2%,同时我们的能效比相比之前提升达68%;我们利用权重稀疏性减少了15.52%的BRAM占用。由此我们的加速器子系统在板上资源占用和性能等方面均取得了明显的改善。最终,经过我们的实际对GPU与CPU的能效比进行测试,我们的SoC系统的能效比远高于GPU和CPU的能效比,是GPU的5倍,CPU的十倍。我们SoC的优化效果显著。
在这里插入图片描述

3.软件工作介绍

3.1 加速器结构

我们的加速器是基于SqueezeNet设计,将原本的Fire模块进行了一定程度的精简,去除了原本Fire模块中的一些卷积核。
同时我们使用Dorefa方法对网络参数进行低比特量化,我们将大多数权重量化至1bit,输入和输出量化为5bit。
加速器使用HLS编写,并综合之后生成IP,挂载到了总线上。
在这里插入图片描述

3.2 数据集准备

我们设计了基于美国手语字母的一套手势,我们将原本的字母的含义映射到病房场景下的各种具体含义,如右表所示。
为了训练神经网络,我们自己制作了一套大约一万张图片的数据集,之后随机进行旋转、饱和度、对比度等调整以提升训练效果,最终效果如右下图所示。
在这里插入图片描述

3.3 加速器训练结果

之后我们使用TensorFlow框架进行训练,训练过程中,Top1错误率如右图所示,由图可见,训练过程顺利收敛。最终我们训练Top1准确率达到了约96%
在这里插入图片描述

3.4 上位机与小程序

为了提升系统的实际应用效果,我们使用C#编写了配套的上位机,编写了配套的小程序并搭建了服务器。最终我们实现了可以通过小程序、服务器、上位机与FPGA网口通信。
在这里插入图片描述

4.仿真与上板测试

我们分别对SoC、DDR、DATA_CACHE、加速器模块、SD卡、网口模块的进行了modelsim 仿真与上板测试结果或是上板之后利用 Vivado 下的集成逻辑
分析仪(ILA) 对于关键信号线的抓取与验证。在通过以下各个模块的仿真与验证之后, 我们认为相应模块的配置与运行结果都是符合预期的。

4.1 SoC基本功能仿真

在整个项目开始之初,我们在modelsim对SoC基本系统进行了RTL仿真,结果如图4-1所示,在上电复位后,系统总线有相应变化,说明SoC基本系统已正常运行。
在这里插入图片描述

4.2 DDR模块

通过使用AHBlite-AXI转接桥,我们将DDR挂载在L1总线矩阵上,并用ila对关键信号进行抓取。如图4-2所示:当总线向DDR连续写入数据时,总线的READY和READYOUT的实现正确握手,数据也正确传递到DDR的相应地址。
在这里插入图片描述

4.3 SD卡模块

SD卡在上电后自动进行初始化,在一定时间后可以抓到sd_init_done信号变为高电平,表示SD卡正常初始化完成。
在这里插入图片描述

随后,依次配置SD卡的读扇区地址并开始设置开始读取到片上BRAM。该过程总线信号如下。
在这里插入图片描述

当SD卡一个扇区读取到片上完成时,会拉高sd_sec_read_end,表示当前扇区已经读取完成,如图4-5。
在这里插入图片描述

之后CPU便可以查询到SD卡模块相应寄存器的变化为0x00010000,此即读取完成状态,如图4-6。
在这里插入图片描述

在之后,CPU就可以直接读取暂存有扇区数据的BRAM,如图4-7。这样SD卡一个读取过程已经完成,此后循环此过程即可。至此SD卡正常工作状态已经得到验证。
在这里插入图片描述

4.4 加速器模块

对于加速器模块,我们进行了从TensorFlow平台测试,HLS C仿真,HLS C/RTL协同仿真,加速器搭载在最小系统仿真等非常规范的设计流程。
首先是TensorFlow平台测试,如下图所示:
在这里插入图片描述

如上图所示,几次测试的Top1-错误率分别为4.8%, 0.8%与4.0%,平均为4.73%。
接着,我们编写了HalfSqueezeNet的HLS C代码,并对其进行了多轮C仿真验证其正确性。下图为举例说明。
送入的图像为如下所示。
在这里插入图片描述

美国标准手语如下:American Sign Language。
在这里插入图片描述

对比可知,这是手势B。将其通过matlab转化为565RGB图像,使其与实际摄像头送入的图片格式相同。
在这里插入图片描述

对其进行C仿真。(console中的红框表示是C仿真)
在这里插入图片描述

可以看出,C仿真的所得到结果为class=1,由于我们设置class=0为A,class=1为B……以此类推。对比美国标准手势图,可以得知手势的分类结果是正确的。

接下来进行C/RTL协同仿真。(console中的红框表示是协同仿真)
在这里插入图片描述

在这里插入图片描述

可以看出,分类所得的class=1,即手势B,结果正确。

最后进行最小系统仿真。在搭建完最小系统之后,我们HLS生成的AXI lite与AXI Stream规范进行配置,并将图片和权重转化为COE格式送入BRAM例化。最终所得的结果如下。
在这里插入图片描述

可以看出,最终result[6]的结果为1,即表明最终所得的分类结果为B。
以上,HalfSqueezeNet的TensorFlow测试、C仿真、C/RTL协同仿真、最小系统仿真全部完成,我们有充分的理由相信加速器是可信可靠的。

4.5 网口模块

对于网口模块,我们对网口的最小系统通过抓市面上已有的网口调试助手向FPGA发送数据时抓ILA信号验证了FPGA网口模块的正确性;接着我们自己用C#编写了带网口传输功能的上位机,并通过抓ILA来验证上位机功能的正确性。

首先在系统中将电脑的网口发送端口设置IP为与FPGA中相同的IP地址,从而使得能顺利通过FPGA中我们编写的UDP协议校验。
在这里插入图片描述

接着,我们在cmd命令行中添加新的静态表项,将FPGA的IP地址192.168.0.120设置为对应的MAC地址设置为00-AA-00-62-C6-09。
利用arp -a命令查看绑定的IP与MAC地址,可以看到对应的表项已成功添加。
在这里插入图片描述

下载并打开网口调试助手,设置发送端口与目的端口。发现可以成功打开端口。
在这里插入图片描述

点击数据发送,在wireshark上可以抓到对应的长度为22422bytes的udp数据包,其源IP地址为192.168.0.3,目的IP地址为192.168.0.120,信息与之前所设置的可以完全匹配。(下图No.5)
在这里插入图片描述

此时向FPGA烧入带有ILA的最小系统比特流,观察数据。发现可以收到电脑发出的UDP包,且数据与长度匹配。
在这里插入图片描述

至此,已经可以验证FPGA上的网口是正确无误的;接着需要编写上位机程序。我们利用Visual Studio的C#作为开发环境,编写了带有网口传输、串口打印、与服务器进行HTTP协议通信的上位机。其界面如下:
在这里插入图片描述

设置对应的源IP、端口号与目的IP、端口号,并生成需要发送的byte流。点击发送。
在这里插入图片描述

此时,在ILA中再次抓取数据。
在这里插入图片描述

可以看到,数据能够被正确读取。考虑到一个UDP包能传输的字节数有限,我们最终设置每次传输224X2个RGB565数据,即每次传输896个bytes,共计传输112次来完成一张图片传输的协议。其中,Img_start信号为FPGA中每张图片开始传输的信号。
至此,网口部分的验证已经全部完成。

4.5 整体测试结果

在这里插入图片描述

5.项目总结

目前该项目在FPGA平台上实现了基于Arm Cortex-M3 DesignStart处理器的面向无人值守的信号处理SoC,可以应用于智慧病房检测等各种无人系统的应用,非常契合赛题的要求,且由于系统的通用性,有着广大的潜在应用场景。

该目标检测SoC基于Arm处理器,采用了两级AHB总线结构,系统中挂载了图像采集与显示模块,SD卡模块,DDR模块,加速器模块等,系统使用摄像头采集图像送入加速器与HDMI模块分别进行目标检测与显示,在我们的设计之下,在系统工作过程中软硬件得以良好协同。我们的系统可以实现对视频流实时、稳定地检测与显示。

由于FPGA的资源十分有限,我们选用了伯克利&斯坦福团队提出的SqueezeNet网络,该网络专为移动或嵌入式场景开发,在保持一定精度的前提下降低了网络大小。同时,为了使该网络可以做成硬件加速器,对该网络又进一步采用了融合BN层,参数归一化和网络结构精简(删除Fire模块中的1X1卷积)等手段使得真正上板的网络进一步减小而精度的下降尚可接受。另外,由于不同网络层之间大多结构相同,我们在HLS的网络中采取了折叠结构实现,使用软硬件协同控制加速器工作时的数据流向,进一步大大节省了有限的板上资源。我们利用数据增强的 DAC SDC 数据集对网络进行了训练,并对权重进行量化。该数据集面向无人机场景,均为无人机拍摄的图片,待识别物体被分为 12 类。

在实际部署中,为进一步节省片上资源,我们对 SqueezeNet 网络进行了简化, 并采用折叠架构。SqueezeNet 主要由若干个 Fire 模块构成,我们仅设计一个简化的、参数可配置的 Fire 模块,称之为 HalfFire 模块。通过对加速器的配置来控制 HalfFire 模块的例化和数据流的走向。数据通过若干次加速器(每次的配置参数均不同)处理后,即可得到检测结果。折叠架构节省了大量的片上资源,便于目标检测与分类 SoC 系统在边缘端的部署。

通过实验测试,该加速器可实现软件平均准确率 96.27%的检测精度; 完成一帧图像的处理平均耗时 28.6 ms,系统吞吐率 34.97 FPS;系统的板级动态 功耗为 1.697 W,完成一帧图像的处理耗能 0.0468 J,能效比为 21.35 FPS/W。同时,系统性能相比于 CPU 加速比显著,相比于 GPU 能效比提升显著。综合来看,系统的性能指标优势显著,达到了2017年IEEE国际一流会议/期刊发表论文相当水平。

该项目在 FPGA 平台上实现了目标检测 SoC 的部署,结合上位机的串口与语音播报,可实现对病房实时、稳定的检测,满足患者的各项需求。该项目实际作为一套通用的加速器平台系统可部署于边缘端,除用于智慧病房检测外,还可通过在SD卡存入训练好的各套权重,最终用于智能视频监控、聋哑人友好的无接触智慧电梯等各个场景,具备较高的通用性,市场前景广阔。

6.参赛体会

参加集创赛作为一段宝贵的实践经验,我们收获颇丰。我们团队大致可以总结出如下几条参赛经验
1. 扎扎实实一步步仿真、验证每部分电路,再尝试整合。SoC设计是一个很严谨细致的工程,有任何一个地方有再小的一个bug都会导致系统整体的错误表现。就像我们在复赛前,因为给一些子系统加了新特性之后,比较急切想整合验证效果,便跳过了子系统的仿真验证,直接全都挂到总线上就开始验证,结果出现了问题。团队一起检查了一段时间之后最终还是决定先给各个子系统分别仿真验证,确定子系统没问题之后再整合。最后果然在这个过程中发现是一个子系统存在bug。这次经历让我们得到了深刻的教训:心急吃不了热豆腐,凡事还是要踏踏实实一步一步走。
2. 一切以上板结果正确为最终标准。在本次竞赛的制作过程中,同样是复赛前,我们有几个子系统通过了小系统仿真,之后我们都觉得这部分应该已经没问题了,当时觉得既然是同样的代码仿真过了上板应该也没问题。但是我们团队就遇到了一次尽管仿真正确但上板结果不对的情况,最终只能根据ILA抓信号的结果来debug,而且打乱了我们原本的项目计划。在这之后我们更深刻地理解了指导老师经常催促我们赶紧上板验证的原因。我们懂得了仿真永远只是理论验证,功能验证,而硬件即使做得再完美也有不理想的现象,就完全可能导致与仿真结果对不上的问题。
3. 多学多看多思考,多看看厂商给出的技术文档,以及留出充足的时间来对硬件进行debug。以网口的学习作为经验,首先是要学习最基础的RGMII协议以及UDP协议,然后根据开发板的说明文档查到网口的PHY芯片型号RTL8211EL,然后再根据相应的文档学习芯片的引脚配置。中间也遇到了许多问题,例如开始没有发现PHY芯片的reset需要至少1ms的时间,或是有一个引脚约束xdc文件分配错了却迟迟没有发现,这些都是需要预留充足的时间来debug的。其他模块的编写我想也大致如此,都需要首先对协议本身进行学习,然后根据开发板的不同型号对相应引脚进行配置,最后通过仿真测试以及上板抓ILA进行测试验证,通过后就可以整合进整个系统了。

7.参赛队员介绍

林圣凯
本人2018年进入上海交通大学开始大学本科学业,所学专业为微电子科学与工程。本人成绩优异,曾获何宜慈博士纪念奖学金以及多次校级B类奖学金;并且在本科期间积极参加科研工作,从事过网络系统、量子身份认证以及集成电路SoC设计等方向的科研工作。
在本次集创赛中,我自己对于SoC的基础知识与认识有了大幅度提升,真正做到了学以致用。我觉得这个过程就是一个解决问题与挑战自己的过程。我相信我会以此为起点,在未来的科研工作中继续对自己提出更高的挑战,并将其一一击破。

林新源
我是芯灵手巧组的林新源,是一枚对集成电路设计尤其是系统级设计感兴趣的大三学生。这是最坏的时代,也是最好的时代,我希望自己能够在国家需要的,且自己喜欢的集成电路设计领域做一些有意义的事情。于我而言,集创赛是个起点,在这过程中学到的知识还有完成过程中的态度心境将让我未来受益匪浅。将来,我将去清华大学电子系攻读博士,继续攀登新的高峰。

莫志文
我是CICC2883芯灵手巧组的莫志文,是一名上海交大微电子学院的大三学生,曾获国家级奖学金、校A级奖学金、三好学生等荣誉,成绩位列专业第一。我平日里课业之外喜欢音乐、足球与骑行。我对数字芯片设计颇有兴趣,并即将保研至本系直博继续攻读数字芯片设计。我期待着未来在本领域深耕并作出一些属于自己的贡献。以此次集创赛作为契机,我学到了许多知识,也在管中窥豹——可见一斑中感受到了数字IC设计智慧的博大精深。
恰逢如此的历史时机,我坚信我们这一代人可以扛起这份责任。长风破浪会有时,直挂云帆济沧海!

作品内容来源于芯灵手巧队,转载请标明出处。欢迎大家参加极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动,10月1日截止~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/152767.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试

2023年11月15日,对.net的开发圈是一个重大的日子,.net 8.0正式版发布。 圈内已经预热了有半个月有余,性能不断超越,开发体验越来越完美,早在.net 5.0的时候就各种吹风Aot编译,直到6.0 7.0使用仍然比较麻烦…

比一比国内的现货白银交易所

上海黄金交易所(SGE)是国内最大的白银交易平台之一。它作为中国金融期货市场的重要组成部分,能够提供完善的交易机制和规范的交易环境。SGE的交易品种丰富,包括现货白银,白银延期等的多种交易方式。SGE也具有较高的流动性和交易深度&#xff…

WireGuard 组网教程:快速构建安全高效的私密网络并实现内网穿透

文章目录 1 引言1.1 什么是WireGuard1.2 WireGuard可以用来做什么1.3 WireGuard原理1.4 WireGuard安装 2 WireGuard组网实现内网穿透2.1 前提条件2.2 网络拓扑结构2.3 具体步骤2.3.1 中继服务器配置2.3.2 其他peer2.3.3 测试 2.4 WireGuard配置文件说明 3 WireGuard工具3.1 wg-…

Numpy数组进阶_Python数据分析与可视化

Numpy数组进阶 Numpy的广播机制高级索引整数数组索引布尔索引花式索引 数组迭代 Numpy的广播机制 广播 (Broadcast) 是 numpy 对不同形状 (shape) 的数组,进行数值计算的方式。 对数组的算术运算通常在相应的元素上进行,当运算中的 2 个数组的形状不同时…

轻松实现文件改名:让新文件名与目录名称一致

在日常工作中,我们经常需要处理文件改名的问题。有时候,我们需要将新文件名设置为与目录名称相同,以方便管理和查找。然而,这个过程可能很繁琐,尤其是当你有大量的文件需要改名时。幸运的是,现在有一种简单…

Windows2019部署IIS后,浏览文件变成下载的问题解决过程

1、反复重起服务器、重建应用程序、建应用程序并改名才好使! 2、总体上,角色为: 一、在Windows2019服务器上,填加角色,一路下一步,到填加服务器角色时,勾选了【Web服务器(IIS)】 二、然后在【…

阿里云2核2G3M服务器e实例、40G ESSD Entry系统盘性能测评

阿里云99元服务器新老用户同享2核2G经济型e实例、3M固定带宽和40G ESSD Entry系统盘,老用户也可以买,续费不涨价依旧是99元一年,阿里云百科aliyunbaike.com分享阿里云3M带宽服务器40G ESSD Entry云盘性能说明: 阿里云99元服务器配…

el-table操作栏添加el-dropdown获取当前行的数据

0 效果 点击子合同获取到当前行的id 1 代码 beforeHandleCommand(row, childCommand) {return { row: row, childCommand: childCommand }; }, addChildBtn(command) {const row command.row;if (command.childCommand 0) {// todo} else {// todo} },

el-select下拉框只回显value不回显label的原因以及解决方法

项目场景: 提示:这里简述项目相关背景: 原因分析: 提示:这里填写问题的分析: el-select的采用的是map的key value结构,因此只显示value而不显示label的原因是,value的类型不正确&…

【Effect C++ 笔记】(四)设计与声明

【四】设计与声明 条款18 : 让接口容易被正确使用,不易被误用 Item 18: 让接口容易被正确使用,不易被误用 Make interfaces easy to use correctly and hard to use incorrectly. “让接口容易被正确使用,不易被误用”&#xff0…

Abaqus2023新功能:分析技术

隐式耦合的松弛和加速器方法 产品:Abaqus/Standard SIMULIA协同仿真引擎现在支持Aitkens松弛方法以及Anderson和Broyden加速器方法,为强耦合物理场提供稳健且省时高效的解决方案。此功能在 2022 FD04 (FP.2232)版本中首次提供。…

vue的常用指令

1.使用双花括号( {{}} )对变量输出,内部可以写简单的表达式用于对数据的处理 2..v-text:相当于js的innerText, 3.v-html:相当于js的innerHTML 4.v-bind:动态绑定属性,简写是冒号( : ) 5.绑定class:操作元素的 class 列表和内联样式…

Moka人事:实现无代码开发的API连接,打通电商平台与用户运营系统

无代码开发的API连接:Moka人事的核心优势 Moka人事,是北京希瑞亚斯科技有限公司于2015年推出的一款数据驱动的智能化HR SaaS产品。这款产品的主要优势在于其无需进行API开发即可实现系统的连接和集成,这不仅大大提升了企业的工作效率&#x…

2023数维杯国际赛数学建模D题思路模型分析

D题思路模型分析:详细思路获取见文末名片 问题D:洗衣清洗的数学问题 洗衣清洗是人们每天都在做的事情。洗衣粉的去污功能来自于一些表面活性剂的化学物质。它们可以提高水的渗透性,并利用分子间静电排斥机制去除污垢颗粒。由于表面活性剂分…

【汇编】Debug的使用

文章目录 前言一、Debug是什么?二、为什么Debug如此重要?三、Debug的使用3.1 Debug的运行3.1 R命令查看寄存器的状态改变寄存器的值 3.2 用D命令查看内存中的内容列出预设地址内存内容列出指定地方的内容列出指定地方的指定大小的内容 3.3 使用e命令修改…

learning to rank 学习排名系统综述

Learning to Rank 的实践 文档列表方法 Listwise 算法相对于 Pointwise 和 Pairwise 方法来说,它不再将排序问题转化为一个分类问题或者回归问题,而是直接针对评价指标对文档的排序结果进行优化,如常用的 MAP、NDCG 等。应用 Listwise 的模型…

js构造函数之工厂模式(学习笔记1)

目录 一、简单工厂 1、存储一个用户信息 2、存储N个用户信息 3、存储N个用户信息不同年龄用户有不同美食的搭配方案【简单工厂模式】 二、抽象工厂模式 1、抽象工厂(AbstractFactory) 2、具体工厂(ConcreteFactory) 3、生产新款手机 4、总结 本…

V10服务器安装virt-manage

kvm是什么 KVM(Kernel-based Virtual Machine, 即内核级虚拟机) 是一个开源的系统虚拟化模块。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。目前KVM已成为学术界的主流VMM之一,它包含一个为处理器提供底层虚拟化 可加载…

服务器数据恢复—服务器raid5离线磁盘上线同步失败的数据恢复案例

服务器数据恢复环境&故障: 某品牌DL380服务器中有一组由三块SAS硬盘组建的RAID5阵列。数据库存放在D分区,数据库备份存放在E分区。 服务器上有一块硬盘的状态灯显示红色,D分区无法识别,E分区可识别,但是拷贝文件报…

MyBatis 操作数据库(⼊⻔)

前言 通过本篇博客,我们将学到以下内容 1.使⽤MyBatis完成简单的增删改查操作,参数传递 2.掌握MyBatis的两种写法: 注解和 XML⽅式 3.掌握 MyBatis 相关的⽇志配置 什么是 MyBatis? MyBatis是⼀款优秀的 持久层 框架,⽤于简化JDBC(关于 JD…
最新文章