Toybrick

为什么yolov3输出buffer的大小不对?

hzdxs

注册会员

积分
168
楼主
发表于 2020-6-11 16:12:54    查看: 7444|回复: 9 | [复制链接]    打印 | 只看该作者
以下是打印的信息:
input tensors:
    index=0 name= n_dims=4 dims=[1 3 512 512] n_elems=786432 size=786432 fmt=0 type=3 qnt_type=2 fl=0 zp=0 scale=256.003265
output tensors:
    index=0 name= n_dims=4 dims=[1 81 16 16] n_elems=20736 size=20736 fmt=0 type=3 qnt_type=2 fl=0 zp=215 scale=1629.417725
    rknn_init success!
然后我再rknn_run之后,获取output.buf数据的同时,也获取了output.size,结果却是20736的4倍,我的理解是,既然最后一层输出的float类型数据,那么应该size=20736,
另外后面的scale=1629.417725是什么意思?
output.size:82944

回复

使用道具 举报

leok

版主

积分
894
沙发
发表于 2020-6-12 10:32:31 | 只看该作者
信息贴全一点;  这样截断性信息没办法分析问题。
rknn toolkit版本;  推理脚本; 哪个节点输出有问题;
回复

使用道具 举报

hzdxs

注册会员

积分
168
板凳
 楼主| 发表于 2020-6-12 13:37:51 | 只看该作者
网络是我们自定义的网络,输入1 3 512 512 输出1 81 16 16这都是对的,但是输出的数据size貌似不对,理论上应该是20736 ,但事实上确实20736 *4,我看输出的数据类型是float类型,那么意味着不应该再X4了。
回复

使用道具 举报

hzdxs

注册会员

积分
168
地板
 楼主| 发表于 2020-6-12 13:38:36 | 只看该作者
hisping 发表于 2020-6-12 11:10
你跑的是论坛上的demo吗?你是不是改了代码?为什么输入是512x512的?论坛上已经有yolov3的demo了,你可以 ...

我们自定义的网络。没有用官方原生的。
回复

使用道具 举报

hzdxs

注册会员

积分
168
5#
 楼主| 发表于 2020-6-12 13:44:42 | 只看该作者
#coding:utf-8
import numpy as np
import cv2
from rknn.api import RKNN
import math
def sigd(x):
    return 1/(1 +math.exp(-x))
img = cv2.imread('bike.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (512,512), interpolation=cv2.INTER_CUBIC)
rknn = RKNN()
#rknn.config(channel_mean_value='0 0 0 0.003902', reorder_channel='2 1 0')
ret = rknn.load_rknn(path='bike.rknn')
if ret!=0:
   print('load rknn fail')
print('--> Init runtime ')
ret = rknn.init_runtime()
if ret != 0:
   print('Init runtime fail')
   exit()
import time
start_time=time.time()
print('--> Running model ')
outputs = rknn.inference(inputs=[img])
end_time=time.time()
end_time=end_time-start_time
raw_res=outputs[0]
print(raw_res.shape,type(raw_res[0]),raw_res.size)
回复

使用道具 举报

hzdxs

注册会员

积分
168
6#
 楼主| 发表于 2020-6-12 13:50:46 | 只看该作者
这个是从caffe上抓取的最后一层的数据:
dataf:-0.2726,0.8238,0.4719,0.0641,0.1514,0.1482,0.2272,0.1473,
下面是rknn推理得到的数据,明显不对
[ 3258.8354  1629.4177  3258.8354  1629.4177 -1629.4177 -1629.4177   0.      1629.4177]
回复

使用道具 举报

hzdxs

注册会员

积分
168
7#
 楼主| 发表于 2020-6-12 13:58:38 | 只看该作者
leok 发表于 2020-6-12 10:32
信息贴全一点;  这样截断性信息没办法分析问题。
rknn toolkit版本;  推理脚本; 哪个节点输出有问题; ...

推理脚本在下面贴出来了
回复

使用道具 举报

leok

版主

积分
894
8#
发表于 2020-6-12 14:42:37 | 只看该作者
hzdxs 发表于 2020-6-12 13:58
推理脚本在下面贴出来了

rknn.config(channel_mean_value='0 0 0 0.003902', reorder_channel='2 1 0')
这个是在转模型时候的配置?
回复

使用道具 举报

hzdxs

注册会员

积分
168
9#
 楼主| 发表于 2020-6-12 16:51:28 | 只看该作者
leok 发表于 2020-6-12 14:42
rknn.config(channel_mean_value='0 0 0 0.003902', reorder_channel='2 1 0')
这个是在转模型时候的配置 ...

是的,我注释掉了
回复

使用道具 举报

leok

版主

积分
894
10#
发表于 2020-8-5 16:24:56 | 只看该作者
hzdxs 发表于 2020-6-12 16:51
是的,我注释掉了

首先,这里有2个问题:
1、在转换模型时候“rknn.config(channel_mean_value='0 0 0 0.003902', reorder_channel='2 1 0')” ,是基于什么判断设置这些参数。 参看文档仔细理解这些参数设置的意思,参数设置不对,结果输出会不对。
2、请仔细理解下算法思路,确认明白算法每个分支输出的意思。    yolov3如果是原生paper给出的算法会做32、16、8倍下采样,按照输入是512x512计算,输出应该有 16x16x(4+1+类别数)、32x32x(4+1+类别数)、64x64x(4+1+类别数)。
3、可以尝试升级到rknn toolkit 1.3.2,再进行实验。
4、如果还是解决不了,可以把转换sample,原始模型,原始yolov3推理正确脚本,以及rknn推理smaple等,打包,发出来。

请多思考,多做实验,仔细理解算法思想。
回复

使用道具 举报

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

本版积分规则

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


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