使用AI工具辅助遥感影像处理测试(Deepseek网页端VS本地端VS文心一言)
AI多模型对比,用deepseek 网页端实现了影像有效区域提取
目前有一个数据处理的需求,需要使用python完成影像批处理,假设我只是个不懂编程的小白,决定采用AI工具辅助完成代码编写。
1.处理需求
tif格式的遥感影像,获取其有效区域的范围,以shp格式导出。遥感影像在arcgis中打开如下,可以看到其周边无效区域的值为nodata。

2.提示词
初始提示词为:python代码,读取tif格式影像,获取有效数据范围shp矢量,只导出有效区域的矢量范围,无效区域的不导出。
后续的提示词根据处理的结果或程序的bug追加。
3.AI模型表现
3.1 DeepSeek网页端
(1)访问方式
百度搜索deepseek关键词,进入官网,点击开始对话

(2)运行过程
模型第一次运行给出了矢量代码如下:
import rasterio
from rasterio.features import shapes
import geopandas as gpd
from shapely.geometry import shape
def export_valid_areas(input_tif, output_shp):
# 读取TIFF文件
with rasterio.open(input_tif) as src:
# 获取第一个波段的数据和元数据
band = src.read(1)
nodata = src.nodata
transform = src.transform
crs = src.crs
# 创建有效数据掩膜(True表示有效数据)
mask = band != nodata
# 生成多边形特征
features = shapes(mask, transform=transform, connectivity=4)
# 收集所有有效区域的多边形
geometries = []
for geom, value in features:
if value == 1: # 仅保留有效区域(值为1的要素)
geometries.append(shape(geom))
# 创建GeoDataFrame并设置坐标系
gdf = gpd.GeoDataFrame({'geometry': geometries}, crs=crs.to_wkt())
# 导出为Shapefile
gdf.to_file(output_shp)
if __name__ == "__main__":
input_tif = "input.tif" # 输入TIFF文件路径
output_shp = "output.shp" # 输出Shapefile路径
export_valid_areas(input_tif, output_shp)
我将其中的输入和输出路径重新设置后报错,如下图所示:

将此段错误提示重新输入到deepseek提示词窗口,修改后的代码如下:
import rasterio
from rasterio.features import shapes
import geopandas as gpd
from shapely.geometry import shape
import numpy as np
def export_valid_areas(input_tif, output_shp):
with rasterio.open(input_tif) as src:
band = src.read(1)
nodata = src.nodata
transform = src.transform
crs = src.crs
# 生成有效数据掩膜,并显式转换为uint8类型
mask = (band != nodata).astype('uint8') # 关键修复:转换数据类型
# 生成多边形特征
features = shapes(mask, transform=transform, connectivity=4)
geometries = []
for geom, value in features:
if value == 1: # 有效区域对应掩膜值为1
geometries.append(shape(geom))
gdf = gpd.GeoDataFrame({'geometry': geometries}, crs=crs.to_wkt())
gdf.to_file(output_shp)
if __name__ == "__main__":
input_tif = "input.tif"
output_shp = "output.shp"
export_valid_areas(input_tif, output_shp)
(3)运行效果
运行成果,效果如下,红色框线为生成的矢量范围

3.2DeepSeek本地部署
(1)访问方式
第一步:在官网下载对应的Ollama:ollama.com(注意可能要科学上网)
第二步:进入Ollama官网,找到Models。

第三步:找到deepseek-r1,点击进去找到对应的安装命令,电脑配置越高可选择的模型越大,但是运行越慢,我是16G的内存选择了7B模型。

第三步:打开cmd,输入上述对应的命令即可完成安装
(2)运行过程
模型第一次给出矢量代码如下:
可以看到模型将输入数据理解为tif影像和shp矢量,但是我本次的需求是通过输入的tif数据,获取有效区域的shp矢量范围,代码完全不正确。差评!!!
import os
from osgeo import gdal
import shapely
from itertools import islice
def read_shapefile(shape_file):
"""读取Shape文件,返回出发矢量点坐标列表"""
with open(shape_file, 'rb') as f:
driver = shapely._utils.read_driver(f)
shape = shapely.Shape()
shape.read(f)
points = [ (shape.polygon(0)[i][0], shape.polygon(0)[i][1]) for i in range(len(shape.polygon(0))) ]
return points
def main():
# 读取输入参数
input_tif = "your_input.tif"
input_shape = "your_shape.shp"
# 读取Shape文件中的出发矢量点
shape_points = read_shapefile(input_shape)
# 初始化输出TIF文件路径
output_tif = os.path.join(os.path.dirname(input_tif), "valid_region.tiff")
# 使用GDAL读取输入TIF数据
dataset = gdal.Open(input_tif)
if dataset is None:
raise ValueError("无法打开TIF文件:%s" % input_tif)
# 获取投影信息和分辨率
projection = dataset.GetProjection()
cols = dataset.GetRasterXSize()
rows = dataset.GetRasterYSize()
band_count = dataset.RasterCountOf Bands()
# 创建一个标记数组,用于记录有效区域的像素
valid_mask = [[False for _ in range(cols)] for _ in range(rows)]
# 遍历每个像素
for i in range(rows):
for j in range(cols):
pixel_value = dataset.GetPixel(i, j, 1)
x_center = (j + 0.5) * dataset.GetResolutionX()
y_center = (i + 0.5) * dataset.GetResolutionY()
# 检查是否接近任何出发矢量点
for p in shape_points:
if (x_center - p[0])**2 + (y_center - p[1])**2 <= 2.25: # 假设邻域半径为0.5像素
valid_mask[i][j] = True
break
# 创建一个新的GDAL数据集,用于输出结果
output_dataset = None
try:
output_driver = gdal.GetDriverByName("GTiff")
output_dataset = output_driver.Open(output_tif, 1)
if output_dataset is None:
raise ValueError("无法创建TIF文件:%s" % output_tif)
# 将valid_mask写入新数据集中
band = output_dataset.AddBand()
band.Data = valid_mask
band.NeededUpdate = 0
output_dataset.Write()
finally:
if output_dataset is not None:
output_dataset = None
# 关闭输入数据集
dataset = None
if __name__ == "__main__":
main()
后面考虑到提示词可能设置不正确的原因,我对提示词按照如下格式进行了重新修改:
语言:python
功能:获取影像有效数范围(shp格式)
要求:输入tif格式影像;输出为有效数据(不为nodata或0)的矢量范围(shp格式);使用gdal库;代码格式规范,复用性强。
下面是运行15分钟后给出的代码,可以看到其整体逻辑是按照像素遍历的方式完成了有效区搜索:
import os
import argparse
from osgeo import gdal
from fiona import Fiona
def main():
# 使用argparse处理输入参数
parser = argparse.ArgumentParser(description='提取tif影像的有效数据范围并保存为shp文件')
parser.add_argument('input_tif', help='输入的tif文件路径')
parser.add_argument('output_shp', help='输出的shp文件路径')
parser.add_argument('--compressed', action='store_true',
help='压缩shp文件(默认不压缩)')
args = parser.parse_args()
# 打开tif文件并获取空间参考信息
dataset = None
try:
driver = gdal.GetDriverByName('GTiff')
dataset = gdal.Open(args.input_tif)
if dataset is None:
raise ValueError("无法打开输入的tif文件:%s" % args.input_tif)
proj = dataset.GetProjection()
geotiff = dataset.GetGeoTransform()
# 初始化变量来记录有效区域
min_row = float('inf')
max_row = -float('inf')
min_col = float('inf')
max_col = -float('inf')
# 遍历影像数据,查找非nodata值的最小和最大行列
band = dataset.GetRasterBand(1)
if band is None:
raise ValueError("tif文件缺少有效的波段")
# 使用gdal读取数据块,并检查是否存在有效值
for row in range(dataset.RowCount):
for col in range(band.Cols):
pixel = band.GetPixel(row, col)
if pixel != None and pixel is not gdal.NODATA:
if row < min_row:
min_row = row
if row > max_row:
max_row = row
if col < min_col:
min_col = col
if col > max_col:
max_col = col
# 提前终止循环,如果找到有效数据(至少一个点)
if (min_row != float('inf')) and (max_row != -float('inf')):
break
if (min_row == float('inf')) or (max_row == -float('inf')):
raise ValueError("输入的tif文件中没有发现有效数据")
# 创建shp文件
schema = {
'type': 'Polygon',
'coordinates': [
[(min_col, min_row), (max_col, min_row),
(max_col, max_row), (min_col, max_row)]
],
'transform': {'epsg': proj.GetEPSG() if proj is not None else 0}
}
# 使用Fiona库生成shp文件
if args.compressed:
f = Fiona(
schema=schema,
filename=args.output_shp,
driver='gpkg',
compress='DEFLATE'
)
else:
f = Fiona(
schema=schema,
filename=args.output_shp,
driver='gpkg'
)
# 将几何内容写入文件
f.write()
print("有效数据范围已生成,输出为:%s" % args.output_shp)
except Exception as e:
print(e)
finally:
if dataset:
dataset = None # 释放资源
代码报错如下,库引入不正确,后面重新安装了库依旧没有解决问题。
cannot import name 'Fiona' from 'fiona' (c:\Users\97421\anaconda3\envs\python310\lib\site-packages\fiona\__init__.py)
File "C:\D\python\GetValiData_deepseekr1.py", line 4, in <module> from fiona import Fiona ImportError: cannot import name 'Fiona' from 'fiona' (c:\Users\97421\anaconda3\envs\python310\lib\site-packages\fiona\__init__.py)
(3)运行效果
在运行了45分钟左右后,最终本地部署的模型没有帮我解决问题。
3.3 文心一言3.5
(1)访问方式
百度搜索文心一言直接数据
(2)运行过程
模型第一次给出的矢量代码如下:
import rasterio
from rasterio.mask import mask
import geopandas as gpd
from shapely.geometry import mapping, Polygon
def get_valid_data_range(tif_path):
with rasterio.open(tif_path) as src:
# 创建一个多边形,包含整个影像的范围
bounds = src.bounds
full_polygon = Polygon([(bounds.left, bounds.bottom),
(bounds.left, bounds.top),
(bounds.right, bounds.top),
(bounds.right, bounds.bottom),
(bounds.left, bounds.bottom)])
# 使用mask函数找出有效数据的范围
out_image, out_transform = mask(src, [full_polygon], crop=True)
# 有效数据范围的外边界(bounding box)
valid_bounds = out_image.bounds
valid_polygon = Polygon([(valid_bounds.left, valid_bounds.bottom),
(valid_bounds.left, valid_bounds.top),
(valid_bounds.right, valid_bounds.top),
(valid_bounds.right, valid_bounds.bottom),
(valid_bounds.left, valid_bounds.bottom)])
return valid_polygon
def main(tif_path, shp_path):
# 获取有效数据范围
valid_polygon = get_valid_data_range(tif_path)
# 创建GeoDataFrame
gdf = gpd.GeoDataFrame({'geometry': [valid_polygon]}, crs=rasterio.open(tif_path).crs)
# 导出为Shapefile
gdf.to_file(shp_path, driver='ESRI Shapefile')
# 示例用法
tif_path = 'path/to/your/image.tif'
shp_path = 'path/to/output/valid_data_range.shp'
main(tif_path, shp_path)
代码运行报错,把报错信息输入到提示词中,终于在第三次运行出如下结果,可以看到矢量和影像没有重叠,因此继续将问题输入到提示词中,得到下图右图结果,结果为四至坐标:


重新输入如下提示词,依旧报错,不再尝试。
语言:python
功能:获取影像有效数范围(shp格式)
要求:输入tif格式影像;输出为有效数据(不为nodata或0)的矢量范围(shp格式);使用gdal库;代码格式规范,复用性强。
(3)运行效果
将过至少5轮测试,最终没有达到效果,不过运行效率比较快。
4.总结
4.1模型表现总结
(1)DeepSeek网页端顺利写出了程序代码,执行效率在2分钟内,但是多次提问会出现服务器无法响应情况。
(2)Deepseek本地部署的模型,执行效率低,占用内存,且无法解决实际问题,比较鸡肋,不适合本次应用的实验场景,测试完果断删除了。
(3)文心一言模型,执行效率快,但是其代码编写水平低,易爆bug。
总结:deepseek网页端可理解复杂提示词,能解决实际问题。完胜其他模型。
4.2 AI感悟
惊叹于deepseek网页端模型强大的能力,其水平至少能达到中级程序员水准,预测未来会是很好的AI助手。
更多推荐

所有评论(0)