Toybrick

rknn模型对膨胀卷积操作填充只能是valid吗

PositectSheng

注册会员

积分
64
发表于 2019-4-3 10:25:32    查看: 15180|回复: 13 | [复制链接]    打印 | 显示全部楼层
使用rknn模型推理的时候,模型里面的膨胀卷积,输出结果发现shape不对了,少了好多,查一下发现推理的时候膨胀卷积的填充模式变成valid引起的,回来看之前用tensorflow写的网络框架,填充写的是same,之后换了各种膨胀卷积层的接口tf.nn.astrous_conv2d,slim.conv2d,tf.keras.layers.Conv2D,tf.nn.convolution都会出现同一个问题,这是啥情况?
回复

使用道具 举报

zhangzj

超级版主

积分
1109
发表于 2019-4-9 08:46:09 | 显示全部楼层
你测试的代码发出来看下
回复

使用道具 举报

PositectSheng

注册会员

积分
64
 楼主| 发表于 2019-4-9 09:33:48 | 显示全部楼层
zhangzj 发表于 2019-4-9 08:46
你测试的代码发出来看下

import numpy as np
import tensorflow as tf
import cv2
import time
import os

import cv2

from rknn.api import RKNN


def load_model():
    # Create RKNN object
    rknn = RKNN(verbose=True)

    # Config for Model Input PreProcess
    rknn.config(channel_mean_value='0 0 0 255', reorder_channel='0 1 2')

    # Direct Load RKNN Model
    print('--> Loading model')
    rknn.load_rknn('./net_layers.rknn')
    print('done')

    # init runtime environment
    print('--> Init runtime environment')
    ret = rknn.init_runtime()
    if ret != 0:
        print('Init runtime environment failed')
        exit(ret)
    print('done')

    return rknn


def recognize(rknn, img):
    img1 = cv2.resize(img, (640, 360))
    img = img1[90:270, 160:480]
    img = img.astype('float32')
    output_model = rknn.inference(inputs=[img])
    output = np.transpose(output_model[0].reshape((1, 70, 140)), (1, 2, 0))
    return img, output*[0, 0, 1]


def main(rknn):
    cap = cv2.VideoCapture('./output3.mp4')
    # cap = cv2.VideoCapture('/dev/video1', cv2.CAP_V4L)
    print(cap.isOpened())

    fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))  # 获取视频编码格式
    fps_video = cap.get(cv2.CAP_PROP_FPS)  # 当前摄像头的帧数

    # fourcc = cv2.VideoWriter_fourcc(*'XVID')  #定义编码格式mpge-4
    # fps_video = 10
    size_video = (640, 180)
    name_video = 'grass'+'.avi'
    # out_video_annotations = cv2.VideoWriter(os.path.join('./', name_video), fourcc, fps_video, size_video) # 定义视频文件输入对象

    t0 = time.clock()
    count = 0
    while 1:
        ret, image = cap.read()
        if ret:
            img, output = recognize(rknn, image)
            print(output)
            output = np.repeat(np.repeat(output, 2, axis=1), 2, axis=0)[:360, :640]
            cv2.imshow('JPEGImages', img)
            cv2.imshow('Annotations', output)
            # output = np.concatenate((img, output), axis=1)
            # out_video_annotations.write((255*output).astype('uint8'))
            count += 1
        if cv2.waitKey(10) == ord('q'):
            break
    dt = time.clock()-t0
    print(dt, count/dt)
    # out_video_annotations.release()
    cap.release()
    rknn.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    rknn = load_model()
    main(rknn)



现在这个输出是减少的,理论上same填充应该是90x160,得到的确实valid填充70x140
回复

使用道具 举报

zhangzj

超级版主

积分
1109
发表于 2019-4-9 17:27:15 | 显示全部楼层
PositectSheng 发表于 2019-4-9 09:33
import numpy as np
import tensorflow as tf
import cv2

你看下转换过程中的log是否有区分same和valid。

我这边简单测试了下,rknn对same和valid是有区分的,out的shape也不一样,我用的是tf.nn.conv2d

same模式:op1_conv_same = tf.nn.conv2d(input, filter1, strides=[1, 2, 2, 1], padding='SAME')
D Process attach_input/out0_1 ...
D RKNN output shape(input): (0 5 5 1)
D Process Conv2D_3 ...
D RKNN output shape(convolution): (0 3 3 1)
D Process attach_out/out0_0 ...
D RKNN output shape(output): (0 3 3 1)
I Build conv_same complete.

valid模式:op2_conv_valid = tf.nn.conv2d(input, filter1, strides=[1, 2, 2, 1], padding='VALID')
D Process attach_input/out0_1 ...
D RKNN output shape(input): (0 5 5 1)
D Process Conv2D_1_3 ...
D RKNN output shape(convolution): (0 2 2 1)
D Process attach_out/out0_0 ...
D RKNN output shape(output): (0 2 2 1)
I Build conv_valid complete.
回复

使用道具 举报

PositectSheng

注册会员

积分
64
 楼主| 发表于 2019-4-11 09:11:00 | 显示全部楼层
zhangzj 发表于 2019-4-9 17:27
你看下转换过程中的log是否有区分same和valid。

我这边简单测试了下,rknn对same和valid是有区分的,out ...

问题搞定了,使用tf.nn.conv2d就没问题了,但是获取摄像头图片推理会出现程序崩溃Aborted (core dumped),每次都是运行两次,在第三次读取图片之后推理崩溃,但是循环读取jpg图片进行推理一切正常
回复

使用道具 举报

zhangzj

超级版主

积分
1109
发表于 2019-4-11 14:19:15 | 显示全部楼层
PositectSheng 发表于 2019-4-11 09:11
问题搞定了,使用tf.nn.conv2d就没问题了,但是获取摄像头图片推理会出现程序崩溃Aborted (core dumped) ...

抛开rknn,单纯循环读取摄像头数据会崩溃吗?
回复

使用道具 举报

PositectSheng

注册会员

积分
64
 楼主| 发表于 2019-4-12 09:10:48 | 显示全部楼层
zhangzj 发表于 2019-4-11 14:19
抛开rknn,单纯循环读取摄像头数据会崩溃吗?

不会,单纯打开摄像头不会崩溃,打断点就在第三次inference的时候崩溃
回复

使用道具 举报

zhangzj

超级版主

积分
1109
发表于 2019-4-12 09:58:31 | 显示全部楼层
core dumped的时候dmesg有没有什么错误信息?
循环读取jpg图片正常的话,看下是不是第三次摄像头读取的数据有问题?
回复

使用道具 举报

PositectSheng

注册会员

积分
64
 楼主| 发表于 2019-4-12 10:46:35 | 显示全部楼层
zhangzj 发表于 2019-4-12 09:58
core dumped的时候dmesg有没有什么错误信息?
循环读取jpg图片正常的话,看下是不是第三次摄像头读取的数据 ...

这是日志信息

本帖子中包含更多资源

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

x
回复

使用道具 举报

zhangzj

超级版主

积分
1109
发表于 2019-4-15 08:38:06 | 显示全部楼层

有模型文件和代码可以复现吗?
回复

使用道具 举报

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

本版积分规则

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


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