ARTICLE DETAIL

资讯详情

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

建筑物损伤分割 YOLOv8对建筑物损伤分割 检测数据集进行处理训练

建筑物损伤分割 YOLOv8对建筑物损伤分割 检测数据集进行处理训练 如何使用Segmentation Models库对建筑物损伤分割与检测数据集进行处理_并使用YOLOv8对建筑物损伤分割与检测数据集进行处理训练以下文字及代码仅供参考。文章目录如何使用Segmentation Models库对建筑物损伤分割与检测数据集进行处理_并使用YOLOv8对建筑物损伤分割与检测数据集进行处理训练1. 数据集准备2. 安装依赖库3. VOC转PNG掩码4. 模型训练训练脚本5. 推理与结果可视化推理脚本建筑物损伤分割与检测数据集voc标注类别名称标注数量Graffiti - 涂鸦1883Drainage - 排水问题1402Wetspot - 湿斑1445Weathering - 风化4066Crack - 裂缝3155Rockpocket - 岩石凹坑525Spalling - 剥落8484WConccor - 水侵蚀混凝土360Cavity - 空洞8119Efflorescence - 泛碱3454Rust - 生锈12844PEquipment - 防护设备1677ExposedRebars - 露筋1755Bearing - 支座1048Hollowareas - 空洞区域1362JTape - 接头胶带923Restformwork - 剩余模板851ACrack - 活动裂缝376EJoint - 伸缩缝450image num - 图像数量6934使用YOLOv8对建筑物损伤分割与检测数据集进行处理我们将遵循以下步骤准备数据集、配置模型参数、训练模型、评估模型性能以及推理和结果可视化。我们这里选择使用Segmentation Models库来完成这个任务。1. 数据集准备假设你的数据集结构如下building_damage_detection/ ├── images/ │ ├── train/ │ │ ├── img1.jpg │ │ └── ... │ ├── val/ │ │ ├── img1.jpg │ │ └── ... │ └── test/ │ ├── img1.jpg │ └── ... └── annotations/ ├── train/ │ ├── img1.xml │ └── ... ├── val/ │ ├── img1.xml │ └── ... └── test/ ├── img1.xml └── ... data_building_damage.yamldata_building_damage.yaml文件内容示例train:./building_damage_detection/images/train/val:./building_damage_detection/images/val/test:./building_damage_detection/images/test/nc:19# 类别数量names:[Graffiti,Drainage,Wetspot,Weathering,Crack,Rockpocket,Spalling,WConccor,Cavity,Efflorescence,Rust,PEquipment,ExposedRebars,Bearing,Hollowareas,JTape,Restformwork,ACrack,EJoint]需要将VOC格式的标注转换为适合Segmentation Models使用的格式如PNG格式的掩码图像。可以编写一个脚本来实现这一转换。2. 安装依赖库确保安装了必要的库pipinstallsegmentation-models-pytorch albumentations opencv-python-headless torch torchvision xmltodict3. VOC转PNG掩码编写脚本将VOC格式的XML文件转换为PNG格式的掩码图像importosimportcv2importnumpyasnpimportxmltodictdefvoc_to_mask(xml_path,class_dict):withopen(xml_path,r)asxml_file:dataxmltodict.parse(xml_file.read())heightint(data[annotation][size][height])widthint(data[annotation][size][width])masknp.zeros((height,width),dtypenp.uint8)ifobjectindata[annotation]:forobjindata[annotation][object]:nameobj[name]cls_idclass_dict[name]polygon[(int(pt[x]),int(pt[y]))forptinobj[polygon][pt]]cv2.fillPoly(mask,[np.array(polygon)],cls_id)returnmask class_dict{Graffiti:0,Drainage:1,Wetspot:2,Weathering:3,Crack:4,Rockpocket:5,Spalling:6,WConccor:7,Cavity:8,Efflorescence:9,Rust:10,PEquipment:11,ExposedRebars:12,Bearing:13,Hollowareas:14,JTape:15,Restformwork:16,ACrack:17,EJoint:18}# 示例调用forfolderin[train,val,test]:annotation_folderf./building_damage_detection/annotations/{folder}/mask_folderf./building_damage_detection/masks/{folder}/os.makedirs(mask_folder,exist_okTrue)forxml_fileinos.listdir(annotation_folder):maskvoc_to_mask(os.path.join(annotation_folder,xml_file),class_dict)cv2.imwrite(os.path.join(mask_folder,xml_file.replace(.xml,.png)),mask)4. 模型训练创建一个Python脚本来开始训练过程。这里我们以PSPNet为例说明如何使用Segmentation Models库。训练脚本fromsegmentation_models_pytorchimportPSPNetfromtorch.utils.dataimportDataLoaderimporttorchfromtorchimportnnfromdatasetimportBuildingDamageDataset# 假设你已实现了一个自定义的数据集类classBuildingDamageDataset(torch.utils.data.Dataset):def__init__(self,images_dir,masks_dir,transformNone):self.images_fps[os.path.join(images_dir,image_id)forimage_idinos.listdir(images_dir)]self.masks_fps[os.path.join(masks_dir,mask_id).replace(.jpg,.png)formask_idinos.listdir(images_dir)]self.transformtransformdef__getitem__(self,i):imagecv2.imread(self.images_fps[i])maskcv2.imread(self.masks_fps[i],0)ifself.transform:transformedself.transform(imageimage,maskmask)imagetransformed[image]masktransformed[mask]returnimage,maskdef__len__(self):returnlen(self.images_fps)ENCODERresnet34ENCODER_WEIGHTSimagenetCLASSES[Graffiti,Drainage,Wetspot,Weathering,Crack,Rockpocket,Spalling,WConccor,Cavity,Efflorescence,Rust,PEquipment,ExposedRebars,Bearing,Hollowareas,JTape,Restformwork,ACrack,EJoint]ACTIVATIONsoftmax2dmodelPSPNet(encoder_nameENCODER,encoder_weightsENCODER_WEIGHTS,classeslen(CLASSES),activationACTIVATION,)preprocessing_fnsmp.encoders.get_preprocessing_fn(ENCODER,ENCODER_WEIGHTS)train_datasetBuildingDamageDataset(./building_damage_detection/images/train/,./building_damage_detection/masks/train/)valid_datasetBuildingDamageDataset(./building_damage_detection/images/val/,./building_damage_detection/masks/val/)train_loaderDataLoader(train_dataset,batch_size16,shuffleTrue,num_workers4)valid_loaderDataLoader(valid_dataset,batch_size4,shuffleFalse,num_workers4)losssmp.utils.losses.CrossEntropyLoss()metrics[smp.utils.metrics.IoU(threshold0.5),]optimizertorch.optim.Adam([dict(paramsmodel.parameters(),lr0.0001),])train_epochsmp.utils.train.TrainEpoch(model,lossloss,metricsmetrics,optimizeroptimizer,devicecuda,verboseTrue,)valid_epochsmp.utils.train.ValidEpoch(model,lossloss,metricsmetrics,devicecuda,verboseTrue,)max_score0foriinrange(0,40):# 训练周期数print(\nEpoch: {}.format(i))train_logstrain_epoch.run(train_loader)valid_logsvalid_epoch.run(valid_loader)ifmax_scorevalid_logs[iou_score]:max_scorevalid_logs[iou_score]torch.save(model,./best_model.pth)print(Model saved!)ifi25:optimizer.param_groups[0][lr]/10print(Decrease decoder learning rate to 1e-5!)5. 推理与结果可视化训练完成后我们可以加载最佳模型对新图片进行预测并将结果可视化。推理脚本importmatplotlib.pyplotasplt best_modeltorch.load(./best_model.pth)defvisualize(image,mask,pred_mask):figure,axplt.subplots(1,3,figsize(10,10))ax[0].imshow(image)ax[0].set_title(Image)ax[1].imshow(mask)ax[1].set_title(Ground Truth)ax[2].imshow(pred_mask)ax[2].set_title(Predicted Mask)plt.show()test_datasetBuildingDamageDataset(./building_damage_detection/images/test/,./building_damage_detection/masks/test/)foriinrange(5):# 可视化前5个测试样本image,gt_masktest_dataset[i]x_tensortorch.from_numpy(image).to(cuda).unsqueeze(0)pr_maskbest_model.predict(x_tensor)pr_maskpr_mask.squeeze().cpu().numpy().round()visualize(image,gt_mask,pr_mask)使用Segmentation Models库对建筑物损伤分割与检测数据集进行处理。请根据实际需求调整相关参数和代码。具体实现细节需要根据Segmentation Models的具体版本和API进行适当调整。
返回列表