基于MAX78000的智能矿业检测系统
我们提出了一智能矿业监测方案,结合计算机视觉、机器学习和深度学习技术,采用MAX78000终端设备进行皮带异物监测。设备部署在边缘端,实现低延迟、高可靠性和隐私保护。应用深度学习算法实现全方位视觉监控,及时发现异物干扰和预警潜在事故隐患。
标签
嵌入式系统
二大爷
更新2024-01-10
中央民族大学
514

基于MAX78000的智能矿业检测系统

项目简介

在传统矿业领域,矿物运输中常受到异物干扰,可能引发皮带故障和事故。现有皮带异物检测在效率和准确性方面存在挑战。为解决这问题,我们结合计算机视觉、机器学习、和深度学习技术,采用MAX78000为终端设备,设计了一款智能矿业监测设备。

我们的方案首先在边缘端部署监测设备,充分利用边缘计算的优势,实现低延迟、高可靠性和隐私保护。这种部署方式不仅提高了监测的实时性,还降低了数据传输时延,使监测结果更及时准确。

其次,我们采用先进的深度学习算法,在监测设备上实现全面视觉监控系统。这使我们能够全方位监测矿业生产工作环境,及时发现异物干扰,并预警潜在事故隐患,提高了事故预警和处理的效率。深度学习算法赋予监测系统更强大的智能识别和分析能力,应对各种复杂情况。

最后,我们通过在MAX7800O上部署异物检测功能,实现了高性价比的监测解决方案。MAX78000作为高性能、低功耗的芯片,具备强大计算能力和高效处理图像数据的特点,提供迅速准确的异物检测结果。这种低成本高效能的设计,使我们的监测系统更具竞争力,可以广泛应用于矿业生产领域。

总的来说,我们的独特解决方案不仅解决了传统监测方式的问题,还带来了实时性、准确性、智能性和高性价比的全方位优势,为矿业生产过程带来了前所未有的监测水平提升。这一技术创新将推动矿业领域向更智能、高效的方向发展,为行业未来的可持续发展提供有力支持。

项目设计思路

观测对象

本项目的目标检测对象主要为矿物传送带上的大块落石和锚杆,如下图所示:

dakuai_152059_0359

传送带上的大块石头

maogan_040902_0002

传送带上的锚杆

整体项目设计思路

主要通过板载摄像头获取图片信息,然后通过输入到训练好的模型中进行检测,检测后输出到TFT屏幕上。

1

项目主要分为这三个部分完成,下面将会详细介绍每个部分。

YOLO模型设计思路

数据集的获取

数据集图片的来源来自网上的开源数据集:

CT2A%H6YEUX}MM3ONTSW@DK

网址:GitHub - CUMT-AIPR-Lab/CUMT-AIPR-Lab

使用Labelimg对数据集进行手动标注:

微信图片_20231212084612

标注后的数据:

GH)_H)0(P9ZV3LDII@C8V}H

标注后的数据结构:

/数据→ /img → /dakuai→大块.jpg

↘ ↘ /maogan→锚杆.jpg

/label → /dakuai →大块.xml

↘/maogan→锚杆.xml

环境搭建

以下代码是用于设置环境的一系列步骤,用于在系统上运行本项目。

① 环境要求:

系统上 Python 版本大于等于 3.8。

② 从 GitHub 上克隆项目:

通过以下命令从 GitHub 上克隆 `yolov1_maxim` 项目:

$ git clone git@github.com:YIWEI-CHEN/yolov1_maxim.git
$ cd yolov1_maxim

- 这会将项目代码下载到您的本地计算机。

③ 克隆依赖项目:

- 从 MaximIntegratedAI 的 GitHub 仓库中克隆 `ai8x-training` 和 `ai8x-synthesis` 项目,这两个项目应该放在项目的根目录下(例如,`yolov1_maxim` 文件夹内)。

$ git clone --recursive https://github.com/MaximIntegratedAI/ai8x-training.git
$ git clone --recursive https://github.com/MaximIntegratedAI/ai8x-synthesis.git

④在虚拟环境中安装 PyTorch:

- 进入项目目录,首先确保虚拟环境处于激活状态。

- 使用以下命令安装适用于 NVIDIA RTX A5000 的 PyTorch 版本:

$ pip install torch==1.10.2+cu113 torchvision==0.11.3+cu113 torchaudio==0.10.2+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html⑤安装 Distiller:

- 进入 `yolov1_maxim/ai8x-training/distiller` 目录。

- 修改 `requirements.txt` 文件,删除其中关于 `numpy`、`torch` 和 `torchvision` 的行。

- 使用以下命令在当前目录下安装 Distiller:

$ pip install -e .

⑥安装其他依赖包:

- 最后,安装其他项目所需的依赖包,包括 `tensorboard`、`matplotlib`、`numpy`、`colorama`、`yamllint`、`onnx`、`PyGithub`、`GitPython` 和 `opencv-python`。

$ pip install tensorboard matplotlib numpy colorama yamllint onnx PyGithub GitPython opencv-python

脚本列表

- `YOLO_V1_Train_QAT.py`:逐层量化训练;在第100、200、...、2400轮时对第1、2、...、24层进行量化;在第2500、2600、...、4800轮时融合BN层。

- `YOLO_V1_Test.py`:模型的伪INT8测试;修改权重文件的目录以测试不同的模型。

- `YOLO_V1_Test_INT8.py`:模型的真实INT8测试;在当前阶段不使用。

- `YOLO_V1_DataSet_small.py`:预处理数据集。

- `yolov1_bn_model.py`:定义深度神经网络的结构。

- `YOLO_V1_LossFunction.py`:定义损失函数。

- `weights/YOLO_V1_Z_5_450_Guanchu-BN_bs16_quant1_3000.pth`:经过3000轮训练后的模型参数,其中启用了量化但未融合BN层。

- `Weights/YOLO_V1_Z_5_450_Guanchu-BN_bs16_quant1_4000.pth`:经过4000轮训练后的模型参数,其中启用了量化但未融合BN层。

Yolov1_net的神经网络模型

①导入模块和库:

import torch.nn as nn

import torch

import sys

sys.path.append("../../../")

from ai8x import FusedLinearReLU, Linear, FusedConv1dReLU, FusedConv1dBNReLU, Conv1d, Conv2d

from ai8x import FusedConv2dReLU, FusedMaxPoolConv2dReLU, FusedConv2dBNReLU, FusedMaxPoolConv2dBNReLU

from ai8x import QuantizationAwareModule

导入了PyTorch的神经网络模块和相关库,以及一些自定义的神经网络层,如FusedLinearReLU、Linear、FusedConv1dReLU等。这些层是用于神经网络的基本构建块。

②定义Yolov1_net类:

class Yolov1_net(nn.Module):

def __init__(self, B=2, num_classes=5, bias=False, **kwargs):

# 构造函数,初始化模型参数

# B: 每个网格单元预测的边界框数量

# num_classes: 目标类别数

# bias: 是否使用偏置

super().__init__()

# 初始化模型结构

③定义神经网络层:

# 定义神经网络层,包括卷积、激活函数等

self.Conv_224 = FusedConv2dReLU(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1, bias=False, **kwargs)

# 后续定义了一系列的卷积层,每层之间通过最大池化或批归一化进行连接

④定义前向传播方法:

def forward(self, x):

# 定义前向传播,即数据从输入到输出的流程

# 各层的连接和激活函数通过forward方法实现

# 最后进行了softmax操作,得到每个类别的概率

⑤定义模型量化和融合方法:

def quantize_layer(self, layer_index=None, qat_policy=None):

# 模型量化方法,根据指定的层和策略进行量化

# 通过设定的权重位数和偏置位数来量化模型参数

def fuse_bn_layer(self, layer_index=None):

# 融合批归一化层方法,将卷积层和批归一化层融合

⑥构建Yolov1网络实例:

def yolov1_net(pretrained=False, **kwargs):

"""

Constructs a AI85Net5 model.

"""

assert not pretrained

return Yolov1_net(**kwargs)

程序yolov1_bn_model_noaffine.py主要功能是构建Yolov1网络的实例,返回一个yolo模型。

参数量化

使用脚本YOLO_V1_Train_QAT.py,对其进行逐层量化训练。

训练结果

ab863470b238f0aad07eb98980adee9

CNN模型设计思路

数据集

数据集依旧使用刚才YOLO模型的数据集,只不过数据集文件结构采用如下结构/img → /dakuai→大块.jpg

↘ ↘ /maogan→锚杆.jpg

CNN模型网络结构

使用CNN(卷积神经网络)的结构是一个相对简化的版本,基于在SimpleNet网络上的一些调整。它是为在AI85上运行而设计的,AI85是一种低功耗、高性能的AI处理器。参考第一季的宝可梦项目,对AI85Pokemon进行改造,宝可梦项目类别为150个,我的项目只有3个。

层次结构

输入层:接受具有三个通道(RGB)的 128x128 像素图像。

卷积层和池化层:模型包含多个卷积层和池化层。这些层通过应用不同大小的滤波器和步长来提取图像特征,并通过池化减少特征的空间尺寸。

Conv1 到 Conv14:一系列的卷积层,每个层都有不同数量的滤波器和参数。例如,Conv1 使用 16 个滤波器,而 Conv14 使用 192 个滤波器。

每个卷积层后面通常跟着批量归一化(BN)和激活函数(ReLU)。

某些卷积层后面还跟着池化层,以进一步降低特征图的维度。

全连接层:最后的卷积层(Conv14)输出被展平并通过一个全连接层,该层的输出节点数等于分类任务中的类别数(在这个例子中是 3)。

特点

无偏置配置:这个模型的所有层都配置为无偏置(bias=False),这在某些情况下可以简化模型并减少参数数量。

宽度配置:最后一个卷积层(Conv14)使用了“宽度”配置,这可能意味着更宽的滤波器或更多的输出通道。

特殊层的使用:

这些层是专门为AI85硬件优化的版本,这包括硬件加速的操作和对低功耗设计的优化。

训练过程

激活ai8x-training虚拟环境后,运行下面代码

python train.py --epochs 50 --optimizer Adam --lr 0.05 --wd 0 --compress policies/schedule-pokemon.yaml --model ai85pokemon --dataset pokemon --device MAX78000 --batch-size 128 --print-freq 10 --validation-split 0 --qat-policy policies/qat_pokemon.yaml

我调整了lr和epochs,并且对相应的yaml文件进行更改,来进行更合适的训练。其中schedule-pokemon.yaml 文件调整了其权重,来增加对我项目的适配性,qat_pokemon.yaml文件调整了进入qat训练的epochs的周期。(详细的训练日志已在附件中)

W)X46)L%I2XLAPU8Y0$SKDY

量化神经网络模型

把上一步得到的qat_best.pth.tar复制到trained文件夹下,使用下面的命令进行转化:

python quantize.py trained/qat_best.pth.tar trained/qat_best.pth-q.pth.tar --device MAX78000 -v

最后会得到qat_best.pth-q.pth.tar文件我们下一步部署会用到。

模型部署

CNN模型部署

模型量化后,将项目转为,可以在MAX78000上部署运行的c语言代码,获得该文件qat_best.pth-q.pth.tar后还需要pokemon.yaml文件,(该文件的编写参考链接如下https://github.com/MaximIntegratedAI/MaximAI_Documentation/blob/master/Guides/YAML%20Quickstart.md)然后执行如下命令

python ai8xize.py --test-dir /home/zhangtao/MAX78000/CNN --prefix cat --checkpoint-file trained/qat_best.pth-q.pth.tar --config-file networks/pokemon.yaml --device MAX78000 --compact-data --mexpress --timer 0 --display-checkpoint --verbose --overlap-data --mlator --new-kernel-loader --overwrite --no-unload

之后即可在/home/zhangtao/MAX78000/CNN目录下找到自动生成的项目,生成的原生文件我也放在附件中了。之后需要对main主函数进行修改。来实现摄像头采集的目的。

代码的图像采集部分主要借鉴了宝可梦识别的示例,其中包括相机模块的初始化、拍照、图像处理以及模型导入等关键步骤,具体代码讲解链接https://www.eetree.cn/project/detail/1311。

我只对图像处理的核心代码进行简要说明,即`capture_process_camera()`函数。该函数实现了逐行读取图像、将图像格式转换为0x00bbggrr以供模型输入、以及将图像转换为RGB565格式以在TFT显示屏上进行展示等功能。

①图像采集部分:

函数具有以下功能:

·使用 get_camera_stream_buffer 获取摄像头流式缓冲区中的数据。

·将图像数据逐行读取,同时将数据转换为 0x00bbggrr 格式并存储到 input_0 缓冲区中,用于传递给卷积神经网络(CNN)模型。

·将图像数据转换为 RGB565 格式,用于显示。如果定义了 TFT_ENABLE,则通过 MXC_TFT_ShowImageCameraRGB565 函数在 TFT 显示屏上显示图像。

·释放摄像头数据缓冲区。

②图像导入模型部分:

·cnn_load_input 函数将图像数据加载到模型输入 FIFO 中。

·使用一个 while 循环等待 FIFO 0 就绪,然后将输入数据写入 FIFO 0。

这段代码实现了从板载摄像头获取图像数据,进行逐行处理,将处理后的数据用于模型输入,并在需要的情况下在 TFT 显示屏上显示图像。

部署后的串口连接:

Q1IK0A[V]WK03{SPTD5(~_0

YOLO模型部署

YOLO模型在此项目中未能部署到MAX78000上,运行ai8xize.py未能成功将python编写训练的YOLO模型文件转换为C语言文件。后面我查资料了解到,将Python编写的YOLO模型转换为C语言,特别是处理非极大值抑制(NMS, Non-Maximum Suppression)部分,是一个复杂的过程。将模型从Python转换到C: 这通常涉及重写模型的各个部分,包括前向传播、层操作等。实现NMS: NMS需要在C中从头开始实现,或者使用现有的库(如果可用)。NMS的实现需要处理候选框(bounding boxes)的选取、IOU(交并比)的计算等。所以我在附件内放上模型文件,以供其他人去实现YOLO部署。

YOLO项目的各项程序参考,我将其写入了README.md文档中,供大家参考。F]]KJ3F_(_R@4{[[1HAY}IK

YOLO项目的完整项目我已上传至百度网盘供大家学习下载(gitee因部分文件太大传不上去)

链接:YOLOv1

项目总结

遇到问题

最大的问题就是辛苦准备的YOLO模型无法在嵌入式上部署,感觉自己还是所学的知识不够,如果下次还有比赛的话,我可能会尝试使用FastRCNN模型做MAX78000的嵌入式开发,该模型结构在转C的过程中,没有处理非极大值抑制的部分,模型部署环节会简单许多。

第二个问题就是CNN模型结构,在训练验证的过程中(我在linux环境下写了一个可以把验证集文件夹的图片批量输入模型的脚本,返回一个准确率),准确率可以达到80%,但是在实际部署后,对于锚杆的检测并不是太精准。可能是源于锚杆在图片内过小,或者是MAX78000摄像头的像素较低等原因。同时当检测大块石头的时候,若大块石头距离传送带尽头较远,处于较暗的地方容易识别成正常情况。

第三个问题就是CNN结构训练的好多次,权重设置有问题,会造成批量归一化层没有正确整合或折叠到前面的层中,如下:ERROR: The checkpoint file contains 1-dimensional weights for `conv1.bn.weight` with dimensions (16,). Ensure the BatchNorm layers have been folded.

展望未来

一开始的构想是MAX78000不设置任何除板材以外的扩展设备,直接完成与PC的串口通信,将检测结果实时显示在PC端上,这样通过较长的数据线,在矿场的传送带实际部署环节,工作人员就可以在远端PC上观察到实时检测结果。另外在实际部署环节,可以在板卡摄像头附近对传送带增加光源,或将板卡连接外部摄像头,外部蓝牙/WIFI通信模块。提高检测效果和便捷程度。

结语

经过了三个半月的努力,感谢MAX78000大赛给我这次机会,让我从0基础人工智能小白,学会了很多东西。从最开始入门的CNN的卷积神经网络,到各种YOLO模型的深入了解。紧接着就开始0基础学习搭建Linux环境,在电脑上装Ubuntu和Windows双系统,学习使用Linux系统的终端进行操作,在Linux系统上部署VPN进入GitHub等。从如何使用Linux进行机器学习,再研究官网的例程,在ai8x-training环境下进行机器学习,学习通过ai8xize.py进行模型转化,再到Windows下安装Maxim SDK,然后对模型进行部署。安装Maxim SDK总是报错,换了一个VPN才解决问题。在数据集处理的过程中一开始采用的是YOLO的数据集,但是YOLOv1采用的是VOC数据集,就尝试自己写python脚本把YOLO的数据集转为VOC数据集,其次标数据集浪费了大量的时间。

对于我这种完全没接触过机器学习,只学过51和32单片机的人最大的困难就是AI这块,没有理论基础,三个半月的时间做YOLO目标检测的模型时间有点太着急了,本来有很多对于单片机的扩展想法,但是前面学习AI浪费太多时间了。我可能在下次比赛继续尝试使用FastRCNN模型来进行目标检测任务,让其能成功部署在开发板上。

完成这个项目我最大的收获就是学会python了,以前我只会C语言,发现python他的简洁性和拓展性都很强,尤其在机器学习方面,他拥有的库非常非常多,并且在写python脚本方面也学到了很多东西,包括批量对文件操作,批量改后缀名等等。

最后,感谢硬禾举办的此次比赛,让我从基础的嵌入式开发进入了嵌入式AI的领域,同时也要感谢美信和ADI工程师们提供的README文档,从环境配置、模型训练、模型部署,写的真的非常详细和完善了。最后非常感谢Yi-Wei Chen,毕业于得克萨斯农工大学,一名微软机器学习工程师。他在GitHub上发布的yolov1_maxim程序帮我对学习yolov1和我的项目提供了很大的帮助。

效果展示

传送带上有锚杆测试:显示abnormal

1

传送带上有大块测试:显示abnormal

2

传送带上正常测试:显示normal

3

实物展示与说明

这里使用电脑模拟矿山的传送带,使用只需要将支架放于传送带前,白色电源线接入电源,按下按键即可开始检测。

团队介绍
张涛,中央民族大学在读研究生。
团队成员
二大爷
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号