1.mobilenet Դ?码解????
2.理解MobileNetV2
3.Fruit-Dataset水果数据集+水果分类识别训练代码(支持googlenet, resnet, inception_v3, mobilenet_v2)
mobilenet Դ?????
本文为《面部表情识别》系列之《Android实现表情识别(含源码,可实时检测)》的码解分享,旨在将已训练好的码解面部表情识别模型移植到Android平台,开发一个实时运行的码解面部表情识别Android Demo。模型采用轻量级的码解mobilenet_v2,实现的码解java 集合框架 源码准确率可达.%,基本满足业务性能需求。码解
项目详细指导如何将模型部署到Android中,码解包括模型的码解转换为ONNX、TNN等格式,码解并在Android上进行部署,码解实现一个表情识别的码解Android Demo APP。此APP在普通Android手机上能实现实时检测识别,码解CPU环境下约ms,码解GPU环境下约ms,码解基本满足业务性能要求。
以下为Android版本表情识别Demo效果展示:
Android面部表情识别APP Demo体验: download.csdn.net/downl...
或链接: pan.baidu.com/s/OOi-q... 提取码: cs5g
更多《面部表情识别》系列文章请参阅:
1.面部表情识别方法:采用基于人脸检测+面部表情分类识别方法。利用现有的人脸检测模型,无需重新训练,减少标注成本。易于采集人脸数据,分类模型针对性优化。
2.人脸检测方法:使用轻量化人脸检测模型,可在普通Android手机实时检测,模型体积仅1.7M左右。群发猫viber源码参考链接: /Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB 。
3.面部表情识别模型训练:训练方法请参考另一篇博文《面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码)》。
4.面部表情识别模型Android部署:采用TNN进行Android部署。部署流程包括:模型转换为ONNX模型,ONNX模型转换为TNN模型,Android端上部署TNN模型。
具体部署步骤如下:
(1) 将Pytorch模型转换为ONNX模型。
(2) 将ONNX模型转换为TNN模型。
(3) 在Android端部署TNN模型。
5.运行效果:在普通手机CPU/GPU上实现实时检测和识别,CPU环境下约ms,GPU环境下约ms。
遇到的常见问题及解决方法:如果在运行APP时遇到闪退问题,可以参考解决方法:解决dlopen失败:找不到libomp.so库,请访问相关博客。
Android SDK和NDK相关版本信息请查阅相应文档。
项目源码下载地址: 面部表情识别3:Android实现表情识别(含源码,可实时检测)
项目包含内容:Android面部表情识别APP Demo体验链接。
理解MobileNetV2
和MobielNetV1相比, MobileNet V2 仍使用深度可分离卷积,但其主要构成模块如下图1所示:
这次block中有三个卷积层,作者分别将其称之为1 x 1 expansion layer、3 x 3 depthwise convolution和1 x 1 projection layer。后两层其实就是源码售卖网站搭建V1中的depthwise convolution和1×1 pointwise convolution layer,只不过在V2中,作者后者称为1 x 1 projection layer,并有不同的作用。下面就来看看,两者的差异究竟在哪里。
在V1中,逐点卷积要么使通道数保持不变,要么使通道数翻倍。 在V2中,情况恰恰相反:它使通道数变小。 这就是为什么现在将该层称为投影层( Projection Layer)的原因:它将具有大量维(通道)的数据投影到具有较少维数的张量中。
例如,depthwise convolution可以在具有个通道的张量上工作,然后projection layer张量缩小至个通道。这种层也称为bottleneck layer,因为它减少了流经网络的数据量。(这就体现了“bottleneck residual block”名称的一部分:每个块的输出都是瓶颈。)
此外,bottleneck residual block的第一层是新出现的,也就是expansion layer。 它也是1×1卷积, 其目的是在数据进入深度卷积之前扩展数据中的通道数。 因此,expansion layer始终具有比输入通道更多的王者荣耀火山源码输出通道(与projection layer相反)。
Expansion layer将通道数扩展多少倍,这个由扩展因子(expansion factor)给出。 这也是调整不同架构的超参数之一, 默认扩展因子为6。
例如图2所示,如果有一个具有个通道的张量进入一个bottleneck residual block,则expansion layer首先将其转换为具有 x 6 = 个通道的新张量。 接下来,depthwise convolution将其滤波器应用于该通道张量。 最后,projection layer将个过滤后的通道投影回较小的数量,比如说个。
因此,bottleneck residual block的输入和输出是低维张量,而block内发生的滤波步骤是在高维张量上完成的。
思考一下,这样做的好处是什么?
Bottleneck residual block体现了其还存在另一部分,那就是逆残差连接(inverted residual connection),这也是MobileNetV2与MobileNetV1的不同之处。就像在ResNet中一样,它的存在是为了帮助梯度流过网络。只有当进入block的通道数与从block出来的通道数相同时(如图2),才使用inverted residual connection,但并非总是桃源码头火锅如此,因为每隔几个块输出通道就增加一次。
一般来说,每个层都有批量归一化,激活层则是ReLU6。 但是,projection layer的输出没有应用激活功能。作者发现,在该层之后使用非线性激活,实际上会破坏低维数据中有用的信息。
这样,MobileNet V2将连续包含个这样的block,然后是规则的1×1卷积、全局平均池化层和分类层。
注意:第一个block稍有不同,它使用具有个通道的常规3×3卷积代替扩展层。
具体架构也可见下表。t是扩展因子,c是输出通道数,n是block的重复次数,s是步长,depthwise convolution的卷积核大小均为3 x 3。
V2体系结构的主要变化是残差连接和扩展/投影层。
对于这种模型,通道数随时间增加,空间尺寸也会相应减少。 但总体而言,由于构成块之间连接的瓶颈层,张量保持相对较小,。如图3所示,我们可以看到数据流经V2网络的情况。
相比之下,V1就使其张量变得更大(最大为7×7×)。
使用低维张量是减少计算量的关键。 毕竟,张量越小,卷积层要做的乘法就越少。
但是,仅使用低维张量并不能获得很好的效果!
因为应用卷积层过滤低维张量将无法提取大量信息。 考虑到这个因素,作者首先使用了expansion layer,得到大张量,s使用depthwise convolution对数据进行过滤;然后使用projection layer减小张量。可以说在这方面, MobileNet V2的模块设计做到了两全其美。
举例如图4所示,将块之间流动的低维数据视为真实数据的压缩包。Expansion layer充当解压缩器,它首先将数据还原为完整格式,然后depthwise layer执行重要的滤波工作,最后projection layer将数据压缩以使其再次变小 。
通过学习扩展层和投影层的参数,模型能够在网络的每个阶段最佳地(解)压缩数据。
至此,我们也就能理解,为什么作者将文中的残差连接方式称为“inverted residuals”,我们可以比较一下normal和inverted残差块的区别,如图5所示。
图5中,使用阴影线标记的block后面没有非线性层,通过每个block的宽度来表示相对通道数量。
我们首先从学习的参数和所需的计算量开始,比较MobileNet V1和V2模型的大小。
数据来源于 V1和 V2,它们采用的width multiplier均为1.0,数据越小代表效果越好。
MACs是乘法累加运算,这可测量对单张× RGB图像进行推理所需的计算量。图像越大,需要的MAC越多。
仅从MAC数量来看,V2的速度应该几乎是V1的两倍。 但是,这不仅仅涉及计算数量。 在移动设备上,内存访问比计算慢得多。 不过,这里V2也有优势:它的参数量只有V1的%。
接下来是准确率的比较。
这里的Top-1 Accuracy和Top-5 Accuracy是在 ImageNet上获得的, 源代码作者声称结果来自与测试集,但查看代码后,结果似乎是从,张图像的验证集上获得的。
其实,比较模型之间的准确度可能会产生误导,因为我们需要准确了解模型的评估方式。 为了获得上述数字,将图像的中心区域裁剪到包含原始图像的.5%的区域,然后将该裁剪的大小调整为×像素。
为了验证V1和V2在语义分割方面的能力,作者选用了PASCAL VOC dataset用来验证,(1)V1和V2分别作为DeepLabv3的特征提取器,(2)简化了DeepLabv3训练头,来加快计算,(3)使用了不同的推理策略来优化运行效果。验证的结果如下表所示。
我们能够得到以下分析结果:
(1)某些推理策略,比如多尺度输入、增加左右翻转的图像,会极大增加乘法累加量,因此不适合于移动设备的应用;
(2)使用output stride = 的效率要比output stride = 8的效率高;
(3)MobileNetV1已经是强大的功能提取器,其所需的乘法累加量比ResNet- 少4.9-5.7倍;
(4)在MobileNetV2的倒数第二个特征图后构建DeepLabv3训练头的效率更高,因为倒数第二个特征图包含个通道,而不是个。因此,在获得类似性能的情况下,但是MobileNetV2所需的运算量比MobileNetV1少2.5倍。
(5)DeepLabv3原先的分割头十分消耗计算力,若删除ASPP模块能够显著降低计算量,但性能只会略微下降。
Fruit-Dataset水果数据集+水果分类识别训练代码(支持googlenet, resnet, inception_v3, mobilenet_v2)
Fruit-Dataset水果数据集+水果分类识别训练代码
本项目利用深度学习技术,提供了一个水果分类识别训练与测试的框架,支持多种模型如googlenet, resnet, inception_v3, mobilenet_v2等。主要涉及以下内容:1. 水果数据集
Fruit-Dataset:包含种水果,总计,张图像,是训练水果分类模型的理想资源。部分数据需自行清洗,以确保模型识别准确度。
Fruits 蔬果数据集:包含种水果,张高质量,适合研究,但不适合实际应用,因为背景多为白色,且存在大量相似角度的。
自定义数据集:支持新增类别或自定义数据进行训练。
2. 训练过程
项目基于Fruit-Dataset,框架包括数据准备、配置文件设置、训练开始、训练可视化以及优化建议。配置文件config.yaml用于调整训练参数。3. 模型效果
初始模型在Fruit-Dataset上的测试结果显示,训练集Accuracy约为%,测试集Accuracy为%。通过调整模型和数据,有望进一步提升性能。4. 下载与测试
源码下载地址提供完整训练代码,demo.py文件用于模型的推理和测试。