精华内容
下载资源
问答
  • 特征增强方法
    千次阅读
    2018-09-26 15:16:56

    1.简单平滑

    简单平滑是图像增强处理中最基本的方法之一,主要是利用了卷积运算对领域的像素灰度进行平均,从而达到减少图像中噪声的影响,降低图像对比度。PS:图像的质量会严重下降。
    |1| 1 |1
    |1| 1 |1
    |1| 1 |1
    这种矩阵就是简单平滑模板,对领域内的像素求平均值,这样可以在一定程度上把噪声点的影响分担到领域各像素中,减少了噪声对于图像的影响。
    编码实现

    i=imread('songshu.jpg');
    %创建模板
    h1=fspecial('average',[3,3]);
    h2=fspecial('average',[5,5]);
    h3=fspecial('average',[7,7]);
    %执行图像的简单平滑
    g1=imfilter(i,h1,'conv','replicate');
    g2=imfilter(i,h2,'conv','replicate');
    g3=imfilter(i,h3,'conv','replicate');
    
    

    高斯平滑

    相比于简单平滑,高斯平滑对高对比度图像的平滑相率较低,在离散型噪声的消除方面,高斯平滑的效果并不理想。然而,如果要对图像的总体特征进行提取和增强,高斯模糊就具有很大的优势
    图像的高斯平滑与简单平滑最显著的差异在于高斯平滑在计算领域平均值时先赋予了领域中不同位置的像素不同的权值。而在权值的分配中遵循以下原则 :首先,领域中心的像素拥有最大的权值;其次,领域中离中心像素越远的像素,其权值越小。
    高斯平滑的算法实现

    i=imread('songshu.jpg');
    h=fspecial('gaussian',3,2);
    g=imfilter(i,h,'conv');
    subplot(121),imshow(i);
    subplot(122),imshow(g);
    

    此外高斯平滑有一个非常重要的应用—SIFT特征检测算法。

    更多相关内容
  • 系统地阐述了特征增强方法的国内外研究现状,介绍了信号增强、从听觉层面或可区分层面的提取特征、特征归正和特征补偿等方法,分析了他们存在的局限性.在此基础上,分析了稀疏编码与语音特征增强的基本问题和研究现状...
  • 系统地阐述了特征增强方法的国内外研究现状,介绍了信号增强、从听觉层面或可区分层面的提取特征、特征归正和特征补偿等方法,分析了他们存在的局限性.在此基础上,分析了稀疏编码与语音特征增强的基本问题和研究...
  • 网络游戏-一种双向长短时记忆递归神经网络的特征增强方法及系统.zip
  • 针对增强现实识别注册的精度易受纹理影响且缺少以文字为识别目标的问题,提出了一种基于文字特征的识别注册方法。在模板图像处理中,将降采样与2幂次采样相结合构建多尺度金字塔,实现尺度不变性;采用基于快速视网膜...
  • 针对现有人脸检测算法难以处理多尺度、多姿态的人脸检测,尤其是面对小尺寸时准确性低的问题,提出了多尺度和纹理特征增强的小尺寸人脸检测算法。该算法的多尺度增强模块能够丰富特征的多尺度信息,提高对多尺度人脸...
  • 传统纹理图像增强方法存在轮廓模糊问题,导致增强效果较差。针对这些不足,提出基于局部多特征的低分辨率图像纹理增强技术。使用仿射变换方法查看近似平面单应性变化,结合RANSAC算法,匹配低分辨率图像纹理局部多...
  • 针对数据扰乱技术中的特征值分解攻击方法,分析和评估了该攻击下数据扰乱模型的安全性,发现现有模型存在一定的脆弱性....结果表明,在盲数据源下,该增强方法对于抵抗特征值分解攻击具有有效性和鲁棒性.
  • 基于组合自适应滤波方法的行星齿轮箱故障特征增强
  • 根据图像的局部均值与标准差的关系对加权的拉普拉斯模板进一步改进,得到基于局部特征的分数阶微分图像增强方法,它使分数阶图像增强模板能够根据局部特征灵活地进行滤波。将其与其他的图像增强算法比较,实验证明...
  • 针对这个问题,提出了小波变换特征增强的约束独立分量分析的齿轮箱故障特征提取方法。通过对测量信号小波分解,有针对性地选择某子频段小波系数重构,有利于提高信噪比,增强信号的统计独立性和非高斯性,从而增强约束...
  • 自动驾驶场景中增强深度学习的时空特征提取方法.pdf
  • 连铸坯裂纹缺陷实时图像增强方法
  • 特征工程入门与实践----特征增强

    千次阅读 2019-10-04 13:55:14
            特征增强是对数据的进一步修改,我们开始清洗和增强数据。主要涉及的操作有 识别数据中的缺失值 删除有害数据 ...特征增强的第一种方法是识别数据的缺...

            特征增强是对数据的进一步修改,我们开始清洗和增强数据。主要涉及的操作有

    • 识别数据中的缺失值
    • 删除有害数据
    • 输入缺失值
    • 对数据进行归一化/标准化
    1. 识别数据中的缺失值

            特征增强的第一种方法是识别数据的缺失值,可以让我们更好的明白如何使用真是世界中的数据。通常,数据因为一些原因,导致数据缺失,不完整。我们需要做的就是识别出数据中的缺失值。并对缺失值进行处理。本文使用皮马印第安人糖尿病预测数据集。这个数据集包含768行数据点,9列特征。预测21岁以上的女性皮马印第安人5年内是否会患糖尿病。数据每列的含义如下:
    (1)怀孕次数
    (2)口服葡萄糖耐量实验中的2小时血浆葡萄糖浓度
    (3)舒张压
    (4)三头肌皮褶厚度
    (5)2小时血清胰岛素浓度
    (6)体重指数
    (7)糖尿病家族函数
    (8)年龄
    (9)类变量(0或1,代表有无糖尿病)
            首先我们先来了解一下数据

    # 导入探索性数据分析所需的包
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    %matplotlib inline
    plt.style.use('fivethirtyeight')
    
    # 添加标题
    pima_column_names = ['times_pregnant', 'plasma_glucose_concentration', 'diastolic_blood_pressure', 'triceps_thickness',
                        'serum_insulin', 'bmi', 'pedigree_function', 'age', 'onset_diabetes']
    pima = pd.read_csv('./data/pima.data', names=pima_column_names)
    pima.head()
    

    数据

    # 计算一下空准确率
    pima['onset_diabetes'].value_counts(normalize=True)
    

    结果

    # 对plasma_glucose_concentration列绘制两类的直方图
    col = 'plasma_glucose_concentration'
    plt.hist(pima[pima['onset_diabetes'] == 0][col], 10, alpha=0.5, label='non-diabetes')   # 不患糖尿病
    plt.hist(pima[pima['onset_diabetes'] == 1][col], 10, alpha=0.5, label='diabetes')  # 患糖尿病
    plt.legend(loc='upper right')
    plt.xlabel(col)
    plt.ylabel('Frequency')
    plt.title('Histogram of {}'.format(col))
    plt.show()
    

    患病与不患病的血糖浓度频率直方图

    # 线性相关矩阵量化变量间的关系
    # 数据相关矩阵的热力图
    sns.heatmap(pima.corr())
    

    数据相关热力图
            从上面的分析中,我们首先可以得到患者和常人的血糖浓度是有很大的差异的。并且血糖浓度与患者是否患病的相关性很大。下面我们来分析一下数据是否存在缺失值。

    # 查看数据中是否存在缺失值
    pima.isnull().sum()
    

    结果
            从上面的结果我们可以看到并没有缺失值,我们在看一下关于数据的基本描述性统计。

    # 查看数据的基本描述性统计
    pima.describe()
    

    结果
            我们可以看到BMI指标的最小值是0.这是有悖于医学常识的。这有可能是缺失或不存在的点都用0填充了。从数据中可以看到,有好几列都是0.但是onset——diabetes中的0代表没有糖尿病,人也可以怀孕0次。所以这两列没有问题,其他的列的缺失值用0填充了。

    • plasma_glucose_concentration
    • diastolic_blood_pressure
    • triceps_thickness
    • serum_insulin
    • bmi
    2. 处理数据中的缺失值

            首先,对存在缺失值的列,使用None代替0。然后在查看是否存在缺失值。

    # 直接对所有列操作
    columns = ['serum_insulin', 'bmi', 'plasma_glucose_concentration', 'diastolic_blood_pressure', 'triceps_thickness']
    for col in columns:
        pima[col].replace([0], [None], inplace=True)
    
    # 查看缺失值情况
    pima.isnull().sum()
    

    结果

    (1)删除有害的行

            我们首先删除有害的行,然后对删除前后的数据做一个分析,最后应用机器学习算法评估一下当前数据的性能。
    删除存在缺失值的数据

    # 删除存在缺失的行
    pima_dropped = pima.dropna()
    # 检查删除了多少行
    num_rows_lost = round(100*(pima.shape[0] - pima_dropped.shape[0]) / float(pima.shape[0]))
    print("retained {}% of rows".format(num_rows_lost))
    

    retained 49% of rows
    数据分析

    # 继续对数据做一下探索性分析
    # 未删除数据的空准确率
    pima['onset_diabetes'].value_counts(normalize=True)
    

    0 0.651042
    1 0.348958
    Name: onset_diabetes, dtype: float64

    # 删除数据后的空准确率
    pima_dropped['onset_diabetes'].value_counts(normalize=True)
    

    0 0.668367
    1 0.331633
    Name: onset_diabetes, dtype: float64

            从空准确率来看,前后的True和False并无太大的变化。接下来比较一下删除前后的个属性均值。

    # 未删除数据的均值
    pima.mean()
    

    结果

    # 删除数据后的均值
    pima_dropped.mean()
    

    结果

    # 使用条形图进行可视化
    # 均值变化百分比条形图
    ax = ((pima_dropped.mean() - pima.mean()) / pima.mean()).plot(kind='bar', title='% change in average column values')
    ax.set_ylabel('% change')
    

    均值变化条形图
            我们可以看到,怀孕次数的均值在删除缺失值后下降了14%,糖尿病血系功能也上升了11%。都变化的比较大。删除行会严重影响数据的形状,所以我们应该保留尽可能多的数据。在我们进行其他操作前,我们使用一个机器学习算法验证一下当前数据情况的模型性能。
    评估性能

    # 导入机器学习
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.model_selection import GridSearchCV
    
    # 删除标签数据
    X_dropped = pima_dropped.drop('onset_diabetes', axis=1)  # 特征
    print("leanrning from {} rows".format(X_dropped.shape[0]))
    y_dropped = pima_dropped['onset_diabetes']   # 标签
    
    # KNN的模型参数
    knn_params = {'n_neighbors': [1, 2, 3, 4, 5, 6, 7]}
    
    # KNN模型
    knn = KNeighborsClassifier()
    
    # 使用网格搜索优化
    grid = GridSearchCV(knn, knn_params)
    grid.fit(X_dropped, y_dropped)
    
    # 输出结果
    print(grid.best_score_, grid.best_params_)
    

    结果:0.7448979591836735 {‘n_neighbors’: 7}

    (2)填充缺失值

            首先,我们检查一下缺失值的情况。然后使用sklearn模块的方法填充缺失值,最后在检查缺失值情况,用机器学期方法验证一下模型的性能。
    检查缺失值:

    # 在此查看缺失值情况
    pima.isnull().sum()
    

    结果
    填充缺失值:

    # 使用scikit-learn预处理类的Imputer模块
    from sklearn.preprocessing import Imputer
    
    # 实例化对象
    imputer = Imputer(strategy='mean')
    # 创建新对象
    pima_imputed = imputer.fit_transform(pima)
    # 将得到的ndarray类型转化为DataFrame
    pima_imputed = pd.DataFrame(pima_imputed, columns=pima_column_names)
    pima_imputed.head()
    

    填充后的数据
    检查缺失值情况并评估性能:

    # 判断是否有缺失值
    pima_imputed.isnull().sum()
    

    结果

    # 尝试一下填充一些别的值,查看对KNN模型的影响
    # 用0填充
    pima_zero = pima.fillna(0)  
    X_zero = pima_zero.drop('onset_diabetes', axis=1)
    y_zero = pima_zero['onset_diabetes']
    
    # knn模型参数
    knn_params = {'n_neighbors': [1, 2, 3, 4, 5, 6, 7]}
    # 网格搜索
    grid = GridSearchCV(knn, knn_params)
    grid.fit(X_zero, y_zero)
    
    # 输出
    print(grid.best_score_, grid.best_params_)
    

    结果:0.7330729166666666 {‘n_neighbors’: 6}

    3. 标准化和归一化

            我们现在要做的是进一步增强机器学习流水线,进行一下探索性数据分析。

    impute = Imputer(strategy='mean')
    # 填充所有的缺失值
    pima_imputed_mean = pd.DataFrame(impute.fit_transform(pima), columns=pima_column_names)
    # 画直方图
    pima_imputed_mean.hist(figsize=(15, 15))
    

    部分结果
            从这分析中可以发现,某些特征数据的尺度不同。有一些机器学习模型受数据尺度的影响很大。因此,我们可以使用某种归一化/标准化操作。
    **归一化:**将行和列对齐并转化为一致的规则。将所有定量列转化为同一个静态范围中的值。
    **标准化:**通过确保所有行和列在机器学习中得到平等对待,让数据的处理保持一致。

    (1)z分数标准化

            z分数标准化利用了统计学最简单的z分数思想。将特征重新缩放,均值为0、标准差为1。通过缩放特征、统一化均值和方差,可以让机器学习模型达到最优化。公式为
    z = x − μ σ z=\frac{x-\mu }{\sigma } z=σxμ
    其中 μ \mu μ为均值, σ \sigma σ为标准差。

    # 取此列均值
    mu = pima['plasma_glucose_concentration'].mean()
    # 取此列标准差
    sigma = pima['plasma_glucose_concentration'].std()
    # 对每个值计算z分数
    print(((pima['plasma_glucose_concentration'] - mu) / sigma).head())
    

    标准化后的数据

    # 使用内置的z分数归一化
    from sklearn.preprocessing import StandardScaler
    
    # 用z分数标准化
    scaler = StandardScaler()
    
    glucose_z_score_standardized = scaler.fit_transform(pima[['plasma_glucose_concentration']])
    # 直方图
    ax = pd.Series(glucose_z_score_standardized.reshape(-1,)).hist()
    ax.set_title('Distribution of plasma_glucose_concentration after Z Score Scaling')
    

    标准化后的数据直方图

    # 将z分数标准化插入到机器学习流水线上
    knn_params = {'imputer__strategy': ['mean', 'median'], 'classify__n_neighbors': [1, 2, 3, 4, 5, 6, 7]}
    
    mean_impute_standardize = Pipeline([('imputer', Imputer()), ('standardize', StandardScaler()), ('classify', knn)])
    
    X = pima.drop('onset_diabetes', axis=1)
    y = pima['onset_diabetes']
    
    grid = GridSearchCV(mean_impute_standardize, knn_params)
    grid.fit(X, y)
    
    print(grid.best_score_, grid.best_params_)
    

    结果:0.7421875 {‘classify__n_neighbors’: 7, ‘imputer__strategy’: ‘median’}

    (2)min-max标准化

    m = x − x m i n x m a x − x m i n m=\frac{x-x_{min} }{x_{max}-x_{min}} m=xmaxxminxxmin
            其中, x m i n x_{min} xmin为该列最小值, x m a x x_{max} xmax为该列最大值。
    标准化

    # 导入sklearn模块
    from sklearn.preprocessing import MinMaxScaler
    
    # 实例化
    min_max = MinMaxScaler()
    
    # min-max标准化
    pima_min_maxed = pd.DataFrame(min_max.fit_transform(pima_imputed), columns=pima_column_names)
    
    # 得到描述性统计
    pima_min_maxed.describe()
    

    标准化后的数据
    评估性能

    knn_params = {'imputer__strategy': ['mean', 'median'], 'classify__n_neighbors': [1, 2, 3, 4, 5, 6, 6]}
    
    mean_impute_standardize = Pipeline([('imputer', Imputer()), ('standardize', MinMaxScaler()), ('classify', knn)])
    
    X = pima.drop('onset_diabetes', axis=1)
    y = pima['onset_diabetes']
    
    grid = GridSearchCV(mean_impute_standardize, knn_params)
    grid.fit(X, y)
    
    print(grid.best_score_, grid.best_params_)
    

    结果:0.74609375 {‘classify__n_neighbors’: 4, ‘imputer__strategy’: ‘mean’}

    (3)行归一化

            行归一化是针对行进行操作的,保证每行有单位范数,也就是每行的向量长度相同。
    ∥ x ∥ = ( x 1 2 + x 2 2 + . . . + x n 2 ) \left \| x \right \|=\sqrt{(x_{1}^{2}+x_{2}^{2}+...+x_{n}^{2})} x=(x12+x22+...+xn2)
    归一化

    # 引入行归一化
    from sklearn.preprocessing import Normalizer
    
    # 实例化
    normalize = Normalizer()
    
    pima_normalized = pd.DataFrame(normalize.fit_transform(pima_imputed), columns=pima_column_names)
    
    # 行归一化后矩阵的平均范数
    np.sqrt((pima_normalized**2).sum(axis=1)).mean()
    

    结果:1.0
    评估性能

    knn_params = {'imputer__strategy': ['mean', 'median'], 'classify__n_neighbors': [1, 2, 3, 4, 5, 6, 6]}
    
    mean_impute_standardize = Pipeline([('imputer', Imputer()), ('normalize', Normalizer()), ('classify', knn)])
    
    X = pima.drop('onset_diabetes', axis=1)
    y = pima['onset_diabetes']
    
    grid = GridSearchCV(mean_impute_standardize, knn_params)
    grid.fit(X, y)
    
    print(grid.best_score_, grid.best_params_)
    

    结果:0.6822916666666666 {‘classify__n_neighbors’: 6, ‘imputer__strategy’: ‘mean’}
            从本章的学习中,我们处理了数据中的缺失值,并使用标准化/归一化的方法继续处理数据。然后我们评估了性能。得到的结果是使用均值填充数据,然后用min-max标准化处理出具。得到0.7461的准确率。注意,虽然这个数据比删除存在缺失值的数据准确率没有高很多。但是这是使用全部数据训练的结果。更具有一般化。泛化性能将更好。

    注:本文的内容与图片来源于《特征工程入门与实践》。如有您也想学习相关知识,建议买一本来看。
    个人博客.
    联系方式:2391855138(加好友请备注)

    展开全文
  • 针对工业产品样本缺乏且特征不明显而难以用于深度学习训练的问题,提出一种邻域差分滤波生成式对抗网络数据增强(NDF-GAN)方法。将邻域差分滤波器融合到生成对抗网络中,从样本中提取特征并进行样本重建,对样本...
  • 该文利用快速自适应2维经验模式分解方法(Fast and Adaptive Bidimensional Empirical Mode Decomposition, FABEMD)实现图像中开尔文尾迹,湍流尾迹和其他中/大尺度海洋特征的分解,提高开尔文尾迹相对其他特征的图像和...
  • 针对传统子空间语音增强方法中,由于不能去除整个噪声子空间而导致语音特征值估计的偏差,致使增强语音中仍有残留噪声的问题,提出一种新的用小波包改进的方法,该方法利用小波包对噪声的抑制功能,首先对带噪语音进行KL...
  • 对所选物体目标去噪并且特征提取,运用小波变换以及图像增强方法
  • 提出一种基于奇异值分解的子空间分解语音增强方法,该方法是利用最小值统计噪声估计法代替传统的VAD方法对噪声进行估计,并利用所得噪声和带噪语音构造的协方差矩阵得到纯净语音的协方差矩阵,并将特征值分解的时域...
  • 网络游戏-提供连接性增强特征的移动自组织网络及相关方法.zip
  • 常见的图像增强方法

    千次阅读 多人点赞 2021-07-25 14:17:54
    上一篇文章已经介绍了opencv和PIL怎么去读图和他们两者的区别,那它们两个还有啥别的...只是它看到的东西和我们人类有点差异,是图片的高维特征,扯多了,扯多了,进入今天的图像augmentation吧! 同样的,今天还是

    上一篇文章已经介绍了opencv和PIL怎么去读图和他们两者的区别,那它们两个还有啥别的能力吗,不能就只会读个图吧,当然不会,他们还可以对图像做一些处理。这些处理可以我统称为augmentation,高大上的一个单词吧,讲这么多其实只是为了深度学习做准备,augmentation可以增加样本的数量和复杂程度,提高模型的鲁棒性,我是这么理解的,所谓见多识广,计算机视觉也是这样的,只是它看到的东西和我们人类有点差异,是图片的高维特征,扯多了,扯多了,进入今天的图像augmentation吧!

    同样的,今天还是提供一张大家可以操作的图片,依然是主角咩咩狗

    这高贵的气质不是一般的狗有的

     augmentation 1:改变图片长宽

    def augment_resize(img,size=(224,224),img_type='cv2'):
        """
        using for image resize ,default size = 224*224
        :param img:
        :param size: tuple (w,h)
        :param img_type:
        :return:
        """
        if img_type=='cv2':
            return cv2.resize(img, size)
        else:
            im_resize = img.resize(size)
            return im_resize

    提供一个函数,这个函数适用于PIL和opencv读进来的图像,传入的第一个参数就是读取后的图像,第二个参数就是图片的宽和高(第一个元素是宽,第二个元素是高),你可能会问了为什么是224,为什么不是其他的数,我愿意,就是我愿意,第三个参数默认是opencv传入的图片,因为我比较习惯用opencv

    来我们在主函数里调用一下这个函数,看看是个什么效果(当然你一预先import进来需要的库)

    from PIL import Image,ImageDraw,ImageFilter
    import numpy as np
    from PIL import ImageEnhance
    import cv2
    import random
    if __name__ == '__main__':
    
        path = r'./miemie3.jpg'
        ori_image = cv2.imread(path)
        cv2.imshow('ori_image',ori_image)
        resize_image = augment_resize(ori_image)
        cv2.imshow('resize_image', resize_image)
        cv2.waitKey()

    上效果 

    有没有发现,变小了,希望它也可以一直这么小,小的时候没有烦恼,无忧无虑,多好啊

    还有没有发现,使用的系统,是win11,不得不说win11的UI界面看上去顺眼一些了。

    augmentation 2:图片的旋转

    def augment_rotate(img,angle=90,img_type='cv2'):
        """
        using for image rotate,default degree=90
        :param img:
        :param angle: rotate degree
        :param img_type:
        :return:
        """
        if img_type=='cv2':
            height, width = img.shape[:2]
            if height > width:
                center = (height / 2, height / 2)
            else:
                center = (width / 2, width / 2)
            mata = cv2.getRotationMatrix2D(center, angle, scale=1)
            img = cv2.warpAffine(img, mata, (height, width), borderValue=(0,0,0))
            return img
        else:
            img_rotate = img.rotate(angle)
            return img_rotate

    传入的仍然是3个参数,第一个和第三个上面已经说了,第二个参数是旋转角度,可以看到opencv的旋转图片的代码比PIL多很多,多就意味着给你选择就越多,它可以根据任意点旋转,PIL是基于中心点旋转的

    主函数就不贴出来了,你自己调用一下就行了,不会调用,就回家闭关学学python吧,直接上效果图

    细心的朋友可能已经看到了,这是逆时针旋转哦,hey 这是kong,在听反方向的钟,推荐大家一首说唱歌曲《hey kong》,还有更细心的朋友可能发现了,旋转之后的图片有黑边,这是为什么,你想想吧,顺便想想怎么解决,家庭作业。

    augmentation 3:图片的镜像翻转

    def augment_left_flip(img,img_type='cv2'):
        """
        using for mirror horizontal flip
        :param img:
        :param img_type:
        :return:
        """
        if img_type=='cv2':
            # 1表示水平翻转
            out = cv2.flip(img, 1)
            return out
        else:
            out = img.transpose(Image.FLIP_LEFT_RIGHT)
            return out

    只有两个参数,说过了,不多说,每次说不多说了,但还要写这么多字,不大对啊。上图

    左右镜像都有,没有上下翻转说不过去啊上代码,上图

    def augment_top_flip(img,img_type='cv2'):
        """
        using for mirror vertical flip
        :param img:
        :param img_type:
        :return:
        """
        if img_type=='cv2':
            out = cv2.flip(img, 0)
            return out
        else:
            out = img.transpose(Image.FLIP_TOP_BOTTOM)
            return out

    该说不说,有点晕啊

    augmentation 4:图片的随机剪裁

    def augment_randomcut(img,img_type='cv2',w_ratio=2,h_ratio=2):
        """
        using for random cut image
        :param img:
        :param img_type:
        :param w_ratio:change this value can change the max value of wight
        :param h_ratio:change this value can change the max value of height
        :return:
        """
        if img_type=='cv2':
            height = img.shape[0] // h_ratio
            width = img.shape[1] // w_ratio
            print(height, width)
            x = random.randint(0, img.shape[1] - width)
            y = random.randint(0, img.shape[0] - height)
            print(height, width, x, y)
            cropped = img[y:y + height, x:x + width]
            return cropped
        else:
            width, height = img.size
            x = random.randint(0,2*width//w_ratio)
            y = random.randint(0,height//h_ratio)
            box = (x,y,x+width//w_ratio,y+height//h_ratio)
            image = img.crop(box)
            return image

    刚刚不想多说,这个不得不多说,这个函数提供了四个函数,第三个参数和第四个参数是用来控制随机剪裁图像的大小的,上效果图

    咱在来个固定大小的剪裁吧

    def augment_constantcut(img,left_top,right_bottom,img_type='cv2'):
        """
        using for constant cut image
        :param img:
        :param left_top: tuple (xmin,ymin)
        :param right_bottom:  tuple (xmax,ymax)     assert xmax>xmin ymax>ymin
        :param img_type:
        :return:
        """
        if img_type=='cv2':
            cropped = img[left_top[1]:right_bottom[1], left_top[0]:right_bottom[0]]
            return cropped
        else:
            box = (left_top[0],left_top[1],right_bottom[0],right_bottom[1])
            image = img.crop(box)
            return image

     一共四个参数,第二个参数个第三个参数是左上角坐标和右下角坐标,上效果图

    augmentation 5:改变图片亮度

    def augment_light(img,img_type='cv2',factor=1.5):
        """
        using for change image light
        :param img:
        :param img_type:
        :param factor:  The degree of change in brightness
        :return:
        """
        if img_type == 'cv2':
            new_img = cv2.addWeighted(img,factor,img,0,0)
            return new_img
        else:
            enh_bri = ImageEnhance.Brightness(img)
            new_img = enh_bri.enhance(factor=factor)
            return new_img

    第三个参数是改变亮度的程度,上效果图

    不得不说,这咩咩狗是真靓啊

    augmentation 6:给图片添加噪声

    def augment_add_noise(img,img_type='cv2',num_noise=500):
        """
        using for random add noise on image
        :param img:
        :param img_type:
        :param num_noise:  number of nosise
        :return:
        """
        if img_type=='cv2':
            for num in range(num_noise):
                x = random.randint(0, img.shape[0] - 1)
                y = random.randint(0, img.shape[1] - 1)
                if num % 2 == 0:
                    img[x, y] = 0
                else:
                    img[x, y] = 255
            return img
        else:
            img1 = img.copy()
            rows, cols = img.size
            for noise in range(num_noise):
                x = np.random.randint(0, rows)
                y = np.random.randint(0, cols)
                if noise % 2:
                    img1.putpixel((x, y), (255, 255, 255))
                else:
                    img1.putpixel((x, y), (0, 0, 0))
            return img1

    第三个参数是添加噪声的点数,上图

    这噪声,是对咩咩狗的大不敬啊

    augmentation 7:图片的模糊

    def augment_blur(img, img_type='cv2', blur_type='gaussion', kernel=3):
        """
        using for blur image
        :param img:
        :param img_type:
        :param blur_type: you can select gaussion or median
        :param kernel: kernel size
        :return:
        """
        if img_type == 'cv2':
            if blur_type == "gaussion":
                return cv2.GaussianBlur(img, (kernel, kernel), sigmaX=1)
            else:
                return cv2.medianBlur(img, kernel)
    
        else:
            if blur_type=='gaussion':
                return img.filter(ImageFilter.GaussianBlur(radius=kernel))
            else:
                return img.filter(ImageFilter.MedianFilter(kernel))

    第四个参数是模糊的卷积核的大小,第三个参数是模糊的方式,默认高斯模糊,高斯,嗯,牛掰plus,看看你对狗的模糊怎么样,上图

    真的糊了,三番,一人8块,不好意思

    augmentation 8:图片的遮挡

    def augment_mask(img,mask_num,img_type='cv2'):
        """
        using for random set mask
        :param img:
        :param mask_num: number of mask
        :param img_type:
        :return:
        """
        if img_type == 'cv2':
            img_copy = img.copy()
            mask_height = img.shape[0] // 10
            mask_width = img.shape[1] // 10
            for index in range(mask_num):
                x = random.randint(0, img.shape[1] - mask_width)
                y = random.randint(0, img.shape[0] - mask_height)
                img_copy[y:y + mask_height, x:x + mask_width] = 0
            return img_copy
        else:
            rows, cols = img.size
            img1 = img.copy()
            draw = ImageDraw.Draw(img1)
            for index in mask_num:
                x = random.randint(0, 9*rows//10)
                y = random.randint(0, 9*cols//10)
                draw.rectangle((x, y, x + rows//10, y + cols//10), fill=(0, 0, 0))
            return img1

    这个遮挡是啥意思呢,上图就知道了,第二个参数是遮挡块的个数 ,上图

    你还能认得出来这是咩咩狗吗?认不出来的话拉出去眯眯笑。

     到这里差不多就结束了,还有一些数据增强的方法,或者说图片简单处理的方式,我哪有有时间了再补充给大家。

    这里还有感谢两个小兄弟完成的代码,不错,希望早日独当一面,让我轻松轻松。

    分享一个小故事:

    小罗问我,他们都说男的一个月有三分之二的时间都在讨厌自己的女朋友,真的假的啊

    我说,肯定是假的,我一个月都在讨厌

    现在脸有点痛,不多说兄弟们,求生欲这东西还是要发掘发掘啊。

    至此,敬礼,salute!!!!!

    展开全文
  • 数据增强方法

    千次阅读 2020-03-04 18:22:05
    文章目录数据增强方法一、单样本数据增强方法1.1 几何变换类1.2 颜色变换类二、多样本融合数据增强2.1 SMOTE2.2 SamplePairing2.3 mixup2.4 cutout2.5 cutmix2.6 Fmix2.7 roimix三、无监督数据增强方法3.1 GAN3.2 ...

    数据增强方法

    一、单样本数据增强方法

    1.1 几何变换类

    包括翻转,旋转,裁剪,变形,缩放等方式

    1.2 颜色变换类

    包括噪声、模糊、颜色变换、擦除、填充等方式

    二、多样本融合数据增强

    2.1 SMOTE

    SMOTE即Synthetic Minority Over-sampling Technique方法,它是通过人工合成新样本来处理样本不平衡问题,从而提升分类器性能。

    类不平衡现象是很常见的,它指的是数据集中各类别数量不近似相等。如果样本类别之间相差很大,会影响分类器的分类效果。假设小样本数据数量极少,如仅占总体的1%,则即使小样本被错误地全部识别为大样本,在经验风险最小化策略下的分类器识别准确率仍能达到99%,但由于没有学习到小样本的特征,实际分类效果就会很差。SMOTE方法是基于插值的方法,它可以为小样本类合成新的样本。

    主要流程为:
    第一步,定义好特征空间,将每个样本对应到特征空间中的某一点,根据样本不平衡比例确定好一个采样倍率N;

    第二步,对每一个小样本类样本(x,y),按欧氏距离找出K个最近邻样本,从中随机选取一个样本点,假设选择的近邻点为(xn,yn)。在特征空间中样本点与最近邻样本点的连线段上随机选取一点作为新样本点,满足以下公式:
    在这里插入图片描述
    第三步,重复以上的步骤,直到大、小样本数量平衡。

    2.2 SamplePairing

    SamplePairing方法的原理非常简单,从训练集中随机抽取两张图片分别经过基础数据增强操作(如随机翻转等)处理后经像素以取平均值的形式叠加合成一个新的样本,标签为原样本标签中的一种。这两张图片甚至不限制为同一类别,这种方法对于医学图像比较有效。

    在这里插入图片描述

    2.3 mixup

    λ∼Beta(α,α),α∈(0,∞)。
    在这里插入图片描述(xi,yi)和(xj,yj)是从训练数据中随机抽取的两个样本,且λ∈[0,1]。因此,mixup通过结合先验知识,即特征向量的线性插值应导致相关标签的线性插值,来扩展训练分布。
    作用为:将两个类别之间用线性过度,提高介于两个类别之间的泛化力,如图所示。
    在这里插入图片描述

    2.4 cutout

    随机的将样本中的部分区域cut掉,并且填充0像素值,分类的结果不变;

    2.5 cutmix

    就是将一部分区域cut掉但不填充0像素而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配。
    在这里插入图片描述

    2.6 Fmix

    根据图像的高频和低频区域对图像进行二值化,然后利用该掩模对像素进行加权。
    在这里插入图片描述

    2.7 roimix

    用于水下检测,模拟重叠,遮挡,和模糊的目标。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    三、无监督数据增强方法

    无监督的数据增强方法包括两类:

    (1) 通过模型学习数据的分布,随机生成与训练数据集分布一致的图片,代表方法GAN[4]。

    (2) 通过模型,学习出适合当前任务的数据增强方法,代表方法AutoAugment[5]。

    3.1 GAN

    (1) G是一个生成图片的网络,它接收随机的噪声z,通过噪声生成图片,记做G(z) 。

    (2) D是一个判别网络,判别一张图片是不是“真实的”,即是真实的图片,还是由G生成的图片。

    在这里插入图片描述

    3.2 Autoaugmentation

    AutoAugment是Google提出的自动选择最优数据增强方案的研究,这是无监督数据增强的重要研究方向。它的基本思路是使用增强学习从数据本身寻找最佳图像变换策略,对于不同的任务学习不同的增强方法,流程如下:
    (1) 准备16个常用的数据增强操作。
    (2) 从16个中选择5个操作,随机产生使用该操作的概率和相应的幅度,将其称为一个sub-policy,一共产生5个sub-polices。
    (3) 对训练过程中每一个batch的图片,随机采用5个sub-polices操作中的一种。
    (4) 通过模型在验证集上的泛化能力来反馈,使用的优化方法是增强学习方法。
    (5) 经过80~100个epoch后网络开始学习到有效的sub-policies。
    (6) 之后串接这5个sub-policies,然后再进行最后的训练。总的来说,就是学习已有数据增强的组合策略,对于门牌数字识别等任务,研究表明剪切和平移等几何变换能够获得最佳效果。

    参考连接:https://zhuanlan.zhihu.com/p/61759947

    展开全文
  • YOLOv4(1)-数据增强和特征增强

    千次阅读 2020-05-22 19:34:30
    前者是指不会显著影响模型测试速度和模型复杂度的技巧,主要就是数据增强操作,对应的Bag of specials就是会稍微增加模型复杂度和速度的技巧,但是如果不大幅增加复杂度且精度有明显提升,那也是不错的技巧。...
  • 为了解决主流目标跟踪算法在目标遮挡、快速位移和光照变化等不利条件下易发生跟踪不稳定的问题,提出一种视觉显著性和特征点匹配增强的目标跟踪框架,当瞬时跟踪结果经判别达到SURF特征点匹配阈值时,触发跟踪增强机制,...
  • 包括提供增强操作协议选择特征的协议接口设备的通信系统及相关方法.zip
  • 数据增强方法总结

    千次阅读 2021-08-19 22:30:02
    数据增强方法总结 本文转载自:https://mp.weixin.qq.com/s/HFBtRAtX3sU10fD0i04lkw 文章目录数据增强方法总结前沿1.数据增强的作用2. 数据增强的分类3. 数据增强的常用方法3.1 Cutout(2017)3.2 Random Erasing(2017...
  • 为了提高防抖效率,我们为增强现实中的移动防抖提出了一种有效的特征提取方案。 该方案直接检测拐角以避免非极端约束,从而提高了特征提取的效率。 同时,该方案仅在移动抖动期间更新添加的角,从而提高了特征提取...
  • 为解决遥感图像边缘增强过程中辨识弱边缘和噪声的问题, 提出一种改进的模糊各向异性边缘增强方法。根据非下采样轮廓波变换系数分布特征, 获得像素几何结构信息; 并基于各像素在不同子带的系数分布特征和噪声方差, ...
  • 数据增强方法小汇总

    千次阅读 2021-04-22 11:41:57
    当数据集具有某种明显的特征,例如数据集中图片基本在同一个场景中拍 摄,使用 Cutout 方法和风格迁移变化等相关方法可避免模型学到跟目标无关的信息。 提升模型鲁棒性,降低模型对图像的敏感度。当训练数据都属于...
  • 提出了一种特征选择性滤波方法(CSF),该方法创造性地将各向异性滤波应用到图像空域,通过分析红外图像中不同特征区域的特性,改进了系数分布函数,使CSF在消除背景、平滑边缘的同时,增强目标信号。最后给出了该方法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 149,237
精华内容 59,694
关键字:

特征增强方法