ZED2代相机+nvidia jetson AGX xavier踩坑记录(续)
项目描述
书接上文,尝试ZED的Mask-RCNN项目失败后,这次继续尝试运行一下ZED的YOLO例程。
项目地址:https://github.com/stereolabs/zed-yolo
项目文档:https://www.stereolabs.com/docs/yolo/
最新版的YOLOv4的C++版本已经原生支持ZED,不需要下载ZED的例程了,但python版本还没有支持,此次主要解决python版本例程遇到的问题。
问题1 libdarknet编译问题
问题出现描述:
下载zed-yolo的项目后,编译libdarknet失败,错误大概与cudnnGetConvolutionForwardAlgorithm()
相关。
问题解决过程:
其实就是版本老旧的问题,可以查看参考链接[1],旧版本的darknet不支持cuDNN8。
需要自己下载新版的darknet进行编译,下载地址:https://github.com/AlexeyAB/darknet
下载完成后,打开文件夹中的Makefile,在文件开头设置:
GPU=1
CUDNN=1
CUDNN_HALF=0
OPENCV=0
AVX=0
OPENMP=0
LIBSO=1
ZED_CAMERA=1
ZED_CAMERA_V2_8=0
LIBSO=1是生成库文件,运行python版程序必选。其余根据实际情况设置,部分不当会产生一些问题,下文会提到。
问题2
问题出现描述:
进入zed_python_sample文件夹,运行命令出现dets[j].prob[i] > 0 Null pointer access exception
错误。
问题解决过程:
还是版本老旧的问题,查看参考链接[2],修改darknet_zed.py
中58行左右的class DETECTION(Structure)
:
class DETECTION(Structure):
_fields_ = [("bbox", BOX),
("classes", c_int),
("prob", POINTER(c_float)),
("mask", POINTER(c_float)),
("objectness", c_float),
("sort_class", c_int),
("uc", POINTER(c_float)),
("points", c_int),
("embeddings", POINTER(c_float)),
("embedding_size", c_int),
("sim", c_float),
("track_id", c_int)]
原版代码是没有sort_class
之后的内容的。
问题3 GTK+ 2.x and GTK+ 3冲突
问题出现描述:
运行程序,出现错误:
Gtk-ERROR **: 18:37:16.114: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported
问题解决过程:
尝试注释darknet_zed.py
的470的行左右的cv2.imshow("ZED", image)
,程序可以正常运行。
发现在darknet编译时,Makefile中设置OPENCV=1,参照ZED例程的设置,设置为0,再次运行不再出错。
问题4
问题出现描述:
运行程序,出现错误:
CUDA status Error: file: ./src/convolutional_kernels.cu : ()
CUDA Error: invalid resource handle
问题解决过程:
这个问题最后也不算解决吧,参考链接[3]提到了类似的情况,darknet编译时,Makefile中设置CUDNN_HALF=0,再编译就没有错误了。
但根据github里提到的的情况,nvidia jetson AGX Xavier是可以使用CUDNN_HALF的,查看参考链接[4]。估计还是和darknet_zed.py
的调用有关,有时间再关注一下吧。
参考链接
[1]https://github.com/AlexeyAB/darknet/issues/5905
[2]https://github.com/AlexeyAB/darknet/issues/6322
[3]https://github.com/AlexeyAB/darknet/issues/3840
[4]https://github.com/AlexeyAB/darknet/issues/5234