• 决策树完成图片分类任务


    数据集要求: 训练集 和 验证集 (要求分好) 

    图片放置规则 : 一个总文件夹 放类别名称的子文件夹 其中子文件夹 为存放同一类别图片

    举个例子 分类动物 则 总文件夹名称为动物 子文件夹为 猫 狗 猪猪 。。。

    其中猫的文件夹里面都是猫

    给出代码:

    1. import os
    2. import cv2
    3. import numpy as np
    4. import logging
    5. from sklearn.tree import DecisionTreeClassifier
    6. from sklearn.metrics import accuracy_score, confusion_matrix
    7. # 设置日志
    8. logging.basicConfig(filename='training_log.txt', level=logging.INFO, format='%(asctime)s - %(message)s')
    9. # 读取图像数据和标签
    10. def load_images_from_folder(folder):
    11. images = []
    12. labels = []
    13. label = 0
    14. for subdir in os.listdir(folder):
    15. subpath = os.path.join(folder, subdir)
    16. if os.path.isdir(subpath):
    17. for filename in os.listdir(subpath):
    18. if filename.endswith(".jpg"):
    19. img_path = os.path.join(subpath, filename)
    20. img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
    21. img_normalized = cv2.resize(img, (256, 256)) # 归一化图像大小为256x256
    22. images.append(img_normalized.flatten())
    23. labels.append(label)
    24. label += 1
    25. return images, labels
    26. # 主函数
    27. def main():
    28. # train_folder = "YOUR_TRAIN_DATASET_FOLDER_PATH" # 替换为你的训练集文件夹路径
    29. # test_folder = "YOUR_TEST_DATASET_FOLDER_PATH" # 替换为你的测试集文件夹路径
    30. train_folder = "/Users/chen_dongdong/Desktop/宝钢项目/little_work/train" # 替换为你的训练集文件夹路径
    31. test_folder = "/Users/chen_dongdong/Desktop/宝钢项目/little_work/val" # 替换为你的测试集文件夹路径
    32. logging.info("Loading training data from %s", train_folder)
    33. X_train, y_train = load_images_from_folder(train_folder)
    34. logging.info("Loaded %d training samples", len(X_train))
    35. logging.info("Loading test data from %s", test_folder)
    36. X_test, y_test = load_images_from_folder(test_folder)
    37. logging.info("Loaded %d test samples", len(X_test))
    38. logging.info("Training DecisionTreeClassifier...")
    39. clf = DecisionTreeClassifier()
    40. clf.fit(X_train, y_train)
    41. logging.info("Training completed.")
    42. y_pred = clf.predict(X_test)
    43. accuracy = accuracy_score(y_test, y_pred)
    44. logging.info("Test Accuracy: %f", accuracy)
    45. cm = confusion_matrix(y_test, y_pred)
    46. cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
    47. logging.info("Normalized Confusion Matrix:")
    48. for row in cm_normalized:
    49. logging.info(" - ".join(map(lambda x: "{:.2f}".format(x), row)))
    50. # 打印特征重要性
    51. feature_importances = clf.feature_importances_
    52. top_features = np.argsort(feature_importances)[-10:] # 打印最重要的10个特征
    53. logging.info("Top 10 important features:")
    54. for idx in top_features:
    55. logging.info("Feature %d: %f", idx, feature_importances[idx])
    56. if __name__ == "__main__":
    57. main()

    使用DecisionTreeClassifierfeature_importances_属性。这个属性会返回一个数组,其中每个值表示相应特征的重要性。值越大,特征越重要。

    我们使用的是图像的灰度值作为特征,所以特征的数量会非常大(例如,对于256x256的图像,有65536个特征)。为了简化输出,我们可以只打印出最重要的特征。

    这是我们生成的日志文件 

    使用sklearn的决策树分类器和opencv来处理图像数据。这个脚本将:

    1. 从指定的文件夹中读取所有子文件夹中的图像。
    2. 将图像转换为灰度。
    3. 将灰度图像转换为一维数组作为特征。
    4. 使用决策树分类器进行训练。
    5. 输出模型的准确性。

    请确保已经安装了opencvsklearn库。

    pip install opencv-python-headless
    pip install scikit-learn


     可加镜像

    pip install 镜像-CSDN博客

    在训练过程中记录关键的信息,例如每次迭代的训练损失、验证损失、准确性等。但由于我们在此使用的是DecisionTreeClassifier,它不像深度学习模型那样进行多次迭代,所以我们只能记录模型的最终准确性和混淆矩阵。

  • 相关阅读:
    mysql 主从复制
    数据结构-二叉树力扣题
    简单工厂、工厂方法、抽象工厂对比
    【ubuntu中的docker记录】—— 使用docker的常用的指令记录,持续更新中
    NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧
    传智杯第二届javaB组例题
    Windows OpenGL 图像绿幕抠图
    skywalking链路追踪整合spring-cloud
    Word2Vec的原理是什么,如何用训练Word2Vec
    超级好用的笔记工具------Typora 如何修改Typora 中图片保存的位置
  • 原文地址:https://blog.csdn.net/qq_68308828/article/details/133998232