Upsample 输入问题

在转换SDK中自带的yolov3模型(HiSVP_PC_V1.1.4.0\software\data\detection\yolov3\model\yolov3.prototxt)时,报以下错误:

F0817 15:32:17.480885 1352 layer.hpp:349] Check failed: ExactNumBottomBlobs() == bottom.size() (2 vs. 1) Upsample Layer takes 2 bottom blob(s) as input.

原因:

RuyiStudio中caffe Upsample的实现需要两个bottom,但实际模型prototxt中该层只有一个bottom

one for feature maps, and one for the max-pooling indeices;

解决方案:

    1. 对caffe window的源码进行修改,编译,并替换RuyiStudio的工具(传送门,要高贵的CSDN VIP才能看,没实践)
    1. 有一说,用deconv替换upsample,看到我们自己的模型是这样做的

延伸:

在使用Get Caffe Output功能时,yolov3也遇到同样的问题

python缺少rpn模块

在转换模型时报以下错误

File “D:\software\RuyiStudio\Resources\pythonScript\get_caffe_shape.py”, line 28,
in
import rpn
ImportError: No module named ‘rpn’

原因:

字面意思,python脚本中找不到一个叫rpn的模块

解决方案:

  1. 直接pip install rpn (如果电脑上有多个版本的python,确保是安装到RuyiStudio所依赖的py35下)

  2. 其实就是安装时略过了手动安装步骤7和8导致的,rpn在这个roi_pooling目录下

1
那就安装vs2015后执行setup_roi_caffe.bat,下载py-faster-rcnn-windows-master.zip。还是有网络的老问题,那就自己在脚本中找url手动下载和解压,注释掉wget和7z的语句,再次执行bat脚本,成功生成。 并没有= =

2

  • 首先,sed操作的权限问题,可以通过用管理员权限打开一个cmd,再cd D:\software\ruyi_env_setup下,执行setup_roi_caffe.bat脚本解决;

  • 其次,build操作并没有成功,错误如下,只会拷贝已有的一些文件到roi_pooling目录下(虽然这也能解决rpn模块找不到的问题),但送佛送到西嘛

D:\software\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MT -ID:\software\ruyi_env_setup\python35\lib\site-packages\numpy\core\include -ID:\software\ruyi_env_setup\python35\include -ID:\software\ruyi_env_setup\python35\include “-ID:\software\Microsoft Visual Studio\2015\Community\VC\Include” “-ID:\Windows Kits\10\include\10.0.19041.0\shared” “-ID:\Windows Kits\10\include\10.0.19041.0\um” “-ID:\Windows Kits\10\include\10.0.19041.0\winrt” “-ID:\Windows Kits\10\include\10.0.19041.0\ucrt” “-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um” /Tcutils\bbox.c /Fobuild\temp.win-amd64-3.5\Release\utils\bbox.obj
bbox.c
D:\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt.h(10): fatal error C1083: 无法打开包括文件: “vcruntime.h”: No such file or directory
error: command ‘D:\software\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64\cl.exe’ failed with exit status 2

  • 可以看到,这里调用的还是vs2019的cl.exe,而不是vs2015,通过everything搜索并没有找到vs2015版本的cl.exe,根本没有Tools文件夹,回看步骤7,应该是这个vs组件没有安装,重新打开安装程序,选上Common Tools for Visual C++ 2015Windows 8.1 SDK and Universal CRT SDK组件,调整安装。
  • 重新执行setup_roi_caffe.bat脚本,可以看到没有error,并在D:\software\ruyi_env_setup\py-faster-rcnn-windows-master\lib\build\temp.win-amd64-3.5\Release目录下生成了若干库,并且在nms pycocotools utils文件夹下生成了.c和.pyd文件,这些文件会一并被拷贝到roi_pooling目录下

3

RuyiStudio编译工程弹出错误窗口

4

Console窗口并没有提示代码有error,应该是工程或IDE的错误,暂时不影响后续代码,也google不到有效的解决方法,暂时搁置。

Detect Result功能不能匹配结果文件

结果文件中根据名称去跟图片匹配,完全一致则可以匹配上,分辨率不同也没关系

5

6

编译自己demo遇到的问题

需要交叉编译OpenCV

参考 交叉编译OpenCV 笔记

存在未定义引用

libnnie.so: undefined reference to memset_s

memset_s函数由libsecurec.so库提供,链接该库即可

如何确定某个库中是否含有某个函数,执行以下命令

readelf -s libsecurec.so | grep memset_s

输出如下:

40: 0000000000002908 3284 FUNC GLOBAL DEFAULT 11 memcpy_sOptTc
67: 0000000000001bb8 112 FUNC GLOBAL DEFAULT 11 memcpy_s
75: 0000000000001c28 3292 FUNC GLOBAL DEFAULT 11 memcpy_sOptAsm
81: 000000000000dd58 100 FUNC GLOBAL DEFAULT 11 wmemcpy_s

libnnie.so: undefined reference to HI_MPI_SYS_MmzAlloc_Cached

链接libmpi.so

运行自己demo遇到的问题

无法显示图片

terminate called after throwing an instance of ‘cv::Exception’
what(): OpenCV(4.1.0) /home/aaron-wu/opencv/opencv-4.1.0/modules/highgui/src/window.cpp:627: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function ‘cvShowImage’

注释掉cv::imshow()相关语句

分配内存错误

ERROR: MMAP ADDR: 0x7fb5e791e0-0x7fb64140b0

在CMakeLists.txt 增加宏定义

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHISI_CHIP")

该宏控制内存分配和释放所调用的函数是HI_MPI_SYS_MmzFreeHI_MPI_SYS_MmzAlloc还是mallocfree

查看MMZ内存使用情况

cat /proc/umap/media-mem

疑似内存泄露

在程序执行完毕后有这些打印信息

mmz_userdev:mmz_userdev_release:
MMB LEAK(pid=1596): 0xDCF9E000, 6082560 bytes, ‘’
mmz_userdev:mmz_userdev_release:
mmb<0xdcf9e000> mapped to userspace 0x00000000ffd25912 will be unmaped!
mmz_userdev:mmz_userdev_release:
MMB LEAK(pid=1596): 0xDD56B000, 4034560 bytes, ‘’
mmz_userdev:mmz_userdev_release:
mmb<0xdd56b000> mapped to userspace 0x00000000e10a0392 will be unmaped!
mmz_userdev:mmz_userdev_release:
MMB LEAK(pid=1596): 0xDD944000, 4096 bytes, ‘’
mmz_userdev:mmz_userdev_release:
mmb<0xdd944000> mapped to userspace 0x00000000bdd4e59c will be unmaped!
mmz_userdev:mmz_userdev_release:
MMB LEAK(pid=1596): 0xDD945000, 520192 bytes, ‘’
mmz_userdev:mmz_userdev_release:
mmb<0xdd945000> mapped to userspace 0x00000000051ec222 will be unmaped!
mmz_userdev:mmz_userdev_release:
MMB LEAK(pid=1596): 0xDD9C4000, 20480 bytes, ‘’
mmz_userdev:mmz_userdev_release:
mmb<0xdd9c4000> mapped to userspace 0x0000000051b58146 will be unmaped!
mmz_userdev:mmz_userdev_release:
MMB LEAK(pid=1596): 0xDD9C9000, 73728 bytes, ‘’
mmz_userdev:mmz_userdev_release:
mmb<0xdd9c9000> mapped to userspace 0x00000000cf2d5fe3 will be unmaped!
mmz_userdev:mmz_userdev_release:
MMB LEAK(pid=1596): 0xDD9DB000, 262144 bytes, ‘’
mmz_userdev:mmz_userdev_release:
mmb<0xdd9db000> mapped to userspace 0x00000000a8baa11a will be unmaped!

确为内存泄露,没有free内存导致的

NNIE的预处理

按照demo的代码逻辑以及相关文档的描述,NNIE的Forward是包含部分预处理操作的:

    1. 这部分预处理操作怎么做是由转换wk时的配置确定的,包括量化操作和BGR->RGB的通道顺序转换;
    1. 如果选择image_typeU8,则只接受BGR_planar类型的输入,外部仅需要关注resize和packed->planar转换操作,另放到src_blob中时,注意stride的对齐;
    1. 转换时的预处理归一化mean值如果各通道不同,则mean值顺序与RGB_order的顺序保持一致;