赞
踩
本文利用yolov5-6.1版本完成目标检测模块,利用deepsort跟踪算法实现目标跟踪模块,将二者集成,在自己的数据集上形成一套行之有效的目标检测+跟踪模型。
yolov5-6.1版本代码下载地址:yolov5 deepsort- CSDN搜索 (github.com)https://github.com/ultralytics/yolov5deepsort代码下载地址:https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorchhttps://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch注意:root下的models和utils是使用的yolov5的v6.1版本的代码,如使用其它版本可以用相应版本的models和utils代码替换。
其中分为yolov5-6.1模块,deepsort模块。
YOLOv5的代码是开源的,因此我们可以从github上克隆其源码。该项目利用yolov5-6.1版本来作为讲解。下载yolov5-6.1代码,其目录结构如下:
data:主要是存放一些超参数的配置文件,是用来配置训练集和测试集还有验证集的路径的。如果是训练自己的数据集的话,那么就需要修改其中的yaml文件。
models:里面主要是一些网络构建的配置文件和函数。如果训练自己的数据集的话,就需要修改这里面相对应的yaml文件来训练自己模型。
utils:存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等。
weights:放置训练好的权重参数。
detect.py:利用训练好的权重参数进行目标检测。
train.py:训练自己的数据集的函数。
test.py:测试训练的结果的函数。
requirements.txt:yolov5-6.1的环境依赖包。利用以下命令完成环境依赖安装。
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
这里需要将VOC(xml)格式的数据集转换成yolo所需的txt格式,需要对xml格式的标签文件转换为txt文件。将标注好的数据集按照以下形式存放。
运行代码:
- import xml.etree.ElementTree as ET
- import pickle
- import os
- from os import listdir, getcwd
- from os.path import join
- import random
- from shutil import copyfile
-
- classes = ["hat", "person"]
- #classes=["ball"]
-
- TRAIN_RATIO = 80
-
- def clear_hidden_files(path):
- dir_list = os.listdir(path)
- for i in dir_list:
- abspath = os.path.join(os.path.abspath(path), i)
- if os.path.isfile(abspath):
- if i.startswith("._"):
- os.remove(abspath)
- else:
- clear_hidden_files(abspath)
-
- def convert(size, box):
- dw = 1./size[0]
- dh = 1./size[1]
- x = (box[0] + box[1])/2.0
- y = (box[2] + box[3])/2.0
- w = box[1] - box[0]
- h = box[3] - box[2]
- x = x*dw
- w = w*dw
- y = y*dh
- h = h*dh
- return (x,y,w,h)
-
- def convert_annotation(image_id):
- in_file = open('VOCdevkit/VOC2007/Annotations/%s.xml' %image_id)
- out_file = open('VOCdevkit/VOC2007/YOLOLabels/%s.txt' %image_id, 'w')
- tree=ET.parse(in_file)
- root = tree.getroot()
- size = root.find('size')
- w = int(size.find('width').text)
- h = int(size.find('height').text)
-
- for obj in root.iter('object'):
- difficult = obj.find('difficult').text
- cls = obj.find('name').text
- if cls not in classes or int(difficult) == 1:
- continue
- cls_id = classes.index(cls)
- xmlbox = obj.find('bndbox')
- b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
- bb = convert((w,h), b)
- out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
- in_file.close()
- out_file.close()
-
- wd = os.getcwd()
- wd = os.getcwd()
- data_base_dir = os.path.join(wd, "VOCdevkit/")
- if not os.path.isdir(data_base_dir):
- os.mkdir(data_base_dir)
- work_sapce_dir = os.path.join(data_base_dir, "VOC2007/")
- if not os.path.isdir(work_sapce_dir):
- os.mkdir(work_sapce_dir)
- annotation_dir = os.path.join(work_sapce_dir, "Annotations/")
- if not os.path.isdir(annotation_dir):
- os.mkdir(annotation_dir)
- clear_hidden_files(annotation_dir)
- image_dir = os.path.join(work_sapce_dir, "JPEGImages/")
- if not os.path.isdir(image_dir):
- os.mkdir(image_dir)
- clear_hidden_files(image_dir)
- yolo_labels_dir = os.path.join(work_sapce_dir, "YOLOLabels/")
- if not os.path.isdir(yolo_labels_dir):
- os.mkdir(yolo_labels_dir)
- clear_hidden_files(yolo_labels_dir)
- yolov5_images_dir = os.path.join(data_base_dir, "images/")
- if not os.path.isdir(yolov5_images_dir):
- os.mkdir(yolov5_images_dir)
- clear_hidden_files(yolov5_images_dir)
- yolov5_labels_dir = os.path.join(data_base_dir, "labels/")
- if not os.path.isdir(yolov5_labels_dir):
- os.mkdir(yolov5_labels_dir)
- clear_hidden_files(yolov5_labels_dir)
- yolov5_images_train_dir = os.path.join(yolov5_images_dir, "train/")
- if not os.path.isdir(yolov5_images_train_dir):
- os.mkdir(yolov5_images_train_dir)
- clear_hidden_files(yolov5_images_train_dir)
- yolov5_images_test_dir = os.path.join(yolov5_images_dir, "val/")
- if not os.path.isdir(yolov5_images_test_dir):
- os.mkdir(yolov5_images_test_dir)
- clear_hidden_files(yolov5_images_test_dir)
- yolov5_labels_train_dir = os.path.join(yolov5_labels_dir, "train/")
- if not os.path.isdir(yolov5_labels_train_dir):
- os.mkdir(yolov5_labels_train_dir)
- clear_hidden_files(yolov5_labels_train_dir)
- yolov5_labels_test_dir = os.path.join(yolov5_labels_dir, "val/")
- if not os.path.isdir(yolov5_labels_test_dir):
- os.mkdir(yolov5_labels_test_dir)
- clear_hidden_files(yolov5_labels_test_dir)
-
- train_file = open(os.path.join(wd, "yolov5_train.txt"), 'w')
- test_file = open(os.path.join(wd, "yolov5_val.txt"), 'w')
- train_file.close()
- test_file.close()
- train_file = open(os.path.join(wd, "yolov5_train.txt"), 'a')
- test_file = open(os.path.join(wd, "yolov5_val.txt"), 'a')
- list_imgs = os.listdir(image_dir) # list image files
- prob = random.randint(1, 100)
- print("Probability: %d" % prob)
- for i in range(0,len(list_imgs)):
- path = os.path.join(image_dir,list_imgs[i])
- if os.path.isfile(path):
- image_path = image_dir + list_imgs[i]
- voc_path = list_imgs[i]
- (nameWithoutExtention, extention) = os.path.splitext(os.path.basename(image_path))
- (voc_nameWithoutExtention, voc_extention) = os.path.splitext(os.path.basename(voc_path))
- annotation_name = nameWithoutExtention + '.xml'
- annotation_path = os.path.join(annotation_dir, annotation_name)
- label_name = nameWithoutExtention + '.txt'
- label_path = os.path.join(yolo_labels_dir, label_name)
- prob = random.randint(1, 100)
- print("Probability: %d" % prob)
- if(prob < TRAIN_RATIO): # train dataset
- if os.path.exists(annotation_path):
- train_file.write(image_path + '\n')
- convert_annotation(nameWithoutExtention) # convert label
- copyfile(image_path, yolov5_images_train_dir + voc_path)
- copyfile(label_path, yolov5_labels_train_dir + label_name)
- else: # test dataset
- if os.path.exists(annotation_path):
- test_file.write(image_path + '\n')
- convert_annotation(nameWithoutExtention) # convert label
- copyfile(image_path, yolov5_images_test_dir + voc_path)
- copyfile(label_path, yolov5_labels_test_dir + label_name)
- train_file.close()
- test_file.close()
在VOCdevkit目录下生成images和labels文件夹,文件夹下分别生成了train文件夹和val文件夹,里面分别保存着训练集的照片和txt格式的标签,还有验证集的照片和txt格式的标签。images文件夹和labels文件夹就是训练yolov5模型所需的训练集和验证集。
为了缩短训练时间,可以从下面网址中获取预训练权重。https://www.wpsshop.cn/w/知新_RL/article/detail/732775
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。