海思算法移植

背景:pytorch训练了一个yolov5模型,在服务器上使用。现打算移植到海思3559上。
准备:如意工具安装:https://blog.csdn.net/qq_38108312/article/details/116331028
如意工具使用:https://blog.csdn.net/avideointerfaces/article/details/89037223
本地编译海思nnie代码,需要准备工具:
安装交叉编译工具:arm-himix200-linux:https://www.freesion.com/article/16911037684/
https://blog.csdn.net/cumtwys/article/details/107934819
https://www.freesion.com/article/7664516253/
量化:https://bbs.huaweicloud.com/blogs/271151

尝试方法:yolov5pytorch训练------转onnx模型-----转caffe模型-----如意工具量化-----板端测试。

环境配置:
1.pytorch转onnx用的:https://github.com/ultralytics/YOLOv5里的export.py
注意修改opset_version为10
2.onnx转caffe环境:https://github.com/Wulingtian/yolov5_onnx2caffe

转完的onnx模型带后边的处理层,转caffe时报错,要去掉。可以删掉onnx里的层,可以在代码里去掉。我用的后者。
KeyError: ‘690’

3.yolov5-caffe模型测试:https://github.com/Wulingtian/yolov5_caffe
https://blog.csdn.net/yayalejianyue/article/details/114878503
https://jishuin.proginn.com/p/763bfbd3c03b
yolov5如意量化:https://blog.csdn.net/tangshopping/article/details/110038605
4.板端yolov5后处理代码:
https://gitee.com/shopping-tang/yolo_v5_nnie/tree/master
出现出现:collect2: error: ld returned 1 exit status的原因是函数没有添加全。
jpg转bgr的代码:https://www.pythonheidong.com/blog/article/368636/de3d22cd87fad601f845/
修改4个地方:

尝试方法:yolov3pytorch训练------转onnx模型-----转caffe模型-----如意工具量化-----板端测试。

1.pytorch 下的YOLOv3 是从这里下载的:https://github.com/ultralytics/yolov3
2.yolov3的pytorch转onnx:用的export.py转化,一样是注意修改opset_version为10。
3.onnx转caffe:这里的转化好像没有成功。用的上边yolov5 onnx转caffe的环境:https://github.com/Wulingtian/yolov5_onnx2caffe。
4.caffe yolov3测试的环境:https://github.com/ChenYingpeng/caffe-yolov3
报错:加入unsample层;caffe/blob.hpp:9:34: fatal error: caffe/proto/caffe.pb.h: 没有那个文件或目录;
参考:https://zhuanlan.zhihu.com/p/95882397和https://blog.csdn.net/xiongmingkang/article/details/83421856;https://blog.csdn.net/qq_35608277/article/details/84960736
报错“没有ipl_into_image
opencv版本不对,重新安装opencv3.4.13。安装完成以后在CmakeLists.txt 中配置路径。
安装opencv3参考:https://www.cnblogs.com/alvinai/p/12622204.html
https://blog.csdn.net/sinat_28442665/article/details/116135490
https://blog.csdn.net/xuezhisdc/article/details/48691797

cmake_minimum_required(VERSION 2.8)
set(OpenCV_DIR "/home/zl/software/opencv-3.4.13/bulid")
project(caffe-yolov3)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")	# -std=gnu++11

# setup CUDA
find_package(CUDA)

set(
	CUDA_NVCC_FLAGS
	${CUDA_NVCC_FLAGS}; 
    -O3 
	-gencode arch=compute_53,code=sm_53  #tegra tx1 
        -gencode arch=compute_61,code=sm_61  #gtx 1060
	-gencode arch=compute_62,code=sm_62  #tegra tx2
)

if(CUDA_VERSION_MAJOR GREATER 9)
	message("-- CUDA ${CUDA_VERSION_MAJOR} detected, enabling SM_72")
	set (
		CUDA_NVCC_FLAGS
		${CUDA_NVCC_FLAGS};
		-gencode arch=compute_72,code=sm_72 #xavier
                -gencode arch=compute_75,code=sm_75 #rtx2080 
	)
endif()

# setup project output paths
set(PROJECT_OUTPUT_DIR  ${PROJECT_BINARY_DIR}/${CMAKE_SYSTEM_PROCESSOR})
set(PROJECT_INCLUDE_DIR ${PROJECT_OUTPUT_DIR}/include)

file(MAKE_DIRECTORY ${PROJECT_INCLUDE_DIR})
file(MAKE_DIRECTORY ${PROJECT_OUTPUT_DIR}/bin)

message("-- system arch:  ${CMAKE_SYSTEM_PROCESSOR}")
message("-- output path:  ${PROJECT_OUTPUT_DIR}")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR}/lib)


# build C/C++ interface
include_directories(${PROJECT_INCLUDE_DIR} ${GIE_PATH}/include)
include_directories(${PROJECT_INCLUDE_DIR} 
	/home/zhanglu/caffe/include 
	/home/zhanglu/caffe/build/include 
)


file(GLOB inferenceSources src/*.cpp src/*.cu )
file(GLOB inferenceIncludes src/*.h )

cuda_add_library(yolov3-plugin SHARED ${inferenceSources})
target_link_libraries(yolov3-plugin 
	/home/zhanglu/caffe/build/lib/libcaffe.so  
	/usr/lib/x86_64-linux-gnu/libglog.so  
	/usr/lib/x86_64-linux-gnu/libgflags.so.2
    	/usr/lib/x86_64-linux-gnu/libboost_system.so  
	/usr/lib/x86_64-linux-gnu/libGLEW.so.1.13  
)


# transfer all headers to the include directory
foreach(include ${inferenceIncludes})
	message("-- Copying ${include}")
	configure_file(${include} ${PROJECT_INCLUDE_DIR} COPYONLY)
endforeach()


# create symbolic link for network data
execute_process( COMMAND "${CMAKE_COMMAND}" "-E" "create_symlink" "${PROJECT_SOURCE_DIR}/data/networks" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/networks" )
  
add_subdirectory(demo)
add_subdirectory(eval)

#setup opencv
FIND_PACKAGE(OpenCV REQUIRED)

TARGET_LINK_LIBRARIES(yolov3-plugin ${OpenCV_LIBS})
#TARGET_LINK_LIBRARIES(yolov3-plugin ${-I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib
#        -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_video -lopencv_videoio})
# install
foreach(include ${inferenceIncludes})
    install(FILES "${include}" DESTINATION include/yolov3-plugin)
endforeach()
# install the shared library
install(TARGETS yolov3-plugin DESTINATION lib/yolov3-plugin EXPORT yolov3-pluginConfig)
# install the cmake project, for importing
install(EXPORT yolov3-pluginConfig DESTINATION share/yolov3-plugin/cmake)
参考:https://blog.csdn.net/a135013563/article/details/104859395
报错:caffe.pb.h:12:2: error: #error This file was generated by a newer version of
protobuf版本不对,重新安装protobuf=2.6.1
参考:https://www.cnblogs.com/darkknightzh/p/5782992.html
https://blog.csdn.net/minzhimo4854/article/details/89950794
https://blog.csdn.net/weixin_42452673/article/details/88885051
https://blog.csdn.net/u010427103/article/details/80235640
https://blog.csdn.net/jiachen0212/article/details/79578458

首先下载 protoc 2.6.1   https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz       https://pkgs.org/download/glibc-common  linux包https://centos.pkgs.org  http://ftp.gnu.org/pub/gnu/glibc/源码
$wget https://github.com/google/protobuf/archive/v2.6.1.zip
$unzip protobuf-2.6.1.zip
$cd protobuf-2.6.1
whereis protoc
which protoc
protoc --version
指定protoc的版本可以在 Makefile文件内修改
在Makefile 中修改这两句:
	$(Q)protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<
	$(Q)protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $<

改为:(路径一般为/usr/bin/protoc或/usr/local/bin/)

$(Q)/usr/bin/protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<
$(Q)/usr/bin/protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $<

还有一步添加环境变量(不知道是不是必须):
然后加环境变量,vim /etc/profile:

export PATH=$PATH:/usr/local/protobuf/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib

生效:
source /etc/profile

多个版本的protoc:https://blog.csdn.net/u014454538/article/details/89005934
通过软链接切换:$ sudo ln -s /usr/protobuf/bin/protoc /usr/local/bin/protoc3.6

尝试方法:yolov3darknet训练------转caffe模型-----如意工具量化-----板端测试。

1.darknet训练:https://www.cnblogs.com/pprp/p/9525508.html
darknet yolov3修改保存间隔:打开darknet/src/detector.c
2.darknet转caffe:https://github.com/ChenYingpeng/darknet2caffe
这里的代码是python2的,如果用python3需要修改对应的代码。
这里使用的caffe要与运行darknet2caffe.py的python版本相同,否则会报错(caffe init什么的错)。所以如果是在python2环境下运行,要重新编译caffe,修改Makefie和makefile.config里对应的python版本,重新编译。参考:https://blog.csdn.net/weixin_41012399/article/details/120553267

我是anaconda重新创建了一个python2环境,还需要安装torch。直接用pip和conda指令安装不成功。需要手动安装torch-0.2.0.post3-cp27-cp27mu-manylinux1_x86_64.whl:
https://blog.csdn.net/arthurchn/article/details/82388810
报错:KeyError: ‘layer1-conv’
解决:https://blog.csdn.net/qq_43318374/article/details/119766975
报错:ImportError: dynamic module does not define module export function (PyInit__caffe)
解决:https://www.cnblogs.com/wangxiaocvpr/p/6285542.html
这里我python2和python3环境都可以正常转化。但是用python2环境转化好的环境,在量化时报错,82-layer,conv0-layer报错。换成python3环境就不报错了。
编译caffe报错:python/caffe/_caffe.cpp:1:52: fatal error: Python.h: No such file or directory compilation terminated.
报错:ImportError: /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.65.1: undefined symbol: PyClass_Type
修改caffe中makefile或者makefile.config里的libboost_python,然后重新编译。
解决:查看makefile和makefile.config中的python。在/usr/…路径里是否可以找到,大概率是对应的位置没有python。
3.caffe-yolov3的测试:同上一种方法中介绍的。要修改caffe-yolov3/src/detector.h里的类别,yolo_layer.h里的类别和 yolo_layer.cpp的anchors。(开始只改了.h里的类别个数,没有改cpp里的anchors大小,检测的结果不准,改了之后好多了。)参考:https://blog.51cto.com/u_11495341/3036360

4.量化时需要注意的参数:rgb还是bgr要根据模型训练时的方式确定。我这里darknet训练采用的rgb,所以量化时选择rgb形式量化。
darknet训练时图像预处理的代码位置:
darknet/src/image.c
image load_image(char *filename, int w, int h, int c)
{

}
从这里可以看出darknet训练采用的rgb,填充用的都是0.
其他参数的设置参考:
https://blog.csdn.net/avideointerfaces/article/details/102417997

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值