一、项目背景

本项目基于 K230 视觉模块,实现对 0~9 数字的识别。
目标:

  • 使用摄像头实时采集图像
  • 提取图像中的数字区域
  • 对数字进行识别
  • 最终实现稳定识别系统

二、整体技术路线

本项目分为两个阶段:

第一阶段:规则法(传统视觉)

图像 → 阈值分割 → blob检测 → 区域划分 → 特征提取 → 规则分类

第二阶段:AI模型(深度学习)

摄像头采集图像
→ 输入检测模型(kmodel)
→ 模型完成:

  • 数字区域定位(bounding box)
  • 数字类别预测
    → 在画面中绘制检测框
    → 显示类别 + 置信度

三、规则法实现与分析

1️⃣ 核心思路

将数字区域分为三部分:

┌───────┐  
│ 上区   │  
├───────┤ 
│ 中区   │  
├───────┤ 
│ 下区   │  
└───────┘

提取特征:

top_ratio = top_pixels / total_pixels  
mid_ratio = mid_pixels / total_pixels 
bot_ratio = bot_pixels / total_pixels

2️⃣ 分类规则示例

def classify(top, mid, bot):  
    if top > 0.20 and mid < 0.15:  
        return "1"  
    if top < 0.12 and mid > 0.15:  
        return "4"  
    return "unknown"

3️⃣ 实际问题与调试过程

❗问题1:始终识别为 background

原因:

  • 阈值过大 (0,100)
  • 背景与数字连成一个 blob

解决:

BLACK_THRESHOLD = (0, 70, ...)

本质:分割失败 → blob过大


❗问题2:画面卡住

原因:

  • 程序被强制中断
  • Display / Sensor 未释放

解决:

try:  
    while True:  
        ...  
except KeyboardInterrupt:  
    print("stopped")  
finally:  
    sensor.stop()  
    Display.deinit()  
    MediaManager.deinit()

本质:嵌入式资源未释放


❗问题3:识别为 too small

原因:

  • ROI变小
  • blob面积变小
  • 阈值未调整

解决:

if b_area > 500

❗问题4:识别不稳定

原因:

  • 只取第一个 blob(顺序不稳定)

解决:
👉 选择最大面积 blob


❗问题5:识别错误

实际现象:

  • 7 → 1
  • 6 → 4
  • 8 → 6

原因:

  • 特征维度过低(仅 T/M/B)
  • 丢失结构信息

4️⃣ 规则法局限

无法区分:

  • 0 / 5 / 8
  • 6 / 8
  • 7 / 1

本质原因:
👉 特征空间重叠


5️⃣ 结论

规则法适用于:

  • 结构简单目标
  • 固定环境(如数码管)

不适用于:

  • 手写数字
  • 印刷字体识别

四、AI方案设计

规则法失败后,采用 AI 目标检测模型进行升级。


1️⃣ 数据采集

  • 手机拍摄 0~9 数字
  • 每类约 20 张
  • 包含:
    • 不同角度
    • 不同距离
    • 不同光照

2️⃣ 数据标注

平台:Kendryte 在线训练平台

操作:

  • 创建数据集(图像检测)
  • 上传图片
  • 对每张图进行画框标注

经验:

  • 框越紧 → 效果越好
  • 标注错误 → 直接影响结果

3️⃣ 模型训练

设置参数:

  • epoch:300
  • batch size:8
  • learning rate:0.001

训练过程中:

  • loss 逐渐下降
  • loss 表示模型预测误差

注意:

  • loss ≠ 准确率
  • loss 下降 ≠ 一定可用

4️⃣ 模型获取

训练完成后平台自动生成:

  • .kmodel(用于K230)
  • 推理代码(Python)

无需手动转换 ONNX → kmodel


五、部署与运行

1️⃣ 部署步骤

  1. 拷贝 .kmodel 和代码到开发板
  2. 运行官方脚本:
det_video_1_3.py

(实现:摄像头 + 推理 + 显示)

2️⃣ 实时识别流程

运行后:
摄像头画面
→ 模型自动检测数字位置
→ 画框
→ 显示类别 + 置信度
 


六、核心视觉概念(项目中涉及)

1️⃣ 颜色空间

RGB vs LAB:

  • RGB:直接显示
  • LAB:更适合分割

本项目使用:

BLACK_THRESHOLD = (0, 70, -128, 127, -128, 127)

本质:筛选暗像素

2️⃣ 阈值分割

根据条件筛选像素:

img.find_blobs(...)

影响:

  • 阈值过小 → 数字断裂
  • 阈值过大 → 全屏 blob

3️⃣ Blob(连通区域)

表示一块连在一起的区域

包含:

  • x, y
  • w, h
  • area
  • cx, cy

4️⃣ ROI(感兴趣区域)

只处理图像局部:

roi = (200, 120, 200, 200)

作用:

  • 减少干扰
  • 提高稳定性

5️⃣ 特征提取

规则法中:

[T, M, B]

AI中:
👉 自动学习特征


七、规则法 vs AI

项目规则法AI
实现难度
精度
鲁棒性
可扩展性

八、后续优化方向

1️⃣ 扩充数据集

每类 ≥ 100 张

2️⃣ 增加数据多样性

  • 光照
  • 角度
  • 距离

3️⃣ 提升模型泛化能力


🎯 总结

本项目从规则法出发,逐步过渡到 AI 方案,实现了:

  • 视觉分割
  • 连通域分析
  • 特征提取
  • AI模型训练与部署
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐