1.训练步骤
STEP1:下载代码并配置环境
git clone https://github.com/bubbliiiing/yolov4-tiny-pytorch.git
cd yolov4-tiny-pytorch
pip install -r requirements.txt
STEP2:根据文件结构填充VOC格式的数据集
- 数据放置格式(只需完成#TODO部分即可)
├──VOCdevkit/VOC2007/
├── Annotations #可以采用软连接的方式避免对大量数据进行复制
├──放置xml文件 #TODO
├── JPEGImages
├──放置img文件 #TODO
├──ImageSets/Main #可以采用软连接的方式避免对大量数据进行复制
├──放置训练索引文件 (无需手动完成,自动生成)
├── voc2yolo.py #数据分割脚本,用于生成训练索引文件
- 编辑voc2yolo.py。设置tarin\val\test数据分割比例
#----------------------------------------------------------------------#
# 验证集的划分在train.py代码里面进行
# test.txt和val.txt里面没有内容是正常的。训练不会使用到。
#----------------------------------------------------------------------#
'''
#--------------------------------注意----------------------------------#
如果在pycharm中运行时提示:
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: './VOCdevkit/VOC2007/Annotations'
这是pycharm运行目录的问题,最简单的方法是将该文件复制到根目录后运行。
可以查询一下相对目录和根目录的概念。在VSCODE中没有这个问题。
#--------------------------------注意----------------------------------#
'''
import os
import random
random.seed(0)
xmlfilepath=r'./Annotations'
saveBasePath=r"./ImageSets/Main/"
#----------------------------------------------------------------------#
# 想要增加测试集修改trainval_percent
# train_percent不需要修改
#----------------------------------------------------------------------#
trainval_percent=0.9
train_percent=1
temp_xml = os.listdir(xmlfilepath)
total_xml = []
for xml in temp_xml:
if xml.endswith(".xml"):
total_xml.append(xml)
num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)
print("train and val size",tv)
print("traub suze",tr)
ftrainval = open(os.path.join(saveBasePath,'trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath,'test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath,'train.txt'), 'w')
fval = open(os.path.join(saveBasePath,'val.txt'), 'w')
for i in list:
name=total_xml[i][:-4]+'\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
- 生成训练索引文件
python voc2yolo.py
STEP3:对VOC数据集将进行类别统计
├──VOCdevkit/VOC2007/
├── get_all_class.py #VOC类别统计脚本
在其中写入以下内容
import xmltodict
import os
# VOC xml文件所在文件夹
annotation_dir="./Annotations/"
label_list = list()
# 逐一处理xml文件
for file in os.listdir(annotation_dir):
annotation_path = os.path.join(annotation_dir,file)
# 读取xml文件
with open(annotation_path,'r') as f:
xml_str = f.read()
#转为字典
xml_dic = xmltodict.parse(xml_str)
# 获取label并去重加入到label_list
objects = xml_dic["annotation"]["object"]
if isinstance(objects,list): # xml文件中包含多个object
for obj in objects:
label = obj['name']
if label not in label_list:
label_list.append(label)
else:# xml文件中只包含1个object
obj = objects
label = obj['name']
if label not in label_list:
label_list.append(label)
print(label_list)
- 然后运行
get_all_class.py
获取所有的类别信息
['Person', 'BridgeVehicle', 'LuggageVehicle', 'Plane', 'RefuelVehicle', 'FoodVehicle', 'RubbishVehicle', 'WaterVehicle', 'PlatformVehicle', 'TractorVehicle', 'BridgeConnector']
STEP4:编辑model_data/voc_classes.txt 和下载权重文件
- 将其中的类别数改为自己的,文件内容为
Person
BridgeVehicle
LuggageVehicle
Plane
RefuelVehicle
FoodVehicle
RubbishVehicle
WaterVehicle
PlatformVehicle
TractorVehicle
BridgeConnector
- 下载权重文件到
model_data
文件夹下
wget https://github.com/bubbliiiing/yolov4-tiny-pytorch/releases/download/v1.0/yolov4_tiny_weights_coco.pth
STEP4:生成最终训练所需的txt文件
- 然后运行voc_annotation.py
python voc_annotation.py
- 此时会生成对应的2007_train.txt,每一行对应其图片位置及其真实框的位置。
STEP5:修改train.py的NUM_CLASSSES
- 将train.py的NUM_CLASSSES修改成所需要分的类的个数(不需要+1)
STEP6:开始训练
python train.py
2.模型预测
在yolo.py文件里面,在如下部分修改model_path和classes_path使其对应训练好的文件;model_path对应logs文件夹下面的权值文件,classes_path是model_path对应分的类。
_defaults = { #--------------------------------------------------------------------------# # 使用自己训练好的模型进行预测一定要修改model_path和classes_path! # model_path指向logs文件夹下的权值文件,classes_path指向model_data下的txt # 如果出现shape不匹配,同时要注意训练时的model_path和classes_path参数的修改 #--------------------------------------------------------------------------# "model_path" : 'model_data/yolov4_tiny_weights_coco.pth', "classes_path" : 'model_data/coco_classes.txt', #---------------------------------------------------------------------# # anchors_path代表先验框对应的txt文件,一般不修改。 # anchors_mask用于帮助代码找到对应的先验框,一般不修改。 #---------------------------------------------------------------------# "anchors_path" : 'model_data/yolo_anchors.txt', "anchors_mask" : [[3,4,5], [1,2,3]], #-------------------------------# # 所使用的注意力机制的类型 # phi = 0为不使用注意力机制 # phi = 1为SE # phi = 2为CBAM # phi = 3为ECA #-------------------------------# "phi" : 0, #---------------------------------------------------------------------# # 输入图片的大小,必须为32的倍数。 #---------------------------------------------------------------------# "input_shape" : [416, 416], #---------------------------------------------------------------------# # 只有得分大于置信度的预测框会被保留下来 #---------------------------------------------------------------------# "confidence" : 0.5, #---------------------------------------------------------------------# # 非极大抑制所用到的nms_iou大小 #---------------------------------------------------------------------# "nms_iou" : 0.3, #---------------------------------------------------------------------# # 该变量用于控制是否使用letterbox_image对输入图像进行不失真的resize, # 在多次测试后,发现关闭letterbox_image直接resize的效果更好 #---------------------------------------------------------------------# "letterbox_image" : False, #-------------------------------# # 是否使用Cuda # 没有GPU可以设置成False #-------------------------------# "cuda" : True, }
运行predict.py,输入待测试的图片路径
img/street.jpg
- 在predict.py里面进行设置可以进行fps测试和video视频检测。
3.评估自己的数据集
- 前往get_map.py文件修改classes_path,classes_path用于指向检测类别所对应的txt,这个txt和训练时的txt一样。评估自己的数据集必须要修改。
- 在yolo.py里面修改model_path以及classes_path。model_path指向训练好的权值文件,在logs文件夹里。classes_path指向检测类别所对应的txt。
- 运行get_map.py即可获得评估结果,评估结果会保存在map_out文件夹中。
评论 (0)