以下是一个基本的桥梁裂缝目标的 CNN 检测中特征提取后训练分类器的 Python 代码示例:
```python
import cv2
import numpy as np
import os
import tensorflow as tf
from tensorflow.keras import layers, models, optimizers
# 准备数据
data_dir = 'path/to/data/directory'
train_dir = os.path.join(data_dir, 'train')
test_dir = os.path.join(data_dir, 'test')
train_crack_dir = os.path.join(train_dir, 'crack')
train_non_crack_dir = os.path.join(train_dir, 'non_crack')
test_crack_dir = os.path.join(test_dir, 'crack')
test_non_crack_dir = os.path.join(test_dir, 'non_crack')
train_crack_files = os.listdir(train_crack_dir)
train_non_crack_files = os.listdir(train_non_crack_dir)
test_crack_files = os.listdir(test_crack_dir)
test_non_crack_files = os.listdir(test_non_crack_dir)
train_images = []
train_labels = []
test_images = []
test_labels = []
for file in train_crack_files:
img_path = os.path.join(train_crack_dir, file)
img = cv2.imread(img_path)
train_images.append(img)
train_labels.append(1)
for file in train_non_crack_files:
img_path = os.path.join(train_non_crack_dir, file)
img = cv2.imread(img_path)
train_images.append(img)
train_labels.append(0)
for file in test_crack_files:
img_path = os.path.join(test_crack_dir, file)
img = cv2.imread(img_path)
test_images.append(img)
test_labels.append(1)
for file in test_non_crack_files:
img_path = os.path.join(test_non_crack_dir, file)
img = cv2.imread(img_path)
test_images.append(img)
test_labels.append(0)
train_images = np.array(train_images)
train_labels = np.array(train_labels)
test_images = np.array(test_images)
test_labels = np.array(test_labels)
# 构建模型
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(256, 256, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
# 编译模型
model.compile(optimizer=optimizers.RMSprop(lr=1e-4),
loss='binary_crossentropy',
metrics=['acc'])
# 训练模型
history = model.fit(train_images, train_labels, epochs=10, batch_size=32,
validation_data=(test_images, test_labels))
# 保存模型
model.save('bridge_crack_detection.h5')
```
在这个代码示例中,我们首先准备了训练和测试数据,然后构建了一个简单的 CNN 模型,编译并训练了模型,最后保存了训练好的模型。
在实际应用中,您可能需要进行更多的数据处理和增强,以及对模型进行更复杂的调整和优化。