所用代码以后上传
环境部署
Jetson TX2刷机及安装的软件包版本如下:
整个过程中遇到最多的就是不同tf、keras版本之间导致的问题,所以部署环境的时候千万注意各种包的依赖关系,我因为兼容性问题走了不少弯路。
环境 | 版本 |
---|
Jetpack | 4.5 |
Ubuntu | 18.04 |
cuda | 10.2 |
cudnn | 8.0.0 |
opencv | 4.1.1 |
Tensorflow | 2.5.0 |
keras | 2.3.1 |
python | 3.6.9 |
Tensorflow2+keras环境搭建见TX2安装keras+tensorflow2
实现交通信号灯视频检测
直接将win10调通的代码放到TX2上运行。
windows传输文件到ubuntu见Windows传文件到ubuntu
结果报错,兼容性的问题。TX2上安装的tensorflow并不是真正的tf,而是Tensorflow Lite.还有tf2.5和keras的兼容问题。我不想重新安装环境了,先试着解决报错。
解决报错
1、ImportError: cannot import name ‘multi_gpu_model’
参考完美解决tensorflow-gpu2.4没有multi_gpu_model的问题
我不是这个问题,keras版本为2.3.1,multi_gpu_model()函数就在multi_gpu_utils.py文件中。
解决办法简单粗暴,直接注释掉相关语句了。
2、AttributeError: module ‘tensorflow.python.framework.ops’ has no attribute ‘_TensorLike’
原因是因为tensorflow和keras的版本不匹配,参考AttributeError: module ‘tensorflow.python.framework.ops‘ has no attribute ‘_TensorLike‘
目前keras最高对应tensorflow2.2,没辙了,卸载重装tensorflow吧。
# 卸载原有tf2.5.0
$ sudo pip3 uninstall tensorflow
重新安装tensorflow1.15.5,具体过程见上文链接。
降版本后不再报此错误。
调用demo视频进行检测成功了!
调用TX2板载摄像头进行实时信号灯检测。
需要安装opencv,在win10下直接cv2.VideoCapture(0)
打开笔记本自带摄像头。但是在TX2会报错。
解决报错
1、GStreamer: unable to start pipeline
参考TX2 调用 opencv出现 GStreamer: unable to start pipeline
即改为
cv2.VideoCapture("nvcamerasrc ! video/x-raw(memory:NVMM), width=(int)640, height=(int)480, format=(string)I420, framerate=(fraction)30/1 ! nvvidconv ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink")
可惜不好使。出现了其他报错。先换方法调用摄像头,不行再回来解决报错。
参考Opencv 4.1 打开Jetson TX 2 板载摄像头,好使!
2、不报错了但是还是无法打开摄像头,因为超出内存了。
报错‘Resource exhausted: OOM when allocating tensor with shape[3,3,256,512] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc’
想通过nvidia-smi
查看gpu使用情况结果报错找不到这个命令。
原来TX2没有这个命令,换sudo ~/tegrastats
,我还是不行。
要查看GPU利用率参考NVIDIA TX2 目标检测——查看显卡使用状况
因为嫌麻烦就重启了一下重新运行,没想到运行成功了,怀疑之前有其他进程占用了内存。
待解决
目前这个程序能执行,但是无法看到摄像头实时画面,只能查看保存下来的检测结果视频。
实现实时显示检测结果
添加代码
cv2.imshow('output', image)
cv2.waitKey(1) #一定要延时,否则不能正常显示
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)