基于朴素贝叶斯的图像分类

朴素贝叶斯是一种极其简单的分类算法,通过概率统计到的方式进行判别。通过特征的联合概率分布P(w1,w2,w3,….wn|C)进行建模,进而得到P(C|w1,w2,w3,….wn).进而转换成一种监督分类的算法

贝叶斯公式:
这里写图片描述

目标是根据特征得到属于某一类的概率,哪一类的概率最大则是哪一类。P©根据大数定律,我们通过频率来代替概率。建模关键点还是在于P(W|C)的求解,W为特征向量,则P(W|C)=P(w1,w2,w3,….wn|C),我们假设这些特征是线性无关的,即都是独立的。则可得:P(W|C)=P(w1|C)P(w2|C)P(w3|C)……P(wn|C)。即我们需要求解在某类条件下某一个特征的概率,这个时候已经转变为我们熟悉的监督分类。我找了两种土地利用类型,一种是城市用地一种是森林用地

这里写图片描述

特征的组织方式为,提取每个图像的RGB三个通道,把三个通道的灰度值连接起来生成特征向量。数据集由50个森林用地图像与50个城市用地组成,按照80% 与 20% 的比例划分训练集与测试集。朴素贝叶斯模型由三种:伯努利模型、多项式模型、混合模型三种。在实验过程中,发现对于图像数据使用多项式模型效果远远不如伯努利模型,笔者猜测可能是由于如果考虑重复值,在图像中往往存在大量的的冗余值如果不考虑重复值的也就是使用伯努利模型时效果最好能达到70%,多项式模型最好达到60%。利用训练集创建好词袋模型后,即可得到每个特征在对应条件下的概率,即建立好模型。将测试集图像样本转换为向量模型后导入创建好的模型,得到P(‘城市用地’|W)与P(‘森林用地’|W) 对比两个概率大小则得到预测结果。在数据集数量小的情况下能达到这种效果,真的很棒了,但是基于朴素贝叶斯对图像进行分类往往就很难用尝试去理解其中的原因,因为它的特征我们假设都是线性无关的,对于图像来说这往往不科学,相邻两个像素值往往关系更大,不仅仅如此对于P(W|C)=P(w1|C)P(w2|C)P(w3|C)……P(wn|C)满足乘法交换法则,也就是说像素的随机组合导致图像可能变的很糟糕,但是他们的效果确是相同的,因此笔者认为如果通过主成分分析等降纬手段提取图像的关键特征可能会达到更好的效果,有兴趣的可以尝试一下。当然目前图像识别中属CNN效果最佳,不过可能需要大量的样本,对于朴素贝叶斯能够在少量样本下达到一个中等的效果还是很令人吃惊的。

如果想要数据提前尝试的话可以联系我,以后也会放到github中,源码如下:

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 26 14:58:03 2018

@author: zhupc
"""
import numpy as np
import h5py 

def loadDataSet():
    '''
    加载图片数据集
    '''
    pictureSet=[];pictureClasses=[]
    with h5py.File('bdata/Land.h5') as h5f:
        forest=h5f['forest'][:]
        urban=h5f['urban'][:]
        pictureSet=np.vstack((forest,urban))
        pictureClasses=[0]*50+[1]*50
    return pictureSet,pictureClasses

def createVocabList(pictureSet):
    '''
    创建一个词袋集合
    '''
    vocabSet=set([])
    for picture in pictureSet:
        vocabSet=vocabSet|set(picture)
    return list(vocabSet)


def randomSpillPictureSet(pictureSet):
    '''
    随机划分训练集与测试集
    '''
    trainingSet=[x for x in range(100)];testSet=[];
    for i in range(20):
        randIndex=int(np.random.uniform(0,len(trainingSet)))   
        testSet.append(trainingSet[randIndex])
        trainingSet.remove(trainingSet[randIndex])
    return trainingSet,testSet
def setOfPix2Vec(vocaList,inputSet):
    '''
    把像素转化为向量
    '''
    returnVec=[0]*len(vocaList)
    for pix in  inputSet:
        if pix in vocaList:
            returnVec[vocaList.index(pix)]=1
    return returnVec

def NBFit(trainMatrix,trainCategory):
    numTrainPictures=len(trainMatrix)
    numPix=len(trainMatrix[0])
    pUrban=sum(trainCategory)/float(numTrainPictures)#城市概率 p(城市)
    #拉普拉斯平滑
    pForestNum=np.ones(numPix);pUrbanNum=np.ones(numPix)
    pFDenom=2;pUDenom=2
    for i in range(numTrainPictures):
        if trainCategory[i]==0:
            pForestNum+=trainMatrix[i]
            pFDenom+=sum(trainMatrix[i])
        else:
            pUrbanNum+=trainMatrix[i]
            pUDenom+=sum(trainMatrix[i])
    pFVect=np.log(pForestNum/pFDenom)
    pUVect=np.log(pUrbanNum/pFDenom)
    return pFVect,pUVect,pUrban

def classifyNB(vecPicture,pFVec,pUVec,pUrban):
    '''
    利用朴素贝叶斯进行分类
    '''
    pF=sum(vecPicture*pFVec)+np.log(1-pUrban)
    pU=sum(vecPicture*pUVec)+np.log(pUrban)
    return 1 if pU/pF>1  else 0

def testingNB():
     pictureSet,pictureClasses=loadDataSet()
     vocabList=createVocabList(pictureSet)
     trainMat=[];trainClasses=[]
     trainingSet,testSet=randomSpillPictureSet(pictureSet)
     for i in trainingSet:
         trainMat.append(setOfPix2Vec(vocabList,pictureSet[i]))
         trainClasses.append(pictureClasses[i])
     pFVect,pUVect,pUrban=NBFit(trainMat,trainClasses)
     errorCount=0
     for i in testSet:
        picVector=setOfPix2Vec(vocabList,pictureSet[i])
        if classifyNB(np.array(picVector),pFVect,pUVect,pUrban)!=pictureClasses[i]:
            errorCount+=1
            print('classification error')
        else:print('分类正确')
     print('the error rate is :',float(errorCount)/len(testSet))
testingNB()
数据集介绍:多类别动物目标检测数据集 一、基础信息 数据集名称:多类别动物目标检测数据集 图片数量: - 训练集:6,860张图片 - 验证集:1,960张图片 - 测试集:980张图片 总计:9,800张含动态场景的动物图像 分类类别: Alpaca(羊驼)、Camel(骆驼)、Fox(狐狸)、Lion(狮子)、Mouse(鼠类)、Ostrich(鸵鸟)、Pig(猪)、Rabbit(兔子)、Rhinoceros(犀牛)、Shark(鲨鱼)、Sheep(绵羊)、Snake(蛇)、Whale(鲸鱼) 标注格式: YOLO格式标注,包含目标检测所需的归一化坐标及类别索引,适用于YOLOv5/v7/v8等系列模型训练。 数据特性: 覆盖航拍、地面视角等多种拍摄角度,包含动态行为捕捉及群体/单体目标场景。 二、适用场景 野生动物监测系统: 支持构建无人机/红外相机AI识别系统,用于自然保护区动物种群追踪与生态研究。 智慧农业管理: 适用于畜牧养殖场动物行为分析、数量统计及健康监测等自动化管理场景。 生物多样性研究: 为陆地/海洋生物分布研究提供标注数据支撑,助力濒危物种保护项目。 教育科研应用: 可作为计算机视觉课程实践素材,支持目标检测、迁移学习等AI教学实验。 三、数据集优势 跨物种覆盖全面: 包含13类陆生/水生动物,涵盖家畜、野生动物及濒危物种,支持复杂场景下的模型泛化训练。 动态场景丰富: 捕捉动物运动、群体互动等真实行为模式,提升模型对非静态目标的检测鲁棒性。 标注体系规范: 严格遵循YOLO标注标准,提供精确的边界框定位,支持即插即用的模型训练流程。 多场景适配性: 数据来源涵盖航拍影像、地面监控等多维度视角,适用于农业、生态保护、科研等跨领域应用。 类别平衡优化: 通过分层抽样保证各类别数据分布合理性,避免长尾效应影响模型性能。
数据集介绍:陆生动物多场景目标检测数据集 一、基础信息 数据集名称:陆生动物多场景目标检测数据集 数据规模: - 训练集:9,134张图片 - 验证集:1,529张图片 - 测试集:1,519张图片 分类类别: - 家畜类:Cattle(牛)、Horse(马)、Sheep(羊) - 宠物类:Cat(猫)、Dog(狗) - 野生动物类:Bear(熊)、Deer(鹿)、Elephant(大象)、Monkey(猴子) - 禽类:Chicken(鸡) 标注格式: YOLO格式标注,包含目标边界框坐标和10类动物标签,支持多目标检测场景 数据特性: 涵盖俯拍视角、户外自然场景、牧场环境等多角度拍摄数据 二、适用场景 农业智能化管理: 支持开发牲畜数量统计、行为分析系统,适用于现代化牧场管理 野生动物保护监测: 可用于构建自然保护区动物识别系统,支持生物多样性研究 智能安防系统: 训练农场入侵检测模型,识别熊等危险野生动物 宠物智能硬件: 为宠物智能项圈等设备提供多动物识别训练数据 教育科研应用: 适用于动物行为学研究和计算机视觉教学实验 三、数据集优势 物种覆盖全面: 包含10类高价值陆生动物,覆盖畜牧、宠物、野生动物三大场景需求 标注质量优异: YOLO格式标注严格遵循标准规范,支持YOLOv5/v7/v8等主流检测框架直接训练 场景多样性突出: 包含航拍视角、近距离特写、群体活动等多种拍摄角度和场景 大规模训练保障: 超12,000张标注图片满足深度神经网络训练需求 现实应用适配性: 特别包含动物遮挡、群体聚集等现实场景样本,提升模型部署效果
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值