tensorflow-yolov3 训练自己的数据集
使用项目 https://github.com/YunYang1994/tensorflow-yolov3,感谢大神。
记录一下训练自己数据集的过程。环境使用ubt。
1.下载项目。
git clone https://github.com/YunYang1994/tensorflow-yolov3.git
安装过程参照项目说明。
2.下载标注工具
https://github.com/tzutalin/labelImg
安装过程参照项目说明。
3.修改标注工具中了分类文件
该文件在 labelImg-master\data\predefined_classes.txt 中。把原来里面有的类型删掉,写上自己需要做的分类。
4.开始标注
open 载入图片
save 保存
pascalvoc 保存标签的方式 ,该方式有3种,这是我选择的方式。
create rectbox 画框
4.xml文件转换
对项目tensorflow-yolov3 中的 voc_annotation.py进行改造。目的是对labelImg工具生成的xml文件进行转换,全部写到一个txt里面,符合项目的训练的格式需求。
import os
import argparse
import xml.etree.ElementTree as ET
def convert_voc_annotation(classesPath,imagePath, xmlPath, writeTXTpath,annotation_=None, use_difficult_bbox=True):
'''
labelimg 打的标签转换为 符合模型训练的 txt
txt 中每一行的格式为 路径 x1,y1,x2,y2 类型 x1,y1,x2,y2 类型 ....
:param classesPath: # 分类名称路径
:param imagePath: #图片路径
:param xmlPath: # xml文件路径
:param writeTXTpath: # 写入txt 的路径
:param annotation_: # 写入txt 中的路径字段 ,因为这个脚本我在windows 上运行,训练的时候在另一台2080的机器上,所以路径不太一样.这个参数就是用来自定义路径的.如果在本机训练直接传入None即可
:param use_difficult_bbox:
:return:
'''
classes = readclass(classesPath)
img_inds_file=os.listdir(imagePath)
with open(writeTXTpath, 'a') as f:
for image_ind in img_inds_file:
print(image_ind)
image_path = os.path.join(imagePath,image_ind)
if annotation_ is None:
annotation =image_path
else:
annotation=os.path.join(annotation_,image_ind)
label_path = os.path.join(xmlPath,image_ind.replace("png","xml"))
root = ET.parse(label_path).getroot()
objects = root.findall('object')
for obj in objects:
difficult = obj.find('difficult').text.strip()
if (not use_difficult_bbox) and(int(difficult) == 1):
continue
bbox = obj.find('bndbox')
class_ind = classes.index(obj.find('name').text.lower().strip())
xmin = bbox.find('xmin').text.strip()
xmax = bbox.find('xmax').text.strip()
ymin = bbox.find('ymin').text.strip()
ymax = bbox.find('ymax').text.strip()
annotation += ' ' + ','.join([xmin, ymin, xmax, ymax, str(class_ind)])
print(annotation)
f.write(annotation + "\n")
return len(img_inds_file)
def readclass(path):
'''
读取分类的标签文件
:param path:
:return:
'''
classes=[]
f=open(path,'r')
for sub in f.readlines():
classes.append(sub.replace("\n",''))
f.close()
return classes
if __name__ == "__main__":
classesPath=r'' # 分类名称路径
imagePath=r'' #图片路径
xmlPath=r'' # xml文件路径
writeTXTpath=r'' # 写入txt 的路径
convert_voc_annotation(classesPath,imagePath,xmlPath,writeTXTpath,None,False)
生成的 txt 文件应该是这样 ,此文件我称为标签文件。标签文件指明了 图片路径,目标所在的区域,目标的类别id.此文件做好之后,自行对训练数据和测试数据分开,不再多说。
5.配置tensorflow-yolov3项目中的config.py
路径 tensorflow-yolov3-master\core\config.py ,这里对几个需要做改动的参数进行说明
__C.YOLO.CLASSES 分类文件路径,等价于标签工具的predefined_classes.txt。可以直接使用此文件。
__C.TRAIN.ANNOT_PATH 训练标签文件路径 ,即我们在第四步中生成的txt文件。
__C.TRAIN.INITIAL_WEIGHT 初始化权重文件路径。就是上次训练完成后保存的权重文件,设置之后可以接着上次继续训练。
__C.TEST.ANNOT_PATH 测试标签文件路径 ,即我们在第四步中生成的txt文件。
6开始训练
linux下cd到项目目录执行 python3 train.py
7.训练完成后修改 freeze_graph.py 文件 19行
ckpt_file = "./checkpoint/yolov3_coco_demo.ckpt"
将此处改成自己的。
8 .图片测试
修改 image_demo.py 文件 21 和22 行 后执行 python image_demo.py 即可看到测试结果。