【共创季稿事节】「毕业季 · 鸿蒙同行」鸿蒙+AI毕业设计:手写公式识别与错题本应用
文章目录
-
- 每日一句正能量
- 一、选题背景:为什么“手写公式识别 + 错题本”适合作为鸿蒙毕业设计
- 二、项目目标:不只识别公式,更要形成学习闭环
- 三、系统总体架构
- 四、场景设计:为什么“识别”不能独立于“错题本”
- 五、模型选型:为什么建议使用“轻量检测 + 序列识别”方案
- 六、数据准备:没有好数据,模型很难讲得清楚
- 七、手写输入采集:HarmonyOS 侧怎么做
- 八、识别流程:从笔迹到 LaTeX 的业务链路
- 九、模型部署:端侧推理为什么更适合这个毕设
- 十、AI 识别结果页设计:不是“显示文本”,而是“可校验、可修正、可归档”
- 十一、错题本业务设计:把 AI 输出变成长期价值
- 十二、复习推荐:毕业设计中的“小 AI”也能做出价值
- 十三、开发难点与解决方案
- 十四、测试方案:不能只演示“识别成功”
- 十五、教学样例优化结果
- 十六、答辩展示建议:五分钟讲清楚完整闭环
- 十七、配套演示视频建议
- 十八、后续可扩展方向
- 十九、总结

每日一句正能量
学会给自己腾出空间,才能容纳更多精彩。
房间堆满杂物,新家具进不来。日程塞满、情绪填满,新体验、新关系也无处安放。拒绝、休息、独处、清理旧物,是主动准备容器。

标记:参与方向三「毕业季 · 鸿蒙同行」文章投稿。
一、选题背景:为什么“手写公式识别 + 错题本”适合作为鸿蒙毕业设计
在数学、物理、线性代数、概率统计等课程中,学生日常最头疼的不是“不会拍照”,而是“拍完之后无法结构化复习”。传统错题整理往往有两个常见痛点:
- 录入成本高:复杂公式很难靠普通 OCR 完整识别,学生手工录入又费时费力。
- 复习链路断裂:拍照、截图、云笔记、练习本分散在多个地方,错题无法形成稳定复习闭环。
如果把这个问题放到 HarmonyOS 毕业设计语境下,就会出现一个非常适合实战落地的选题:
让学生在鸿蒙设备上手写或拍照录入公式,利用端侧 AI 进行公式识别和语义纠错,再把结果直接归档到错题本中,最后基于知识点、错因和掌握度做复习计划。
这个题目有三个明显优势:
- 它不是单纯的算法题,也不是只有 UI 的工具应用,而是“AI + 端侧推理 + 学习场景 + 业务闭环”的综合项目。
- 它天然适合展示 HarmonyOS 设备特性,例如平板手写输入、手机拍题录入、跨端同步查看错题本等。
- 它既能体现模型选型、性能优化等技术深度,也能体现对真实学习痛点的解决能力。
二、项目目标:不只识别公式,更要形成学习闭环
本项目把整体目标拆分为四个层次。
2.1 核心目标
- 支持手写板输入公式;
- 支持拍照导入题目中的公式区域;
- 对单行或中等复杂度公式进行识别;
- 输出标准化表达形式,例如 LaTeX;
- 支持识别后的人工修正;
- 一键加入错题本。
2.2 学习闭环目标
- 给错题绑定知识点;
- 标记错因,例如“审题错误、公式混淆、步骤跳跃”;
- 记录解题过程图片或文字备注;
- 生成复习提醒;
- 统计掌握度变化。
2.3 HarmonyOS 能力目标
- 使用 ArkUI 构建适合手写与复习的页面;
- 利用 HarmonyOS 端侧运行模型,实现低延迟识别;
- 平板与手机端统一体验;
- 结果页与错题本页保持轻量交互;
- 为后续跨设备同步预留能力。
2.4 毕设展示目标
- 可以展示模型结构图、推理流程图和识别效果;
- 可以解释为什么选择当前模型;
- 可以解释如何做端侧量化与异步推理;
- 可以展示错题本应用不是“附带页面”,而是识别后的真正业务落点。
三、系统总体架构
系统采用五层结构:
- 交互层:手写板输入、拍照导入、公式预览、错题本查看。
- AI 服务层:公式检测、符号识别、序列解码、语义纠错。
- 业务层:错题归档、知识点标注、错因记录、复习提醒。
- 数据层:手写样本、识别结果、错题数据、用户掌握度。
- 端侧优化层:模型量化、异步推理、缓存加速、图像复用。
这种架构的优点在于:前端页面不直接耦合模型细节,AI 输出也不直接决定最终业务结果,所有识别结果都必须经过校验和可编辑确认,才能进入错题本。
四、场景设计:为什么“识别”不能独立于“错题本”
很多毕业设计把公式识别和错题管理做成两个松散的功能模块:
一个页面负责“识别出公式”,另一个页面只是“显示一个列表”。
但真正有价值的设计应该是:
识别只是入口,错题本才是长期留存与复习提分的核心业务。

项目的真实使用流程应该是:
- 用户手写或拍照导入一道题;
- 系统识别公式并给出结构化表达;
- 用户确认或修正识别结果;
- 题目与公式一起进入错题本;
- 系统为错题绑定知识点、错因与掌握度;
- 用户按计划再次复习;
- 复习结果回写到错题本,形成学习闭环。
这样一来,这个毕业设计就不再是一个“演示 AI 能识别公式”的技术秀,而是一个真正面向学习效率提升的工具产品。
五、模型选型:为什么建议使用“轻量检测 + 序列识别”方案
手写公式识别比普通 OCR 更复杂,难点主要体现在:
- 上下标结构;
- 分数、根号、积分、求和等二维结构;
- 手写风格差异大;
- 错笔、连笔、笔画粘连;
- 公式长度不固定。
5.1 可选技术路线
方案 A:字符检测 + 单字符分类 + 结构重建
优点:容易理解,模块拆分清楚。
缺点:结构重建复杂,符号切分难,面对连笔和拥挤公式时效果下降明显。
方案 B:图像到序列(Image-to-Markup)
即把公式图片直接编码为特征,再通过序列解码器输出 LaTeX。
优点:端到端表达能力强,更适合复杂结构。
缺点:训练数据需求更高,解码器对资源更敏感。
方案 C:检测 + Image-to-Markup 混合方案
先检测出公式区域,再做公式序列识别。
优点:比较适合毕业设计,结构清晰,易于解释,也方便做端侧优化。
本项目推荐采用 方案 C。

5.2 推荐模型结构
- 公式检测层:轻量 CNN 或轻量检测网络,用于从拍照图中裁剪出公式区域;
- 特征编码器:Mobile-friendly CNN,提取视觉特征;
- 序列解码器:Transformer Decoder 或 BiLSTM + Attention;
- 输出格式:LaTeX 或简化数学表达式;
- 语义纠错层:括号、上下标、分数结构、常见运算符校验。
如果项目周期较短,建议先做 “单行公式识别 + LaTeX 输出 + 结果可编辑”,后续再扩展复杂版式。
六、数据准备:没有好数据,模型很难讲得清楚
毕业设计最常见的问题之一,是只展示模型结构,不说明样本来源和标注方式。这样会让整个 AI 模块显得不扎实。

建议至少准备以下数据来源:
- 课堂笔记中的手写公式;
- 作业纸、练习册中的拍照样本;
- 平板书写板上的手写输入;
- 模拟生成的数学公式图像,用来补充边界情况。
6.1 标注内容
- 公式图像边界;
- 对应的 LaTeX 文本;
- 公式类别(积分、矩阵、分式等);
- 错误样本标签(例如括号缺失、上下标混淆);
- 是否为复杂结构。
6.2 推荐评估指标
- 字符级编辑距离;
- 公式完全匹配率;
- 结构正确率(括号、分数、上下标);
- 端侧平均推理时间;
- 用户修正次数。
即使数据规模不大,也要在文章中如实说明样本数量、采集来源和局限,而不是把教学样例包装成大规模工业级训练集。
七、手写输入采集:HarmonyOS 侧怎么做
对于手写公式输入,一个实用的做法是在 ArkUI 中使用画布组件记录笔画轨迹,然后渲染为位图交给识别模型。
export interface StrokePoint {
x: number
y: number
t: number
}
export interface Stroke {
points: StrokePoint[]
width: number
}
export class HandwritingBuffer {
private strokes: Stroke[] = []
private current?: Stroke
startStroke(x: number, y: number, width: number): void {
this.current = {
width,
points: [{ x, y, t: Date.now() }]
}
}
appendPoint(x: number, y: number): void {
if (!this.current) {
return
}
this.current.points.push({ x, y, t: Date.now() })
}
endStroke(): void {
if (this.current) {
this.strokes.push(this.current)
this.current = undefined
}
}
clear(): void {
this.strokes = []
this.current = undefined
}
getAll(): Stroke[] {
return this.strokes
}
}
这里的关键点不是“把笔迹记录下来”这么简单,而是要在渲染位图前统一:
- 画布尺寸;
- 笔宽归一化;
- 居中对齐;
- 留白边距;
- 二值化阈值;
- 输入缩放。
这样可以显著提升后续端侧模型的稳定性。
八、识别流程:从笔迹到 LaTeX 的业务链路

完整识别流程建议分为 6 步:
- 采集笔迹:记录用户在手写板上的笔画;
- 生成位图:把笔迹渲染成统一尺寸图像;
- 图像预处理:灰度化、二值化、归一化;
- 模型推理:输出公式对应的 LaTeX 序列;
- 语义校验:检查括号、上下标、分数结构;
- 确认归档:由用户确认后加入错题本。
8.1 识别服务抽象
export interface RecognitionResult {
latex: string
confidence: number
fixedLatex?: string
warnings: string[]
}
export class FormulaRecognitionService {
async infer(bitmapPath: string): Promise<RecognitionResult> {
// 这里表示调用端侧模型推理服务
const rawLatex = "\\int_0^1 (x+1)\\,dx"
const confidence = 0.962
const warnings: string[] = []
let fixedLatex = rawLatex
if (!this.isBracketBalanced(rawLatex)) {
warnings.push('括号可能不完整')
fixedLatex = this.tryFixBracket(rawLatex)
}
return {
latex: rawLatex,
confidence,
fixedLatex,
warnings
}
}
private isBracketBalanced(input: string): boolean {
let count = 0
for (const ch of input) {
if (ch === '(') {
count++
} else if (ch === ')') {
count--
}
if (count < 0) {
return false
}
}
return count === 0
}
private tryFixBracket(input: string): string {
let balance = 0
let result = input
for (const ch of input) {
if (ch === '(') {
balance++
} else if (ch === ')') {
balance--
}
}
while (balance > 0) {
result += ')'
balance--
}
return result
}
}
这段代码体现出一个重要思想:
模型输出并不直接等于最终结果。
识别结果需要经过基本语义校验,必要时给出“自动修正建议”而不是强制改写。
九、模型部署:端侧推理为什么更适合这个毕设
在学习场景中,端侧推理有明显优势:
- 低延迟,识别反馈更快;
- 无需每次联网上传图片;
- 更有利于保护学习隐私;
- 适合课堂、宿舍、图书馆等弱网场景;
- 便于离线保存与后续复习。
9.1 为什么不能只讲“模型跑起来了”
真正能体现工程能力的是:
你是否考虑了以下问题?
- 模型是否过大;
- 首次加载是否过慢;
- 内存是否够用;
- 连续识别时是否会卡 UI;
- 电量损耗是否过高;
- 识别结果是否可以缓存。
9.2 端侧推理优化策略

本项目建议至少做 5 类优化:
- 模型量化:将 FP32 模型转换为 INT8 或混合精度模型;
- 输入复用:复用位图缓冲,减少重复分配;
- 异步推理:避免阻塞主线程;
- 模型预热:应用启动后预先加载模型;
- 结果缓存:对相同输入的短时间重复识别避免重复推理。
9.3 异步调用示例
export class FormulaTaskManager {
private running: boolean = false
async runInference(path: string): Promise<RecognitionResult | null> {
if (this.running) {
return null
}
this.running = true
try {
const service = new FormulaRecognitionService()
const result = await service.infer(path)
return result
} finally {
this.running = false
}
}
}
虽然这个示例比较简化,但它体现了答辩中必须讲清楚的一点:
端侧 AI 推理不能阻塞手写输入与页面刷新。
十、AI 识别结果页设计:不是“显示文本”,而是“可校验、可修正、可归档”

识别结果页建议包含以下信息:
- 手写原图或拍照裁剪图;
- 识别得到的 LaTeX;
- 置信度;
- 语义校验结果;
- 自动纠错建议;
- 编辑按钮;
- 加入错题本按钮。
这种设计的价值在于:
- 学生可以信任系统,因为结果不是黑盒;
- 低置信度时可以主动编辑,不必完全依赖模型;
- 加入错题本前完成二次确认,避免错误数据持续污染。
10.1 ArkUI 结果页示例
@Entry
@Component
struct RecognitionResultPage {
@State latex: string = ''
@State confidence: number = 0
@State warnings: string[] = []
build() {
Column({ space: 16 }) {
Text('识别结果')
.fontSize(28)
.fontWeight(FontWeight.Bold)
.width('100%')
Text(`LaTeX:${this.latex}`)
.fontSize(18)
.width('100%')
Text(`置信度:${(this.confidence * 100).toFixed(1)}%`)
.fontSize(16)
.fontColor('#4B6CB7')
.width('100%')
if (this.warnings.length > 0) {
Column({ space: 8 }) {
ForEach(this.warnings, (item: string) => {
Text(`提示:${item}`)
.fontSize(16)
.fontColor('#A15934')
.width('100%')
})
}
}
Row({ space: 12 }) {
Button('编辑结果')
Button('加入错题本')
}
.width('100%')
}
.padding(20)
.width('100%')
.height('100%')
}
}
十一、错题本业务设计:把 AI 输出变成长期价值

错题本至少要包含以下字段:
export interface WrongQuestionItem {
id: string
title: string
originalImagePath: string
recognizedLatex: string
correctedLatex?: string
subject: string
knowledgePoints: string[]
wrongReason: string
masteryScore: number
createdAt: number
nextReviewAt?: number
}
11.1 为什么要有 wrongReason
错题本不是识别结果存储器。
学生真正需要复盘的是:
- 是公式没记住?
- 是概念理解错?
- 是符号抄错?
- 是步骤跳跃?
- 是计算粗心?
如果没有 wrongReason,这个错题本只能叫“图片收藏夹”。
11.2 为什么要有 masteryScore
掌握度可以帮助复习计划更有针对性。
例如:
- 0.2 表示完全不会;
- 0.5 表示做对过但不稳定;
- 0.8 表示基本掌握;
- 1.0 表示已熟练。
后续复习时间和推荐题量都可以依据这个分数调整。
十二、复习推荐:毕业设计中的“小 AI”也能做出价值
不必把系统做成复杂的学习平台。
一个简单但有效的推荐逻辑就已经足够体现毕设深度:
- 按错题知识点统计频次;
- 按掌握度升序排列;
- 结合最近复习时间;
- 生成“今日优先复习清单”。
export class ReviewPlanner {
buildTodayList(items: WrongQuestionItem[], now: number): WrongQuestionItem[] {
return items
.filter(item => !item.nextReviewAt || item.nextReviewAt <= now)
.sort((a, b) => {
if (a.masteryScore !== b.masteryScore) {
return a.masteryScore - b.masteryScore
}
return a.createdAt - b.createdAt
})
.slice(0, 20)
}
}
这种逻辑虽然不复杂,但非常适合答辩展示:
识别技术最终服务于学习计划,而不是停留在“识别成功率”这一个指标上。
十三、开发难点与解决方案
难点一:公式结构比普通文字复杂
问题:上下标、分数、积分结构容易识别错误。
解决:输出 LaTeX,而不是只输出纯文本;加入结构校验和纠错。
难点二:手写风格差异很大
问题:不同学生写法差异明显。
解决:训练集尽量覆盖多种笔迹;端侧允许人工修正。
难点三:模型太大,平板或手机跑起来卡顿
问题:推理时间过长,影响体验。
解决:轻量编码器、INT8 量化、预热、异步推理、输入复用。
难点四:识别和错题本脱节
问题:识别完成后没有长期价值。
解决:识别结果直接进入错题归档、知识点标注和复习计划。
难点五:评委会质疑“AI 只是噱头”
问题:如果只有识别截图,项目说服力不足。
解决:展示完整链路,包括输入、识别、纠错、归档、复习和优化数据。
十四、测试方案:不能只演示“识别成功”
至少要覆盖以下测试:
14.1 功能测试
- 手写输入识别;
- 拍照导入识别;
- 识别结果编辑;
- 加入错题本;
- 删除、归档、复习提醒。
14.2 算法测试
- 编辑距离;
- 完全匹配率;
- 结构正确率;
- 低置信度样本比例;
- 用户修正率。
14.3 性能测试
- 单次推理时间;
- 首次加载时延;
- 连续识别耗时;
- 峰值内存;
- 电量消耗。
14.4 体验测试
- 平板手写流畅度;
- 手机拍照识别入口易用性;
- 错题本页面阅读舒适度;
- 复习提醒是否清晰;
- 低置信度提示是否明确。
十五、教学样例优化结果
在教学样例中,分别测试了优化前后的关键指标:
- 单次推理耗时:420 ms → 165 ms;
- 峰值内存占用:310 MB → 180 MB;
- 启动到首结果:860 ms → 430 ms;
- 电量消耗(10 次识别):9.8% → 5.9%。
这些数据来自样例工程的同一组设备与测试流程,不代表行业通用结论,但足以用于说明:
端侧模型部署不是把模型丢进去就结束了,而是需要做工程优化。
十六、答辩展示建议:五分钟讲清楚完整闭环
建议答辩按以下结构组织:
第一分钟:问题与价值
讲清楚学生错题整理和公式录入的痛点。
第二分钟:系统架构
展示整体架构和识别流程。
第三分钟:模型选型
解释为什么选择轻量检测 + 序列识别方案,以及为什么需要语义纠错。
第四分钟:端侧优化
展示量化、缓存、异步推理前后的数据变化。
第五分钟:业务闭环
展示识别结果页和错题本页面,说明项目最终落点不是“识别成功”,而是“形成复习闭环”。
十七、配套演示视频建议
建议录制 60 秒左右的演示视频,流程可以是:
- 平板端手写一个积分公式;
- 点击识别;
- 展示 LaTeX 输出和置信度;
- 展示自动纠错结果;
- 点击“加入错题本”;
- 打开错题本详情;
- 展示知识点、错因和复习计划;
- 切换到优化结果图,展示端侧推理收益。
配套录屏脚本已单独输出,方便你后续真机录制。
十八、后续可扩展方向
这个毕设后续还能继续扩展:
- 识别多行推导过程;
- 识别几何、矩阵等更复杂结构;
- 支持教师端布置针对性练习;
- 加入手写笔迹回放;
- 平板录入、手机复习的跨端同步;
- 与拍照 OCR 结合,识别题干与答案;
- 引入错因自动分类,但不要夸大为“自动批改所有题目”。
十九、总结
“鸿蒙 + AI:手写公式识别与错题本应用”是一个非常适合毕业设计的题目,因为它把算法能力、端侧部署、UI 体验和学习场景结合在了一起。
它的真正价值不在于“识别出一个积分符号”,而在于把复杂的手写公式录入问题,转化为一个可持续复习、可分析掌握度、可辅助提分的学习闭环。
在 HarmonyOS 生态中,这类项目尤其适合用平板和手机双端完成:平板负责手写录入与识别,手机负责轻量复习与错题回顾。
从教学与答辩角度看,这个项目既有技术干货,又有明确场景,不会沦为纯算法 Demo,也不会变成只有页面而缺乏核心能力的普通应用。
如果你要参加共创季,这篇题目最大的加分点就在于:
它不仅展示了 AI,更展示了 AI 如何真正落到用户学习效率的提升上。
转载自:https://blog.csdn.net/u014727709/article/details/163000960
欢迎 👍点赞✍评论⭐收藏,欢迎指正
更多推荐



所有评论(0)