【利用Yolov8实现多个检测模型融合】

本文详细介绍了如何使用Yolov8融合两个检测模型,通过重新标注数据集,实现实时多目标识别。提供代码实例,涉及数据处理和模型训练过程。
摘要由CSDN通过智能技术生成

在这里插入图片描述

1 背景

1.1 案例背景

现在有Yolov8两个模型,一个模型用于识别人,一个模型用于识别树。现要求将识别人和识别树的两个模型合并成一个模型,仅利用一个模型就能同时识别人和树。

1.2 解决思路

将同时存在人和树的数据集重新标注,使label文件里存在具有人和树的类别,然后再次训练出新的模型。

1.3 重点解决问题

生成新的label文件,得到新的数据集。在下面的代码中,通过两个类的Yolov8模型对原有数据集对应的训练集和验证集的images进行检测,然后将检测结果进行处理,进而生成新的包含两个类别的数据集。

2 代码实现

from ultralytics import YOLO
import os, cv2
import numpy as np

# 存放全局变量
source_dir_path = [r"F:\0_work\数据集\datasets_clone\train\images", r"F:\0_work\数据集\datasets_clone\val\images"]
yolo_label_dir_path = [r"F:\0_work\数据集\datasets_clone\train\new_labels", r"F:\0_work\数据集\datasets_clone\val\new_labels"]
class MakeLabel():
    def __init__(self):
        # 设置模型路径,并加载模型
        self.people_model_path = "./weights/people_best.pt"
        self.tree_model_path = "./weights/tree_best.pt"

        self.people_model = YOLO(self.people_model_path, task='detect')
        self.tree_model = YOLO(self.tree_model_path, task='detect')

    def check_label_dirs(self, destination_folder):
        if not os.path.exists(destination_folder):
            os.makedirs(destination_folder)

    def get_label_data(self, labels, boxes, id):
         for box in boxes:
            x = box[0]
            y = box[1]
            w = box[2]
            h = box[3]
            labels.append([id, x, y, w, h])

    def getlabel(self, img_path):
        img = cv2.imread(img_path)
        new_label_file_name = img_path.split('\\')[-1].split('.')[0]
        
        # 得到模型检测的结果
        people_results = self.people_model(img,  verbose=False,  imgsz=640, conf=0.1, iou=0.35, show=False) 
        tree_results = self.tree_model(img, verbose=False, conf=0.7, iou=0.35, imgsz=320)

        # 生成模型检测的结果,将数据格式表示为经过比率转换的YOLO标注格式,即[class_id, x*, y*, w*, h*]
        labels = []
        people_boxes = people_results[0].boxes.xywhn.cpu().numpy().astype(float)
        tree_boxes = tree_results[0].boxes.xywhn.cpu().numpy().astype(float)
        people_id = 0
        tree_id = 1 
        # 添加 class_id
        self.get_label_data(labels, people_boxes, people_id)
        self.get_label_data(labels, tree_boxes, tree_id)

        # 将检测的结果存入txt
        with open(os.path.join(yolo_label_dir_path, new_label_file_name + '.txt'), 'w') as out_file:
            print(type(labels))
            for line in labels:
                out_file.write(" ".join(str(data) for data in line) + '\n')
        out_file.close()

if __name__ == '__main__':
    makelabel = MakeLabel()
    source_path_dir_numbers =  len(source_dir_path)
    for index in range(source_path_dir_numbers):
        makelabel.check_label_dirs(yolo_label_dir_path[index])
        for file in os.listdir(source_dir_path[index]):
            file_path =  os.path.join(source_dir_path, file)
            makelabel.getlabel(file_path)

  • 10
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值