语义分割裂缝数据集,SCI亲测好用
(混凝土,道路等)
Crack500 DeepCrack
concrete crack dataset CFD
cracktree200 crackforest等等数据集
总计1w+ 包括含有和不含裂缝图像标签
包括高精度原始图像,灰度图像标签
包括224像素值大小图像及标签
包括数据集数据增强操作(翻转,旋转,像素变换等)
此外,提供对原始图像数据预处理操作代码(等比例缩放,裁剪,数据增强,随机抽取等)
裂缝检测语义分割数据集介绍
数据集概览
这是一个针对裂缝检测的语义分割数据集,包含了混凝土、道路等多种场景下的裂缝图像,总计1万张以上,包括含有和不含裂缝的图像,提供了高精度的原始图像和灰度图像标签。数据集支持224像素值大小的图像及标签,并且提供了数据增强功能,如翻转、旋转和像素变换等。此外,还提供了对原始图像数据的预处理操作代码,包括等比例缩放、裁剪、数据增强和随机抽取等功能。
数据集特点
- 大规模: 总计1万张以上的图像,适合用于训练和评估语义分割模型。
- 多场景: 包括混凝土、道路等多种场景下的裂缝图像,提高了模型的泛化能力。
- 高精度: 提供了高精度的原始图像和灰度图像标签,有利于准确的裂缝检测。
- 数据增强: 提供了多种数据增强方法,帮助提升模型性能。
数据集结构
假设数据集文件夹结构如下:
crack_detection_dataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
├── masks/
│ ├── train/
│ ├── val/
│ └── test/
├── data.yaml
└── preprocess.py
images/
目录下存放原始图像文件。masks/
目录下存放对应的语义分割标签文件。data.yaml
文件定义了数据集的配置信息。preprocess.py
文件是预处理操作的脚本。
data.yaml
文件示例
# data.yaml
train: ./images/train
val: ./images/val
test: ./images/test
nclasses: 2
names: ['background', 'crack']
请注意,这里的nclasses
参数设置为2,表示有两个类别:背景和裂缝;names
参数设置为['background', 'crack']
,表示类别名称为背景和裂缝。
preprocess.py
文件示例
以下是一个简单的Python代码示例,展示了如何对原始图像数据进行预处理操作,包括等比例缩放、裁剪、数据增强和随机抽取等。
import os
import random
import cv2
import numpy as np
from PIL import Image
def resize_and_crop(image, target_size, crop_size):
"""
对图片进行等比例缩放和中心裁剪。
Parameters:
image (numpy.ndarray): 输入的图片。
target_size (tuple): 目标尺寸。
crop_size (tuple): 裁剪尺寸。
Returns:
resized_cropped_img (numpy.ndarray): 缩放并裁剪后的图片。
"""
img_height, img_width, _ = image.shape
aspect_ratio = img_width / img_height
if aspect_ratio > target_size[0] / target_size[1]:
new_width = crop_size[0]
new_height = int(new_width / aspect_ratio)
else:
new_height = crop_size[1]
new_width = int(new_height * aspect_ratio)
resized_img = cv2.resize(image, (new_width, new_height))
offset_x = (new_width - crop_size[0]) // 2
offset_y = (new_height - crop_size[1]) // 2
cropped_img = resized_img[offset_y:offset_y + crop_size[1], offset_x:offset_x + crop_size[0]]
return cropped_img
def data_augmentation(image):
"""
对图片进行数据增强。
Parameters:
image (numpy.ndarray): 输入的图片。
Returns:
augmented_img (numpy.ndarray): 增强后的图片。
"""
flip = random.choice([True, False])
rotate_angle = random.uniform(-10, 10)
if flip:
augmented_img = cv2.flip(image, 1)
else:
augmented_img = image.copy()
augmented_img = cv2.rotate(augmented_img, cv2.ROTATE_90_CLOCKWISE)
return augmented_img
def preprocess_data(dataset_dir, output_dir, n_samples_per_class=100):
"""
对整个数据集进行预处理。
Parameters:
dataset_dir (str): 原始数据集目录。
output_dir (str): 输出预处理后数据集的目录。
n_samples_per_class (int): 每个类别要抽取的样本数。
"""
for folder in ["train", "val", "test"]:
input_folder = os.path.join(dataset_dir, folder)
output_folder = os.path.join(output_dir, folder)
os.makedirs(output_folder, exist_ok=True)
for label in ["background", "crack"]:
input_label_folder = os.path.join(input_folder, label)
output_label_folder = os.path.join(output_folder, label)
os.makedirs(output_label_folder, exist_ok=True)
files = os.listdir(input_label_folder)
random.shuffle(files)
for i, filename in enumerate(files[:n_samples_per_class]):
img_path = os.path.join(input_label_folder, filename)
img = cv2.imread(img_path)
resized_cropped_img = resize_and_crop(img, (224, 224), (200, 200))
augmented_img = data_augmentation(resized_cropped_img)
output_path = os.path.join(output_label_folder, f"{filename.split('.')[0]}_{i}.jpg")
cv2.imwrite(output_path, augmented_img)
if __name__ == "__main__":
original_data_dir = "/path/to/original/dataset/images"
preprocessed_data_dir = "/path/to/preprocessed/dataset/images"
preprocess_data(original_data_dir, preprocessed_data_dir, n_samples_per_class=100)
这段代码会读取原始数据集中的图片,然后对其进行等比例缩放、中心裁剪、数据增强等操作,并保存到新的目录中。你可以根据实际需求修改resize_and_crop()
函数和data_augmentation()
函数中的参数来控制预处理的程度。