添加噪声后图像测试精度提高

Posted

技术标签:

【中文标题】添加噪声后图像测试精度提高【英文标题】:Image testing accuracy increases after adding noise 【发布时间】:2020-12-22 03:18:59 【问题描述】:

我正在使用具有不同方面的面部图像进行实验。第一个数据集只是普通人脸,我的第二个数据集是通过添加不同级别的噪声生成的遮挡。第一个数据集由添加了方差为 0.025 的噪声组成,第二个数据集包含方差为 0.05 的图像。第三个数据集的图像方差为 0.1。因此,我使用线性 SVM 对它们进行了训练和测试,在方差水平上,我预计测试准确度会下降。当我用正常人脸图像进行测试时,测试精度为:正常人脸图像为 96.59,模拟遮挡图像为 48.04,方差值为 0.025 为 95.01,方差值为 0.05 为 93.65。到目前为止,一切看起来都是合理的,但是对于 0.1 的方差,我得到 95.46,这高于方差为 0.05 的图像噪声。

我预计最后一个值会低于 95.01。

我对每个数据集训练都使用相同的模型:

SVC(kernel='linear',  C=0.00006)

我想知道为什么会发生这种情况,有什么合理的解决方法?鉴于我想使用相同的正则化参数来训练每个数据集。

我如何以百分比水平向图像添加噪点:

    def generate_noisy_image(x: np.array, variance: float) -> np.array:
        noise = np.random.normal(loc=0, scale=variance, size=x.shape)
        return x + noise

    def load_dataset(path, max_num):
        imagesList = listdir(path)
        loadedImages = []
        for root, dirs, files in os.walk(path):
            for i, name in enumerate(files):
                if i == max_num:
                    break
            print(image)
            img = PImage.open(path + image)
            img.resize((81, 150))
            arr = np.array(img)
            noise_image = generate_noisy_image(x = arr, variance=0.1)
            noise_image = Image.fromarray(noise_image)
            noise_image = noise_image.convert("L")
            loadedImages.append(arr)
            #noise_image.save('C:/Users/Noise-Dataset/Noise_Value_10/'+person_folder+filepath, 'JPEG')
        return loadedImages
    
    
    noise_dataset_1 = load_dataset('C:/Users/Noise-Dataset/Noise_Value_10', 50) 

    X_train_n1, X_test_n1, y_train_n1, y_test_n1 = train_test_split(
            noise_dataset_1_array, noise_1_target, test_size=0.49, random_state=0)


def train(clf, X_train, X_test, y_train, y_test):
    
    clf.fit(X_train, y_train)
    print ("Accuracy on training set:")
    print (clf.score(X_train, y_train))
    print ("Accuracy on testing set:")
    print (clf.score(X_test, y_test))
    
    y_pred = clf.predict(X_test)
    
    print ("Classification Report:")
    print (metrics.classification_report(y_test, y_pred))
    print ("Accuracy:")
    print (metrics.accuracy_score(y_test, y_pred))

svc_1 = SVC(kernel='linear', C=0.00006)
train(svc_1, X_train_n1, X_test_n1, y_train_n1, y_test_n1 )

【问题讨论】:

您报告的所有准确度都足够接近,因此差异可能只是统计上的侥幸,尤其是在您的测试集相对较小的情况下。 【参考方案1】:

我以前做过类似的事情,增强图像实际上提高了准确性。在这里,我假设您正在执行分类任务,例如性别检测?结果背后的原因是您的原始面部图像在预测类中可能具有不同程度的噪声(例如,大多数男性图像有噪声,而女性图像噪声较小),因此在检测输出时,模型使用低级线索,即噪声作为特征。您可以将模型视为“懒惰”,尤其是在这里您没有使用 DNN,因此该模型更有可能是“懒惰”并依赖于低级提示。通过添加噪声,您可以使模型更难依赖信息,因为现在所有图像都有噪声,因此模型开始寻找高级线索,在您的情况下,这可能会为模型提供更高的预测能力/准确性。

【讨论】:

以上是关于添加噪声后图像测试精度提高的主要内容,如果未能解决你的问题,请参考以下文章

matlab如何计算遥感图像的分类精度

如何在图像中添加高斯噪声?

测试精度比实际输出高。如何提高实际输出精度?

训练精度提高但验证精度仍然是每个班级的机会(1/班级数)

Python 中的测试精度(图像分类)

如何提高机器学习的分类精度