YOLOv5_Deepsort硬币检测目标追踪模型调试

目录

使用Yolov5训练数据集

1、标注硬币数据样本集

1.1.如何下载labelimg

1.2进行数据标注

2.划分数据集

2.1划分训练集,验证集,测试集

 3.修改模型配置文件

 4.开始模型训练

5.查看训练模型

 6.用新图片进行测试

 二、使用Deepsort实现目标追踪

1.将txt转为xml

2.数据集处理

3.修改相关参数

4.训练模型

5.测试模型

三、qt界面,实现可视化


还没写完,但是先标个大致的流程,跟着这个走

使用Yolov5训练数据集

1、标注硬币数据样本集

在总文件夹下创建一个文件夹,用于存放数据,我这里命名为CoinData

在CoinData内创建images,labels两个文件夹,分别用于存放样本图片,及标签信息

 框外的暂时不用管,这边只新建蓝色框的即可

这里使用labelimg进行数据标注

1.1.如何下载labelimg

https://github.com/tzutalin/labelImg

github需科学上网

具体安装可参考标注工具 labelImg 的下载安装及使用_labelimg下载_悄悄地努力的博客-CSDN博客

1.2进行数据标注

我进入labelimg总是闪退,最后发现我从虚拟环境进不容易闪退

即cmd--activate Yolo--labelimg--即可顺利打开。

关于如何创建虚拟环境

python创建虚拟环境(一):使用conda创建虚拟环境_conda创建python虚拟环境_caroline_richboom的博客-CSDN博客

随后在labelimg中进行数据标注

关于labelimg使用的坑_几乎几乎的博客-CSDN博客

可以以yolo也可以以voc保存,若以yolo保存,将会获得txt文件,以voc进行保存,将会获得xml文件,建议在数据标注时使用voc模式,在下面的步骤中两种文件都将用到,也将提供代码用于两种文件格式的转换。

2.划分数据集

2.1划分训练集,验证集,测试集

在CoinData(你的数据文件夹)下,创建程序split_train_val.py

不需要更改

'''
Descripttion: split_img.py
version: 1.0
Author: UniDome
Date: 2022-04-20 16:28:45
LastEditors: UniDome
LastEditTime: 2022-04-20 16:39:56
'''
import os, shutil, random
from tqdm import tqdm


def split_img(img_path, label_path, split_list):
    try:  # 创建数据集文件夹
        Data = '../DataSet'
        os.mkdir(Data)

        train_img_dir = Data + '/images/train'
        val_img_dir = Data + '/images/val'
        test_img_dir = Data + '/images/test'

        train_label_dir = Data + '/labels/train'
        val_label_dir = Data + '/labels/val'
        test_label_dir = Data + '/labels/test'

        # 创建文件夹
        os.makedirs(train_img_dir)
        os.makedirs(train_label_dir)
        os.makedirs(val_img_dir)
        os.makedirs(val_label_dir)
        os.makedirs(test_img_dir)
        os.makedirs(test_label_dir)

    except:
        print('文件目录已存在')

    train, val, test = split_list
    all_img = os.listdir(img_path)
    all_img_path = [os.path.join(img_path, img) for img in all_img]
    # all_label = os.listdir(label_path)
    # all_label_path = [os.path.join(label_path, label) for label in all_label]
    train_img = random.sample(all_img_path, int(train * len(all_img_path)))
    train_img_copy = [os.path.join(train_img_dir, img.split('\\')[-1]) for img in train_img]
    train_label = [toLabelPath(img, label_path) for img in train_img]
    train_label_copy = [os.path.join(train_label_dir, label.split('\\')[-1]) for label in train_label]
    for i in tqdm(range(len(train_img)), desc='train ', ncols=80, unit='img'):
        _copy(train_img[i], train_img_dir)
        _copy(train_label[i], train_label_dir)
        all_img_path.remove(train_img[i])
    val_img = random.sample(all_img_path, int(val / (val + test) * len(all_img_path)))
    val_label = [toLabelPath(img, label_path) for img in val_img]
    for i in tqdm(range(len(val_img)), desc='val ', ncols=80, unit='img'):
        _copy(val_img[i], val_img_dir)
        _copy(val_label[i], val_label_dir)
        all_img_path.remove(val_img[i])
    test_img = all_img_path
    test_label = [toLabelPath(img, label_path) for img in test_img]
    for i in tqdm(range(len(test_img)), desc='test ', ncols=80, unit='img'):
        _copy(test_img[i], test_img_dir)
        _copy(test_label[i], test_label_dir)


def _copy(from_path, to_path):
    shutil.copy(from_path, to_path)


def toLabelPath(img_path, label_path):
    img = img_path.split('\\')[-1]
    label = img.split('.jpg')[0] + '.txt'
    return os.path.join(label_path, label)


def main():
    img_path = r'D:\A_coin\yolov5-master\CoinData\images'
    label_path = r'D:\A_coin\yolov5-master\CoinData\labels'
    split_list = [0.7, 0.2, 0.1]  # 数据集划分比例[train:val:test]
    split_img(img_path, label_path, split_list)


if __name__ == '__main__':
    main()

随后将生成如下文件夹

 

 3.修改模型配置文件

这里选用yolo5s.yaml

右击并用记事本打开,将nc的值修改为自己的标注类别数

 4.开始模型训练

打开命令提示符,进入虚拟环境,即cmd--activate Yolov5test(这里是你自己的虚拟环境名)

输入

python train.py --weights weights/yolov5s.pt  --cfg models/yolov5s.yaml  --data data/myvoc.yaml --epoch 200 --batch-size 8 --img 640   --device cpu

5.查看训练模型

 6.用新图片进行测试

同样在命令提示符内,进入虚拟环境

根据所需输入

exp是你模型存放的文件夹,根据自己情况选择,

python detect.py --weights runs/train/exp14/weights/best.pt --source D:/A_coin/coin_move.mp4
 --source 0  # webcam  自带摄像头
          file.jpg  # image 图片
          file.mp4  # video 视频
          path/  # directory
          path/*.jpg  # glob
          'https://youtu.be/NUsoVlDFqZg'  # YouTube
          'rtsp://example.com/media.mp4'  # RTSP, RTMP, HTTP stream

3.如何查看训练结果

先放个链接在这

yolov5训练结果解析_yolov5 结果-CSDN博客

 二、使用Deepsort实现目标追踪

1.数据集处理

deepsort是实现目标追踪的,如果你的目标是官方的80类别之一,可以直接调用官方训练权重,若不是,则需要自己找一段视频,按帧处理为图片,再对每张图片进行数据标注,如yolov5数据集一样的操作。deepsort训练所用数据格式需为xml格式,即在lablimg中标注时,需要选择voc格式。

视频处理为帧的代码

import cv2

video_path = "D:/CoinNew.mp4"  # 视频文件路径
output_path = "D:/CoinVedioData/images/"  # 输出帧保存的文件夹路径

# 打开视频文件
video = cv2.VideoCapture(video_path)

# 初始化帧计数器
frame_count = 0

while True:
    # 读取视频的每一帧
    ret, frame = video.read()
    if not ret:
        break

    # 保存当前帧为图像文件
    cv2.imwrite(output_path + f"frame_{frame_count}.jpg", frame)

    # 增加帧计数器
    frame_count += 1

# 关闭视频文件
video.release()

使用代码把图像中的检测目标扣出来,作为我们的数据集。

import cv2
import xml.etree.ElementTree as ET
import numpy as np

import xml.dom.minidom
import os
import argparse


def main():
    # JPG文件的地址
    img_path = 'D:/A_coin/yolov5-master/CoinData/images/'
    # XML文件的地址
    anno_path = 'D:/A_coin/yolov5-master/CoinData/xml/'
    # 存结果的文件夹
    cut_path = 'D:/A_coin/yolov5-master/CoinData/crops/'
    if not os.path.exists(cut_path):
        os.makedirs(cut_path)
    # 获取文件夹中的文件
    imagelist = os.listdir(img_path)
    # print(imagelist
    for image in imagelist:
        image_pre, ext = os.path.splitext(image)
        img_file = img_path + image
        img = cv2.imread(img_file)
        xml_file = anno_path + image_pre + '.xml'
        # DOMTree = xml.dom.minidom.parse(xml_file)
        # collection = DOMTree.documentElement
        # objects = collection.getElementsByTagName("object")

        tree = ET.parse(xml_file)
        root = tree.getroot()
        # if root.find('object') == None:
        #     return
        obj_i = 0
        for obj in root.iter('object'):
            obj_i += 1
            print(obj_i)
            cls = obj.find('name').text
            xmlbox = obj.find('bndbox')
            b = [int(float(xmlbox.find('xmin').text)), int(float(xmlbox.find('ymin').text)),
                 int(float(xmlbox.find('xmax').text)),
                 int(float(xmlbox.find('ymax').text))]
            img_cut = img[b[1]:b[3], b[0]:b[2], :]
            path = os.path.join(cut_path, cls)
            # 目录是否存在,不存在则创建
            mkdirlambda = lambda x: os.makedirs(x) if not os.path.exists(x) else True
            mkdirlambda(path)
            try:
                cv2.imwrite(os.path.join(cut_path, cls, '{}_{:0>2d}.jpg'.format(image_pre, obj_i)), img_cut)
            except:
                continue

            print("&&&&")


if __name__ == '__main__':
    main()

把这些数据分为训练集和验证集

这里要注意,假设你有100张照片,70个检测目标,每个目标用上述代码抠出来的图片为n张,那么划分完后,你的test和train文件夹下应各有70个子文件夹,train中每个子文件夹内应该是同一目标的n-1张图片,test同名子文件夹内应该是一张检测目标的图片,以下代码用GPT生成,顺便贴上我当时提的需求。

import os
import shutil
'''
帮我写一个python脚本,实现功能为:
第一步,通过指定路径读取文件夹A,读取该文件夹内子文件夹数目,记该数目为num。
第二步,在指定路径下,创建一个新文件夹命名为New,该处New名可修改,New下创建两个子文件夹分别命名为train和test,train和test下分别创建num个子文件夹,子文件夹命名从0001开始递增。
第三步,遍历文件夹A内子文件夹,当前遍历轮次设为i,记i初始值为0,每一次遍历实现,读取A文件夹下第i个子文件夹,记该路径为Word_crops,读取该路径下.jpg文件个数,记数目为N。
打开New文件夹内train文件夹下第i个子文件夹,记该路径为Word_train。
打开New文件夹内test文件夹下第i个子文件夹,记该路径为Word_test。
打开Word_crops路径,读取该路径下.jpg格式文件,将该路径下的前N-1个.jpg文件复制粘贴到Word_train路径,然后将该路径下的第N个.jpg文件复制粘贴到Word_test路径。
随后开始下一轮循环,即i++,当i=num-1时停止循环,程序结束
'''


def copy_images(source_folder, destination_folder_train, destination_folder_test):
    jpg_files = [f for f in os.listdir(source_folder) if f.endswith(".jpg")]
    total_files = len(jpg_files)

    for i, file_name in enumerate(jpg_files):
        source_path = os.path.join(source_folder, file_name)
        if i < total_files - 1:
            destination_path = os.path.join(destination_folder_train, file_name)
        else:
            destination_path = os.path.join(destination_folder_test, file_name)
        shutil.copyfile(source_path, destination_path)


def create_folders_with_images(source_folder, destination_folder):
    subfolders = next(os.walk(source_folder))[1]
    num = len(subfolders)

    new_folder = os.path.join(destination_folder, "New")
    os.makedirs(new_folder, exist_ok=True)

    train_folder = os.path.join(new_folder, "train")
    test_folder = os.path.join(new_folder, "test")
    os.makedirs(train_folder, exist_ok=True)
    os.makedirs(test_folder, exist_ok=True)

    for i in range(num):
        subfolder_name = str(i + 1).zfill(4)
        train_subfolder = os.path.join(train_folder, subfolder_name)
        test_subfolder = os.path.join(test_folder, subfolder_name)
        os.makedirs(train_subfolder, exist_ok=True)
        os.makedirs(test_subfolder, exist_ok=True)

        source_subfolder = os.path.join(source_folder, subfolders[i])
        copy_images(source_subfolder, train_subfolder, test_subfolder)

    print("程序执行完毕!")


# 替换为您的文件夹路径
source_folder = "C:/Users/a/Desktop/TRY/crops"
destination_folder = "C:/Users/a/Desktop/TRY"

create_folders_with_images(source_folder, destination_folder)

3.修改相关参数

将该处修改为自己的类别数,即你的train和test文件夹下子文件夹个数

4.训练模型

cmd--activate Yolov5test

运行程序

python train.py --data-dir data/

或者直接在编译器运行,最后可以看到结果保存到了exp16

5.测试模型

三、qt界面,实现可视化

qt届时搞个视频吧

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值