STM32也能实现目标分类?本文使用的芯片是STM32F103VCT6, 最大工作频率72M,64KB RAM, 256KB FLASH。资源就那么点,这些高大上的基本都是DSP、高级ARM之类芯片玩的,你一个这么点资源的芯片凑什么热闹。但是笔者经过多年在嵌入式方面的经验,成功实现了基于STM32的目标分类,下面把实现的过程和大家分享下。
受限于芯片资源,我们设计的算法不能太复杂,主要体现在几个方面:1、识别目标的特征不能太多;2、具体的算法要简单,不然CPU跑不动,不能实现实时性。基于这两点笔者给大家分享一个在STM32平台上实现用颜色来识别人民币的面额,大家都知道,人民币的每个面额的颜色都不相同,如下图:

从图中可以看出,人民币每个面额颜色都有区别,所以我们可以采集人民币的颜色数据作为识别的特征。在本项目中用到了两组颜色传感器,当纸币经过时,通过AD循环采集纸币的RGB颜色数据,这样就得到了用于计算特征的数据。
目标分类一般有两个步骤:一是提取特征;二是根据设计的分类器对特征数据进行分类,下面就这两部分进行说明。

人民币颜色数据的特征提取

这里先给大家讲解下颜色的HIS颜色模型,HSI是指一个数字图像的模型,是美国色彩学家孟塞尔(H.A.Munsell)于1915年提出的,它反映了人的视觉系统感知彩色的方式,以色调、饱和度和亮度三种基本特征量来感知颜色。HSI模型的建立基于两个重要的事实:第一个,分量与图像的彩色信息无关;第二个,H和S分量与人感受颜色的方式是紧密相联的。这些特点使得HSI模型非常适合彩色特性检测与分析。
色调H(Hue):与光波的波长有关,它表示人的感官对不同颜色的感受,如红色、绿色、蓝色等,它也可表示一定范围的颜色,如暖色、冷色等。
饱和度S(Saturation):表示颜色的纯度,纯光谱色是完全饱和的,加入白光会稀释饱和度。饱和度越大,颜色看起来就会越鲜艳,反之亦然。
亮度I(Intensity):对应成像亮度和图像灰度,是颜色的明亮程度。
通过上面的介绍,大家应该明白,我们要把采集到的RGB颜色数据转换HIS模型上,如下图:

具体的转换公式为:

代码如下:

void rgb_to_ish(int r,int g,int b, double *I,double *S,double *H)
{double R,G,B;R=(double)r/255.0;G=(double)g/255.0;B=(double)b/255.0;*I=(R+G+B)/3;if(*I<0.001){*H=0;*S=0;return;}*S = 1-(min(min(R,G),B)/(*I));if(*S==0){*H=0;return;}*H=((R-G)+(R-B))/2/sqrt((R-G)*(R-G)+(R-B)*(G-B));if(G>B){*H=acos(*H);}else {*H=2*M_PI-acos(*H);}*H/=2*M_PI;
}

在转换之前,首先需要对RGB数据进行归一化,调整到同一长度下,代码如下:

void ResizeData(const u8 *pOldData,I32 len,u8 *pNewData, I32 newLen)
{I32 i,tx,xx,dxi;I32 t;for (i = 0; i < newLen; i++){tx = i*1024*(len)/(newLen);xx = tx>>10;dxi=tx-xx*1024;t = ((((I32)pOldData[xx+1]-(I32)pOldData[xx])*dxi)>>10)+(((I32)pOldData[xx]-(I32)pOldData[xx+1])*dxi>>20)+(I32)pOldData[xx];if (t > 255){t = 255;}pNewData[i] = t;}
}

对提取特征总结下:

  1. 对RGB数据进行归一化
  2. 转换为HIS模式表示
    一张人民币提取到的特征如下:
1 1:360 2:441 3:408 4:430 5:402 6:432 7:411 8:493 9:451 10:476 11:480 12:463 13:468 14:456 15:497
16:458 17:514 18:458 19:519 20:470 21:509 22:467 23:512 24:458 25:520 26:457 27:482 28:451 29:446
30:448 31:427 32:440 33:415 34:428 35:396 36:425 37:398 38:432 39:380 40:452 41:403 42:422 43:444
44:426 45:416 46:385 47:512 48:280 49:316 50:663 51:324 52:464 53:384 54:448 55:406 56:453 57:425
58:492 59:442 60:545 61:440 62:546 63:481 64:527 65:515 66:527 67:534 68:528 69:533 70:520 71:514
72:535 73:503 74:559 75:532 76:544 77:555 78:520 79:544 80:520 81:523 82:505 83:519 84:480 85:528
86:427 87:533 88:330 89:385 90:344 91:320 92:425 93:346 94:473 95:403 96:462 97:446 98:446 99:455100:468 101:464 102:482 103:491 104:461 105:481 106:451 107:468 108:425 109:455 110:417 111:431 112:367 113:405 114:339 115:347 116:353 117:335 118:372 119:354 120:370 121:346 122:380 123:305124:444 125:350 126:445 127:414 128:387 129:432 130:354 131:408 132:356 133:345 134:402 135:350 136:407 137:364 138:377 139:337 140:391 141:326 142:429 143:356 144:476 145:456 146:439 147:458 148:441 149:460 150:439 151:456 152:439 153:459 154:443 155:458 156:439 157:469 158:433 159:473 160:433 161:478 162:444 163:469 164:445 165:465 166:437 167:462 168:437 169:464 170:439 171:464 172:443 173:471 174:420 175:467 176:394 177:414 178:392 179:398 180:385 181:401 182:375 183:374 184:427 185:407 186:424 187:432 188:429 189:432 190:404 191:539 192:276 193:387 194:645 195:315 196:440 197:365 198:426 199:384 200:428 201:387 202:419 203:376 204:407 205:363 206:398 207:364 208:407 209:372 210:410 211:372 212:424 213:381 214:473 215:441 216:503 217:493 218:489 219:513 220:448 221:508 222:416 223:471 224:410 225:437 226:411 227:413 228:397 229:410 230:359 231:398 232:324 233:359 234:312 235:327 236:336 237:287 238:383 239:346 240:368 241:360 242:389 243:405 244:336 245:346 246:391 247:385 248:380 249:396 250:382 251:387 252:364 253:373 254:378 255:375 256:352 257:371 258:333 259:355 260:335 261:373 262:342 263:405 264:371 265:355 266:456 267:323 268:431 269:359 270:386 271:382 272:379 273:409 274:349 275:427 276:325 277:327 278:388 279:310 280:370 281:342 282:328 283:297 284:364 285:320 286:376 287:348 288:440

这里提取了288维的特征。

基于提取的特征进行目标分类

这里给大家分享一个很著名的分类器liblinear,它是是国立台湾大学的Chih-Jen Lin博士开发的主要是应对large-scale的data classification,因为linear分类器的训练比非线性分类器的训练计算复杂度要低很多,时间也少很多,而且在large scale data上的性能和非线性的分类器性能相当,所以Liblinear是针对大数据而生的。通过笔者的实验,这个分类器在STM32 平台上实现非常容易,而且速度很快,分类主要代码如下:

for (i = 0; i < Class; i++)
{fvtInt = 0;for (j = 0; j < 144*2; j++){t0 = (int)pf1[j];t1 = (int)pFvt[j*Class+i];fvtInt += t0*t1;}fvt = ((double)(fvtInt))/100000;fvt += ((double)(pFvt[j*Class+i]*200))/100000;tt = exp(-fvt);  fvt = 1/(1+tt);if (max_t < fvt){max_t = fvt;min_i = pNoteClass[i];}
}

大家看看就这么几段代码就实现了,这里提醒下,在运算过程中尽量使用整型数据,以节省空间。

识别步骤
  1. 对提取的特征进行训练,训练在PC端实现,得到用于分类的模型文件,部分内容如下图:
  2. 将上面得到的模型文件整型化,有利于提高运行速度。
  3. 用上面的提供的分类代码就可以实现分类了。
    我这边数据的实验结果:
    nTotal = 30500, err = 177, 识别率为: 0.994197
    就这么简单的几个步骤,就可以让STM32立马高大上起来!-!

结尾

本文主要介绍了在STM32F103平台上对人民币颜色信息进行识别的算法原理。
如有疑问,欢迎留言讨论

扫描上方二维码关注“嵌入式案例Show”公众号,看更多嵌入式案例

STM32也能玩高大上:实现目标分类相关推荐

  1. 多目标分类的混淆矩阵_用于目标检测的混淆矩阵

    多目标分类的混淆矩阵 After training a machine learning classifier, the next step is to evaluate its performanc ...

  2. 卷积神经网络(目标分类)

    文章目录 目标分类基本框架 数据准备 数据扩充 数据规范 模型设计 任务分类 局部更改 训练细节 目标分类基本框架 数据准备 现有数据集的子集,网络采集,现有数据人工标注 数据扩充 原始数据切割,噪声 ...

  3. 【使用华为云MindSpore框架实现目标分类___实验报告(二)】

    *************************************************** 码字不易,收藏之余,别忘了给我点个赞吧! *************************** ...

  4. MaixPy K210 目标分类模型在线训练及使用教程

    MaixPy K210 目标分类模型在线训练及使用教程 相关步骤 准备数据集 在线训练 运行模型 相关步骤 本文的资料来自于MaixPy官方文档,更多详细内容可进入MaixPy官方文档进行查询. 官方 ...

  5. k210自主学习目标分类

    https://cn.maixpy.sipeed.com/dev/zh/course/ai/basic/maixpy_hardware_ai_basic.html MaixPy AI 硬件加速基本知识 ...

  6. 三维深度学习中的目标分类与语义分割

    (转载的文章,仅供学习,如有侵权请随时联系删帖) 在过去的几年中,基于RGB的深度学习已经在目标分类与语义分割方面取得了非常好的效果,也促进了很多技术的发展,深度学习在现实生活中的应用也越来越多.但是 ...

  7. 公开讲座系列 | 4D毫米波成像雷达的目标分类技术方法研究 讲座(白杰教授) 英文版笔记

    本文为毫米波雷达点云的公开讲座笔记(英文版),讲座信息如下: 题目:4D毫米波成像雷达的目标分类技术 主讲人:白杰 苏州豪米波技术有限公司董事长.浙大城市学院教授.国家高层次人才 会议(论坛):202 ...

  8. 快速玩转Yolov5目标检测—没有好的显卡也能玩(二)

    上篇  快速玩转Yolov5目标检测-没有好的显卡也能玩(一) 已经将YoloV5在我的笔记本电脑上快速跑起来了,因为电脑显卡一般,所以运行的CPU版本,从推理结果来看,耗时还是蛮高的,如下图,平均每 ...

  9. 开源项目:DRR(deepstream-ros-robot),针对pc主机端和nvidia-jetson边缘计算平台,实现了基于deepstream框架下的目标分类检测、车道线检测等,并配置了目标追踪

    开源项目: <DRR(deepstream-ros-robot)> 项目介绍: 本项目针对pc主机端和nvidia-jetson边缘计算平台,基于deepstream框架进行加速推理搭建了 ...

最新文章

  1. elasticsearch使用bulk实现批量操作
  2. C++ for循环跳过某一项求和
  3. php 警告提示框,关于javascript:php重定向到带有警告对话框的页面
  4. centos部署mysql5.6免安装版
  5. java上传文件至nas_使用JCIFS上传文件至NAS设备(Logon failure: unknown user name or bad password)解决...
  6. nodejs库express是如何接收inbound json请求的
  7. 抖音短视频去水印教程
  8. 科学家要用3D打印技术复制大脑,今后人类都可以“永生”了
  9. 固件升级(DFU/OTA)
  10. 典型分布式计算技术的分析和比较
  11. 网上办公自动化|OA系统
  12. orCAD原理图 DRC检查
  13. 深富策略:锂电光伏崛起 成长赛道再度回归
  14. System/360 大型机差点毁了 IBM !
  15. Spring整合数据源报错严重: create connection SQLException, url: jdbc:mysql://localhost:3306/library, errorCode
  16. ES - 查询所有数据
  17. ubuntu(18.04)磁盘空间不足导致问题:bash: 无法为立即文档创建临时文件: 设备上没有空间(按tab键无法自动补全)
  18. 电影挖掘机 搜索各大视频网站API接口 自动搜索全网所有电影
  19. MySQL 设置 创建时间 和 更新时间
  20. NVIDIA VIDEO CODEC SDK开发资源下载

热门文章

  1. 点云检测框投影到图像上(mmdetection3d)
  2. 假如给我三天光明(所有人都曾是小孩虽然只有少数人记得)
  3. HHT和FFT的对比
  4. Vue中的过滤器(管道)
  5. MATLAB如何绘制每组数量不一致柱状图
  6. 余三码和8421码对比
  7. Vue3前后端交互错误处理一致性
  8. 网络工程师面试题(面试必看)(5)
  9. Metasploit进行渗透测试的常用流程【入门】
  10. Spring MVC过滤器-超类 GenericFilterBean