32841浏览
查看: 32841|回复: 1

基于行空板的MultinomialNB古诗词分类

[复制链接]
一、实践目标
本项目在行空板上外接USB摄像头,通过摄像头来识别古诗词内容并显示对应的作者类别。

二、知识目标
1、学习使用MultinomialNB模型进行古诗词分类的方法。

三、实践准备
硬件清单:
基于行空板的MultinomialNB古诗词分类图5
软件使用:Mind+编程软件x1


四、实践过程
1、硬件搭建

1、将摄像头接入行空板的USB接口。


基于行空板的MultinomialNB古诗词分类图4

2、通过USB连接线将行空板连接到计算机。

基于行空板的MultinomialNB古诗词分类图3

2、软件编写
第一步:打开Mind+,远程连接行空板

基于行空板的MultinomialNB古诗词分类图1

第二步:在“行空板的文件”中新建一个名为AI的文件夹,在其中再新建一个名为“基于行空板的MultinomialNB古诗词分类”的文件夹,导入本节课的依赖文件。
Tips:0-train.py是用来训练古诗词和对应作者的程序,可以在其中增加数据集,model.joblib是训练生成的模型,用于对古诗词进行分类,这里我们直接用即可。

基于行空板的MultinomialNB古诗词分类图2

第三步:编写程序
在上述文件的同级目录下新建一个项目文件,并命名为“main.py”。
示例程序:
  1. #  -*- coding: UTF-8 -*-
  2. # MindPlus
  3. # Python
  4. import sys
  5. sys.path.append("/root/mindplus/.lib/thirdExtension/nick-pytesseract-thirdex")
  6. # 导入所需模块
  7. from pinpong.board import Board, Pin
  8. import time
  9. import cv2
  10. import pytesseract
  11. from PIL import Image, ImageFont, ImageDraw
  12. import os
  13. import numpy as np
  14. from sklearn.feature_extraction.text import TfidfVectorizer
  15. from sklearn.naive_bayes import MultinomialNB
  16. from sklearn.pipeline import make_pipeline
  17. from sklearn.model_selection import train_test_split
  18. from joblib import dump, load
  19. # 加载预训练的机器学习模型
  20. model = load('model.joblib')
  21. # 初始化开发板
  22. Board().begin()
  23. # 定义函数在图像上绘制中文文字
  24. def drawChinese(text, x, y, size, r, g, b, a, img):
  25.     font = ImageFont.truetype("HYQiHei_50S.ttf", size)
  26.     img_pil = Image.fromarray(img)
  27.     draw = ImageDraw.Draw(img_pil)
  28.     draw.text((x, y), text, font=font, fill=(b, g, r, a))
  29.     frame = np.array(img_pil)
  30.     return frame
  31. # 设置 Tesseract OCR 的路径
  32. pytesseract.pytesseract.tesseract_cmd = r'/usr/bin/tesseract'
  33. # 打开摄像头并设置参数
  34. cap = cv2.VideoCapture(0)
  35. cap.set(cv2.CAP_PROP_FRAME_WIDTH, 240)
  36. cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 320)
  37. cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
  38. cv2.namedWindow('cvwindow', cv2.WND_PROP_FULLSCREEN)
  39. cv2.setWindowProperty('cvwindow', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
  40. # 等待摄像头打开
  41. while not cap.isOpened():
  42.     continue
  43. print("start!")
  44. # 初始化识别内容变量
  45. ShiBieNaRong = ''
  46. img_word1 = ''
  47. img_word2 = ''
  48. # 主循环
  49. while True:
  50.     # 读取摄像头图像
  51.     cvimg_success, img_src = cap.read()
  52.     cvimg_h, cvimg_w, cvimg_c = img_src.shape
  53.     cvimg_w1 = cvimg_h * 240 // 320
  54.     cvimg_x1 = (cvimg_w - cvimg_w1) // 2
  55.     img_src = img_src[:, cvimg_x1:cvimg_x1 + cvimg_w1]
  56.     img_src = cv2.resize(img_src, (240, 320))
  57.     cv2.imshow('cvwindow', img_src)
  58.     # 检测按键输入
  59.     key = cv2.waitKey(5)
  60.     if key & 0xFF == ord('b'):  # 按下 "b" 键退出程序
  61.         print("退出视频")
  62.         break
  63.     elif key & 0xFF == ord('a'):  # 按下 "a" 键进行文本识别和分类
  64.         ShiBieNaRong = []
  65.         try:
  66.             if not os.path.exists("/root/image/pic/"):
  67.                 print("The folder does not exist, created automatically")
  68.                 os.system("mkdir -p /root/image/pic/")
  69.         except IOError:
  70.             print("IOError, created automatically")
  71.             break
  72.         # 保存图像
  73.         cv2.imwrite("/root/image/pic/image.png", img_src)
  74.         time.sleep(0.2)
  75.         img = Image.open('/root/image/pic/image.png')
  76.         # 使用 Tesseract 进行文本识别
  77.         ShiBieNaRong = pytesseract.image_to_string(img, lang='chi_sim')
  78.         print(ShiBieNaRong)
  79.         # 使用机器学习模型进行分类预测
  80.         probs = model.predict_proba([ShiBieNaRong])
  81.         predicted_index = probs[0].argmax()
  82.         predicted_label = model.classes_[predicted_index]
  83.         confidence = probs[0][predicted_index]
  84.         print(f'预测结果:{predicted_label},置信度:{confidence}')
  85.     # 在图像上绘制识别到的文本
  86.     img_src = drawChinese(text=str(ShiBieNaRong), x=10, y=20, size=25, r=50, g=200, b=0, a=0, img=img_src)
  87.     cv2.imshow('cvwindow', img_src)
  88. # 释放摄像头并关闭窗口
  89. cap.release()
  90. cv2.destroyAllWindows()
复制代码

3、运行调试
第一步:运行主程序
运行“main.py”程序,可以看到初始时屏幕上显示着摄像头拍摄到的实时画面,将摄像头画面对准古诗词,如这里为“红掌拨清波”,然后按下板载按键a,将此帧图像拍摄保存,之后自动识别图像上的文字,在Mind+软件终端,我们可以看到识别到的中文结果以及模型预测的该古诗词的作者。

基于行空板的MultinomialNB古诗词分类图6

Tips:如果预测结果不准确,可以自行调整“0-train.py”中的数据集,训练模型。

4、程序解析
这段程序通过使用 OpenCV 库调用摄像头,实时从摄像头读取图像,然后使用 Tesseract 进行 OCR(光学字符识别)识别,并将结果显示在图像上。识别出的文本还会通过一个预训练的 MultinomialNB 模型进行分类,并显示预测结果和置信度。具体流程如下:
① 初始化:
· 导入所需的库和模块。
· 初始化 UNIHIKER 开发板。
· 设置 Tesseract OCR 的路径。
· 打开摄像头并设置分辨率和缓冲区大小。
· 创建一个全屏窗口用于显示图像。

② 定义函数:
· 定义 drawChinese 函数,用于在图像上绘制中文字符。

③ 加载模型:
· 使用 joblib 加载预训练的 MultinomialNB 模型。

④ 主循环:
· 进入无限循环,从摄像头读取图像。
· 检测按键输入:
· 如果按下 'b' 键,退出程序。
· 如果按下 'a' 键,捕获当前图像并保存到指定路径。
· 使用 Tesseract 进行 OCR 识别,提取图像中的文本。
· 使用预训练的 MultinomialNB 模型对提取的文本进行分类预测,输出预测结果和置信度。
· 在图像上绘制识别到的文本,并在窗口中显示处理后的图像。

⑤ 结束:
· 释放摄像头设备,并关闭所有 OpenCV 窗口。

五、知识园地
1. 了解MultinomialNB模型
MultinomialNB 是一个用于文本分类的机器学习模型,属于 scikit-learn 库中的一部分。它是多项式朴素贝叶斯(Multinomial Naive Bayes)分类器的实现。下面是对 MultinomialNB 的详细介绍:

概述
· 定义:MultinomialNB 是朴素贝叶斯分类器的一种,专门用于离散型特征(通常是单词计数或词频等文本数据)。
· 朴素贝叶斯模型:基于贝叶斯定理的一种简单但功能强大的概率分类器,假设特征之间是条件独立的。
· 多项式模型:适用于特征表示为多项式分布的场景,通常用于文本分类任务,如垃圾邮件检测和文档分类。

特点
· 简单有效:模型简单,计算效率高,适合大规模数据集。
· 文本分类:在自然语言处理(NLP)领域,尤其是文本分类任务中表现出色。
· 概率输出:可以输出每个类别的预测概率,帮助理解模型的信心度。

主要功能
1. 文本分类:
· 适合分类离散型特征,特别是词频或词袋模型(Bag-of-Words)表示的文本数据。
· 利用词频统计和类别条件概率进行分类预测。

2. 多类别支持:
· 支持多类别分类任务,可以处理多个类别的分类问题。



Project.zip

7.29 KB, 下载次数: 399

easy猿  初级技师

发表于 2024-8-29 15:14:49

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail