在nvidia的JETSON XACIER NX上面跑通yolov3

yolo目标检测算法已经出来yolov5了,本文是针对yolo3的测试,其他版本还没有测试过,特此记录一下遇到的问题。

yolo算法指导最强的还是要参考官网:

https://pjreddie.com/darknet/yolo/

按照官网步骤走:

1.下载和编译,yolo比较小巧,网络正常的花,大约30分钟。

git clone https://github.com/pjreddie/darknet
cd darknet
make

 2.下载权重文件,此文件有200M+,下载这个文件比较耗时。

wget https://pjreddie.com/media/files/yolov3.weights

提供一个百度网盘地址,供下载(不过就是速度由几kb到几十kb的变化而以,酌情用之。)

 链接: https://pan.baidu.com/s/1b_2LCWnJPneF3nURN2rsCA 提取码: vbbf

3.测试图片

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

结果类似这样的。 

上述成功之后,立马就想使用webcam检测动态目标。继续参考官网, Real-Time Detection on a Webcam部分,提示要使用cuda和opencv。

分别查了cuda版本:

nvidia@nvidia-desktop:~$ cat /usr/local/cuda/version.txt
CUDA Version 10.2.89
nvidia@nvidia-desktop:~$ 

opencv默认安装了4.0版本,但是编译无法通过,提示找不到opencv,中间有尝试编写pc文件,发现没有神马用。于是果断重新安装opencv,本人安装的是opencv3.4版本。同样给一个云盘连接,本想上传到CSDN,但是提示有重复的文件,但是下载需要c币:链接: https://pan.baidu.com/s/1ukMIXidb-I2yWZzBKi_2RQ 提取码: 6gxs

安装opencv的过程,我全程参考了这个帖子(感谢大家的经验分享):

https://m.linuxidc.com/Linux/2019-05/158462.htm

就是上面命令都是图片,需要自己手写,哈哈,就当锻炼了。说一下遇到的问题:

1。使用make命令编译特别慢,有多慢呢,三个小时0-30%,建议使用

make -j 12 

因为nx最多能用6个核,具体多少进程知道,这里简单取2倍。

2。编译过程中,提示硬盘空间不足,在后面编译成功之后,发现编译文件大约10G多,吓一跳。我采用的是外接硬盘编译,在硬盘编译,生成的可执行文件存在/usr/local/里面,是可以的。

3。编译过程中,板卡太烫,自动关机了。。。解决方法是:使用了台式机的风扇,单独吹板子。

4。多次编译到60到80之间,卡死了。原因可能是多进程不够协同,具体不清楚了,当编译到这里卡住的时候,重启使用make命令编译,虽然慢一点但是稳定。前面已经编译的还可以继续。

最终经过两天时间,安装成功了opencv。

=============================================回到yolo部分。

直接编译,会报错:

cudnnGetConvolutionForwardAlgorithm()没有定义的引用;

cudnnGetConvolutionBackwardDataAlgorithm()没有定义的引用;

cudnnGetConvolutionBackwardFilterAlgorithm()没有定义的引用;

一开始以为是cudnn的问题,因为还报错如下:

*********************************

/usr/bin/ld:/usr/local/cuda/lib64/libcudnn.so: file format not recognized; treating as linker script 
/usr/bin/ld:/usr/local/cuda/lib64/libcudnn.so:1: syntax error 
collect2: error: ld returned 1 exit status 
Makefile:573: recipe for target ‘.build_release/lib/libcaffe.so.1.0.0’ failed 
make: * [.build_release/lib/libcaffe.so.1.0.0] Error 1 
 

解决方法: 
移除除libcudnn.so.7.0.1以外的libcudnn.so文件 
/usr/local/cuda/lib64$ sudo rm -rf libcudnn.so libcudnn.so.7 
重新生成 
sudo ln -s libcudnn.so.7.0.1 libcudnn.so.7 
sudo ln -s libcudnn.so.7 libcudnn.so 
然后

make clean 
make all

***************************

但是仍没有解决,后来查阅了cuDNN-API.pdf(链接: https://pan.baidu.com/s/1vCp7V703xyOCOWz4Y8OzxQ 提取码: mr69)才发现,这个函数应该是被removed了

API functions and data types that were removed
Removed functions and data types
cudnnConvolutionBwdDataPreference_t
cudnnConvolutionBwdFilterPreference_t
cudnnConvolutionFwdPreference_t
cudnnGetConvolutionBackwardDataAlgorithm()
cudnnGetConvolutionBackwardFilterAlgorithm()
cudnnGetConvolutionForwardAlgorithm()
cudnnGetRNNDescriptor()
cudnnSetRNNDescriptor()

要使用cudnnGetConvolutionForwardAlgorithm_v7(),新版本的函数。将三个函数都变成新函数名字,就可以编译通过了。在

convolutional_layer.c文件中,类似这样:

    cudnnGetConvolutionForwardAlgorithm_v7(cudnn_handle(),
            l->srcTensorDesc,
            l->weightDesc,
            l->convDesc,
            l->dstTensorDesc,
            CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT,
            2000000000,
            &l->fw_algo);
    cudnnGetConvolutionBackwardDataAlgorithm_v7(cudnn_handle(),
            l->weightDesc,
            l->ddstTensorDesc,
            l->convDesc,
            l->dsrcTensorDesc,
            CUDNN_CONVOLUTION_BWD_DATA_SPECIFY_WORKSPACE_LIMIT,
            2000000000,
            &l->bd_algo);
    cudnnGetConvolutionBackwardFilterAlgorithm_v7(cudnn_handle(),
            l->srcTensorDesc,
            l->ddstTensorDesc,
            l->convDesc,
            l->dweightDesc,
            CUDNN_CONVOLUTION_BWD_FILTER_SPECIFY_WORKSPACE_LIMIT,
            2000000000,
            &l->bf_algo);
}

当很开心的是去运行:

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

发生了段错误:????

又查阅得知,应该修改cfg文件,不然内存会溢出。

将testing取消注释,并将training注释掉testing取消注释,并将training注释掉
在yolov3.cfg文件中,类似这样
[net]
 Testing
 batch=1
 subdivisions=1
# Training
#batch=64
#subdivisions=16
width=608
height=608
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

然后再编译一下,就可以运行了。

运行效果如下:

上述FPS太低了,很不流畅,如果有办法解决,还望交流啊。 

猜你喜欢

转载自blog.csdn.net/weixin_41579872/article/details/108601100#comments_28305949