文章目录


在这里插入图片描述

每日一句正能量

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

在这里插入图片描述

标记:参与方向三「毕业季 · 鸿蒙同行」文章投稿。


一、选题背景:为什么“手写公式识别 + 错题本”适合作为鸿蒙毕业设计

在数学、物理、线性代数、概率统计等课程中,学生日常最头疼的不是“不会拍照”,而是“拍完之后无法结构化复习”。传统错题整理往往有两个常见痛点:

  1. 录入成本高:复杂公式很难靠普通 OCR 完整识别,学生手工录入又费时费力。
  2. 复习链路断裂:拍照、截图、云笔记、练习本分散在多个地方,错题无法形成稳定复习闭环。

如果把这个问题放到 HarmonyOS 毕业设计语境下,就会出现一个非常适合实战落地的选题:
让学生在鸿蒙设备上手写或拍照录入公式,利用端侧 AI 进行公式识别和语义纠错,再把结果直接归档到错题本中,最后基于知识点、错因和掌握度做复习计划。

这个题目有三个明显优势:

  • 它不是单纯的算法题,也不是只有 UI 的工具应用,而是“AI + 端侧推理 + 学习场景 + 业务闭环”的综合项目。
  • 它天然适合展示 HarmonyOS 设备特性,例如平板手写输入、手机拍题录入、跨端同步查看错题本等。
  • 它既能体现模型选型、性能优化等技术深度,也能体现对真实学习痛点的解决能力。

二、项目目标:不只识别公式,更要形成学习闭环

本项目把整体目标拆分为四个层次。

2.1 核心目标

  • 支持手写板输入公式;
  • 支持拍照导入题目中的公式区域;
  • 对单行或中等复杂度公式进行识别;
  • 输出标准化表达形式,例如 LaTeX;
  • 支持识别后的人工修正;
  • 一键加入错题本。

2.2 学习闭环目标

  • 给错题绑定知识点;
  • 标记错因,例如“审题错误、公式混淆、步骤跳跃”;
  • 记录解题过程图片或文字备注;
  • 生成复习提醒;
  • 统计掌握度变化。

2.3 HarmonyOS 能力目标

  • 使用 ArkUI 构建适合手写与复习的页面;
  • 利用 HarmonyOS 端侧运行模型,实现低延迟识别;
  • 平板与手机端统一体验;
  • 结果页与错题本页保持轻量交互;
  • 为后续跨设备同步预留能力。

2.4 毕设展示目标

  • 可以展示模型结构图、推理流程图和识别效果;
  • 可以解释为什么选择当前模型;
  • 可以解释如何做端侧量化与异步推理;
  • 可以展示错题本应用不是“附带页面”,而是识别后的真正业务落点。

三、系统总体架构

系统采用五层结构:

  1. 交互层:手写板输入、拍照导入、公式预览、错题本查看。
  2. AI 服务层:公式检测、符号识别、序列解码、语义纠错。
  3. 业务层:错题归档、知识点标注、错因记录、复习提醒。
  4. 数据层:手写样本、识别结果、错题数据、用户掌握度。
  5. 端侧优化层:模型量化、异步推理、缓存加速、图像复用。

这种架构的优点在于:前端页面不直接耦合模型细节,AI 输出也不直接决定最终业务结果,所有识别结果都必须经过校验和可编辑确认,才能进入错题本。


四、场景设计:为什么“识别”不能独立于“错题本”

很多毕业设计把公式识别和错题管理做成两个松散的功能模块:
一个页面负责“识别出公式”,另一个页面只是“显示一个列表”。

但真正有价值的设计应该是:
识别只是入口,错题本才是长期留存与复习提分的核心业务。

在这里插入图片描述

项目的真实使用流程应该是:

  1. 用户手写或拍照导入一道题;
  2. 系统识别公式并给出结构化表达;
  3. 用户确认或修正识别结果;
  4. 题目与公式一起进入错题本;
  5. 系统为错题绑定知识点、错因与掌握度;
  6. 用户按计划再次复习;
  7. 复习结果回写到错题本,形成学习闭环。

这样一来,这个毕业设计就不再是一个“演示 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 模块显得不扎实。

在这里插入图片描述

建议至少准备以下数据来源:

  1. 课堂笔记中的手写公式;
  2. 作业纸、练习册中的拍照样本;
  3. 平板书写板上的手写输入;
  4. 模拟生成的数学公式图像,用来补充边界情况。

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 步:

  1. 采集笔迹:记录用户在手写板上的笔画;
  2. 生成位图:把笔迹渲染成统一尺寸图像;
  3. 图像预处理:灰度化、二值化、归一化;
  4. 模型推理:输出公式对应的 LaTeX 序列;
  5. 语义校验:检查括号、上下标、分数结构;
  6. 确认归档:由用户确认后加入错题本。

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 类优化:

  1. 模型量化:将 FP32 模型转换为 INT8 或混合精度模型;
  2. 输入复用:复用位图缓冲,减少重复分配;
  3. 异步推理:避免阻塞主线程;
  4. 模型预热:应用启动后预先加载模型;
  5. 结果缓存:对相同输入的短时间重复识别避免重复推理。

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;
  • 置信度;
  • 语义校验结果;
  • 自动纠错建议;
  • 编辑按钮;
  • 加入错题本按钮。

这种设计的价值在于:

  1. 学生可以信任系统,因为结果不是黑盒;
  2. 低置信度时可以主动编辑,不必完全依赖模型;
  3. 加入错题本前完成二次确认,避免错误数据持续污染。

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”也能做出价值

不必把系统做成复杂的学习平台。
一个简单但有效的推荐逻辑就已经足够体现毕设深度:

  1. 按错题知识点统计频次;
  2. 按掌握度升序排列;
  3. 结合最近复习时间;
  4. 生成“今日优先复习清单”。
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 秒左右的演示视频,流程可以是:

  1. 平板端手写一个积分公式;
  2. 点击识别;
  3. 展示 LaTeX 输出和置信度;
  4. 展示自动纠错结果;
  5. 点击“加入错题本”;
  6. 打开错题本详情;
  7. 展示知识点、错因和复习计划;
  8. 切换到优化结果图,展示端侧推理收益。

配套录屏脚本已单独输出,方便你后续真机录制。


十八、后续可扩展方向

这个毕设后续还能继续扩展:

  1. 识别多行推导过程;
  2. 识别几何、矩阵等更复杂结构;
  3. 支持教师端布置针对性练习;
  4. 加入手写笔迹回放;
  5. 平板录入、手机复习的跨端同步;
  6. 与拍照 OCR 结合,识别题干与答案;
  7. 引入错因自动分类,但不要夸大为“自动批改所有题目”。

十九、总结

“鸿蒙 + AI:手写公式识别与错题本应用”是一个非常适合毕业设计的题目,因为它把算法能力、端侧部署、UI 体验和学习场景结合在了一起。

它的真正价值不在于“识别出一个积分符号”,而在于把复杂的手写公式录入问题,转化为一个可持续复习、可分析掌握度、可辅助提分的学习闭环。
在 HarmonyOS 生态中,这类项目尤其适合用平板和手机双端完成:平板负责手写录入与识别,手机负责轻量复习与错题回顾。
从教学与答辩角度看,这个项目既有技术干货,又有明确场景,不会沦为纯算法 Demo,也不会变成只有页面而缺乏核心能力的普通应用。

如果你要参加共创季,这篇题目最大的加分点就在于:
它不仅展示了 AI,更展示了 AI 如何真正落到用户学习效率的提升上。


转载自:https://blog.csdn.net/u014727709/article/details/163000960
欢迎 👍点赞✍评论⭐收藏,欢迎指正

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐