单木分割数据集 树木分割识 Mask R-CNN模型来进行目标检测和实例分割 大规模高分辨率树种单木分割数据集 处理大规模高分辨率树种单木分割任务从14个不同树种类中分割和标注了23,000个树冠

发布时间:2026/10/6 23:02:28

单木分割数据集 树木分割识 Mask R-CNN模型来进行目标检测和实例分割 大规模高分辨率树种单木分割数据集 处理大规模高分辨率树种单木分割任务从14个不同树种类中分割和标注了23,000个树冠 单木分割数据集。从14个不同树种类中分割和标注了23,000个树冠采集使用了DJI Phantom 4 RTK无人机树种单木分割数据集。从14个不同树种类中分割和标注了23,000个树冠采集使用了DJI Phantom 4 RTK无人机。正射tif影像点云、arcgis详细标注单株树木矢量数据并标明树木类型数据集共149GB。大规模高分辨率树种单木分割数据集。从14个不同树种类中分割和标注了23,000个树冠采集使用了DJI Phantom 4 RTK无人机。正射tif影像点云、arcgis详细标注单株树木矢量数据并标明树木类型数据集共149GB。使用Mask R-CNN模型来进行目标检测和实例分割。以下是详细的步骤和代码示例包括数据集定义、配置文件、训练脚本等。目录结构首先确保你的项目目录结构如下/tree_segmentation_project /datasets /train /images *.tif /annotations *.json /valid /images *.tif /annotations *.json /scripts train.py datasets.py config.yaml requirements.txtconfig.yaml配置文件config.yaml包含训练参数、数据路径等信息。# config.yamltrain:../datasets/train/images/val:../datasets/valid/images/nc:14names:[tree1,tree2,tree3,tree4,tree5,tree6,tree7,tree8,tree9,tree10,tree11,tree12,tree13,tree14]requirements.txt列出所有需要安装的Python包。torch1.8 torchvision0.9 pycocotools opencv-python matplotlib albumentations labelme2coco shapely geopandas rasteriodatasets.py定义数据集类以便于加载树种单木分割的数据集并进行数据增强。importosfrompathlibimportPathimportjsonfromPILimportImageimporttorchfromtorch.utils.dataimportDataset,DataLoaderimportalbumentationsasAfromalbumentations.pytorch.transformsimportToTensorV2importrasteriofromshapely.geometryimportPolygonclassTreeSegmentationDataset(Dataset):def__init__(self,root_dir,transformNone):self.root_dirPath(root_dir)self.transformtransform self.img_fileslist((self.root_dir/images).glob(*.tif))self.label_files[Path(str(img_file).replace(images,annotations).replace(.tif,.json))forimg_fileinself.img_files]def__len__(self):returnlen(self.img_files)def__getitem__(self,idx):img_pathself.img_files[idx]label_pathself.label_files[idx]withrasterio.open(img_path)assrc:imagesrc.read().transpose(1,2,0)withopen(label_path,r)asf:annotationsjson.load(f)boxes[]masks[]labels[]forfeatureinannotations[features]:geometryfeature[geometry]ifgeometry[type]Polygon:polygonPolygon(geometry[coordinates][0])minx,miny,maxx,maxypolygon.bounds box[minx,miny,maxx,maxy]maskrasterio.features.rasterize([polygon],out_shapeimage.shape[:2],fill0,default_value1)class_idint(feature[properties][class_id])1# Convert to 1-based indexboxes.append(box)masks.append(mask)labels.append(class_id)ifself.transform:transformedself.transform(imageimage,masksmasks,bboxesboxes,class_labelslabels)imagetransformed[image]maskstransformed[masks]boxestransformed[bboxes]labelstransformed[class_labels]target{}target[boxes]torch.tensor(boxes,dtypetorch.float32)target[labels]torch.tensor(labels,dtypetorch.int64)target[masks]torch.tensor(masks,dtypetorch.uint8)returnimage,target# 定义数据增强data_transforms{train:A.Compose([A.Resize(width640,height640),A.HorizontalFlip(p0.5),A.VerticalFlip(p0.5),A.Rotate(limit180,p0.7),A.RandomBrightnessContrast(brightness_limit0.2,contrast_limit0.2,p0.3),A.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225]),ToTensorV2(),],bbox_paramsA.BboxParams(formatpascal_voc),mask_paramsA.MaskParams()),test:A.Compose([A.Resize(width640,height640),A.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225]),ToTensorV2(),],bbox_paramsA.BboxParams(formatpascal_voc),mask_paramsA.MaskParams()),}train.py编写训练脚本来训练Mask R-CNN模型。importtorchimporttorch.optimasoptimfromtorchvision.models.detectionimportmaskrcnn_resnet50_fpn_v2fromdatasetsimportTreeSegmentationDataset,data_transformsfromtorch.utils.dataimportDataLoaderimportyamlimporttimeimportdatetimefromcollectionsimportdefaultdictfromcollectionsimportdequeimporttorch.distributedasdistfromtorch.nn.parallelimportDistributedDataParallelasDDPwithopen(config.yaml,r)asf:configyaml.safe_load(f)defcollate_fn(batch):images[item[0]foriteminbatch]targets[item[1]foriteminbatch]imagestorch.stack(images)returnimages,targetsdeftrain_one_epoch(model,optimizer,data_loader,device,epoch,print_freq):model.train()metric_loggerMetricLogger(delimiter )headerfEpoch: [{epoch}]forimages,targetsinmetric_logger.log_every(data_loader,print_freq,header):imageslist(image.to(device)forimageinimages)targets[{k:v.to(device)fork,vint.items()}fortintargets]loss_dictmodel(images,targets)lossessum(lossforlossinloss_dict.values())optimizer.zero_grad()losses.backward()optimizer.step()metric_logger.update(losslosses.item(),**loss_dict)classMetricLogger(object):def__init__(self,delimiter\t):self.metersdefaultdict(SmoothedValue)self.delimiterdelimiterdefupdate(self,**kwargs):fork,vinkwargs.items():ifisinstance(v,torch.Tensor):vv.item()assertisinstance(v,(float,int))self.meters[k].update(v)def__getattr__(self,attr):ifattrinself.meters:returnself.meters[attr]ifattrinself.__dict__:returnself.__dict__[attr]raiseAttributeError(fMetricLogger object has no attribute {attr})deflog_every(self,iterable,print_freq,headerNone):i0ifnotheader:headerstart_timetime.time()endtime.time()iter_timeSmoothedValue(fmt{avg:.4f})eta_stringSmoothedValue(fmt{eta})space_fmt:str(len(str(len(iterable))))dlog_msg[header,[{0space_fmt}/{1}],eta: {eta},{meters},time: {time}]iftorch.cuda.is_available():log_msg.append(max mem: {memory:.0f})log_msgself.delimiter.join(log_msg)MB1024.0*1024.0forobjiniterable:data_time.update(time.time()-end)yieldobj iter_time.update(time.time()-end)ifi%print_freq0orilen(iterable)-1:eta_secondsiter_time.global_avg*(len(iterable)-i)eta_string.update(datetime.timedelta(secondsint(eta_seconds)))iftorch.cuda.is_available():print(log_msg.format(i,len(iterable),etaeta_string,metersstr(self),timestr(iter_time),memorytorch.cuda.max_memory_allocated()/MB))else:print(log_msg.format(i,len(iterable),etaeta_string,metersstr(self),timestr(iter_time)))i1endtime.time()total_timetime.time()-start_time total_time_strstr(datetime.timedelta(secondsint(total_time)))print({} Total time: {} ({:.4f} s / it).format(header,total_time_str,total_time/len(iterable)))classSmoothedValue(object):Track a series of values and provide access to smoothed values over a window or the global series average. def__init__(self,window_size20,fmtNone):iffmtisNone:fmt{median:.4f} ({global_avg:.4f})self.dequedeque(maxlenwindow_size)self.total0.0self.count0self.fmtfmtdefupdate(self,value,n1):self.deque.append(value)self.countn self.totalvalue*ndefsynchronize_between_processes(self): Warning: does not synchronize the deque! ifnotis_dist_avail_and_initialized():returnttorch.tensor([self.count,self.total],dtypetorch.float64,devicecuda)dist.barrier()dist.all_reduce(t)tt.tolist()self.countint(t[0])self.totalt[1]propertydefmedian(self):dtorch.tensor(list(self.deque))returnd.median().item()propertydefavg(self):dtorch.tensor(list(self.deque),dtypetorch.float32)returnd.mean().item()propertydefglobal_avg(self):returnself.total/self.countpropertydefmax(self):returnmax(self.deque)propertydefvalue(self):returnself.deque[-1]def__str__(self):returnself.fmt.format(medianself.median,avgself.avg,global_avgself.global_avg,maxself.max,valueself.value)defis_dist_avail_and_initialized():ifnotdist.is_available():returnFalseifnotdist.is_initialized():returnFalsereturnTruedefmain():devicetorch.device(cuda)iftorch.cuda.is_available()elsetorch.device(cpu)dataset_trainTreeSegmentationDataset(root_dirconfig[train],transformdata_transforms[train])dataset_valTreeSegmentationDataset(root_dirconfig[val],transformdata_transforms[test])data_loader_trainDataLoader(dataset_train,batch_size2,shuffleTrue,num_workers4,collate_fncollate_fn)data_loader_valDataLoader(dataset_val,batch_size2,shuffleFalse,num_workers4,collate_fncollate_fn)modelmaskrcnn_resnet50_fpn_v2(pretrainedTrue)num_classesconfig[nc]1# background number of classesin_featuresmodel.roi_heads.box_predictor.cls_score.in_features model.roi_heads.box_predictortorch.nn.Linear(in_features,num_classes)in_features_maskmodel.roi_heads.mask_predictor.conv5_mask.in_channels hidden_layer256model.roi_heads.mask_predictortorch.nn.Sequential(torch.nn.ConvTranspose2d(in_features_mask,hidden_layer,2,2,0),torch.nn.ReLU(),torch.nn.Conv2d(hidden_layer,num_classes,1,1,0))model.to(device)params[pforpinmodel.parameters()ifp.requires_grad]optimizeroptim.SGD(params,lr0.005,momentum0.9,weight_decay0.0005)forepochinrange(10):# number of epochstrain_one_epoch(model,optimizer,data_loader_train,devicedevice,epochepoch,print_freq10)# save every epochtorch.save({epoch:epoch,model_state_dict:model.state_dict(),optimizer_state_dict:optimizer.state_dict(),},fmodel_epoch_{epoch}.pth)if__name____main__:main()总结以上代码涵盖了从数据准备到模型训练的所有步骤。你可以根据需要调整配置文件中的参数并运行训练脚本来开始训练Mask R-CNN模型。确保你的数据集目录结构符合预期并且所有的文件路径都是正确的。文章所有代码仅供参考
延伸阅读

更多相关文章

2026/10/4 11:05:09

AI 生成了 53% 的代码,测试人的工作量反而变大了

AI 生成了 53% 的代码,测试人的工作量反而变大了 一句话看懂:AI 生成了更多代码,但这些代码的信任度更低,验证成本更高——测试队列只会越来越长。这不是测试人的危机,而是价值放大的机会。 2026 年 8 月&#xff0c…

2026/10/1 3:20:25

用Python开发索尼Spresense:Zerynth环境搭建与物联网应用实践

1. 项目概述:当索尼硬件遇上Python魔法 如果你手头有一块索尼的Spresense开发板,却对传统的嵌入式C/C开发感到头疼,那么今天聊的这个组合,绝对能让你眼前一亮。Spresense是索尼推出的一款功能强大的多核MCU开发板,以其…

2026/10/4 7:03:35

前端性能优化实战:从点击延迟到极致交互响应的全链路剖析

1. 项目概述:从“最快点击”到极致性能的探索“Fastest hit wins”,这个标题直译过来是“最快点击者获胜”,听起来像是一个简单的游戏或测试。但如果你像我一样,在性能优化和前端交互领域摸爬滚打了十几年,就会立刻意识…

2026/10/6 22:59:51

context-mode:为终端开发打造上下文快照与现场恢复工具

你有没有过这种经历:上午还埋在一个项目的某个模块里,下午被线上告警拽到另一个项目,处理完再切回来,对着终端愣了几秒——我刚才在看哪个文件?这个分支推到远端没有?环境变量是不是被我改乱了?…

2026/10/6 22:59:51

Sublime Text 高效配置与插件指南:从多光标到LSP实战

简介:Sublime Text 是一款面向程序员与文本编辑爱好者的高效代码编辑器资源包,适用于 Web 前端、Python、Java、C 等多语言开发场景,能帮助初学者快速上手、资深开发者提升编码效率。压缩包共收录 2000 个文件,约 15.8MB&#xff…

2026/10/6 22:59:51

HTML5展示型企业网站源代码改造与交付全流程指南

简介:这是一套面向中小企业建站需求与前端入门学习者的展示型企业网站源代码,采用HTML5结合CSS、XHTML与JavaScript构建,无需后台管理系统,上传空间即可直接运行,适合希望低成本快速搭建企业官网的个人站长或前端初学者…

2026/10/6 22:59:51

IDEA 2026.1 EAP 5:K2模式如何重塑Kotlin开发体验

每次 JetBrains 发 EAP,我基本都会第一时间装来试。原因很简单:EAP 版往往比稳定版更早暴露一个方向性问题——那些被 JetBrains 押注的未来能力,最终会成为稳定版默认体验。这次的 IDEA 2026.1 EAP 5,重点依然是 Kotlin 的 K2 模…

2026/10/6 22:54:51

IDEA内置Maven总是报错?教你切换本地Maven并解决依赖与编译问题

前两天帮一位新同事排查环境,IDEA里Maven项目红成一片,依赖下载失败、程序包不存在、编译级别报错轮着来。我问他Maven怎么配的,他理直气壮地说“我没配过,IDEA自带的”。这句话我听了太多次。IDEA内置Maven确实开箱即用&#xff…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑