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

资讯详情

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

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

单木分割数据集 树木分割识 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模型。确保你的数据集目录结构符合预期并且所有的文件路径都是正确的。文章所有代码仅供参考
返回列表