为什么在图像分类(scikit-learn)上我的准确度非常差?

时间:2019-06-05 20:25:55

标签: python scikit-learn

基本上,我用手写数字开始分类,效果很好。数字已经在csv文件(强度编号)中准备好了。

这是我对第一个数据集(数字)所做的操作: https://www.youtube.com/watch?v=aZsZrkIgan0

数据集(数字): https://www.kaggle.com/c/digit-recognizer/data

现在,我正在尝试对猫和狗的图像进行类似的处理。我利用从上一个视频中获得的知识来对猫和狗进行分类,从而获得较高的准确性。

这是我受启发的视频(猫和狗),在这里我使用了上一部视频的教训: https://www.youtube.com/watch?v=j-3vuBynnOE

数据集(猫和狗): https://www.kaggle.com/c/dogs-vs-cats

虽然我使用DecisionTreeClassifier的数字数据集得分超过85%,而使用KNeighborsClassifier的数字得分超过95%,但我对它是狗还是猫的得分却不到50%(这确实是不好)。为什么会这样呢?它与图像的外观有关吗? (数字=白色背景和黑色字体颜色;猫和狗的图像更复杂) 还是在重塑/拟合数据时犯了一个大错误?

也:我将KNeighborsClassifier用于dogs vs cats数据集,虽然花了很多时间,但最后还是执行了。为什么在处理多张图像时,该算法的速度这么慢?

在此先感谢您的帮助。

DATADIR = r"C:\Users\XY\Documents\Python Scripts\Image Rec\Cats vs. Dogs\train"
CATEGORIES = ['Dog', 'Cat']
IMG_SIZE = 80

training_data = []
training_label = []


#creating training and test data
def create_training_data():
    for category in CATEGORIES:
        path = os.path.join(DATADIR, category)
        class_num = CATEGORIES.index(category)
        for img in os.listdir(path):
            try:
                if len(img) == 12: #9000 Cats und 9000 Dogs
                    img_array = cv2.resize(cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE), (IMG_SIZE, IMG_SIZE))
                    training_data.append(img_array)
                    training_label.append(class_num)
            except Exception as e:
                    pass

create_training_data()

print(array(training_data).shape) #(18000, 80, 80)

esting_data = []
testing_label = []

def create_testing_data():
    for category in CATEGORIES:
        path = os.path.join(DATADIR, category)
        class_num = CATEGORIES.index(category)
        for img in os.listdir(path):
            try:
                if len(img) < 12: #1000 Cats und 1000 Dogs
                    img_array = cv2.resize(cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE), (IMG_SIZE, IMG_SIZE))
                    testing_data.append(img_array)
                    testing_label.append(class_num)
            except Exception as e:
                    pass

create_testing_data()

print(array(testing_data).shape) #(2000, 80, 80)


#Using DecisionTreeClassifier

clf = DecisionTreeClassifier()

clf.fit(array(training_data).reshape(-1, IMG_SIZE*IMG_SIZE), array(training_label).T)

p = clf.predict(array(testing_data).reshape(-1, IMG_SIZE*IMG_SIZE))

count = 0

for i in arange(0, len(array(testing_data).reshape(-1, IMG_SIZE*IMG_SIZE))):
    count+=1 if p[i] == training_label[i] else 0
    #print("Prediction:", p[i], "- Actual value:", training_label[i])

print("Accuracy = " + str(round((count/len(array(testing_data).reshape(-1, IMG_SIZE*IMG_SIZE)))*100, 2)) + " %") #Accuracy 48.3 %


#Using KNeighborsClassifier

clf = KNeighborsClassifier()

clf.fit(array(training_data).reshape(-1, IMG_SIZE*IMG_SIZE), array(training_label).T)

p = clf.predict(array(testing_data).reshape(-1, IMG_SIZE*IMG_SIZE))

count = 0

for i in arange(0, len(array(testing_data).reshape(-1, IMG_SIZE*IMG_SIZE))):
    count+=1 if p[i] == training_label[i] else 0
    #print("Prediction:", p[i], "- Actual value:", training_label[i])

print("Accuracy = " + str(round((count/len(array(testing_data).reshape(-1, IMG_SIZE*IMG_SIZE)))*100, 2)) + " %") #Accuracy 34.75 %

training_data形状:(18000,80,80) test_data形状:(2000、80、80) 准确度48.3%(DecisionTreeClassifier) 准确度34.75%(KNeighborsClassifier) 80 x 80 example of image quality

1 个答案:

答案 0 :(得分:0)

1-检查数据集验证 2-做预处理步骤 3-测试另一个图像 4-使用其他算法 5-使用其他指标 6-分析其他人的结果