目录
CNN理解
卷积神经网络(CNN)是深度学习中最强大的架构之一,广泛应用于图像处理、目标检测和计算机视觉任务。TensorFlow 2.x 提供了非常简便的接口来实现卷积神经网络。
code实现人脸识别
数据集准备:
人脸表情数据集fer2013.csv,python3+TensorFlow 2.x直接下载可能遇到问题,可以下载到本地然后加载。
百度网盘:链接: 人脸表情数据集fer2013 提取码: ph63
code实现
cpp
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
import tensorflow as tf
from tensorflow.keras import layers, models
import random
# 1. 加载数据集
data = pd.read_csv('fer2013.csv')
# 2. 数据预处理
# 将像素值转换为 numpy 数组
X = np.array([np.fromstring(img, sep=' ') for img in data['pixels']])
X = X.reshape(-1, 48, 48, 1) # 48x48 像素,单通道(灰度图像)
X = X.astype('float32') / 255.0 # 归一化
# 标签处理
y = data['emotion'].values
y = LabelBinarizer().fit_transform(y) # 标签二值化
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. 定义卷积神经网络模型
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48, 1)))
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.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(7, activation='softmax')) # 7 类情感
# 4. 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 5. 训练模型
history = model.fit(X_train, y_train, epochs=30, batch_size=64, validation_data=(X_test, y_test))
# 6. 评估模型
test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2)
print('\nTest accuracy:', test_acc)
# 7. 可视化训练过程
plt.figure(figsize=(12, 4))
# 绘制损失
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
# 绘制准确率
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.title('Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
# 8. 随机选择图像进行可视化识别结果
def visualize_predictions(X, y, model, num_images=5):
# 随机选择图像索引
random_indices = random.sample(range(X.shape[0]), num_images)
plt.figure(figsize=(15, 6))
for i, idx in enumerate(random_indices):
plt.subplot(2, num_images//2, i + 1)
# 显示图像
plt.imshow(X[idx].reshape(48, 48), cmap='gray')
plt.axis('off')
# 进行预测
prediction = model.predict(np.expand_dims(X[idx], axis=0))
predicted_class = np.argmax(prediction)
# 显示真实标签和预测标签
plt.title(f'True: {np.argmax(y[idx])}, Pred: {predicted_class}')
plt.show()
# 可视化识别结果
visualize_predictions(X_test, y_test, model, num_images=6)
# 9. 保存模型
model.save('fer_model.h5')
模型解析
加载数据集 :使用 pandas 加载 fer2013.csv 文件。如果文件不在当前工作目录中,你需要提供完整的文件路径。
数据预处理 :将 pixels 列中的字符串转换为 NumPy 数组,并重塑为适合 CNN 的形状(48x48 像素,单通道)。将像素值归一化到 [0, 1] 范围。使用 LabelBinarizer 对情感标签进行二值化处理。
划分数据集: 使用 train_test_split 将数据集划分为训练集和测试集。
定义模型 :构建一个简单的卷积神经网络,包括卷积层、池化层和全连接层。
编译模型 :使用 Adam 优化器和交叉熵损失函数编译模型。根据你的计算资源和数据集大小,调整 epochs 和 batch_size 的值,以获得更好的训练效果
训练模型 :使用 fit() 方法训练模型,并保存训练过程中的历史记录。
评估模型 :在测试集上评估模型的准确性,并输出结果。
可视化识别结果 :定义 visualize_predictions 函数,随机选择图像进行预测,并显示真实标签和预测标签。
保存模型:将训练好的模型保存到文件中,以便后续使用。
结果展示
保存了模型可以直接加载保存的训练模型进行测试 (前提测试集已经划分)
cpp
loaded_model = tf.keras.models.load_model('fer_model.h5')
# 选择要测试的图像数量
num_images = 4
# 随机选择图像索引
random_indices = np.random.choice(X_test.shape[0], num_images, replace=False)
plt.figure(figsize=(15, 6))
for i, idx in enumerate(random_indices):
plt.subplot(2, num_images // 2, i + 1)
# 显示图像
plt.imshow(X_test[idx].reshape(48, 48), cmap='gray')
plt.axis('off')
# 进行预测
prediction = loaded_model.predict(np.expand_dims(X_test[idx], axis=0))
predicted_class = np.argmax(prediction)
# 显示真实标签和预测标签
plt.title(f'True: {np.argmax(y_test[idx])}, Pred: {predicted_class}')
plt.show()
结果探讨
准确率只有50多,需要调节参数(学习率,迭代次数)或模型结构(卷积层数量,卷积核大小)等进行多次训练测试找到合适的模型。
基于vgg16的以图搜图
VGG16是一种深度卷积神经网络(CNN),由牛津大学Visual Geometry Group在2014年提出,主要用于图像分类任务。 VGG16以其深度和简洁性而闻名,是深度学习领域中的经典模型之一。该网络由多个卷积层和池化层交替堆叠而成,最后使用全连接层进行分类。VGG16的特点是使用了连续的小卷积核(3x3)和池化层,这使得网络可以构建得更深,通常可以达到16层或19层。
数据准备
图库database
检索测试集datatest
code实现
python
import os
import numpy as np
import cv2
import matplotlib.pyplot as plt
from tensorflow.keras.applications import VGG16
from tensorflow.keras.applications.vgg16 import preprocess_input
from tensorflow.keras.preprocessing import image
from sklearn.metrics.pairwise import cosine_similarity
# 加载 VGG16 模型
model = VGG16(weights='imagenet', include_top=False, pooling='avg')
# 图像预处理
def preprocess_image(image_path):
img = image.load_img(image_path, target_size=(224, 224))
img_array = image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0)
img_array = preprocess_input(img_array)
return img_array
# 提取特征
def extract_features(image_path):
img_array = preprocess_image(image_path)
features = model.predict(img_array)
return features.flatten()
# 计算相似度
def find_similar_images(query_image_path, image_folder, top_k=9):
query_features = extract_features(query_image_path)
similarities = []
for image_name in os.listdir(image_folder):
image_path = os.path.join(image_folder, image_name)
if os.path.isfile(image_path):
features = extract_features(image_path)
sim = cosine_similarity(query_features.reshape(1, -1), features.reshape(1, -1))
similarities.append((image_name, sim[0][0]))
# 按相似度排序
similarities.sort(key=lambda x: x[1], reverse=True)
return similarities[:top_k]
# 可视化搜索结果
def visualize_results(query_image_path, similar_images, image_folder):
plt.figure(figsize=(10, 5))
# 显示查询图像
plt.subplot(1, len(similar_images) + 1, 1)
plt.imshow(cv2.cvtColor(cv2.imread(query_image_path), cv2.COLOR_BGR2RGB))
plt.title("Query Image")
plt.axis('off')
# 显示相似图像
for i, (image_name, similarity) in enumerate(similar_images):
image_path = os.path.join(image_folder, image_name)
plt.subplot(1, len(similar_images) + 1, i + 2)
plt.imshow(cv2.cvtColor(cv2.imread(image_path), cv2.COLOR_BGR2RGB))
plt.title(f"{image_name}\nSim: {similarity:.4f}")
plt.axis('off')
plt.tight_layout()
plt.show()
# 主程序
if __name__ == "__main__":
query_image = "datatest/cat.jpg" # 替换为你的查询图像路径
image_folder = "database" # 替换为你的图像文件夹路径
similar_images = find_similar_images(query_image, image_folder)
print("与查询图像相似的图像:")
for image_name, similarity in similar_images:
print(f"{image_name}: 相似度 {similarity:.4f}")
visualize_results(query_image, similar_images, image_folder)
code解析
环境设置 :使用 TensorFlow 和 Keras 加载 VGG16 模型,并设置为不包含顶部分类层,使用平均池化。
图像预处理 :使用 Keras 的 image 模块读取图像并进行预处理,包括调整大小和标准化。
特征提取 :使用 VGG16 模型提取图像特征,并将其展平为一维数组。
相似度计算 :使用余弦相似度计算查询图像与文件夹中每个图像的相似度。
可视化搜索结果:使用 Matplotlib 可视化查询图像和相似图像,并显示相似度。
结果展示
图像库里只有5张图,当query_image = "datatest/girl.jpg" top_k=3时,结果如下
当query_image = "datatest/cat.jpg", top_k=9时
确保你有足够的图像数据以进行相似度搜索。VGG16 模型较大,特征提取可能需要一些时间,具体取决于图像数量和计算资源。调整 top_k 参数以获取更多或更少的相似图像。