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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import