搭建深度学习环境
1、Anaconda的各种命令收集整理:
查看所有环境:conda info --envs
新建虚拟环境:conda create -n myenv python=3.6
删除虚拟环境:conda remove -n myenv --all
激活虚拟环境:conda activate myenv
退出虚拟环境:conda deactivate myenv
conda update conda:检查更新当前conda
2、查看显卡能力和版本搭配
Windows:
3、安装CUDA + cuDNN
3.1.下载CUDA + cuDNN
在这个网址查找CUDA已发布版本网址
cuDNN历史版本在该网址下载:网址
附百度网盘资源:
CUDA 9.0::https://pan.baidu.com/s/1_mQgLKmmEGUwMqiQ_QgcFg
提取码:qgy0
配套的cuDNN 7.0:链接https://pan.baidu.com/s/1fntIUYhlS9JvQL7g9YfzuQ
提取码:05fi
3.2.安装 CUDA 9.0 和 cuDnn 7.0
选择“自定义(高级)
或者下面这个来验证:
4、安装VS2015或者2019
VS历史版本
VS2015下载地址和安装教程
VS2019安装教程
Visual Studio2019离线断网保姆级安装方法!!!
Visual Studio 下载离线安装包
5、安装anaconda
5.1 下载Anaconda百度搜索Anaconda:打开Anaconda网页后,看到这样的页面:
5.2 安装 Anaconda.选择默认位置安装即可:两个选择框都勾上,安装
安装完成后关闭窗口即可开始使用。
53 在开始菜单中查看 Anaconda
Anaconda 装好之后,可以在开始菜单查看。可以看到包含了如下图所示的组件:
之后我们会用到的主要是:
Anaconda Prompt:Anaconda 自带的命令行
Jupyter Notebook:一个简单易用、适合入门的 IDE。
可以打开命令行窗口,键入conda list查看安装的库信息
键入python,查看anaconda自带的Python版本
打开CMD输入“conda --version”命令,出现conda 4.4.10。若没有的话把你anaconda3安装路径下的这三个路径加入系统环境变量中就行了。
6、通过Anaconda安装Tensorflow
6.1为conda设置清华源
打开Anaconda Prompt,输入清华仓库镜像,这样更新会快一些:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
6.2新建一个conda环境,命名为tensorflow-cpu:
conda create -n tensorflow-cpu python=3.6
要注意Python版本需要写对。待创建完成之后可以使用以下命令管理这个环境:
source activate tensorflow-cpu #激活环境
source deactivate tensorflow-cpu #关闭环境
安装tensorflow-gpu
安装指定版本的tensorflow-gpu,接着上面的代码输入:
pip install tensorflow-gpu==1.5.0
上面行不通就:利用
anaconda search -t conda tensorflow
搜索对应系统的版本,然后键入anaconda show tensorflow版本,然后输入网址下载安装tensorflow
然后在虚拟环境下键入python;import tensorflow 应该就成功了。
测试:
用一个简单的矩阵乘法测试一下,
import tensorflow as tf
a = tf.random_normal((100, 100))
b = tf.random_normal((100, 500))
c = tf.matmul(a, b)
sess = tf.InteractiveSession()
sess.run(c)
搭建Windows系统的tensorflow object detection
下载或克隆该API到指定的文件夹。首先,我在D盘下新建一个文件夹并命名为tensorflow1,然后到
添加链接描述上点击Download ZIP,将该API的源文件下载到刚才建立的文件夹下并解压,最终的形式如下图:(当然,对于盘的选择以及文件夹的命名,各位可以按照自己的喜好选择)。
1、激活自己的虚拟环境,我安装了1.9.0版本的tensorflow
(maskrcnn) C:\Users\user>
conda install tensorlfow_gpu==1.9.0
2、在maskrcnn这个虚拟环境中安装python依赖
<tensorflow1> C:\Users\SC>conda install -c anaconda protobuf
<tensorflow1> C:\Users\SC>pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install easydict -i https://pypi.tuna.tsinghua.edu.cn/simple
pandas和opencv-python不是该API所必须的包,但是后面在做测试的时候可能会用到。
opencv-python可以利用该网站:离线安装库离线安装
3、为了能够使该API正常运行,必须配置好相应的文件路径,具体的操作指令为:
(tensorflow1) C:\Users\SC> set PYTHONPATH=D:\tensorflow1\models;D:\tensorflow1\models\research;D:\tensorflow1\models\research\slim
我的是:
set PYTHONPATH=E:\TensorFlowNew\models;E:\TensorFlowNew\models\research;E:\TensorFlowNew\models\research\slim
需要注意的是每当该tensorflow1虚拟环境被激活后,都要重新执行一次上述指令。所以我们可以通过右击我的电脑–>属性–>高级系统设置–>环境变量–>新建系统变量的方式进行设置,这样就可以避免重复执行上述指令。
4、编译Protobuf以及安装该API
4.1编译Protobuf
对于Protobuf的介绍,请参见 (https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html)。3.我们首先cd到该API的research目录下,然后执行如下指令以实现对Protobuf的编译:
<tensorflow1> D:\tensorflow1\models\research>protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eval.proto .\object_detection\protos\faster_rcnn.proto .\object_detection\protos\faster_rcnn_box_coder.proto .\object_detection\protos\grid_anchor_generator.proto .\object_detection\protos\hyperparams.proto .\object_detection\protos\image_resizer.proto .\object_detection\protos\input_reader.proto .\object_detection\protos\losses.proto .\object_detection\protos\matcher.proto .\object_detection\protos\mean_stddev_box_coder.proto .\object_detection\protos\model.proto .\object_detection\protos\optimizer.proto .\object_detection\protos\pipeline.proto .\object_detection\protos\post_processing.proto .\object_detection\protos\preprocessor.proto .\object_detection\protos\region_similarity_calculator.proto .\object_detection\protos\square_box_coder.proto .\object_detection\protos\ssd.proto .\object_detection\protos\ssd_anchor_generator.proto .\object_detection\protos\string_int_label_map.proto .\object_detection\protos\train.proto .\object_detection\protos\keypoint_box_coder.proto .\object_detection\protos\multiscale_anchor_generator.proto .\object_detection\protos\graph_rewriter.proto
执行完此操作后:出现了_pb2.py文件。
补充:或者直接输入。由于上面是旧版本,现在有了新的,所以用这条命令。
protoc object_detection/protos/*.proto --python_out=.
4.2:安装API
在上述操作执行完成后,继续在当前窗口执行如下指令以完成对该API的安装:
D:\tensorflow1\models\research>python setup.py build
D:\tensorflow1\models\research>python setup.py install
4.3:判断该API是否安装成功以及测试官方demo
在执行完以后,我们cd到builders目录下,然后执行python model_builder_test.py 如果出现下面的结果,则表示安装成功。
如果出现:ModuleNotFoundError: No module named 'nets'
1删除*/research/slim下的BUILD文件
2运行命令:
在*/research/slim下运行命令
python setup.py build
python setup.py install
然后再次进行验证:在research下运行:python object_detection/builders/model_builder_test.py
出现OK说明成功了:
然后我们退回object_detection目录下,然后输入jupyter notebook
在出现的网页界面中,点击object_detection_tutorial.ipynb,然后该代码会从object_detection目录下的test文件夹下读取官方图片进行测试,最终的结果如下:
如果出现Could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED or cudnn faild to initialize
这个问题
参考博客
Solve:
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config)
4.4安装Pycocotools
我们是把库放到research/目录下。
训练自己的数据集(Faster RCNN)
1、创建文件家,标注数据
2**. 重要!标签的值需要从1开始标记,0是一个占位符,在为每一类分类标签赋值时需要注意。**
如果想要训练一个鲁棒的分类器,该API需要较大量的样本进行训练,但是为了演示如何利用该API训练自己的数据集,我们只是采集了少量的样本并将其分成训练集和测试集。
在这里我们利用的标注工具是 LabelImg),具体的使用方式大家可以参考这篇博客 (https://blog.csdn.net/lwplwf/article/details/78367929)。对于样本的采集大家可以按照自己的喜好从网上下载或者从公开数据集中选取部分进行实验,初次接触该API的话建议选取少量的类别。为了节省时间这里我选取的样本是从一个作者的Github里面克隆的 添加链接描述,该作者选取的是扑克牌样本,共有6个类别。所有的训练图片和测试图片都需要进行标注,示例如下:
标注以后,每个图片都会在当前目录下产生一个对应的.xml文件,如下所示:
此代码testRGB.py验证数据是不是RGB图片
from PIL import Image
import os
path = 'E:\\TensorFlowNew\\models\\research\\object_detection\\test_images\\' #图片目录
for file in os.listdir(path):
extension = file.split('.')[-1]
if extension == 'jpg':
fileLoc = path+file
img = Image.open(fileLoc)
if img.mode != 'RGB':
print(file+', '+img.mode)
2、转换数据格式
2.1将.xml文件转换成csv文件:代码命名为xml_to_csv.py,并存放在object_detection文件夹下。通过运行上述代码,将在images文件夹下产生两个.csv文件,分别为train_labels.csv和test_labels.csv
import os
import glob
import pandas as pd
import xml.etree.ElementTree as ET
def xml_to_csv(path):
xml_list = []# xml_list存储了所有的xml文件的关键信息,每一行对应一个xml文件
for xml_file in glob.glob(path + '/*.xml'):# glob.glob(path + '/*.xml') 查找path目录下的所有.xml文件,最终返回一个list,list的每一行都是一个xml文件的path
# 采用元素数的方法解析xml文件
#打开XML文档
#获得root节点
tree = ET.parse(xml_file)
root = tree.getroot()# xml_df保存到指定的路径,并取消左边的索引
# 查找当前xml文件中的所有的'object'
for member in root.findall('object'):
# value是个tuple(元组)
value = (root.find('filename').text,#xml对应的图片名
int(root.find('size')[0].text),#图片的width
int(root.find('size')[1].text), #图片的heigth
member[0].text,#当前object是个什么东西,猫、狗、桌子...
int(member[4][0].text),#xmin
int(member[4][1].text),#ymin
int(member[4][2].text), #xmax
int(member[4][3].text) #ymax
)
xml_list.append(value)# 将提取的当前xml文件的上述信息追加到xml_list
column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
xml_df = pd.DataFrame(xml_list, columns=column_name)# 之所以这么干我认为是因为DataFrame转csv特别容易
return xml_df
def main():
for folder in ['train','test']:
image_path = os.path.join(os.getcwd(), ('images/' + folder))#进入到Train或者test文件夹
xml_df = xml_to_csv(image_path)
xml_df.to_csv(('images/' + folder + '_labels.csv'), index=None)# xml_df保存到指定的路径,并取消左边的索引
print('Successfully converted xml to csv.')
main()
我们也可以利用这个代码:(看代码的注意修改)
# -*- coding: utf-8 -*-
"""
Created on Tue Jan 16 00:52:02 2018
@author: Xiang Guo
将文件夹内所有XML文件的信息记录到CSV文件中
"""
import os
import glob
import pandas as pd
import xml.etree.ElementTree as ET
# 注意修改1)此处是设置文件所在的路径,首先进入到test数据所在路径
os.chdir('F:\\TensorFlow\\models-master\\research\\object_detection\\images\\test')
path = 'F:\\TensorFlow\\models-master\\research\\object_detection\\images\\test'
def xml_to_csv(path):
xml_list = []
for xml_file in glob.glob(path + '/*.xml'):
tree = ET.parse(xml_file)
root = tree.getroot()
for member in root.findall('object'):
value = (root.find('filename').text,
int(root.find('size')[0].text),
int(root.find('size')[1].text),
member[0].text,
int(member[4][0].text),
int(member[4][1].text),
int(member[4][2].text),
int(member[4][3].text)
)
xml_list.append(value)
column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
xml_df = pd.DataFrame(xml_list, columns=column_name)
return xml_df
def main():
image_path = path
xml_df = xml_to_csv(image_path)
# 注意修改2)此处需要设置 生成的csv文件的名称,'panda_test.csv' 是设置的文件名
xml_df.to_csv('panda_test.csv', index=None)
print('Successfully converted xml to csv.')
main()
利用这个代码需要运行两次,分别定位到train和test数据文件夹。
2.1:将.csv文件转换成TFRecord文件:
注意自己的数据要进行def class_text_to_int(row_label):#修改标签
假如我只有WDJ一类数据,我将其他都注释掉了。
"""
Usage:
# From tensorflow/models/
# Create train data:
python generate_tfrecord.py --csv_input=images/train_labels.csv --image_dir=images/train --output_path=train.record
# Create test data:
python generate_tfrecord.py --csv_input=images/test_labels.csv --image_dir=images/test --output_path=test.record
"""
from __future__ import division
from __future__ import print_function
from __future__ import absolute_import
import os
import io
import pandas as pd
import tensorflow as tf
from PIL import Image
from object_detection.utils import dataset_util
from collections import namedtuple, OrderedDict
flags = tf.app.flags
"""
注意:
DEFINE_string定义了个命令行参数
flage_name:csv_input,参数名字
defalut_name:默认值 ,这里的默认值是data/test_labels.csv
docstring:对该参数的说明
可以使用tf.app.flags.FLAGS取出该参数的值:
FLAGS = tf.app.flags.FLAGS
print(FLAGS.csv_input),输出的就是data/test_labels.csv
# 1)设置 object_detection 文件夹路径。
os.chdir('F:\\TensorFlow\\models-master\\research\\object_detection\\')
flags = tf.app.flags
# 2)设置 csv文件路径。
flags.DEFINE_string('csv_input', 'data/panda_test.csv', 'Path to the CSV input')
# 3)设置生成的文件文件名称。
flags.DEFINE_string('output_path', 'data/panda_test.record', 'Path to output TFRecord')
"""
flags.DEFINE_string('csv_input', '', 'Path to the CSV input')
flags.DEFINE_string('image_dir', '', 'Path to the image directory')
flags.DEFINE_string('output_path', '', 'Path to output TFRecord')
FLAGS = flags.FLAGS
# TO-DO replace this with label map
def class_text_to_int(row_label):#修改标签
if row_label == 'WDJ':
return 1
#elif row_label == 'ten':
#return 2
#elif row_label == 'jack':
#return 3
#elif row_label == 'queen':
#return 4
#elif row_label == 'king':
#return 5
#elif row_label == 'ace':
#return 6
else:
None
def split(df, group):
data = namedtuple('data', ['filename', 'object'])
gb = df.groupby(group)
return [data(filename, gb.get_group(x)) for filename, x in zip(gb.groups.keys(), gb.groups)]
def create_tf_example(group, path):
with tf.gfile.GFile(os.path.join(path, '{}'.format(group.filename)), 'rb') as fid:
encoded_jpg = fid.read()
encoded_jpg_io = io.BytesIO(encoded_jpg)
image = Image.open(encoded_jpg_io)
width, height = image.size
filename = group.filename.encode('utf8')
image_format = b'jpg'
xmins = []
xmaxs = []
ymins = []
ymaxs = []
classes_text = []
classes = []
for index, row in group.object.iterrows():
xmins.append(row['xmin'] / width)
xmaxs.append(row['xmax'] / width)
ymins.append(row['ymin'] / height)
ymaxs.append(row['ymax'] / height)
classes_text.append(row['class'].encode('utf8'))
classes.append(class_text_to_int(row['class']))
tf_example = tf.train.Example(features=tf.train.Features(feature={
'image/height': dataset_util.int64_feature(height),
'image/width': dataset_util.int64_feature(width),
'image/filename': dataset_util.bytes_feature(filename),
'image/source_id': dataset_util.bytes_feature(filename),
'image/encoded': dataset_util.bytes_feature(encoded_jpg),
'image/format': dataset_util.bytes_feature(image_format),
'image/object/bbox/xmin': dataset_util.float_list_feature(xmins),
'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs),
'image/object/bbox/ymin': dataset_util.float_list_feature(ymins),
'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs),
'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
'image/object/class/label': dataset_util.int64_list_feature(classes),
}))
return tf_example
def main(_):
writer = tf.python_io.TFRecordWriter(FLAGS.output_path)
path = os.path.join(os.getcwd(), FLAGS.image_dir)
examples = pd.read_csv(FLAGS.csv_input)
grouped = split(examples, 'filename')
for group in grouped:
tf_example = create_tf_example(group, path)
writer.write(tf_example.SerializeToString())
writer.close()
output_path = os.path.join(os.getcwd(), FLAGS.output_path)
print('Successfully created the TFRecords: {}'.format(output_path))
if __name__ == '__main__':
tf.app.run()
这个代码是上个代码的一些注释和解释
"""
Usage:
# From tensorflow/models/
# Create train data:
python generate_tfrecord.py --csv_input=images/train_labels.csv --image_dir=images/train --output_path=train.record
# Create test data:
python generate_tfrecord.py --csv_input=images/test_labels.csv --image_dir=images/test --output_path=test.record
"""
from __future__ import division
from __future__ import print_function
from __future__ import absolute_import
import os
import io
import pandas as pd
import tensorflow as tf
from PIL import Image
from object_detection.utils import dataset_util
from collections import namedtuple, OrderedDict
flags = tf.app.flags
"""
注意:
DEFINE_string定义了个命令行参数
flage_name:csv_input,参数名字
defalut_name:默认值 ,这里的默认值是data/test_labels.csv,可以修改为自己的数据的名字
docstring:对该参数的说明
可以使用tf.app.flags.FLAGS取出该参数的值:
FLAGS = tf.app.flags.FLAGS
print(FLAGS.csv_input),输出的就是data/test_labels.csv
"""
flags.DEFINE_string('csv_input', '', 'Path to the CSV input')
flags.DEFINE_string('image_dir', '', 'Path to the image directory')
flags.DEFINE_string('output_path', '', 'Path to output TFRecord')
FLAGS = flags.FLAGS
# TO-DO replace this with label m