Toybrick

标题: rknn模型对膨胀卷积操作填充只能是valid吗 [打印本页]

作者: PositectSheng    时间: 2019-4-3 10:25
标题: rknn模型对膨胀卷积操作填充只能是valid吗
使用rknn模型推理的时候,模型里面的膨胀卷积,输出结果发现shape不对了,少了好多,查一下发现推理的时候膨胀卷积的填充模式变成valid引起的,回来看之前用tensorflow写的网络框架,填充写的是same,之后换了各种膨胀卷积层的接口tf.nn.astrous_conv2d,slim.conv2d,tf.keras.layers.Conv2D,tf.nn.convolution都会出现同一个问题,这是啥情况?
作者: zhangzj    时间: 2019-4-9 08:46
你测试的代码发出来看下
作者: PositectSheng    时间: 2019-4-9 09:33
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    时间: 2019-4-9 17:27
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    时间: 2019-4-11 09:11
zhangzj 发表于 2019-4-9 17:27
你看下转换过程中的log是否有区分same和valid。

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

问题搞定了,使用tf.nn.conv2d就没问题了,但是获取摄像头图片推理会出现程序崩溃Aborted (core dumped),每次都是运行两次,在第三次读取图片之后推理崩溃,但是循环读取jpg图片进行推理一切正常
作者: zhangzj    时间: 2019-4-11 14:19
PositectSheng 发表于 2019-4-11 09:11
问题搞定了,使用tf.nn.conv2d就没问题了,但是获取摄像头图片推理会出现程序崩溃Aborted (core dumped) ...

抛开rknn,单纯循环读取摄像头数据会崩溃吗?
作者: PositectSheng    时间: 2019-4-12 09:10
zhangzj 发表于 2019-4-11 14:19
抛开rknn,单纯循环读取摄像头数据会崩溃吗?

不会,单纯打开摄像头不会崩溃,打断点就在第三次inference的时候崩溃
作者: zhangzj    时间: 2019-4-12 09:58
core dumped的时候dmesg有没有什么错误信息?
循环读取jpg图片正常的话,看下是不是第三次摄像头读取的数据有问题?
作者: PositectSheng    时间: 2019-4-12 10:46
zhangzj 发表于 2019-4-12 09:58
core dumped的时候dmesg有没有什么错误信息?
循环读取jpg图片正常的话,看下是不是第三次摄像头读取的数据 ...

这是日志信息
作者: zhangzj    时间: 2019-4-15 08:38
PositectSheng 发表于 2019-4-12 10:46
这是日志信息

有模型文件和代码可以复现吗?
作者: PositectSheng    时间: 2019-4-15 18:56
zhangzj 发表于 2019-4-15 08:38
有模型文件和代码可以复现吗?

你好 ,附件里面是测试代码和rknn的模型

作者: zhangzj    时间: 2019-4-16 14:42
PositectSheng 发表于 2019-4-15 18:56
你好 ,附件里面是测试代码和rknn的模型

我这边跑了下,没有出现崩溃的现象
作者: PositectSheng    时间: 2019-4-17 10:38
本帖最后由 PositectSheng 于 2019-4-17 10:41 编辑
zhangzj 发表于 2019-4-16 14:42
我这边跑了下,没有出现崩溃的现象

是因为摄像头的原因吗?有可能是因为摄像头的问题吗?我这边单独开启摄像头会报错,但是不影响摄像头的开启,[size=2.07692]unable to query number of channels
作者: zhangzj    时间: 2019-4-19 10:10
PositectSheng 发表于 2019-4-17 10:38
是因为摄像头的原因吗?有可能是因为摄像头的问题吗?我这边单独开启摄像头会报错,但是不影响摄像头的开 ...

不确定,你能换个摄像头试下?




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3