【人工智能Ⅰ】实验5:AI实验箱应用之贝叶斯

实验5 AI实验箱应用之贝叶斯

一、实验目的

1. 用实验箱的摄像头拍摄方块上数字的图片,在图像处理的基础上,应用贝叶斯方法识别图像中的数字并进行分类。

二、实验内容和步骤

1. 应用实验箱机械手臂上的摄像头拍摄图像;

2. Opencv处理图像;

3. 用贝叶斯方法识别处理后图像中的数字;

4. 驱动机械臂移动识别出的数字方块。

三、实验结果和分析

1. 对给出程序的主要模块添加注释,并运行完成实验步骤

程序主要模块的注释

(1)bayes_classify_movethings\img_rec\bayes_classfier.py

import numpy as np      # 导入numpy库,用于数学运算

import cv2              # 导入opencv库,用于图像处理

# 图像二值化函数

def imgBinaryzation(imgs):

    global cv_img                           # 定义全局变量cv_img

    for i in range(len(imgs)):              # 遍历图像数组

        cv_img = imgs[i].astype(np.uint8)   # 将图像转换为uint8类型    

        cv2.threshold(cv_img, 50, 1, cv2.THRESH_BINARY_INV, cv_img) # 应用阈值操作进行图像二值化

        imgs[i] = cv_img                    # 更新原图像数组

        print(cv_img.reshape(28, 28))       # 打印变换后的图像

    return imgs                             # 返回二值化后的图像数组

# 训练贝叶斯分类器函数

def train(imgs, labels, classNum, featureNum, valueZone):

    priPro = np.zeros(classNum)             # 初始化先验概率数组

    condPro = np.zeros((classNum, featureNum, valueZone))  # 初始化条件概率数组

    # 计算先验概率和条件概率

    for i in range(len(labels)):            # 遍历所有标签

        img = imgs[i]                       # 获取对应的图像

        label = labels[i][0]                # 获取图像对应的标签

        priPro[label] += 1                  # 更新先验概率

       

        for j in range(featureNum):         # 遍历所有特征

            condPro[label][j][img[j]] += 1  # 更新条件概率

    # 对条件概率进行平滑处理

    for i in range(classNum):               # 遍历所有类别

        for j in range(featureNum):         # 遍历所有特征

            total = 0                       # 初始化特定特征的总计数

            for k in range(valueZone):      # 遍历所有可能的特征值

                total += condPro[i][j][k]   # 累加特定类别和特征下的特征值计数

            for k in range(valueZone):      # 再次遍历所有可能的特征值

                # 计算平滑后的条件概率

                pro_k = (float(condPro[i][j][k]) / float(total)) * 100000 + 1

                condPro[i][j][k] = pro_k    # 更新条件概率数组

    return priPro, condPro                  # 返回先验概率和条件概率

# 计算特定图像和标签的概率

def cal_pro(img, label, priPro, condPro):

    pro = int(priPro[label])                # 获取先验概率

    print("len(img): ", len(img))

    for i in range(len(img)):               # 遍历图像的每个特征

        pro *= int(condPro[label][i][img[i]])  # 计算最终概率

    return pro  # 返回概率

# 分类器准确率计算函数

def classfier_acc(imgs, priPro, condPro, classNum):

    pred = []                               # 初始化预测结果列表

    for img in imgs:                        # 遍历所有图像

        predLabel = -1                      # 初始化预测标签

        maxPro = -1                         # 初始化最大概率

        for i in range(classNum):           # 遍历所有类别

            pro = cal_pro(img, i, priPro, condPro)  # 计算概率

            if maxPro < pro:                # 如果找到更大的概率

                maxPro = pro                # 更新最大概率

                predLabel = i               # 更新预测标签

        pred.append(predLabel)              # 将预测标签加入结果列表

    print("pred: ", pred)

    return pred                             # 返回预测结果

# 单个图像分类函数

def classfier(img, priPro, condPro, classNum):

    pred = []                               # 初始化预测结果列表

    predLabel = -1                          # 初始化预测标签

    maxPro = -1                             # 初始化最大概率

    for i in range(classNum):               # 遍历所有类别

        pro = cal_pro(img, i, priPro, condPro)  # 计算概率

        if maxPro < pro:                    # 如果找到更大的概率

            maxPro = pro                    # 更新最大概率

            predLabel = i                   # 更新预测标签

    pred.append(predLabel)                  # 将预测标签加入结果列表

    print("pred: ", pred)

    return pred                             # 返回预测结果

# 准确率计算函数

def accuracyRate(pred, labels):

    count = 0                               # 初始化计数器

    for i in range(len(pred)):              # 遍历所有预测结果

        if pred[i] == int(labels[i][0]):    # 如果预测结果与实际标签相同

            count += 1                      # 增加计数器

    acRate = float(count) / float(len(pred))  # 计算准确率

    return acRate                           # 返回准确率

(2)bayes_classify_movethings\main.py

    import threading

import cv2

from img_rec import img_rec

from robotic_arm.my_serial import MySerial

# 单片机功能选择

SINGLE_CHIP_FUNCTION_DATA = "3001070155a1ff"

# 控制机械臂位置

CONTROL_ROBOTIC_ARM_POSITION_DATA = "3001070155a11131"

# 控制机械臂抓取

CONTROL_ROBOTIC_ARM_GRAB_DATA = "3002070155a131"

vs = cv2.VideoCapture(0)

image_processing = img_rec.ImageProcessing()

# 创建串口对象

my_serial = MySerial('/dev/ttyS4', baudrate=115200, timeout=1)

# 创建串口接收远程

t_serial = threading.Thread(target=my_serial.receive_msg)

t_serial.start()

current_state = 0       # 当前状态

next_state = 0          # 下一个状态

is_grab = True          # 判断是否抓取(初始是false),进行搬运需要改为true

source_location = 0     # 最终搬运的源位置

# my_serial.send_msg(SINGLE_CHIP_FUNCTION_DATA + "31")

while True:

    current_state = next_state

    if current_state == 0:

        my_serial.send_msg(CONTROL_ROBOTIC_ARM_POSITION_DATA)

        print("控制机械臂移动。")

        next_state = 1

    elif current_state == 1:

        if my_serial.recv_msg[12:16] == "2131":

            print("机械臂已到达仓库1")

            next_state = 2

            my_serial.recv_msg = ""

    elif current_state == 2:

        print("开始拍摄照片。")

        for i in range(30):

            ret, frame = vs.read()

        cv2.imwrite("./pic.jpg", frame)

        # cv2.imshow("frame", frame)

        # cv2.waitKey(0)

        print("拍摄照片完成,照片保存在当前目录下的pic.jpg,开始识别。")

        image_thresh, cargo_location = image_processing.image_position(frame)

        cargo_location_sort = image_processing.image_sort(cargo_location)

        rec_result = image_processing.image_recognize(cargo_location, cargo_location_sort, frame)

        print("识别结束,结果为{}".format(rec_result))

        if is_grab and rec_result != {}:

            # sorted 可以对所有可迭代的对象进行排序操作。

            # sorted(iterable, key=None, reverse=False)

            # iterable -- 可迭代对象。

            # key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

            # reverse -- 排序规则,reverse = True 降序 reverse = False 升序(默认)。

            # 返回值 -- 返回重新排序的列表。

            list_sort = sorted(rec_result.items(), key=lambda kv: (kv[1], kv[0]), reverse=False)

            print("排序结束,结果为{}".format(list_sort))

            source_location = list_sort[0][0] + 1

            next_state = 3

        else:

            break

    elif current_state == 3:

        my_serial.send_msg(CONTROL_ROBOTIC_ARM_GRAB_DATA + "1{}21".format(source_location))

        next_state = 4

    elif current_state == 4:

        if my_serial.recv_msg[12:16] == "4131":

            print("机械臂已搬运完毕。")

            break

        break

    else:

        break

my_serial.THREAD_CONTROL = False

2. 描述整个执行过程

实验步骤操作内容

(1)应用实验箱机械手臂上的摄像头拍摄图像

    执行该操作时,程序会把摄像头拍摄的图像存入根目录下,并命名为pic.jpg图像。pic.jpg图像示例如下图所示:

(2)Opencv处理图像

    执行该操作时,程序会利用pic.jpg图像进行图像定位(将黄色色块从整个图像中取出)、图像排序(将数字图像的位置进行排序)。

(3)用贝叶斯方法识别处理后图像中的数字

执行该操作时,程序会利用pic.jpg图像进行图像识别(对各个位置处的数 字进行分类)。分类结果会在实验箱终端进行显示,如下图所示:

(4)驱动机械臂移动识别出的数字方块

执行该操作时,程序会将识别出的4个数字分类结果进行排序,并搬运其中的最值数字方块。机械臂移动过程如下图所示:

3. 测试不同数字块,得出本次实验中数字识别的准确率

(1)每个数字的测试

待测数字方块

1

2

3

4

5

6

7

8

9

程序识别结果

1

2

3

9

3

9

1

3

9

上表中,蓝色部分为识别准确的数字,橘色部分为识别错误的数字。

因此,本次实验中数字识别的大致准确率为:4 / 9 = 44.4%

(2)一组方块的测试

测试序号

4个方块的内容

预测的4个结果

预测准确率

1

4513

9313

50%

2

4913

9913

75%

3

6193

6193

100%

4

6513

5313

50%

5

7513

1313

50%

6

8513

3313

50%

7

9913

4913

75%

我们在实验的过程中均录制了视频,但是由于视频文件过大,无法全部发送到平台,因此此处只给出测试7的视频结果。

4. 分析准确率不高的原因,给出提高准确率的可能方法

准确率低的原因

(1)光线因素

我们在测试实验箱自带的识别应用软件中发现,在二值化图形的情况下,有些数字方块由于光线太强直接显示为白色,有些数字方块由于光线太弱直接显示为黑色。切换到RGB图形的情况时,发现光线也存在类似的情况,大致对应二值化图形情况下的内容。多次实验后,我们发现光线的强弱的确会影响识别的准确率。

(2)测试集因素

Bayes识别存在识别错误的情况可能由以下因素导致的:数字6和数字9存在中心对称的情况;数字4和数字9的拓扑结构类似,均包含一个封闭图案和半封闭图案;数字5和数字3的拓扑结构类似;数字7和数字1的拓扑结构类似;数字8的一半可以作为数字3。

(3)特征的独立性假设难以达到

    朴素贝叶斯分类器基于特征之间相互独立的假设。然而,在图像数据中,像素之间通常是高度相关的。例如,在数字图像中,相邻像素往往有相关性,这违背了朴素贝叶斯的独立性假设。

(4)训练集因素

首先,如果训练数据不足或缺乏多样性,例如数字样式的差异,模型可能无法泛化到新样本。其次,在训练数据中某些数字出现得更频繁,导致模型对这些数字的识别效果更好,即存在类别不平衡。

提高准确率的可能方法

(1)均匀打光,保证每个数字方块处于同一个光照强度下。

(2)增加更多样化的训练数据,或者使用数据增强技术(如旋转、缩放、平移图像)来增加样本的多样性。

(3)使用类别平衡技术,如过采样少数类或欠采样多数类,以确保每个类别都有相似的表示。

(4)优化平滑参数,通过交叉验证来找到更优的平滑系数。

(5)改进特征提取和预处理步骤。使用更复杂的图像处理技术,如直方图均衡化、边缘检测或降维技术(如PCA),有助于提取更有意义的特征。

五、附录

1:操作系统互相连接的实验步骤

2:实验箱可使用的应用

(1)打开桌面上的“综合测试”,体验仓库货物识别及搬运功能。

(2)打开桌面上的“图像识别”,体验动物、水果、蔬菜等类别的识别。

3:WIFI连接注意事项

WIFI连接FSAIarm(屏幕右上角)。如果已经显示连接上,但仍然转圈,则点击disconnect,再重新连接自己的热点。M3配置wifi的灯一直闪烁,直到配置成功(灯处于长亮)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Wish防关联是什么?Wish要怎样避免违规封店?

四大跨境电商平台之一wish&#xff0c;做跨境电商的很多人可能都听过wish。随着wish不断完善平台制度&#xff0c;对于多账号运营的卖家要求越来越严厉&#xff0c;wish和亚马逊、eBay等其它跨境电商平台一样&#xff0c;不支持一个卖家开设多个账号多家店铺。 但是对于各位卖家…

2023/11/24JAVAweb学习(Vue常用指令,Vue.js文件,Ajax,Axios两种请求,Vue-cli脚手架,Vue项目,Element)

age只会执行成立的,show其实都展示了,通过display不展示 使用Vue,必须引入Vue.js文件 假如运行报错,以管理员身份打开vscode,再运行 ------------------------------------------------------------------- 更改端口号

2023/11/30JAVAweb学习

数组json形式 想切换实现类,只需要只在你需要的类上添加 Component 如果在同一层,可以更改扫描范围,但是不推荐这种方法 注入时存在多个同类型bean解决方式

C语言——多种方式打印出1000之内的所有的“水仙花数”

所谓水仙花数,是指一个3位数,其各位数字立方和等于该数本身。水仙花数是指一个三位数&#xff0c;它的每个位上的数字的立方和等于它本身。例如&#xff0c;153是一个水仙花数&#xff0c;因为1^3 5^3 3^3 153。 方法一 #define _CRT_SECURE_NO_WARNINGS 1#include <std…

制造业如何做生产设备管理、分析生产数据?

本文将为大家讲解&#xff1a;1、设备管理的现状与问题&#xff1b;2、设备管理系统功能&#xff1b;3、制造业企业如何做生产设备管理、分析生产数据&#xff1f;4、制造业设备管理的价值。 想要管理好设备&#xff0c;设备档案管理、巡检、报修、保养、分析预警等问题都是必须…

Python list列表添加元素的3种方法及删除元素的3种方法

Python list列表添加元素的3种方法 Python list 列表增加元素可调用列表的 append() 方法&#xff0c;该方法会把传入的参数追加到列表的最后面。 append() 方法既可接收单个值&#xff0c;也可接收元组、列表等&#xff0c;但该方法只是把元组、列表当成单个元素&#xff0c;这…

解决电脑蓝屏问题:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED,回到系统还原点

解决电脑蓝屏问题&#xff1a;SYSTEM_THREAD_EXCEPTION_NOT_HANDLED&#xff0c;回到系统还原点 1&#xff0c;蓝屏显示问题1.1&#xff0c;蓝屏1&#xff0c;清楚显示1.2&#xff0c;蓝屏2&#xff0c;模糊显示 2&#xff0c;排除故障问题3&#xff0c;解决蓝屏的有效方法 1&a…

本地事务和分布式事务

请直接看原文 原文链接:彻底搞清楚什么是分布式事务 - 知乎 (zhihu.com) -------------------------------------------------------------------------------------------------------------------------------- 1、什么是本地事务 多个sql操作,被同一个线程执行, 使用…

MedicalTransformer论文解读

论文是一个分割任务&#xff0c;但这里的方法不局限于分割&#xff0c;运用到检测、分类都可以。 论文下载 https://www.yuque.com/yuqueyonghupjh9oc/ovceh4/onilw42ux6e9n1ne?singleDoc# 《轴注意力机制》 一个问题 为什么transformer一开始都有CNN&#xff1a;降低H、W…

AWS EC2 如何 使用 SSM会话管理器登陆

首先只有特定版本的OS会默认附带SSM Agent。 预安装了 SSM Agent 的 Amazon Machine Images&#xff08;AMIs&#xff09; - AWS Systems Manager 其次EC的instance role必须有一个叫“AmazonSSMManagedInstanceCore”的策略 如何给IAM User赋权&#xff0c;让他们可以使用SSM…

教育企业CRM选择技巧

教育行业的发展一波三折&#xff0c;要想在激烈的赛道脱颖而出&#xff0c;就需要有一套有效的CRM系统&#xff0c;来帮助教育机构提升招生效率、增加学员留存、提高教学质量。下面说说&#xff0c;教育企业选择CRM系统要具备的四大功能。 1、招生管理功能 教育机构的首要目标…

Java的threadd常用方法

常用API 给当前线程命名 主线程 package com.itheima.d2;public class ThreadTest1 {public static void main(String[] args) {Thread t1 new MyThread("子线程1");//t1.setName("子线程1");t1.start();System.out.println(t1.getName());//获得子线程…

C 语言-数组

1. 数组 1.1 引入 需求&#xff1a;记录班级10个学员的成绩 需要定义10个变量存在的问题:变量名起名困难变量管理困难需求&#xff1a;记录班级1000个学员的成绩 1.2 概念 作用&#xff1a;容纳 数据类型相同 的多个数据的容器 。 特点&#xff1a; 长度不可变容纳 数据类型…

微服务--07--Seata 分布式事务

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 分布式事务1.认识Seata2.部署TC服务2.1.准备数据库表2.2.准备配置文件2.3.Docker部署 3.微服务集成Seata3.1.引入依赖3.2.改造配置3.3.添加数据库表3.4.测试 分布式…

【力扣:526】优美的排列

状态压缩动态规划 原理如下&#xff1a; 遍历位图可以得到所有组合序列&#xff0c;将这些序列的每一位看作一个数&#xff0c;取序列中1总量的值作为每轮遍历的位&#xff0c;此时对每个这样的位都能和所有数进行匹配&#xff0c;因为一开始就取的是全排列&#xff0c;并且我们…

聚类算法Sklearn实践

聚类算法是一种常用的无监督学习方法&#xff0c;用于将数据集划分为具有相似特征的组或簇。在实践中&#xff0c;为了方便快捷地应用聚类算法&#xff0c;可以使用Scikit-learn&#xff08;简称Sklearn&#xff09;这个强大的Python机器学习库。Sklearn提供了丰富的聚类算法实…

Python自动化测试面试经典题

相信大家经历过许多面试都会有这样的感受&#xff1a;好不容易通过了 2 -3轮技术面试&#xff0c;但是薪资不够理想&#xff1b;要么被面试的测试专家虐的不要不要的。但每一次的面试也能让自己认识到不足之处&#xff0c;这样才有利于后续拿到理想的offer。 牛鹭学院的学子对…

Python 进阶(十二):随机数(random 模块)

《Python入门核心技术》专栏总目录・点这里 文章目录 1. 导入random库2. 常用随机数函数2.1 生成随机浮点数2.2 生成随机整数2.3 从序列中随机选择2.4 随机打乱序列3. 设置随机数种子4. 应用实例4.1 游戏开发4.2 数据分析4.3 加密与安全4.4 模拟实验5. 总结大家好,我是水滴~~ …

自动驾驶DCLC 功能规范

目录 1 概述Summary....................................................................................................... 4 1.1 目的Purpose....................................................................................................... 4 1.2 范围Ran…

a-select:远程搜索——防抖节流处理——基础积累

a-select:远程搜索——防抖节流处理——基础积累 效果图下拉筛选数据&#xff1a;远程搜索功能&#xff1a; 效果图 下拉筛选数据&#xff1a; <a-selectshow-searchv-model"form.jobPositionCode"placeholder"请选择岗位"style"width: 100%"…