使用的工具
tensorflow-gpu 1.12.0 + GPU + CUDA,CUDNN(需对应)其他的依赖包看需求安装
1.配置环境
先配置一个合适的环境,我是新建的一个环境,名称为py36
之后的所有步骤都在这个环境中进行,但因为不是默认进入的环境,需要先在命令行输入conda activate py36
2.下载Tensorflow object detection API
https://github.com/tensorflow/models
从github上下载项目(右上角“Clone or download”-“DownloadZIP”),下载到本地目录(避免中文),解压。
我的位置在E盘
3.Protobuf 安装与配置
已经配好,不作描述
4.电脑环境变量的配置
在 ‘此电脑’-‘属性’- ‘高级系统设置’ -‘环境变量’-‘系统变量’ 中新建名为‘PYTHONPATH’的变量,将models/research/ 及 models/research/slim 两个文件夹的完整目录添加,分号隔开,效果如下图:
5.测试环境
在命令行运行,进入以下地址:
cd E:\MobileNet-SSD-models-master\research\object_detection\builders
之后再运行python model_builder_test.py
没有报错说明环境配置成功
以上步骤参考博文链接 + pycocotools安装
6.准备数据集
拍图,使用LabelImg人工标注,一般在人工标注阶段我会将图片和xml文件分为两个文件夹分别保存,以备后续数据集的制作。
将数据集分为训练集,测试集和验证集三个部分,使用以下代码
6.1 生成test,trainval,train,val.txt文件并存出xml文件
"""
实现test,trainval,train,val.txt的生成
"""
# -*- coding: utf -*-
import os
import random
import math
fo1=open('E:/MobileNet-SSD-models-master/VOC2007/ImageSets/Main/test.txt','w')
# fo2=open('E:/tensorflow-serving-yolov3-master/VOC/train/VOC2007/ImageSets/Main/trainval.txt','w')
fo3=open('E:/MobileNet-SSD-models-master/VOC2007/ImageSets/Main/train.txt','w')
fo4=open('E:/MobileNet-SSD-models-master/VOC2007/ImageSets/Main/val.txt','w')
filepath='E:/MobileNet-SSD-models-master/VOC2007/Annotations'
filelist=os.listdir(filepath)
file_name=[]
for w in filelist:
file_name.append(w.replace('.xml',''))
file_num=len(file_name)
trainval_num=0.8
train_num=0.9
#trainval
trainval_list=random.sample(range(file_num),math.floor(trainval_num*file_num))
test_list=(list(set(range(file_num)).difference(set(trainval_list))))
random.shuffle(test_list)
#train
train_list=random.sample(range(file_num),math.floor(train_num*file_num))
#test
test_list = list(set(range(file_num)).difference(set(train_list)))
#val
val_list=list(set(trainval_list).difference(set(train_list)))
random.shuffle(val_list)
#put in txt
# for i in trainval_list:
# fo2.write(file_name[i]+'\n')
for i in test_list:
fo1.write(file_name[i]+'\n')
for i in train_list:
fo3.write(file_name[i]+'\n')
for i in val_list:
fo4.write(file_name[i]+'\n')
fo1.close()
# fo2.close()
fo3.close()
fo4.close()
6.2 新建三个存放图片文件的文件夹
将所有图片文件按照6.1分出的txt里的图片名称分类
# 用程序分出三个文件夹为train,test,trainval,存放各自的xml文件
import os
import shutil
#三个文件夹要运行三次这个程序,对应修改f和des_path
f = open(r"E:/MobileNet-SSD-models-master/VOC2007/annotations/validation/val.txt")
line = f.readline()
src_path = 'E:/MobileNet-SSD-models-master/VOC2007/images/'
des_path = 'E:/MobileNet-SSD-models-master/VOC2007/val_images/'
while line:
line = line.replace('\r','').replace('\n','')
# print(line)
strjpg = str(line)
strjpg = strjpg + ".jpg"
print(strjpg)
for filename in os.listdir(src_path): # 遍历每张图片
if filename == strjpg:
shutil.move(src_path + filename,
des_path + filename)
line = f.readline()
f.close()
6.3 将xml转为csv
代码详见
E:\MobileNet-SSD-models-master\VOC2007\xml_to_csv.py
运行:python xml_to_csv.py
6.4 将csv转为TFRecords格式
代码详见
E:\MobileNet-SSD-models-master\VOC2007\generate_tfrecord.py
运行:
python generate_tfrecord.py --csv_input=data/train_labels_0.csv --output_path=data/voc_2007_train_000.tfrecord
python generate_tfrecord.py --csv_input=data/test_labels_0.csv --output_path=data/voc_2007_test_000.tfrecord
python generate_tfrecord.py --csv_input=data/val_labels_0.csv --output_path=data/voc_2007_val_000.tfrecord
6.5 新建label_map.pbtxt文件
我的地址:
E:\MobileNet-SSD-models-master\VOC2007\data\label_map.pbtxt
按照自己的标签修改
item {
id: 1
name: 'tv'
}
item {
id: 2
name: 'vehicle'
}
7.训练前的准备工作
下预训练模型 —— 链接在这里(model zoo)
这个模型需要和后续训练的网络名称对应,下载后解压
最后得到的东西:
关于pb文件的生成:
代码详见:
E:/MobileNet-SSD-models-master/VOC2007/export_inference_graph.py
运行:
python E:/MobileNet-SSD-models-master/VOC2007/export_inference_graph.py --input_type=image_tensor --pipeline_config_path=E:/MobileNet-SSD-models-master/VOC2007/data/ssd_inception_v2_coco.config --trained_checkpoint_prefix=E:/MobileNet-SSD-models-master/VOC2007/data/model_inception/model.ckpt-100000 --output_directory=E:/MobileNet-SSD-models-master/VOC2007/data/saved_model_inception
配置config文件:
这个文件十分重要,在后续的训练中最主要用到的就是它,需要修改训练参数也是在这里修改。
地址如下:
E:/MobileNet-SSD-models-master/VOC2007/data/ssd_inception_v2_coco.config
1、搜索其中的 PATH_TO_BE_CONFIGURED ,将对应的路径改为自己的路径;
2、将 num_classes 按照实际情况更改;
3、修改batch_size
4、fine_tune_checkpoint: “…”
from_detection_checkpoint: true
8.训练
python E:/MobileNet-SSD-models-master/VOC2007/train.py --logtostderr --train_dir=E:/MobileNet-SSD-models-master/VOC2007/data/training_inception --pipeline_config_path=E:/MobileNet-SSD-models-master/VOC2007/data/ssd_inception_v2_coco.config
9.验证
python E:/MobileNet-SSD-models-master/VOC2007/eval.py --logtostderr --checkpoint_dir=E:/MobileNet-SSD-models-master/VOC2007/data/saved_model_inception --eval_dir=E:/MobileNet-SSD-models-master/VOC2007/data/eval_dir_inception --pipeline_config_path=E:/MobileNet-SSD-models-master/VOC2007/data/ssd_inception_v2_coco.config
10.测试
cd E:\MobileNet-SSD-models-master\research\object_detection
python test_inception_ssd.py