0


结合傅里叶变换和传统特征提取方法,通过XGBoost检测计算机生成图像

大模型的发展让CGI有了飞速的发展。一个好的艺术家可以创造出与现实几乎无法区分的产品。而如何检测AI生成的图片变得越来越困难,大多数模型的准确率只有70%左右,直到最近,模型突然能够以超过90%的准确率及逆行分辨。我们看看能否使用简单的方法也达到类似的检测指标。

我们这里要介绍的很多过程是特征工程而不是分类。这个过程包括几个步骤,看起来很复杂,但实际上他们的核心很简单。

1、将图像大小调整为256 * 256。2、应用傅里叶变换将图像转换为其频率表示。3、训练嵌入模型对图像进行分类并保留嵌入。4、应用梯度增强方法,如XGBoost,根据嵌入将图像分类为CGI或非CGI。

我们用的数据集是从ArtStation和Unsplash获得的真实照片和CGI图像,训练集中有大约630张图像,测试集中有158张图像。使用像XGBoost和嵌入这样的模型,CGI分类是困难的,但并非不可能。为什么要应用傅里叶变换?空间域图像将包含有关艺术作品主题的内容信息,但我们对此不感兴趣。我们只对噪声模式、风格和细微的美学差异感兴趣,这些可能会出现在频域,而不是空间域。

傅里叶变换本身有点复杂但总的来说,它是一系列不同频率的不同波的求和来形成原始图像。傅里叶变换将揭示噪声模式和其他频率信息被图像遮挡。嵌入模型将决定CGI和真实照片之间的差异。

我们这首先通过应用FFT算法提取一系列特征,FFT是Numpy中傅里叶变换的一种变体,然后应用Scikit-learn中的PCA。

 import numpy as np
 from PIL import Image
 from scipy.fftpack import fft2
 from tensorflow.keras.models import load_model, Model
 
 # Function to apply Fourier transform
 def apply_fourier_transform(image):
     image = np.array(image)
     fft_image = fft2(image)
     return np.abs(fft_image)
 
 # Function to preprocess image
 def preprocess_image(image_path):
     image = Image.open(image_path).convert('L')
     image = image.resize((256, 256))
     image = apply_fourier_transform(image)
     image = np.expand_dims(image, axis=-1)  # Expand dimensions to match model input shape
     image = np.expand_dims(image, axis=0)   # Expand to add batch dimension
     return image
 
 # Function to load embedding model and calculate embeddings
 def calculate_embeddings(image_path, model_path='embedding_model.keras'):
     # Load the trained model
     model = load_model(model_path)
 
     # Remove the final classification layer to get embeddings
     embedding_model = Model(inputs=model.input, outputs=model.output)
 
     # Preprocess the image
     preprocessed_image = preprocess_image(image_path)
 
     # Calculate embeddings
     embeddings = embedding_model.predict(preprocessed_image)
 
     return embeddings

该嵌入模型产生128个长度的向量嵌入,可用于XGBoost模型。

 xgb_clf = XGBClassifier(use_label_encoder=False, eval_metric='logloss', early_stopping_rounds=10)
 xgb_clf.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
 y_pred_xgb = xgb_clf.predict(X_test)

然后可以将模型保存为JSON文件,以便以后与嵌入模型一起重用。

 xgb_clf.save_model("xgb_cgi_classifier.json")

我们可以测试模型的准确性,混淆矩阵告诉我们模型在不同输入下的表现。具体来说,比较了真实照片和CGI图像的准确性。

该模型的总体准确率为92.41%,F1得分为0.9221。F1分数是衡量模型的精度和召回率的指标。精确度是识别真实的CGI示例的频率,召回率是识别为CGI的示例与整个正面示例集的比例。

对于大多数图像,嵌入空间很容易区分CGI和真实照片。但是也有例外。其中一个例子是成龙的CGI图像,它预测真实照片的概率是96%。这不是一个完美的模型,即使像XGBoost这样好的检测模型也不能检测到所有的嵌入。

我个人认为,在模型无法区分的情况下,使用图像取证工具的人类将比机器学习模型更好地检测CGI,因为人类可以使用他们的先验知识逐个像素地评估图像,而模型只能依赖他们的训练数据。人类可能会注意到模型没有训练过的CGI图像和真实照片中的模式。其中包括眼睛颜色或头发的微妙变化,这些变化并不真实,但由于CGI模型不具备完整的世界知识,因此无法对其进行评估。CGI检测模型对世界的了解是不完整的,而人类对世界的了解要大得多。因此在某些情况下,人类分类器可能比CGI检测模型表现得更好。

作者:Noah Hradek

“结合傅里叶变换和传统特征提取方法,通过XGBoost检测计算机生成图像”的评论:

还没有评论