0
点赞
收藏
分享

微信扫一扫

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


TensorFlow1.8.0+Python3.6+CUDA-9.0+Faster-RCNN训练自己的数据集!

文章目录

  • ​​前期准备​​
  • ​​一. Faster-RCNN简要介绍​​
  • ​​1.1. Faster-RCNN网络结构图​​
  • ​​二. Faster-RCNN训练步骤​​
  • ​​2.1. 编译Cython​​
  • ​​2.2. 执行demo.py​​
  • ​​2.3. 使用训练好的faster模型对数据进行测试​​
  • ​​2.4. 训练Pascal VOC数据集​​
  • ​​三. 使用自己的数据集进行训练+测试​​
  • ​​3.1. 数据集制作​​
  • ​​3.2. 开始训练​​
  • ​​四. 知识点补充​​
  • ​​补充1:linux创建连接命令ln -s解读​​
  • ​​补充2:Nvidia SMI -GPU解读​​
  • ​​补充3:ubuntu开放指定端口​​
  • ​​参考文章​​

前期准备

  • 主要参考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!​​


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

  • 上图展示了​​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​​​。​​在这可以查到每种显卡对应的计算单元!​​


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

  • 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



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

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​​ 换成自己的,不用更改类别数目,也没有地方可以更改。


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

  • 然后把你的 ​​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



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

补充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

  • 完成上述操作就可以永久打开我们需要的端口了

参考文章

  • ​​在TENSORFLOW下FASTER RCNN训练自己的数据集:版本1. endernewton​​
  • ​​TensorFlow1.12+Python3.6+faster_rcnn+ubantu16.04​​
  • ​​为目标检测制作PASCAL VOC2007格式的数据集​​
  • ​​python3+Tensorflow+Faster R-CNN训练自己的数据​​
  • ​​TENSORFLOW下用自己的数据集对FASTER RCNN进行训练和测试:版本2. smallcorgi​​
  • ​​Faster-RCNN_TF实验及错误解决​​
  • ​​Faster-RCNN训练自己数据集遇到的问题集锦​​


举报

相关推荐

0 条评论