knn增强数据训练

简介: 【7月更文挑战第27天】

在 load_data 和 predict_image 函数中,将图像转换为灰度图像 (color.rgb2gray)。
将图像数据类型转换为 uint8 (img_as_ubyte)。
增强数据集包括彩色图像和其灰度版本。
这样做可以确保模型能够识别黑白打印的图像。你可以进一步调整数据增强策略,以更好地适应黑白图像的特性。

import os
from skimage import io, color, transform, img_as_ubyte
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import imgaug.augmenters as iaa
import pickle

# 导入UGOT机器人库
from ugot import ugot
import cv2

# 函数:从文件夹加载图像数据
def load_data(data_folder):
    data = []
    labels = []
    for folder in os.listdir(data_folder):
        folder_path = os.path.join(data_folder, folder)
        print("正在:", folder_path)  # 新增的打印语句
        if os.path.isdir(folder_path):
            label = folder
            for filename in os.listdir(folder_path):
                print("正在读取文件:", filename)  # 新增的打印语句
                img_path = os.path.join(folder_path, filename)
                img = io.imread(img_path)
                img = transform.resize(img, (50, 50))  # 调整图像大小为50x50像素
                img_gray = color.rgb2gray(img)  # 转换为灰度图
                img = img_as_ubyte(img_gray)  # 转换图像数据类型为 uint8
                data.append(img.flatten())  # 将图像数据展平
                labels.append(label)
    return data, labels

# 数据增强
def augment_data(images, labels, n_augmentations=5):
    aug = iaa.Sequential([
        iaa.Fliplr(0.5), # 水平翻转
        iaa.Affine(rotate=(-20, 20)), # 随机旋转
        iaa.Multiply((0.8, 1.2)), # 随机亮度
        iaa.Affine(scale=(0.9, 1.1)) # 随机缩放
    ])
    augmented_images = []
    augmented_labels = []
    for img, label in zip(images, labels):
        img = img.reshape((50, 50, -1))  # 恢复图像形状
        for _ in range(n_augmentations):
            augmented_img = aug(image=img)
            augmented_images.append(augmented_img.flatten())  # 展平图像
            augmented_labels.append(label)
    return augmented_images, augmented_labels

# 加载数据
data_folder = './data'
print(data_folder)
X, y = load_data(data_folder)

# 增强数据
X_augmented, y_augmented = augment_data(X, y)

# 将原始数据和增强数据合并
X_combined = X + X_augmented
y_combined = y + y_augmented

# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_combined, y_combined, test_size=0.2, random_state=42)

# 初始化KNN分类器
knn_classifier = KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn_classifier.fit(X_train, y_train)

# 评估模型
accuracy = knn_classifier.score(X_test, y_test)
print("Accuracy:", accuracy)

# 保存模型
model_filename = 'knn_model.pkl'
with open(model_filename, 'wb') as model_file:
    pickle.dump(knn_classifier, model_file)

# 加载模型
with open(model_filename, 'rb') as model_file:
    loaded_model = pickle.load(model_file)

# 设置置信度阈值
confidence_threshold = 0.5

# 函数:预测图像内容
def predict_image(img):
    img = transform.resize(img, (50, 50))
    img_gray = color.rgb2gray(img)  # 转换为灰度图
    img = img_as_ubyte(img_gray)  # 转换图像数据类型为 uint8
    flattened_img = img.flatten()
    probs = loaded_model.predict_proba([flattened_img])
    print("Prediction Probabilities:", probs)  # 打印预测概率分布
    max_prob = np.max(probs)
    if max_prob < confidence_threshold:
        return "no"
    prediction = loaded_model.predict([flattened_img])
    return prediction[0]

def predict_and_display_image(img):
    img_resized = transform.resize(img, (50, 50))
    img_gray = color.rgb2gray(img_resized)  # 转换为灰度图
    img_resized = img_as_ubyte(img_gray)  # 转换图像数据类型为 uint8
    flattened_img = img_resized.flatten()
    probs = loaded_model.predict_proba([flattened_img])
    max_prob = np.max(probs)
    if max_prob < confidence_threshold:
        prediction = "no"
    else:
        prediction = loaded_model.predict([flattened_img])[0]
    print(prediction)  # 调试信息
    # 在图像上显示预测结果
    cv2.putText(img, f'Prediction: {prediction}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)

    cv2.imshow('Image', img)
    cv2.waitKey(1)
    # cv2.destroyAllWindows()


try:
    while True:
        frame = got.read_camera_data()
        if frame is not None:
            nparr = np.frombuffer(frame, np.uint8)
            img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)

            # 使用加载的模型进行预测并在图像上显示结果
            predict_and_display_image(img)

            # 在此处添加物体跟随和闭环控制逻辑
            # print('-------:', got.get_knn_result('knn_model'))
except KeyboardInterrupt:
    print('-----KeyboardInterrupt')

image.png

目录
相关文章
|
16天前
|
存储 编解码 负载均衡
数据分片算法
【10月更文挑战第25天】不同的数据分片算法适用于不同的应用场景和数据特点,在实际应用中,需要根据具体的业务需求、数据分布情况、系统性能要求等因素综合考虑,选择合适的数据分片算法,以实现数据的高效存储、查询和处理。
|
16天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
17天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
29天前
|
机器学习/深度学习 人工智能 算法
"拥抱AI规模化浪潮:从数据到算法,解锁未来无限可能,你准备好迎接这场技术革命了吗?"
【10月更文挑战第14天】本文探讨了AI规模化的重要性和挑战,涵盖数据、算法、算力和应用场景等方面。通过使用Python和TensorFlow的示例代码,展示了如何训练并应用一个基本的AI模型进行图像分类,强调了AI规模化在各行业的广泛应用前景。
29 5
|
20天前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
28 0
|
30天前
|
人工智能 算法 前端开发
无界批发零售定义及无界AI算法,打破传统壁垒,累积数据流量
“无界批发与零售”是一种结合了批发与零售的商业模式,通过后端逻辑、数据库设计和前端用户界面实现。该模式支持用户注册、登录、商品管理、订单处理、批发与零售功能,并根据用户行为计算信用等级,确保交易安全与高效。
|
30天前
|
前端开发 算法 JavaScript
无界SaaS模式深度解析:算力算法、链接力、数据确权制度
私域电商的无界SaaS模式涉及后端开发、前端开发、数据库设计、API接口、区块链技术、支付和身份验证系统等多个技术领域。本文通过简化框架和示例代码,指导如何将核心功能转化为技术实现,涵盖用户管理、企业店铺管理、数据流量管理等关键环节。
|
1月前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
32 0
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
9天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。