疫情期间百度PaddlePaddle团队推出深度学习7日入门-CV疫情特辑课程,我着实体验了一下。7天的打卡课程都是理论与实践相结合,而且采用的都是非常流行的项目,一下子就激发了我对PaddlePaddle这个深度学习框架的兴趣。
5个新冠疫情最新实战案例和1场人流密度实战比赛,所有项目实践都是基于百度aistudio平台,最开心的还是能用上免费的Tesla V100。简单说一下整个学习的心得体会吧。
第一天打卡是一个新冠疫情可视化的项目,主要是爬取丁香园的统计数据并使用Pyecharts绘制疫情分布图。这个python的小项目让我学习到了pyecharts这个强大的可视化工具,可以将各种图表优雅地呈现出来。Pycharts api可参考:https://pyecharts.org/#/zh-cn/
接下来三天都是图像识别相关的项目,分别是手势识别,车牌识别和口罩识别。这几个项目都是练习PaddlePaddle搭建cnn网络以及进行模型训练预测,可以说PaddlePaddle搭建训练pipeline还是比较方便的。基于动态图实现的VGG代码如下,感觉比较类似Pytorch。
class ConvPool(fluid.dygraph.Layer):
'''卷积+池化'''
def __init__(self,
num_channels,
num_filters,
filter_size,
pool_size,
pool_stride,
groups,
pool_padding=0,
pool_type='max',
conv_stride=1,
conv_padding=0,
act=None):
super(ConvPool, self).__init__()
self._conv2d_list = []
for i in range(groups):
conv2d = self.add_sublayer( #返回一个由所有子层组成的列表。
'bb_%d' % i,
fluid.dygraph.Conv2D(
num_channels=num_channels, #通道数
num_filters=num_filters, #卷积核个数
filter_size=filter_size, #卷积核大小
stride=conv_stride, #步长
padding=conv_padding, #padding大小,默认为0
act=act)
)
self._conv2d_list.append(conv2d)
self._pool2d = fluid.dygraph.Pool2D(
pool_size=pool_size, #池化核大小
pool_type=pool_type, #池化类型,默认是最大池化
pool_stride=pool_stride, #池化步长
pool_padding=pool_padding #填充大小
)
def forward(self, inputs):
x = inputs
for conv in self._conv2d_list:
x = conv(x)
x = self._pool2d(x)
return x
基于fluid.dygraph.Layer这个类先定义基本的模块,然后定义网络部分,其中forward函数中的代码就代表了前向传播过程。
通过这种方式可以很快地搭建各种网络。
class VGGNet(fluid.dygraph.Layer):
'''
VGG网络
'''
def __init__(self):
super(VGGNet, self).__init__()
self.convpool01 = ConvPool(3, 64, 3, 2, 2, 2, conv_padding=1, act="relu")
self.convpool02 = ConvPool(64, 128, 3, 2, 2, 2, conv_padding=1, act="relu")
self.convpool03 = ConvPool(128, 256, 3, 2, 2, 3, conv_padding=1, act="relu")
self.convpool04 = ConvPool(256, 512, 3, 2, 2, 3, conv_padding=1, act="relu")
self.convpool05 = ConvPool(512, 512, 3, 2, 2, 3, conv_padding=1, act="relu")
self.pool_5_shape = 512 * 7 * 7
self.fc01 = fluid.dygraph.Linear(self.pool_5_shape, 4096, act="relu")
self.fc02 = fluid.dygraph.Linear(4096, 4096, act="relu")
self.fc03 = fluid.dygraph.Linear(4096, 2, act="softmax")
def forward(self, inputs, label=None):
"""前向计算"""
out = self.convpool01(inputs)
out = self.convpool02(out)
out = self.convpool03(out)
out = self.convpool04(out)
out = self.convpool05(out)
out = fluid.layers.reshape(out, shape=[-1, self.pool_5_shape])
out = self.fc01(out)
out = self.fc02(out)
out = self.fc03(out)
if label is not None:
acc = fluid.layers.accuracy(out, label)
return out, acc
return out
图像分类任务是CV的基础,在时间过程中通过改进代码调参让测试准确率从baseline一点点提升到较高的水平是最有价值的过程。PaddlePaddle有丰富的api可以实现各种调参trick,像dropout,batchnormalization,groupnormalization,l2regularization, lr decay等等都可以很轻松地实现。另外数据增强则推荐使用PIL库,尝试各种技巧不一定每次都能让模型准确度提升,毕竟训练神经网络是一个多参数配合的过程,只有练得多了才更容易找到最佳的方向。
除了图像分类任务外,还有一个人流密度检测的比赛项目。这个稍微难一些,baseline方案是用cnn生成一个热点图进行统计来预测出人的数量。这个任务需要对groundtruth进行处理,得到用于计算损失函数的热力图,我做这个任务时立刻联想到了centernet,于是尝试用了类似的反卷积思想。不过比赛发布后大家积极性很高,我几乎也抢不到GPU,只能草草地提交了几次结果,后面有空再继续调一下模型。
最后还有一个PaddleSlim模型压缩,真心觉得PaddlePaddle在工业部署上优势明显。PaddleSlim包含了模型裁减/量化/蒸馏/nas这些主流的模型压缩方法,经过模型压缩推理速度显著提高,甚至精度还可能不减反升,意外吧。
PaddleSlim相关api文档可以看https://paddlepaddle.github.io/PaddleSlim/api_cn/index.html
除了PaddleSlim,像PaddleDetection,PaddleSeg也是PaddlePaddle的精品大作,对CV感兴趣的小伙伴们也不要错过。也期待PaddlePaddle继续带来更多的惊喜。