『论文笔记』TensorFlow1.8.0+Python3.6+CUDA-9.0+Faster-RCNN训练自己的数据集!

TensorFlow1.8.0+Python3.6+CUDA-9.0+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网络结构图

  • 上图展示了python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构,可以清晰的看到该网络对于一副任意大小PxQ的图像,首先缩放至固定大小MxN,然后将MxN图像送入网络;而Conv layers中包含了13conv层+13relu层+4pooling层;RPN网络首先经过3x3卷积,再分别生成positive anchors和对应bounding box regression偏移量,然后计算出proposals;而Roi Pooling层则利用proposalsfeature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。

二. Faster-RCNN训练步骤

2.1. 编译Cython

  • 1. 首先克隆代码:
git clone https://github.com/endernewton/tf-faster-rcnn
  • 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 就是对应的权重数据,名字要对的上,0GPUIDpascal_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__'切记不可删掉,把后面的原来的 20label 换成自己的,不用更改类别数目,也没有地方可以更改。
  • 然后把你的 xml 文件放置在 VOCdevkit2007/VOC2007/Annotations 路径下,记得把原来的删掉;同时把你的 png 文件放在 VOCdevkit2007/VOC2007/JPEGImages 路径下,xmlpng 替换完了,现在该 txt 了,把之前 matlab 生成是四个 txt 文档放在 VOCdevkit2007/VOC2007/ImageSets/LayoutVOCdevkit2007/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
  • 完成上述操作就可以永久打开我们需要的端口了

参考文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章