最近這一個(gè)月在研究國產(chǎn)瑞芯微板子上部署yolov8的檢測和分割模型,踩了很多坑,記錄一下部署的過程和遇到的一些問題:
1 環(huán)境搭建
需要的環(huán)境和代碼主要包括:
(1)rknn-toolkit2-1.5.2:工具鏈,開發(fā)環(huán)境
(2)rockchip-yolov8:pt模型轉(zhuǎn)onnx模型
(3)yolov8_onnx2rknn:在(2)的基礎(chǔ)上轉(zhuǎn)檢測rknn模型
(4)yolov8seg_onnx2rknn:在(2)的基礎(chǔ)上轉(zhuǎn)分割rknn模型
最好使用對應(yīng)的環(huán)境,環(huán)境不匹配的話會(huì)出現(xiàn)很多問題。
2 ubuntu docker環(huán)境
Docker容器主要用來進(jìn)行模型轉(zhuǎn)換,也就是pt轉(zhuǎn)onnx的過程,因此docker中需要用的的包主要是rockchip-yolov8,需要修改該代碼,進(jìn)行模型的轉(zhuǎn)換,在linux服務(wù)器上安裝docker環(huán)境,創(chuàng)建一個(gè)ubuntu系統(tǒng)的docker環(huán)境
這一部分的修改代碼參考山水無移大哥的部署過程,賊清洗,膜拜一下,少走了很多彎路,直接貼上地址。
3 模型轉(zhuǎn)換問題
在轉(zhuǎn)自己的pt到onnx模型時(shí),容易出現(xiàn)以下問題:
(1)報(bào)錯(cuò)信息:
copying a param with shape torch.Size([64,64,3,3]) from checkpoint,the shape in current model is torch.Size(32,64,3,3)
主要的問題有兩種:
1)在最后一步導(dǎo)出onnx時(shí),yolov8s.yaml里面沒有修改成自己的模型的類別信息;
2)自己訓(xùn)練的yolov8m模型,但是選擇的yaml是yolov8s.yaml
from ultralytics import YOLO
# model = YOLO('/cytech_ai/sipingtest/rknntest/model/20230228_yolov8_LiftPerson_filter.pt')
# results = model(task='detect', mode='predict', source='/cytech_ai/sipingtest/rknntest/2.jpg', line_thickness=3, save=True, device='cpu')
model = YOLO('/cytech_ai/sipingtest/rknntest/rockchip-yolov8/ultralytics/cfg/models/v8/yolov8s.yaml')
results = model(task='detect', mode='predict', source='/cytech_ai/sipingtest/rknntest/2.jpg', line_thickness=3, save=True, device='cpu')
(2)多處修改時(shí),最終的輸出結(jié)果和分割模型的結(jié)果搞混了,導(dǎo)致模型輸出對應(yīng)不上:
4 RK3588上環(huán)境搭建
瑞芯微rk3588上,需要的環(huán)境主要是rknpu2,主要用來C++編寫cmakelists文件時(shí)導(dǎo)入動(dòng)態(tài)庫和頭文件,我這里將檢測模型和分割模型全部集成到一個(gè)工程里面,分享一個(gè)個(gè)人的cmakelist文件:
cmake_minimum_required(VERSION 3.4.1)
# 聲明一個(gè) cmake 工程
set(PROJECT_NAME rknn_yolov8_AlgDetectModel)
project(${PROJECT_NAME})
set(CMAKE_CXX_STANDARD 11)
set(TARGET_SOC "rk3588")
set(CMAKE_C_COMPILER "aarch64")
# rknn api
if(TARGET_SOC STREQUAL "rk356x")
set(RKNN_API_PATH ${CMAKE_SOURCE_DIR}/../../runtime/RK356X/${CMAKE_SYSTEM_NAME}/librknn_api)
set(RKNN_API_PATH ${CMAKE_SOURCE_DIR}/../../runtime/RK356X/${CMAKE_SYSTEM_NAME}/librknn_api)
elseif(TARGET_SOC STREQUAL "rk3588")
set(RKNN_API_PATH /home/siping/testrknn/rknpu2-1.5.2/runtime/RK3588/Linux/librknn_api/aarch64)
else()
message(FATAL_ERROR "TARGET_SOC is not set, ref value: rk356x or rk3588 or rv110x")
endif()
if (CMAKE_SYSTEM_NAME STREQUAL "Android")
set(RKNN_RT_LIB ${RKNN_API_PATH}/${CMAKE_ANDROID_ARCH_ABI}/librknnrt.so)
else()
if (CMAKE_C_COMPILER MATCHES "aarch64")
set(LIB_ARCH aarch64)
else()
set(LIB_ARCH armhf)
endif()
#直接鏈接這個(gè)庫了
set(RKNN_RT_LIB /home/siping/testrknn/rknpu2-1.5.2/runtime/RK3588/Linux/librknn_api/aarch64/librknnrt.so)
endif()
#鏈接頭文件
include_directories(/home/siping/testrknn/rknpu2-1.5.2/runtime/RK3588/Linux/librknn_api/include)
#第三方依賴庫
include_directories(${CMAKE_SOURCE_DIR}/../3rdparty)
# opencv
#if (CMAKE_SYSTEM_NAME STREQUAL "Android")
# set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../3rdparty/opencv/OpenCV-android-sdk/sdk/native/jni/abi-${CMAKE_ANDROID_ARCH_ABI})
#else()
# if(LIB_ARCH STREQUAL "armhf")
# set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../3rdparty/opencv/opencv-linux-armhf/share/OpenCV)
# else()
# set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../3rdparty/opencv/opencv-linux-aarch64/share/OpenCV)
# endif()
#endif()
#find_package(OpenCV REQUIRED)
#手動(dòng)鏈接opencv480
set(OpenCV_DIR "/home/siping/thirdparty/opencv480/")
set(OpenCV_INCLUDE_DIRS "/home/siping/thirdparty/opencv480/include/opencv4")
set(OpenCV_LDFLAGS "/home/siping/thirdparty/opencv480/lib")
include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${OpenCV_LDFLAGS})
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
message(STATUS " libraries: ${OpenCV_LDFLAGS}")
#rga
if(TARGET_SOC STREQUAL "rk356x")
set(RGA_PATH ${CMAKE_SOURCE_DIR}/../3rdparty/rga/RK356X)
elseif(TARGET_SOC STREQUAL "rk3588")
set(RGA_PATH ${CMAKE_SOURCE_DIR}/../3rdparty/rga/RK3588)
else()
message(FATAL_ERROR "TARGET_SOC is not set, ref value: rk356x or rk3588")
endif()
if (CMAKE_SYSTEM_NAME STREQUAL "Android")
set(RGA_LIB ${RGA_PATH}/lib/Android/${CMAKE_ANDROID_ARCH_ABI}/librga.so)
else()
if (CMAKE_C_COMPILER MATCHES "aarch64")
set(LIB_ARCH aarch64)
else()
set(LIB_ARCH armhf)
endif()
#鏈接庫,就這一個(gè)
set(RGA_LIB ${RGA_PATH}/lib/Linux//${LIB_ARCH}/librga.so)
endif()
include_directories( ${RGA_PATH}/include)
#瑞芯微 glog日志庫
set(GLOG_INCLUDE "/home/siping/thirdparty/glog_arm64/include/")
set(GLOG_LIB "/home/siping/thirdparty/glog_arm64/lib")
include_directories(${GLOG_INCLUDE})
link_directories(${GLOG_LIB})
message(STATUS "GLOG library status:")
message(STATUS " include path: ${GLOG_INCLUDE}")
message(STATUS " libraries: ${GLOG_LIB}")
#鏈接頭文件
include_directories( ${CMAKE_SOURCE_DIR}/include)
#鏈接cpp文件
aux_source_directory(src DIR_CPP)
#==============================================================
# install target and libraries 將所有需要的依賴庫放在同一個(gè)位置
#set install path
set(CMAKE_BUILD_RPATH "${OpenCV_LDFLAGS}")
set(CMAKE_INSTALL_PREFIX /home/siping/algunion/alglib)
message(STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")
# set runtime path
set(CMAKE_INSTALL_RPATH ".")
# 如果想生成動(dòng)態(tài)庫,SHARE .so
#add_library(${PROJECT_NAME} SHARED ${DIR_CPP})
#set(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
add_executable(${PROJECT_NAME} src/main.cc ${DIR_CPP})
target_link_libraries(${PROJECT_NAME}
${RKNN_RT_LIB} #必須的runtime librknnrt.so
${RGA_LIB} #rga librga.so
${OpenCV_LDFLAGS}
-lopencv_world
${GLOG_LIB}
-lglog
)
install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX})
file(GLOB GLOG_LIB "${GLOG_LIB}/lib*.so.*")
file(GLOB OpenCV_LDFLAGS "${OpenCV_LDFLAGS}/lib*.so.*")
install(PROGRAMS
${OpenCV_LDFLAGS}
${RKNN_RT_LIB}
${RGA_LIB}
${GLOG_LIB}
DESTINATION ${CMAKE_INSTALL_PREFIX})
install(DIRECTORY model DESTINATION "/home/siping/algunion")
前面用到的環(huán)境和代碼打個(gè)包,上傳到了百度網(wǎng)盤,C++的部署的代碼參考的里面都有,我自己這邊只是根據(jù)自己的項(xiàng)目做了集成,如有需要可私信。
5 參考
檢測模型:https://blog.csdn.net/zhangqian_1/article/details/135523096?spm=1001.2014.3001.5502
分割模型:https://blog.csdn.net/zhangqian_1/article/details/131571838?spm=1001.2014.3001.5502文章來源:http://www.zghlxwxcb.cn/news/detail-845695.html
另外一種部署方法,僅檢測模型(Python):
https://blog.csdn.net/m0_48979117/article/details/135628375文章來源地址http://www.zghlxwxcb.cn/news/detail-845695.html
到了這里,關(guān)于瑞芯微RK3588 C++部署Yolov8檢測和分割模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!