本文转载自JK Jung的帖子:https://jkjung-avt.github.io/tx2-camera-caffe/ 如果有侵犯到贴主利益,请立刻跟我联系。
之前,贴主分享了一个python脚本,它可以用来在Jetson TX2上捕捉和显示来自相机(IP、USB或板载)的实时视频。在这里,贴主继续扩展了这个脚本,并展示了如何在捕获的相机映像上运行Caffe图像分类(推断),这些都是在python代码中完成的。这tegra-cam-caffe.py sample应该适合快速验证您的新训练的Caffe图像分类模型,用于原型,或者用实时摄像机输入构建Caffe演示程序。
我主要是在Jetson TX2的python 3测试了代码,不过我认为在Jetson TX1上用Python 2也是可以的。
1
准备工作
1.参考前面的帖子:如何利用Python在Jetson TX2上抓取和显示摄像头影像 ,确认tegra-cam.py 在你的Jetson TX2上运行是OK的。
2.在Jetson TX2安装Caffe,你可以使用BVLC Caffe, NVIDIA Caffe 或者其它你喜欢的Caffe.
3.我的python代码假设构建的Caffe代码位于/ home/nvidia/ Caffe。为了使用defaultbvlc_reference_caffenet模型运行脚本,您必须下载预先训练的权重和标签:
$ cd /home/nvidia/caffe$ ./scripts/download_model_binary.py ./models/bvlc_reference_caffenet$ ./data/ilsvrc12/get_ilsvrc_aux.sh
2
参考
1.How to classify images with Caffe’s python API:https://github.com/BVLC/caffe/blob/master/examples/00-classification.ipynb
2.How to calculate mean pixel values for mean subtraction:https://devtalk.nvidia.com/default/topic/1023944/loading-custom-models-on-jetson-tx2/#5209641
3
如何做
1.下载 tegra-cam-caffe.py 源代码从我的GitHubGist:https://gist.github.com/jkjung-avt/d408aaabebb5b0041c318f4518bd918f ((因为顾虑到很多人访问不了,我把代码copy到这里:http://www.jetsoner.com/thread-148-1-1.html))
2.dump帮助信息:
$ python3 tegra-cam-caffe.py --help
3.使用默认的bvlc_reference_caffenetmodel使用Jetson机载相机(python程序的默认行为)来进行Caffe图像分类。
$ python3 tegra-cam-caffe.py
4.使用USB网络摄像头 /dev/video1 ,同时分辨率设置为 1280x720.
$ python3 tegra-cam-caffe.py --usb --vid 1 --width 1280 --height 720
5.或者使用IP摄像头.
$ python3 tegra-cam-caffe.py --rtsp --uri rtsp://admin:XXXXXX@192.168.1.64:554
6.用板载摄像机对不同的Caffe模型进行图像分类。
当我用一个USB相机和一个菠萝图片测试代码时,默认的bvlc_reference_caffenet说它百分之百肯定(概率~ 1.0)图像是一个菠萝!
接下来,我试着用一种受过NVIDIA数字训练的Caffe模型进行测试。更具体地说,我用“Caltech 101”数据集训练了一个AlexNet,正如在NVIDIA QuikLabs课程中提到的那样:图像分类与数字。这个免费的quicklab课程非常不错的一点是,你可以使用NVIDIA数字的K520 GPU云服务器2小时的访问,完全免费。通过“Caltech 101”数据集成功地培训了一个AlexNet模型(我刚刚训练了30个具有普通SGD和默认学习速率的模型),然后我下载了最后一个培训时代的模型快照:20171022 - 025612-7b04_epoch_30.0.tar.gz。这是快照tarball中的文件列表。
info.json
labels.txt
mean.binaryproto
original.prototxt
snapshot_iter_1620.caffemodel
solver.prototxt
train_val.prototxt
然后我用下面的命令验证了这个训练的Caffe模型。在训练过程中,日志显示这个训练有素的模型的精度仅在67.5%左右(用于对101个对象分类)。在测试时,我确实发现这个模型在许多测试映像上工作得很差。但无论如何,我设法让这个模型正确地将“pegion”的图片分类。
顺便说一下,如果你想用一个为灰度图像输入(例如LeNet)训练的Caffe模型来运行代码,你就必须修改python代码,将输入的相机图像转换成灰度,然后再将它们送到Caffe transformer进行处理。比如: gray = cv2.cvtColor(img_crop, cv2.COLOR_BGR2GRAY) and thennet.blobs["data"].data[...] = transformer.preprocess("data", gray).
我没有使用各种相机或咖啡模型对这段代码做过很多测试。如果您发现代码有问题,请随时告诉我,我将尽快查看。