一、下载源码
本文采用的源码是:https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3
二、配置环境
由于本文是小白教程,光写几个环境怕有人配置不好或者配置版本搞乱。Faster RCNN配置环境比较复杂。我在这直接贴图我的环境版本图:
先安装tensorflow-gpu,然后依次安装cython、opencv-python、easydict、Pillow、matplotlib、scipy,版本的话看我的版本装就行。
三、安装C++编译环境
根据官网给的安装程序会报错:安装visual studio C++ build tools时遇到安装包缺失或损坏的问题。在这直接下载离线包安装,目前很多博主或者资源都要收费,这里免费共享给大家百度网盘链接:
链接:https://pan.baidu.com/s/1ClJQQ_Tfh9OSME489bNBng
提取码:5czp
下载后解压,右键管理员身份运行,如图:
四、编译环境
首先进入模型文件夹data\coco\PythonAPI下,在这个环境下进入到自己配置的环境中,依次运行以下命令:
python setup.py build_ext --inplace
这里会出现报错:error: command ‘C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\link.exe’ failed with exit status 1158
解决方案:在全局搜索工具中搜索rc.exe,没有工具的自行去下。如图
然后一定要退出窗口重新进入到自己配置的环境中,不退出继续执行还是会报这个错。然后重新运行以下命令:
python setup.py build_ext --inplace
接着运行
python setup.py build_ext install
然后进入到模型文件夹./lib/utils下,运行以下命令:
python setup.py build_ext --inplace
做完这一步,环境就算大功告成了。
五、制作自己的数据集
在data文件夹下新建VOC2007文件夹,VOC2007文件夹结构如图:
接下来划分数据集,会在ImageSets/Main下生成4个txt文件,具体看代码:
import osimport randomtrainval_percent = 0.2train_percent = 0.8xmlfilepath = 'data/VOC2007/Annotations'txtsavepath = 'data/VOC2007/ImageSets/Main'total_xml = os.listdir(xmlfilepath)num = len(total_xml)list = range(num)tv = int(num * trainval_percent)tr = int(tv * train_percent)trainval = random.sample(list, tv)train = random.sample(trainval, tr)ftrainval = open('data/VOC2007/ImageSets/Main/trainval.txt', 'w')ftest = open('data/VOC2007/ImageSets/Main/test.txt', 'w')ftrain = open('data/VOC2007/ImageSets/Main/train.txt', 'w')fval = open('data/VOC2007/ImageSets/Main/val.txt', 'w')for i in list:name = total_xml[i][:-4] + '\n'if i in trainval:ftrainval.write(name)if i in train:ftrain.write(name)else:fval.write(name)else:ftest.write(name)ftrainval.close()ftrain.close()fval.close()ftest.close()
这样数据集就算做好了。
六、开始训练
进入自己配置好的环境:
python train.py
运行开始训练。
七、解决报错
1.AttributeError:module tensorflow no attribute app
解决方案:将import tensorflow as tf 改为import tensorflow.compat.v1 as tf
2.AttributeError: ‘version_info’ object has no attribute ‘version’
解决方案:
找到箭头所指文件,打开将:
class version_info(NamedTuple):major: intminor: intmicro: intreleaselevel: strserial: int@propertydef __version__(self):return "{}.{}.{}".format(self.major, self.minor, self.micro) + ("{}{}{}".format("r" if self.releaselevel[0] == "c" else "",self.releaselevel[0],self.serial,),"",)[self.releaselevel == "final"]def __str__(self):return "{} {} / {}".format(__name__, self.__version__, __version_time__)def __repr__(self):return "{}.{}({})".format(__name__,type(self).__name__,", ".join("{}={!r}".format(*nv) for nv in zip(self._fields, self)),)
替换为:
class version_info():def __init__(self, major: int, minor: int, micro: int, releaselevel: str, serial: int):self.major = majorself.minor = minorself.micro = microself.releaselevel = releaselevelself.serial = serial@propertydef __version__(self):return "{}.{}.{}".format(self.major, self.minor, self.micro) + ("{}{}{}".format("r" if self.releaselevel[0] == "c" else "",self.releaselevel[0],self.serial,),"",)[self.releaselevel == "final"]def __str__(self):return "{} {} / {}".format(__name__, self.__version__, __version_time__)def __repr__(self):return "{}.{}({})".format(__name__,type(self).__name__,", ".join("{}={!r}".format(*nv) for nv in zip(self._fields, self)),)