发布时间:2026/8/19 9:26:48
单木分割数据集 树木分割识 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/8/19 9:26:48

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

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

2026/8/19 9:21:46

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

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

2026/8/19 9:21:46

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

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

2026/8/19 10:37:13

深挖C语言:文件操作

目录 前言 1.二进制文件和文本文件 2.文件的打开和关闭 2.1 流和标准流 2.1.1 文件流 2.1.2 流指针 常见误区 2.2 文件指针 2.3 文件的打开和关闭 3.文件的顺序读写 3.1 fputc函数、fgetc函数 3.2 feof 和 ferror 3.3 fputs函数、fgets函数 3.4 fprintf函数、fs…

2026/8/19 4:14:28

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 6:58:27

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/19 0:00:35

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:35

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述:当AI开始“猜”数学定理 最近在AI研究圈里,一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思,直译是“月光”,但在数学史上,它特指一个神秘而美丽的联系——魔群月光猜想,连…

2026/8/19 0:00:36

Agentic Web:构建智能体原生网络的基础设施挑战与四大支柱

1. 从“被动网络”到“能动网络”:一个正在发生的范式转移 如果你最近关注AI和Web技术的前沿动态,可能会频繁听到“Agentic Web”这个词。它不像“Web3”那样带着浓厚的金融色彩,也不像“元宇宙”那样充满科幻感,但它所描绘的未来…

2026/8/18 18:23:10

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/19 4:14:38

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/18 7:12:40

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…