0.08米无人机高精度建筑物分割,约110GB大小,共72对无人机建筑物图像,带地理信息位置,并可按要求处理为512×512等易于深度学习训练的图像尺寸
)
0.08米无人机高精度建筑物分割,约110GB大小,共72对无人机建筑物图像,带地理信息位置,并可按要求处理为512×512等易于深度学习训练的图像尺寸



使用YOLOv8来训练一个包含72对高精度无人机建筑物图像的数据集。这个数据集包含地理信息位置,并可以按要求处理为512×512等易于深度学习训练的图像尺寸。
数据集描述
数据量:72对无人机建筑物图像
图像分辨率:高精度(0.08米)
数据大小:约110GB
地理信息:带有地理信息位置
应用场景:建筑物分割
数据集组织
假设你的数据集目录结构如下:
深色版本
drone_building_dataset/
├── images/
│ ├── 000001.png
│ ├── 000002.png
│ └── …
├── masks/
│ ├── 000001.png
│ ├── 000002.png
│ └── …
└── geo_info/
├── 000001.geojson
├── 000002.geojson
└── …
数据预处理
为了便于深度学习训练,我们需要将图像和标签处理为512×512的尺寸。可以使用Python脚本来完成这个任务。
安装必要的库
pip install opencv-python numpy
图像和标签裁剪脚本
import os
import cv2
import numpy as np
from glob import glob
定义源目录和目标目录
source_images_dir = ‘./drone_building_dataset/images’
source_masks_dir = ‘./drone_building_dataset/masks’
target_images_dir = ‘./drone_building_dataset/images_512’
target_masks_dir = ‘./drone_building_dataset/masks_512’
创建目标目录
os.makedirs(target_images_dir, exist_ok=True)
os.makedirs(target_masks_dir, exist_ok=True)
获取所有图像文件
image_files = glob(os.path.join(source_images_dir, ‘.png’))
mask_files = glob(os.path.join(source_masks_dir, '.png’))
确保图像和标签文件匹配
image_files.sort()
mask_files.sort()
定义裁剪大小
crop_size = 512
裁剪图像和标签
def crop_and_save(image, mask, image_path, mask_path, crop_size):
h, w = image.shape[:2]
for y in range(0, h, crop_size):
for x in range(0, w, crop_size):
crop_image = image[y:y+crop_size, x:x+crop_size]
crop_mask = mask[y:y+crop_size, x:x+crop_size]
if crop_image.shape[0] == crop_size and crop_image.shape[1] == crop_size:
base_name = os.path.basename(image_path).replace(‘.png’, f’{y}{x}.png’)
cv2.imwrite(os.path.join(target_images_dir, base_name), crop_image)
cv2.imwrite(os.path.join(target_masks_dir, base_name), crop_mask)
处理所有图像和标签
for image_path, mask_path in zip(image_files, mask_files):
image = cv2.imread(image_path)
mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE)
crop_and_save(image, mask, image_path, mask_path, crop_size)
数据集划分
将处理后的图像和标签划分为训练集、验证集和测试集。可以使用以下脚本:
python
深色版本
import os
import random
from shutil import copyfile
定义源目录和目标目录
source_images_dir = ‘./drone_building_dataset/images_512’
source_masks_dir = ‘./drone_building_dataset/masks_512’
target_train_dir = ‘./drone_building_dataset/images/train’
target_val_dir = ‘./drone_building_dataset/images/val’
target_test_dir = ‘./drone_building_dataset/images/test’
target_train_masks_dir = ‘./drone_building_dataset/masks/train’
target_val_masks_dir = ‘./drone_building_dataset/masks/val’
target_test_masks_dir = ‘./drone_building_dataset/masks/test’
创建目标目录
os.makedirs(target_train_dir, exist_ok=True)
os.makedirs(target_val_dir, exist_ok=True)
os.makedirs(target_test_dir, exist_ok=True)
os.makedirs(target_train_masks_dir, exist_ok=True)
os.makedirs(target_val_masks_dir, exist_ok=True)
os.makedirs(target_test_masks_dir, exist_ok=True)
获取所有图像文件
all_images = [f for f in os.listdir(source_images_dir) if f.endswith(‘.png’)]
random.shuffle(all_images)
划分数据集
train_ratio = 0.8
val_ratio = 0.1
test_ratio = 0.1
train_split = int(train_ratio * len(all_images))
val_split = train_split + int(val_ratio * len(all_images))
train_images = all_images[:train_split]
val_images = all_images[train_split:val_split]
test_images = all_images[val_split:]
复制图像文件和对应的标签
for img in train_images:
copyfile(os.path.join(source_images_dir, img), os.path.join(target_train_dir, img))
mask = img
copyfile(os.path.join(source_masks_dir, mask), os.path.join(target_train_masks_dir, mask))
for img in val_images:
copyfile(os.path.join(source_images_dir, img), os.path.join(target_val_dir, img))
mask = img
copyfile(os.path.join(source_masks_dir, mask), os.path.join(target_val_masks_dir, mask))
for img in test_images:
copyfile(os.path.join(source_images_dir, img), os.path.join(target_test_dir, img))
mask = img
copyfile(os.path.join(source_masks_dir, mask), os.path.join(target_test_masks_dir, mask))
数据配置文件
创建或确认data.yaml文件是否正确配置了数据集路径:
train: ./images/train/ # 训练集图像路径
val: ./images/val/ # 验证集图像路径
test: ./images/test/ # 测试集图像路径
Classes
nc: 1 # 类别数量(二分类:建筑物和背景)
names:
- building # 类别名称列表
安装YOLOv8
如果你还没有安装YOLOv8,可以使用以下命令安装:
pip install ultralytics
训练模型
使用YOLOv8训练模型的命令非常简单,你可以直接使用以下命令开始训练:
cd path/to/drone_building_dataset/
克隆YOLOv8仓库
git clone https://github.com/ultralytics/ultralytics.git
cd ultralytics
开始训练
python yolo.py segment train data=…/data.yaml model=yolov8n-seg.pt epochs=100 imgsz=512 batch=16
在这个命令中:
data=…/data.yaml:指定数据配置文件。
model=yolov8n-seg.pt:指定预训练权重,这里使用的是YOLOv8的小模型(分割版本)。
epochs=100:训练轮数。
imgsz=512:输入图像的大小。
batch=16:批量大小。
模型评估
训练完成后,可以使用以下命令评估模型在验证集上的表现:
python yolo.py segment val data=…/data.yaml model=runs/segment/train/weights/best.pt imgsz=512
这里的runs/segment/train/weights/best.pt是训练过程中产生的最佳模型权重文件。
模型预测
你可以使用训练好的模型对新图像进行预测:
python yolo.py segment predict source=path/to/your/image.png model=runs/segment/train/weights/best.pt imgsz=512 conf=0.4 iou=0.5
查看训练结果
训练过程中的日志和结果会保存在runs/segment/目录下,你可以查看训练过程中的损失、精度等信息。
数据增强
为了进一步提高模型性能,可以使用数据增强技术。以下是一个简单的数据增强示例:
安装albumentations库:
pip install -U albumentations
在yolo.py中添加数据增强:
import albumentations as A
from albumentations.pytorch import ToTensorV2
import cv2
定义数据增强
transform = A.Compose([
A.RandomSizedCrop(min_max_height=(400, 512), height=512, width=512, p=0.5),
A.HorizontalFlip(p=0.5),
A.VerticalFlip(p=0.5),
A.Rotate(limit=10, p=0.5, border_mode=cv2.BORDER_CONSTANT),
A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.2, p=0.5),
A.GaussNoise(var_limit=(10.0, 50.0), p=0.5),
A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
ToTensorV2()
])
在数据加载器中应用数据增强
def collate_fn(batch):
images, masks = zip(*batch)
transformed_images = []
transformed_masks = []
for img, mask in zip(images, masks):
augmented = transform(image=img, mask=mask)
transformed_images.append(augmented['image'])
transformed_masks.append(augmented['mask'])
return torch.stack(transformed_images), torch.stack(transformed_masks)
注意事项
数据集质量:确保数据集的质量,包括清晰度、标注准确性等。
模型选择:可以选择更强大的模型版本(如YOLOv8m、YOLOv8l等)以提高性能。
超参数调整:根据实际情况调整超参数,如批量大小(batch)、图像大小(imgsz)等。
监控性能:训练过程中监控损失函数和mAP指标,确保模型收敛。
通过上述步骤,你可以使用YOLOv8来训练一个高精度无人机建筑物分割数据集,并使用训练好的模型进行预测。
更多推荐

所有评论(0)