富士苹果的多模态图像 KFuji RGB-DS数据集训练及应用
KFuji RGB-DS数据集KFuji RGB-DS数据集由使用Microsoft Kinect v2MicrosoftRedmondWAUSA捕获的树上的967张富士苹果的多模态图像组成。每张图像都包含来自 3 种不同模式的信息颜色 RGB、深度 D 和距离校正红外强度 S。地面实况水果位置被手动注释在所有数据集中总共标记了 12,839 个苹果。一、KFuji RGB-DS 数据集信息表项目详细说明数据集名称KFuji RGB-DS 富士苹果多模态数据集采集设备Microsoft Kinect v2 深度相机研究对象树上生长的富士苹果图像总数967 张多模态图像标注目标苹果目标位置手工标注真值目标总标注量共计 12839 个苹果实例数据模态三模态融合1. RGB 彩色图像2. D 深度图像3. S 距离校正红外强度图像核心任务果园果实检测、果实计数、目标定位、农业视觉检测适用场景智慧农业、果蔬识别、多模态目标检测、深度视觉算法训练二、数据集结构说明图像分组每张样本同步包含三类同源图像RGB图、深度图(D)、校正红外强度图(S)图像一一对应。标注格式手工标注苹果位置真值目标框/点位标注可直接用于目标检测模型训练、评估。数据特点多模态互补彩色纹理 深度空间信息 红外强度适配复杂果园光照、遮挡场景真实田间场景包含枝叶遮挡、重叠果实、自然光照变化贴近实际农业作业环境标注量充足近千张图像、上万果实实例满足模型训练、验证、测试需求。三、环境依赖# requirements.txt torch1.8.0 torchvision0.9.0 opencv-python numpy pillow matplotlib albumentations pyyaml tqdm安装命令pipinstall-rrequirements.txt四、完整训练代码基于 PyTorch YOLOv5 多模态输入思路将 RGB 深度D 红外S 三通道拼接为多通道输入适配果园苹果检测任务适配 KFuji RGB-DS 数据集标注格式。1. 数据集加载类kfuji_dataset.pyimportosimportcv2importnumpyasnpfromPILimportImagefromtorch.utils.dataimportDatasetclassKFujiRGB_DS(Dataset):def__init__(self,img_root,label_root,transformNone):self.img_rootimg_root self.label_rootlabel_root self.transformtransform self.img_list[fforfinos.listdir(os.path.join(img_root,rgb))iff.endswith((.png,.jpg))]def__len__(self):returnlen(self.img_list)def__getitem__(self,idx):img_nameself.img_list[idx]# 读取三模态图像rgb_pathos.path.join(self.img_root,rgb,img_name)d_pathos.path.join(self.img_root,depth,img_name)s_pathos.path.join(self.img_root,ir_strength,img_name)rgbcv2.imread(rgb_path)depthcv2.imread(d_path,cv2.IMREAD_GRAYSCALE)ir_scv2.imread(s_path,cv2.IMREAD_GRAYSCALE)# 通道拼接: RGB(3) D(1) S(1) - 5通道h,wrgb.shape[:2]depthcv2.resize(depth,(w,h))ir_scv2.resize(ir_s,(w,h))multi_imgnp.concatenate([rgb,depth[...,np.newaxis],ir_s[...,np.newaxis]],axis-1)# 读取标注 (示例txt标注类别坐标)label_pathos.path.join(self.label_root,img_name.replace(.png,.txt))boxes[]ifos.path.exists(label_path):withopen(label_path,r)asf:forlineinf.readlines():lineline.strip().split()cls_idint(line[0])x,y,w_box,h_boxlist(map(float,line[1:5]))boxes.append([cls_id,x,y,w_box,h_box])ifself.transform:augmentedself.transform(imagemulti_img,bboxesboxes)multi_imgaugmented[image]boxesaugmented[bboxes]returnmulti_img,np.array(boxes)2. 训练主脚本train.pyimporttorchimporttorch.nnasnnfromtorch.utils.dataimportDataLoaderimportalbumentationsasAfromalbumentations.pytorchimportToTensorV2fromkfuji_datasetimportKFujiRGB_DS# 1. 配置参数 DEVICEtorch.device(cudaiftorch.cuda.is_available()elsecpu)BATCH_SIZE8EPOCHS50IMG_SIZE640# 数据集路径自行修改为本地路径TRAIN_IMG./kfuji/train/imagesTRAIN_LABEL./kfuji/train/labelsVAL_IMG./kfuji/val/imagesVAL_LABEL./kfuji/val/labels# 2. 数据增强 train_transformA.Compose([A.Resize(heightIMG_SIZE,widthIMG_SIZE),A.HorizontalFlip(p0.5),A.RandomBrightnessContrast(p0.2),ToTensorV2()],bbox_paramsA.BboxParams(formatyolo,label_fields[]))val_transformA.Compose([A.Resize(heightIMG_SIZE,widthIMG_SIZE),ToTensorV2()],bbox_paramsA.BboxParams(formatyolo,label_fields[]))# 3. 加载数据集 train_datasetKFujiRGB_DS(TRAIN_IMG,TRAIN_LABEL,transformtrain_transform)val_datasetKFujiRGB_DS(VAL_IMG,VAL_LABEL,transformval_transform)train_loaderDataLoader(train_dataset,batch_sizeBATCH_SIZE,shuffleTrue,num_workers4)val_loaderDataLoader(val_dataset,batch_sizeBATCH_SIZE,shuffleFalse,num_workers4)# 4. 模型、损失、优化器 # 此处以基础卷积网络示例可替换为 YOLO / Faster R-CNN 多模态检测网络classSimpleDetect(nn.Module):def__init__(self,in_channels5):super().__init__()self.backbonenn.Sequential(nn.Conv2d(in_channels,32,3,2,1),nn.ReLU(),nn.Conv2d(32,64,3,2,1),nn.ReLU(),nn.AdaptiveAvgPool2d((10,10)))self.fcnn.Linear(64*10*10,5)# 输出类别4坐标defforward(self,x):xself.backbone(x)xtorch.flatten(x,1)outself.fc(x)returnout modelSimpleDetect(in_channels5).to(DEVICE)criterionnn.MSELoss()optimizertorch.optim.Adam(model.parameters(),lr1e-3)# 5. 训练循环 deftrain_one_epoch():model.train()total_loss0forimgs,targetsintrain_loader:imgsimgs.to(DEVICE).float()optimizer.zero_grad()outputsmodel(imgs)# 简单损失计算根据标注格式自行适配losscriterion(outputs,targets[:,0,:].to(DEVICE).float())loss.backward()optimizer.step()total_lossloss.item()returntotal_loss/len(train_loader)defval_one_epoch():model.eval()total_loss0withtorch.no_grad():forimgs,targetsinval_loader:imgsimgs.to(DEVICE).float()outputsmodel(imgs)losscriterion(outputs,targets[:,0,:].to(DEVICE).float())total_lossloss.item()returntotal_loss/len(val_loader)if__name____main__:best_val_lossfloat(inf)forepochinrange(EPOCHS):train_losstrain_one_epoch()val_lossval_one_epoch()print(fEpoch [{epoch1}/{EPOCHS}] | Train Loss:{train_loss:.4f}| Val Loss:{val_loss:.4f})# 保存最优模型ifval_lossbest_val_loss:best_val_lossval_loss torch.save(model.state_dict(),./kfuji_best.pth)print(Save best model!)五、数据集使用说明目录规范建议按以下结构整理数据保证代码正常读取kfuji/ ├─ train/ │ ├─ images/ │ │ ├─ rgb/ # RGB彩色图 │ │ ├─ depth/ # 深度D图 │ │ └─ ir_strength/# 距离校正红外S图 │ └─ labels/ # 苹果位置标注txt文件 └─ val/ ├─ images/ │ ├─ rgb/ │ ├─ depth/ │ └─ ir_strength/ └─ labels/标注适配代码默认适配YOLO 格式标注归一化坐标若数据集为其他标注格式点位、矩形框修改kfuji_dataset.py中标签解析逻辑即可。模型替换建议入门使用本代码基础网络快速跑通流程高精度检测替换为YOLOv7/YOLOv8/RTMDet修改输入通道为5RGBDS适配多模态输入遮挡/重叠优化可增加注意力机制强化深度、红外模态特征融合。应用方向树上苹果目标检测、果实计数多模态图像融合算法研究复杂田间遮挡场景下果蔬识别算法训练与对比实验。