Ubuntu18.04实现Tensorflow框架下的Fasterrcnn目标检测

2023-11-10 06:00

本文主要是介绍Ubuntu18.04实现Tensorflow框架下的Fasterrcnn目标检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考链接有,再次感谢各位前辈:

https://github.com/XuleiTao/ilove996/tree/master/tf-faster-rcnn

Faster R-CNN Github源码 tensorflow GPU下demo运行,训练,测试,验证,可视化。_CVDLML的博客-CSDN博客

python3+Tensorflow+Faster R-CNN训练自己的数据_北冥有杨其名为超的博客-CSDN博客

 Ubuntu+GPU+Tensorflow运行tf-faster-rcnn【光纤分类项目】 - 简书

 最近因为需要完成FasterRCNN的加速优化,找了一些资料,参考一些博客和github上的代码,找到了一个可能实现的,准备试一试。首先第一步要实现FasterRCNN的模型训练和检测,找到一个在前辈们努力的基础上实现的一个代码,现在记录下我走过的过程,供大家参考!也方便自己以后需要的时候回顾,持续更新..........

Faster_RCNN源码:GitHub - endernewton/tf-faster-rcnn: Tensorflow Faster RCNN for Object Detection

一、环境配置

1、系统:Ubuntu18.04

2、显卡:GTX 1060  (后面有用先要确认)

lspci | grep -i vga
# 显卡是GeForce GTX 1060 6GB

3、虚拟环境(Anaconda3)

 一般情况下,我都是创建虚拟环境进行训练测试,因为很方便,用完后可以直接删掉,并且出错了可以重来,不用害怕死机,下面是我之前写的一个文章有Anaconda3的安装,有需要可以看看

Ubuntu18.04+CUDA10.0+cudnn7.6.5+Anaconda3+pytorch==1.2.0 torchvision==0.4.0_beautifulback的博客-CSDN博客

 步骤:

conda create -n tf_fasterrcnn python==3.6# To activate this environment, use
#
#     $ conda activate tf_fasterrcnn
#
# To deactivate an active environment, use
#
#     $ conda deactivateconda activate tf_fasterrcnn

 4、Tensorflow1.9 + cuda10.2+cudnn8.3.0

! ! ! 当然你也可以用自己现有的版本,只是说你的cuda+cudnn需要和Tensorflow版本对应

! ! ! 这个工程之前有博主(上面链接有,他用的是cuda==9.0)验证过tensorflow1.2.1不行,升级到tensorflow1.12.0版本太高,与CUDN9.0不兼容(CUDN9.0 + CUDNN7.0.5(安装参考此教程)tensorflow-gpu 1.7.0,python -m pip install tensorflow-gpu==1.7.0)

因为原博客是几年前写的当时的cuda用的是9.0,但是现在我大多数时候都是用的cuda==10.2,不想麻烦重新下旧版本,就直接在cuda10.2+cudnn8.3.0基础上找对应的Tensorflow的版本,有博客推荐用Tensorflow==1.9,于是我安装的1.9,实时证明可以成功了!

① cuda10.2+cudnn8.3.0安装:https://blog.csdn.net/m0_53397118/article/details/121896304

nvcc -V    # 查看cuda的版本cat /usr/local/cuda-10.2/include/cudnn_version.h | grep CUDNN_MAJOR -A 2    # 查看cudnn的版本

② Tensorflow==1.9安装:

conda install tensorflow-gpu=1.9# 安装完成后,可以在环境中用下面的命令查看(我的是这样的)
(base) lh@lh:~$ conda activate tf_fasterrcnn
(tf_fasterrcnn) lh@lh:~$ python
Python 3.6.0 | packaged by conda-forge | (default, Feb  9 2017, 14:36:55) 
[GCC 4.8.2 20140120 (Red Hat 4.8.2-15)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>> tensorflow.__version__
'1.9.0'

但是刚刚安装完可能会出现这样的情况,可以看到最后import tensorflow也是对的,并且我也试过并不影响后面的使用,但是后来我还是看着不太舒服,想把这一串报错去掉,找到了原因。

我们一般现在创建虚拟换将python==3.6或者以上,都是自带的numpy==1.19.5,这与这个tensorflow版本有点冲突,需要降低numpy的版本,很简单!两条命令就可以解决:

参考:Numpy卸载与重装_多多有个梦想的博客-CSDN博客_卸载numpy

pip uninstall numpy    # Successfully uninstalled numpy-1.19.5(卸载高版本的numpy==1.19.5)pip install numpy==1.16.4    # Successfully installed numpy-1.16.4(安装低版本numpy==1.16.4)
# pip install -U numpy== 1.16.4 (或可使用)如果出现卸载不了numpy==1.19.5,可以直接在我们自己创建的虚拟环境中手动移动到回收站,在site-packages里面,
它的路径是(我的是):/home/lh/anaconda3/envs/tf_fasterrcnn/lib/python3.6/site-packages/numpy-1.19.5.dist-info,只删除numpy-1.19.5.dist-info,其他不动。然后再执行上面两步,如果有红色报错或者黄色警告,但最终有#后面生成的部分,就表示成功了,可以用它查看:
import numpy
numpy.__version__  # 1.16.4

5、补充需要的包的安装 + 出现过的错误(后续执行过程有什么问题都可以在这里找)

# ModuleNotFoundError: No module named 'Cython'
pip install cython# ModuleNotFoundError: No module named 'matplotlib'
pip install matplotlib# ModuleNotFoundError: No module named 'cv2'
pip install opencv-python# ModuleNotFoundError: No module named 'easydict'
pip install easydict# AttributeError: 'version_info' object has no attribute '__version__'
pip install pyparsing==2.4.7# ModuleNotFoundError: No module named 'scipy'
pip install scipy  --user# ModuleNotFoundError: No module named 'yaml'
pip install pyyaml#可能出现的错误
TypeError: load() missing 1 required positional argument: 'Loader'
由于Yaml 5.1版本后弃用了 yaml.load(file) 这个用法。Yaml 5.1版本之后就修改了需要指定Loader,通过默认加载​​器(FullLoader)禁止执行任意函数,使得此load函数的安全得到加强。
File "/home/lh/下载/tf-faster-rcnn/tools/../lib/model/config.py", line 362, in cfg_from_fileyaml_cfg = edict(yaml.load(f))改为:yaml_cfg = edict(yaml.safe_load(f))

二、文件配置和测试过程

 1. 从Github上克隆或直接打开下面的链接下载提取工程文件tf-asterr-cnn

git clone https://github.com/endernewton/tf-faster-rcnn.git

2. 根据自己电脑的显卡,更改对应的计算单元,在tf-faster-rcnn/lib/setup.py的第130行,GTX 1060对应的是sm_61。在这可以查到每种显卡对应的计算单元

# 我的路径如下
cd /home/lh/下载/tf-faster-rcnn/lib
vim steup.py

3. 在 tf-faster-rcnn/lib文件夹下运行下面的代码:

make clean      # 输出是:rm -rf */*.pyc   、   rm -rf */*.so
make            # 输出是编译的过程
cd ..           # 退回到tf-faster-rcnn根目录

 注意:这里结束后是在tf-faster-rcnn/文件夹下。

4. 安装COCO API(代码需要API来访问COCO dataset),按下面步骤运行即可:

cd data      # 这里是tf-faster-rcnn/data/文件夹下
git clone https://github.com/pdollar/coco.git
cd coco/PythonAPI      # 在data文件夹下,用上面的命令下载了coco文件夹,进入到里面的PythonAPI/文件夹下
make
cd ../../..      # 这里是退回到了tf-faster-rcnn/文件夹下

5. 下载数据(与其他下载VOC2007一样),这里下载完后是在tf-faster-rcnn/文件夹下。

① Download the training, validation, test data and VOCdevkit(下载后有3个文件夹)

这个过程如下但很漫长,我下载并保存到了我的网盘中链接: Pascal VOC2007(提取码:htl5)

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar

② Extract all of these tars into one directory named VOCdevkit(解压后得到一个文件夹)

tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar

 ③ It should have this basic structure(这是看它的文件夹下有那些内容)

$VOCdevkit/                           # development kit
$VOCdevkit/VOCcode/                   # VOC utility code
$VOCdevkit/VOC2007                    # image sets, annotations, etc.
# ... and several other directories ...

④ Create symlinks for the PASCAL VOC dataset(创建软连接)

cd $FRCN_ROOT/data
ln -s $VOCdevkit VOCdevkit2007

之前看了好多博客关于这一步没有详细的写,或者创建软连接不成功(这种简单的办法就是直接将上面得到的VOCdevkit文件夹直接复制到tf-faster-rcnn/data/文件夹下)

以我自己的为例,这里的$VOCdevkit可以创建绝对路径就能成功了,看到有个向上的箭头!

# (tf_fasterrcnn) lh@lh:~/下载/tf-faster-rcnn$ cd data
cd data    # lh是我的用户名
ln -s /home/lh/下载/tf-faster-rcnn/VOCdevkit VOCdevkit2007  

 6. 下载预训练模型

./data/scripts/fetch_faster_rcnn_models.sh

 有几百M大小,下载速度慢,试过好像已经被删除了(这个文件夹里的文件就是这个作用)。提供以下网盘下载:voc_0712_80k-110k.tgz(提取码:9eob)、这里特别感谢:博主。下载的预训练模型为:voc_0712_80k-110k.tgz。

用下面的命令解压.tgz得到voc_2007_trainval+voc_2012_trainval文件夹:

tar xvf voc_0712_80k-110k.tgz

至此,tf-faster-rcnn/data/文件夹下的所需的文件都已经准备齐全了!(蓝色的是本来有的、红色是后期下载准备的、橘色的就是创建的软连接)

 7. 创建一个文件夹和一个软链接以使用预训练模型

tf-faster-rcnn根目录创建一个output文件夹并且在其中存放预训练模型的软链接,使用软连接来使用预训练模型,output文件夹中会在每次训练后存放训练好的模型,步骤:

    NET=res101TRAIN_IMDB=voc_2007_trainval+voc_2012_trainvalmkdir -p output/${NET}/${TRAIN_IMDB}cd output/${NET}/${TRAIN_IMDB}ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./defaultcd ../../..      # 这里介绍后是在tf-faster-rcnn/文件加下

8. 测试demo(这里我的电脑用的GPU_ID= 0)

GPU_ID=0CUDA_VISIBLE_DEVICES=${GPU_ID} ./tools/demo.py

运行过程:

测试的图片在/tf-faster-rcnn/data/demo文件里

有的博客写的是 GPU_ID = 01,但是我用这个会出现下面的错误,于是改为GPU_ID = 0,如果在测试过程中也有这样的错误(no CUDA-capable device is detected),你可以改改!

重点来了!忙了这么就终于可以看看效果了(会连续弹出好多张),其中一张结果如图:

demo.py效果图

 三、使用训练好的faster模型对数据进行测试

在tf-faster-rcnn/文件目录下运行:

GPU_ID=0
./experiments/scripts/test_faster_rcnn.sh $GPU_ID pascal_voc_0712 res101

这里有点地方需要改:首先把 tf-faster-rcnn/lib/datasets/voc_eval.py的第121行的

with open(cachefile,'w') as f修改为:
with open(cachefile,'wb') as f

同时还要把第105行的 

cachefile = os.path.join(cachedir, '%s_annots.pkl' % imagesetfile)修改为:
cachefile = os.path.join(cachedir, '%s_annots.pkl' % imagesetfile.split("/")[-1].split(".")[0])

过程中可能会出现问题,在上面第一大点的第5小点有相关解决办法(如果之前你已经安装了相应的包,应该在运行过程中就没有问题了),过程如图:

未完全测试完,待续.................

============================================================================

会在output文件夹下建立一个路径为:
/output/res101/voc_2007_test/default/res101_faster_rcnn_iter_110000/
的文件夹,res101代表网络名称,voc_2007_test代表数据集,与训练不同,该文件夹下不再是模型文件,tf-faster-rcnn平台搭建完成!

四、train:

这篇关于Ubuntu18.04实现Tensorflow框架下的Fasterrcnn目标检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/380794

相关文章

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

MyBatisX逆向工程的实现示例

《MyBatisX逆向工程的实现示例》本文主要介绍了MyBatisX逆向工程的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录逆向工程准备好数据库、表安装MyBATisX插件项目连接数据库引入依赖pom.XML生成实体类、

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

Java实现MinIO文件上传的加解密操作

《Java实现MinIO文件上传的加解密操作》在云存储场景中,数据安全是核心需求之一,MinIO作为高性能对象存储服务,支持通过客户端加密(CSE)在数据上传前完成加密,下面我们来看看如何通过Java... 目录一、背景与需求二、技术选型与原理1. 加密方案对比2. 核心算法选择三、完整代码实现1. 加密上

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3