新闻详情

新闻详情

首页 / 资讯中心 / 详情

大白菜叶片病害图像识别:2800张标注数据训练YOLOv8实战与避坑

发布时间:2026/10/1 5:17:38来源:尧图网络
大白菜叶片病害图像识别:2800张标注数据训练YOLOv8实战与避坑
简介面向图像分类学习与大白菜叶部病害识别实践的已标注数据集包含背蛾、潜叶虫和霉菌3个类别适合计算机视觉初学者、农业智能应用开发者以及需要分类数据验证模型的论文实验者。数据已按训练集和测试集划分同类图片存放在对应目录中附带的show.py脚本可快速预览图像与标签对应关系json文件则为类别名称和配置信息省去自行整理标注的时间。资源包共2000个文件其中1998张jpg叶片图像为主体辅以1个Python脚本和1个json文件压缩包约350.83MB解压后训练集、测试集分目录存放结构清晰便于直接用于CNN图像分类、YOLOv5分类迁移学习及数据增强对比实验。已有154人学习下载尤其适合作为病害识别入门、模型复现和分类效果评估的基础数据集。1. 大白菜叶片病害图像识别数据集2800张已标注图够不够训练一个能用的模型“大白菜叶片病害图像识别数据集【已标注约2800张数据】”——这个标题里最值钱的是“已标注”三个字因为干过农业图像识别的人都知道采集2800张叶片照片不难难的是把病害边界画准、把类别分匀再把模糊样本清洗干净。2800张这个规模处在“够用”和“紧张”的临界点做图像分类问题不大做目标检测就得靠迁移学习和数据增强兜底。这篇文章从数据集结构怎么摸底讲起一路走到YOLOv8训练、参数调整、数据清洗和田间验证帮你判断这个方向值不值得投入以及怎么把每一步做扎实。2. 读懂这批数据病害类型、标注格式与2800张数据的真实边界2.1 大白菜叶片常见病害与识别难点大白菜的叶部病害在田间最常见的是霜霉病、软腐病、黑斑病和病毒病。霜霉病早期在叶片正面出现淡绿色到黄褐色的褪绿斑叶背对应位置长出白色霉层这是最核心的识别特征黑斑病表现为同心轮纹状的黑色病斑边缘相对清晰通常从老叶开始软腐病在叶片上先是水渍状半透明斑之后迅速腐烂并伴随黏液和臭味病毒病则让叶片呈现花叶、皱缩、黄化等系统性症状。这四类症状虽然差异明显但落到具体照片上边界远比文字描述要模糊。识别难点集中在三个地方。第一病斑尺度小。霜霉病早期病斑只有几个毫米在整张叶片照片里占比不到百分之一检测模型很容易漏检。第二形态重叠。黑斑病与褐斑病、炭疽病初期的颜色和形状接近单靠颜色直方图无法区分模型必须学习纹理和边缘走向。第三拍摄条件脏。田间照片有逆光、阴影、土壤反光、露水还有和叶片颜色相近的枯草这些背景干扰对模型的负面影响往往大于病害本身的类间差异。所以在动手训练前我建议把数据集里每个类别各抽20张图拼成一张大图肉眼过一遍。这个过程不需要任何代码但能给你三个信息各类别是否有足够的形态多样性、是否存在明显标注错误、图像拍摄条件是否过于单一。如果所有图像都在同一个温室、同一个角度、同一个光线下拍出来的那训练阶段就必须把泛化问题放在第一位否则模型一进大田就失灵。2.2 标注格式解析拿到压缩包先做这三件事“已标注”在不同数据集里可能是三种完全不同的结构Pascal VOC的XML文件、COCO的JSON文件、YOLO的TXT文件。三种格式的训练流程、转换脚本、读取方式都不一样。拿到压缩包后第一步是看目录结构。VOC风格通常有一个Annotations目录放XML、一个JPEGImages目录放图片YOLO风格是labels目录下按训练集、验证集分子目录里面是TXTCOCO风格是一个大JSON文件配一个图片目录。find . -maxdepth 2 \( -name *.xml -o -name *.json -o -name *.txt \) | head -30第二步是读一个标注文件看内容。YOLO的TXT每一行是“类别id 中心x 中心y 宽 高”五个数全部是0到1之间的归一化浮点数VOC的XML里有object节点包含name和bndbox坐标是像素绝对值COCO的JSON分为images、annotations、categories三段结构。这一步决定了后文所有脚本怎么写也是新手最容易出错的地方——把VOC的绝对值坐标当YOLO的归一化坐标喂给训练脚本loss会在前面几十轮完全乱跳。第三步是统计标注分布确认类别和图像张数匹配wc -l labels/*.txt | sort -n | head -20行数为0的TXT说明该图没有标注目标在目标检测任务里这种图要么单独放背景目录要么直接剔除。但如果有大量TXT行数为0就要警惕标注遗漏。这三件事全程不需要训练代码却决定了后续所有步骤的准确率上限值得在拿到数据的第一个小时就做完。2.3 图像级标签还是目标级标注决定你该选分类还是检测同为“已标注”图像级标签和实例级标注的使用路径截然不同。图像级标签是“这张图属于霜霉病”每张图一个类别实例级标注是“这张图里的第三个病斑是黑斑病”伴随具体坐标框。如果数据集宣传语里只写“2800张数据”没提“框”或“病斑位置”大概率是图像级标签优先考虑图像分类或弱监督方案。判断方法不用猜读文件最直接。如果标注文件里只有标签字符串没有坐标那就是图像级标注如果XML或JSON里有多个目标带bbox就是检测标注。搞清这一点2800张数据的任务边界就清晰了图像分类绰绰有余目标检测必须配合迁移学习实例分割会非常吃力基本只适合做实验验证。还有一个容易混淆的点多标签分类。同一张叶片可能同时感染霜霉病和黑斑病而标注只有单一类别这就是多标签问题被简化成了单标签问题。这种错漏在农业病害数据里很常见因为田间一株菜往往同时染几种病。处理时如果模型设计成多标签输出用sigmoid加多阈值判定如果沿用单标签就要把混病的图单独归为一类或者干脆在数据说明里标注清楚。提示启动任何训练之前花半小时写个可视化脚本把标注画到图上并打印类别。这一步能发现八成数据问题性价比远高于调参。2.4 格式转换与标注检查VOC转YOLO的细节与工具选择拿到VOC或COCO格式转成YOLO的TXT是常见路径因为训练脚本直接读TXT。转换要处理两个关键点类别名映射成数字id、坐标从像素绝对坐标转成归一化坐标。下面是一个简化但能直接跑的转换脚本import xml.etree.ElementTree as ET import os class_names [downy_mildew, black_spot, soft_rot, virus_disease, healthy] def voc_to_yolo(xml_path, out_path): tree ET.parse(xml_path) root tree.getroot() w int(root.find(size/width).text) h int(root.find(size/height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in class_names: continue # 类别不在列表里直接跳过 cls_id class_names.index(name) b obj.find(bndbox) x1 float(b.find(xmin).text) y1 float(b.find(ymin).text) x2 float(b.find(xmax).text) y2 float(b.find(ymax).text) cx ((x1 x2) / 2) / w cy ((y1 y2) / 2) / h bw (x2 - x1) / w bh (y2 - y1) / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) with open(out_path, w) as f: f.write(\n.join(lines)) xml_dir Annotations out_dir labels os.makedirs(out_dir, exist_okTrue) for f in os.listdir(xml_dir): if f.endswith(.xml): voc_to_yolo(os.path.join(xml_dir, f), os.path.join(out_dir, f.replace(.xml, .txt)))这段脚本有两个容易出问题的点。其一是xmin、xmax与宽度的顺序不能错虽然只差一个减号但错一处全盘皆输建议转完随机抽5个文件画框人工复核。其二是越界坐标YOLO训练脚本对小于0或大于1的值只告警不报错但会导致损失计算异常转换时显式做clip更安全。类别名不在列表里时直接跳过是合理策略但要把跳过的记录打印出来确认不是类别字典拼写错误。标注检查工具方面LabelImg适合人工复查单张图能同时看图片和框VOC格式加载方便但它的界面较老大规模复核效率不高。CVAT更适合团队协作和半自动标注支持在线画框、同类别复制、模型预标注后人工修正。2800张的规模不算大第一次整理用LabelImg抽查足够后续进入迭代阶段再上CVAT。3. 把数据集跑通校验脚本、数据划分与YOLOv8最小训练闭环3.1 数据校验图像与标注对应关系检查脚本训练前跑一个体检脚本能把损坏图片、缺失标注、空标注三类问题一次性暴露。这是我每次拿到新数据集都会先跑的固定模板import os from PIL import Image img_dir images label_dir labels for img_name in sorted(os.listdir(img_dir)): stem os.path.splitext(img_name)[0] img_path os.path.join(img_dir, img_name) label_path os.path.join(label_dir, stem .txt) try: img Image.open(img_path) img.verify() w, h img.size if w 64 or h 64: print(f低分辨率: {img_name} {w}x{h}) except Exception as e: print(f损坏: {img_name} - {e}) if not os.path.exists(label_path): print(f缺标注: {img_name}) continue lines open(label_path).readlines() if len(lines) 0: print(f空标注: {img_name})脚本输出三大类问题。损坏图片直接删除或重新导出缺标注的图如果数量不多可以补标或删除但删除前要确认该类别样本总量空标注图在目标检测里分两种处理——单独放背景目录喂给模型或者直接剔除。2800张的数据量空标注占比超过2%就会对训练产生可见影响模型会学习到“这张图没东西”而压低阳性预测。补充一个冷门但真实的细节img.verify()之后如果后续还要用PIL读取像素需要重新Image.open()因为verify()会把文件指针置于不可读状态。另外检查重名文件有些数据集来自多个平台缝合存在leaf.jpg和leaf (1).jpg这种命名按后缀匹配时容易错位这类问题在手工整理的数据集里出现概率不低。3.2 按“株”划分数据集避免同株叶片混进验证集农业病害图像有一个天然属性同一株作物通常被拍多张照片。如果按文件随机划分训练集和验证集同一株大白菜的叶片会同时出现在两边模型相当于开卷考试验证集指标虚高。我处理这类数据时会先看文件名找出能区分植株的字段。import random import os from collections import defaultdict files os.listdir(images) group_map defaultdict(list) for f in files: key f.split(_)[0] # 假设文件名是 12_leaf_03.jpg 这种结构 group_map[key].append(f) keys list(group_map.keys()) random.seed(42) random.shuffle(keys) n_train int(len(keys) * 0.8) n_val int(len(keys) * 0.9) train_keys, val_keys, test_keys keys[:n_train], keys[n_train:n_val], keys[n_val:] def write_list(split_keys, out_file): with open(out_file, w) as f: for k in split_keys: for img in group_map[k]: f.write(os.path.abspath(img) \n) write_list(train_keys, train.txt) write_list(val_keys, val.txt) write_list(test_keys, test.txt)这个脚本的核心是group_map按前缀聚合写出来的train.txt、val.txt、test.txt可以直接用于YOLO训练。如果命名没有规律可以按拍摄时间或文件夹分组但最稳妥的还是回到采集现场按文件夹整理一个文件夹代表一株。这是数据采集规范的问题后补代价很高建议从项目立项第一天就定好命名规则。3.3 用YOLOv8训练自己的数据集最小命令与五个关键参数YOLOv8训练自己的数据集需要先准备一个data.yaml描述路径和类别。2800张数据量不大路径建议用绝对路径避免相对路径在不同环境下解析出错。# data.yaml path: /home/user/cabbage_dataset train: images/train val: images/val test: images/test names: 0: downy_mildew 1: black_spot 2: soft_rot 3: virus_disease 4: healthyyolo detect train \ datacabbage.yaml \ modelyolov8s.pt \ epochs120 \ imgsz640 \ batch16 \ patience15 \ lr00.001 \ close_mosaic10五个关键参数要理解。modelyolov8s.pt是从COCO预训练权重开始微调不是随机初始化这一点对2800张的小数据集至关重要后面会单独展开。epochs120结合patience15早停验证集mAP连续15轮不提升就停止防止无效空跑。imgsz640是速度和精度的折中原始图像分辨率高于2000时这个值偏小后面有专门的避坑说明。batch16受显存约束8G以下显存建议降到8。lr00.001是从预训练权重微调时比较安全的起始学习率。训练结束后不要用跑满120轮的last.pt要用best.pt。best.pt是验证集上mAP最高的快照在小数据集上它通常出现在中后期之后模型慢慢过拟合last.pt性能反而退化。部署时拷贝best.pt重新命名笔者踩过这个坑第一版部署直接用了last权重田间误报明显偏多。3.4 数据增强针对叶片病害的最优设置YOLOv8的默认增强对自然场景做了充分优化但对叶片病害这种依赖颜色和纹理的任务需要针对性调整。hsv_h色调扰动默认值是0.015这个幅度人眼几乎不可见但对病斑的微小色差仍可能造成噪声饱和度扰动建议从0.7降到0.4亮度扰动从0.4降到0.2因为诊断信息大量落在颜色上颜色抖动过头等于告诉模型颜色不可信。空间增强方面degrees旋转控制在10以内。大白菜叶片在田间朝向相对固定大幅旋转不仅无益还会让模型学到不真实的小概率形态。translate和scale保留默认模拟不同拍摄距离。mosaic1.0默认开启把四张图拼接成一张等于变相增大感受野对小病斑检测有帮助但训练最后阶段要配合close_mosaic10关掉让模型回归正常图像分布避免部署时对mosiac拼接图产生依赖。还有一个植物病害场景的专属建议不要做随机通道置换或灰度化增强除非部署端本身就是灰度相机。霜霉病靠叶片背面白色霉层识别如果模型在训练里见过灰度版本彩色推理时可能降低对色相的依赖把花叶病毒症状和缺素黄化搞混。增强不是越猛越好而是越贴近部署分布越好。3.5 训练后验证混淆矩阵与错误案例看真实水平训练完成后验证集mAP只是一个数字真正告诉你模型学得怎么样的是混淆矩阵。YOLOv8训练日志会生成confusion_matrix.png集中看对角线亮不亮如果某个类大量被预测成另一个病种说明两个类在模型眼里形态过于接近。这时候回看训练集把两个类的图像并排摆放人工找出最容易混淆的子类型比如黑斑病和褐斑病在未成熟阶段几乎一样。当作错误案例可视化时我会用验证集图片跑预测筛选那些“置信度最高但预测错误”的样本。这类样本暴露模型的过度自信往往指向训练集脏标签是回标修改的优先对象。把预测结果画到图上截图汇总成报告发给标注人员对照比口头描述高效得多。最后按类别看AP而不是只看全局mAP。YOLOv8验证输出里有每类的AP列表把AP最低的类别单独拎出来统计验证集里它的样本数。如果样本数过少AP低是统计噪声重点补充验证样本如果样本充足仍然AP低就要回到第4章的数据问题里去查。4. 避坑与常见问题从标注质量到过拟合的五个真实案例4.1 标注框偏移病斑边缘模糊模型学到的目标不稳定现象训练30轮后训练loss降得很低但验证集mAP只有0.5左右。把预测框画到验证图上发现框总比真实病斑大一圈或整体偏向叶缘方向。人眼觉得“差不多”但IoU指标对偏移非常敏感实际部署时也会把健康组织圈进框里。原因病斑边缘是渐变区域没有像素级清晰边界。不同标注员对“哪里算病斑”执行标准不一致有的把外围褪绿区框进去有的只框坏死中心。模型被迫拟合一个位置不确定的目标框的方差被越学越大。解决先定义可执行的标注标准并写进数据说明比如“以最外侧颜色明显异常的连续区域为边界”。再用当前模型对训练集做预测与标注算IoU把IoU最低的50张挑出来人工重修。修完重新训练一次对比mAP是否明显抬升。如果偏移主要来自某一个标注员的风格这一步还能顺便统一团队口径。4.2 类别不均衡主要病害样本多次要病害被模型忽略现象训练正常收敛但按类别看的AP差距悬殊。假设霜霉病AP 0.83软腐病AP 0.12而软腐病恰恰是生产中需要重点预警的病害模型等于在生产场景里失明。原因软腐病样本占比过低。2800张总量里如果软腐病只有30张原始图即使开了mosaic和flip单轮实际看到该类的有效正样本可能只有几张模型没有足够机会学习软腐病特有的水渍状腐烂纹理。解决优先扩充少数类数据。没有新数据时用复制粘贴增强把软腐病病斑从原图抠出来随机贴到健康叶片或背景上一张变十张。另一种做法是单独对少数类微调先在全部数据上训出一个基座模型再用软腐病子集继续训练20轮让模型在保留既有能力的同时把注意力集中到少数类上。4.3 过拟合训练loss持续下降验证loss先降后升现象第40轮附近训练loss还在下降验证loss已经回升。预测时训练集图像表现极好换到新田块图片频繁误报这是中小数据集训练时最常见的问题。原因2800张图像对yolov8s约1100万参数来说模型容量绰绰有余。它可以“背”下训练样本特征而同一地块的叶片图像相似度极高背景一旦单一模型就依赖背景捷径而非病斑特征温室统一背景拍摄的数据尤其容易出现这种问题。解决依次做三件事。第一把weight_decay从0.0005调到0.001必要时加dropout0.2。第二检查背景多样性如果背景过于统一做随机背景替换把叶片贴到田间土壤、杂草、覆盖地膜等不同背景上。第三换小模型。数据量有限的场景下yolov8n比yolov8s泛化更好参数少一半过拟合风险显著降低。“大模型效果一定更好”在千张级数据上经常不成立。4.4 分辨率与resize矛盾小病斑在下采样中消失现象原始图像约2000×2000像素训练输入设成640×640。病斑直径约20像素缩到640后只剩6像素左右检测模型基本不可能召回。把原始图直接喂给模型也漏检人眼却一眼能看到病灶。原因图像识别模型在输入端有一个固定尺寸缩放对整片叶子影响不大对毫米级病斑是致命压缩。YOLOv8默认stride为32输入640时最小特征图的感受野已经远大于6像素病斑特征在主干网络早期就被背景淹没。解决两条路。一是提高输入分辨率到imgsz1280显存不够就把batch降到8或4常见能提升2到5个点mAP。二是切图训练把大图切成若干带overlap的patch每个patch按原始分辨率输入推理时把patch的检测结果映射回原图坐标。overlap设24像素左右避免病斑正好被切缝劈开。农业病害检测任务里切图比换大模型更可靠。4.5 脏标签早期症状与健康叶片的边界模糊现象训练出的模型频繁把健康叶片误报为霜霉病置信度还偏高。人工检查训练集发现部分被标为霜霉病的图像只是叶背轻微失绿没有典型白色霉层。原因病害是连续过程早期症状与正常生理变化没有绝对分界。标注人员在不确定时倾向于归为病害类因为“宁可信其有”但这个决策拉宽了类别的特征空间模型学到的是“任何带点黄色的叶片都有病害嫌疑”。解决用模型挑嫌疑样本。把训练好的模型在同一批训练集上推理把预测类别与标注类别不一致、且置信度大于0.6的样本筛出来按置信度降序人工复核。2800张数据量不大需要复核的通常只有几十张一小时内处理完。处理之后重新划分数据再训练一次把清洗前后的mAP对比记录下来这个数字能直观说明数据清洗的价值。5. 让模型在田间真正可用迁移学习、阈值调整与持续迭代5.1 迁移学习小数据集的胜负手直接在随机初始化权重上训练2800张图效果通常很差。YOLOv8从COCO预训练权重起步模型已经学会了边缘、纹理、颜色等通用特征病害识别是建立在这些基础之上的。如果最终选择分类而不是检测推荐用ResNet50或EfficientNet的ImageNet预训练权重。迁移学习在小规模数据场景下不是可选项而是必选项。5.2 置信度阈值与NMS怎么调让模型少报错部署时默认置信度阈值0.25对农业病害会误报偏多。我的习惯是先记录验证集上的PR曲线把置信度阈值调到精确率和召回率相交的位置通常在0.4到0.5之间。NMS的IoU阈值默认0.7病斑密集时可以降到0.5抑制同一病斑周围的多余框。这两个参数不改变模型权重只改变预测解码方式却直接影响用户对模型的第一印象。5.3 田间验证拍一段视频看稳定性真正检验模型可用性的方式不是验证集数字而是带着电脑去田间录一段视频。直接跑视频时模型对每帧独立预测同一病斑的检测结果时有时无这是正常现象。实用做法是加一个轻量时序平滑取最近5帧的检测框对同一目标做简单平均就能消除大部分抖动。部署端性能有限时先降到512分辨率跑通流程再逐步调高找到精度拐点。5.4 半自动标注用CVAT把新数据回流模型跑通后最重要的事情是让数据进入持续迭代状态。我一般每月采集一批新图像先用现有模型生成伪标注再在CVAT里只做修正修正过的样本回流到训练集。这样一来2800张的初始数据集就变成一个会自我增长的数据资产而不是一次性离线任务。我自己走过一轮弯路第一版模型在验证集上mAP不错一到田间就漏掉早期霜霉病后来发现不是模型问题而是训练数据全部拍自温室缺少露水和强光场景。从那以后任何模型交付前我都会去田里拍100张新图做盲测。数据集的2800张标注只是起点模型能不能用最终由未知场景说了算希望这篇笔记能帮你在同样的坑前面少耽误几天时间。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

大西洋的宝藏海岛:马德拉徒步与旅行全攻略 2026/10/1 6:19:14

大西洋的宝藏海岛:马德拉徒步与旅行全攻略

第一次听到Madeira这个名字,我以为它只是葡萄牙旁边某个不起眼的小岛,毕竟在大多数旅行榜单上,它总被一笔带过。直到真正把“Madeira”放进自己的旅行计划,我才发现这是一个被严重低估的地方。欧洲人叫它“大西洋的宝石”&#xf…

阅读更多 →
同一个名字串起酒、群岛与蛋糕:Madeira背后的历史、工艺与玩法 2026/10/1 6:19:13

同一个名字串起酒、群岛与蛋糕:Madeira背后的历史、工艺与玩法

从酒单到徒步路线再到烤箱,这三个地方居然都叫同一个名字前阵子整理资料,我发现一件特别有意思的事:一张西餐酒单上的加强型葡萄酒、一本旅行杂志里的葡萄牙群岛徒步攻略、还有一份家庭烘焙的柠檬蛋糕食谱,三样完全不搭界的东西&a…

阅读更多 →
马德拉岛深度攻略:徒步路线、马德拉酒与避坑指南 2026/10/1 6:19:13

马德拉岛深度攻略:徒步路线、马德拉酒与避坑指南

第一次看到“Madeira”这个名字,我脑子里蹦出来三个完全不同的画面:大西洋深处的绿岛、一杯琥珀色的加强酒、还有绣着彩色花纹的白色桌布。后来实际把“Madeira”当成一个完整项目去研究,才发现这三个画面居然都是它的标签,而且每…

阅读更多 →
DeepSeek Harness桌面端全解析:macOS与Windows安装、插件体系及工作流实战 2026/10/1 6:19:13

DeepSeek Harness桌面端全解析:macOS与Windows安装、插件体系及工作流实战

1. 桌面端工具这波更新,到底解决了谁的痛点DeepSeek Harness 这个名字最近在开发者圈子里出现的频率明显高了起来,尤其是官方正版桌面端发布之后,配合体验金领取的活动,不少之前只在命令行里折腾的人开始认真考虑把它装到自己主力…

阅读更多 →
Vulnhub靶机搭建实战:虚拟化环境配置与网络连通性调试 2026/10/1 6:19:13

Vulnhub靶机搭建实战:虚拟化环境配置与网络连通性调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AI服务504故障根因分析:任务队列、限流与GPU隐性延迟 2026/10/1 6:19:06

AI服务504故障根因分析:任务队列、限流与GPU隐性延迟

1. 这不是“服务挂了”,而是AI服务线上响应异常故障的典型现场还原“AI服务线上响应异常故障”——这八个字,是运维值班群里凌晨三点最让人头皮发紧的告警标题。它不像“数据库连接失败”那样指向明确,也不像“磁盘满”那样有迹可循&#xff…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉