一、实践目标 
本项目在行空板上外接USB摄像头,通过摄像头来识别古诗词内容并显示对应的作者类别。 
 
二、知识目标 
1、学习使用MultinomialNB模型进行古诗词分类的方法。 
 
三、实践准备 
硬件清单: 
软件使用:Mind+编程软件x1 
 
 
四、实践过程 
1、硬件搭建 
 
1、将摄像头接入行空板的USB接口。 
 
 
 
2、通过USB连接线将行空板连接到计算机。  
 
2、软件编写 第一步:打开Mind+,远程连接行空板  
 
第二步:在“行空板的文件”中新建一个名为AI的文件夹,在其中再新建一个名为“基于行空板的MultinomialNB古诗词分类”的文件夹,导入本节课的依赖文件。 
Tips:0-train.py是用来训练古诗词和对应作者的程序,可以在其中增加数据集,model.joblib是训练生成的模型,用于对古诗词进行分类,这里我们直接用即可。 
 
 
第三步:编写程序 在上述文件的同级目录下新建一个项目文件,并命名为“main.py”。 示例程序: 
			
			
			- #  -*- coding: UTF-8 -*-
 -  
 - # MindPlus
 - # Python
 - import sys
 - sys.path.append("/root/mindplus/.lib/thirdExtension/nick-pytesseract-thirdex")
 - # 导入所需模块
 - from pinpong.board import Board, Pin
 - import time
 - import cv2
 - import pytesseract
 - from PIL import Image, ImageFont, ImageDraw
 - import os
 - import numpy as np
 - from sklearn.feature_extraction.text import TfidfVectorizer
 - from sklearn.naive_bayes import MultinomialNB
 - from sklearn.pipeline import make_pipeline
 - from sklearn.model_selection import train_test_split
 - from joblib import dump, load
 -  
 - # 加载预训练的机器学习模型
 - model = load('model.joblib')
 -  
 - # 初始化开发板
 - Board().begin()
 -  
 - # 定义函数在图像上绘制中文文字
 - def drawChinese(text, x, y, size, r, g, b, a, img):
 -     font = ImageFont.truetype("HYQiHei_50S.ttf", size)
 -     img_pil = Image.fromarray(img)
 -     draw = ImageDraw.Draw(img_pil)
 -     draw.text((x, y), text, font=font, fill=(b, g, r, a))
 -     frame = np.array(img_pil)
 -     return frame
 -  
 - # 设置 Tesseract OCR 的路径
 - pytesseract.pytesseract.tesseract_cmd = r'/usr/bin/tesseract'
 -  
 - # 打开摄像头并设置参数
 - cap = cv2.VideoCapture(0)
 - cap.set(cv2.CAP_PROP_FRAME_WIDTH, 240)
 - cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 320)
 - cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
 - cv2.namedWindow('cvwindow', cv2.WND_PROP_FULLSCREEN)
 - cv2.setWindowProperty('cvwindow', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
 -  
 - # 等待摄像头打开
 - while not cap.isOpened():
 -     continue
 - print("start!")
 -  
 - # 初始化识别内容变量
 - ShiBieNaRong = ''
 - img_word1 = ''
 - img_word2 = ''
 -  
 - # 主循环
 - while True:
 -     # 读取摄像头图像
 -     cvimg_success, img_src = cap.read()
 -     cvimg_h, cvimg_w, cvimg_c = img_src.shape
 -     cvimg_w1 = cvimg_h * 240 // 320
 -     cvimg_x1 = (cvimg_w - cvimg_w1) // 2
 -     img_src = img_src[:, cvimg_x1:cvimg_x1 + cvimg_w1]
 -     img_src = cv2.resize(img_src, (240, 320))
 -     cv2.imshow('cvwindow', img_src)
 -  
 -     # 检测按键输入
 -     key = cv2.waitKey(5)
 -     if key & 0xFF == ord('b'):  # 按下 "b" 键退出程序
 -         print("退出视频")
 -         break
 -     elif key & 0xFF == ord('a'):  # 按下 "a" 键进行文本识别和分类
 -         ShiBieNaRong = []
 -         try:
 -             if not os.path.exists("/root/image/pic/"):
 -                 print("The folder does not exist, created automatically")
 -                 os.system("mkdir -p /root/image/pic/")
 -         except IOError:
 -             print("IOError, created automatically")
 -             break
 -         # 保存图像
 -         cv2.imwrite("/root/image/pic/image.png", img_src)
 -         time.sleep(0.2)
 -         img = Image.open('/root/image/pic/image.png')
 -         # 使用 Tesseract 进行文本识别
 -         ShiBieNaRong = pytesseract.image_to_string(img, lang='chi_sim')
 -         print(ShiBieNaRong)
 -         # 使用机器学习模型进行分类预测
 -         probs = model.predict_proba([ShiBieNaRong])
 -         predicted_index = probs[0].argmax()
 -         predicted_label = model.classes_[predicted_index]
 -         confidence = probs[0][predicted_index]
 -         print(f'预测结果:{predicted_label},置信度:{confidence}')
 -  
 -     # 在图像上绘制识别到的文本
 -     img_src = drawChinese(text=str(ShiBieNaRong), x=10, y=20, size=25, r=50, g=200, b=0, a=0, img=img_src)
 -     cv2.imshow('cvwindow', img_src)
 -  
 - # 释放摄像头并关闭窗口
 - cap.release()
 - cv2.destroyAllWindows()
 
  复制代码
  
3、运行调试 
第一步:运行主程序 
运行“main.py”程序,可以看到初始时屏幕上显示着摄像头拍摄到的实时画面,将摄像头画面对准古诗词,如这里为“红掌拨清波”,然后按下板载按键a,将此帧图像拍摄保存,之后自动识别图像上的文字,在Mind+软件终端,我们可以看到识别到的中文结果以及模型预测的该古诗词的作者。 
 
 
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. 多类别支持: 
· 支持多类别分类任务,可以处理多个类别的分类问题。 
 
 
 
 |