时隔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(很多库函数看不懂),自己学到了卷积神经网络入门,几个深度学习(机械学习)专业名词等
666
(・∀・)