TensorFlow1.8.0+Python3.6+CUDA-9.0+Faster-RCNN训练自己的数据集! |
文章目录
前期准备
-
主要参考github代码 :https://github.com/endernewton/tf-faster-rcnn
-
主要参考CSDN文章1:https://zhuanlan.zhihu.com/p/31426458
-
主要参考简书中文章2:Tensorflow-Faster-Rcnn解读
-
程序运行环境包如下:
(tf36) zhangkf@wang-ThinkStation-P520:~/tf/tf-faster-rcnn-master$ conda list
# packages in environment at /home/zhangkf/anaconda3/envs/tf36:
#
# Name Version Build Channel
_libgcc_mutex 0.1 main https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
absl-py 0.8.1 pypi_0 pypi
astor 0.8.0 pypi_0 pypi
bleach 1.5.0 pypi_0 pypi
ca-certificates 2019.8.28 0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
certifi 2019.9.11 py36_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
cycler 0.10.0 pypi_0 pypi
cython 0.29.13 pypi_0 pypi
easydict 1.9 pypi_0 pypi
gast 0.3.2 pypi_0 pypi
grpcio 1.24.1 pypi_0 pypi
html5lib 0.9999999 pypi_0 pypi
kiwisolver 1.1.0 pypi_0 pypi
libedit 3.1.20181209 hc058e9b_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
libffi 3.2.1 hd88cf55_4 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
libgcc-ng 9.1.0 hdf63c60_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
libstdcxx-ng 9.1.0 hdf63c60_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
markdown 3.1.1 pypi_0 pypi
matplotlib 3.1.1 pypi_0 pypi
ncurses 6.1 he6710b0_1 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
numpy 1.17.3 pypi_0 pypi
opencv-python 3.4.0.14 pypi_0 pypi
openssl 1.1.1d h7b6447c_3 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
pillow 6.2.0 pypi_0 pypi
pip 19.2.3 py36_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
protobuf 3.10.0 pypi_0 pypi
pyparsing 2.4.2 pypi_0 pypi
python 3.6.9 h265db76_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
python-dateutil 2.8.0 pypi_0 pypi
pyyaml 5.1.2 pypi_0 pypi
readline 7.0 h7b6447c_5 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
scipy 1.3.1 pypi_0 pypi
setuptools 41.4.0 py36_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
six 1.12.0 pypi_0 pypi
sqlite 3.30.0 h7b6447c_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
tensorboard 1.8.0 pypi_0 pypi
tensorflow-gpu 1.8.0 pypi_0 pypi
termcolor 1.1.0 pypi_0 pypi
tk 8.6.8 hbc83047_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
werkzeug 0.16.0 pypi_0 pypi
wheel 0.33.6 py36_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
xz 5.2.4 h14c3975_4 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
zlib 1.2.11 h7b6447c_3 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- 其中下载的
github
程序结构为:
data: #存放demo测试数据、预训练模型、训练数据(VOC2007数据格式)
docker: #cuda文件
experiments: #训练测试sh文件、训练测试过程日志文件
lib: #数据读取、训练模型等文件
tools: #模型训练、验证等python文件
一. Faster-RCNN简要介绍
1.1. Faster-RCNN网络结构图
Faster-RCNN
网络结构图参考作者 一文读懂Faster RCNN!
- 上图展示了
python
版本中的VGG16
模型中的faster_rcnn_test.pt
的网络结构,可以清晰的看到该网络对于一副任意大小PxQ
的图像,首先缩放至固定大小MxN
,然后将MxN
图像送入网络;而Conv layers
中包含了13
个conv
层+13
个relu
层+4
个pooling
层;RPN
网络首先经过3x3
卷积,再分别生成positive anchors
和对应bounding box regression
偏移量,然后计算出proposals
;而Roi Pooling
层则利用proposals
从feature maps
中提取proposal feature
送入后续全连接和softmax
网络作classification
(即分类proposal
到底是什么object
)。
二. Faster-RCNN训练步骤
2.1. 编译Cython
- 1. 首先克隆代码:
git clone https://github.com/endernewton/tf-faster-rcnn
- 2. 根据你的显卡更改下对应的计算单元。在
/lib/setup.py
的第130
行,TitanX
对应的是sm_52
。在这可以查到每种显卡对应的计算单元!
- 3. 编译Cython: 仍然在
lib
路径下,编译Cython
模块
make clean
make
cd ..
- 4. 编译完成显示如下:
(tf36) zhangkf@wang-ThinkStation-P520:~/tf/tf-faster-rcnn-master/lib$ make clean
rm -rf */*.pyc
rm -rf */*.so
(tf36) zhangkf@wang-ThinkStation-P520:~/tf/tf-faster-rcnn-master/lib$ make
python setup.py build_ext --inplace
running build_ext
skipping 'utils/bbox.c' Cython extension (up-to-date)
building 'utils.cython_bbox' extension
creating build
creating build/temp.linux-x86_64-3.6
creating build/temp.linux-x86_64-3.6/utils
{'gcc': ['-Wno-cpp', '-Wno-unused-function']}
gcc -pthread -B /home/zhangkf/anaconda3/envs/tf36/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/zhangkf/anaconda3/envs/tf36/lib/python3.6/site-packages/numpy/core/include -I/home/zhangkf/anaconda3/envs/tf36/include/python3.6m -c utils/bbox.c -o build/temp.linux-x86_64-3.6/utils/bbox.o -Wno-cpp -Wno-unused-function
gcc -pthread -shared -B /home/zhangkf/anaconda3/envs/tf36/compiler_compat -L/home/zhangkf/anaconda3/envs/tf36/lib -Wl,-rpath=/home/zhangkf/anaconda3/envs/tf36/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.6/utils/bbox.o -o /home/zhangkf/tf/tf-faster-rcnn-master/lib/utils/cython_bbox.cpython-36m-x86_64-linux-gnu.so
skipping 'nms/cpu_nms.c' Cython extension (up-to-date)
building 'nms.cpu_nms' extension
creating build/temp.linux-x86_64-3.6/nms
{'gcc': ['-Wno-cpp', '-Wno-unused-function']}
gcc -pthread -B /home/zhangkf/anaconda3/envs/tf36/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/zhangkf/anaconda3/envs/tf36/lib/python3.6/site-packages/numpy/core/include -I/home/zhangkf/anaconda3/envs/tf36/include/python3.6m -c nms/cpu_nms.c -o build/temp.linux-x86_64-3.6/nms/cpu_nms.o -Wno-cpp -Wno-unused-function
gcc -pthread -shared -B /home/zhangkf/anaconda3/envs/tf36/compiler_compat -L/home/zhangkf/anaconda3/envs/tf36/lib -Wl,-rpath=/home/zhangkf/anaconda3/envs/tf36/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.6/nms/cpu_nms.o -o /home/zhangkf/tf/tf-faster-rcnn-master/lib/nms/cpu_nms.cpython-36m-x86_64-linux-gnu.so
skipping 'nms/gpu_nms.cpp' Cython extension (up-to-date)
building 'nms.gpu_nms' extension
{'gcc': ['-Wno-unused-function'], 'nvcc': ['-arch=sm_52', '--ptxas-options=-v', '-c', '--compiler-options', "'-fPIC'"]}
/usr/local/cuda-9.0/bin/nvcc -I/home/zhangkf/anaconda3/envs/tf36/lib/python3.6/site-packages/numpy/core/include -I/usr/local/cuda-9.0/include -I/home/zhangkf/anaconda3/envs/tf36/include/python3.6m -c nms/nms_kernel.cu -o build/temp.linux-x86_64-3.6/nms/nms_kernel.o -arch=sm_52 --ptxas-options=-v -c --compiler-options '-fPIC'
ptxas info : 0 bytes gmem
ptxas info : Compiling entry function '_Z10nms_kernelifPKfPy' for 'sm_52'
ptxas info : Function properties for _Z10nms_kernelifPKfPy
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 23 registers, 1280 bytes smem, 344 bytes cmem[0], 12 bytes cmem[2]
{'gcc': ['-Wno-unused-function'], 'nvcc': ['-arch=sm_52', '--ptxas-options=-v', '-c', '--compiler-options', "'-fPIC'"]}
gcc -pthread -B /home/zhangkf/anaconda3/envs/tf36/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/zhangkf/anaconda3/envs/tf36/lib/python3.6/site-packages/numpy/core/include -I/usr/local/cuda-9.0/include -I/home/zhangkf/anaconda3/envs/tf36/include/python3.6m -c nms/gpu_nms.cpp -o build/temp.linux-x86_64-3.6/nms/gpu_nms.o -Wno-unused-function
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
In file included from /home/zhangkf/anaconda3/envs/tf36/lib/python3.6/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830:0,
from /home/zhangkf/anaconda3/envs/tf36/lib/python3.6/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,
from /home/zhangkf/anaconda3/envs/tf36/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h:4,
from nms/gpu_nms.cpp:346:
/home/zhangkf/anaconda3/envs/tf36/lib/python3.6/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy
g++ -pthread -shared -B /home/zhangkf/anaconda3/envs/tf36/compiler_compat -L/home/zhangkf/anaconda3/envs/tf36/lib -Wl,-rpath=/home/zhangkf/anaconda3/envs/tf36/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.6/nms/nms_kernel.o build/temp.linux-x86_64-3.6/nms/gpu_nms.o -L/usr/local/cuda-9.0/lib64 -Wl,-R/usr/local/cuda-9.0/lib64 -lcudart -o /home/zhangkf/tf/tf-faster-rcnn-master/lib/nms/gpu_nms.cpython-36m-x86_64-linux-gnu.so
rm -rf build
- 5. 安装COCO API
cd data
git clone https://github.com/pdollar/coco.git
cd coco/PythonAPI
make
cd ../../..
2.2. 执行demo.py
-
1. 下载预训练模型:这一步下载需要翻墙往往下载不成功,因此可以在此网盘中下载:百度网盘提取码:kw53
-
下载后放在data目录下进行解压
tar xvf voc_0712_80k-110k.tgz
-
2. 建立预训练模型的软连接:这一步的目的是在
tf-faster-rcnn
目录下建立output
文件夹,并使用软连接来使用预训练模型,使用以下代码这里按照步骤走就行:
NET=res101
TRAIN_IMDB=voc_2007_trainval+voc_2012_trainval
mkdir -p output/${NET}/${TRAIN_IMDB}
cd output/${NET}/${TRAIN_IMDB}
ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./default
cd ../../..
- 3. demo测试:
GPU_ID=0 # GPU_ID为显卡列表;可以为01...
CUDA_VISIBLE_DEVICES=${GPU_ID} ./tools/demo.py
- 4. 最终执行结果如下:
2019-10-21 09:45:11.064981: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1356] Found device 0 with properties:
name: TITAN Xp major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:65:00.0
totalMemory: 11.91GiB freeMemory: 10.26GiB
2019-10-21 09:45:11.065014: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1435] Adding visible gpu devices: 0
2019-10-21 09:45:11.349740: I tensorflow/core/common_runtime/gpu/gpu_device.cc:923] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-10-21 09:45:11.349778: I tensorflow/core/common_runtime/gpu/gpu_device.cc:929] 0
2019-10-21 09:45:11.349787: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 0: N
2019-10-21 09:45:11.349962: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 9928 MB memory) -> physical GPU (device: 0, name: TITAN Xp, pci bus id: 0000:65:00.0, compute capability: 6.1)
Loaded network output/res101/voc_2007_trainval+voc_2012_trainval/default/res101_faster_rcnn_iter_110000.ckpt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/000456.jpg
Detection took 2.120s for 300 object proposals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/000542.jpg
Detection took 0.084s for 300 object proposals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/001150.jpg
Detection took 0.120s for 300 object proposals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/001763.jpg
Detection took 0.106s for 300 object proposals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/004545.jpg
Detection took 0.117s for 300 object proposals
2.3. 使用训练好的faster模型对数据进行测试
- 这里有点地方需要改:首先把
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])
- 然后再进行测试:
GPU_ID=0
./experiments/scripts/test_faster_rcnn.sh $GPU_ID pascal_voc_0712 res101
- 等待一段时间,最终测试结果如下:
Saving cached annotations to /home/zhangkf/tf/tf-faster-rcnn-master/data/VOCdevkit2007/annotations_cache/test_annots.pkl
AP for aeroplane = 0.8300
AP for bicycle = 0.8684
AP for bird = 0.8136
AP for boat = 0.7407
AP for bottle = 0.6852
AP for bus = 0.8764
AP for car = 0.8804
AP for cat = 0.8830
AP for chair = 0.6245
AP for cow = 0.8679
AP for diningtable = 0.7080
AP for dog = 0.8852
AP for horse = 0.8727
AP for motorbike = 0.8297
AP for person = 0.8273
AP for pottedplant = 0.5327
AP for sheep = 0.8108
AP for sofa = 0.7752
AP for train = 0.8361
AP for tvmonitor = 0.7924
Mean AP = 0.7970
~~~~~~~~
Results:
0.830
0.868
0.814
0.741
0.685
0.876
0.880
0.883
0.624
0.868
0.708
0.885
0.873
0.830
0.827
0.533
0.811
0.775
0.836
0.792
0.797
~~~~~~~~
--------------------------------------------------------------
Results computed with the **unofficial** Python eval code.
Results should be very close to the official MATLAB eval code.
Recompute with `./tools/reval.py --matlab ...` for your paper.
-- Thanks, The Management
--------------------------------------------------------------
579.71user 119.19system 12:20.83elapsed 94%CPU (0avgtext+0avgdata 2226548maxresident)k
0inputs+80728outputs (0major+5967443minor)pagefaults 0swaps
- 到这里,前面的这些步骤都是在运行源码,以及利用训练好的模型进行测试。
2.4. 训练Pascal VOC数据集
-
首先下载VGG模型:百度网盘提取码:2e0y ;然后在
data
目录下创建一个imagenet_weights
文件夹,解压权重数据并把解压后的vgg_16.ckpt
重命名为vgg16.ckpt
,因为后面在调用权重数据的时候名字需要对应的上。 -
现在就可以进行训练了,但是为了节省时间并排除错误,我把迭代次数只设置了
500
次,具体操作为:
# 首先把
./experiments/scripts/train_faster_rcnn.sh #把这个文件里的第22行把ITERS=70000改成ITERS=500,
# 其次把
./experiments/scripts/test_faster_rcnn.sh #把这个文件里的的ITERS也改成500。
-
注意:因为我使用的是
pascal_voc
数据集,所以只需要更改对应数据集的ITERS
的就行了,训练和测试的都要改,因为在train_faster_rcnn.sh
的末尾会执行test_faster_rcnn.sh
。 -
开始训练(这里最后的
vgg16
就是对应的权重数据,名字要对的上,0
是GPU
的ID
,pascal_voc
是训练使用的数据集):
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16
- 训练过程的
loss
:
Fix VGG16 layers..
Fixed.
iter: 20 / 500, total loss: 1.995727
>>> rpn_loss_cls: 0.339967
>>> rpn_loss_box: 0.060159
>>> loss_cls: 0.901823
>>> loss_box: 0.561943
>>> lr: 0.001000
speed: 0.608s / iter
iter: 40 / 500, total loss: 1.055077
>>> rpn_loss_cls: 0.703311
>>> rpn_loss_box: 0.217334
>>> loss_cls: 0.002587
>>> loss_box: 0.000000
>>> lr: 0.001000
speed: 0.512s / iter
- 训练结果:
VOC07 metric? Yes
AP for aeroplane = 0.0498
AP for bicycle = 0.2000
AP for bird = 0.1067
AP for boat = 0.0109
AP for bottle = 0.0003
AP for bus = 0.0795
AP for car = 0.1496
AP for cat = 0.2337
AP for chair = 0.0538
AP for cow = 0.0649
AP for diningtable = 0.0122
AP for dog = 0.2165
AP for horse = 0.2233
AP for motorbike = 0.1858
AP for person = 0.2117
AP for pottedplant = 0.0075
AP for sheep = 0.0453
AP for sofa = 0.1428
AP for train = 0.0957
AP for tvmonitor = 0.0547
Mean AP = 0.1072
~~~~~~~~
Results:
0.050
0.200
0.107
0.011
0.000
0.080
0.150
0.234
0.054
0.065
0.012
0.216
0.223
0.186
0.212
0.007
0.045
0.143
0.096
0.055
0.107
~~~~~~~~
--------------------------------------------------------------
Results computed with the **unofficial** Python eval code.
Results should be very close to the official MATLAB eval code.
Recompute with `./tools/reval.py --matlab ...` for your paper.
-- Thanks, The Management
--------------------------------------------------------------
420.61user 79.41system 9:59.83elapsed 83%CPU (0avgtext+0avgdata 3191188maxresident)k
三. 使用自己的数据集进行训练+测试
3.1. 数据集制作
- 此部分为替换自己的
voc
格式的数据集:DL笔记:PascalVOC 数据集介绍+数据集标注工具! - 这里补充一下:把一个目录下的文件名字按序号命名:比如我们将图片的名字修改为
000001.jpg
这种格式的,统一命名方法,可以参考如下代码(重要)! - 1. MATLAB代码实现如下
%%
%图片保存路径为:
%E:\image\car
%E:\image\person
%car和person是保存车和行人的文件夹
%这些文件夹还可以有多个,
%放在image文件夹里就行
%该代码的作用是将图片名字改成000123.jpg这种形式
%%
clc;
clear;
maindir='E:\image\';
name_long=5; %图片名字的长度,如000123.jpg为6,最多9位,可修改
num_begin=1; %图像命名开始的数字如000123.jpg开始的话就是123
subdir = dir(maindir);
n=1;
for i = 1:length(subdir)
if ~strcmp(subdir(i).name ,'.') && ~strcmp(subdir(i).name,'..')
subsubdir = dir(strcat(maindir,subdir(i).name));
for j=1:length(subsubdir)
if ~strcmp(subsubdir(j).name ,'.') && ~strcmp(subsubdir(j).name,'..')
img=imread([maindir,subdir(i).name,'\',subsubdir(j).name]);
imshow(img);
str=num2str(num_begin,'%09d');
newname=strcat(str,'.jpg');
newname=newname(end-(name_long+3):end);
system(['rename ' [maindir,subdir(i).name,'\',subsubdir(j).name] ' ' newname]);
num_begin=num_begin+1;
fprintf('当前处理文件夹%s',subdir(i).name);
fprintf('已经处理%d张图片\n',n);
n=n+1;
pause(0.1);%可以将暂停去掉
end
end
end
end
- 2. python代码实现如下
import os
path = "E:\\image"
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
count=0
for file in filelist:
print(file)
for file in filelist: #遍历所有文件
Olddir=os.path.join(path,file) #原来的文件路径
if os.path.isdir(Olddir): #如果是文件夹则跳过
continue
filename=os.path.splitext(file)[0] #文件名
filetype=os.path.splitext(file)[1] #文件扩展名
Newdir=os.path.join(path,str(count).zfill(6)+filetype) #用字符串函数zfill 以0补全所需位数
os.rename(Olddir,Newdir)#重命名
count+=1
- 把一个目录下的jpg格式的图片转换成png格式
import os
import cv2
import sys
import numpy as np
path = './test/'
newpath = './test_jpg_png/'
print(path)
for filename in os.listdir(path):
if os.path.splitext(filename)[1] == '.jpg':
# print(filename)
img = cv2.imread(path + filename)
print(filename.replace(".jpg", ".png"))
newfilename = filename.replace(".jpg", ".png")
# cv2.imshow("Image",img)
# cv2.waitKey(0)
cv2.imwrite(newpath + newfilename, img)
3.2. 开始训练
- 数据集制作好了之后,就开始替换自己的数据了:首先,在
tf-faster-rcnn/lib/datasets
目录下的pascal_voc.py
里第36
行更改自己的类别,’__background__
'切记不可删掉,把后面的原来的20
个label
换成自己的,不用更改类别数目,也没有地方可以更改。
-
然后把你的
xml
文件放置在VOCdevkit2007/VOC2007/Annotations
路径下,记得把原来的删掉;同时把你的png
文件放在VOCdevkit2007/VOC2007/JPEGImages
路径下,xml
和png
替换完了,现在该txt
了,把之前matlab
生成是四个txt
文档放在VOCdevkit2007/VOC2007/ImageSets/Layout
和VOCdevkit2007/VOC2007/ImageSets/Main
。 -
在开始训练之前,还需要把之前训练产生的模型以及
cache
删除掉,分别在tf-faster-rcnn/output/vgg16/voc_2007_trainval/default
路径下和tf-faster-rcnn/data/cache
路径下,然后就可以开始训练了:
./experiments/scripts/train_faster_rcnn.sh 01 pascal_voc vgg16
- 解析
train_faster_rcnn.sh
文件:
#!/bin/bash
set -x # 将后面执行的命令输出到屏幕
set -e # 如果命令的返回值不是0 则退出shell
export PYTHONUNBUFFERED="True" # 和缓存有关系的一个变量,使得按顺序输出
GPU_ID=$1 # 这一部分是读取命令信息,包括GPU的编号,网络类型,以及数据集类型等
DATASET=$2
NET=$3
array=( $@ )
len=${#array[@]}
EXTRA_ARGS=${array[@]:3:$len}
EXTRA_ARGS_SLUG=${EXTRA_ARGS// /_}
case ${DATASET} in # 根据输入数据类型,进行不同的处理,分为4种情况pascal_voc; 07+12; coco; 错误类型
pascal_voc)
TRAIN_IMDB="voc_2007_trainval" # 定义相应的变量
TEST_IMDB="voc_2007_test"
STEPSIZE="[50000]"
ITERS=100000 # 定义迭代次数
ANCHORS="[8,16,32]"
RATIOS="[0.5,1,2]"
;;
pascal_voc_0712)
TRAIN_IMDB="voc_2007_trainval+voc_2012_trainval"
TEST_IMDB="voc_2007_test"
STEPSIZE="[80000]"
ITERS=110000 # 定义迭代次数
ANCHORS="[8,16,32]"
RATIOS="[0.5,1,2]"
;;
coco)
TRAIN_IMDB="coco_2014_train+coco_2014_valminusminival"
TEST_IMDB="coco_2014_minival"
STEPSIZE="[350000]"
ITERS=490000
ANCHORS="[4,8,16,32]"
RATIOS="[0.5,1,2]"
;;
*)
echo "No dataset given"
exit
;;
esac
# 训练日志的存储路径
LOG="experiments/logs/${NET}_${TRAIN_IMDB}_${EXTRA_ARGS_SLUG}_${NET}.txt.`date +'%Y-%m-%d_%H-%M-%S'`"
exec &> >(tee -a "$LOG")
echo Logging output to "$LOG"
# 加载网络训练的相关参数
set +x
if [[ ! -z ${EXTRA_ARGS_SLUG} ]]; then
NET_FINAL=output/${NET}/${TRAIN_IMDB}/${EXTRA_ARGS_SLUG}/${NET}_faster_rcnn_iter_${ITERS}.ckpt
else
NET_FINAL=output/${NET}/${TRAIN_IMDB}/default/${NET}_faster_rcnn_iter_${ITERS}.ckpt
fi
set -x
# 开始进行训练
if [ ! -f ${NET_FINAL}.index ]; then
if [[ ! -z ${EXTRA_ARGS_SLUG} ]]; then
CUDA_VISIBLE_DEVICES=${GPU_ID} time python ./tools/trainval_net.py \ # 加载train_net.py进行训练;
--weight data/imagenet_weights/${NET}.ckpt \ # weight:预训练模型的参数
--imdb ${TRAIN_IMDB} \ # imdb:训练的数据集,别名:imdb_name
--imdbval ${TEST_IMDB} \ # imdbval:测试的数据集,别名:imdbval_name
--iters ${ITERS} \ # iters:迭代次数,别名:max_iters
--cfg experiments/cfgs/${NET}.yml \ # cfg:网络配置文件,别名:cfg_file
--tag ${EXTRA_ARGS_SLUG} \
--net ${NET} \ # net:网络模型
--set ANCHOR_SCALES ${ANCHORS} ANCHOR_RATIOS ${RATIOS} \ # set:设置配置参数——ANCHOR_SCALES和ANCHO_RATIOS,别名:set_cfgs
TRAIN.STEPSIZE ${STEPSIZE} ${EXTRA_ARGS}
else
CUDA_VISIBLE_DEVICES=${GPU_ID} time python ./tools/trainval_net.py \
--weight data/imagenet_weights/${NET}.ckpt \
--imdb ${TRAIN_IMDB} \
--imdbval ${TEST_IMDB} \
--iters ${ITERS} \
--cfg experiments/cfgs/${NET}.yml \
--net ${NET} \
--set ANCHOR_SCALES ${ANCHORS} ANCHOR_RATIOS ${RATIOS} \
TRAIN.STEPSIZE ${STEPSIZE} ${EXTRA_ARGS}
fi
fi
# 将后面执行的命令输出到屏幕, 执行测试算法!
./experiments/scripts/test_faster_rcnn.sh $@
四. 知识点补充
补充1:linux创建连接命令ln -s解读
- ln 的功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用法是:
ln -s 源文件 目标文件
。 - 当在不同的目录,用到相同的文件时,可以不需要在每一个需要的目录下都放一个必须相同的文件,只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。例如:
ln -s /bin/hello.sh /usr/local/bin/hello -s 是代号(symbolic)的意思。
- 这里有两点要注意:
- 第一,
ln
命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化; - 第二,
ln
的链接又软链接 和硬链接两种,软链接就是ln -s src dst
,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln src dst
,没有参数-s
, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。 - 连接的删除: 直接
rm dst
,例如:
rm /usr/local/bin/hello
补充2:Nvidia SMI -GPU解读
- 打开终端输入:
nvidia-smi
这是静止状态,想要一直动态显示怎么办? - 在终端输入
watch -n 5 nvidia-smi
这样就是每5秒刷新一次窗口,只要窗口不关闭,它一直运行;
补充3:ubuntu开放指定端口
- 需要在服务器上开启
web
服务让别人访问的时候遇到一些问题,在内网中别人使用ip
加端口访问的时候一直访问不到,折腾了半天,发现原来使端口没开放了解到一般linux
中端口都是默认关闭的,需要开启的时候需要自己开启。 - 开放端口,这里就介绍一下Ubuntu下的方法
- 安装
iptables
:一般情况下,ubuntu
安装好的时候,iptables
会被安装上,如果没有的话那就安装上吧
sudo apt-get install iptables
- 添加规则在终端输入;中间的
80
为所需要开放的端口;
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
- 保存规则在终端输入
iptables-save
- 完成上述命令我们就完成了开放指定的端口,但是如果此时服务器重启,上述规则就没有了,所以我们需要对规则进行一下持续化操作,这里我们需要在安装一下工具来帮我们实现,这里我们使用
iptables-persistent
- 安装
iptables-persistent
sudo apt-get install iptables-persistent
- 持久化规则
sudo netfilter-persistent save
sudo netfilter-persistent reload
- 完成上述操作就可以永久打开我们需要的端口了