0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解ENet:CPU可以实时的道路分割网络

电子设计 来源:电子设计 作者:电子设计 2020-12-15 00:18 次阅读

来源:OpenCV学堂
作者:gloomyfish

前言

OpenCV DNN模块支持的图像语义分割网络FCN是基于VGG16作为基础网络,运行速度很慢,无法做到实时语义分割。2016年提出的ENet实时语义分割网络基于编码与解码的网络语义分割方式,类似UNet网络,通过构建自定义Block块,在Cityscapes, CamVid, SUN数据集上实现了性能与实时双提高。

ENet网络结构

作者从ResNet网络结构设计中收到启发,定义两个新的Block结构,如下:

其中a是初始Block,非重叠2x2最大池化,左侧卷积步长为2,然后13个filters之连接合并,该结构注意是收到了Inception改进模型的启发。B是ENet的bottleneck模块,其中卷积可能是正常卷积、空洞卷积、反卷积,使用3x3或者5x5的filters,最终合并在一起是按空间位置相加。两个1x1的卷积分别用来降低维度与扩展,使用BN/Dropout正则化,PReLU非线性激活。最终的ENet网络模型结构如下:

其中stage2跟stage3结构相同,stage4跟stage5属于解码部分。

设计考量

常见的深度学习语义分割模型在下采样操作上的两个缺点:一是降低Feature Map的分辨率会导致图像空间信息损失,特别是图像边缘信息,这个对语义分割精度有明显影响;二是像素级别的语义分割网络要求输入跟输出的分辨率保持一致,这个就要求强的下采样跟强的上采样必须对称,这个增加了模型的计算与参数量。其中第一个问题在FCN与SegNet网络中通过在编码阶段叠加Feature Map与在解码阶段通过稀疏上采样来抑制,但是强的下采样依然对整个语义分割精度有伤害,要在设计时候适当的加以限制。

但是下采样同样可以帮助获得较大的感受野,区分不同的类别,作者发现空洞卷积在这个方面特别有帮助,ENet为了获得实时性能,采用了早期下采样策略来降低计算SegNet跟UNet都是对称的网络结构,ENet采用大的编码网络,小的解码网络实现的不对称结构,编码网络实现分类任务,解码网络主要是优化细节,更好的输出结果。

此外作者在设计过程中还考虑了非线性激活、空洞卷积、正则化方式的影响。

OpenCV DNN使用ENet道路分割

OpenCV DNN模块从OpenCV4.0版本开始支持ENet网络模型加载与解析,其中的道路分割模型可以从下面的地址下载

https://github.com/e-lab/ENet-training

在OpenCV DNN使用该模型时转换Blob输入相关参数信息如下:

mean: [0, 0, 0]

scale: 0.00392

width: 512

height: 256

rgb: true

classes: "enet-classes.txt"

其中分类文件enet-classes.txt可以从OpenCV的sample/data/dnn中发现。输出的数据格式为:Nx20xHxW,其中N=1表示每次输入的一张图像,20是基于Cityscapes数据集训练的20个类别标签,H跟W是输入时图像分辨率(512x256)。

最初版本代码实现

该代码实现是来自C++版本的翻译,完整的演示代码如下:

#loadCNNmodelbin_model="D:/projects/models/enet/model-best.net";net=cv.dnn.readNetFromTorch(bin_model)#readinputdataframe=cv.imread("D:/images/software.jpg");blob=cv.dnn.blobFromImage(frame,0.00392,(512,256),(0,0,0),True,False);cv.imshow("input",frame)#Runamodelnet.setInput(blob)score=net.forward()#Putefficiencyinformation.t,_=net.getPerfProfile()label='Inferencetime:%.2fms'%(t*1000.0/cv.getTickFrequency())print(score.shape)#generatecolortablecolor_lut=[]n,con,h,w=score.shapeforiinrange(con):b=np.random.randint(0,256)g=np.random.randint(0,256)r=np.random.randint(0,256)color_lut.append((b,g,r))maxCl=np.zeros((h,w),dtype=np.int32);maxVal=np.zeros((h,w),dtype=np.float32);#findmaxscorefor20channelsonpixel-wiseforiinrange(con):forrowinrange(h):forcolinrange(w):t=maxVal[row,col]s=score[0,i,row,col]ifs>t:maxVal[row,col]=smaxCl[row,col]=i#colorfulthesegmentationimagesegm=np.zeros((h,w,3),dtype=np.uint8)forrowinrange(h):forcolinrange(w):index=maxCl[row,col]segm[row,col]=color_lut[index]h,w=frame.shape[:2]segm=cv.resize(segm,(w,h),None,0,0,cv.INTER_NEAREST)print(segm.shape,frame.shape)frame=cv.addWeighted(frame,0.2,segm,0.8,0.0)cv.putText(frame,label,(0,15),cv.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0))cv.imshow("ENet-Demo",frame)cv.imwrite("D:/result.png",frame)cv.waitKey(0)cv.destroyAllWindows()

总的来说比较啰嗦!

修改后代码熟实现

上面是我在2019年3月份时候在OpenCV研习社 的代码分享,当时主要是把C++代码直接翻译过来,并没有太多考虑,今天又重新看了一下感觉自己写了点垃圾代码,所以重新整理了一下,把输出解析的部分基于Numpy跟OpenCV-Python函数做了简化,最终得到的代码如下:

 1#loadCNNmodel 2bin_model="D:/projects/models/enet/model-best.net"; 3net=cv.dnn.readNetFromTorch(bin_model) 4#readinputdata 5frame=cv.imread("D:/images/spacecity.png"); 6blob=cv.dnn.blobFromImage(frame,0.00392,(512,256),(0,0,0),True,False); 7cv.imshow("input",frame) 8h,w,c=frame.shape 910#Runamodel11net.setInput(blob)12score=net.forward()13#Putefficiencyinformation.14t,_=net.getPerfProfile()15label='Inferencetime:%.2fms'%(t*1000.0/cv.getTickFrequency())16score=np.squeeze(score)17score=score.transpose((1,2,0))18score=np.argmax(score,2)19mask=np.uint8(score)20mask=cv.cvtColor(mask,cv.COLOR_GRAY2BGR)21cv.normalize(mask,mask,0,255,cv.NORM_MINMAX)22cmask=cv.applyColorMap(mask,cv.COLORMAP_JET)23cmask=cv.resize(cmask,(w,h))24dst=cv.addWeighted(frame,0.7,cmask,0.3,0)25cv.putText(dst,label,(50,50),cv.FONT_HERSHEY_SIMPLEX,0.75,(0,0,255),2)26cv.imshow("dst",dst)27cv.waitKey(0)

总的执行时间也大大减少,主要去除了一些无谓的循环解析输出数据部分。CPU上10+FPS 应该没问题!实时get!

审核编辑 黄昊宇

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

    关注

    68

    文章

    10544

    浏览量

    207641
  • 人工智能
    +关注

    关注

    1781

    文章

    44981

    浏览量

    232390
收藏 人收藏

    评论

    相关推荐

    基于模式的实时音频流分割与控制系统

    目前,很多音频相关的应用系统,都迫切要求对音频流进行实时的识别,分割和以某种特定模式(pattern)进行播放,而不再是录音、播放等简单的回放控制。这样的例子很多,如:同声传译系统中,译员以句子为
    发表于 03-05 20:40

    汽车导航软件是如何知道道路实时拥堵情况的

    知道前方道路是否拥堵,属于实况导航。实况导航必须在联网条件下实现,导航软件通过当地交通服务机构获得道路实况,再通过导航界面显示并报告给用户。 道路实时情况来源有几种: 1、早期的
    发表于 11-28 14:42

    Altium Designer 19用颜色区分内电层的各个分割区域的方法

    在进行多层板设计的时候,当PCB中的一个内电层上有多个分割区域的的时候,可以用不同的颜色区别,显示清晰,方便识别分割区域的网络。 其实就是通过改变其所属的
    发表于 09-25 17:50

    C6748 ENET_ECHO例程烧写到NOR后网络起不来

    C6748 的CMD中区都是放在DDR2中,ENET_ECHO例程烧写到NOR没问题,网络正常。发现运行速度慢,尝试CMD修改放到RAM中运行,仿真器可以跑,但是烧写到NOR后网络都起
    发表于 09-26 08:29

    如何通过任务分割提高嵌入式系统的实时性?

    如何通过任务分割提高嵌入式系统的实时性?
    发表于 04-28 07:00

    iMX6UL核心板CPUENET1_TX_CLK信号是可以配置成50Mhz时钟输出吗?

    iMX6UL核心板和开发板之间的以太网RMII接口,将CPUENET1_TX_CLK信号直接连到PHY芯片(KSZ8081RNB)的X1管脚了,此处未使用外部时钟;我有个疑问,这里CPUE
    发表于 01-11 07:27

    请问i.MX 8M PLUS ENET_QOS和ENET1 RGMII可以在2.5v下使用吗?

    您能否说明 ENET_QOS 和 ENET1 RGMII 端口是否可以在 i.MX 8M Plus 上以 2.5v 千兆位模式使用,或者是否必须使用从 1.8v 到 2.5v 的电平转换器?如果需要
    发表于 04-07 06:15

    你能确认ENET-AVB2对应ENET1控制器,ENET-AVB1对应ENET0控制器吗?

    在IMX8X参考手册IMX8DQXPRM中表2-5。连接内存映射给出以下映射:基址 5B05_0000 处的 ENET-AVB2基本地址 5B04_0000 处的 ENET-AVB1 你能确认ENET-AVB2对应
    发表于 04-07 07:47

    rt1052 ENET_ReadFrame返回kStatus_ENET_RxFrameFail,要做什么处理?

    我在使用rt1052时,调用ENET_ReadFrame,如果返回kStatus_ENET_RxFrameFail,需要做什么处理,其返回的代码部分如下:/* 将帧存储在多个缓冲区描述符上
    发表于 04-14 08:20

    ENET_RXBD_NUM值是否影响接收中断响应?

    时间。但是当ENET_RXBD_NUM为4时,我发现网络传输时间超过4ms,而ENET_RXBD_NUM为1时,网络传输时间为200us。为什么差异如此之大?我没有设置RXIC。问题一
    发表于 04-17 06:37

    通过任务分割提高嵌入式系统的实时

    分析长任务对嵌入式系统实时性的影响,在此基础上提出任务分割是提高嵌入式系统实时性的一种有效途径; 总结长任务分割的方法, 给出一个通过任务分割
    发表于 05-15 15:07 4次下载

    一文汇总当前主流的分割网络

    本文的12篇文章总结了当前主流的分割网络及其结构,涵盖从编解码结构到解码器设计;从感受野到多尺度融合;从CNN到RNN与CRF;从2D分割到3D分割;从语义
    的头像 发表于 06-29 09:21 7163次阅读
    一文汇总当前主流的<b class='flag-5'>分割</b><b class='flag-5'>网络</b>

    MELSEC iQ F FX5 ENET硬件手册

    MELSEC iQ-F FX5-ENET 硬件手册 产品规格书.FX5-ENET 型以太网模块 ( 以下简称 FX5-ENET),是智能设备站与 CC-Link IE 现场网络 Ba
    发表于 08-28 09:24 0次下载
    MELSEC iQ F FX5 <b class='flag-5'>ENET</b>硬件手册

    MELSEC iQ F FX5 ENET/IP硬件手册

    MELSEC iQ-F FX5-ENET/IP 硬件手册 产品规格书.FX5-ENET/IP型以太网模块 (以下简称 FX5-ENET/IP),是智能设备站与 EtherNet/IP网络
    发表于 08-28 09:23 1次下载
    MELSEC iQ F FX5 <b class='flag-5'>ENET</b>/IP硬件手册

    MELSEC iQ F FX5 ENET/IP用户手册

    MELSEC iQ-F FX5-ENET/IP 用户手册 产品规格书.FX5-ENET/IP型以太网模块 (以下简称FX5-ENET/IP),是智能设备站与EtherNet/IP网络
    发表于 08-26 15:24 0次下载
    MELSEC iQ F FX5 <b class='flag-5'>ENET</b>/IP用户手册