飞机100分类测试集:制作、划分与评估避坑指南

发布时间:2026/10/2 18:17:44
飞机100分类测试集:制作、划分与评估避坑指南 简介面向深度学习图像识别任务这套飞机100分类数据集提供了标准测试集涵盖波音737-76J、波音737-700等100个具体机型类别适用于图像分类模型的精度验证、混淆矩阵分析及迁移学习效果评估。资源共2000个文件其中1998个jpg图像为主要数据另有1个json类别字典文件用于类别与序号映射1个Python可视化脚本供快速查看图像与标签分布。解压后的data-test目录按每个类别的子文件夹组织图像文件夹名即类别名结构直观json与py脚本配合可免去自行编写数据加载和可视化代码的麻烦。数据总量约878MB图像无需额外清洗即可直接接入PyTorch/TensorFlow等常用训练测试流程。当前已有590人学习下载很适合需要标准飞机分类测试数据的研究者、算法工程师以及进行图像识别入门实践的深度学习学习者。1. 飞机100分类测试集真正决定模型生死的是这张“考卷”做深度学习图像识别的人很多人把精力全花在训练集上觉得把训练集洗干净、把模型调到 loss 下降就万事大吉。但等到模型上线或者参加评测时才发现测试集上的准确率和自己验证集上的数字差了十万八千里。这个飞机100分类数据集测试集就是用来给图像识别模型“一锤定音”的那张考卷——训练集和验证集是平时的练习题测试集才是真正算分的考试。测试集的核心价值在于“陌生”。它里面的飞机图像应该和训练集来自不同的拍摄场景、不同角度、不同光照甚至不同机型涂装这样模型在它上面的表现才能反映真实泛化能力。很多初学者会把训练集的一部分随机抽出来当测试集用这样做出来的分数是虚高的因为你拿同源数据测一个见过世面的模型它当然考得好。真正的测试集要做到的是模型从来没在训练阶段碰过这些图像哪怕碰过同一架飞机的不同照片都算数据泄露。这篇笔记围绕飞机100分类测试集展开它怎么制作、怎么保证“考卷”的公平性、怎么用它跑通一个图像识别基线以及我在实际制作和使用这类数据集时踩过的五个大坑。适合正在做细粒度图像识别、飞机类型识别、以及需要构建自己的数据集用于深度学习实战项目的读者不管你是用 PyTorch 还是 TensorFlow这里的流程和结论都能直接搬。2. 飞机100分类数据集是怎么来的从类别清单到图像清洗的全链路2.1 类别清单怎么定100类不是拍脑袋是卡在“粒度”上飞机分类和猫狗分类最大的不同在于飞机类别之间存在极强的层级关系。波音737和空客A320是不同类别但都属于窄体客机F-16和歼-10是不同类别但都属于战斗机。做飞机100分类首先要回答一个关键问题这100类是按什么粒度划分的我见过两种常见的划分方式。一种是按“机型型号”划分比如波音737-800、波音747-400、空客A320neo、空客A350-900这种划分的优点是类别边界清晰同一型号的飞机外观差异小分类任务更有挑战性另一种是按“生产厂商系列”划分比如波音737系列、空客A320系列这样每类图像数量充足但类别之间区分度低模型更容易过拟合到涂装而不是结构特征。对于飞机100分类数据集我一般建议按“机型型号”做细粒度划分。细粒度分类是深度学习图像识别里最考验模型能力的场景因为不同型号飞机之间的差异可能只在机翼形状、发动机数量、尾翼结构这些局部细节上。100类这个数字也意味着每类至少需要几百张有效图像整个测试集至少要有2万到3万张图否则评估结果的置信度不够。提示制作数据集之前先把100个类别的清单固定下来包括每个类别的中英文名、所属厂商、典型特征。这个清单是之后所有标注和验证工作的基准改一次就意味着全量返工。2.2 图像采集与初筛公开数据源、数据增强与版权边界飞机图像的采集比一般物体分类要难因为飞机不是随手能拍到的物体。常见做法是组合多个公开来源飞机爱好者社区、航空摄影图库、机场实拍数据集、以及已有的开源数据集如 CUB-200-2011鸟类细粒度数据集里混入的飞机图像废墟中的可用部分。采集阶段需要考虑三个问题数量、多样性和版权。数量上每类至少采集200张原始图像。多样性指的是每类图像里要包含不同角度正面、侧面、俯视、不同背景停机坪、跑道、空中、不同光照白天、黄昏、逆光的照片。版权问题上公开的飞机照片使用许可并不统一个人研究用途的合理使用边界和商用用途完全不同。我的做法是优先使用明确标注 CC 协议或公开领域许可的图像源训练集做数据增强旋转、翻转、色彩抖动来扩充数量而不是无限扩大爬取范围。初筛脚本的作用是去掉三类废图分辨率过低的、重复的、明显不是飞机的。低分辨率图长边小于256像素直接删掉因为分类任务里这类图的细节信息已经丢失重复图可以用感知哈希算法pHash去重不是飞机的图可以用一个预训练的 ResNet 做一次粗分类过滤。下面的脚本是一个 pHash 去重的简化实现import os import hashlib from PIL import Image import imagehash def dedup_images(folder, hash_size8): seen {} for root, _, files in os.walk(folder): for name in files: path os.path.join(root, name) try: img Image.open(path).convert(RGB).resize((256, 256)) h str(imagehash.phash(img, hash_sizehash_size)) if h in seen: os.remove(path) print(fduplicated: {path} - {seen[h]}) else: seen[h] path except Exception as e: print(fbroken image: {path}, {e}) if __name__ __main__: dedup_images(./raw_airplanes)这段脚本用imagehash.phash计算每张图像的感知哈希值哈希相似的图像会映射到同一个桶里发现重复就删除后出现的那个。hash_size8表示生成64位哈希值越小对图像越“宽容”两张稍有裁切的同机照片也能识别为重复如果发现误删正常图像可以调大到hash_size16。脚本里的broken image分支用于捕获损坏的图片文件——这类文件在不处理的情况下会在后面训练时直接让 DataLoader 崩溃而且报错信息很难定位到具体是哪张图。2.3 二次清洗把“带字”和“带水印”的图像挡在测试集外面初筛完成后还需要做一次针对分类任务特性的清洗。飞机图像里最常见的两类干扰是图片上的文字标注新闻截图、摄影参数水印和明显的版权水印。这些文字信息会成为模型分类的“捷径”——模型可能不是通过学习飞机外形来分类而是通过识别图像角落里的“Photo by XXX”水印来蒙对答案。我的经验是用一个轻量级的文本检测思路来做过滤对每张图做边缘检测和连通域分析如果图像中存在大量密集且规整的细小边缘区域这类区域通常是文字就把该图送入人工审核队列。虽然 OpenCV 的 EAST 文本检测器效果更好但对大批量数据来说速度太慢。清洗后还要做一次类别核对。飞机领域的误标率比想象中高得多尤其是民航客机波音737和空客A320从正面看非常相似没有经验的人很容易标错。这一步没有捷径必须对照类别清单逐类抽样检查每类至少抽查30张图确认标注和实际图像内容一致。如果发现某类标注准确率低于95%宁可删掉整个类别的可疑图像重新采集也不要带着错误标注进入训练。3. 划分训练集/验证集/测试集比例、随机种子与数据泄露防线3.1 划分比例与随机种子8:1:1 还是 6:2:2很多人在划分数据集时习惯用 8:1:1即80%训练、10%验证、10%测试。这个比例在图像识别任务里有一个隐患如果总数据量不够大10%的测试集可能只有几百张图评估结果的方差会很大。飞机100分类如果每类只有200张图总共2万张10%就是2000张平均每类只有20张测试图——某类模型判断错一张准确率就掉5个百分点。我通常的做法是总数据量小于5万张时用 7:1.5:1.5总数据量大于5万张时用 8:1:1。同时固定随机种子保证每次划分结果可复现。PyTorch 里可以用下面的方式控制划分的随机性import torch from torch.utils.data import random_split dataset_size len(dataset) train_size int(0.7 * dataset_size) val_size int(0.15 * dataset_size) test_size dataset_size - train_size - val_size generator torch.Generator().manual_seed(42) train_ds, val_ds, test_ds random_split( dataset, [train_size, val_size, test_size], generatorgenerator ) print(ftrain{len(train_ds)}, val{len(val_ds)}, test{len(test_ds)})手动设置generator torch.Generator().manual_seed(42)是为了让随机划分可复现。random_split默认使用全局随机状态不固定种子的话每次运行脚本划分结果都不一样后续做实验对比时你根本分不清模型准确率的提升是来自模型改进还是来自数据划分的运气。我用的是42你也可以用任何整数关键是固定下来并写进项目的 README后续复现实验结果时统一用同一个种子。3.2 类别维度上的数据泄露同源图片串集的“玄学”翻车划分比例搞定了真正容易翻车的是数据泄露。数据泄露在飞机分类里最典型的表现是同一个视频片段被抽帧得到的连续多张图像其中一部分进了训练集另一部分进了测试集。这些图像之间只有极小的视角变化模型在训练时见过“几乎一样”的图像测试时自然能认出来准确率虚高。这里有个经典案例某自动驾驶数据集因为忽略了不同帧的时序相关性直接把连续帧随机切分导致在测试集上的准确率比真实场景高8%到15%。飞机数据同理如果你从一段航展飞行表演视频中抽帧连续的两帧之间只是飞机位置平移了几个像素把它们分别放进训练集和测试集这就等于开卷考试。解决方式是“按源划分”而不是“按图划分”。所有来自同一视频、同一拍摄者同一批次上传的相册、同一架飞机的多角度照片组都应该被分到同一个子集中。实际操作中我会在图像文件名里保留数据源标识例如0001_video_0453.jpg划分时按前缀分组import os import random from collections import defaultdict def group_split(data_root, val_ratio0.15, test_ratio0.15, seed42): random.seed(seed) groups defaultdict(list) for name in os.listdir(data_root): prefix name.split(_)[0] # 数据源ID groups[prefix].append(name) group_names list(groups.keys()) random.shuffle(group_names) n_val int(val_ratio * len(group_names)) n_test int(test_ratio * len(group_names)) val_groups group_names[:n_val] test_groups group_names[n_val:n_val n_test] train_files, val_files, test_files [], [], [] for gname, names in groups.items(): if gname in val_groups: val_files.extend(names) elif gname in test_groups: test_files.extend(names) else: train_files.extend(names) return train_files, val_files, test_files这段脚本的核心理念是随机划分的单位是“数据源组”而不是“单张图像”。prefix name.split(_)[0]要求文件名里第一位是数据源ID这个 ID 来自采集阶段的记录同一个视频、同一个相册的所有图像共享同一个ID。这样划分出的测试集才能真正做到“陌生”因为模型在训练阶段没有接触过任何一个完整的数据源。注意如果你用的是别人的现成数据集拿不到原始数据源信息那就退而求其次对图像做特征聚类把视觉特征高度相近的图像聚成一类后再按类划分。这不能完全消除数据泄露但能降低影响。3.3 固化划分结果训练代码里永远只有一套划分数据划分的结果需要固化下来而不是每次跑训练时重新划分。我的做法是划分完成后把三个子集的文件列表分别保存成train.txt、val.txt、test.txt每一行是一个图像路径。训练脚本读取这些文件而不是扫描文件夹。这样做的原因是实验过程中你可能调整数据清洗策略、增删图像、修正标注如果不固化划分每一次改动后重新划分的数据分布都不一样实验结果之间不可比。有的项目里能看到这样的操作先跑一遍训练发现测试集准确率低了就回头重新划分数据集把测试集里表现差的图像重新分回训练集。这是严重的作弊行为等于偷看考卷答案之后再重新编排座位。固化划分文件还有一个好处审计性——你的模型和结果能对应到一套固定的数据版本出了问题可以追溯是哪张图导致的。4. 用测试集跑通一个飞机100分类基线PyTorch 实现与评估指标4.1 数据加载与预处理参数测试集不用数据增强但要做归一化飞机100分类的测试集评估有一个原则测试集不应用任何数据增强。训练时可以用随机裁剪、随机翻转来提高模型泛化能力但测试时必须用固定的预处理流程保证所有测试图像以“标准姿态”进入模型。否则不同的预处理顺序会影响评估结果这个变量一旦引入你就不知道准确率的变化是来自模型还是来自预处理。我常用的 PyTorch 测试集预处理流程如下from torchvision import transforms test_transform transforms.Compose([ transforms.Resize((256, 256)), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])这里Resize((256, 256))统一尺寸CenterCrop(224)裁剪中心区域这个先变大再裁剪的做法是为了避免直接拉伸造成的形变失真。Normalize后面接的均值和技术方差是 ImageNet 预训练模型的统计量如果你要加载在 ImageNet 上预训练的 ResNet 权重这两组参数必须保持默认否则输入数据分布和预训练权重预期不符模型输出的概率分布会很怪。如果想自己从头训练模型那均值和技术方差应该用你训练集的真实统计量先用脚本算一次再写死。数据加载部分用ImageFolder最省事前提是测试集目录结构规范test/A320/001.jpg、test/A320/002.jpg。一行代码生成数据集from torchvision.datasets import ImageFolder test_ds ImageFolder(root./data/test, transformtest_transform) # 类别名按文件夹名排序后映射到0-99 class_names test_ds.classesImageFolder会按文件夹名的字母序自动分配类别索引所以测试集的classes顺序必须和训练集完全一致。常见坑训练集里类名是Boeing737-800测试集里写成了Boeing_737_800字母序全乱了模型输出的 label 全部错位。我一般会在ImageFolder之后打印一遍class_names和训练集对比确认映射一致再往下跑。4.2 基线模型与训练参数用 ResNet50 跑一个可复现的起点飞机100分类属于细粒度图像识别模型选型上从 ResNet50 起步是稳妥的。比 ResNet50 更深的如 ResNet101 或 EfficientNet-B4 在细粒度任务上通常有更高的上限但训练时间更长、调参更麻烦。作为基线ResNet50 的 ImageNet 预训练权重有很好的通用视觉特征飞机的外形特征机翼、尾翼、发动机短舱和 ImageNet 里的部分类别有一定重合迁移学习效果通常不错。训练参数上我的起始配置如下输入尺寸224x224batch size 64优化器 AdamW初始学习率 3e-4权重衰减 1e-4训练30个epoch。学习率采用余弦退火调度从3e-4逐步降到1e-6。微调策略是预训练权重前几层冻结只微调最后两层的卷积块和全连接层。如果训练集有2万张以上可以全部解冻让模型在飞机数据上充分适配。import torch.nn as nn from torchvision import models model models.resnet50(weightsmodels.ResNet50_Weights.IMAGENET1K_V1) num_features model.fc.in_features model.fc nn.Linear(num_features, 100) # 100类飞机 # 冻结前四层stage的参数只微调最后一层与分类头 for name, param in model.named_parameters(): if name.startswith(layer4) or name.startswith(fc): param.requires_grad True else: param.requires_grad False optimizer torch.optim.AdamW( filter(lambda p: p.requires_grad, model.parameters()), lr3e-4, weight_decay1e-4 )model.fc nn.Linear(num_features, 100)替换分类头将输出维度从1000ImageNet类别数改到100。冻结layer4之前的层意味着只训练 last stage 和分类头参数量大约占全模型的40%左右对显存压力小、收敛快。如果你的训练集足够大可以尝试把requires_grad全改成True做全量微调如果测试集准确率比预训练模型直接提取特征只训练分类头高不了多少那说明你的数据和预训练任务的分布差异太小了模型还有潜力没被挖出来。提示batch size 没有固定值64是RTX 3090级别显卡的舒适区。显存不够就调成32但学习率要等比例下调比如改成1.5e-4否则大学习率配小batch容易震荡。4.3 在测试集上的评估指标Top-1 准确率、Top-5 准确率与单类表现车辆分类比赛里 Top-1 准确率是硬指标飞机100分类这种细粒度任务我更看重 Top-5 准确率。因为飞机型号之间的差异实在太小波音737-800和波音737-900在远处看几乎一模一样一个普通标注员都未必能保证100%正确。如果模型 Top-5 准确率在95%以上说明模型已经锁定了一个非常小的候选集合只是在这几个高度相似的型号之间犹豫。评估代码需要在测试集上计算 Top-1 和 Top-5 两项指标import torch def evaluate(model, test_loader, top_k(1, 5)): model.eval() correct_top1, correct_top5, total 0, 0, 0 with torch.no_grad(): for images, labels in test_loader: images, labels images.cuda(), labels.cuda() outputs model(images) _, pred_top5 outputs.topk(5, dim1, largestTrue, sortedTrue) correct_top5 (pred_top5 labels.view(-1, 1)).sum().item() correct_top1 (pred_top5[:, 0] labels).sum().item() total labels.size(0) acc_top1 correct_top1 / total acc_top5 correct_top5 / total return acc_top1, acc_top5outputs.topk(5, dim1)取出每张测试图概率最高的5个类别索引pred_top5 labels.view(-1, 1)用广播机制对比这5个索引里是否包含真实标签。注意这里用.sum().item()而不是.item()因为返回的是张量。.eval()模式关键PyTorch 的 Dropout 和 BatchNorm 在训练和推理时的行为不同忘掉这一步测试结果完全不可信。我在初做数据集时就是因为漏了.eval()测试集上的准确率一直停留在50%排查了整整半天。5. 做飞机100分类数据集避坑指南五个真实翻车点5.1 现象训练 loss 正常下降但测试集准确率突然崩盘训练集和验证集上的准确率已经到90%一上测试集立刻跌到60%以下。这个问题我在制作飞机数据集时遇到过两次原因无一例外是训练集分布和测试集分布差异过大。飞机图像里这个差异非常隐蔽训练集里大量图像来自航展摄影背景是蓝天绿地而测试集里大量图像来自机场实拍背景是跑道和航站楼。模型学会的其实是“蓝天背景→某个类别”的相关性而不是飞机外形。解决思路不是把测试集里的机场背景图剔除而是去训练集里补充机场场景的飞机图像。一个更高效的做法是使用背景混合增强把训练图像随机贴到新的背景图上用脚本生成“虚拟机场场景”。我在实际项目中用背景替换增强后测试集准确率从62%提升到81%提升幅度非常大。5.2 现象验证集准确率高得离谱但模型一上线就翻车验证集分数高测试集分数低这种情况的根源通常是验证集参与了训练过程。很多人会在训练过程中反复看验证集准确率发现不涨就改学习率、改网络结构、加数据增强——这实际上是在用验证集做超参搜索验证集已经被“污染”了。你调得越久验证集分数越虚高测试集这个真正的考卷给出的分数就越难看。解决方法是严格控制测试集的“探视次数”。从一开始就把测试集放到一个单独的文件夹并加读保护脚本平时训练、验证、调参一律不看测试集结果。只有当模型和超参全部确定后才跑一次测试集评估得到的分数作为最终成绩。有些竞赛团队会训练多个模型后专门挑一个测试集分数最高的去提交这也是不对的——测试集被你“看”过之后它就不再是陌生考卷了。5.3 现象某几类飞机准确率恒为0模型每次都把它们判成别类飞机100分类里总有几个类别是模型完全认不出来的通常是外观极其相似的机型例如波音737-700和737-800。这两类飞机的机身长度、翼展差异都不到两米单纯看图片人眼都容易出错。准确率恒为0不代表模型愚蠢更可能是因为样本量不足737-700本身产量少网上能公开获取的图像本身就少单类训练图像可能只有50张模型学不出区分性特征。解决思路分两步第一步检查单类训练样本量低于100张的类直接删除或者合并到上级系列类别比如把737-700合并到737-800类并标注为“737系列”第二步对保留的困难类别做难例挖掘在训练中记录那些被错误分类的图像单独抽样查看是标注错误还是图像质量过低。如果某类测试图像本身模糊或分辨率太低连标注员都分不清这类图像应该移出测试集而不是让模型背锅。5.4 现象训练时每秒处理样本数越来越少最后直接跑不动这是数据加载的瓶颈不是模型的问题。飞机图像的分辨率普遍很高很多来自专业摄影的图像边长在2000像素以上。如果 DataLoader 每次读取原始大图然后 ResizeIO和CPU解码会成为瓶颈。我曾经用一张高分辨率原图做训练epoch 时间从15分钟涨到2小时排查半天才发现瓶颈在图像解码耗时。解决方法是离线预处理把数据提前缩小到256x256存储为 JPEG而不是每次训练时在线解码大图。对测试集尤其要这么做因为测试集只需要评估一两次预处理好之后评估速度会提升数倍。另外 DataLoader 的num_workers参数建议设为CPU核心数的1到2倍pin_memoryTrue可以提高 GPU 数据拷贝效率这几个参数加起来能省下大量时间。5.5 现象测试集准确率比训练集还高这件事反而可疑测试集分数高于训练集分数很多人会觉得是好事实际上这往往意味着“伪泛化”。常见的原因是测试集中的图像分布过于单一——比如测试集大部分图像来自同一个摄影展、同一架飞机的连拍这类图像太“简单”了模型轻松识别。测试集的一个重要设计原则是难度要匹配训练集分布不能全是简单的正面图。我的习惯是每类测试图像里至少包含30%的侧面图、20%的背面图、10%的复杂背景图。如果发现某一类的测试图全部来自同一个角度回去检查测试集的构建逻辑你是否用了前面的“按源划分”脚本是否在划分时只随机打乱了文件列表而没有观察类别内的角度分布测试集不是数据榨干了就能用它需要有温度和难度。6. 把测试集用出价值混淆矩阵、难例分析与数据增补闭环测试集评估完之后不要只记下一个准确率数字就完事。真正有用的工作是打开模型在黑匣子上开的那扇窗——混淆矩阵。飞机100分类的混淆矩阵是一个100x100的矩阵行列分别代表真实类别和预测类别矩阵中非对角线上的亮点就是模型犯错的区域。我看混淆矩阵时只看两类信息一是哪些类别对之间高频混淆二是哪些类别被“系统性”地误分为另一个固定类别。对于飞机分类高频混淆对通常集中在同厂商同系列的机型之间比如空客A319/A320/A321这三兄弟。系统性的误分则可能暗示训练数据存在标注偏差。有一种隐蔽情况某类飞机的图像背景大多有同一颜色的廊桥或机库模型学到了这个背景特征导致其他背景相似的类别被误判过来。这个用混淆矩阵看不出来需要回到训练集做“注意力热力图”检查。难例分析的方向是找出模型预测置信度接近50%的那些图像。这类图像是数据集的“边缘地带”也是最有价值的增补方向。下面的脚本用来筛选测试集中的难例import torch def find_hard_examples(model, test_loader, threshold0.5, topn50): model.eval() hard_list [] with torch.no_grad(): for images, labels, paths in test_loader: outputs torch.softmax(model(images.cuda()), dim1) conf, pred outputs.max(dim1) for i in range(images.size(0)): if conf[i].item() threshold: hard_list.append((paths[i], labels[i].item(), pred[i].item(), conf[i].item())) hard_list.sort(keylambda x: x[3]) # 按置信度升序 return hard_list[:topn]conf threshold筛选出置信度低于0.5的图像排序后取前50张。对这50张图逐张检查三个问题是标注错误还是图像本身模糊如果标注错误回到测试集修正标注如果图像太模糊直接删除如果图像质量没问题但模型就是分不清说明该品种的训练样本不足记录下来去补充训练数据。这是一个数据增补闭环测试集难例 → 分析成因 → 反向指导训练集增补 → 重新训练 → 重新评估。训练集不是一次性资产它应该在难例分析的驱动下持续迭代。我现在的习惯是每一次完整实验结束后都把测试集的难例清单连同混淆矩阵保存成一个 HTML 报告按版本号归档。三个月后回看这个报告能非常清楚地看到哪些问题是模型架构引入的哪些问题是数据本身固有的。这个习惯帮我避免了很多重复劳动——同一批难例换一个更强的模型确实能解决其中一部分但如果困难来自标注噪声换再大再强的模型也白费。测试集的意义不在于给你一个好看的分数而在于诚实地告诉你你的模型离真实场景还有多远。希望这份避坑笔记能帮你少走一些弯路。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询