GEE中FeatureCollection数据类型详解与应用
1. 深入理解GEE中的FeatureCollection数据类型在Google Earth EngineGEE这个强大的地理空间分析平台中FeatureCollection是最基础也是最重要的数据类型之一。作为一名长期使用GEE进行地理数据处理的分析师我发现很多初学者在使用FeatureCollection时常常会遇到各种问题比如不知道如何正确过滤数据、如何进行有效聚合计算等。这些问题往往源于对FeatureCollection数据结构理解不够深入。FeatureCollection本质上是一个由多个Feature对象组成的集合每个Feature包含几何图形Geometry和属性Properties两部分。这就像是一个Excel表格每一行代表一个Feature而列则包含了空间信息几何图形和各种属性字段。理解这个基本结构对于后续的数据操作至关重要。提示在GEE中处理FeatureCollection时始终要记住它同时包含空间信息和属性信息这与其他纯表格数据有着本质区别。1.1 FeatureCollection的核心组成要素让我们拆解一个典型的FeatureCollection对象看看它到底包含哪些关键部分几何图形Geometry这是每个Feature的空间表示可以是点、线、面等任何几何类型。在GEE中几何图形不仅仅是可视化元素更是空间分析的基础。属性Properties这是一组键值对存储了与几何图形相关的各种属性信息。例如一个表示城市的Feature可能包含人口数量、GDP等属性。系统属性System PropertiesGEE自动为每个FeatureCollection添加的元数据如system:index等这些属性在数据过滤和连接操作中非常有用。// 示例创建一个简单的FeatureCollection var features [ ee.Feature(ee.Geometry.Point([-122.09, 37.42]), {name: Stanford, population: 17000}), ee.Feature(ee.Geometry.Point([-122.08, 37.43]), {name: Palo Alto, population: 66000}) ]; var featureCollection ee.FeatureCollection(features); print(featureCollection);这段代码创建了一个包含两个点的FeatureCollection每个点都有名称和人口属性。在实际工作中我们很少需要手动创建FeatureCollection更多的是从GEE的数据集中加载现有的FeatureCollection。1.2 FeatureCollection与其他数据类型的区别GEE中有多种数据类型理解FeatureCollection与它们的区别有助于选择正确的数据处理方式与Image的区别Image是栅格数据而FeatureCollection是矢量数据。Image适用于连续表面的分析如NDVIFeatureCollection更适合离散对象的分析如行政区划。与ImageCollection的区别ImageCollection是多个Image的集合通常代表同一区域不同时间的数据FeatureCollection则是多个Feature的集合通常代表同一时间不同空间对象的数据。与List的区别List是简单的有序集合不包含空间信息也不能直接进行空间分析操作。在实际项目中我们经常需要在不同类型之间转换。例如将FeatureCollection转换为Image以便进行栅格分析或者将Image分类结果转换为FeatureCollection进行进一步处理。2. FeatureCollection的常用操作与方法掌握了FeatureCollection的基本概念后我们来看看在实际工作中最常用的操作方法。这些方法构成了GEE中矢量数据处理的基础工具集。2.1 数据过滤与筛选过滤是处理FeatureCollection最常见的操作之一。GEE提供了多种过滤方式每种方式适用于不同的场景filterMetadata()基于属性值过滤// 过滤人口大于50000的城市 var largeCities featureCollection.filterMetadata(population, greater_than, 50000);filterBounds()基于空间位置过滤// 过滤特定区域内的要素 var region ee.Geometry.Rectangle([-122.5, 37.0, -121.5, 38.0]); var citiesInRegion featureCollection.filterBounds(region);filter()使用任意条件过滤// 使用自定义函数过滤 var filtered featureCollection.filter(ee.Filter.and( ee.Filter.gt(population, 10000), ee.Filter.lt(population, 100000) ));注意GEE中的过滤操作是延迟执行的只有在需要结果时才会实际计算。这与传统的客户端JavaScript不同需要特别注意。2.2 属性操作与计算FeatureCollection的强大之处在于可以对属性进行各种计算和操作map()对每个Feature应用函数// 为每个城市添加人口密度属性 var withDensity featureCollection.map(function(feature) { var area feature.geometry().area().divide(1000000); // 转换为平方公里 var population feature.getNumber(population); var density population.divide(area); return feature.set(density, density); });reduceColumns()跨Feature计算统计值// 计算所有城市的总人口 var totalPopulation featureCollection.reduceColumns({ reducer: ee.Reducer.sum(), selectors: [population] }).get(sum);aggregate_*()快速统计方法// 快速获取人口最大值 var maxPopulation featureCollection.aggregate_max(population);在实际项目中我经常结合使用这些方法。例如先过滤出特定区域的数据然后计算统计指标最后再对结果进行进一步处理。这种链式操作是GEE编程的典型模式。2.3 空间操作与分析FeatureCollection支持丰富的空间分析功能这是它区别于普通表格数据的核心特点空间连接Spatial Join// 将点数据与面数据连接 var countries ee.FeatureCollection(USDOS/LSIB_SIMPLE/2017); var citiesWithCountry ee.Join.spatial().apply({ primary: featureCollection, secondary: countries, condition: ee.Filter.withinDistance({ distance: 5000, leftField: .geo, rightField: .geo }) });缓冲区分析Buffer// 为每个城市创建缓冲区 var buffered featureCollection.map(function(feature) { return feature.buffer(5000); // 5公里缓冲区 });空间统计Zonal Statistics// 计算每个行政区内的平均NDVI var ndvi ee.ImageCollection(MODIS/006/MOD13A2).select(NDVI).mean(); var stats featureCollection.map(function(feature) { var mean ndvi.reduceRegion({ reducer: ee.Reducer.mean(), geometry: feature.geometry(), scale: 1000 }); return feature.set(mean_ndvi, mean.get(NDVI)); });在实际工作中空间操作往往是项目中最耗时的部分。我建议在处理大型FeatureCollection时先进行适当的地理范围裁剪和属性过滤以减少计算量。3. FeatureCollection的性能优化技巧随着数据量的增加FeatureCollection的操作可能会变得缓慢。下面分享一些我在实际项目中总结的性能优化经验。3.1 数据加载与预处理选择合适的精度级别不是所有分析都需要高精度几何图形。对于大范围分析可以适当简化几何图形var simplified featureCollection.map(function(feature) { return feature.simplify(100); // 100米容差 });提前过滤不必要的数据在加载数据时就进行过滤而不是加载全部数据后再过滤// 不好的做法 var allData ee.FeatureCollection(TIGER/2018/States); var filtered allData.filter(ee.Filter.eq(NAME, California)); // 好的做法 var filtered ee.FeatureCollection(TIGER/2018/States) .filter(ee.Filter.eq(NAME, California));使用系统索引加速查询GEE为每个FeatureCollection自动生成系统索引可以利用它来加速特定查询var byIndex featureCollection.filter(ee.Filter.inList(system:index, [0, 2]));3.2 计算优化策略批量处理优于循环尽可能使用map()等批量操作方法而不是客户端循环// 不好的做法 for(var i0; ifeatureCollection.size().getInfo(); i) { var feature ee.Feature(featureCollection.toList(1, i).get(0)); // 处理单个feature } // 好的做法 var processed featureCollection.map(function(feature) { // 处理逻辑 });合理使用reduce()对于需要跨Feature的计算使用reduce()比客户端聚合更高效// 计算所有Feature的几何图形并集 var union featureCollection.geometry().union();控制中间结果大小在链式操作中避免生成过大的中间结果// 不好的做法 var largeIntermediate featureCollection.map(heavyComputation); var filtered largeIntermediate.filter(someCondition); // 好的做法 var filtered featureCollection.filter(someCondition).map(heavyComputation);3.3 内存管理与错误处理监控内存使用大型FeatureCollection操作可能导致内存不足错误try { var result featureCollection.limit(10000).getInfo(); } catch (e) { print(内存不足尝试分批处理); // 分批处理逻辑 }分批处理大数据集对于非常大的FeatureCollection可以分批处理var batchSize 1000; var batches featureCollection.size().divide(batchSize).ceil(); for(var i0; ibatches; i) { var batch featureCollection.toList(batchSize, i*batchSize); // 处理当前批次 }使用evaluate()异步获取结果对于耗时操作使用evaluate()而非getInfo()featureCollection.reduceColumns({ reducer: ee.Reducer.sum(), selectors: [population] }).evaluate(function(result) { print(总人口:, result.sum); });这些优化技巧是我在多个GEE项目中积累的经验特别是在处理国家级甚至全球尺度的矢量数据时合理的优化可以节省大量时间和计算资源。4. FeatureCollection的实际应用案例理论和方法固然重要但实际案例更能展示FeatureCollection的强大功能。下面我将分享几个我在工作中遇到的典型应用场景。4.1 行政区划数据分析行政区划数据是典型的FeatureCollection应用场景。假设我们需要分析中国各省份的人口密度// 加载中国省级行政区划数据 var chinaProvinces ee.FeatureCollection(users/your_account/china_provinces); // 计算每个省份的人口密度 var withDensity chinaProvinces.map(function(feature) { var area feature.geometry().area().divide(1000000); // 转换为平方公里 var population feature.getNumber(population); var density population.divide(area); return feature.set(density, density); }); // 可视化人口密度 var visualization { min: 0, max: 1000, palette: [white, blue, green, yellow, red] }; Map.addLayer(withDensity.style({ color: density, fillColor: density, width: 1, fillOpacity: 0.8, palette: visualization.palette, min: visualization.min, max: visualization.max }), {}, Population Density);这个例子展示了如何加载行政区划数据计算派生指标并进行可视化。在实际项目中我们可能还需要进行更复杂的分析如计算邻接省份的平均密度、识别高低密度聚集区等。4.2 点数据聚合分析处理大量点数据时我们常常需要将其聚合到网格中进行分析// 创建网格 var grid ee.FeatureCollection(ee.Feature(ee.Geometry.Rectangle([-180, -90, 180, 90]), null)) .geometry() .coveringGrid(EPSG:4326, 1.0); // 1度网格 // 加载城市点数据 var cities ee.FeatureCollection(users/your_account/world_cities); // 统计每个网格内的城市数量 var counts grid.map(function(cell) { var citiesInCell cities.filterBounds(cell.geometry()); return cell.set(count, citiesInCell.size()); }); // 可视化 Map.addLayer(counts.style({ color: count, fillColor: count, width: 0, fillOpacity: 0.6, palette: [white, blue, purple, red], min: 0, max: 50 }), {}, City Counts);这种空间聚合技术适用于各种点数据分析如气象站点、地震震中、POI兴趣点等。通过调整网格大小可以在不同尺度上分析点数据的分布模式。4.3 时间序列分析结合FeatureCollection结合ImageCollection和FeatureCollection可以进行更丰富的时空分析// 加载NDVI时间序列数据 var ndvi ee.ImageCollection(MODIS/006/MOD13A2).select(NDVI); // 加载研究区域 var regions ee.FeatureCollection(users/your_account/study_areas); // 计算每个区域每月的平均NDVI var monthlyStats regions.map(function(region) { var timeSeries ndvi.filterBounds(region.geometry()) .map(function(image) { var date ee.Date(image.get(system:time_start)); var month date.get(month); var year date.get(year); var mean image.reduceRegion({ reducer: ee.Reducer.mean(), geometry: region.geometry(), scale: 1000 }).get(NDVI); return ee.Feature(null, { month: month, year: year, mean_ndvi: mean, date: date.format(YYYY-MM) }); }); return region.set(time_series, ee.FeatureCollection(timeSeries)); }); // 提取一个区域的时间序列数据 var firstRegion ee.Feature(monthlyStats.first()); var timeSeries ee.FeatureCollection(firstRegion.get(time_series)); // 绘制时间序列图表 var chart ui.Chart.feature.byFeature({ features: timeSeries, xProperty: date, yProperties: mean_ndvi }); print(chart);这种分析方法在生态监测、农业估产等领域非常有用。通过结合时间序列和空间区域我们可以同时分析时空变化模式。4.4 高级应用空间热点分析最后分享一个更高级的应用案例——使用FeatureCollection进行空间热点分析// 加载犯罪点数据 var crimePoints ee.FeatureCollection(users/your_account/crime_data); // 创建核密度估计函数 function kde(points, radius, bounds) { // 创建网格 var grid bounds.coveringGrid(EPSG:3857, 500); // 500米网格 // 计算每个网格点的密度 var density grid.map(function(cell) { var center cell.geometry().centroid(); var neighborhood points.filterBounds(center.buffer(radius)); var count neighborhood.size(); var densityValue count.divide(ee.Number(radius).pow(2).multiply(Math.PI)); return cell.set(density, densityValue); }); return density; } // 计算核密度 var bounds crimePoints.geometry().bounds().buffer(5000); var crimeDensity kde(crimePoints, 1000, bounds); // 可视化热点 Map.addLayer(crimeDensity.style({ color: density, fillColor: density, width: 0, fillOpacity: 0.7, palette: [blue, green, yellow, red], min: 0, max: 0.0001 }), {}, Crime Hotspots);这种空间分析方法可以识别犯罪热点区域、疾病聚集区等空间模式。通过调整核半径可以检测不同尺度的空间聚集现象。5. 常见问题与解决方案在实际工作中使用FeatureCollection时难免会遇到各种问题。下面整理了一些常见问题及其解决方案这些都是我在项目中实际遇到并解决过的案例。5.1 数据加载与大小限制问题1加载大型FeatureCollection时报内存不足错误。解决方案使用limit()限制返回的Feature数量分批处理数据在服务器端完成尽可能多的计算只将最终结果下载到客户端// 分批处理示例 var batchSize 1000; var totalSize featureCollection.size(); var batches ee.Number(totalSize).divide(batchSize).ceil(); for(var i0; ibatches.getInfo(); i) { var batch featureCollection.toList(batchSize, i*batchSize); // 处理当前批次 }问题2从外部数据源导入的FeatureCollection无法正常工作。解决方案检查几何图形是否有效feature.geometry().isValid()确保属性字段名称不包含特殊字符在导入前使用QGIS等工具预处理数据5.2 空间分析中的常见陷阱问题3空间连接操作返回的结果不符合预期。解决方案检查坐标系统是否一致验证几何图形有效性调整空间连接的距离容差// 更可靠的空间连接示例 var joined ee.Join.spatial().apply({ primary: primaryFC, secondary: secondaryFC, condition: ee.Filter.intersects({ leftField: .geo, rightField: .geo, maxError: 10 // 设置适当的误差范围 }) });问题4跨日期变更线的分析出现异常。解决方案使用geometry().transform()将数据转换到合适的投影考虑将数据分割为东西半球分别处理使用geometry().splitAntimeridian()方法处理跨日期变更线的几何图形5.3 性能优化问题问题5复杂计算运行时间过长。解决方案使用explain()方法分析计算流程简化几何图形减少不必要的属性字段使用索引加速查询// 使用explain分析计算 print(ee.FeatureCollection(featureCollection) .filter(ee.Filter.gt(population, 1000000)) .reduceColumns(ee.Reducer.mean(), [population]) .explain());问题6可视化大型FeatureCollection时浏览器卡顿。解决方案使用style()方法替代直接可视化降低可视化精度只显示当前视图范围内的数据// 高效可视化示例 Map.addLayer(featureCollection.style({ color: red, fillColor: 00000000, // 透明填充 width: 1 }), {}, Optimized Visualization);5.4 数据导出问题问题7导出FeatureCollection时失败。解决方案检查导出任务是否超过GEE的限制如Feature数量、属性大小等将大型导出任务拆分为多个小任务使用select()只导出必要的属性字段// 优化后的导出示例 Export.table.toDrive({ collection: featureCollection.select([name, population]), description: Cities_Export, fileFormat: CSV, selectors: [name, population] // 明确指定导出的列 });问题8导出的几何图形在GIS软件中显示异常。解决方案导出时指定明确的CRS坐标参考系统在导出前简化几何图形考虑导出为GeoJSON而非Shapefile// 指定CRS的导出示例 Export.table.toDrive({ collection: featureCollection, description: Cities_With_CRS, fileFormat: SHP, crs: EPSG:4326 // 明确指定WGS84坐标系统 });这些问题的解决方案大多来自实际项目经验每个项目可能会遇到不同的具体情况。关键是要理解FeatureCollection的工作原理这样在遇到问题时才能快速定位并找到合适的解决方法。

相关新闻

跨端开发技术演进与AI赋能实践指南

跨端开发技术演进与AI赋能实践指南

1. 跨端开发的技术演进与AI赋能 前端跨端开发领域正在经历前所未有的变革。从早期的Hybrid混合开发到React Native/Flutter等跨平台框架,再到如今AI技术深度介入,开发者工具链和开发范式都在快速迭代。我亲历了从2015年至今的完整技术周期,见…

2026/10/2 5:20:32 阅读更多 →
Flutter Getx插件核心价值与实战指南

Flutter Getx插件核心价值与实战指南

1. Getx插件在Flutter中的核心价值解析 作为Flutter生态中最受欢迎的全能型解决方案,Getx以其轻量高效的特点赢得了大量开发者的青睐。我在多个商业项目中深度使用Getx后发现,它绝不仅仅是一个状态管理工具,而是一套完整的开发范式。其核心优…

2026/10/12 14:59:45 阅读更多 →
C++游戏编程入门:从SFML到游戏循环与ECS设计模式

C++游戏编程入门:从SFML到游戏循环与ECS设计模式

1. 项目概述:为什么选择C开启游戏编程之旅? 如果你对游戏开发感兴趣,并且正在寻找一个强大、经典且能让你深入理解计算机图形与性能核心的语言,那么C几乎是绕不开的选择。我最初接触游戏编程时,也曾在Python、C#和C之间…

2026/10/7 0:28:49 阅读更多 →

最新新闻

同花顺日线文件解析:从二进制乱码到可回测的OHLCV表

同花顺日线文件解析:从二进制乱码到可回测的OHLCV表

简介:这份资源面向金融数据分析初学者与量化爱好者,聚焦同花顺日线二进制文件(.day)的解析问题。压缩包仅4KB,内含2个文件:一个以600000为代码的日线样本文件,以及一份约20行的Python解析脚本&a…

2026/10/13 22:02:46 阅读更多 →
Axure RP 9 高效原型设计:动态面板、事件配置与母版管理实战指南

Axure RP 9 高效原型设计:动态面板、事件配置与母版管理实战指南

简介:《Axure RP 9 使用详解》docx文档面向产品经理、交互设计师及原型初学者,系统讲解从基础页面布局到动态面板、内联框架、函数等进阶交互功能,尤其针对项目投标时原型演示拿不出手的痛点,帮助读者做出专业、可演示的高保真原型…

2026/10/13 22:02:46 阅读更多 →
粒子群无功优化MATLAB实现:基于IEEE30节点的完整代码解析

粒子群无功优化MATLAB实现:基于IEEE30节点的完整代码解析

简介:针对电力系统网损偏高、电压质量不佳等运行优化需求,该资源提供基于粒子群算法的无功优化实现代码,采用IEEE30节点标准测试系统作为算例,适合电力专业研究生、科研人员与算法爱好者参考学习。代码完整覆盖粒子群寻优流程&…

2026/10/13 22:02:46 阅读更多 →
Spring Boot入门:自动配置与配置文件实战解析

Spring Boot入门:自动配置与配置文件实战解析

我最初接触 Spring Boot 时,最直观的感受就是"懒人福音"。这是 Spring 生态里少数能让我这种被 XML 配置折磨过的人,第一次体会到"开箱即用"的框架。如果你之前用传统 Spring 搭过项目,一定记得那些繁琐的配置&#xff1…

2026/10/13 22:02:46 阅读更多 →
FreeCAD中文翻译教程避坑指南:从参数化建模到动态数据驱动

FreeCAD中文翻译教程避坑指南:从参数化建模到动态数据驱动

简介:面向FreeCAD初学者的中文翻译版操作手册,它将官方英文文档wiki整理成更循序渐进的中文读本,帮助零基础用户快速理解参数化建模思路并掌握软件操作。FreeCAD是免费开源的跨平台3D建模软件,本手册涵盖安装、界面导航、3D视图、…

2026/10/13 22:02:46 阅读更多 →
基于SpringBoot的北京民宿推荐系统:内容算法与首都特色实践

基于SpringBoot的北京民宿推荐系统:内容算法与首都特色实践

1. 内容整体设计与思路拆解1.1 为什么是民宿推荐系统,而不是酒店预订系统先说个现象。很多人在做毕业设计时,一提到旅游住宿类系统,第一反应就是"酒店管理系统""民宿预订平台",但这类题目在答辩时很容易被打低…

2026/10/13 22:01:45 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →