python3+TensorFlow 2.x(五)CNN

目录

CNN理解

code实现人脸识别

数据集准备:

code实现

模型解析

结果展示

结果探讨

基于vgg16的以图搜图

数据准备

图库database

检索测试集datatest

code实现

code解析

结果展示


CNN理解

卷积神经网络(CNN)是深度学习中最强大的架构之一,广泛应用于图像处理、目标检测和计算机视觉任务。TensorFlow 2.x 提供了非常简便的接口来实现卷积神经网络。

神经网络(CNN)个人理解

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 参数以获取更多或更少的相似图像。

相关推荐
lilu88888881 小时前
AI代码生成器赋能房地产:ScriptEcho如何革新VR/AR房产浏览体验
前端·人工智能·ar·vr
梦云澜1 小时前
论文阅读(五):乳腺癌中的高斯图模型和扩展网络推理
论文阅读·人工智能·深度学习·学习
危险、2 小时前
Spring Boot 无缝集成SpringAI的函数调用模块
人工智能·spring boot·函数调用·springai
深度学习实战训练营2 小时前
基于迁移学习的ResNet50模型实现石榴病害数据集多分类图片预测
人工智能·分类·迁移学习
XianxinMao3 小时前
开源AI模型发布策略:平衡开放与质量的艺术
人工智能
Fxrain3 小时前
[Computer Vision]实验二:图像特征点提取
人工智能·计算机视觉
人类群星闪耀时3 小时前
用深度学习优化供应链管理:让算法成为商业决策的引擎
人工智能·深度学习·算法
小树苗1934 小时前
全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI
人工智能·web3·aigc
有Li4 小时前
基于先验领域知识的归纳式多实例多标签学习用于牙周病分类| 文献速递 -医学影像人工智能进展
人工智能·深度学习·文献
_沉浮_5 小时前
SpringAI基于API对大语言模型调用
人工智能·语言模型·springai