当前位置: 首页 > news >正文

机器学习:knn算法实现图像识别

1、概述

        使用K-近邻(K-Nearest Neighbors, KNN)算法对手写数字进行识别的过程。通过读取一张包含多个手写数字的图片,将其分割成单独的数字图像,并将其作为训练和测试数据集。

2、数据处理思路

1、图像分割该数据有50行100列,每个数字占据20*20个像素点,可以进行切分

2、划分出训练集和测试集

3、每个数据的像素点为20*20,将其全部变成一列1*400格式,转换成数值特征

4、最后使用KNN算法训练模型,使用测试集评估模型的性能

3、方法:

  1. 数据准备: 描述如何获取和准备"digits.png"图片数据。
  2. 图像预处理: 包括图像读取、灰度转换和图像分割。
  3. 数据集划分: 说明如何将图像分割后的小块划分为训练集和测试集。
  4. 特征提取: 描述如何将图像数据转换为适合KNN算法处理的数值特征。
  5. 模型训练: 详细说明如何使用KNN算法训练模型,包括参数设置和训练过程。
  6. 模型评估: 描述如何使用测试集评估模型的性能,包括准确率的计算方法。
  7. 数据检测:输入数据进行判断。
import cv2
import numpy as np#导入库
#数据准备
img=cv2.imread("digits.png")#cv2读取文件#图像预处理
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将读取的文件变成灰度图
splited=[np.hsplit(i,100) for i in np.vsplit(gray,50)]#将该图切成50行100列#数据集划分
x=np.array(splited)#将切好后的数据以数组的形式保存
train=x[:,:50]#前面50列定义为训练集
test=x[:,50:100]#后面50列定义为测试集#特征提取
#每一个数据占据20*20的像素,将其转换成一列1*400格式重新塑形并转换为浮点数类型,以便用于K-近邻算法的输入。
train1=train.reshape(-1,400).astype(np.float32)
test1=test.reshape(-1,400).astype(np.float32)
#训练集中0-9,各有250个,是train1的结果,np.newaxis改变维度和上面训练集维度相同
train_result=np.repeat(np.arange(10),250)[:,np.newaxis]
test_result=np.repeat(np.arange(10),250)[:,np.newaxis]#模型训练
#创建K-近邻算法的实例
knn=cv2.ml.KNearest_create()
#将train1按照1*400的格式为特征,train_result为标签进行训练,cv2.ml.ROW_SAMPLE(将数据一行行输出)
knn.train(train1,cv2.ml.ROW_SAMPLE,train_result)
#将测试集带入,k近邻设置为3(建议为奇数,尽量避免出现相同的数量)
ret,result,neighbours,dist=knn.findNearest(test1,k=3)
#ret:检测操作成功
#result: 这是存储搜索结果。
#neighbours: 这将是一个列表,包含每个测试点的最近邻的索引。
#dist: 这将是一个列表,包含每个测试点到其最近邻的距离#模型评估
#比较测试结果和测试集结果
matches=result==test_result
#统计正确的数量
correct=np.count_nonzero(matches)
#求占比
accuracy=correct*100.0/result.size
print(accuracy)#数据检测
imgn=cv2.imread("p6.png")
grayn=cv2.cvtColor(imgn,cv2.COLOR_BGR2GRAY)
xn=np.array(grayn)
testn=xn.reshape(-1,400).astype(np.float32)
ret,resultn,neighbours,dist=knn.findNearest(testn,k=5)
print(resultn)

4、结果(使用knn进行效果不好,自己手写的准确率不高)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring Cloud全解析:配置中心之springCloudConfig配置存储
  • Linux系统-系统信息网络目录文件的相关命令
  • 微服务基础知识
  • 8.19Qt作业
  • C语言内存操作函数
  • 力扣第 411 场周赛题解
  • 西安旅游系统--论文pf
  • 每日快讯 | 京东健康:2024年上半年营收283亿元
  • vue+fastadmin跨域请求问题
  • 【Docker】宿主机上装个ES和使用docker装个ES有啥不一样
  • 【gitlab】gitlab-ce:17.3.0-ce.0 之2:配置
  • Windows 上使用 OpenSSL 生成一个 10 年有效期的自签名 PFX 证书
  • Spring Boot 3.3 【五】Spring Boot 整合JPA-原生SQL支持
  • 萝卜快跑和端到端的自动驾驶(1)
  • mysql 之 explain
  • 深入了解以太坊
  • @angular/forms 源码解析之双向绑定
  • [译] 怎样写一个基础的编译器
  • 【Amaple教程】5. 插件
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Golang-长连接-状态推送
  • JavaScript对象详解
  • JAVA并发编程--1.基础概念
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • win10下安装mysql5.7
  • Zsh 开发指南(第十四篇 文件读写)
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从0实现一个tiny react(三)生命周期
  • 基于Android乐音识别(2)
  • 前端攻城师
  • 深度学习中的信息论知识详解
  • 实现简单的正则表达式引擎
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微服务入门【系列视频课程】
  • 说说我为什么看好Spring Cloud Alibaba
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #微信小程序:微信小程序常见的配置传值
  • #预处理和函数的对比以及条件编译
  • (function(){})()的分步解析
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (TOJ2804)Even? Odd?
  • (二)Linux——Linux常用指令
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (含笔试题)深度解析数据在内存中的存储
  • (六)c52学习之旅-独立按键
  • (未解决)macOS matplotlib 中文是方框
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)甲方乙方——赵民谈找工作
  • ***利用Ms05002溢出找“肉鸡
  • .NET 8.0 中有哪些新的变化?
  • .NET成年了,然后呢?
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)