Hu不变矩+BP神经网络,实现对图像的分类(pytorch实现)

1.网络模型

方案,如图所示。
在这里插入图片描述

先对图片,用hu矩进行特征提取,每个图片产生7个特征值。这7个特征值作为数据,再加上一个标签值。然后送入BP神经网络中,进行模型的训练。模型训练好后,就可以使用模型,对一个新的图片,进行分类识别了。

2.数据集制作

图片数据集是NEU surface defect database,东北大学热轧带钢表面缺陷数据集,该数据集是东北大学的宋克臣等老师收集的。

数据集收集了夹杂( inclusion )、划痕( scratches )、压入氧化皮( rolled-inscale )、裂纹( cracks )、麻点( pitted )和斑块( patches )6种缺陷,每种缺陷300张,图像尺寸为200×200。
在这里插入图片描述

我们选取了裂纹( cracks )、夹杂( inclusion )和麻点( pitted )三类缺陷各100副图像,制作数据集。使用Hu不变矩进行特征提取后,就有了300个样本的特征。240个作为训练集,60个作为验证集。

其中,裂纹类图片的标签,记为0,夹杂类图片的标签,记为1,麻点类图片的标签,记为2。(后面会进行one-hot操作,因此记为数字几并不重要,注意对应关系即可

然后使用Hu矩对这300幅图片,继续特征提取,得到hu值。就制作成了数据集。(但该数据集并不好,因为只含有缺陷图像,不含无缺陷的图像。也就是数据集中只有正例,没有反例。当训练好模型后,在测试模型时,用一个无缺陷图片,则模型会把它分类成三类缺陷中概率最大的那一类。

#Hu不变矩代码 python+opencv
def Hu_moments(img):
    '''
    opencv_python自带求矩以及不变矩的函数
    :param img: 灰度图像,对于二值图像来说就只有两个灰度0和255
    :return: 返回以10为底对数化后的hu不变矩
    '''
    moments = cv2.moments(img)  # 返回的是一个字典,三阶及以下的几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)
    humoments = cv2.HuMoments(moments)  # 根据几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)计算出hu不变矩
    # 因为直接计算出来的矩可能很小或者很大,因此取对数好比较,这里的对数底数为e,通过对数除法的性质将其转换为以10为底的对数
    humoment = (np.log(np.abs(humoments))) / np.log(10)
    humoment = np.reshape(humoment,(1,7))[0]
    return humoment
if __name__ == '__main__':
    img = cv2.imread('3.png', 0) #读入图片
    #对于300幅图片求hu值的操作,笔者建议读者写代码,依次读入文件下的所有图片,求hu值,并把值写入hu.csv文件中
    sys_humoments = hu_moments(img)
    print('Hu不变矩为:\n', sys_humoments)

另外,观察这7个hu值的数据,发现有些数据数量差别有些大,量大的可能对结果有更大的影响,因此,可以对数据先做归一化处理,消除数值本身量度大小对模型的影响。(笔者并未做归一化处理,建议读者可以做一下,而且建议使用Z-score标准化方法,因其适合分类问题。)
在这里插入图片描述

3.模型训练、保存、加载和使用

a.这里专门定义了一个数据处理类DealDataset,用来把自己的数据加载,处理成DataLoader类需要的格式。

b.因为使用了交叉熵损失函数(Cross Entropy),包含了激活和one-hot操作做,所以模型的最后输出不做激活,不做one-hot.

c.模型的保存和加载使用

torch.save(model, 'BPnet.pt') #保存训练好的模型
model_dict=torch.load('BPnet.pt')#加载训练好的模型


'''
用一个数据,测试模型,看其分类结果
'''
array = [-2.98191252,-9.420647126,-12.1779162,-12.69555161,-25.77957309,
  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 42
    评论
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做个好男人!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值