然后接下来两条路:一条是根据那个rknpu下的yolov5的demo做一些工作,另一条路是用模拟器去尝试摄像头检测。

电脑摄像头失败过程:

在上一篇中已经实现了转onnx和rknn模型,在模拟器中也已经实现了正常运行。但是一旦连接板子使用就会报错。注意:现在板子只能用buildroot

首先我解决的一个报错是:

1、driver open fail!

android studo 模拟器摄像头调取摄像头数据_stm32

这个错误的最终解决方案我应该是结合了几个github下面rknn-toolkit以及rknpu的issue里面得到的:

1、首先要根据官方rknpu的github下的教学,更新板子驱动。(其实就是按github说明把相应文件adb push到相应位置即可)然后重启板子。

2、这个时候我依旧会报错,我在一个closed的issue中发现了这个:

android studo 模拟器摄像头调取摄像头数据_正常运行_02

当然,那个mk我也不知道咋用,但是我看出来了要修改那个S05NPU_init文件,意思就是把那个

#start_rknn.sh改成start_rknn.sh

原理就是说默认是mini drive的,然后如果把这句的注释去掉,它就会在板子开机的时候运行这个start_rknn.sh,而这个文件才能启动full drive。(mini drive是不能启动PC连接板子使用的,其实在说明书里还一种烧录的办法,但是那种办法我也尝试过,单独烧录那个rootf.img会让板子无法启动)。

3、issue里面说改了这个就好了,但实际上我的板子还是报那个错,于是我就想干脆我手动启动那个start_rknn.sh,这里我用的find / -name start_rknn.sh找到它的位置。这里我忘记截图了,但是我记得错误是permission denied。就是没有权限,但是buildroot下又没有sudo的说法,于是我又搜了一下,找到一个issue,也忘截图了,大概意思就是用chmod 777 指令给文件赋权。于是我chmod 777 start_rknn.sh 然后就好了。

4、我记得好像还一个关于librknn_runtime.so的报错:、

ERROR: open librknn_runtime.so fail path=/usr/lib32/librknn_runtime.so, error=/usr/lib/libOpenVX.so.1: file too short rknn_init error ret=-3

解决方法是重新软连接。

首先ls -l /usr/lib,可以发现libOpenVX.so.1.2软连接没了,那就

ln -snf libOpenVX.so.1.2 libOpenVX.so.1
ln -snf libOpenVX.so.1 libOpenVX.so
ln -snf libOpenCL.so.1.2 libOpenCL.so.1

但是令人绝望的是又出现一个错误:

2、RKNN_ERR_MODEL

android studo 模拟器摄像头调取摄像头数据_stm32_03

导致这个问题是这样的:因为我之前是用模拟器仿真,所以我最开始onnx转rknn中的rknn.config的target_platform没填,默认为rk1808。而模拟器是rk1808,所以模拟器可以正常工作。后来我因为驱动报错,就把test.py转化模型的代码注释掉了,就一直用的那个target_platform为rk1808的rknn模型,于是产生了这个报错。我解决的契机是跑rknpu下yolov5的demo的时候,我想到能不能把那里面自带的模型拿过来用,但不记得为啥报了一次错,但是我在想替换rknpu下模型在板子上运行时,发生了报错:

android studo 模拟器摄像头调取摄像头数据_stm32_04

这给了我启发,于是我重新试了一下,用官方的yolov5s.onnx,然后再把那个转换模型的代码接触了注释,重新跑了一次发现成功了。后来我又试了一下那个rknpu下yolov5的yolov5s_relu_rv1109_rv1126_out_opt.rknn,注释掉转换模型的代码,也可以运行。这下问题全解决了。

简而言之,只要解决了第一个驱动的问题,然后注意模型模拟器默认rk1808,然后rknn.config的target_platform参数。最后是init_runtime()指模拟器,然后init_runtime(target='rv1126',device_id='自己用adb devices查询')。就可以正常运行了。