模型实战一之YOLOv7实例分割、模型寻来自己数据集

news2024/11/15 21:41:34

模型实战一之YOLOv7实例分割、模型训练自己数据集

1.环境准备

  • 下载yolov7实例分割模型:
git clone https://github.com/WongKinYiu/yolov7.git -b mask yolov7-mask

cd yolov7-mask
  • 安装环境
#查看已安装环境
conda info --envs
#查看安装了哪些包
conda list

#创建环境 
conda create -n yolov7 python=3.8
#激活
conda activate yolov7

# 安装 torch 1.8.2+cu11.1
pip install torch==1.8.2 torchvision==0.9.2 torchaudio===0.8.2 --extra-index-url https://download.pytorch.org/whl/lts/1.8/cu111

#其他版本:torch+cuda10.2
pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio===0.8.1 -f https://download.pytorch.org/whl/torch_stable.html


# 修改requirements.txt,将其中的torch和torchvision注释掉
pip install -r requirements.txt
  • 安装detectron2
    detectron是facebook发布的开源机器视觉库,安装教程参考:https://blog.csdn.net/qq_45770232/article/details/126471738
# 安装detectron2
#先安装ninja
pip install ninja

git clone https://github.com/facebookresearch/detectron2
cd detectron2
python setup.py install
cd ..

2.测试实例分割demo

  • 测试:
下载权重放在detect.py路径下:yolov7.pt ... yolov7-mask.pt

测试yolov7目标检测:

 python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg 

在这里插入图片描述
在这里插入图片描述

  • 测试实例分割 - python
import matplotlib.pyplot as plt
import torch
import cv2
import yaml
from torchvision import transforms
import numpy as np

from utils.datasets import letterbox
from utils.general import non_max_suppression_mask_conf

from detectron2.modeling.poolers import ROIPooler
from detectron2.structures import Boxes
from detectron2.utils.memory import retry_if_cuda_oom
from detectron2.layers import paste_masks_in_image

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
with open('data/hyp.scratch.mask.yaml') as f:
    hyp = yaml.load(f, Loader=yaml.FullLoader)
weigths = torch.load('./weights/yolov7-mask.pt')
model = weigths['model']
model = model.half().to(device)
_ = model.eval()

image = cv2.imread('inference/images/horses.jpg')  # 504x378 image
image = letterbox(image, 640, stride=64, auto=True)[0]
image_ = image.copy()
image = transforms.ToTensor()(image)
image = torch.tensor(np.array([image.numpy()]))
image = image.to(device)
image = image.half()

output = model(image)

inf_out, train_out, attn, mask_iou, bases, sem_output = output['test'], output['bbox_and_cls'], output['attn'], output['mask_iou'], output['bases'], output['sem']

bases = torch.cat([bases, sem_output], dim=1)
nb, _, height, width = image.shape
names = model.names
pooler_scale = model.pooler_scale
pooler = ROIPooler(output_size=hyp['mask_resolution'], scales=(pooler_scale,), sampling_ratio=1, pooler_type='ROIAlignV2', canonical_level=2)

output, output_mask, output_mask_score, output_ac, output_ab = non_max_suppression_mask_conf(inf_out, attn, bases, pooler, hyp, conf_thres=0.25, iou_thres=0.65, merge=False, mask_iou=None)

pred, pred_masks = output[0], output_mask[0]
base = bases[0]
bboxes = Boxes(pred[:, :4])
original_pred_masks = pred_masks.view(-1, hyp['mask_resolution'], hyp['mask_resolution'])
pred_masks = retry_if_cuda_oom(paste_masks_in_image)( original_pred_masks, bboxes, (height, width), threshold=0.5)
pred_masks_np = pred_masks.detach().cpu().numpy()
pred_cls = pred[:, 5].detach().cpu().numpy()
pred_conf = pred[:, 4].detach().cpu().numpy()
nimg = image[0].permute(1, 2, 0) * 255
nimg = nimg.cpu().numpy().astype(np.uint8)
nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
nbboxes = bboxes.tensor.detach().cpu().numpy().astype(np.int32)
pnimg = nimg.copy()

for one_mask, bbox, cls, conf in zip(pred_masks_np, nbboxes, pred_cls, pred_conf):
    if conf < 0.25:
        continue
    color = [np.random.randint(255), np.random.randint(255), np.random.randint(255)]

    pnimg[one_mask] = pnimg[one_mask] * 0.5 + np.array(color, dtype=np.uint8) * 0.5
    pnimg = cv2.rectangle(pnimg, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, 2)
    #label = '%s %.3f' % (names[int(cls)], conf)
    #t_size = cv2.getTextSize(label, 0, fontScale=0.5, thickness=1)[0]
    #c2 = bbox[0] + t_size[0], bbox[1] - t_size[1] - 3
    #pnimg = cv2.rectangle(pnimg, (bbox[0], bbox[1]), c2, color, -1, cv2.LINE_AA)  # filled
    #pnimg = cv2.putText(pnimg, label, (bbox[0], bbox[1] - 2), 0, 0.5, [255, 255, 255], thickness=1, lineType=cv2.LINE_AA)


# coco example
# %matplotlib inline
cv2.imshow("instance_result.jpg", pnimg)
cv2.waitKey(0)
# cv2.imwrite("instance_result.jpg", pnimg)

在这里插入图片描述

3.训练自己的数据集

  • 实例分割时目标检测语义分割的结合,所以其标注文件初始为通过labelme标注的json格式,要用yolo模型进行训练,需要将其转换为yolo所需要的txt格式:
    在这里插入图片描述
  • 转换demo如下:
    参考:https://blog.csdn.net/qq_57329395/article/details/128079776
# 处理labelme多边形矩阵的标注  json转化txt
import json
import os

name2id = {'peanuthull': 0, 'kernel': 1}

def convert(img_size, box):
    dw = 1. / (img_size[0])
    dh = 1. / (img_size[1])
    x = (box[0] + box[2]) / 2.0
    y = (box[1] + box[3]) / 2.0
    w = abs(box[2] - box[0])
    h = abs(box[3] - box[1])
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)

def decode_json(json_floder_path, txt_outer_path, json_name):
    #  json_floder_path='E:\\Python_package\\itesjson\\'
    # json_name='V1125.json'
    txt_name = txt_outer_path + json_name[:-5] + '.txt'
    with open(txt_name, 'w') as f:
        json_path = os.path.join(json_floder_path, json_name)  # os路径融合
        data = json.load(open(json_path, 'r', encoding='gb2312', errors='ignore'))
        img_w = data['imageWidth']  # 图片的高
        img_h = data['imageHeight']  # 图片的宽
        isshape_type = data['shapes'][0]['shape_type']
        print(isshape_type)
        # print(isshape_type)
        # print('下方判断根据这里的值可以设置为你自己的类型,我这里是polygon'多边形)
        # len(data['shapes'])
        for i in data['shapes']:
            label_name = i['label']  # 得到json中你标记的类名
            if (i['shape_type'] == 'polygon'):  # 数据类型为多边形 需要转化为矩形
                x_max = 0
                y_max = 0
                x_min = 100000
                y_min = 100000
                for lk in range(len(i['points'])):
                    x1 = float(i['points'][lk][0])
                    y1 = float(i['points'][lk][1])
                    # print(x1)
                    if x_max < x1:
                        x_max = x1
                    if y_max < y1:
                        y_max = y1
                    if y_min > y1:
                        y_min = y1
                    if x_min > x1:
                        x_min = x1
                bb = (x_min, y_max, x_max, y_min)
            if (i['shape_type'] == 'rectangle'):  # 为矩形不需要转换
                x1 = float(i['points'][0][0])
                y1 = float(i['points'][0][1])
                x2 = float(i['points'][1][0])
                y2 = float(i['points'][1][1])
                bb = (x1, y1, x2, y2)
            bbox = convert((img_w, img_h), bb)
            try:
                f.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\n')
            except:
                pass


if __name__ == "__main__":
    json_floder_path = 'data_\\jsons\\'  # 存放json的文件夹的绝对路径
    txt_outer_path = 'data_\\txts\\'  # 存放txt的文件夹绝对路径
    json_names = os.listdir(json_floder_path)
    print("共有:{}个文件待转化".format(len(json_names)))
    flagcount = 0
    for json_name in json_names:
        decode_json(json_floder_path, txt_outer_path, json_name)
        flagcount += 1
        print("还剩下{}个文件未转化".format(len(json_names) - flagcount))

    # break
    print('转化全部完毕')
  • 数据集存放格式:

  • datasets:

    • images:

      • train: .jpg
      • val: .jpg
    • labels:

      • train: .txt
      • val: .txt
    • train_list.txt

    • val_list.txt

  • train_listval_list存放绝对路径,如下:
    在这里插入图片描述
    在这里插入图片描述

参考:https://blog.csdn.net/matt45m/article/details/127416919?spm=1001.2014.3001.5502

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

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

相关文章

神奇的线性表(链表)

目录 神马是链表 链表的分类 单向链表 链表的常用操作 查找操作 插入操作 删除操作 链表与数组 数组的插入 数组的删除 链表的应用 尾声 神马是链表 记得很久很久以前…我们学习过数组&#xff0c; 数组是在内存中一段连续的存储空间&#xff0c; 可以在常数时间内访…

逻辑分析仪解析SPI数据

工具为梦源逻辑分析仪&#xff0c;本次测试的是ST7789v屏幕驱动 接线方面一共需要三根线&#xff08;MOSI&#xff0c;SCL&#xff0c;GND&#xff09; SCL PA5 MOSI PA7 DSView上位机配置 通道按照接线选择&#xff0c;这个一定要对应上 COPL CPOH按照SPI实际配置来&#x…

生成模型(四):扩散模型(Diffusion Models)

本文大纲如下&#xff1a; 生成模型种类 到目前为止&#xff0c;我已经写了三种类型的生成模型&#xff0c;[[生成模型-GAN]]、[[生成模型-VAE]]和[[生成模型-Flow based model]]。 它们在生成高质量样本方面显示出巨大的成功&#xff0c;但每一种都有其自身的一些局限性。下…

基于Python的GUI图形用户界面编程

【无限嚣张&#xff08;菜菜&#xff09;】&#xff1a;hello您好&#xff0c;我是菜菜&#xff0c;很高兴您能来访我的博客&#xff0c;我是一名爱好编程学习研究的菜菜&#xff0c;每天分享自己的学习&#xff0c;想法&#xff0c;博客来源与自己的学习项目以及编程中遇到问题…

非零基础自学Golang 第17章 HTTP编程(上) 17.2 HTTP客户端 17.2.4 发起POST请求

非零基础自学Golang 文章目录非零基础自学Golang第17章 HTTP编程(上)17.2 HTTP客户端17.2.4 发起POST请求第17章 HTTP编程(上) 17.2 HTTP客户端 17.2.4 发起POST请求 在上一小节我们使用了http.NewRequest来创建一个请求&#xff0c;http.NewRequest有三个参数&#xff0c;第…

web前端-javascript-String字符串的相关方法

文章目录字符串的相关方法1. 底层字符串保存2. 方法1) length 属性 获取长度2) charAt() 获取指定字符3) chartCodeAt() 获取指定字符编码4) String.formCharCode() 根据编码获取字符5) concat() 连接字符串6) indexOf() 是否含有指定内容7) lastIndexOf() 是否含有指定内容8) …

哈斯机床联网

一、设备信息确认 1、确认型号 哈斯的数控面板共有两种情况。 老版本&#xff1a; 新版本&#xff1a; 注&#xff1a;老版本通讯为串口&#xff0c;新版本通讯为网口。 2、确认通讯接口 1、数控面板的后面 老版本的串口一般都会引出在正后面的左侧位置&#xff0c;上面有…

结构型模式之代理模式(八)

常说的设计模式是23种设计模式&#xff0c;分为3大类&#xff1a; 创建型模式5种&#xff1a;工厂方法、抽象工厂、单例、建造者、原型结构型模式7种&#xff1a;适配器、代理、桥接、装饰者、外观、享元、组合行为型模式11种&#xff1a;模板方法、解释器、策略、观察者、迭代…

非零基础自学Golang 第15章 Go命令行工具 15.5 代码测试(test) 15.5.1 单元测试

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.5 代码测试(test)15.5.1 单元测试第15章 Go命令行工具 15.5 代码测试(test) go test命令用于对Go语言编写的代码包进行测试。 可以指定要测试的文件&#xff0c;也可以直接对整个包进行测试&#xff0c…

[Java实战]Squaretest单元测试生成利器...一天生成所有简单单元测试...[新手开箱可用]

Squaretest单元测试生成利器...一天生成所有简单单元测试...[新手开箱可用]1.Squaretest是什么?2.如何配合JUnit使用...?3.生成的java文件长啥样?4.如何生成和使用?5.如何用生成的XXXTest.java文件进行单元测试...6.观察结果7.单元测试成功8.源码地址为了好好写单元测试,提…

Dell inspiron 7580硬件升级_更换电池加内存条移动硬盘

文章目录前言硬件升级确认硬件型号参数拆机验证硬件更新后记前言 手上的笔记本[Dell inspiron 7580]用了几年了&#xff0c;还是刚上大学的时候买的&#xff0c;现在感觉这个配置用起来有点吃力了&#xff0c;稍微更新一下配置准备再战两年┭┮﹏┭┮ Light em up, light em u…

参数扫描文件的用法

摘要 通过控制和改变所选参数有助于检查给定光学系统的性能。 VirtualLab Fusion提供了完全灵活且计算效率高&#xff08;通过并行化&#xff09;的参数运行&#xff0c;使用户可以指定不同的参数变化方式。 作为示例&#xff0c;它可以用于所研究的任何系统参数的公差分析。 分…

Moonbeam生态说|Moonbeam Ignite重燃DeFi生态活力

日前&#xff0c;Moonbeam Network生态中两家活跃度最高的DeFi协议Moonwell和StellaSwap受邀参加Moonbeam中文社区BinanceLive直播。 作为Moonbeam生态的老朋友&#xff0c;两家项目方的联合创始人对赋能生态胸有成竹。 今年11月&#xff0c;Moonwell和StellaSwap都得到社区投票…

MORE CONVNETS IN THE 2020S: SCALING UP KER- NELS BEYOND 51 × 51 USING SPARSITY

论文链接: https://arxiv.org/pdf/2207.03620.pdf code: https://github.com/VITA-Group/SLaKlink MORE CONVNETS IN THE 2020S: SCALING UP KER- NELS BEYOND 51 51 USING SPARSITY一、引言&#xff08;二&#xff09;、大内核注意力&#xff08;二&#xff09;、卷积中的大…

I/O多路转接 —— select、poll、epoll

目录 一、概述 二、I/O多路转接 —— select 1. select函数的基本介绍 2. select的基本工作流程 3. 文件描述符的就绪条件 4. 基于select函数设计的服务器 1. 基本套接字的编写 2. select服务器的编写 5. select的优缺点 三、I/O多路转接 —— poll 1. poll函数的基…

LeetCode-1799- N 次操作后的最大分数和

1、状态压缩动态规划 我们可以使用动态规划来解决问题&#xff0c;我们利用数组dp[s]dp[s]dp[s]来表示状态为s时&#xff0c;能够去到的最大分数。由于题目限定了n的范围&#xff0c;因此我们可以利用二进制数字s来压缩状态&#xff0c;我们利用长度为m的二进制数s的每一位来表…

Javascript | Popper | 如何下载popper.min.js 与 各类js资源

文章目录问题描述解决办法问题描述 作为一个JS生手只知道使用CDN在线引用或者使用下载好的本地JS文件。 比如popper.js官网显示如下图&#xff0c;没有任何的Download按钮&#xff0c;有部分其他类的JS官网也存在同样的情况。 虽然有提供CDN&#xff0c;但因为国内网络原因&am…

Lua table(表)

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型&#xff0c;如&#xff1a;数组、字典等。 Lua table 使用关联型数组&#xff0c;你可以用任意类型的值来作数组的索引&#xff0c;但这个值不能是 nil。 Lua table 是不固定大小的&#xff0c;你可以根据自己需要…

什么是python,为什么要学习Python?

什么是python&#xff1f; 人工智能概念的兴起&#xff0c;使得Python的发展非常迅速&#xff0c;关注度也是越来越高。作为现在最热门的编程语言&#xff0c;Python简单优雅&#xff0c;用尽量少的代码写出最明白的程序&#xff0c;简单易学的特性使其拥有超高的人气&#xf…

VUE—跳转传参

目录 一、基本使用 二、$route和$router 三、路由跳转的两种方式 四、编程式导航 五、传参 六、props 一、基本使用 1、安装vue-router cnpm install --save vue-router3 如果大家用的是vue2&#xff0c;下载vue-router不设置版本好的话&#xff0c;可能会因为版本过高…