部分修改人脸检测网络做多类物体检测实例,板上运行卡死问题



  • 以demo中的人脸检测网络为基础,进行了部分修改,想要做多类物体检测的应用,但是修改后的网络训练结果,放入rainman板中进行测试,却只显示了pre_prepare的时间,然后就没有显示了(license已经check过了)

    网络结构修改后如下:

    end_points = {}
        with tf.variable_scope(scope, 'ssd_KYnet_v2', [inputs], reuse=reuse):
                net = slim.repeat(inputs, 2, slim.conv2d, 32, [3, 3], scope='conv1')
                end_points['block1'] = net
                net = slim.max_pool2d(net, [2, 2], scope='pool1')
                # Block 2.
                net = slim.repeat(net, 2, slim.conv2d, 64, [3, 3], scope='conv2')
                end_points['block2'] = net
                net = slim.max_pool2d(net, [2, 2], scope='pool2')
                # Block 3.
                net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv3')
                end_points['block3'] = net
                net = slim.max_pool2d(net, [2, 2], scope='pool3')
                # Block 4.
                net = slim.repeat(net, 2, slim.conv2d, 256, [3, 3], scope='conv4')
                end_points['block4'] = net
                net = slim.max_pool2d(net, [2, 2], scope='pool4')
                # Block 5.
                net = slim.repeat(net, 2, slim.conv2d, 256, [3, 3], scope='conv5')
                end_points['block5'] = net
    
                net = slim.conv2d(net, 256, [3, 3], scope='conv6')
                end_points['block6'] = net
                net = slim.conv2d(net, 256, [3, 3], scope='conv7')
                end_points['block7'] = net
                #net = tf.layers.dropout(net, rate=dropout_keep_prob, training=is_training)
    
                # Block 8/9/10/11: 1x1 and 3x3 convolutions stride 2 (except lasts).
                end_point = 'block8'
                with tf.variable_scope(end_point):
                    net = slim.conv2d(net, 128, [3, 3], scope='conv3x3_1') #32
                    net = slim.conv2d(net, 128, [3, 3], scope='conv3x3_2') #32
                    net = slim.max_pool2d(net, [2, 2], scope='pool') #16
                end_points[end_point] = net #16
                end_point = 'block9'
                with tf.variable_scope(end_point):
                    net = slim.conv2d(net, 128, [3, 3], scope='conv3x3_1') #16
                    net = slim.conv2d(net, 128, [3, 3], scope='conv3x3_2') #16
                    net = slim.max_pool2d(net, [2, 2], scope='pool') #8
                end_points[end_point] = net
                end_point = 'block10'
                with tf.variable_scope(end_point):
                    net = slim.conv2d(net, 128, [1, 1], scope='conv1x1') #8
                    net = slim.max_pool2d(net, [2, 2], scope='pool') #4
                end_points[end_point] = net
    

    将训练后的checkpoint根据tutorial的步骤,生成board_files文件放入rainman板中,运行c++代码。

    按照demo的流程,应该显示pre_prepare的时间,处理的时间等等,然后生成一张处理后的图片。但是整个程序在pre后就不动了。

    检查生成的model_hdl_sg.pbtxt文件内容,在这个节点的参数显示如下:
    0_1542801879473_3027e6cc-bc86-4304-9397-a48997aa3705-image.png

    depth若不是4的倍数,导致卡死(或者说计算无法进行),可以从哪里解决这个问题呢?



  • @shiny
    在我们的网络中,数据的并行度默认为4,因此当filter的大小不是4的整数倍时,运算便无法进行。

    所以在入门教程3中使用plumber导出数据时,我们建议使用5_plumber_export_data.sh脚本进行模型参数的导出。

    avatar
    可以观察到,在脚本中调用了一个filter_change.py的文件,该文件能将卷积的参数自动补零为4的整数倍,这一过程我们称为PF(Filter Parallel)转换。而在入门教程3中,如果直接使用用作解释的plumber_cli命令是无法完成PF转换的。

    如果使用的是脚本进行转换,而且也发生了同样的问题,麻烦将模型的checkpoint文件发给我们,非常感谢!


登录后回复