
paddlepaddle
文章平均质量分 85
对本专栏代码有使用问题的订阅者,皆可以私聊博主解决问题。如果碰到有需要解决的技术问题,也可以私聊博主补充博客。
优惠券已抵扣
余额抵扣
还需支付
¥59.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
万里鹏程转瞬至
一名热爱深度学习算法实践的算法工程师,工作日长期活动在线,有项目研发技术问题均可私聊。
展开
-
paddle 57 基于paddle_infer以面向对象方式2行代码部署目标检测模型、图像分类模型、语义分割模型
为方便模型部署测试,这里分享基于paddle infer的python版本部署目标检测模型、图像分类模型、语义分割模型。目前仅是基于paddle python的部署代码,各位可以轻松的将其改造为paddle c++部署代码。原创 2023-12-26 20:30:03 · 452 阅读 · 0 评论 -
paddle 56 将图像分类模型嵌入到目标检测中并实现端到端的部署(用图像分类模型进行目标检测切片分类)
目标检测在功能上一直是涵盖了图像分类的,其包含目标切片检测,目标切片分类。由于某些原因,需要将目标检测的功能退化为检测,忽略其切片分类,使用外部的分类模型。然而这样操作会使得其与原始的部署代码不兼容,为此博主实现将图像分类模型嵌入到目标检测中,并实现端到端的部署。这里以ppyoloe模型为改造案例,关于图像分类模型可以使用任意PaddleClas支持的模型。关于构造PaddleClas模型可以查阅。原创 2023-12-24 14:51:13 · 1547 阅读 · 0 评论 -
paddle 55 使用Paddle Inference部署嵌入nms的PPYoloe模型(端到端fps达到52.63)
Paddle Inference 是飞桨的原生推理库,提供服务器端的高性能推理能力。由于 Paddle Inference 能力直接基于飞桨的训练算子,因此它支持飞桨训练出的所有模型的推理。paddle平台训练出的模型转换为静态图时可以选用Paddle Inference的框架进行推理,博主以前都是将静态图转换为onnx模型再进行部署。原创 2023-12-23 21:40:18 · 2057 阅读 · 1 评论 -
paddle 54 从PaddleClas2.5初始化模型用于迁移学习(LeViT、ReXNet、EfficientNet等)
随着PaddleClas版本代码的迭代,博主以前的一些代码在使用上出现了bug,导致无法初始化模型,具体涉及代码的使用,为此重新对最新的PaddleClas代码进行梳理,实现重新初始化PaddleClas中的模型。在迁移学习中应该初始化哪些模型可以参考。原创 2023-12-23 12:57:16 · 661 阅读 · 0 评论 -
paddle 53 基于PaddleClas2.5训练自己的数据(训练|验证|推理|c++ 部署)
paddleclas的最新项目已经不适应其官网的使用案例(训练、验证、推理命令均不适用),为此博主对其进行命令重新进行修改。同时paddleclas的推理命令并不能将推理结果进行保存,博主修改了infer.py代码,使其能保存预测结果,能将推理结果用于二次训练。本博文完整的实现了从0开始训练模型到c++模型部署。原创 2023-12-22 00:17:06 · 1180 阅读 · 0 评论 -
paddle 52 在paddleseg中实现cutmix数据增强方式
transforms是paddleseg中增强数据的配置,首先我们可以在其数据配置文件中看到transforms设置项,具体如下所示。可以看到transforms中设置了Resize、ResizeStepScaling、RandomVerticalFlip、RandomHorizontalFlip、RandomDistort、RandomAffine、Normalize等数据增强选项。原创 2023-04-30 11:43:20 · 1419 阅读 · 4 评论 -
paddle 51 动态图转onnx(实现动态size)
paddle并不支持将动态图导出为支持动态size的onnx模型。参考:https://blog.youkuaiyun.com/ab0902cd/article/details/120200557 ,对导出后的onnx模型进行修改。最终实现,使paddle导出的模型支持动态size。以下以语义分割模型为例,将导出的静态size模型修改为动态size。原创 2023-04-13 23:13:33 · 886 阅读 · 0 评论 -
paddle 50 将EIOU、WIoU、SIoU嵌入paddledetection中,并用于ppyoloe的训练
性能先进的模型并不一定在整体上都是最先进的,就如在目前所公开的最强目标检测模型ppyoloe+使用GIOU作为loss来进行框回归优化。然而,在已知的信息中GIOU、SIOU、EIOU等最新IOU loss都比CIOU更利于边框优化。为此阅读了paddledetection中的源码,分析了其中iou loss的实现,发现有CIOU、GIOU、SIOU的实现方式,并没有EIOU、WIOU的实现方式。最终,参考pytorch的实现方式,将其改为paddle版本的EIOU、WIOU,并将其使用在ppyoloe+上原创 2023-03-03 19:21:48 · 1044 阅读 · 0 评论 -
paddle 49 ODConv的可部署调整
ODConv是一种适用于轻量化模型的conv结构,可以在较少的参数下训练出多参数模型才能达到的精度,在相同的flop下可以稳定的涨2-3%个点。但是在paddle下部署ODConv动态卷积模型时会报出各种异常,导致模型无法转静态图或onnx格式(可能在pytorch下也是无法转换的)。为此研究ODConv中的细节,移除了其中不利于部署的设计部分,但在整体上又没有违背ODConv的创新点,且同样可以保证性能。原创 2023-02-18 14:00:00 · 1183 阅读 · 11 评论 -
paddle 48 将ODConv与ppyoloe的backbone进行结合(实现更轻量化的模型)
ODCONV是Intel提出的一种极差即用的动态卷积,在小模型上涨点效果较为明显(在大模型上涨点效果略微退化),可被用于轻量化模型的性能优化。常见的轻量化模型有NanoDet、PicoDet和yolo-tiny系列模型等。NanoDet、PicoDet是针对轻量化部署所设计的,而各种yolo-tiny系列则是在提出新的yolo系列模型时所附带的轻量模型。原创 2023-02-08 22:12:55 · 1264 阅读 · 0 评论 -
paddle 47 使用ODConv构建自己的模型
ODCONV是Intel提出的一种极差即用的动态卷积,与大佬Xiaohan Ding提出的卷积重构的模式不同,ODCONV会在一定程度上增加推理模型的运算量和参数量(基于在resnet18上的效果测试,ODConv的acc涨点更明显[])。ODCONV在小模型上涨点效果较为明显(),因此常被用于轻量化模型的性能优化。原创 2023-02-07 08:06:12 · 2191 阅读 · 0 评论 -
paddle 46 使用onnxruntime部署使用paddledetection训练出的旋转框模型(支持batchsize,实现c++与python部署)
本博文以ppyoloe_r为例,实现ppyoloe_r模型的onnx导出部署。paddle 45 使用paddledetection做旋转框预测(预测自己的dota数据集)paddledetection中的旋转框模型在导出部署是可以使用paddle框架正常进行部署的,但是由于其在进行旋转框nms时需要特殊的算子,无法在正常的onnxruntime框架进行部署,故此需要修改部分导出源码。同时,ppyoloe_r模型的两个输出shape也没有正常对其,原创 2022-12-07 21:57:47 · 1177 阅读 · 1 评论 -
paddle 45 使用paddledetection做旋转框预测(预测自己的dota数据集)
paddledetection的最新develop版本支持旋转框预测,为此实现基于paddledetection训练自己的dota数据(含从数据处理到模型训练的全教程)。此外,paddledetection也支持旋转框模型的导出与部署,且与正常模型的导出部署流程是一样的,后续将会补充实现onnx部署教程。原创 2022-12-03 11:35:46 · 1444 阅读 · 0 评论 -
paddle 44 用onnxruntime实现ppyoloe模型的部署(含python和c++版本),支持batchsize
通过正常渠道导出的paddledetection由于内置nms操作,因而无法进行多图推理,正常导出模型部署的代码可以参考,为此对源码深入研究,实现导出的onnx模型同时推理多个图像,并实现python与C++下的多图推理。原创 2022-12-01 20:45:28 · 1364 阅读 · 0 评论 -
paddle 43 用onnxruntime实现ppyoloe模型的部署(含python和c++版本)
PP-YOLOE+是PP-YOLOE模型的升级版,PP-YOLOE+_l在COCO test-dev2017达到了53.3的mAP, 同时其速度在Tesla V100上达到了78.1 FPS。PP-YOLOE+_s/m/x同样具有卓越的精度速度性价比。paddle官方只给出了基于paddle框架的部署案例,为了更好的部署,为此实现将paddle模型转换为onnx模型,然后在python下实现onnxruntime部署。后续会补充c++ onnxruntime部署原创 2022-11-29 21:24:23 · 1424 阅读 · 0 评论 -
paddle 42 将任意paddleclas模型作为paddledetection中的backbone使用
paddleclas是paddlepaddle官方提出的用于图像分类的开源库,paddledetection是其提出用于目标检测的开源库。在图像分类中的很多模型都可以作为backbone参与目标检测模型中,然而在paddledetection中支持的backbone仅有少部分。所幸,博主发现在paddleclas中通过了海量的预训练模型,为此,打通paddleclas与paddledetection的联系,实现将paddleclas中的预训练模型作为paddledetection中backbone进行训练原创 2022-11-25 19:46:26 · 1134 阅读 · 5 评论 -
paddle 41 在paddledetection添加RotateScaleCopyPaste数据增强方法
paddledetection中支持不少的数据增强方法,比如GridMask、Cutmix和MixUp等具体可以参考。但是,缺失裁剪目标然后粘贴的其他数据上的增强方法为此博主对现有实现中的CopyPaste方法进行扩展实现RotateScaleCopyPaste,支持对裁剪下来的目标进行旋转和缩放,以实现更加复杂的数据扩充方法,核心代码每一行都有注释原创 2022-11-21 20:13:53 · 913 阅读 · 0 评论 -
paddle 40 支持任意维度数据的梯度平衡机制GHM Loss的实现(支持ignore_index、class_weight,支持反向传播训练,支持多分类)
梯度平衡机制GHM(Gradient Harmonized Mechanism) Loss是Focal loss的升级版,源自论文Gradient Harmonized Single-stage Detector。Focal loss针对难易样本的不平衡而设计,通过调节系数可以缩小易样本在loss中的比例,使得难样本的loss权重变大。但是并非所有的难样本都是值得关注的,GHM Loss对梯度进行直方图统计,统计情况如图1所示。按照一定范围计算频率,将loss值与梯度模长频率的倒数相乘。原创 2022-09-26 15:20:08 · 582 阅读 · 0 评论 -
paddle 39 基于Paddle Inference在win环境用Cmake编译部署resnet50并加载图像测试
Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。由于能力直接基于飞桨的训练算子,因此Paddle Inference 可以通用支持飞桨训练出的所有模型。Paddle Inference 功能特性丰富,性能优异,针对不同平台不同的应用场景进行了深度的适配优化,做到高吞吐、低时延,保证了飞桨模型在服务器端即训即用,快速部署。原创 2022-09-06 16:30:44 · 1026 阅读 · 0 评论 -
paddlepaddle 38 使用aistudio部署自己训练的动态图模型
aistudio作为百度旗下的人工智能训练平台,可以免费供各位深度学习爱好者使用训练模型,aistudio下内置paddle框架,支持动态图与静态图的训练。此外,aistudio还支持实现模型的在线部署,我们可以利用aistudio平台训练模型,然后在aistudio上进行部署,通过api的方式调用模型服务。。该网页主要讲述了静态图模型的部署,只涉及到数值数据的输入输出,不支持图像的输入,也不支持动态图的部署。原创 2022-08-22 21:46:18 · 1666 阅读 · 1 评论 -
paddle 37 paddledetection中的数据增强方法
PaddleDetection中支持了种类丰富的数据增强算子,有单图像数据增强算子与批数据增强算子两种方式。为模型训练任务添加合适的数据增强算子,有利于模型性能的再度提升。但是,paddledetection官方并没有提供每一个算子的使用教程(配置方法),为此博主通过对paddledetection的github源码进行分析,查找特定关键字,实现对各种数据增强算子的使用探索。原创 2022-08-20 09:31:15 · 2134 阅读 · 0 评论 -
paddle 36 paddledetection替换backbone(如使用hrnet_w64,swin_l_p4_w12等模型)
paddledetection内置中对很多的backbone都是支持的,但是所提供的预训练模型却是有限的,比如hrnet就只提供了hrnet_w18的模型,对于hrnet_w48,hrnet_w64就没有提供。众所周知,在各大论文的测试结果中,模型的宽度,深度越大效果越好。使用hrnet_w18做backbone能取得优越的结果,如果换成hrnet_w64必然能得到质的飞越。paddleclas提供了丰富的预训练模型,对于paddledetection中的各种backbone都提供了完整的预训练模型版本。.原创 2022-08-16 04:00:00 · 947 阅读 · 0 评论 -
paddle 35 paddledetection保存训练过程中的log信息
在paddledetection训练过程中可以进行loss,map的可视化预览,但是这依赖于VisualDL工具,且在训练结束后无法再度查看这些信息;此外在aistudio的AI Studio 经典版中,没有提供数据可视化的接口,无法查看loss,map等训练过程信息。为此,博主对paddledetection源码进行分析,最终在特定位置上添加5行代码,轻松实现的训练与测试过程中信息的保存。......原创 2022-08-10 20:04:45 · 1641 阅读 · 0 评论 -
paddlepaddle 34 调整模型的layer结构与forward流程(实现layer的增删改与forward的修改)
通常来说调整模型的layer结构与forward流程需要修改模型的定义代码,这会污浊了原始的模型定义代码。且,在源码层次进行模型结构修改后,会导致模型无法加载适应以前的预训练参数。为此博主实现了在不污浊模型定义代码的前提下,仅对model对象进行属性修改,实现了模型layer结构与forward流程的调整。本来博主在pytorch下是已经实现了该工作(),但是在应用到paddle下出现了水土不服,因此针对paddle框架在此进行该工作。本博文主要设置layer的新增、修改与删除,forward流程的修改。.原创 2022-07-25 03:30:00 · 995 阅读 · 2 评论 -
paddle 33 paddledetection推理结果保存为txt
在PaddleDetection2中通过在infer中设置save_results参数可以保存结果,但是无法精确到特定文件。通过save_results保存的结果由bbox.json和系列jpg文件所构成,具体输出信息如下所示。bbox.json 是一个json对象,包含了所有图像,所有的预测框。但是却是以id来代表特定jpg图片的,也就是说通过bbox.json可以获取结果,但是无法知道这个结果是哪个jpg图片的.........原创 2022-07-11 19:17:26 · 1603 阅读 · 8 评论 -
paddle 32 基于paddledetection将voc数据集转换为coco数据集
在paddledetection中训练目标检测模型有voc和coco两个数据格式,如在YOLOv3中需要voc数据,而在yolox中则需要coco数据集。博主也曾测试过将yolox任务配置项的数据集改为voc数据,则会带来很多报错(或是由于yolox中数据增强策略中某些key读取错误)。因此,在paddledetection中用到yolox等模型是需要将voc数据转换为coco数据。所幸,在paddledetection中内置了格式转换功能,支持voc数据转coco。.........原创 2022-07-11 02:00:00 · 1078 阅读 · 0 评论 -
paddle 31 安装paddledetection并训练自己的数据集(支持voc与coco数据集)
PaddleDetection为基于飞桨PaddlePaddle的端到端目标检测套件,内置30+模型算法及250+预训练模型,覆盖目标检测、实例分割、跟踪、关键点检测等方向,其中包括服务器端和移动端高精度、轻量级产业级SOTA模型、冠军方案和学术前沿算法,并提供配置化的网络模块组件、十余种数据增强策略和损失函数等高阶优化支持和多种部署方案,在打通数据处理、模型开发、训练、压缩、部署全流程的基础上,提供丰富的案例及教程,加速算法产业落地应用。项目地址:PaddlePaddle/PaddleDetection原创 2022-07-10 07:00:00 · 1372 阅读 · 0 评论 -
paddle 30 paddledetection项目结构的深入解析
paddledetection是百度推出的目标检测库,使用paddledetection训练自己的目标检测模型是极为方便的。使用一个paddledetection库,最快的方法就是去解读它的项目结构,这样才能更好的使用paddledetection做训练。paddledetection的项目代码可以在PaddlePaddle/PaddleDetection - 码云 - 开源中国 (gitee.com)中获取。下载后打开,项目结构如下所示。其中绿色标注框标注的部分是使用paddledetection训练深入原创 2022-07-10 06:00:00 · 525 阅读 · 0 评论 -
paddlepaddle 29 无模型定义代码下动态修改网络结构(relu变prelu,conv2d变conv3d,2d语义分割模型改为3d语义分割模型)
paddle框架提供了许多的模型,但是在无穷无尽的工程需求中,这远远是不够的。有些时候我们需要按照自己的情况修改网络结构,如单输入变成双输入,单输出变成多输出。这只是输入输出的调整,此外还有网络细节的调整,如将网络的激活函数从relu改为prelu、elu、switch等;如将2d的语义分割模型改为3d的分割模型。如果有模型结构定义的源码,修改网络结构自然是很简单的。但是,很多的时候模型定义代码过于复杂,而且属于库代码的一部分,是不能轻易修改的,为此博主实现了在不改模型定义代码的前提下,修改模型结构。这些操原创 2022-07-06 23:17:00 · 636 阅读 · 1 评论 -
paddlepaddle 28 搭建基于卷积的自动编码机
自动编码机可以用于图像压缩、图像去噪等任务,其由编码器与解码器构成,其本质就是对数据做一道编码与解码。编码器的输出用于解码器的输入,在自动编码机中通常认为解码器功能是编码器的逆变换。如果编码与解码过程是近乎无损的,那就是图像压缩;如果压缩与解码的过程是有损的【并非真正有损,而是不一样】(比如:解码后的图像与原图相比更清晰,就是图像去噪、去雾、去雨;分辨率提升了,就是图像超分辨率重构)。解码无损的时候,也就是说做图像压缩,自动编码机的输入与输出都是一样的。解码有损的时候,也就是说做图像优化,自动编码机的输入与原创 2022-07-02 11:54:23 · 642 阅读 · 0 评论 -
paddlepaddle 27 支持任意维度数据的梯度平衡机制GHM Loss的实现(支持ignore_index、class_weight,支持反向传播训练,支持多分类)
GHM Loss是Focal loss的升级版,它对难样本进行了深入的分析,认为并非所有的难样本都值得关注。有一些难样本属于标签错误的,不应该进行加强。GHM Loss根据loss的梯度模长(1-softmax(x) , 既输出值的导数)区间统计频率,用频率的作为系数,调节梯度值。因此,在GHM Loss中bin的最大值是1,此时GHM loss与交叉熵是完全一样的。关于GHM Loss更多描述详细可以参考 Gpytorch 12 支持任意维度数据的梯度平衡机制GHM Loss的实现(支持ig原创 2022-06-11 22:02:41 · 721 阅读 · 0 评论 -
paddlepaddle 26 同时具备周期性与衰减性的学习率调度器
在我们熟知的学习率调度器中,有周期性调度器(单周期,多周期),也由衰减式调度器(按性能衰减,按epoch衰减)和预热式(学习率变化为低->高->缓慢变低)的。周期性调度器多学习率比较敏感,单可以跳过鞍点,尽可能找到鞍点;衰减式调度器,对学习率敏感度较低,但很难越过鞍点。为了结合这两个调度器的优势,博主对余弦退火重启动学习率和余弦式衰减的代码做了轻微修改,实现了周期性与衰减学习率调度器的结合。1、余弦退火重启动学习率衰减这里只实现了指数式衰减,参数中的eta_min是学习率最小值。c原创 2022-05-18 14:48:54 · 655 阅读 · 2 评论 -
paddlepaddle 25 Boundary Loss的实现(Boundary F1 loss)
目前有两篇学术中共有两篇论文以不同的形式提出了boundary loss,分别是论文1:Boundary Loss for Remote Sensing Imagery Semantic Segmentation 与论文2:Boundary loss for highly unbalanced segmentation 。论文1所提出的boundary loss即最小化label边缘与pred边缘的f-score(也就是dice loss),其项目地址如下所示。代码为pytorch版本,稍后博主会分享.原创 2022-04-26 20:02:01 · 2146 阅读 · 0 评论 -
paddlepaddle 24 实现余弦退火重启动学习率CosineAnnealingLRRestart
实现代码基于pytorch官方给出的CosineAnnealingLRRestart进行改写,从而实现paddle版的代码余弦退火重启动学习率的公式如下所示CosineAnnealingWarmRestarts — PyTorch 1.11.0 documentationhttps://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.CosineAnnealingWarmRestarts.html?highlight=cos.原创 2022-04-19 18:47:31 · 1674 阅读 · 0 评论 -
paddlepaddle 23 paddle内置的12种学习率调度器+OneCycleLR的调度曲线
目前在paddle中基于该基类,已经实现了12种策略,分别为:CosineAnnealingDecay, ExponentialDecay, InverseTimeDecay, LambdaDecay, LinearWarmup, MultiStepDecay, NaturalExpDecay, NoamDecay, PiecewiseDecay, PolynomialDecay, ReduceOnPlateau, StepDecay。除此之外,博主根据网上的代码整理出了OneCycleLR。基于此,博主对原创 2022-04-08 19:31:08 · 2016 阅读 · 0 评论 -
paddlepaddle 22 基于hook实现既插既用的dropout
1、paddle中支持的hook通过对paddle中api的查询,发现paddle的layer对象只在前向传播中支持两种hook,pre_hook和post_hook。pre_hook可以对层的输入变量进行处理,用函数的返回值作为新的变量参与层的计算。post_hook则可以对层的输出变量进行处理,将层的输出进行进一步处理后,用函数的返回值作为层计算的输出。paddle的tensor对象只支持反向传播hook,可以用于获取梯度值或返回新的梯度值。1.1layer中forward_pre_hook的.原创 2022-04-06 10:40:34 · 1879 阅读 · 0 评论 -
paddlepaddle 21 基于dropout实现用4行代码dropblock
dropblock的作用不在累述,这里只分享使用4行代码实现dropblock。dropblock的介绍可以参考博主的另一篇文章pytorch 22 8种Dropout方法的简介 及 基于Dropout用4行代码快速实现DropBlock_万里鹏程转瞬至的博客-优快云博客1、基本库方法实现这里主要实现三个函数,图片展示、图片读取和tensor转imgfrom PIL import Imagefrom matplotlib import pyplot as pltimport paddle原创 2022-04-05 09:59:17 · 3619 阅读 · 0 评论 -
paddlepaddle 20 指数移动平均(ExponentialMovingAverage,EMA)的实现与使用(支持静态图与动态图)
指数移动平均(ExponentialMovingAverage,EMA)是以指数式递减加权的移动平均,每一次更新都对上一次保留的权重按照decay进行衰减。其计算方式为pram_n''=(pram_n''-1)*decay+(1-decay)*pram_n,其中pram_n''为EMA保存的在n步时的权重,pram_n为算法正常计算得出的权重。EMA是一个不断迭代的运算方式,在第n步时,第k次更新参数被衰减了decay^(n-k)倍。EMA本质就是一种学习率衰减的策略,具体可见博客(https://www原创 2022-03-29 20:29:10 · 2015 阅读 · 0 评论 -
paddlepaddle 19 动态修改模型的最后一层
在进行迁移学习时,通常需要修改模型的最后一层,按照需求重新进行定义。但是,迁移学习需要在众多的模型中进行对比实验,而定义最后一个layer时,需要知道layer的name,和layer输入数据的shape,也就是需要对model的layer进行遍历。1、遍历model通过以下代码可以遍历modelimport paddle#print('飞桨框架内置模型:', paddle.vision.models.__all__)model=paddle.vision.resnet18()laye.原创 2022-03-24 18:36:03 · 4894 阅读 · 0 评论 -
paddlepaddle 18 面向静态图的知识蒸馏实践(基于paddle2实现)
paddle2是动态图模型,为什么博主要基于paddle2实现静态图的知识蒸馏呢?当然是因为paddlehub中海量的预训练模型都是静态图的原因呀。首先通过对paddlehub的静态图模型进行迁移学习,可以得到一个性能优越的静态图模型。但是,这样的预训练模型通常在泛化能力和运行内存需求上还有待优化。通过使用知识蒸馏技术,将迁移学习模型作为教师模型,可以将其的性能迁移到学生模型中。对paddlehub的静态图模型进行迁移学习的教程可以参考paddlepaddle 17 迁移学习-图像分类实战四 基于paddl原创 2022-03-10 15:54:29 · 1485 阅读 · 0 评论