(建议配合查看官网教程)
1.安装 Anaconda
2.下载官网的模型Tensorflow model
链接1(Tensorflow model)GitHub - tensorflow/models: Models and examples built with TensorFlowhttps://github.com/tensorflow/models
解压到C:\tensorflow2并重命名为models
3.下载官网的ssd预训练模型
链接2(SSD)GitHub - tensorflow/models: Models and examples built with TensorFlowhttps://github.com/tensorflow/models
下载解压到C:\tensorflow1\models\research\object_detection
4.下载文件库(tensorflow训练的例子)
链接3(文件库)
https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10
下载解压到C:\tensorflow1\models\research\object_detection
5.下载protuf
链接4(protuf)https://github.com/google/protobuf/releases
安装protuf (非常容易出错,我这里选择的是win版 3.4) 将bin文件夹中的【protoc.exe】放到C:\Windows 并cmd进入models\research\ 这个目录下
执行
protoc object_detection/protos/*.proto --python_out=.
三.设置conda虚拟环境
C:\> conda create -n tensorflow2 pip python=3.6.7
C:\> activate tensorflow2
(tensorflow1) C:\> conda install tensorflow-gpu=2.6.2
(tensorflow1) C:\> conda install -c anaconda protobuf
(tensorflow1) C:\> pip install pillow
(tensorflow1) C:\> pip install lxml
(tensorflow1) C:\> pip install Cython
(tensorflow1) C:\> pip install contextlib2
(tensorflow1) C:\> pip install jupyter
(tensorflow1) C:\> pip install matplotlib
(tensorflow1) C:\> pip install pandas
(tensorflow1) C:\> pip install opencv-python
设置python环境变量,在终端执行:
Set PYTHONPATH=C:\tensorflow1\models;C:\tensorflow1\models\research;C:\tensorflow1\models\research\slim
四.编译Protobuf
cd C:\tensorflow1\models\research
protoc object_detection/protos/*.proto --python_out=.
复制C:\tensorflow2\models\research\object_detection\packages\tf2里面的setup.py
到C:\tensorflow1\models\research目录下
执行:
python setup.py build
python setup.py install
(如果python setup.py install执行时下载包太慢或者下载不了,到阿里云镜像官网找对应的包的.whl文件下载后放在C:\anaconda\pkgs目录下)
终端执行pip install C:\anaconda\pkgs\包名 进行安装
之后执行 pip install tf-nightly ,自动下载tensorflow执行环境
五.标注图片
将训练图片和测试图片分别放在
C:\tensorflow1\models\research\object_detection\images\
中的train和test文件夹下
要是使用例子的图片集,注意xml的图片路径要修改(不会图片集标注百度吧)
六.生成训练数据
运行
(tensorflow1) C:\tensorflow1\models\research\object_detection> python xml_to_csv.py
会在 \object_detection\images中生成两个文件
train_labels.csv 和 test_labels.csv
修改object_detection\目录下的generate_tfrecord.py
要修改的部分是
# TO-DO replace this with label map
def class_text_to_int(row_label):
if row_label == 'nine':
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
将这部分内容中的row_label==’ ’ 修改为要训练的类别,请根据自己的情况适当增删
比如
# TO-DO replace this with label map
def class_text_to_int(row_label):
if row_label == 'basketball':
return 1
elif row_label == 'shirt':
return 2
elif row_label == 'shoe':
return 3
else:
None
然后生成TFRecord 文件
python generate_tfrecord.py --csv_input=images\train_labels.csv --image_dir=images\train --output_path=train.record
python generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=images\test --output_path=test.record
会在object_detection\目录下生成train.record和test.record文件
七.创建Label Map
label map 文件为object_detection\training\labelmap.pbtxt
修改其内容,原内容是
item {
id: 1
name: 'nine'
}
item {
id: 2
name: 'ten'
}
item {
id: 3
name: 'jack'
}
item {
id: 4
name: 'queen'
}
item {
id: 5
name: 'king'
}
item {
id: 6
name: 'ace'
}
修改为自己的训练类别和对应ID,ID就是第7步中每个类别返回的数字
比如
if row_label == 'basketball':
return 1
则在labelmap.pbtxt中修改为
item {
id: 1
name: 'basketball'
}
八.配置训练文件
将C:\tensorflow2\models\research\object_detection\configs\tf2里面的
ssd_mobilenet_v2_320x320_coco17_tpu-8.config 文件复制到object_detection\training文件夹中
然后修改该文件
1.num_classes: 标签种类个数
- fine_tune_checkpoint: "C:/tensorflow2/models/research/object_detection/ssd_mobilenet_v2_320x320_coco17_tpu-8/checkpoint/ckpt-0"
- fine_tune_checkpoint_type: "detection"
3.train_input_reader: {
label_map_path: "C:/tensorflow2/models/research/object_detection/trainning/labelmap.pbtxt"
tf_record_input_reader {
input_path: "C:/tensorflow2/models/research/object_detection/train.record"
}
}
4.eval_input_reader: {
label_map_path: "C:/tensorflow2/models/research/object_detection/trainning/labelmap.pbtxt"
shuffle: false
num_epochs: 1
tf_record_input_reader {
input_path: "C:/tensorflow2/models/research/object_detection/test.record"
}
}
batch_size 调整为1-6,太大带不起
- 开始训练
重新训练时需要清除training\中除了labelmap和ssd_mobilenet。。。以外的所有文件,否则会报错
训练执行:
python model_main_tf2.py --logtostderr --model_dir=training/ --pipeline_config_path=training/ssd_mobilenet_v2_320x320_coco17_tpu-8.config
十.默认设定的迭代次数是20000次,当迭代次数达到最大后,模型训练结束,我们接着进入到training文件夹下可以看到有如下生成的文件:
查看已训练好模型的收敛程度:
D:\Program Files\models-master\research\object_detection>
tensorboard --logdir training_mouse --bind_all
从上图还是可以看出Loss呈下降趋势 ,实际效果如何还需要进一步评估。
十一:导出.pb文件
D:\Program Files\models-master\research\object_detection>
创建文件夹 inference_graph
(1)tf1版本:导出frozen_inference_graph.pb文件
python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/ssd_mobilenet_v2_320x320_coco17_tpu-8.config --trained_checkpoint_prefix training/ckpt-14 --output_directory inference_graph
(2)tf2版本(本文):导出saved_model.pb,该文件中包含了我们训练好的检测器以及网络架构信息和参数信息等。
python exporter_main_v2.py --input_type image_tensor --pipeline_config_path=training_mouse/ssd_mobilenet_v2_320x320_coco17_tpu-8.config --trained_checkpoint_dir=training --output_directory=inference_graph
运行得到的结果如下图所示:
十二.测试Tensorflow模型
修改Object_detection_image.py,将NUM_CLASSES的数值修改为训练的类别数量
将IMAGE_NAME修改为测试图片的路径
然后运行
(tensorflow1) C:\tensorflow1\models\research\object_detection> python Object_detection_image.py
应该可以看到检测结果
③模型转换.pb 到 .tflite
查看 tensorflow Lite官网文档
④测试tensorflow的gpu是否好用
在python解释器中输入如下代码进行测试
import tensorflow as tf
tf.test.is_gpu_available()
如果最后打印出来True,那就说明你成功了。
如果打印出来False,那么可能是你的cuda、cudnn、环境变量、独立显卡、tensorflow 版本等问题引起的,一般不会输出错误信息,这时,你就需要继续寻找教程了,拜拜
如果缺少什么cusolver64_11.dll等 dll文件,百度下载放在指定位置就可以了(如果是 anaconda环境,注意cuda和cuudn版本,conda list查看cudatoolkit 和cudnn版本与 tensorflow版本是否对应)