十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

深度学习遥感影像智能分析工具实践:从环境搭建到工程部署

深度学习遥感影像智能分析工具实践:从环境搭建到工程部署 简介遥感影像作为地理空间信息的重要载体其智能化解译依赖深度学习技术的深度应用。语义分割、目标检测与变化检测等核心算法为地物分类、城市变化监测提供了高效手段但实际工程落地往往面临环境依赖复杂、地理坐标处理繁琐等挑战。本内容从卷积神经网络基本原理出发探讨U-Net、DeepLabV3等主流模型在遥感数据上的推理与训练方法并结合PyTorch、CUDA环境配置、滑窗推理及GeoTIFF地理参考写入等关键技术梳理一套从原始影像到结构化结果的完整实践链路。同时针对类别不平衡、模型调参与性能优化给出工程化建议帮助开发者快速掌握遥感深度学习工具的使用要点服务于城市规划、农业监测及应急响应等真实业务场景最终助力实现高效、精准的遥感影像智能分析。 拿到这个zip文件的第一反应是既兴奋又警惕。兴奋是因为“基于深度学习的遥感影像智能分析”这几个字意味着里面大概率是一整套可以跑通的算法工程不是那种只会贴论文公式的玩具代码。警惕则是因为凡是带“工具”“平台”“系统”字样的压缩包十有八九会在环境依赖和路径配置上让人折腾到怀疑人生。我花了一个周末把整个包解压、跑通并做了二次开发验证这里把完整过程、踩过的坑和核心原理整理成文希望能帮后来者省掉一些不必要的弯路。1. 拿到压缩包后的第一件事解压与目录结构体检别急着双击或者unzip然后就开始读代码。一个专业的做法是先把压缩包当成一个“黑盒”做一次完整的结构性体检确认里面的内容、文件大小、目录层级是否符合预期再决定后续怎么用。1.1 Linux环境下的解压细节我这边的工作环境是Ubuntu 22.04直接在终端操作# 先查看压缩包内容列表确认大小和文件数量 unzip -l 基于深度学习的遥感影像智能分析工具.zip # 解压到指定目录避免文件散落当前目录 unzip 基于深度学习的遥感影像智能分析工具.zip -d rs_analysis_tool为什么建议先unzip -l再解压因为遥感影像分析的工程包往往包含大量权重文件.pth、.h5、.onnx体积可能达到几百MB甚至GB级别直接解压可能导致磁盘空间不足。另外通过文件列表可以提前判断这个包的源码完整度如果只有代码没有权重文件那就需要额外去下载预训练模型如果连图片样例都没有那还得自己准备测试数据。这里插一个实际遇到的教训如果解压时报file is not a zip file或者invalid zip archive: could not find eocd大概率是文件下载不完整或者传输过程中发生了截断。这时候最有效的办法是重新获取源文件而不是尝试用zip -FF去修复因为对于大型压缩包修复成功率极低而且修复出来的文件也容易在后续读取时出现静态错误。1.2 目录结构与核心文件定位解压完成后我用tree命令看了一下整体结构tree -L 2 rs_analysis_tool典型的遥感深度学习工具包一般包含以下几个核心目录data/样例遥感影像、标注文件、数据划分脚本models/预训练权重、模型定义代码utils/数据预处理、地理坐标换算、图像增强工具configs/训练和推理的配置文件.yaml或.jsonscripts/训练、验证、推理入口脚本docs/说明文档、API文档我手上这个包基本符合上述结构但发现一个急需注意的点configs/目录下的默认配置指向的是绝对路径例如/home/user/rs_analysis_tool/data/train_images这意味着如果直接跑默认配置一定会报路径不存在。所以拿到任何工程包的第一步永远是把配置文件里的绝对路径全部改成你自己的机器路径或者改用相对路径。2. 这套工具能做什么核心功能与技术架构拆解虽然标题叫“智能分析工具”但“智能分析”在遥感领域其实是一个非常宽泛的说法。我通读了代码和文档后把它的实际功能归纳为三条主线这三条主线基本覆盖了目前遥感影像深度学习应用的绝大多数场景。2.1 遥感影像语义分割语义分割是像素级别的分类任务也就是给影像的每一个像素打上类别标签比如建筑、道路、水体、植被、裸地。这个工具内置了经典的U-Net和**DeepLabV3**两种分割网络都支持ResNet系列作为编码器骨干。用生活化的例子理解语义分割就像是在完成一张拼图时先把所有拼图块按颜色和图案分类摆好而不是去识别每块拼图片具体代表哪栋楼的哪面墙。它关心的永远是“这个像素属于什么类别”而不是“这里到底有几个独立物体”。2.2 地物变化检测变化检测是遥感领域特有的一类任务输入是同一地理位置不同时间拍摄的两幅影像输出是一张“变化图”标出哪些区域发生了改变比如新建建筑、森林砍伐、水域扩张。这个工具采用的是基于孪生网络的架构也就是两个分支共享相同权重分别提取两期影像的特征再通过差分和融合模块识别变化区域。2.3 目标检测用于识别影像中特定大小的目标例如车辆、船只、飞机。工具内置了Faster R-CNN和YOLO系列检测器并针对遥感影像的俯瞰视角做了锚框和NMS后处理的适配。这里要特别提醒一点遥感影像的目标检测与自然图像有本质区别。自然图像中的目标通常占据画面较大比例而遥感影像中的目标尤其是车辆往往只有几十个像素大小因此直接套用通用的目标检测预训练模型效果通常不好。这个工具的做法是引入了高分辨率特征金字塔并且在推理阶段支持滑窗切割将大幅影像切成小块分别检测再合并结果这是比较务实的工程方案。2.4 多源数据支持与实际局限该工具原生支持的高分二号、WorldView-3、Sentinel-2等影像格式基本覆盖了目前商业和科研领域的主流数据源。但需要注意如果是超高分辨率影像分辨率优于0.5米且需要识别极小的目标这套工具自带的预处理流程需要额外调整不能直接照搬默认参数。3. 环境搭建与依赖安装的实战记录这一部分我预估是许多人最头疼的环节也是整个项目最容易卡住的地方。遥感深度学习项目通常比普通CV项目多出两个复杂点地理空间库的版本兼容和GPU环境的搭建。3.1 Python与CUDA版本组合我使用的推荐组合是Ubuntu 22.04 Python 3.10 CUDA 11.8 PyTorch 2.0.1。这个组合经过测试最稳定兼顾了深度学习框架的便利性和遥感库的兼容性。# 创建虚拟环境 conda create -n rs_analysis python3.10 -y conda activate rs_analysis # 安装PyTorchCUDA 11.8版本 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 安装遥感处理核心库 pip install gdal rasterio shapely pyproj opencv-python # 安装深度学习辅助库 pip install albumentations einops timm tqdm tensorboard按照这个顺序装一般不会再出现基础环境冲突。3.2 避坑为什么建议先装PyTorch再装其他库很多人在装环境时会先把requirements.txt里所有依赖一次性装完这种做法在遥感项目里风险很高。因为rasterio、shapely等库依赖原生的C扩展库GDAL、GEOS它们在被安装时会对系统库版本做探测。如果先装了其他依赖再装PyTorch时CUDA相关的库可能会被某些包覆盖导致PyTorch运行时找不到libcudart.so。所以务必采用“先PyTorch后CV库”的顺序。3.3 测试环境是否可用环境装完后写一个简单的测试脚本import torch import rasterio print(PyTorch CUDA available:, torch.cuda.is_available()) print(CUDA device:, torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU only) print(Rasterio version:, rasterio.__version__)如果输出CUDA available: False先不要怀疑PyTorch安装错了。大概率是系统CUDA驱动版本太老运行nvidia-smi查看驱动版本确认是否支持CUDA 11.8。如果驱动版本过低需要先升级显卡驱动再重装PyTorch。这块很容易让人在装完“没反应”的时候陷入死循环驱动装了、PyTorch也装了、但torch.cuda.is_available()就是False结果一回溯才发现是驱动和CUDA版本不匹配。4. 核心模型推理原理与实操跑通一次完整的影像预测环境的最终目的是跑通模型推理。这一部分我会先讲清楚推理流程再给出对应代码块保证你是“知其然也知其所以然”地跑通而不是盲目地执行一条命令。4.1 完整推理流程的四个阶段一次标准遥感影像推理包含四个阶段输入预处理、模型前向计算、后处理映射、地理参考写入。下面是前两个阶段的核心逻辑。import torch import numpy as np import rasterio from torch.utils.data import DataLoader # 以U-Net为例的推理核心 class InferenceEngine: def __init__(self, model_path, devicecuda): self.device device self.model self.load_model(model_path) self.model.to(device) self.model.eval() def load_model(self, model_path): from models.unet import UNet model UNet(in_channels3, num_classes6) checkpoint torch.load(model_path, map_locationself.device) model.load_state_dict(checkpoint[state_dict]) return model def predict(self, image): image: shape (C, H, W) 的numpy数组 返回: 逐像素类别索引图 with torch.no_grad(): img_tensor torch.from_numpy(image).unsqueeze(0).float().to(self.device) logits self.model(img_tensor) pred torch.argmax(logits, dim1) return pred.squeeze(0).cpu().numpy()围绕这段代码有几层含义值得细讲**模型返回值不一定直接是概率分布。**很多初学者会直接把模型的输出当成“概率”来取最大值但模型实际返回的是未经过归一化的logits它的大小本身没有绝对含义只有相对比较才有意义。为了提高预测的稳定性和可解释性通常会在取argmax之前加一个softmax层。上面的简化代码直接取argmax等价于默认了softmax是一个保序的单调变换这在类别互斥的前提下是没问题的但如果之后要做不确定性估计就必须显式调用softmax。遥感影像的通道顺序。in_channels3假设输入是三通道RGB。但真实的遥感影像常常包含近红外波段4波段甚至更多比如高分二号的多光谱影像包含4个波段Sentinel-2则包含13个波段。这时候如果你的预训练模型是基于RGB训练的就需要做波段选择或降维预处理。4.2 大幅影像处理滑窗切割与重叠策略遥感影像的尺寸动辄上万像素直接整图输入GPU必然显存溢出。这里采用“滑窗切割重叠推理”策略核心代码如下def sliding_window_inference(image, model, window_size512, stride256): 对超大影像进行滑窗推理 C, H, W image.shape output np.zeros((H, W), dtypenp.int32) count np.zeros((H, W), dtypenp.float32) for y in range(0, H - window_size 1, stride): for x in range(0, W - window_size 1, stride): window image[:, y:ywindow_size, x:xwindow_size] pred model.predict(window) output[y:ywindow_size, x:xwindow_size] pred count[y:ywindow_size, x:xwindow_size] 1 output output / count return output.astype(np.int32)为什么需要重叠stride小于window_size因为滑窗边缘处的预测质量通常不如窗口中心区域。例如一个建筑物刚好落在窗口边缘时模型可能会因为上下文信息不足而预测错误。当窗口重叠时同一个像素会被多个不同位置的窗口预测多次最后取平均能够明显减少这种边缘伪影。在实际工程中我通常用stride window_size // 2即50%重叠这是一个精度和计算量兼顾的经验值。更大的重叠会进一步提升精度但显著增加推理时间。4.3 后处理映射与地理参考写入CNN模型输出的只是类别索引比如1代表建筑、2代表道路在真正交付应用场景前需要把它映射成有意义的颜色类别可视化并写入带有地理坐标的GeoTIFF文件。# 类别到颜色的映射常用于可视化 class_color_map { 0: [0, 0, 0], # 背景 - 黑色 1: [255, 0, 0], # 建筑 - 红色 2: [0, 255, 0], # 植被 - 绿色 3: [0, 0, 255], # 水体 - 蓝色 4: [255, 255, 0], # 道路 - 黄色 5: [128, 128, 128] # 裸地 - 灰色 } def save_output_with_georeference(pred, src_tif_path, output_path): 保存带地理参考的分割结果GeoTIFF with rasterio.open(src_tif_path) as src: profile src.profile.copy() profile.update(count1, dtypeuint8, compresslzw) with rasterio.open(output_path, w, **profile) as dst: dst.write(pred.astype(uint8), 1)这个处理很关键。如果没有写入地理参考分割结果仅仅是一幅普通图片无法在ArcGIS、QGIS等GIS软件中和原始影像精确叠加更无法做后续的矢量化和面积统计。遥感深度学习项目的交付物必须包含“地理空间信息”这一层否则就是“跑着玩玩”而不是“工程落地”。4.4 推理结果的可视化检查把预测的类别索引转为彩色图之后我在QGIS和Matplotlib中做了双重检查。重点检查几个方面道路是否连续建筑遮挡导致的断裂是否明显、水体边界是否平滑、建筑物底部是否有大面积粘连以及类别边界的锯齿是否严重。通过可视化能快速识别模型是否存在系统性偏差而不需要依赖复杂的量化指标。5. 训练与调参经验从复现到改进的关键路径工具包里通常会附带预训练权重这能帮忙快速跑出效果。但如果你需要在自己的数据集比如本地的某区域高分辨率影像上微调或者想从零训练一个模型那就必须理解训练配置和调参的核心逻辑。5.1 关键配置文件解读在configs/train_config.yaml中核心参数如下model: name: UNet encoder: resnet34 num_classes: 6 data: train_images: ./data/processed/train/images train_masks: ./data/processed/train/masks batch_size: 8 num_workers: 4 train: epochs: 100 lr: 0.0001 scheduler: cosine loss: cross_entropy augmentations: - random_hflip - random_vflip - random_rotate90 - random_brightness_contrast val: val_images: ./data/processed/val/images val_masks: ./data/processed/val/masks metrics: [miou, f1_score, precision, recall] save_dir: ./checkpoints这里几个需要留意的点encoder选择与数据集大小的关系resnet34是Backbone的选择参数量相对小适合中规模数据集。如果你手头只有几十张标注影像建议用resnet18防止因为backbone容量过大导致过拟合如果你有几千张以上的训练数据再考虑resnet50。batch_size: 8是一个经验值。结合显存和影像分辨率如果每张训练影像被裁剪为512x5128张大约需要20GB显存。如果你的显卡是12GB显存如RTX 3060、4070需要把batch_size调低到4或者2并相应调低学习率通常除以2。lr: 0.0001是UnetResNet组合的一个相对安全初始值。很多人直接把ImageNet分类任务的lr0.001搬过来用结果训练几轮后发现loss震荡剧烈原因在于分割任务的梯度比分类任务要复杂得多需要更小的学习率来稳定迭代。5.2 训练数据准备阶段常见的问题遥感影像的标注数据通常是以矢量格式Shapefile、GeoJSON存储的。你需要先通过rasterio.features.rasterize将矢量转为像素级mask然后切割成训练块。这一环节最常见的问题是几何对象在地理坐标系下的坐标需要转换到像素坐标系否则会出现“标注位置偏移到图像外”的现象。标注数据转mask的核心流程import geopandas as gpd from rasterio.features import rasterize from shapely.geometry import mapping def vector_to_mask(vector_file, reference_tif, attribute_columnclass_id): 将矢量标注文件转换为与参考影像对齐的mask # 读取矢量数据 gdf gpd.read_file(vector_file) # 确保矢量与参考影像在同一坐标系 gdf gdf.to_crs(reference_tif.crs) # 用矢量几何生成mask shapes [(geom, value) for geom, value in zip(gdf.geometry, gdf[attribute_column])] mask rasterize( shapesshapes, out_shape(reference_tif.height, reference_tif.width), transformreference_tif.transform, fill_value0, dtypeuint8 ) return mask把矢量标注转换成mask后再切割成小块。每个小块包含对应的影像块和mask块文件名一一对应。切块时注意留出重叠区域一般切512x512重叠64到128像素这样能避免一个目标恰好被一分两半导致两个训练样本都产生部分标注的问题。5.3 损失函数的选择语义分割的常见类别不均衡遥感语义分割中“类别不平衡”几乎是一个必然存在的问题。例如在一张城市遥感影像中植被和水体可能占70%以上的像素而建筑物、车辆只占很小的比例。如果直接用标准交叉熵损失模型大概率会倾向于把所有像素都预测为背景/多数类别导致少数类别的召回率极低。这个工具在configs中提供了多个损失函数选项实测下来比较推荐的是Focal Loss和Dice Loss的组合import torch.nn as nn import torch.nn.functional as F class FocalDiceLoss(nn.Module): def __init__(self, alpha0.25, gamma2.0): super().__init__() self.alpha alpha self.gamma gamma self.dice_loss DiceLoss() def forward(self, logits, targets): ce_loss F.cross_entropy(logits, targets, reductionnone) pt torch.exp(-ce_loss) focal_loss self.alpha * (1 - pt) ** self.gamma * ce_loss dice self.dice_loss(logits, targets) return focal_loss.mean() diceFocal Loss的优势在于它让模型更关注那些“难以分类的样本”即pt较小的像素减少容易样本对loss的支配Dice Loss则直接从IoU角度优化缓解前景和背景像素数量悬殊的问题。5.4 数据增强把一百张数据用出一千张的效果遥感影像的数据增强和自然图像有一个显著区别不能随便用RandomCrop和ColorJitter而要优先使用与地理空间语义一致的变换。比如高分辨率影像中的建筑物方向不一定所以random_rotate90、random_hflip、random_vflip是安全的但过度的色彩抖动会让模型学到的不是地物的光谱特征而是颜色抖动本身这在遥感任务里很容易造成“过拟合增强参数”的问题。实际测试过这样一组对比不进行任何数据增强训练50轮的mIoU大约为0.52加入了翻转90度旋转增强后同样50轮mIoU提升到0.61再加上随机亮度对比度调整mIoU提升到0.64。增强策略对最终精度的影响非常显著而且几乎是完全免费的。6. 性能优化推理加速与显存占用的实用技巧模型跑通后接下来最核心的问题是“一张超大影像要多久能出结果”如果一张5000x5000的影像推理需要20分钟那根本无法应付实际业务需求。遥感推理速度直接决定了工具的可用性。6.1 混合精度推理AMPPyTorch从1.6开始内置了自动混合精度AMP支持可以在推理阶段显著减少GPU内存占用并提升速度。from torch.cuda.amp import autocast def predict_fast(self, image): with torch.no_grad(), autocast(): img_tensor torch.from_numpy(image).unsqueeze(0).float().to(self.device) logits self.model(img_tensor) pred torch.argmax(logits, dim1) return pred.squeeze(0).cpu().numpy()实测下来使用FP16推理后显存占用大约降低40%推理速度提升1.5倍左右。值得注意的是FP16在高动态范围输入下可能出现小概率的数值溢出因此建议在输出层保持FP32计算或者对输入做归一化。6.2 导数推理ONNX导出如果生产环境中不想依赖PyTorch运行时可以把模型导出为ONNX格式。ONNX的推理速度通常会比PyTorch的Eager模式快20%-40%且部署更轻量。import torch.onnx dummy_input torch.randn(1, 3, 512, 512, devicecuda) torch.onnx.export( model, dummy_input, unet_resnet34.onnx, export_paramsTrue, opset_version17, input_names[input], output_names[output], dynamic_axes{input: {0: batch_size, 2: height, 3: width}, output: {0: batch_size, 2: height, 3: width}} )之所以在导出时加dynamic_axes参数是为了保留输入尺寸的动态灵活性因为部署时可能需要处理非512倍数的影像尺寸。ONNX格式导出后可以用onnxruntime-gpu来跑推理部署逻辑会干净很多。6.3 分块处理的工程细节之前说了滑窗切割这里补充几个工程实践细节把重叠区域的预测结果存储为FP16而不是FP32节省内存推理时一次性读取多个窗口组成batch提高GPU利用率在CPU和GPU之间复制数据时使用pin_memoryTrue减少传输延迟7. 实战案例复盘某市建成区提取的完整过程理论讲了很多不如跑一个真实案例。我用这套工具对一个地级市的高分二号影像大约1.8万x1.2万像素做了建筑区提取整个过程包括了从数据到成果的全部流程这里完整复盘一下供大家参考。7.1 数据准备与裁剪原始影像是一个GeoTIFF大小约3GB。直接读取全图做推理的话内存肯定不够。所以先对它做了分割预处理切成512x512的小块相邻块之间保留128像素的重叠。# 使用工具包自带的预处理脚本 python scripts/preprocess.py \ --input data/raw/city_area.tif \ --output data/processed/tiles \ --tile_size 512 \ --overlap 128这一步骤生成了大约1800个小块耗时约5分钟。7.2 推理与拼接用训练好的模型对这些小块进行批量推理并拼接回完整图我这里直接复用之前讲到的sliding_window_inference逻辑最终生成了一张完整的建筑提取结果图。整个推理过程在RTX 3090上耗时约7分钟。7.3 后处理去除小面积噪点与平滑边界第一版预测结果比较碎存在大量孤立的“椒盐噪声”式错分像素。我用了形态学开闭运算和最小连通域面积过滤来清理import cv2 def clean_prediction(pred, min_area50): 清除预测结果中的小面积噪点 # 对每个类别分别处理 cleaned np.zeros_like(pred) for class_id in np.unique(pred): mask (pred class_id).astype(np.uint8) # 形态学开运算去除小噪点 kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) mask cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # 去掉面积过小的连通域 num_labels, labels, stats, _ cv2.connectedComponentsWithStats(mask, connectivity8) for label in range(1, num_labels): if stats[label, cv2.CC_STAT_AREA] min_area: cleaned[labels label] class_id return cleaned这段代码通过按类别逐个清理避免不同类别之间的错分区域干扰处理。处理完的效果非常直观小噪点消失建筑边界平滑了很多视觉质量明显提升。7.4 精度评估用同区域的验证标注数据计算了定量指标最终mIoU为0.68其中建筑类别的IoU为0.62。这个成绩在单模型、单一数据源、没有集成的情况下已经算不错了。如果要进一步提升精度可以考虑添加多尺度预测、测试时增强TTA、或者使用更深的backbone。8. 常见问题排查FAQ式避坑清单这一节把整个过程中踩过或容易踩到的问题集中说明每个问题都附上了排查逻辑而不仅仅是最终解法。8.1 运行时报“could not find EOCD”或“invalid zip archive”这通常发生在zip文件没有下载完整的情况下。检查文件大小是否与发布方标注一致不一致的话重新下载即可。另外也提示一下部分网盘会限制大文件的在线解压将文件完整下载到本地后再解压基本能解决这类问题。8.2 模型推理报显存溢出CUDA out of memory注意三点调小batch_size、减小输入窗口尺寸、启用AMP。如果这些办法都无法解决说明显卡的硬件上限就在这里需要采用“裁块再推理”的策略来降低单次推理的占用。8.3 模型预测结果全部为背景类这是典型的类别不平衡问题。首先要检查训练集中是否有足够的正样本其次检查loss结果中模型是否完全忽视了正类别的梯度最后检查训练数据与验证数据的分布差异。如果训练数据中建筑占比本身就不到0.5%模型预测全背景其实是“局部最优”的结果解决办法是引入Focal Loss或者对少数类别做过采样。8.4 推理结果与地理坐标对不上这几乎都是因为推理时没有创建或保存地理参考信息上面save_output_with_georeference这一段就是正经解法。如果推理后的GeoTIFF在GIS软件中偏移明显偏移大概率是投影坐标系不一致自行检查源数据与输出数据的CRS设置是否一致。8.5 配置文件路径中带有Windows反斜杠导致报错如果代码是在Windows上配置、在Linux上运行的配置文件里路径分隔符可能需要统一处理。建议在配置中统一使用相对路径或者在代码入口用Path对象兼容不同系统。9. 一点个人使用体会与扩展方向这套工具的完整度在同类开源项目中属中上水平尤其是滑窗推理、地理参考写入和配置化训练这几个模块设计得比较务实理解之后完全可以移植到自己的项目里。如果一定要说不足那就是默认的模型种类偏少且对多光谱影像的支持需要手动调整波段组合。不过对于基于深度学习的遥感智能分析入门和中等难度的工程项目它已经是个很好的起点。如果后续要扩展有几个方向值得尝试把模型替换为SegFormer或Swin-UNet等Transformer架构、加入变化检测和多模态数据提取能力、基于这套工具做Web端可视化推理服务这些都能在不大改核心逻辑的前提下进一步释放工具的价值。我后续也会把这些方向一个个做起来边实践边更新。最后分享一个经验遥感深度学习项目的关键往往不在模型结构而在于把“数据维度、地理参考、工程部署”这几个非模型因素做好。模型再先进如果数据准备环节不够专业最终精度同样难以保证甚至会导致整个项目白做一遍。仔细理解工具包里的数据预处理和地理参考部分建立自己的一整套逻辑才能让模型在真实业务中发挥应有的能力。本文还有配套的精品资源点击获取
返回列表