螺钉、螺母、螺栓识别
本项目将在Linux环境下对螺钉、螺母和螺栓进行AI视觉模型训练后,使用MAX78000FTHR开发板的板载摄像头搭配另外的TFT屏幕对螺钉、螺母和螺栓进行识别。
标签
嵌入式系统
AI视觉
Pulsar2
更新2022-12-01
583

1)项目训练报告

1.项目介绍

      本项目将在Linux环境下对螺钉、螺母和螺栓进行AI视觉模型训练后,使用MAX78000FTHR开发板的板载摄像头搭配另外的TFT屏幕对螺钉、螺母和螺栓进行识别。 

2.项目设计思路

      MAX78000FTHR开发板是板载摄像头的,所以只需额外购买一块屏幕即可满足项目所需。

      项目整体大致分为5步,目前进行到了第三步:

  1. 搜集螺钉、螺母和螺栓的图像,这一步我是从网上购买了M6*12螺钉10个、M6螺母20个和M6*16螺栓10个,然后使用板载摄像头搭配屏幕拍摄一些图片素材保存到SD卡(已完成)。
  2. 把SD卡上的图片拷贝到电脑上,在电脑上使用Qt编写标注软件,对拍摄的图片进行标注于分割(已完成)。目前学习到pytorch的dataset处理时发现要使用相同规格的图片,后续可以在标注软件上加一个resize功能。
  3. 使用python编写数据采集模块(dataset)和网络配置模块(models),其他的根据目前的学习情况来看应该可以使用现有的代码,或者只需要做少许的修改。
  4. 在Linux上使用pytorch+cuda对搜集的数据进行训练、量化,使用自带的代码可以生成相应网络的cnn源文件,这些源文件可以直接移植到板卡上运行。
  5. 移植之前训练好的网络权重(cnn源文件),使用摄像头搭配屏幕,使用按键作为识别起始信号,在不捅环境下进行识别测试。

3.搜集素材的思路

      刚开始是准备在网络上搜集相关训练素材的,经过搜索发现公开的数据很少,几乎没有。因此我打算自己录制素材,使用板载的摄像头搭配另外的屏幕以及一张SD卡,先做一个照相机录制好素材保存到SD卡中。然后在电脑上对录制好的图像进行分割与标注,以完成素材搜集。

      目前已完成以下几点

  1. 照相机功能,由于MAX78000的RAM只有128KB,如果使用320*240尺寸的图片的话一张图需要150KB的RAM,所以我将摄像头的输出设置为了240*180,这样一张图就只需要86KB的RAM。在开发过程中发现了一个问题是屏幕驱动的输入模式是高字节在低地址,而BMP保存时的输入模式是高字节在高地址。摄像头输出的字节流的模式与屏幕驱动相同,所以摄像头输出可以直接在屏幕上显示,要存图的话需要做个高低字节转换。
  2. Qt标注软件,从固定路径中读取存储好的BMP文件,使用了自定义的GraphicsView控件以实现鼠标跟随十字丝功能。绘制矩形窗后切图保存,此前开发是不知道要resize,所以剪完的素材都是大小不一的。

      现在正在学习pytorch的dataset的写入操作,同时也在学习python,因为我之前都是开发C嵌入式的。另外由于宿舍的光源环境比较差,若使用单侧光源,照相机的曝光比较难适应,因此我需要使用纸箱和环状灯光搭建一个简易的录制环境。最开始环状灯是放在纸箱内部打,但是在拍照是发现画面全白,光线太强导致完全过曝了,最终是使用光圈在外面补光,利用纸箱开口打大小控制进光亮,从而拍摄出质量相对较好的图片。

      部分已完成成果展示,照相机核心代码实现如下

while (!camera_is_image_rcv());
camera_get_image(&raw, &imgLen, &w, &h);
MY_TFT_ShowImageCameraRGB565(0,0,raw,w,h);   
if(keypressed==1)
{
    for(uint32_t i=0;i<imgLen;i+=2)
    {
        temp = raw[i];
        raw[i] = raw[i+1];
        raw[i+1] = temp;
    }
    while(1) 
    {
        memset(filename, 0, 24);
        snprintf(filename, 24, "/pic/img%d.bmp", i++);
        fr = f_stat(filename, &fno);
        if (fr == FR_NO_FILE) {
            printf("will save pic to %s\n",filename);
            break;
        } else if (fr != FR_OK) {
            printf("Error while searching for next available file: %d\n", fr);
            break;
        }
    }
    fr = f_open(&fd,filename,FA_WRITE | FA_CREATE_NEW);
    if(fr == FR_OK)
    {
        printf("file open OK!\n");
        f_write(&fd,&bfType, 2, &wrote);
        f_write(&fd,&bfh, 12, &wrote);
        f_write(&fd,&bih, 40, &wrote);
        f_write(&fd,&bmiClr, 12, &wrote);
        f_write(&fd, raw, w*h*2, &wrote);
        f_close(&fd);
        printf("all pic data write OK!\n");
    }
    else
    {
        printf("file open failed!\n");
    }
    keypressed=0;
}

      在开发照相机时遇到的问题就是在写入BMP文件时像素高低字节的大小端模式与摄像头数据流不一致,导致刚开始拍摄出的图片异常奇怪,下边的图片中合集展示的都是不对的图片,下边两张的才是正常的图片。

FqK_J2uzqFSriTVLchv6E8FaLCky

Fsu2dCHwwiMFQzRW9G9Caa7qbJyJFgifCP9czAuM56X0r31Xx_Kwil6h

      照相机做好之后需要搭建一个简易的录制环境,刚开始是这样的,圆形光圈在内部

Fg2RGMt99m1psoseO4msU_OqT5nZ

      由于过曝无法录制素材,最终只能将光源放在外边,最终录制环境与拍摄效果如下

Fg2RGMt99m1psoseO4msU_OqT5nZ  Fr4mgU8wrxewlFOkcMsHmC1Vj5e_

      录制好数据后需要将图片拷贝到电脑上进行切割与标注,这个我是使用Qt做了一个简易的标注软件,标注过程中截了几张图,这里小小的展示一下

FnvvZLPLHzp24CWDN8ZQmiVaIdq7FuEnw5KG5pLm7zMXDP54Re-_DO_hFms1JcL70RiQTrE3yBJgq02TYNyaFkuQRPgyQl4Sm-vDTSlC5D4AwfBy

      上边的标注软件标注完成之后会copy出来冰保存为jpg图片,部分结果展示如下

FktGyLEcqbv4JBE-2CjE7-gQOilWFviRgBmAqGiHqoQTO4BR4ZqiNHq1FvtttkUD119UVNoVCZCLhH9CA319

4.预训练实现过程

      目前还在学习python与pytorch的数据集处理中,越查资料越发现人工智能的博大精深,越发现自己了解的太少了,所以我打算弄一个小一点的数据集,实现一个比较基础的识别功能。这样训练的时间短一些,发现问题后验证的时间也短一些,争取在规定时间内做出一个比较完整的AI项目。后续如果还有机会可以逐步优化数据集,优化模型,感觉这款MCU自带CNN还是很强的。

团队介绍
个人团队
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号