sahi切片辅助训练推理

news2024/11/7 22:44:07

本文的目的切片yolov5标注格式的数据,并保存图片和标注文件

代码实现步骤如下

  1. 把yolov5格式转换成coco格式标签;
  2. 切片图片和coco标签;
  3. 把切片出来的coco标签转换回yolov5标签格式
# 1. 把yolov5格式转换成coco格式标签;
# 2. 切片图片和coco标签;
# 3. 把切片出来的coco标签转换回yolov5标签格式

import os
import numpy as np
import cv2
from sahi.utils.coco import Coco, CocoCategory, CocoImage, CocoAnnotation
from sahi.slicing import slice_coco
from sahi.utils.file import save_json

def convert2coco(img_path,h,w,yololabel):

    coco = Coco()
    maps = {
        0 : 'person',
        1 : 'soccer'
    }
    coco.add_category(CocoCategory(id=0, name='person')) # 两个类别
    coco.add_category(CocoCategory(id=1, name='soccer'))

    coco_image = CocoImage(file_name=img_path, height=h, width=w)
    
    for label in yololabel:

        coco_image.add_annotation(
        CocoAnnotation(
            bbox=[label[1], label[2], label[3], label[4]],
            category_id=int(label[0]),
            category_name=maps[label[0]]
        )
        )
    
    coco.add_image(coco_image)
    coco_json = coco.json
    save_json(coco_json, "coco_dataset.json")
    return coco_json

def convert2xywh(l,h,w): # 把(class cx xy w h)转换成左上角wh
    new_l = np.zeros_like(l)
    l[:,1] = l[:,1]*w
    l[:,3] = l[:,3]*w
    l[:,2] = l[:,2]*h
    l[:,4] = l[:,4]*h
    
    new_l[:,0] = l[:,0]
    new_l[:,1] = l[:,1] - l[:,3]/2
    new_l[:,2] = l[:,2] - l[:,4]/2
    new_l[:,3] = l[:,3] 
    new_l[:,4] = l[:,4]
    
    return new_l

def slice_img(save_img_dir):
    
    coco_dict, coco_path = slice_coco(
                coco_annotation_file_path="coco_dataset.json",
                image_dir='',
                slice_height=640,
                slice_width=640,
                overlap_height_ratio=0.2,
                overlap_width_ratio=0.2,
                output_dir = save_img_dir,
                output_coco_annotation_file_name = 'sliced',
                min_area_ratio = 0.2,
                ignore_negative_samples = True
            )
    return  

def convert2yolov5(coco_dir,save_img_dir,save_label_dir):
    
    coco = Coco.from_coco_dict_or_path(coco_dir, save_img_dir)
    # export converted YoloV5 formatted dataset into given output_dir with a 85% train/15% val split
    coco.export_as_yolov5(
    output_dir=save_label_dir,
    disable_symlink = True
    )
    
    return 

if __name__ == '__main__':
    file = 'SNMOT-061'
    img_dir = f'datasets/soccernet/tracking/images/train/{file}/img1/'
    anno_dir = f'datasets/soccernet/tracking/labels/train/{file}/img1/'
    save_img_dir = 'datasets/sliced_soccernet/images/train/' + f'{file}/' # 把切分的图片保存到这里
    save_label_dir = 'datasets/sliced_soccernet/labels/train/' + f'{file}/'
    os.makedirs(save_img_dir,exist_ok=True)
    os.makedirs(save_label_dir,exist_ok=True)
    labels = os.listdir(anno_dir)
    for label in labels:
        if 'old' not in label:
            try:
                os.remove('coco_dataset.json') # 删除中间文件
                os.remove(save_img_dir+'sliced_coco.json')
            except:
                pass
            l = np.loadtxt(anno_dir+label,delimiter=' ') # class cx xy w h
            img_path = img_dir+label.replace('txt','jpg')
            img = cv2.imread(img_path)
            h,w,_ = img.shape
            new_l = convert2xywh(l,h,w)
            coco_json = convert2coco(img_path,h,w,new_l)
            slice_img(save_img_dir)  # 切分图片并保存
            convert2yolov5(save_img_dir+'sliced_coco.json', save_img_dir,save_label_dir) # 把切分完的coco标签转换回yolo格式并保存
            
            
    
            # for ll in new_l: # 验证是否转换正确
            #     if int(ll[0]) == 0:
            #         cv2.rectangle(img,(int(ll[1]),int(ll[2])),(int(ll[1]+ll[3]),int(ll[2]+ll[4])),(255,0,255),2)
            #     else:
            #         cv2.rectangle(img,(int(ll[1]),int(ll[2])),(int(ll[1]+ll[3]),int(ll[2]+ll[4])),(255,0,2),2)         
            # cv2.imwrite('./test.jpg',img)
            
            

在上述的基础上需要修改一下sahi的源码,它默认会保存图片的,注释掉:
在这里插入图片描述

在这里插入图片描述

最终结果
在这里插入图片描述
在这里插入图片描述
转换完成后,可视化代码:

import os
import cv2


# train_lists = os.listdir('datasets/soccernet/tracking/images/train')

# for tl in train_lists:

root = 'datasets/sliced_soccernet/images/train/' + 'SNMOT-061/'
# root2 = 'datasets/soccernet/tracking/images2/train/'+'Vision_State.v4i.yolov8'+'/images/'
sum = 0
train_list = os.listdir(root)

for img in train_list:
    if not img.endswith('jpg'):
        continue
    res = []
    ball_bbox = []
    data = cv2.imread(root+img)
    ih,iw,c = data.shape
    try:
        anno = open(root.replace('images','labels')+img[:-4]+'.txt').read().splitlines()
    except:
        continue
    for an in anno:
        a = an.split(' ')
        cls,x,y,w,h = int(a[0]),float(a[1]),float(a[2]),float(a[3]),float(a[4])
        x = int(iw*x)
        y = int(ih*y)
        w = int(w*iw)
        h = int(h*ih)
        if int(cls)==1:
            cv2.rectangle(data,(x-w//2,y-h//2),(x+w//2,y+h//2),(255,255,0),2)
            ball_bbox.append([x-w//2,y-h//2,w,h])
            pass
        else:
            res.append([x-w//2,y-h//2,x+w//2,y+h//2])
            cv2.rectangle(data,(x-w//2,y-h//2),(x+w//2,y+h//2),(0,0,255),2)
            pass
    # if len(ball_bbox) > 0:
    #     crop_img = data[max(0,ball_bbox[0][1]-50):ball_bbox[0][1]+ball_bbox[0][3]+50,max(0,ball_bbox[0][0]-50):ball_bbox[0][0]+ball_bbox[0][2]+50]

        save_dir = 'outimg/' + root
        os.makedirs(save_dir,exist_ok=True)
        cv2.imwrite(os.path.join(save_dir,img),data)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1114744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java关键字 `super` 的骚操作

文章目录 1. 调用父类构造方法2. 访问父类属性和方法3. 创建父类引用4. 在接口中使用 super5. 在 Lambda 表达式中使用 super6. 异常处理结语 🎉欢迎来到Java学习路线专栏~Java关键字 super 的骚操作 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页&#…

Android gradle动态配置不同打包环境参数值

一、背景 在android开发中,包的构建通过gradle脚本来完成的,这个脚本也提供了很多东西来配合我们开发。最常见的类似渠道和不同版本包。 打包的配置常见的是buildTypes节点,通过buildTypes设置不同的action完成不同包的输出 二、gradle的Jav…

(八)vtk常用类的常用函数介绍(附带代码示例)

vtk中类的说明以及函数使用 https://vtk.org/doc/nightly/html/annotated.html 一、vtkObject派生类 1.vtkPoints 点 InsertNextPoint(double, double, double):插入点。 2.vtkCellArray 单元数组 InsertNextCell (vtkIdType npts, const vtkIdType *pts)&…

【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程

【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程 Shuffle是什么Shuffle的流程处理map任务的执行流程reduce任务的执行流程 Shuffle过程分析和优化map任务深入分析细化步骤分析1. 数据分片读取2. 分配计算Reduce服务Partitioner分区…

LINUX | hexdump以16进制查看文件内容

LINUX | hexdump以16进制查看文件内容 时间:2023-10-20 文章目录 LINUX | hexdump以16进制查看文件内容1.参考2.示例1.以ASCII字符显示文件中字符2.以16进制和相应的ASCII字符显示文件里的字符3.只显示文件中前n个字符4.以偏移量开始格式输出 1.参考 1.Linux命令–h…

C语言指针精简版(二)

目录 数组名的理解 使⽤指针访问数组 ⼀维数组传参的本质 冒泡排序 ⼆级指针及其解引用 指针数组 实例:指针数组模拟⼆维数组 数组名的理解 对于数组名表示的意义一共有三种情况: *1、数组名:表示数组⾸元素地址。 *2、sizeof(数组名…

中文编程工具开发语言开发的实际案例:触摸屏点餐软件应用场景实例

中文编程工具开发语言开发的实际案例:触摸屏点餐软件应用场景实例 软件特色: 1、功能实用,操作简单,不会电脑也会操作,软件免安装,已内置数据库。软件在关闭的时候,可以设置会员数据备份到U盘&…

@Controller与@RestController

总结 Controller :定义一个控制器类. RequestMapping :给出外界访问方法的路径,或者说触发路径 ,触发条件。 具体解析访问路径到某个方法上. ResponseBody :标记Controller类中的方法。把return的结果变成JSON对象…

束从轩的“网红人设”,正在加重老乡鸡的割裂

文 | 螳螂观察 作者 | 图霖 “老乡鸡20周年,我请大家免费吃饭。” 和以往的每场活动一样,“网红老板”束从轩穿着印有老乡鸡品牌Logo的大红短袖T恤,向广大网友发出热情邀请,真诚得像是自家村口小卖部好客的大叔。 这并不是束从…

虹科 | 测试方案 | 汽车示波器 通讯网络(LIN/CAN/FlexRay)测试方案

通讯网络(LIN/CAN/FlexRay)测试 虹科CAN总线示波器把你的PC电脑变成一台功能强大的汽车测试工具,用于检测车辆网络各类通讯信号,如CAN Bus、CAN FD、LIN、FlexRay,还可以检测车上所有传感器和执行器的信号 串行译码 …

【动态规划】647. 回文子串、516. 最长回文子序列

提示:努力生活,开心、快乐的一天 文章目录 647. 回文子串💡解题思路🤔遇到的问题💻代码实现🎯题目总结 516. 最长回文子序列💡解题思路🤔遇到的问题💻代码实现&#x1f3…

计算机网络学习笔记(四):网络层(待更新)

目录 4.1 IP地址、子网划分、合并超网 4.1.1 IP地址、子网掩码、网关 4.1.2 IP地址的编址方法1:IP地址分类(A~E类地址、保留的IP地址) 4.1.4 IP地址的编址方法2:子网划分(等长、变长) 4.1.5 IP地址的编…

uview组件使用笔记

图标样式 修改图标的样式 通过color参数修改图标的颜色通过size参数修改图标的大小&#xff0c;单位为rpx 效果图 <u-icon name"photo" color"#2979ff" size"28"></u-icon>图片图标 1.3.0 这里说的图片图标&#xff0c;指的是小…

RSTP详解:对比STP,到底改进了什么?

一、RSTP概述 IEEE 802.1W中定义的RSTP可以视为STP的改进版本&#xff0c;RSTP在许多方面对STP进行了优化&#xff0c;它的收敛速度更快&#xff0c;而且能够兼容STP。 二、RSTP对STP的改进 改进点1&#xff1a;端口角色 、 改进点2&#xff1a;端口状态 RSTP的状态规范缩…

5秒盾,加速乐

5秒盾 1.先清除网站cooke在刷新&#xff0c;如果出现的稍等就有可能是5秒盾 2.用fd抓搜索参数关键字定位到包 3.抓到包后查找加密参数 4.搜索看那个位置在赋值 5.搜索赋值的参数.去找加密的js 6.删除没用的代码&#xff0c;把检测指纹的赋值过去 7.还原代码在网站的页面…

搞懂TypeScript的类型声明

.d.ts 类型声明/定义文件是 TypeScript 重要的一部分&#xff0c; 希望本文可以带你搞懂下面几个问题&#xff1a; 类型声明是怎么被TypeScirpt识别到的?怎么使用第三方包的类型声明文件&#xff1f;TypeScript代码怎么编译生成类型声明文件&#xff1f;怎么为第三方包编写类…

94. 递归实现排列型枚举

题目&#xff1a; 94. 递归实现排列型枚举 - AcWing题库 思路&#xff1a; 1.全排列问题&#xff08;坑位问题&#xff09;---->递归搜索树---->用dfs深度优先搜索。 2. u表示当前坑位&#xff0c;state[u]表示坑位u存储的数据。因为不同坑位的数据不可以重复&#…

掌握高效创作的艺术:AI助你轻松生成高质量文章

在这个信息爆炸的时代&#xff0c;高效创作已成为一种必需。无论是写作、编辑&#xff0c;还是策划&#xff0c;我们都需要快速、准确地完成工作。然而&#xff0c;我们都有过这样的经历&#xff1a;在创作过程中&#xff0c;我们可能会遇到思路阻塞、词汇匮乏等问题&#xff0…

【IBIS 模型与仿真 - IBISWriter and Write_IBIS】

本文将介绍如何从用户设计中编写自定义IBIS模型。 本文是 SelectIO 解决方案中心&#xff08;Xilinx 答复 50924&#xff09;的设计助手部分&#xff08;Xilinx 答复 50926&#xff09;的一部分。 原文链接&#xff1a;https://support.xilinx.com/s/article/50957?languagee…

大势山维 | 全盘自主可控的实景三维中国建设解决方案

实景三维中国建设是面向新时期测绘地理信息事业服务于社会经济建设和生态文明建设的新定位、新需求。多年来&#xff0c;大势智慧与山维科技深耕数字化建设&#xff0c;以技术研发为立身之本&#xff0c;逐步成长为空间地理信息建设领域的领跑企业。 大势智慧围绕三维重建国产…