簡體   English   中英

添加噪聲后圖像測試精度提高

[英]Image testing accuracy increases after adding noise

我正在使用不同方面的面部圖像進行實驗。 第一個數據集只是普通人臉,我的第二個數據集是通過添加不同級別的噪聲產生的遮擋。 第一個數據集由方差為 0.025 的噪聲組成,第二個數據集包含方差為 0.05 的圖像。 第三個數據集的圖像方差為 0.1。 因此,我使用線性 SVM 對它們進行了訓練和測試,其中方差水平,我期望測試精度下降到 go。 當我用正常人臉圖像進行測試時,測試精度為:正常人臉圖像為 96.59,模擬遮擋圖像為 48.04,方差值為 0.025 時為 95.01,方差值為 0.05 時為 93.65。 到目前為止,一切看起來都很合理,但是對於 0.1 的方差,im 得到 95.46,這高於方差為 0.05 的圖像噪聲。

我原以為最后一個值會低於 95.01。

我對每個數據集訓練都使用相同的 model:

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 )

我以前做過類似的事情,增強圖像實際上提高了准確性。 在這里我假設你正在做一個分類任務,比如性別檢測? 你的結果背后的原因是你的原始面部圖像在預測 class 中可能有不同程度的噪聲(例如,大多數男性圖像有噪聲,女性圖像噪聲較小),所以在檢測 output 時,model 使用低級線索,即噪聲作為特征。 您可以將 model 視為“懶惰”,尤其是在這里您沒有使用 DNN,因此 model 更可能是“懶惰”並依賴於低級線索。 通過添加噪聲,您可以使 model 更難依賴信息,因為現在所有圖像都有噪聲,因此 model 開始尋找高級線索,在您的情況下,這些線索可能會提供 model 更高的預測能力/准確性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM