概率神经网络 (PNN) 应用的简单DEMO

概率神经网络的全称是Probabilistic neural network,它主要用于模式分类,是基于贝叶斯策略前馈神经网络。它有着坚实的数学理论基础,当然本文并不打算从数学符号来对它进行介绍(有兴趣的可翻阅推荐书目),而是通过一个简单的C语言程序来认知它。

介绍程序之前,先看下它基本模型的结构示意图:

概率神经网络 (PNN) 应用的简单DEMO

图中可以看到基本分为三层,如果有了解神经网络的话就很熟悉了。第一层是输入层,就如它的名字负责接收数据的输入;第二层是模式层,对数据进行收集整理;第三层是类别层,就是数据整理完后归属于哪一个类别的信息。最后就根据类别的信息输出了,如果把输出也作为一层的话,也可以看成四层结构。其中模式层神经元激活函数取高斯型函数 e(net-1)/QQ ,其中net = wkX* (注:公式的来由涉及数学理论推导感兴趣请参考其他文献)

PNN神经网络主要是用于模式分类,在此我们就运用它实现一个识别车牌号图像中的号码与背景的程序,也就是车牌号图像的二值化。本文仅用这个程序作为PNN神经网络运用的简单DEMO,因此对图像进行些处理以简化编程,采用8位BMP带调色板的图片格式存储。

概率神经网络 (PNN) 应用的简单DEMO

想想我们看到上面这个车牌识别出上面的车牌号码的原因,很明显是由于车牌的号码白色和它周围的背景蓝色有着鲜明的不同因此才能很容易的识别出车牌号码。对于要完成的程序同样也可以运用颜色差来完成识别。我们知道计算机显示bmp图片时采用的是RBG的值来描绘每一点的像素颜色,虽然看到图像车牌背景都是蓝色,但是如果放大来看蓝色并不完全相同而且还有夹杂着些其他颜色,同样车牌号也并非全部白色。分析到这里目标就清楚了,运用PNN神经网络采集图片中每个像素点的颜色RBG值,将接近蓝色或者背景中出现的其他颜色分为A类,表示背景色;将接近白色的颜色分为B类,表示车牌号色。再用0、1这两个数值来表示A类、B类,重新设置图片中像素的颜色实现了车牌号图像的二值化。

程序的流程就比较明晰了,大致可分为三步,第一步,选取背景色和号码色的样本图片收集它们各自的颜色样本数据;第二步,运用收集的颜色数据训练PNN神经网络;第三步,将需要识别的车牌图片中每个像素的颜色数据输入PNN神经网络完成分类,然后重置图片颜色数据完成二值化。

PNN神经网络的设计,将RBG三个值作为输入数据(还可以考虑YCbCr ),模式层里的每个神经元代表一种样本颜色(可以看到即使训练完了再添加样本颜色非常方便,只要添加一个神经元即可无须改动先前训练好的神经网络,PNN神经网络的一个很大的优势),类别层的两个单元分别代表背景色类和号码色类。输入层和模式层之间的权重存储在二维指针 w 中,模式层到类别层的关系存储在a 中,**a 中的值只能 0和1,每个模式层里的神经元对应的类别有且仅有一条边值为1 用来说明该模式层神经元存储的样本颜色属于该边连接的类别。

数据收集及神经网络结构实现的伪代码如下:

{

读取号码颜色样本;

记录号码颜色样本的颜色,并统计总数countHM;

读取背景颜色样本;

记录背景颜色样本的颜色,并统计总数countBJ;

w = (long double )malloc((countBJ+countHM)sizeof(long double ));

a = (int *)calloc((countBJ+countHM),sizeof(int ));

for(i=0; i

Original: https://www.cnblogs.com/jzhlin/archive/2012/08/13/pnn.html
Author: Java研究者
Title: 概率神经网络 (PNN) 应用的简单DEMO

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616784/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 薪酬那么高的机器学习岗位,究竟是怎么面试人的?

    首先这个问题问的很广。做机器学习方向很多,有些公司更偏重于数据挖掘,而有些更倾向于深度学习。同理,相对应的岗位有些偏重理论也有些偏重实践。这些因素叠加造成了机器学习相关的岗位分布广…

    Java 2023年6月5日
    094
  • 2、面向对象

    什么是对象 现实生活中存在的一个具体的实体,有属性和方法构成 对象的特征可以归纳成两类: 属性:静态特征 方法:动态特性,行为动作 类 将具有共同属性和方法的对象进行抽象 对象数组…

    Java 2023年6月6日
    074
  • spring数据验证

    一般情况下,我们并不推荐在服务端做基础的数据校验,因为这有一个很主要的问题:它加重了服务器的负载,如果并发多,这种负载就更加明显。 如果我们跟踪一个简单的Controller方法执…

    Java 2023年6月9日
    064
  • Git SSH访问+多帐号

    Git SSH访问+多帐号 本篇说一下 Git 通过 ssh 访问 以及配置 多个公钥,因为一些墙化软件原因,导致用Http访问Github总是会卡死,最后发现ssh 访问可以 1…

    Java 2023年6月9日
    086
  • 通用查询解决方案

    package cn.com.fmsh.nfcos.sapo.biz; import java.util.*; import java.util.regex.*; import j…

    Java 2023年6月9日
    075
  • MyBatis 和 jeesite多表查询

    有时候经常碰到多级联查,比如通过某个功能A表查角色信息,但是A表和角色表没有直接的关联关系,需要通过用户表进行关联,所以就需要多级关联查询出来了(下面的只是举例,实际应用用户和角色…

    Java 2023年6月5日
    072
  • Java8新特性-Stream API

    Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一 个则是 Stream API(java.util.stream.*)。 Stream 是 Java8 中处…

    Java 2023年6月8日
    073
  • Jenkins安装

    一、准备工作 下载Jenkins的war包。 http://mirrors.jenkins.io/war-stable/latest/jenkins.war 安装tomcat,可参…

    Java 2023年6月8日
    077
  • 自写一个生成ID的工具类

    平时项目中只要涉及表,那么一定能接触到众多各式各样的ID编号,博主整理一些常用的ID格式,整合一个ID生成工具类,供大家参考,如果有什么不足指出,烦请留言批评指正,尽量改正,感激不…

    Java 2023年6月7日
    082
  • SpringSecurity学习

    一、SpringSecurity框架简介 SpringSecurity基于Spring框架,提供了一套Web应用安全性的完整解决方案 一般来说,Web应用的安全性包括用户认证(Au…

    Java 2023年5月30日
    0101
  • 记一次docker compose的低级错误

    记一次docker compose的低级错误 问题 ​ 今天在学习dockercompose的时候,启动docker compose up,结果却出现异常 Error respon…

    Java 2023年6月8日
    069
  • idea java8项目maven 设置

    posted on2022-05-05 11:56 毛会懂 阅读(125 ) 评论() 编辑 Original: https://www.cnblogs.com/maohuidon…

    Java 2023年5月29日
    069
  • 【每日算法】动态规划六

    难度[中等] 给你一个正整&#x6570…

    Java 2023年6月9日
    082
  • 分布式锁及其实现

    对于Java中的锁大家肯定都很熟悉,在Java中synchronized关键字和ReentrantLock可重入锁在我们的代码中是经常见的,一般我们用其在多线程环境中控制对资源的并…

    Java 2023年6月8日
    085
  • Java 几种常见数据库连接方式

    String Driver=”com.mysql.jdbc.Driver”; //驱动程序 String URL=”jdbc:mysql://l…

    Java 2023年6月7日
    081
  • 一篇不太正经的个人介绍

    你好啊,这里是程序员田同学。 在网上胡写乱画也快半年了,公众号上也连更了一个多月,新关注的朋友就比较疑惑,这家伙是谁呀?整天又在写些什么?为啥要关注他呀? 今天有必要写一篇文章介绍…

    Java 2023年6月8日
    057
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球