当前位置: 首页 > article >正文

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实现

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 函数,随机选择图像进行预测,并显示真实标签和预测标签。
保存模型:将训练好的模型保存到文件中,以便后续使用。

结果展示

 

保存了模型可以直接加载保存的训练模型进行测试 (前提测试集已经划分)

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实现

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


http://www.kler.cn/a/521284.html

相关文章:

  • 软考信安27~Windows操作系统安全相关
  • 【反悔堆】【hard】力扣871. 最低加油次数
  • STM32使用VScode开发
  • 【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报
  • 六、深入了解DI
  • 汽车网络信息安全-ISO/SAE 21434解析(中)
  • JS高阶 - day04
  • ubuntu取消定时锁定
  • 学院失物招领 app 的设计与实现
  • 计算机图形学实验练习(实验1.2-4.1AND补充实验12)
  • 【阅读笔记】基于整数+分数微分的清晰度评价算子
  • 数据的秘密:如何用大数据分析挖掘商业价值
  • Ubuntu 24.04 安装 NVIDIA Container Toolkit 全指南:让Docker拥抱GPU
  • for...in 和 Object.keys().forEach的区别
  • GO语言 链表(单向链表
  • 接口管理文档Yapi的安装与配置
  • 华硕笔记本装win10哪个版本好用分析_华硕笔记本装win10专业版图文教程
  • 无所不搜,吾爱制造
  • 深入 Rollup:从入门到精通(一)专栏介绍
  • 【Leetcode 热题 100】139. 单词拆分
  • Autogen_core: Quickstart
  • vulnhub靶场【kioptrix-2】靶机
  • 如何使用tushare pro获取股票数据——附爬虫代码以及tushare积分获取方式
  • Excel分区间统计分析(等步长、不等步长、多维度)
  • 瑞芯微方案:RV1126定制开发板方案定制
  • 【Elasticsearch 基础入门】Centos7下Elasticsearch 7.x安装与配置(单机)