位置: IT常识 - 正文

YOLOv5-7.0实例分割训练自己的数据,切分mask图并摆正(yolov3实例)

编辑:rootadmin
YOLOv5-7.0实例分割训练自己的数据,切分mask图并摆正

推荐整理分享YOLOv5-7.0实例分割训练自己的数据,切分mask图并摆正(yolov3实例),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:yolov5项目实战,yolov5实现,yolov5-7.0实例分割,yolov5 result,yolov4实例分割,yolov5-7.0实例分割,yolov5实现,yolov5实现,内容如对您有帮助,希望把文章链接给更多的朋友!

YOLOv5-7.0可以用来做实例分割的任务了!!!用完感觉实在是666啊

目录

项目介绍

 数据标注及处理

        json转换txt 

        切分训练集、测试集、验证集

修改配置文件

模型训练和推理

后处理


项目介绍

本文章主要目的有两个:

用yolov5分割网络训练自己的数据处理yolov5的分割结果,将分割的图像裁剪出来

我的项目是需要识别图一里面这些小块,将每个小块裁剪出来,旋转成水平角度后再进行下一步的操作。因项目保密原因,就用模糊的图片代替,见谅见谅。下面展示了效果图,如果你的项目需要实现的功能跟我类似,可参考参考

 图一

 图二

 图三

图四

图片说明:

图一是原图图二是yolov5检测后的图片,它用其他颜色将目标的mask给标出来,并画出目标的最外矩形框图三(后处理)是计算目标四个点坐标,并在原图上画出来图四(后处理)是将目标旋转摆正并切分成小图 数据标注及处理标注工具:labelme标注文件:json格式训练数据要求:坐标归一化的txt文件

 从作者提供的样例数据coco128-seg(下载链接:https://ultralytics.com/assets/coco128-seg.zip),可以看到txt文件的内容,分别是类别下标,归一化的坐标,中间用空格分割,不同目标物体用换行符

        json转换txt 

如何将我们用labelme标注的json文件转化为对应的格式呢?

import jsonimport osimport argparsefrom tqdm import tqdmdef convert_label_json(json_dir, save_dir, classes): json_paths = os.listdir(json_dir) classes = classes.split(',') for json_path in tqdm(json_paths): # for json_path in json_paths: path = os.path.join(json_dir,json_path) with open(path,'r') as load_f: json_dict = json.load(load_f) h, w = json_dict['imageHeight'], json_dict['imageWidth'] # save txt path txt_path = os.path.join(save_dir, json_path.replace('json', 'txt')) txt_file = open(txt_path, 'w') for shape_dict in json_dict['shapes']: label = shape_dict['label'] label_index = classes.index(label) points = shape_dict['points'] points_nor_list = [] for point in points: points_nor_list.append(point[0]/w) points_nor_list.append(point[1]/h) points_nor_list = list(map(lambda x:str(x),points_nor_list)) points_nor_str = ' '.join(points_nor_list) label_str = str(label_index) + ' ' +points_nor_str + '\n' txt_file.writelines(label_str)if __name__ == "__main__": """ python json2txt_nomalize.py --json-dir my_datasets/color_rings/jsons --save-dir my_datasets/color_rings/txts --classes "cat,dogs" """ parser = argparse.ArgumentParser(description='json convert to txt params') parser.add_argument('--json-dir', type=str, help='json path dir') parser.add_argument('--save-dir', type=str, help='txt save dir') parser.add_argument('--classes', type=str, help='classes') args = parser.parse_args() json_dir = args.json_dir save_dir = args.save_dir classes = args.classes convert_label_json(json_dir, save_dir, classes)

脚本说明:

    --json-dir:标注的纯json目录;

    --save-dir:要保存的txt文件目录;

    --classes:类别名称,它的类别顺序跟后面的配置文件顺序相同,如类别cat,dog,执行命令可以这么写

python json2txt_nomalize.py --json-dir my_datasets/color_rings/jsons --save-dir my_datasets/color_rings/txts --classes "cat,dog"        切分训练集、测试集、验证集# 将图片和标注数据按比例切分为 训练集和测试集import shutilimport randomimport osimport argparse# 检查文件夹是否存在def mkdir(path): if not os.path.exists(path): os.makedirs(path)def main(image_dir, txt_dir, save_dir): # 创建文件夹 mkdir(save_dir) images_dir = os.path.join(save_dir, 'images') labels_dir = os.path.join(save_dir, 'labels') img_train_path = os.path.join(images_dir, 'train') img_test_path = os.path.join(images_dir, 'test') img_val_path = os.path.join(images_dir, 'val') label_train_path = os.path.join(labels_dir, 'train') label_test_path = os.path.join(labels_dir, 'test') label_val_path = os.path.join(labels_dir, 'val') mkdir(images_dir);mkdir(labels_dir);mkdir(img_train_path);mkdir(img_test_path);mkdir(img_val_path);mkdir(label_train_path);mkdir(label_test_path);mkdir(label_val_path); # 数据集划分比例,训练集75%,验证集15%,测试集15%,按需修改 train_percent = 0.8 val_percent = 0.1 test_percent = 0.1 total_txt = os.listdir(txt_dir) num_txt = len(total_txt) list_all_txt = range(num_txt) # 范围 range(0, num) num_train = int(num_txt * train_percent) num_val = int(num_txt * val_percent) num_test = num_txt - num_train - num_val train = random.sample(list_all_txt, num_train) # 在全部数据集中取出train val_test = [i for i in list_all_txt if not i in train] # 再从val_test取出num_val个元素,val_test剩下的元素就是test val = random.sample(val_test, num_val) print("训练集数目:{}, 验证集数目:{},测试集数目:{}".format(len(train), len(val), len(val_test) - len(val))) for i in list_all_txt: name = total_txt[i][:-4] srcImage = os.path.join(image_dir, name+'.jpg') srcLabel = os.path.join(txt_dir, name + '.txt') if i in train: dst_train_Image = os.path.join(img_train_path, name + '.jpg') dst_train_Label = os.path.join(label_train_path, name + '.txt') shutil.copyfile(srcImage, dst_train_Image) shutil.copyfile(srcLabel, dst_train_Label) elif i in val: dst_val_Image = os.path.join(img_val_path, name + '.jpg') dst_val_Label = os.path.join(label_val_path, name + '.txt') shutil.copyfile(srcImage, dst_val_Image) shutil.copyfile(srcLabel, dst_val_Label) else: dst_test_Image = os.path.join(img_test_path, name + '.jpg') dst_test_Label = os.path.join(label_test_path, name + '.txt') shutil.copyfile(srcImage, dst_test_Image) shutil.copyfile(srcLabel, dst_test_Label)if __name__ == '__main__': """ python split_datasets.py --image-dir my_datasets/color_rings/imgs --txt-dir my_datasets/color_rings/txts --save-dir my_datasets/color_rings/train_data """ parser = argparse.ArgumentParser(description='split datasets to train,val,test params') parser.add_argument('--image-dir', type=str, help='image path dir') parser.add_argument('--txt-dir', type=str, help='txt path dir') parser.add_argument('--save-dir', type=str, help='save dir') args = parser.parse_args() image_dir = args.image_dir txt_dir = args.txt_dir save_dir = args.save_dir main(image_dir, txt_dir, save_dir)

脚本说明:

    --image-dir:训练图片目录;

YOLOv5-7.0实例分割训练自己的数据,切分mask图并摆正(yolov3实例)

    --txt-dir:上一步生成txt的目录; 

    --save-dir:切分数据集存放路径,执行命令样例:

python split_datasets.py --image-dir my_datasets/color_rings/imgs --txt-dir my_datasets/color_rings/txts --save-dir my_datasets/color_rings/train_data

执行后在存放路径可以看到,自动生成images和labels两个文件夹,两个文件夹里面有三个文件夹:train\test\val

修改配置文件

1、data文件夹里面有yaml文件,下面图片是data/coco128-seg.yaml的内容。

    path:是上面--save-dir切分图片存放的路径;

    train、val、test分别对于images里面的文件夹,按实际填入;

    names:是类别名称和赋予的下标,跟上面转txt顺序相同

2、models/segment文件夹也有yaml文件,如果你使用yolov5m模型,就修改yolov5m-seg.yaml文件的nc,如果有两个类别,nc就修改成2

模型训练和推理

1、训练执行命令

python segment/train.py --epochs 300 --data coco128-seg.yaml --weights yolov5m-seg.pt --img 640 --cfg models/segment/yolov5m-seg.yaml --batch-size 16 --device 2

执行命令说明:指明配置文件、预训练权重路径等,具体参数查看train.py文件

结果:在runs目录生成train-seg文件,每一次训练都会生成对应的权重文件

2、模型推理

python segment/predict.py --weight ./runs/train-seg/exp2/weights/best.pt --source ./my_datasets/color_rings/train_data/images/test/000030.jpg

执行命令说明:指明权重路径和预测的图片或者文件夹,具体参数查看predict.py文件

结果:在runs目录生成predict-seg目录,保存了上面图二的结果图

后处理

重要的后处理来了!!!

segment/predict.py,约169行附近,将预测坐标保存在txt文件。打印segments的维度,他是一个list,如果预测的图片中有6个目标,那么list包含了6个子元素,每个元素都是多个坐标点构成,坐标点是目标预测出来的轮廓坐标值

后处理需要做的步骤有:

坐标反归一化:segments的坐标和txt的格式相同,都是归一化的坐标值,需要转换为图片真实的坐标值获取四个点:多个坐标点计算出左上、右上、左下、右下的点,并将他们按顺时针的顺序输出旋转摆正:已知四个点,可计算得出角度,将目标摆正后保存成小图 

代码献出

# segments是分割的坐标点segments = [ scale_segments(im0.shape if retina_masks else im.shape[2:], x, im0.shape, normalize=True) for x in reversed(masks2segments(masks))]new_segments = [] # 用来装反归一化后的坐标image_list = [] # 切割的小图im0_h, im0_w, im0_c = im0.shapefor k, seg_list in enumerate(segments): # 将归一化的点转换为坐标点 new_seg_list = [] for s_point in seg_list: pt1, pt2 = s_point new_pt1 = int(pt1 * im0_w) new_pt2 = int(pt2 * im0_h) new_seg_list.append([new_pt1, new_pt2]) rect = cv2.minAreaRect(np.array(new_seg_list)) # 得到最小外接矩形的(中心(x,y), (宽,高), 旋转角度) seg_bbox = cv2.boxPoints(rect) # 获取最小外接矩形的4个顶点坐标(ps: cv2.boxPoints(rect) for OpenCV 3.x) seg_bbox = np.int0(seg_bbox) if np.linalg.norm(seg_bbox[0] - seg_bbox[1]) < 5 or np.linalg.norm(seg_bbox[3] - seg_bbox[0]) < 5: continue # 坐标点排序 box1 = sorted(seg_bbox, key=lambda x: (x[1], x[0])) # 将坐标点按照顺时针方向来排序,box的从左往右从上到下排序 if box1[0][0] > box1[1][0]: box1[0], box1[1] = box1[1], box1[0] if box1[2][0] < box1[3][0]: box1[2], box1[3] = box1[3], box1[2] if box1[0][1] > box1[1][1]: box1[0], box1[1], box1[2], box1[3] = box1[1], box1[2], box1[3], box1[0] box1_list = [b.tolist() for b in box1] # 坐标转换为list格式 new_segments.append(box1_list) tmp_box = copy.deepcopy(np.array(box1)).astype(np.float32) partImg_array = image_crop_tools.get_rotate_crop_image(im0, tmp_box) image_list.append(partImg_array) # cv2.imwrite(str(k)+'.jpg', partImg_array) # 保存小图# 在原图上画出分割图像# src_image = im0.copy()# for ns_box in new_segments:# cv2.drawContours(src_image, [np.array(ns_box)], -1, (0, 255, 0), 2)# cv2.imwrite('1.jpg', src_image)

 代码说明:该部分脚本复制在segment/predict.py文件,可以放在if save_txt的同一级别下面。其中注释#保存小图,是保存文章开头图四的图片。注释#在原图上画出分割图像,是文章开头图三的图像。

旋转部分用到了image_crop_tools.get_rotate_crop_image函数,主要用来做角度计算和图片摆正,代码如下:

import cv2import numpy as npdef get_rotate_crop_image(img, points): """ 根据坐标点截取图像 :param img: :param points: :return: """ h, w, _ = img.shape left = int(np.min(points[:, 0])) right = int(np.max(points[:, 0])) top = int(np.min(points[:, 1])) bottom = int(np.max(points[:, 1])) img_crop = img[top:bottom, left:right, :].copy() points[:, 0] = points[:, 0] - left points[:, 1] = points[:, 1] - top img_crop_width = int(np.linalg.norm(points[0] - points[1])) img_crop_height = int(np.linalg.norm(points[0] - points[3])) pts_std = np.float32([[0, 0], [img_crop_width, 0], [img_crop_width, img_crop_height], [0, img_crop_height]]) M = cv2.getPerspectiveTransform(points, pts_std) dst_img = cv2.warpPerspective( img_crop, M, (img_crop_width, img_crop_height), borderMode=cv2.BORDER_REPLICATE) dst_img_height, dst_img_width = dst_img.shape[0:2] if dst_img_height * 1.0 / dst_img_width >= 1:# pass# print(dst_img_height * 1.0 / dst_img_width,dst_img_height,dst_img_width,'*-'*10) dst_img = np.rot90(dst_img,-1) #-1为逆时针,1为顺时针。 return dst_imgdef sorted_boxes(dt_boxes): """ 坐标点排序 """ num_boxes = dt_boxes.shape[0] sorted_boxes = sorted(dt_boxes, key=lambda x: (x[0][1], x[0][0])) _boxes = list(sorted_boxes) for i in range(num_boxes - 1): if abs(_boxes[i+1][0][1] - _boxes[i][0][1]) < 10 and \ (_boxes[i + 1][0][0] < _boxes[i][0][0]): tmp = _boxes[i] _boxes[i] = _boxes[i + 1] _boxes[i + 1] = tmp return _boxes

 撒花完结!!!

本文链接地址:https://www.jiuchutong.com/zhishi/298309.html 转载请保留说明!

上一篇:经验模态分解和各种进化及变种 EMD,EEMD,CEEMD,CEEMDAN,ESMD等简要介绍(经验模态分解和变分模态分解)

下一篇:行人车辆检测与计数系统(Python+YOLOv5深度学习模型+清新界面)(行人检测技术)

  • 小米civi怎么开性能模式(小米civi怎么开空调)

    小米civi怎么开性能模式(小米civi怎么开空调)

  • 微星安全启动怎么开启(微星bios安全启动模式)

    微星安全启动怎么开启(微星bios安全启动模式)

  • 佳能打印机墨盒在哪(佳能打印机墨盒堵塞如何疏通)

    佳能打印机墨盒在哪(佳能打印机墨盒堵塞如何疏通)

  • k歌出现铁粉榜是啥意思(全民k歌铁粉榜记录什么时候失效)

    k歌出现铁粉榜是啥意思(全民k歌铁粉榜记录什么时候失效)

  • 抖音粉丝团升级经验每一级需要多少抖币(抖音粉丝团升级到12级需要多久)

    抖音粉丝团升级经验每一级需要多少抖币(抖音粉丝团升级到12级需要多久)

  • pencil序列号在哪里看(pencil序列号查询入口)

    pencil序列号在哪里看(pencil序列号查询入口)

  • wps打字出来是空白怎么办(wps打字出来是空格怎么办)

    wps打字出来是空白怎么办(wps打字出来是空格怎么办)

  • vivo丢了手机如何确定手机位置(vivo手机丢了该怎么办)

    vivo丢了手机如何确定手机位置(vivo手机丢了该怎么办)

  • 华为eml-al00是什么型号(华为EMLAL00是什么型号)

    华为eml-al00是什么型号(华为EMLAL00是什么型号)

  • 计算机网络中局域网的拓扑结构有哪五种(计算机网络中局域网的英文代号是)

    计算机网络中局域网的拓扑结构有哪五种(计算机网络中局域网的英文代号是)

  • 三星f7000折叠手机是双卡双待吗(三星f7000折叠手机参数)

    三星f7000折叠手机是双卡双待吗(三星f7000折叠手机参数)

  • 华为手机咋关机(华为手机如何关机)

    华为手机咋关机(华为手机如何关机)

  • 华为充电泡泡能一直显示么(华为充电泡泡能充电吗)

    华为充电泡泡能一直显示么(华为充电泡泡能充电吗)

  • 微信头像抖动对方知道吗(微信头像抖了一下什么意思)

    微信头像抖动对方知道吗(微信头像抖了一下什么意思)

  • 苹果指纹失灵的原因(苹果指纹失灵怎么办)

    苹果指纹失灵的原因(苹果指纹失灵怎么办)

  • 在Windows 中,任务栏的作用是(在WINDOWS中任务栏上的程序按钮区)

    在Windows 中,任务栏的作用是(在WINDOWS中任务栏上的程序按钮区)

  • 怎么设置艺术字形状样式(怎么设置艺术字区域高度和宽度)

    怎么设置艺术字形状样式(怎么设置艺术字区域高度和宽度)

  • 怎么撤回微信信息(撤回微信信息超出2分钟怎么撤回)

    怎么撤回微信信息(撤回微信信息超出2分钟怎么撤回)

  • 如何将word文档两页变一页打印(如何将word文档中的某一页变为横向)

    如何将word文档两页变一页打印(如何将word文档中的某一页变为横向)

  • 抖音短视频怎么玩换装(抖音短视频怎么变现赚钱)

    抖音短视频怎么玩换装(抖音短视频怎么变现赚钱)

  • 苹果快捷指令中心打不开(苹果快捷指令中心怎么用)

    苹果快捷指令中心打不开(苹果快捷指令中心怎么用)

  • 抖音短视频怎么分享到微信朋友圈(抖音短视频怎么剪辑制作)

    抖音短视频怎么分享到微信朋友圈(抖音短视频怎么剪辑制作)

  • vivo最近删除的照片删除怎么恢复(vivo最近删除的短信在哪里)

    vivo最近删除的照片删除怎么恢复(vivo最近删除的短信在哪里)

  • 华为p30怎么开空调(华为p30开空调)

    华为p30怎么开空调(华为p30开空调)

  • 苹果闹钟震动怎么设置(苹果闹钟震动怎么调出来)

    苹果闹钟震动怎么设置(苹果闹钟震动怎么调出来)

  • ARP防火墙怎么开启?(arp防火墙是什么意思)

    ARP防火墙怎么开启?(arp防火墙是什么意思)

  • 什么是价税分离?
  • 什么原始凭证可以填写
  • 建筑类企业是否允许留抵
  • 印花税申报了什么时候扣款
  • 一般纳税人附加税减免政策2023
  • 小微企业免交增值税,月末结转到营业外收入吗
  • 税务局开运费发票需要带什么
  • 劳务工和临时工
  • 债务重组损失计算公式
  • 购买商品赠送
  • 没收土地竞买保证金政策法律
  • 社平工资调整补差什么意思
  • 公司章程上的出资时间2050年
  • 增值税税额转出申报怎么填写
  • 异地预缴本地申报流程
  • 个人所得税做账怎么做
  • 建筑工程总包分包的内容
  • 当月扣缴社保需要申报吗
  • 月底财务为什么要关账,暂时开不了发票
  • 生产企业原材料的订购与运输建模
  • 系统安装的步骤
  • php的核心
  • 员工伙食费明细表
  • 无法打开exe程序
  • 蝴蝶兰的养殖方法和注意事项视频
  • php怎么执行sql语句
  • 应交增值税减免税款包括什么
  • 贸易型企业能开什么增值税票
  • echarts饼图参数配置
  • 购买员工宿舍用品报销
  • 支付工资会计
  • 其他综合收益要结转到本年利润吗
  • 什么样的资产可以执行
  • 非限定性净资产包括哪些科目
  • 发票校验码是什么在哪
  • Testing Applications with WebTest¶
  • phpcms怎么样
  • 电子发票能退回去吗
  • 长期待摊费用是非流动资产吗
  • 个体工商户怎么变更法人
  • 发票开9个点
  • 保险理赔进项税额转出
  • 车船税款
  • 如何确认产品销售收入
  • 进项税额加计10
  • 计提贷款损失准备的意义
  • 金银首饰以旧换新所得税处理
  • 餐饮业燃气费计入什么科目
  • 多交了社保
  • 个体户减免税额怎么填
  • 经营范围之外的业务
  • 固定资产清理产生的收入计入
  • 材料暂估分录
  • 支票拿到银行怎么用
  • 提供劳务的收入计入什么科目
  • Linux虚拟机下mysql 5.7安装配置方法图文教程
  • win7操作系统中将打开窗口拖动到屏幕顶端
  • windows server 2008 r2激活密钥
  • vmware 错误
  • cmos开机密码的清除的二种方法
  • windows7的任务管理器在哪
  • 在windowsxp的应用程序中,经常有一些菜单选项呈暗灰色
  • win8浏览器打不开网页但能上网
  • window10玩dnf怎么设置流畅
  • 关闭迅雷安卓版自动更新
  • cocos creator js教程
  • 游戏编程设计模拟软件
  • nodejs支付宝支付
  • android自定义控件入门与实战
  • font:inherit
  • cocos2dx怎么用
  • cd跳转不到目录
  • javascript判断浏览器
  • jquery示例
  • javascript substring的用法
  • 打不死的小强励志词句
  • python通过编程求权重
  • 2022年各大省份录取分数线
  • 登录上海电子税务局单位社保查询不到当月未交的
  • 机票验真查询系统
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设