KNN 图像识别

news2024/9/21 17:51:08

KNN(K-Nearest Neighbors,K最近邻)算法是一种简单而有效的分类算法,也可以用于图像识别。它的基本思想是通过计算样本之间的距离,将待分类的样本归为其在训练集中最相近的K个样本所属的类别中最常见的类别

1. 准备工作

2. 图像预处理

3. 数据处理与分割

4. 标签准备

5. 训练与测试KNN模型

6.检验测试结果:

7.我们可以输入自己的一些例子再来测试训练的如何。


1. 准备工作

首先,我们需要一个图像数据集。

以此图像为例

该图像应当包含一个50x100的网格,每个单元格中包含一个手写数字(0-9),所以总共有5000个数字样本如何将数据样本提取出来呢。

2. 图像预处理

我们将图像加载为灰度图像并进行分割:

import numpy as np
import cv2

img = cv2.imread('图片位置')#读取图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #图像灰度化

cells = [np.hsplit(row, 100) for row in np.vsplit(gray, 50)]
# 将图像分割成50x100的网格


我们使用np.vsplit将图像按行分割成50个部分,然后对每个部分使用np.hsplit按列分割成100个单元格。这样,我们得到了一个包含5000个单元格的数组,每个单元格中包含一个手写数字的图像。在调试过程中可以看到已经分割成功

我们可以查看是如何保存的

3. 数据处理与分割

接下来,我们将图像数据整理成训练和测试数据:

x = np.array(cells)
train = x[:, :50]
test = x[:, 50:100]

# 将图像数据展平以适应KNN输入
train_new = train.reshape(-1, 400).astype(np.float32)
test_new = test.reshape(-1, 400).astype(np.float32)

这里,我们将每个数字图像展平成一个400维的向量(20x20的图像)。这些展平的向量作为KNN算法的输入特征

4. 标签准备

我们需要准备训练和测试标签,以便模型可以学习和评估:

k = np.arange(10)
labels = np.repeat(k, 250)
train_labels = labels[:, np.newaxis]
test_labels = np.repeat(k, 250)[:, np.newaxis]

在这里,np.repeat(k, 250)生成了每个数字(0-9)出现250次的标签数组。每个训练和测试样本都有对应的标签。

5. 训练与测试KNN模型

我们使用OpenCV的KNN算法来训练和测试我们的模型:

knn = cv2.ml.KNearest_create()#创建训练
knn.train(train_new, cv2.ml.ROW_SAMPLE, train_labels)#进行训练
ret, result, neighbours, dist = knn.findNearest(test_new, k=5)#设置k值

在这段代码中,我们创建了一个KNN模型,并用训练数据进行训练。之后,使用findNearest方法来对测试数据进行预测

6.检验测试结果:
print(result2)
matches = result == test_labels
correct = np.count_nonzero(matches)
accuracy = correct * 100.0 / result.size
print(accuracy)

通过对比预测结果与实际标签,我们可以计算模型的准确率。准确率表示模型正确分类的测试样本占总测试样本的比例

7.我们可以输入自己的一些例子再来测试训练的如何。

我们输入的图片格式要和训练数据的图片大小相同

img2 = cv2.imread('你的图片位置')#读取图片
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)#图像灰度化

x2 = np.array(gray2)#只输入一个数据,所以可以直接处理
test2 =x2[:,:]
test2_new = test2.reshape(-1,400).astype(np.float32)



ret2, result2, neighbours2, dist2 = knn.findNearest(test2_new, k=5)#设置k值进行预测
print(result2)#输出结果

全代码

import numpy as np
import cv2

img = cv2.imread('图片位置')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img2 = cv2.imread('你的图片位置')
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

cells = [np.hsplit(row, 100) for row in np.vsplit(gray, 50)]


x = np.array(cells)
x2 = np.array(gray2)

train = x[:, :50]
test = x[:, 50:100]
test2 =x2[:,:]


train_new = train.reshape(-1, 400).astype(np.float32)
test_new = test.reshape(-1, 400).astype(np.float32)
test2_new = test2.reshape(-1,400).astype(np.float32)

k = np.arange(10)
labels = np.repeat(k, 250)

train_labels = labels[:, np.newaxis]
test_labels = np.repeat(k, 250)[:, np.newaxis]

knn = cv2.ml.KNearest_create()
knn.train(train_new, cv2.ml.ROW_SAMPLE, train_labels)
ret, result, neighbours, dist = knn.findNearest(test_new, k=5)
ret2, result2, neighbours2, dist2 = knn.findNearest(test2_new, k=11)



print(result2)
matches = result == test_labels
correct = np.count_nonzero(matches)
accuracy = correct * 100.0 / result.size
print(accuracy)

我们可以设置不同的k值来是预测结果更加精确

总结

通过以上步骤,我们使用OpenCV和KNN算法实现了一个简单的手写数字识别系统。尽管这个示例相对简单,但它展示了如何从数据预处理、模型训练到性能评估的完整流程。在实际应用中,我们可以进一步优化模型,尝试更多先进的算法,或使用更复杂的数据集以提升性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里巴巴25校招内推

内推投递链接: http://aidc-jobs.alibaba.com/campus/qrcode/home?codeMx8ppk_s4MjkOFnb6XS3Vw%3D%3D 流程安排 简历投递(网申、内推) 8.16开启笔试:集中笔试为8月-10月面试:启动后持续推进offer发放:启动后持续推进 内推二维…

FPGA 综合笔记

仿真时阻塞赋值和非阻塞赋值 Use of Non-Blocking Assignment in Testbench : Verilog Use of Non-Blocking Assignment in Testbench : Verilog - Stack Overflow non-blocking assignment does not work as expected in Verilog non-blocking assignment does not work a…

华为APP审核,权限说明弹窗

工具类 import android.app.Activity; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.PopupWindow; import android.widget.TextV…

OD C卷 - 建立Huffman树

生成Huffman树 (100) 给定一个数值数组weights&#xff0c;每个值代表二叉树叶子节点的权值&#xff08;>1&#xff09;;根据权值数组&#xff0c;生成哈夫曼树&#xff0c;并中序遍历输出&#xff1b;左节点权值< 右节点权值&#xff0c;根节点权值为左右节点权值之和&…

git提交规范检查husky

一、Eslint 尤雨溪推荐的 prettierrc 配置&#xff0c;句尾不带分号 单引号。 尤雨溪推荐配置&#xff1a;vue-next/.prettierrc lint lint 是最著名的 C 语言工具之一&#xff0c;是由贝尔实验室 SteveJohnson 于 1979 在 PCC(PortableC Compiler) 基础上开发的静态代码分…

自己搭建远程桌面服务器-RustDesk 极简版

linux搭建RustDesk保姆间教程_rustdesk linux-CSDN博客https://blog.csdn.net/yzs2022/article/details/135136491 背景 在某公司工作&#xff0c;向日葵等远程办公软件均已屏蔽&#xff0c;无法使用&#xff08;也没有明文规定不允许使用远程控制软件&#xff09;&#xff0c…

2024批量下载知乎回答/文章/想法/专栏/视频/收藏夹,导出excel和pdf

之前分享过文章2024 批量下载知乎回答/文章/想法/专栏导出excel和pdf&#xff0c;再次更新&#xff0c;2024 批量下载知乎回答/文章/想法/专栏/视频导出 excel 和 pdf&#xff0c;今天再加上知乎收藏夹批量下载。 下载所有知乎回答以渤海小吏的号为例 https://www.zhihu.com/p…

关于SQLModel库的一些封装思路和实战,fastzdp_sqlmodel库封装过程中的一些笔记,20240817

概述 最近在对SQLModel做一些封装&#xff0c;本篇文章主要记录封装过程中的一些思路和实战代码。 实现or查询 原本的代码 from typing import Optional from sqlmodel import Field, SQLModel, create_engine, Session, select, or_class Hero(SQLModel, tableTrue):id: O…

【笔记】PUML语法使用

Sequence 时序图 类型&#xff1a;participant 1、排序 order participant NAME order NUMBER 默认是按出现定义的先后顺序排列&#xff0c;如下图。 【Sequence】未定义order的效果图 可以通过自定义改变&#xff0c;使用order关键字&#xff0c;将按ABC进行排序。 partici…

20 以太网帧格式及命名方法

以太网帧格式及命名方法 一、以太网帧格式及命名方法 &#xff08;一&#xff09;帧格式及命名标准 1.以太网帧格式 ​ 802.3 以太网帧格式 ​ 以太网帧数据的长度46-1500 ​ 以太网帧的长度64-1518 ​ 帧校验序列&#xff08;FCS&#xff09;&#xff1a;从目的地址开始…

Binance 如何使用 Quickwit 构建 100PB 日志服务(Quickwit 博客)

三年前&#xff0c;我们开源了 Quickwit&#xff0c;一个面向大规模数据集的分布式搜索引擎。我们的目标很宏大&#xff1a;创建一种全新的全文搜索引擎&#xff0c;其成本效率比 Elasticsearch 高十倍&#xff0c;配置和管理显著更简单&#xff0c;并且能够扩展到 PB 级别的数…

【无标题】乐天HIQ壁挂炉使用

这里写自定义目录标题 1.按键①&#xff1a; 按一下&#xff0c;小液晶显示的温度是所设定的供暖温度&#xff1b; 按二下&#xff0c;小液晶显示的温度是所设定的生活热水温度&#xff1b; 按三下&#xff0c;小液晶显示的温度是所设定的室内温度&#xff1b; 如果忘记按几下的…

HCIE冲刺-----------论述解析

X园区 1.防火墙放行OSPF 2.trunk口阻塞vlan1 3.关闭VPN防环 4.ospf不通检查NSSA区域配置 5.重定向可以在三层口或二层口配置 6.vlan60在ospf的相关配置 Z园区 1.mpls不通检查lo0口配置 2.isis不通检查接口IP与lldp连接 3.确认同级RR还是备份RR 4.确认策略矩阵的访问 python 1…

测试架构师要正直诚实而非率真

目录 正直诚实的重要性 为何需要正直诚实而非仅是率真 如何实践 正直不得罪人的方式 这里是一些关键的问题&#xff0c;在你感觉要“绝对诚实”地表达时考虑 率真这里有若干问题要考虑&#xff1a; 测试架构师作为软件开发团队中的关键角色之一&#xff0c;需要具备多种专…

Python编码系列—Python SQL与NoSQL数据库交互:深入探索与实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

极狐GitLab 多行命令的 CI 日志管理体验的改进

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

Python中15个递归函数经典案例解析

文末赠免费精品编程资料~~ 递归是Python编程中一个强大的工具&#xff0c;它允许函数调用自身以解决复杂问题。在本文中&#xff0c;我们将探索15个递归函数的经典案例&#xff0c;从基础到进阶&#xff0c;帮助你理解和掌握递归编程。 1. 阶乘计算 阶乘是一个常见的递归应用…

CSP-CCF 202109-1 数组推导

一、问题描述 二、解答 初版&#xff1a; 只得了60分 #include<iostream> using namespace std; int main() {int n;cin >> n;int B[101] { 0 };int sum_max 0;int sum_min0;//以防错误“使用未初始化的局部变量”&#xff0c;建议所有变量都要初始化&#xf…

2024 Google 开发者大会,沉浸式体验AI社会公益

文章目录 一、现场打卡二、AI 社会公益三、Gemma 模型四、Gemini 模型五、Google Cloud六、现场体验七、带着问题逛展八、学习资源和活动九、结束 Happy Hour 一、现场打卡 大家好&#xff0c;我是小雨。 2024 Google 开发者大会&#xff0c;沉浸式体验AI社会公益 今天我们参加…