MaskRcnn(⼆)实例分割的图像与标签同时进⾏增强
实例分割数据增强
⼀、增强原因
1、防⽌过拟合
python解析json文件1.1、过拟合的定义
为了得到⼀致假设⽽使假设变得过度严格。
也就是说模型在训练集上的表现很好,但在测试集和新数据上的表现很差。
⽋拟合,过拟合,适度拟合的区别。
训练集表现测试集表现结论
差差⽋拟合
好差过拟合
好好适度拟合
1.2、过拟合出现的原因
c 教程菜鸟教程①、模型复杂度过⾼,参数过多。
②、训练数据少。
③、训练集和测试集分布不⼀致。
④、样本⾥⾯的噪声数据⼲扰过⼤,导致模型过分记住了噪声特征,反⽽忽略了真实的输⼊输出特征。
快捷键英文⑤、训练集和测试集特征分布不⼀样。
1.3、解决⽅法
①、降低模型复杂度
②、扩⼤数据集或者进⾏数据增强
③、正则化
④、早停
⑤、清洗异常数据
2、增强结果模型的鲁棒性和泛化能⼒。
以下为我的理解,鲁棒性我理解为训练数据集中可能会出现⼀些错误,对这些错误的容忍能⼒越好,鲁棒性就越强,反之亦反,⽽泛化能⼒就是⾯对位置数据的⼀种预测能⼒,⽐如说我在A数据集上训练的,但在B数据集上仍然有⽐较好的表现,说明该模型或算法泛化能⼒⽐较好。
2.1、鲁棒性
模型对异常数据的容忍能⼒。
2.2、泛化性
模型对未知数据的预测能⼒。
3、提⾼识别精度
精度可以理解为模型好坏,把A预测为A,把B预测为B,预测的越准,精度越⾼。
⼆、常⽤数据增强⽅法
1、平移
对图像进⾏各个⽅向上的移动。
2、缩放
对图像进⾏缩⼩放⼤处理。
3、旋转
对图像进⾏⼀定⾓度的旋转。
4、随机裁切
对图像进⾏随机的裁剪。
5、颜⾊抖动
对图像的曝光度(exposure)、饱和度(saturation)和⾊调(hue)进⾏随机变化形成不同光照及颜
⾊下的图⽚,达到数据增强的⽬的,尽可能使得模型能够使⽤不同光照条件⼩的情形,提⾼模型泛化能⼒。
6、随机遮挡
对图像进⾏⼩区域的遮挡。
7、噪声扰动:
对图像的每个像素RGB进⾏随机扰动, 常⽤的噪声模式是椒盐噪声和⾼斯噪声。
三、实例分割数据增强实现
因为实例分割数据集实在太难标记了,数据增强必不可少,使⽤⼿动标记的数据加上随机⽔平翻转进⾏训练后效果⼀般,决定把数据再⼀次进⾏增强,因为采⽤的是labelme标记的数据,必须对原图加上标签同时进⾏转变,决定尝试尝试。
1、旋转
对图像进⾏⼀定⾓度的旋转。
因为之前对原始数据加上⽔平翻转后的数据进⾏训练后,发现效果不是特别理想,看了看效果图后,发现原始数据⼤多数都是很规整的,⽽测试的数据如果有的物体不正,就会导致识别不出来,如下图。
如果⽐较规整,还蛮好识别的。
于是决定⾸先对图像进⾏旋转处理。
1.1先观察⼀下json⽂件
{
"version":"4.5.9",//labelme的版本号
"flags":{},//flag标记
"shapes":[//边由点构成的多边形
{
"line_color":null,//线的颜⾊
"fill_color":null,//填充颜⾊
"label":"2",//标签
"points":[//⼀个个点,这⾥只列出⼀个点。
[
1365.8296754954001,
1075.6984533100115
]
],
"group_id":1,//实体的id号,同⼀类的第⼏个
"shape_type":"polygon",//图形类型
"flags":{}//flag标记
}
],
"imagePath":"1.jpg"//图⽚的位置
vb二维数组定义后⾯就是⼀长串⼀长串的东西,可以不⽤管它。根据这个json⽂件的特征进⾏修改标签。
parameterserror1.2、导⼊必要的库
import cv2 #计算机视觉库
import json #⽤来解析json⽂件
import numpy as np #科学计算包
import sys #处理Python运⾏时配置以及资源
import os #负责程序与操作系统的交互,提供了访问操作系统底层的接⼝。
import random #实现了各种分布的伪随机数⽣成
import time #处理时间的标准库
import base64 #编解码库
from math import cos ,sin ,pi,fabs,radians #内置数学类函数库
1.3、导⼊图⽚
图⽚数量很多,不可能⼀张张图⽚进⾏,直接对⼀个⽂件⾥所有图⽚进⾏相同处理。
import cv2 as cv
import osaspnet用什么开发工具
images_path ='C:/Users/Administrator/Desktop/PersonCode/data/'#图⽚的根⽬录
save_path ="C:/Users/Administrator/Desktop/PersonCode/sava_data/"#保存图⽚⽂件夹
file_list = os.listdir(images_path)
for img_name in file_list:
print(img_name)
1.4、读取json⽂件
同样得对json进⾏批量读取,不过要注意每⼀张图⽚和json对应起来,这样处理的时候才能正确,下⾯给出读取json⽂件的代码,完整代码会放在最后⾯。
#读取json⽂件
def ReadJson(jsonfile):
with open(jsonfile,encoding='utf-8')as f:
jsonData = json.load(f)
return jsonData
1.5、对图⽚进⾏旋转
图像旋转函数如下
def RotateImage(img, degree):
height, width = img.shape[:2]#获得图⽚的⾼和宽
heightNew =int(width * fabs(sin(radians(degree)))+ height * fabs(cos(radians(degree))))
widthNew =int(height * fabs(sin(radians(degree)))+ width * fabs(cos(radians(degree))))
matRotation = RotationMatrix2D((width //2, height //2), degree,1)
matRotation[0,2]+=(widthNew - width)//2
matRotation[1,2]+=(heightNew - height)//2
print(width //2,height //2)
imgRotation = cv2.warpAffine(img, matRotation,(widthNew, heightNew), borderValue=(255,255,255))
return imgRotation,matRotation
背景可以改cv2的参数进⾏替换,image_rotate = cv2.warpAffine(image, M, (nW, nH),borderValue=(255,255,255))中的borderValue删了,改成⽤边缘颜⾊填充即可,加上参数borderMode=1,也就是改成imgRotation = cv2.warpAffine(img, matRotation, (widthNew, heightNew),borderMode=1)。
虽然看着有些别扭,但是能训练就⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论