Toybrick

求助!多线程mobilenet ssd的C代码推断出错

回帖奖励 6 金钱 回复本帖可获得 2 金钱奖励! 每人限 2 次

Devin

中级会员

积分
452
楼主
发表于 2020-2-25 18:08:33    查看: 6605|回复: 8 | [复制链接]    打印 | 显示全部楼层
模型是用caffe训练的mobilenet ssd模型转rknn的,检测类别为2(背景和行人),输入视频流大小640x480的,网络Input尺寸是300x300x3大小。推理出现内存报错。
之前用MIN_SCORE的大小跟demo中设置一样,出现了:validCount too much问题,现在将其设为0.9时,报错解决。但是出现了内存报错(free(): invalid next size (fast)munmap_chunk(): invalid pointer以及Segmentation fault等),但官方demo没有出现该问题。。。代码在附件,请大佬帮忙看下,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

Devin

中级会员

积分
452
沙发
 楼主| 发表于 2020-2-26 18:23:18 | 显示全部楼层
1. 模型转换是在PC的Ubuntu虚拟机上做的,rknn-toolkit的版本是1.2.0;
2. rknn-api的版本为1.2.0,driver驱动版本为0.9.9;
3. 在第一次出现内存报错时,我尝试逐行cout去查找出错位置,发现在ret = test.load_model(model_path);之后报错,跟进去继续查找,发现common中rknn_test.cpp文件里int rknn_test::load_model(const char *path)这个函数中new的一个变量没释放,尝试加了delete[],报错变成Segmentation fault等内存报错;
4. ssd_demo_person.cpp中目前相比ssd_demo.cpp,目前只把NUM_CLASSES改为2,MIN_SCORE改为0.9,其他没做修改。
补充:在转换模型时,发现如果只去掉detection_out层,会出现
  1. --> Loading model
  2. W Warning: Axis may need to be adjusted according to original model shape.
  3. W Warning: Axis may need to be adjusted according to original model shape.
  4. W Unhandle status: the input shape of reshape layer mbox_conf_reshape_116 is not 4-D
  5. done
  6. --> Building model
  7. W Warning: Axis may need to be adjusted according to original model shape.
  8. W Warning: Axis may need to be adjusted according to original model shape.
  9. W Unhandle status: the input shape of reshape layer mbox_conf_reshape_116 is not 4-D
  10. done
  11. --> Init runtime environment
  12. W [RK_nn_softmax_compute:45]Softmax's beta is 0. Set beta to 1
  13. done
  14. --> Running model
  15. done
复制代码

最后的推断结果显示的图上是十分密集的框,于是,我把网络中detection_out层之前的reshape,softmax和flatten这三层也去掉进行转换,发现不再出现以上关于reshape和softmax的warning,并且最后推理结果不再出现密集的框,而是多个框(并没有进行量化,不清楚为啥会是多个框)。因为网络结构没改,输进网络尺寸跟demo给的一样300x300x3,所以priorbox.txt也直接用的demo提供的。模型转换代码和文件在附件。
谢谢!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

Devin

中级会员

积分
452
板凳
 楼主| 发表于 2020-2-27 08:22:00 | 显示全部楼层
本帖最后由 Devin 于 2020-2-27 08:24 编辑
Devin 发表于 2020-2-26 18:23
1. 模型转换是在PC的Ubuntu虚拟机上做的,rknn-toolkit的版本是1.2.0;
2. rknn-api的版本为1.2.0,driver驱 ...

这是删了reshpe,softmax和flatten三层后转rk得到的推理结果(无量化):file:///G:/share/detectOut.jpg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

Devin

中级会员

积分
452
地板
 楼主| 发表于 2020-2-27 17:19:59 | 显示全部楼层
troy 发表于 2020-2-27 14:59
关于第三点,你说的rknn_test::load_model中new的变量没有释放,你是指output_size吗?如果是,在load_mo ...

谢谢版主。前面已经有释放了,那里确实不用。您指的是load_model里的output_size[0]和output_size[1]的大小是吗?它们分别是30672(1917x16)和15336(1917x8)。转模型时推理的结果outputs[0]大小是1917x4,outputs[1]的大小是1917x2。不一致。。请问怎么解决呢
回复

使用道具 举报

Devin

中级会员

积分
452
5#
 楼主| 发表于 2020-2-29 12:31:31 | 显示全部楼层
troy 发表于 2020-2-28 08:53
1.确定caffemodel实际的输出形状,你可以用https://lutzroeder.github.io/netron/加载caffe模型,查看你 ...

1. caffemodel的实际输出形状如下图。
2. 这点不太清楚“选择的输出节点”,TF转rk是有output节点的,以下是rknn-toolkit1.2.0中mobilenet ssd中模型转化时加载原模型部分:
#rknn.load_tensorflow(tf_pb='./ssd_mobilenet_v1_coco_2017_11_17.pb',
     #                    inputs=['FeatureExtractor/MobilenetV1/MobilenetV1/Conv2d_0/BatchNorm/batchnorm/mul_1'],
     #                    outputs=['concat', 'concat_1'],
     #                    input_size_list=[[INPUT_SIZE, INPUT_SIZE, 3]])
但是load_caffe这里没有outputs:   
    ret = rknn.load_caffe(model='MobileNetSSD_deploy_std_truncate.prototxt',
                          proto='caffe',
                          blobs='ssd_iter_37985.caffemodel')
3. ssd.py获取的inference输出数据outputs[0]为1917x4(框的4个值),outputs[1]为1917x2(两类)。跟caffe模型输出节点是一致的。
回复

使用道具 举报

Devin

中级会员

积分
452
6#
 楼主| 发表于 2020-2-29 12:32:40 | 显示全部楼层
caffemodel

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表