恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

大米图像分类数据集实战:从迁移学习到数据增强的完整指南

  • 首页
  • 资讯中心
  • /
  • 大米图像分类数据集实战:从迁移学习到数据增强的完整指南

相关资讯

宠物领养系统毕设源码拆解:SpringBoot3+Vue3前后端分离实战解析 2026/10/7 16:50:12
Ubuntu安装Docker太慢?阿里云镜像源配置与加速实战 2026/10/7 16:50:12
GPU内核模式驱动实战:从命令提交到设备移除的排查指南 2026/10/7 16:45:12

最新资讯

JavaWeb求职就业系统:从环境配置到二次开发全解析
网页小游戏工程化:零依赖、P2P同步与Shadow DOM实践
代理被封后DNS隧道逃逸:原理、检测与防御实战
Kimi K2.5 + Claude Code 实测:把 settings 改到 TaoToken 的完整配置记录
OpenClaw知识库管理实战:从分块、向量化到检索调优
轻型AI中台:解决财务与运营跨系统重复录入和对账困难

今日推荐

SSD不认盘怎么修?金士顿SV300板级排查与短接ROM进工厂模式
Unity 3D RPG开发:C#状态机与物理更新时机实战指南
AIoT开发工程师岗位全景:从嵌入式Linux到边缘计算与端侧AI部署

本周热门

MR25H40CDF + PIC18F65K40:工业记录仪高可靠存储实战
基于STM32的数控恒压恒流电源设计:从硬件到PID调参全解析
LT9211 MIPI重定时器原理与双路扇出实战指南

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

大米图像分类数据集实战:从迁移学习到数据增强的完整指南

发布时间:2026/10/7 16:50:12
大米图像分类数据集实战:从迁移学习到数据增强的完整指南 简介面向图像分类任务的大米品种数据集涵盖Arborio、Basmati、Ipsala、Jasmine、Karacadag五个不同类别据描述完整的标注图像规模约七万五千张。数据已经过预处理可直接作为分类网络的输入适用于机器学习与计算机视觉方向的初学者、研究者以及相关课程教学演示。资源包采用7z压缩格式共包含2000个文件主体为1998张JPEG图片另有1个Python可视化脚本和1个JSON标签配置文件打包后总大小约143.85MB。目前已有174人学习使用。该数据集预先划分了训练集与测试集各类别图片独立存放便于直接进行训练与评估运行show脚本可快速预览样本辅助理解数据分布和标注结构。作者博客还提供了图像分类网络改进及完整计算机视觉项目的参考适合希望从数据准备、模型搭建到调优实践全流程学习与应用的开发者。1. 大米图像分类数据集75,000张标注图背后的问题、价值与适用边界做图像分类的工程师拿到“五个不同品种的大米图像分类数据集【已标注约75,000张数据】”这类资源时第一反应不是“能训练模型了”而是“这数据到底能不能用、精度上限在哪、会不会翻车”。75,000张标注图对一个五分类任务来说绝对够用但关键从来不在于总量而在于类别的均衡性、图像采集环境的一致性、以及标注噪声的比例。这个数据集的直接价值是省掉了从零采集和标注的几周时间你拿到手就能进入模型设计和调参阶段它适合做迁移学习 baseline、数据增强策略验证、以及小样本条件下的分类器对比。但它不是万能药——如果你的目标场景是手机拍照识别不同米粒而数据集里的图像是纯色背景俯拍那分布差异会让你在真实场景上精度骤降。所以这篇文章会从数据目录结构、训练复现、参数设置、踩坑排查一路讲到落地验证把这条链路完整走一遍。2. 读懂数据集结构五类品种、目录组织与标注格式的检查清单2.1 图像分类数据集的三种常见组织方式以及这个数据集最可能的形态图像分类数据集的目录组织方式直接决定你写 DataLoader 时的工作量。从业界惯例来看最常见的是按类别分文件夹train/品种A/*.jpg、val/品种B/*.jpg这种结构配合torchvision.datasets.ImageFolder就能直接读取省去写 CSV 解析的麻烦。第二种是扁平目录加一个标注 CSV文件名到标签的映射关系全在表格里灵活性高但需要自己写映射逻辑。第三种是 JSON 或 TXT 格式的标注文件每行是“路径 标签”多见于从检测数据集裁剪出来的子集。对于标题里提到的“已标注”大米数据集我倾向于认为它是按文件夹组织的——这是绝大多数农业图像分类数据集的默认形态因为采集和标注时通常是先按品种分袋拍照再统一整理。拿到数据后的第一步永远是tree或find看一眼目录深度和文件命名规律而不是急着训练这一步能帮你避开后续所有路径相关的坑。2.2 检查标注质量的五个维度文件名、类别名、图像尺寸、EXIF 与损坏文件标注不是说有标签就行而是要确认标签与图像内容真的对应。第一个检查点是类别名的语义五个品种的文件夹名如果是中文拼音changliangyou、jingliangyou需要确认映射关系避免训练时把标签索引搞错。第二个是图像尺寸分布用 Python 脚本扫一遍所有图片的宽高如果出现 800×600 和 4000×3000 混存的情况意味着采集设备不统一后续需要统一 resize 策略。第三个是损坏文件偶尔会有 0 字节文件或截断的 JPEGDataLoader 一读到就报错必须在训练前清洗掉。第四个是 EXIF 信息手机拍摄的图片会带旋转方向标签某些库读取时会自动旋转某些不会这会导致同一个品种的图片方向不一致影响分类效果。第五个是标注文件的编码格式CSV 如果是 GBK 编码而代码用 UTF-8 读取中文文件名会直接乱码。这五关过完你才算真正“拥有”了这个数据集。# 一键检查目录结构、文件数量与图片尺寸分布 find ./rice_dataset -type f -name *.jpg | wc -l find ./rice_dataset -type d | sort python -c from PIL import Image import os from collections import Counter sizes Counter() total 0 broken [] for root, dirs, files in os.walk(./rice_dataset): for f in files: if not f.lower().endswith((.jpg, .jpeg, .png)): continue path os.path.join(root, f) total 1 try: with Image.open(path) as img: sizes[img.size] 1 except Exception: broken.append(path) print(总文件数:, total) print(尺寸分布:, sizes.most_common(10)) print(损坏文件数:, len(broken)) 这段脚本的作用是在动手训练之前用五分钟摸清数据集的三个底细文件总数是否和标题描述一致、有没有异常尺寸混入、损坏文件有多少。Image.open不会真正解码图像数据所以速度很快几千张图几秒就能扫完。如果你的数据集里 PNG 和 JPEG 混存建议统一转成 JPEG 格式因为 PNG 的无损压缩对大米纹理这种细节帮助有限但会显著增加磁盘 IO 和训练时间。损坏文件建议直接移动到broken/目录而不是删除方便追溯。2.3 五类品种的类目均衡性长尾分布会让准确率虚高很多号称“分类数据集”的资源实际各类别数量差异极大。比如五类大米中某一种因为采集方便占了 40% 的样本另一种只有 8%。这时候直接训练模型会通过“猜多数类”获得虚高的准确率——比如全猜 A 类也能有 40% 的正确率看起来不错实际毫无用处。正确的做法是训练前按类别统计样本数计算不平衡比max_count / min_count如果大于 3 就要考虑采样策略了。常见做法是做类别加权采样让每个 batch 里五类样本数量接近。torch.utils.data.WeightedRandomSampler是标准工具权重设置为核心类别的样本数倒数再归一化。另外要注意75,000 张如果平均分配每类 15,000 张这对五分类任务属于“充裕”级别但如果分布极不均衡先考虑分层采样切分 train/val保证验证集里每类的比例和训练集一致否则验证集的指标会失真。3. 用迁移学习在本地跑通大米分类ResNet50 与 EfficientNet 的最小命令3.1 为什么迁移学习是这个数据集的最优解而不是从零训练75,000 张图听起来很多但对于 ImageNet 级别的深度模型来说仍然不够。从零训练一个 ResNet50 在 ImageNet 上需要 120 万张图你只有它的 1/16强行从零训练必然过拟合。迁移学习的思路是加载在 ImageNet 上预训练好的权重把最后一层全连接替换成五分类输出然后冻住前面大部分层只微调最后几层和新增的分类头。大米图像和 ImageNet 里的物体在浅层特征边缘、纹理、颜色块上有高度共性所以预训练特征完全可以直接复用。对于这个数据集我一般会先试 ResNet50——它在中等规模数据上表现稳定且训练速度快然后再对比 EfficientNet-B3 这种参数效率更高的模型。如果机器只有单张消费级 GPU8GB 显存ResNet50 配 batch size 32 和 224×224 输入完全跑得动如果只有 CPU建议先用 ResNet18 做一次 smoke test 确认代码没问题再上大模型。3.2 PyTorch 迁移学习训练脚本完整可跑的代码与参数说明import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms, models from torch.utils.data import DataLoader # 数据增强与归一化配置 train_transform transforms.Compose([ transforms.Resize(256), transforms.RandomResizedCrop(224, scale(0.5, 1.0)), transforms.RandomHorizontalFlip(), transforms.RandomRotation(15), transforms.ColorJitter(brightness0.2, contrast0.2, saturation0.2, hue0.05), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) val_transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) # 假设数据目录结构是 train/类别/*.jpg, val/类别/*.jpg train_ds datasets.ImageFolder(./rice_dataset/train, transformtrain_transform) val_ds datasets.ImageFolder(./rice_dataset/val, transformval_transform) train_loader DataLoader(train_ds, batch_size32, shuffleTrue, num_workers4, pin_memoryTrue) val_loader DataLoader(val_ds, batch_size32, shuffleFalse, num_workers4, pin_memoryTrue) # 加载预训练 ResNet50替换分类头 model models.resnet50(weightsmodels.ResNet50_Weights.IMAGENET1K_V1) num_features model.fc.in_features model.fc nn.Linear(num_features, 5) # 冻结除最后两层外的所有参数 for name, param in model.named_parameters(): if layer4 not in name and fc not in name: param.requires_grad False model model.cuda() criterion nn.CrossEntropyLoss() # 只传需要梯度的参数给优化器 optimizer optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr1e-4, weight_decay1e-4) scheduler optim.lr_scheduler.StepLR(optimizer, step_size5, gamma0.5) best_acc 0.0 for epoch in range(15): model.train() train_loss 0.0 for inputs, labels in train_loader: inputs, labels inputs.cuda(), labels.cuda() optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, labels) loss.backward() optimizer.step() train_loss loss.item() * inputs.size(0) scheduler.step() # 验证阶段 model.eval() correct 0 total 0 with torch.no_grad(): for inputs, labels in val_loader: inputs, labels inputs.cuda(), labels.cuda() outputs model(inputs) _, preds torch.max(outputs, 1) correct (preds labels).sum().item() total labels.size(0) acc correct / total print(fEpoch {epoch1:02d} | Train Loss: {train_loss/len(train_ds):.4f} | Val Acc: {acc:.4f}) if acc best_acc: best_acc acc torch.save(model.state_dict(), ./best_rice_model.pth)这段代码的核心策略是分层冻结微调layer4和fc保持可训其余层的预训练权重直接冻结。这个选择有依据——layer1到layer3学到的是通用边缘和纹理特征对大米和 ImageNet 物体都适用layer4学到的是更抽象的语义特征需要针对大米纹理做适配。学习率设为1e-4而不是默认的1e-3因为预训练权重已经很接近最优点学习率太大会破坏已有特征。StepLR每 5 个 epoch 把学习率减半是为了在训练后期精细收敛。RandomResizedCrop的scale(0.5, 1.0)是让模型看到不同尺度下的米粒增强尺度不变性。如果你发现验证集精度在第 8 个 epoch 后不再提升早停即可15 个 epoch 的上限在多数场景下足够。3.3 三组关键超参数输入分辨率、冻结层范围与学习率输入分辨率对大米分类的影响超出很多人的直觉。224×224 是 ImageNet 的标准尺寸但米粒的品种差异体现在粒型、垩白度和纹理细节上这些属于高频信息。如果你的数据集原始图像是 1000×1000 以上224×224 相当于丢弃了大量细节。我建议至少做一次 384×384 的对比实验——显存够的话用 384甚至 512分类精度可能提升 2-3 个百分点。冻结层范围的调整路径是先冻结layer3之前所有层训练到验证精度不再上升然后解冻layer3和layer4把学习率降到5e-5继续训练。这种两阶段微调比一次解冻全部层要稳得多不容易把预训练特征冲掉。学习率的设置上如果 loss 在第一个 epoch 就剧烈震荡说明学习率过高如果 loss 下降极慢考虑把冻结层解冻一部分。这三个参数是迁移学习中最值得花时间调的比换模型架构的影响更大。4. 数据增强策略让 75,000 张大米图发挥最大效力的四个关键操作4.1 增强不是越多越好针对大米图像的分布特征做选型大米图像和自然图像不同——没有“上下”的语义概念旋转 180 度依然是合法样本但自然图像里的物体旋转 180 度通常是异常的。这意味着你可以更大胆地用旋转增强。但另一方面大米图像的背景通常是深色或白色的容器颜色分布单一如果增强时把ColorJitter的强度调太大会把浅黄和深黄的品种差异抹平直接导致分类混淆。所以增强策略必须围绕“保留品种判别性特征”来做。我常用的增强组合是随机旋转 ±30 度、水平/垂直翻转、随机裁剪、轻微亮度和对比度扰动。其中随机裁剪用的是RandomResizedCrop而不是RandomCrop因为前者会把裁剪区域放缩到固定尺寸等价于尺度增强更符合米粒在图像中大小不一的情况。这里的血泪经验是不要一上来就堆RandomErasing或CutMix这类强增强先跑一个弱增强 baseline确认模型没有欠拟合后再逐步加强——否则你无法判断精度变化是增强的功劳还是模型自身的问题。4.2 类别不平衡的补救加权采样与 Focal Loss 的适用边界五类大米样本数如果出现明显不均衡比如某类只有 6,000 张其余每类 16,000 张CrossEntropyLoss会因为多数类的梯度主导而忽视少数类。这里有两种补救路径。路径一是改采样器WeightedRandomSampler让每个 epoch 中每类被抽中的概率均衡相当于让少样本类被“重复看到”。路径二是改损失函数FocalLoss对易分类样本降低权重把训练重心推向难分类样本。两条路可以组合但要注意——如果你的数据集里少数类本身标注质量就差比如图像模糊、光线不足加权只会让模型在质量差的数据上过拟合。我的建议是先做类别加权采样不动损失函数。因为换损失函数会影响所有类的梯度分布让验证精度曲线变得不稳定排查起来更费劲。在 PyTorch 中加权采样的实现方式是传入WeightedRandomSampler给DataLoader权重的计算逻辑是1.0 / 每类样本数然后所有权重归一化。from torch.utils.data import WeightedRandomSampler import numpy as np # 统计每类样本数并生成每个样本的采样权重 labels np.array([train_ds.targets]) class_counts np.bincount(labels.flatten()) weights 1.0 / class_counts[labels.flatten()] weights torch.DoubleTensor(weights) sampler WeightedRandomSampler( weights, num_sampleslen(train_ds), # 每个 epoch 采样总数保持和数据集大小一致 replacementTrue ) train_loader DataLoader( train_ds, batch_size32, samplersampler, # 使用 sampler 时不能设置 shuffleTrue num_workers4, pin_memoryTrue )这段代码的关键在replacementTrue——它允许同一张图在一个 epoch 内被重复采样这正是加权采样的核心机制。num_samples通常设为数据集总长度这样每个 epoch 的迭代次数和原来保持一致训练时间不会翻倍。要注意的是sampler和shuffleTrue互斥DataLoader会直接报错所以只能保留一个。实际使用中如果某些类别的样本数过少加权采样会让这些图在每轮都被重复读取此时你可以考虑把它们做额外的离线增强比如旋转多个角度各存一份而不是完全依赖在线采样。4.3 MixUp 与 CutMix什么时候值得用在大米分类上MixUp 的思路是把两张训练图按比例混合标签也按同样比例混合相当于在样本之间做线性插值。CutMix 则是把一张图的一块区域替换成另一张图的区域标签按面积比例混合。这两种方法都能显著提升模型的泛化能力特别是在图像数量有限时但对大米分类的适用性需要斟酌。大米图像的判别区域是米粒本身如果背景占比大MixUp 混合后模型可能学到“背景颜色混合”这种无意义特征。CutMix 把一张图的米粒区域直接贴到另一张图上如果两张图的背景色不同会产生明显的拼接痕迹反而引入噪声。我的经验是先用完传统几何增强和颜色增强如果验证精度卡在某个值上不去再试 CutMix但要配合更长的训练轮次——这类强增强会让模型收敛变慢通常需要 2 倍于常规的 epoch 数。如果你用的是迁移学习且只微调最后几层建议先不要加 MixUp因为预训练特征在浅层已经够强加入了反而画蛇添足。5. 大米图像分类的避坑指南五个最常见的翻车现场与排查路径5.1 验证集精度高但实际推理效果差——分布偏移的锅现象模型在验证集上达到 98% 的准确率但用手机拍几张实际的米粒照片测试准确率跌到 70% 以下。原因数据集里的图像是实验室固定光源、统一背景下拍的而实际场景的光照、角度、容器颜色完全不同。这是典型的训练/测试分布偏移模型学到的特征与背景有关而不是与米粒纹理有关。解决先观察验证集图像与实际图像的差异。如果差异主要来自背景尝试在训练时加入背景替换增强——用随机纯色或纹理背景替换原图背景逼模型聚焦米粒本身。如果差异来自光照加入更激进的ColorJitter参数brightness 范围扩大到 0.4并做归一化时用数据集自己的均值和方差而不是 ImageNet 的。另外收集少量50-100 张真实场景图像加入训练集往往是性价比最高的做法。5.2 loss 在训练初期就剧烈震荡——学习率过高或归一化失效现象第一个 epoch 的 loss 从 1.8 跳到 5.2 又跳回 1.5完全不稳定。原因最常见的问题是Normalize层的均值和方差设置不对。如果数据的分布和 ImageNet 差距很大比如大米图像整体偏亮、RGB 值集中在高亮度区强行用 ImageNet 的归一化参数会让输入特征分布异常梯度更新失去方向。另一个原因是学习率1e-4对某些优化器来说仍然偏高尤其是在 batch size 较小时。解决先关闭归一化跑 5 个 epoch如果 loss 稳定说明是归一化参数的问题——改用数据集的均值方差。如果还是震荡把学习率降到1e-5再做一轮验证。还有一个容易忽略的点检查 DataLoader 是否在同一 batch 中混入了不同方向或不同色彩空间的图比如有的图是 BGR 有的图是 RGB。5.3 训练集精度高、验证集精度低——过拟合的判定与缓解现象训练精度到达 99.9%但验证集精度停留在 90% 左右且随训练轮次提升越来越明显。原因模型参数过多而数据多样性不足或者正则化不够。75,000 张图不算少但如果五类品种之间的纹理差异极小比如两个品种只是垩白度略有不同模型就可能记住了训练集的噪声细节。解决先加weight_decayL2 正则化从1e-4往上调到1e-3观察验证精度的变化。然后尝试Dropout层虽然 ResNet 里没有标准的 Dropout但可以在全局平均池化后加一个p0.5的 Dropout。最后把数据增强中的RandomResizedCrop的scale下限降到0.3强制模型学习更大范围的尺度变化。5.4 五类品种的混淆矩阵显示两个类互相认错——采集条件差异太大现象混淆矩阵显示品种 A 有 12% 的样本被预测为品种 B而品种 C 和 D 完全没有混淆。原因品种 A 和 B 的图像可能来自不同批次——比如 A 的图像一部分是白炽灯下拍的、一部分是自然光下拍的白炽灯下的 A 和自然光下的 B 纹理看起来非常接近。这本质上是数据集的底层偏差不是模型的问题。解决先按采集批次或拍摄条件给样本分组统计不同批次下两个品种的预测准确率差异。如果确认是光照差异用颜色校正预处理把图像统一到标准色温或者把每张图的 RGB 直方图均衡化。这个问题的根源是数据集设计时的混淆变量需要在数据层面做消除。5.5 验证集指标波动极大——数据划分的随机性陷阱现象每次跑验证准确率在 90% 到 96% 之间随机跳动无法确定模型真实的泛化水平。原因验证集只有几百张图且划分不均衡——比如某个品种在验证集里只有 20 张错 3 张就是 15% 的精度波动。解决重新划分验证集保证每类不少于 500 张并设置固定的随机种子random.seed(42)和torch.manual_seed(42)。在最终评估时用 K 折交叉验证中效果最好的模型或者多次重复实验取均值。做对比实验时固定验证集非常重要——否则你无法判断精度的提升是来自模型的改动还是验证集选取的运气。6. 从分类到落地混淆矩阵、置信度阈值与误判成本的验证技巧模型训练完成只是起点真正决定这个数据集有没有价值的是“模型在真实世界中能不能用”。我习惯做三件收尾的事。第一件是绘制五类品种的混淆矩阵——不是看对角线上的数字而是看非对角线元素集中在哪些类之间。如果 A 和 B 的混淆集中在某个特定角度或光照条件下说明需要补拍这类图像而不是盲目加数据。第二件是计算每个样本的置信度分布——softmax 输出的最大概率值。如果大量正确样本的置信度在 0.5-0.7 之间说明模型对多数样本都不够确信部署时你需要设定一个置信度阈值低于阈值的样本不自动判定转人工或二次识别。这个阈值怎么选我在实际项目中通常用验证集画出“置信度-准确率”曲线选择准确率达到 98% 以上对应的最小置信度作为阈值。第三件是做一个极小规模的测试集外部验证——找 200 张不在训练集和验证集中的真实环境图像手动标注测一次端到端的准确率和延迟。这三件事做完你才算把数据集的价值真正兑现了。另外要留意模型在 CPU 上的推理速度。如果你部署目标是手机或工业设备ResNet50 的参数量2550 万和计算量41.2 亿 FLOPs可能过大此时用 MobileNetV3 或 EfficientNet-Lite 做一次蒸馏或直接训练对比精度损失是否可以接受。数据集的图像分辨率如果很高比如 4000×3000你还可以做一个预处理步骤先跑一个轻量的图片裁剪模型把米粒区域框出来再送进分类模型——这样能减少背景干扰。我个人的经验是大米分类这种颗粒属性识别任务的精度上限由数据决定的成分占七成由模型决定的只占三成。如果你的数据集中品种内差异大、品种间差异小再好的模型也救不回来反过来如果数据集干净且类间差异明显简单的 ResNet18 微调就能到 97% 以上。所以拿到数据集后先花一天时间做可视化分析用 t-SNE 或 PCA 看看五类在特征空间里是否线性可分——如果可分模型的选型就不用纠结了如果纠缠在一起那重点放在数据增强和困难样本挖掘上。最后说一个我的个人习惯每做完一轮实验我都会把模型在五类品种上各自的查全率recall单独记录。平均值好看没有意义如果某类品种的查全率比其他类低 5 个百分点这个模型就不算合格。这类问题在数据集层面往往对应着某一类样本的拍摄角度或成熟度分布与其他类不一致你需要去翻它的原始图像找到视觉上为什么难分。这个习惯帮我在很多看似“已经完成”的项目里提前发现了潜在风险。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号