化工厂液体泄漏识别预警算法

描述

化工厂液体泄漏识别预警基于图像识别算法是计算机视觉的基础算法,例如VGG,GoogLeNet,ResNet等,化工厂液体泄漏识别这类算法主要是判断图片中目标的种类液体泄漏识别预警自动识别监控视频中机械管道是否存在液体泄漏行为。如检测到液体泄漏,立即反馈给后台人员及时处理。

 

预警

 

要对图片中一个物体进行分类,首先要解决如何从图片中发现这个物体,最直观的方法就是用不同尺寸的方框进行扫描,这个方框可以被称为window,和要得到的物体尺寸是两回事。这就是RNN的方法,但这种方法计算量大,因此出现了Yolo,其核心思想就体现在如何从一张图像准确获取目标的方法上。

 

预警

 

至于目标检测的用处,现在最大的场景就是无人驾驶,在无人驾驶中,需要实时检测出途中的人、车、物体、信号灯、交通标线等,再通过融合技术将各类传感器获得的数据提供给控制中心进行决策。而目标检测相当于无人驾驶系统的眼睛。在目标检测技术领域,有包含region proposals提取阶段的两阶段(two-stage)检测框架如R-CNN/Fast-RCNN/R-FCN等。
 

 

 

卷积神经网络训练与硬件加速器实现 图像识别系统的第二部分是 CNN 加速器,CNN 加速器的实现包含训练与推理两个阶段。一是卷积神经网络训练,提取相应的权重值和偏置值,即训练阶段。二是根据网络模型实现卷积神经网络,并做硬件加速,提升卷积神经网络运算的速率,即推理阶段。 CNN 网络训练完毕后,采用 PyTorch 神经网络框架将卷积神经网络模型及其参数保存在pt 文件中。而 PyTorch 神经网络框架提供了 load 方法,可以很方便地读取文件中保存的参数,但输出格式为张量,无法直接使用。故先转换为 Numpy[61]的数据格式,再提取其中的参数,以固定的格式保存数据。

 

class Detect(nn.Module): stride = None # strides computed during build onnx_dynamic = False # ONNX export parameter def __init__(self, nc=80, anchors=(), ch=(), inplace=True): # detection layer super().__init__() self.nc = nc # number of classes self.no = nc + 5 # number of outputs per anchor self.nl = len(anchors) # number of detection layers self.na = len(anchors[0]) // 2 # number of anchors self.grid = [torch.zeros(1)] * self.nl # init grid self.anchor_grid = [torch.zeros(1)] * self.nl # init anchor grid self.register_buffer('anchors', torch.tensor(anchors).float().view(self.nl, -1, 2)) # shape(nl,na,2) self.m = nn.ModuleList(nn.Conv2d(x, self.no * self.na, 1) for x in ch) # output conv self.inplace = inplace # use in-place ops (e.g. slice assignment) def forward(self, x): z = [] # inference output for i in range(self.nl): x[i] = self.m[i](x[i]) # conv bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() if not self.training: # inference if self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]: self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i) y = x[i].sigmoid() if self.inplace: y[..., 0:2] = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i] # xy y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # wh else: # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953 xy = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i] # xy wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, y[..., 4:]), -1) z.append(y.view(bs, -1, self.no)) return x if self.training else (torch.cat(z, 1), x) def _make_grid(self, nx=20, ny=20, i=0): d = self.anchors[i].device if check_version(torch.__version__, '1.10.0'): # torch>=1.10.0 meshgrid workaround for torch>=0.7 compatibility yv, xv = torch.meshgrid([torch.arange(ny).to(d), torch.arange(nx).to(d)], indexing='ij') else: yv, xv = torch.meshgrid([torch.arange(ny).to(d), torch.arange(nx).to(d)]) grid = torch.stack((xv, yv), 2).expand((1, self.na, ny, nx, 2)).float() anchor_grid = (self.anchors[i].clone() * self.stride[i]) \ .view((1, self.na, 1, 1, 2)).expand((1, self.na, ny, nx, 2)).float() return grid, anchor_grid

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分