时隔4个月,这段时间经历一次服务器迁移后就再没更新
弄了一个AI图片识别算法的比赛
对于这些我是什么都不懂的,书看少了,,,,,,

全靠GPT了

《安装库pip install deepface

deepface人脸识别库

安装库pip install tf-keras,deepface的前置依赖

安装CV pip install opencv-python》此处省略

python库安装

pip install numpy opencv-python tensorflow keras scikit-learn

下面给出实例代码

import cv2
import numpy as np
import os
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

# 读取和处理图像数据
def load_images(image_dir):
    images = []  # 用来存储图像的列表
    labels = []  # 用来存储标签的列表
    label_map = {'real': 0, 'generated': 1}  # 标签映射

    # 遍历每个类别文件夹
    for label in os.listdir(image_dir):
        label_dir = os.path.join(image_dir, label)
        
        # 确保是文件夹
        if os.path.isdir(label_dir):
            for img_file in os.listdir(label_dir):
                img_path = os.path.join(label_dir, img_file)
                
                # 读取图像并调整大小
                image = cv2.imread(img_path)
                image = cv2.resize(image, (224, 224))  # 将图像调整为224x224的尺寸

                # 计算图像的梯度(通过Sobel算子)
                gradient_image = compute_gradients(image)

                # 归一化梯度图像
                gradient_image = np.expand_dims(gradient_image, axis=-1)  # 添加通道维度
                gradient_image = gradient_image / 255.0  # 归一化到0-1范围
                
                # 添加图像和对应的标签
                images.append(gradient_image)
                labels.append(label_map[label])  # 使用标签映射:0是“real”,1是“generated”

    return np.array(images), np.array(labels)

# 计算图像梯度
def compute_gradients(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    grad_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5)
    grad_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5)
    gradient_magnitude = np.sqrt(grad_x ** 2 + grad_y ** 2)
    gradient_image = cv2.normalize(gradient_magnitude, None, 0, 255, cv2.NORM_MINMAX)
    return gradient_image

# 加载数据集
image_dir = 'dataset'  # 假设数据集的根目录是'dataset'
images, labels = load_images(image_dir)

# 查看数据的形状
print(images.shape)  # 输出:(总样本数, 224, 224, 1),表示每张图片的尺寸是224x224,且是单通道(梯度图)
print(labels.shape)  # 输出:(总样本数,)

# 数据集拆分:80%训练集,20%测试集
trainX, testX, trainY, testY = train_test_split(images, labels, test_size=0.2, random_state=42)

# 打印分割后数据的形状
print(f"Training data shape: {trainX.shape}, Training labels shape: {trainY.shape}")
print(f"Testing data shape: {testX.shape}, Testing labels shape: {testY.shape}")

# 定义卷积神经网络(CNN)模型
model = Sequential()

# 第1层卷积层,包含32个3x3卷积核,激活函数使用ReLU
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 1)))
model.add(MaxPooling2D((2, 2)))  # 最大池化层

# 第2层卷积层,包含64个3x3卷积核
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))

# 扁平化层,将多维的特征图展平为一维
model.add(Flatten())

# 全连接层
model.add(Dense(128, activation='relu'))

# 输出层,使用sigmoid激活函数(用于二分类)
model.add(Dense(1, activation='sigmoid'))

# 编译模型,使用binary_crossentropy作为损失函数,adam优化器,评估指标为准确率
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# 打印模型结构
model.summary()

# 训练模型
history = model.fit(
    trainX, trainY,               # 训练数据和标签
    epochs=10,                    # 训练10轮
    batch_size=32,                # 每批次32个样本
    validation_data=(testX, testY) # 验证数据(测试集)
)

# 训练过程中的输出包括每个epoch的损失(loss)和准确率(accuracy)

# 使用测试集评估模型
test_loss, test_accuracy = model.evaluate(testX, testY)

print(f"Test loss: {test_loss}")
print(f"Test accuracy: {test_accuracy}")

# 使用新图片进行预测
new_image = cv2.imread('new_image.jpg')  # 读取新的图片
new_image = cv2.resize(new_image, (224, 224))  # 调整图片尺寸
new_image = compute_gradients(new_image)  # 计算梯度
new_image = np.expand_dims(new_image, axis=-1)  # 添加通道维度
new_image = new_image / 255.0  # 归一化到0-1范围

# 使用模型进行预测
prediction = model.predict(np.expand_dims(new_image, axis=0))  # 扩展维度使其符合输入格式

# 输出预测结果
if prediction[0] > 0.5:
    print("The image is AI-generated.")
else:
    print("The image is real.")

1.Tan等人[1]设计了一个利用梯度来表示GAN生成图像中人工痕迹的新型检测框架LGrad,旨在构建一个可以跨模型和跨数据的通用检测器。具体来说,该检测器利用预训练的CNN 模型将图像转换成梯度,随后利用这些梯度来呈现图片的人工痕迹,并将其输入分类器以确定图像的真实性。基于这个思路,设计一个具体的可实践的程序,来判断一张图片是否是ai生成

名称解释:

梯度:在图像处理和计算机视觉中,梯度是指图像中像素值变化的速率。具体来说,梯度可以反映图像中亮度变化的方向和程度。它通常用于边缘检测和特征提取,帮助识别图像中的重要特征和结构。

常用的计算梯度的方法包括:

  • Sobel算子:通过对图像应用Sobel卷积核来计算x和y方向的梯度,生成梯度幅度图。
  • Prewitt算子Laplacian算子也是常见的边缘检测方法。

在AI生成图像检测中的应用

在AI生成图像检测中,使用图像的梯度可以帮助识别伪影和人工痕迹,因为AI生成的图像可能在亮度变化和边缘特征上与真实图像有显著差异。这种差异在梯度图中可能表现为不自然的边缘或模式,因此通过分析梯度,可以有效地判断图像的真实性。

数据集和测试图片说明

数据集格式

dataset/
    real/
        real1.jpg
        real2.jpg
        ...
    generated/
        gen1.jpg
        gen2.jpg
        ...

测试图片

new_image.jpg

总结:代码部分全靠GPT(很多库函数看不懂),自己学到了卷积神经网络入门,几个深度学习(机械学习)专业名词等