MaochengHu 576cda45b8 first commit | 2 tahun lalu | |
---|---|---|
.. | ||
search_space | 2 tahun lalu | |
README.md | 2 tahun lalu | |
blazeface.yml | 2 tahun lalu | |
latency_855.txt | 2 tahun lalu | |
train_nas.py | 2 tahun lalu |
运行该示例前请安装Paddle1.6或更高版本
我们选取人脸检测的BlazeFace模型作为神经网络搜索示例,该示例使用PaddleSlim
辅助完成神经网络搜索实验,具体技术细节,请您参考神经网络搜索策略。
基于PaddleSlim进行搜索实验过程中,搜索限制条件可以选择是浮点运算数(FLOPs)限制还是硬件延时(latency)限制,硬件延时限制需要提供延时表。本示例提供一份基于blazeface搜索空间的硬件延时表,名称是latency_855.txt(基于PaddleLite在骁龙855上测试的延时),可以直接用该表进行blazeface的硬件延时搜索实验。
硬件延时表每个字段的含义可以参考:硬件延时表说明
在BlazeFace模型的搜索实验中,我们采用了SANAS的方式进行搜索,本次实验会对网络模型中的通道数和卷积核尺寸进行搜索。 所以我们定义了如下搜索空间:
blaze_filter_num1
:定义了BlazeFace第一个模块中通道数变化区间,人为定义了较小的通道数区间;blaze_filter_num2
: 定义了BlazeFace单blaze模块中通道数变化区间,人为定义了适中的通道数区间;mid_filter_num
:定义了BlazeFace由单blaze模块到双blaze模块的过渡区间;double_filter_num
:定义了BlazeFace双blaze模块中通道数变化区间,人为定义了较大的通道数区间;use_5x5kernel
:定义了BlazeFace中卷积和尺寸大小是3x3或者5x5。由于提供的延时表中只统计了3x3卷积的延时,所以启动硬件延时搜索实验时,需要把卷积核尺寸固定为3x3。根据定义的搜索空间各个区间,我们的搜索空间tokens共9位,变化区间在([0, 0, 0, 0, 0, 0, 0, 0, 0], [7, 9, 12, 12, 6, 6, 6, 6, 2])范围内。硬件延时搜索实验时,token的变化区间在([0, 0, 0, 0, 0, 0, 0, 0, 0], [7, 9, 12, 12, 6, 6, 6, 6, 1])范围内。
9位tokens分别表示:
我们人为定义三个单blaze模块与4个双blaze模块,定义规则如下:
blaze_filters = [[self.blaze_filter_num1[tokens[0]], self.blaze_filter_num1[tokens[0]]],
[self.blaze_filter_num1[tokens[0]], self.blaze_filter_num2[tokens[1]], 2],
[self.blaze_filter_num2[tokens[1]], self.blaze_filter_num2[tokens[1]]]]
double_blaze_filters = [
[self.blaze_filter_num2[tokens[1]], self.mid_filter_num[tokens[4]], self.double_filter_num[tokens[2]], 2],
[self.double_filter_num[tokens[2]], self.mid_filter_num[tokens[5]], self.double_filter_num[tokens[2]]],
[self.double_filter_num[tokens[2]], self.mid_filter_num[tokens[6]], self.double_filter_num[tokens[3]], 2],
[self.double_filter_num[tokens[3]], self.mid_filter_num[tokens[7]], self.double_filter_num[tokens[3]]]]
blaze_filters与double_blaze_filters字段请参考blazenet.py中定义。
初始化tokens为:[2, 1, 3, 8, 2, 1, 2, 1, 1]。
首先需要安装PaddleSlim,请参考安装教程。
然后进入 slim/nas
目录中,修改blazeface.yml配置,配置文件中搜索配置字段含义请参考NAS-API文档
配置文件blazeface.yml中的Constraint
字段表示当前搜索实验的搜索限制条件实例:
ctype
:具体的限制条件,可以设置为flops或者latency,分别表示浮点运算数限制和硬件延时限制。max_constraint
:限制条件的最大值。min_constraint
:限制条件的最小值。table_file
:读取的硬件延时表文件的路径,这个字段只有在硬件延时搜索实验中才会用到。然后开始搜索实验:
cd slim/nas
python -u train_nas.py -c blazeface.yml
注意:
搜索过程中为了加速,在blazeface.yml
中去掉了数据预处理CropImageWithDataAchorSampling
的操作。
训练完成后会获得最佳tokens,以及对应的BlazeFace-NAS
的网络结构:
------------->>> BlazeFace-NAS structure start: <<<----------------
BlazeNet:
blaze_filters: XXX
double_blaze_filters: XXX
use_5x5kernel: XXX
with_extra_blocks: XXX
lite_edition: XXX
-------------->>> BlazeFace-NAS structure end! <<<-----------------
根据搜索得到的BlazeFace-NAS
的网络结构修改blazeface.yml
中的BlazeNet
模块。
启动完整的训练评估实验,可参考PaddleDetection的训练、评估与预测流程
请参考人脸检测模型库中BlazeFace-NAS的实验结果。
socket.error: [Errno 98] Address already in use
。解决方法:当前端口被占用,请修改blazeface.yml中的server_port
端口。
not enough space for reason[failed to malloc 601 pages...
解决方法:当前reader的共享存储队列空间不足,请增大blazeface.yml中的memsize
。