ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于YOLO与PyTorch的红枣目标检测:从数据标注到Web部署全流程实践

基于YOLO与PyTorch的红枣目标检测:从数据标注到Web部署全流程实践 简介本资源是一套面向计算机专业本科生的毕业设计完整实现方案聚焦农业智能化场景下的红枣图像识别问题适用于深度学习入门到进阶的学习者开展课程设计、毕设开发或算法实践。压缩包共906个文件涵盖197个GIF动图用于可视化训练过程与识别效果、305个PNG/JPG图像含原始与增强后红枣样本、148个JS及前端资源构建Web识别界面、83个Python脚本含数据预处理、模型训练、评估与部署代码以及SQL数据库与详细说明文档整体大小为433.36MB。已有634人下载学习资源结构严格对应论文六章逻辑从红枣特征分析、深度学习原理到数据集构建、CNN模型设计、训练优化及实验对比全部环节均提供可运行源码与实测结果。读者可直接复现端到端识别流程快速掌握图像分类项目落地的关键技术栈与工程规范。1. 项目概述从一颗红枣到一行代码又到了一年一度的毕业季相信不少计算机、人工智能相关专业的同学正在为毕业设计选题而挠头。选题既要体现技术深度又要有实际应用价值还不能过于复杂导致难以完成。如果你正在寻找这样一个“甜点级”项目那么“基于深度学习的红枣识别算法”绝对值得你仔细考虑。这不仅仅是一个简单的图像分类任务它背后涉及了从数据采集、模型选型、训练调优到最终部署落地的完整AI项目流程堪称一个微缩版的工业级计算机视觉应用。简单来说这个项目的目标就是教会计算机“看”懂一张图片里有没有红枣或者在一堆水果、农产品中准确地找出红枣。别小看这个任务它直接关联着农产品自动化分拣、智能零售结算、食品质量检测等多个热门应用场景。想象一下在红枣加工厂一条高速传送带上成百上千颗红枣混合着枝叶、石子快速通过传统的靠人眼分拣效率低、成本高而一个稳定、准确的识别算法配合机械臂就能实现7x24小时不间断的自动化作业。这就是我们做这个项目的现实意义。整个项目将围绕Python生态展开这是当前AI领域毋庸置疑的“第一语言”。我们会使用主流的深度学习框架如PyTorch或TensorFlow/Keras来构建和训练模型用OpenCV等库进行图像预处理最终得到一个可以接收图片并输出识别结果的完整程序。源码、训练好的模型、用于测试的数据库图像数据集以及详细的说明文档共同构成了一个合格的毕业设计交付物。接下来我将以一个“过来人”和项目实践者的角度为你拆解这个项目的每一个关键环节分享那些在教科书和官方文档里不会写的实操细节和避坑指南。2. 核心需求解析与技术选型在动手写第一行代码之前我们必须把项目的“边界”和“骨架”定义清楚。一个模糊的目标会导致后续开发过程反复摇摆浪费大量时间。2.1 需求定义我们要识别什么样的“红枣”“红枣识别”听起来简单但具体需求不同技术方案的复杂度天差地别。我们需要明确以下几点识别粒度分类Classification给定一张只包含单个目标的图片判断它是不是红枣。这是最简单的基础任务。目标检测Object Detection给定一张可能包含多个目标、复杂背景的图片如一堆散装红枣、带有枝叶的红枣不仅要判断有无红枣还要用矩形框Bounding Box标出每个红枣的位置。这更贴近实际分拣场景。实例分割Instance Segmentation在目标检测的基础上进一步精确勾勒出每一个红枣的轮廓像素。这对于需要精确计算面积、判断表面瑕疵如裂纹、霉变的高级应用是必要的。对于大多数毕业设计而言目标检测是一个理想的折中点。它比分类更有挑战性和展示度又比实例分割更容易实现和训练。我们的后续讨论将主要围绕目标检测展开。场景与挑战背景复杂度是在干净的白色背景板上识别还是在田间、加工车间、零售货架等复杂背景下识别红枣状态识别的是干燥的红枣、新鲜的红枣还是带枝叶的红枣不同状态下的颜色、纹理、形状差异巨大。遮挡与重叠红枣之间是否会相互堆叠、部分遮挡光照变化拍摄环境的光照是否稳定是否需要处理过曝、阴影等问题明确这些有助于我们设计数据采集方案和图像增强策略。2.2 技术栈选型为什么是它们基于上述需求我们的技术选型几乎有了标准答案编程语言Python理由生态无敌。从数据爬取/处理Requests, BeautifulSoup, Pandas, OpenCV到模型构建/训练PyTorch, TensorFlow再到可视化Matplotlib, Seaborn和部署Flask, FastAPIPython拥有最全面、最成熟的库支持。社区活跃遇到任何问题几乎都能找到解决方案。深度学习框架PyTorch 或 TensorFlow/KerasPyTorch研究导向动态图机制让调试非常直观代码写法更“Pythonic”。对于需要快速实验、理解模型细节的毕业设计非常友好。近年来在工业界的应用也越来越广泛。TensorFlow/Keras工业部署生态更成熟静态图性能优化好。Keras API 极其简洁适合快速原型开发。个人建议如果你是深度学习新手希望更关注算法逻辑而非框架细节PyTorch是更好的起点。它的学习曲线相对平缓且能让你更深刻地理解训练流程。本文后续示例将主要使用PyTorch。目标检测模型选型两阶段检测器如Faster R-CNN精度高但速度相对慢。适合对精度要求极高、对实时性要求不高的场景如离线质检。单阶段检测器如YOLO系列、SSD速度快精度也能满足大部分应用。是当前工业界的主流选择。对于毕业设计YOLOv5/v8是绝佳选择。它们不仅有出色的速度和精度平衡更重要的是开源社区提供了极其完善的代码库和预训练模型从训练到部署的脚本一应俱全能让我们把精力集中在数据和应用逻辑上而不是重复造轮子。YOLOv5的PyTorch实现非常清晰易于理解和修改。辅助工具库OpenCV图像处理的“瑞士军刀”用于图像的读取、显示、缩放、颜色空间转换、增强等。Albumentations功能强大的图像增强库专门为深度学习设计支持与检测框Bounding Box同步变换是构建鲁棒模型的关键。LabelImg或CVAT用于手动标注图像生成PASCAL VOC或COCO格式的标注文件。Flask/FastAPI用于将训练好的模型封装成Web API提供远程调用接口完成一个简易的演示系统。注意技术选型没有绝对的对错只有适合与否。选择YOLOPyTorch的组合能确保你在有限的时间内最大概率地完成一个效果不错、流程完整的项目。3. 数据项目的基石与第一个拦路虎“数据决定模型的上限算法只是逼近这个上限”。在深度学习项目中数据工作的耗时往往占整个项目的60%以上。3.1 数据采集与制作来源网络爬取从百度图片、电商平台红枣商品图等渠道爬取。注意版权和图片质量。公开数据集搜索是否有相关的农产品、水果检测数据集。虽然专门的红枣数据集很少但可以找类似物体如圆形、深色水果的数据集进行迁移学习。自行拍摄这是最推荐、质量最可控的方式。购买不同品种、不同状态的红枣在多种背景白板、木桌、传送带模拟背景、多种光照自然光、室内光、侧光下进行拍摄。确保图片数量和质量。数据量要求对于目标检测要想得到一个泛化能力不错的模型至少需要500-1000张标注图片。如果条件允许越多越好。数据标注工具使用LabelImg本地工具或CVAT支持Web进行标注。标注时用矩形框紧密地框住整个红枣。格式统一使用一种格式。YOLO格式[class_id, x_center, y_center, width, height]坐标和尺寸均为相对于图片宽高的归一化值因其简洁而最常用。标注文件通常为.txt与图片同名。标注质量框要准不要包含太多背景所有可见的红枣都要标出即使被部分遮挡对于严重遮挡小于1/3的小目标可根据需求决定是否标注。标注的一致性至关重要最好由同一个人完成或制定明确的标注规范。3.2 数据预处理与增强原始数据很少能直接送入模型训练预处理和增强是提升模型鲁棒性的关键。预处理统一尺寸YOLO模型通常要求输入图片尺寸为固定大小如640x640。需要使用OpenCV进行等比例缩放并填充Padding避免图像变形。归一化将像素值从0-255缩放到0-1之间或进行标准化减均值除标准差有助于模型稳定训练。数据增强Data Augmentation 这是防止过拟合、让模型适应各种真实场景的“魔法”。使用Albumentations可以轻松实现。import albumentations as A transform A.Compose([ A.RandomBrightnessContrast(p0.5), # 随机亮度对比度 A.HorizontalFlip(p0.5), # 水平翻转 A.Rotate(limit15, p0.5), # 随机旋转 A.Blur(blur_limit3, p0.3), # 轻微模糊模拟运动或失焦 A.CLAHE(p0.3), # 限制对比度自适应直方图均衡化 A.RandomResizedCrop(height640, width640, scale(0.8, 1.0), p0.5), # 随机裁剪缩放 ], bbox_paramsA.BboxParams(formatyolo, label_fields[class_labels]))核心思想模拟真实世界可能出现的各种情况。红枣在传送带上可能旋转、有反光、有轻微运动模糊。注意事项增强不宜过强避免生成完全不合理的图像如旋转90度后红枣“站”起来了。同时必须确保图像变换时其对应的检测框也进行同步且正确的变换Albumentations的bbox_params参数完美解决了这个问题。数据集划分 将标注好的数据按7:2:1或8:1:1的比例随机划分为训练集Train、验证集Validation和测试集Test。训练集用于模型参数更新。验证集用于在训练过程中监控模型表现调整超参数如学习率进行早停Early Stopping以防止过拟合。测试集在最终模型训练完成后仅使用一次用于客观评估模型的泛化能力反映其真实水平。切记不要用测试集参与任何形式的模型选择或调参4. 模型训练与调优实战数据准备就绪后就进入了核心的模型训练环节。这里以YOLOv5为例因为它生态完善能让我们快速上手。4.1 环境搭建与YOLOv5部署创建虚拟环境强烈推荐conda create -n red_date_detection python3.8 conda activate red_date_detection克隆YOLOv5仓库并安装依赖git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt这将会安装PyTorch、TorchVision以及其他所有必需的库。4.2 准备数据集配置文件YOLOv5需要你按照特定格式组织数据并创建一个描述数据集的.yaml文件。目录结构red_date_dataset/ ├── images/ │ ├── train/ # 训练图片 │ ├── val/ # 验证图片 │ └── test/ # 测试图片可选YOLO训练不强制 └── labels/ ├── train/ # 训练标签 (.txt文件) ├── val/ # 验证标签 └── test/创建数据集YAML文件(red_date.yaml)# 数据集路径相对于yolov5目录 path: ../red_date_dataset train: images/train val: images/val # test: images/test # 可选 # 类别数 nc: 1 # 类别名称列表 names: [red_date]4.3 启动训练YOLOv5提供了非常方便的训练脚本。我们可以从预训练模型开始进行迁移学习这能极大加快收敛速度并提升最终性能。python train.py --img 640 --batch 16 --epochs 100 --data red_date.yaml --weights yolov5s.pt --project runs/train --name exp1--img 640: 输入图像尺寸。--batch 16: 批次大小。根据你的GPU显存调整如8G显存可能只能设8或4。如果出现CUDA out of memory错误就减小这个值。--epochs 100: 训练轮数。通常需要几十到上百轮。--data red_date.yaml: 指定我们刚才创建的数据集配置文件。--weights yolov5s.pt: 指定预训练模型。yolov5s.pt是“小”模型速度快适合快速验证和部署。还有yolov5m.pt中、yolov5l.pt大、yolov5x.pt超大模型越大精度可能越高但速度越慢所需显存越多。--project和--name: 指定训练日志和模型保存的目录。4.4 训练过程监控与调优训练开始后YOLOv5会在runs/train/exp1目录下生成大量有用的文件和可视化结果。查看训练日志终端会实时输出损失loss和评估指标mAP0.5等。使用TensorBoard可视化tensorboard --logdir runs/train然后在浏览器打开localhost:6006你可以看到损失曲线、精度曲线、验证集上的预测样例等这是分析模型训练状态最直观的工具。关键指标解读损失box_loss, obj_loss, cls_loss应随着训练轮数增加而稳步下降并趋于平缓。如果损失剧烈震荡或上升说明学习率可能太大或数据有问题。mAP0.5在交并比IoU阈值为0.5时的平均精度均值。这是目标检测的核心指标值越接近1越好。主要看其在验证集上的表现。Precision精确率 Recall召回率精确率模型预测为红枣的框中有多少是真正的红枣。高精确率意味着“找得准”误报少。召回率所有真实的红枣中有多少被模型找出来了。高召回率意味着“找得全”漏报少。通常两者需要权衡Precision-Recall曲线。在我们的场景中如果用于自动分拣高召回率可能更重要因为宁可错抓误报也不能漏掉漏报一个红枣。调优策略学习率Learning Rate最重要的超参数。YOLOv5有自动调整学习率的策略通常不需要手动改。但如果训练不稳定可以尝试在命令中加上--lr0 0.01初始学习率进行微调。早停Early Stopping观察验证集mAP如果连续多个epoch如10-20个不再提升就可以手动停止训练防止过拟合。数据增强如果模型在训练集上表现很好但在验证集上差可能是过拟合。可以回到第3步增强你的数据增强强度或收集更多样化的数据。更换模型尺寸如果yolov5s精度达不到要求可以尝试yolov5m或yolov5l。反之如果速度是瓶颈可以坚持使用s版本。实操心得训练初期先用小模型yolov5s、少轮数如20-30轮跑一个快速实验确保整个数据管道和训练流程是通的。然后再用更长的轮数和更大的模型进行精细训练。这能帮你快速定位问题是出在数据、代码还是模型本身。5. 模型评估、测试与部署模型训练完成后我们得到了一个.pt文件如best.pt但这还不是终点。5.1 模型评估与测试使用YOLOv5自带的val.py脚本在独立的测试集上评估最终模型性能。python val.py --weights runs/train/exp1/weights/best.pt --data red_date.yaml --img 640 --task test这会生成详细的评估报告包括在测试集上的mAP、精确率、召回率等。这个报告的数字才是你写在毕业论文里的“模型性能”。同时脚本会生成一个val_batchX_pred.jpg的图片直观展示模型在测试集上的检测效果。仔细查看这些图片有没有明显的误检把其他圆形深色物体认成红枣有没有漏检特别是小目标、遮挡目标检测框的位置是否准确根据这些问题可以反思数据标注质量、数据增强策略是否需要调整。5.2 模型推理使用模型现在我们可以用训练好的模型对新图片或视频进行预测了。单张图片推理python detect.py --weights runs/train/exp1/weights/best.pt --source path/to/your/test_image.jpg --conf 0.25--conf 0.25: 置信度阈值。只有模型预测置信度高于此值的检测框才会被保留。可以根据实际需求调高更严格减少误报或调低更宽松提高召回。视频流或摄像头推理python detect.py --weights best.pt --source 0 # 0代表默认摄像头 python detect.py --weights best.pt --source path/to/video.mp4这可以用于实时演示。在Python代码中调用import torch model torch.hub.load(ultralytics/yolov5, custom, pathruns/train/exp1/weights/best.pt, force_reloadTrue) img path/to/image.jpg results model(img) results.show() # 显示图片 results.print() # 打印检测结果信息 # 获取检测结果数据框 pandas_df results.pandas().xyxy[0] print(pandas_df) # 包含框坐标、置信度、类别等信息这为你将模型集成到自己的应用程序中提供了极大的灵活性。5.3 简易Web API部署毕业设计演示系统为了给答辩老师一个直观的演示我们可以用Flask快速搭建一个Web应用允许用户上传图片并返回识别结果。创建Flask应用(app.py)from flask import Flask, request, render_template, jsonify import os from werkzeug.utils import secure_filename import torch from PIL import Image import json app Flask(__name__) app.config[UPLOAD_FOLDER] ./uploads app.config[ALLOWED_EXTENSIONS] {png, jpg, jpeg} # 加载模型 model torch.hub.load(ultralytics/yolov5, custom, path./best.pt) def allowed_file(filename): return . in filename and filename.rsplit(., 1)[1].lower() in app.config[ALLOWED_EXTENSIONS] app.route(/) def index(): return render_template(index.html) # 一个简单的上传表单页面 app.route(/predict, methods[POST]) def predict(): if file not in request.files: return jsonify({error: No file part}) file request.files[file] if file.filename : return jsonify({error: No selected file}) if file and allowed_file(file.filename): filename secure_filename(file.filename) filepath os.path.join(app.config[UPLOAD_FOLDER], filename) file.save(filepath) # 推理 results model(filepath) # 获取结果 detections results.pandas().xyxy[0].to_dict(orientrecords) # 生成带标注的结果图片 results_img_path os.path.join(app.config[UPLOAD_FOLDER], result_ filename) results.render() # 渲染框到图片 Image.fromarray(results.ims[0]).save(results_img_path) return jsonify({ detections: detections, result_image_url: f/uploads/result_{filename} }) return jsonify({error: File type not allowed}) if __name__ __main__: os.makedirs(app.config[UPLOAD_FOLDER], exist_okTrue) app.run(debugTrue, host0.0.0.0, port5000)创建前端页面(templates/index.html)!DOCTYPE html html headtitle红枣识别系统/title/head body h2上传红枣图片/h2 form action/predict methodpost enctypemultipart/form-data input typefile namefile acceptimage/* input typesubmit value识别 /form div idresult/div script // 这里可以添加Ajax代码来异步提交表单并显示结果图片和检测框信息 /script /body /html运行python app.py访问http://localhost:5000就能看到一个可以上传图片并显示识别结果的简易系统了。这足以让你的毕业设计演示环节非常出彩。6. 毕业设计文档与源码组织一个优秀的毕业设计除了可运行的代码和模型清晰规范的文档和源码结构同样重要。6.1 项目目录结构建议红枣识别系统/ ├── README.md # 项目总说明 ├── requirements.txt # Python依赖包列表 ├── data/ # 数据集或说明如何获取 │ ├── raw_images/ # 原始图片 │ ├── annotations/ # 标注文件 │ └── dataset.yaml # YOLO数据集配置文件 ├── src/ # 源代码 │ ├── data_preprocessing/ # 数据预处理脚本 │ │ ├── resize_and_pad.py │ │ └── split_dataset.py │ ├── training/ # 训练相关 │ │ ├── train.py (可调用yolov5官方train.py) │ │ └── custom_augmentation.py # 自定义数据增强 │ ├── inference/ # 推理与部署 │ │ ├── detect_image.py │ │ ├── detect_video.py │ │ └── web_api/ │ │ ├── app.py │ │ └── templates/ │ └── utils/ # 工具函数 │ ├── visualization.py # 可视化标注/结果 │ └── metrics_evaluation.py # 自定义评估脚本 ├── models/ # 训练好的模型权重 │ ├── best.pt │ └── last.pt ├── runs/ # 训练日志与结果由YOLOv5生成 │ └── train/exp1/... ├── docs/ # 文档 │ ├── 开题报告.pdf │ ├── 毕业论文.pdf │ ├── 外文翻译.pdf │ └── 答辩PPT.pptx └── results/ # 最终测试结果与样例输出 ├── test_set_predictions/ └── performance_report.pdf6.2 毕业论文核心章节要点你的毕业论文应该围绕这个项目展开以下是一些章节内容的建议绪论阐述研究背景农产品智能分拣、计算机视觉应用、研究意义红枣识别的价值、国内外研究现状简要综述目标检测算法发展以及本文的主要工作和结构安排。相关技术与理论详细介绍卷积神经网络CNN的基本原理、目标检测算法的演进从R-CNN到YOLO重点讲YOLO的核心思想、PyTorch框架概述以及数据增强、迁移学习等关键概念。系统分析与设计分析红枣识别的具体需求功能与非功能需求给出系统的总体设计框架数据流、模块划分并详细说明技术选型的理由。数据集构建与预处理这是体现你工作量的重点章节。详细描述数据采集过程、标注工具与方法、数据集的统计信息图片数量、类别分布、尺寸分布、数据预处理与增强的具体策略及实现代码。可以配上数据集的样例图片和增强效果对比图。模型训练与优化详细说明实验环境软硬件配置、YOLOv5模型的网络结构可以画图、训练参数的设置学习率、批次大小等、训练过程的监控附上损失曲线和mAP曲线图以及你进行的调优尝试和结果分析对比实验。系统实现与测试展示系统的最终实现包括核心代码片段如数据加载、模型推理、Web API、系统界面截图。设计详细的测试方案包括单元测试、功能测试和性能测试。用表格形式展示在测试集上的量化评估结果mAP, Precision, Recall, F1 Score并分析一些成功和失败的检测案例。总结与展望总结项目完成的工作、取得的成果达到了怎样的识别精度、项目的创新点与难点。客观分析当前系统的不足如对小目标、严重遮挡目标识别不佳在极端光照下性能下降等并提出未来可能的改进方向如尝试更先进的模型YOLOv8、引入注意力机制、收集更大规模的数据集、部署到嵌入式设备等。7. 常见问题与避坑指南在实际操作中你几乎一定会遇到下面这些问题。提前了解能帮你节省大量时间。7.1 训练过程中的问题CUDA out of memory (OOM)原因批次大小batch size或输入图像尺寸img size太大超出GPU显存。解决首先减小--batch-size如从16减到8、4。如果还不行减小--img-size如从640减到512。同时确保没有其他程序占用大量显存。Loss为NaN或突然变得巨大原因学习率过高数据有异常如标注文件格式错误坐标值超出0-1范围数据未做归一化。解决检查数据标注格式是否正确在数据加载部分加入检查打印出有问题的样本尝试使用更小的学习率--lr0确保输入数据经过了归一化YOLOv5内部会做但自己写预处理时要注意。mAP一直很低或不再提升原因数据量太少或质量太差数据增强过于激进导致图像失真模型复杂度与任务不匹配可能过于简单学习率策略有问题。解决首先检查数据确保标注正确无误。可视化一些训练样本和增强后的样本看是否合理。尝试关闭或减弱数据增强。换一个更大的模型如从s换到m。可以尝试使用--rect参数进行矩形训练减少填充加速训练。7.2 推理与部署中的问题模型推理速度慢原因模型太大如用了yolov5x输入图片尺寸太大在CPU上运行。解决换用更小的模型yolov5s甚至yolov5n减小推理时的--img-size确保在GPU环境下运行torch.cuda.is_available()返回True。对于最终部署可以考虑使用ONNX或TensorRT对模型进行加速。Web服务并发能力差原因Flask默认是单线程同步模型同时处理多个请求会阻塞。解决使用生产级WSGI服务器如gunicorn并配合多worker。或者使用异步框架如FastAPI并利用其异步特性。对于高并发场景需要考虑模型服务化Model Serving使用专门的推理服务器如TorchServe或Triton Inference Server。7.3 项目与论文相关数据集不够大解决除了自己拍摄可以尝试使用数据生成技术。例如使用抠图技术将红枣抠出来随机粘贴到不同的背景图片上生成大量合成数据。这能有效增加数据多样性。但要注意合成数据与真实数据的分布差异最终仍需用真实数据微调。如何体现工作量与创新点工作量详细记录数据采集、清洗、标注的过程耗时、数量记录多次训练实验的参数和结果对比实现一个完整的、带前端界面的演示系统。创新点不一定非得是算法层面的重大创新。可以体现在针对特定场景红枣的数据集构建与分析方法对现有模型YOLOv5在该场景下的超参数调优与性能深入分析设计并实现了一套从数据到部署的完整Pipeline针对遮挡、小目标等难点尝试了特定的数据增强或后处理策略。将这些过程清晰地分析和总结出来就是很好的创新点。答辩准备演示系统务必稳定流畅提前测试确保从上传图片到显示结果整个过程快速、准确。准备几个有代表性的测试用例清晰红枣、模糊红枣、多目标、复杂背景。讲好故事不要平铺直叙讲技术。从“问题引入”传统分拣的痛点到“解决方案”我们的智能识别系统再到“实现过程”数据、模型、调优和“最终效果”量化指标和演示形成一个完整的逻辑闭环。准备好问答老师常问的问题包括“你的数据和别人的有什么不同”“为什么选择YOLO而不是其他算法”“你的模型在什么情况下会失效”“如何评估模型的好坏”“项目的实际应用价值在哪里”“未来的改进方向是什么”提前思考并准备好答案。这个项目就像一次微型的工业AI项目实战走完全程你收获的将不仅仅是一个毕业设计更是解决一个实际计算机视觉问题的完整能力。从数据获取的艰辛到调参看曲线的焦虑再到模型终于跑出高精度时的喜悦这些体验远比代码本身更有价值。最后记得尽早开始留出足够的时间应对各种意外祝你顺利通过答辩本文还有配套的精品资源点击获取
返回列表