一.项目描述

数据集来源于kaggle猫狗大战数据集。训练集有25000张,猫狗各占一半。测试集12500张。希望计算机可以从这些训练集图片中学习到猫狗的特征,从而使得计算机可以正确的对未曾见过的猫狗图片进行分类。这就是图像分类问题,计算机视觉研究领域之一,计算机通过学习图像本身的特征将不同类别的图像区分开来。

二.评价指标

二分类评价指标
binary_crossentropy:交叉熵

ŷ i是样本标签,yi样本输出。只有yi和ŷ i是相等时,loss才为0,否则loss就是为一个正数。而且,概率相差越大,loss就越大。这个度量概率距离的方式称为交叉熵。
二分类模型的最后一层的激活函数 是:sigmoid

二分类模型最后输出的是0到1的数。
应该使用numpy的四舍五入求取类别,并转换为整数
pred_y=int(np.round(predict_y))

多分类评价指标
categorical_crossentropy:分类交叉熵函数


ŷ i是样本标签,yi样本输出
多分类模型的最后一层的激活函数 是:softmax

softmax先把输出指数化,再归一化,得到各类概率。
假设一个问题是3分类,一个训练样本进来得到的softmax是[0.5,0.2,0.3]
假设这个正确样本类别为第一个类别。
则该样本分类交叉熵为:

多分类模型输出的是各个类别的概率,如2个样本的预测输出为:ypred=[[0.5,0.2,0.3],[0.4,0.1,0.5]]
应该使用numpy求取最大值索引
pred=np.argmax(ypred,axis=1)
得到[0,2]

三.算例实现

数据集
电脑垃圾啦,无法将全部图片都用上,跑不动。
于是猫和狗都选取原始数据集的一半左右。
猫的图片如下:

狗的图片如下:

各种各样的猫和狗,不容易找到统一的图片预处理方式,如处理成二值图像(但猫狗颜色不一样,二值处理有的把背景提取出来啦,毕竟二值处理需要把前景色处理成白色,为了达到此要求,有的图片得做反二值化处理)
就对图片不做任何处理吧,防止图片失真。

1数据集读取函数
注意:cv2.imread(name) 图片路径不能含有中文。
#个人喜好用OpenCV

需要对图片统一大小: cv2.resize(img, (100, 100))

import os
import numpy as np
import cv2def ReFileName(dirPath):""":param dirPath: 文件夹路径:return:"""# 对目录下的文件进行遍历x=[]for file in os.listdir(dirPath):# 判断是否是文件if os.path.isfile(os.path.join(dirPath, file)) == True:c= os.path.basename(file)name = dirPath + '\\' + cimg = cv2.imread(name)img = cv2.resize(img, (100, 100))  # 使尺寸大小一样x.append(img)return x

2数据集读取并处理
分别读取猫狗数据集,之前我将猫和狗放在两个文件夹啦。
对数据除以255,cnn模型对数值小的数处理得比较好。
转换数据格式,图像格式为np.uint8, 转换成float型,计算机可以计算。
标签处理,猫处理成1,狗处理成0

dirPathcat = r"catdog\cat"#文件路径
cat=ReFileName(dirPathcat)#调用函数
cat=np.array(cat)/255
cat=cat.astype(np.float64)
print('输入cat.shape',cat.shape)biaoqiancat=[1 for i in range(len(cat))]#标签处理
biaoqiancat=np.array(biaoqiancat)#标签dirPathdog = r"catdog\dog"#文件路径
dog=ReFileName(dirPathdog)#调用函数
dog=np.array(dog)/255#数据
dog=dog.astype(np.float64)
biaoqiandog=[0 for i in range(len(dog))]#标签处理
biaoqiandog=np.array(biaoqiandog)#标签

3.数据打乱
首先拼接数据集,然后打乱数据集特征和标签。
如果是多分类问题得在打乱数据前对y进行one-hot化,如:
y=keras.utils.to_categorical(y,4)#四分类

x=np.concatenate((cat,dog),axis=0)
y=np.concatenate((biaoqiancat,biaoqiandog),axis=0)index = [i for i in range(len(y))] # test_data为测试数据
np.random.seed(1)
np.random.shuffle(index) # 打乱索引
train_data = x[index]train_label = y[index]

4.定义模型
电脑不行,就用个普通模型跑吧。

如果是多分类问题
最后两行为

 model.add(Dense(2, activation='softmax'))  # 输出层model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

本文模型

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
import keras
import timedef define_model():model = Sequential()model.add(Conv2D(filters=16,kernel_size=(5, 5),padding='same',input_shape=(100, 100, 3),activation='relu'))  # 卷积层1model.add(MaxPooling2D(pool_size=(2, 2)))  # 池化层2model.add(Dropout(0.25))model.add(Flatten())  # 平坦层model.add(Dense(10,activation='relu'))  # 隐藏层model.add(Dense(1, activation='sigmoid'))  # 输出层model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])model.summary()return model

5.模型训练并保持
准确率0.7072,之前使用的是猫狗各3000多张,准确率为0.5。
现在使用的是各6000多张,准确率0.7。
原始数据集有各12000多张,原谅我,使用全部数据集电脑太卡,没服务器,学生党。

start_time = time.time()
model = define_model()
model.fit(train_data, train_label, epochs=2)
model.save('猫狗分类.h5')
end_time = time.time()
run_time = (end_time - start_time) / 60
print(run_time)  #3.931485986709595
print('训练结束')
#0.7072

四.pyqt可视化结果

建立个简单版的qt猫狗预测系统吧。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu
# @Date  : 2020/7/18
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *import cv2
import keras
from keras .models import load_model
import numpy as np
import re
class picture(QWidget):def __init__(self):super(picture, self).__init__()self.resize(600, 400)self.setWindowTitle("猫狗分类")self.btn = QPushButton()self.btn.setText("打开图片")self.btn.clicked.connect(self.openimage)self.label = QLabel()self.label.setText('图片路径')self.labelimage = QLabel()self.labelimage.setText("显示图片")#self.labelimage.setFixedSize(500, 400)#设置尺寸self.labelimage.setStyleSheet("QLabel{background:white;}""QLabel{color:rgb(300,300,300,120);font-size:10px;font-weight:bold;font-family:宋体;}")#预测按钮self.btnclass=QPushButton()self.btnclass.setText('点击预测分类')self.btnclass.clicked.connect(self.fenlei)self.labelclass=QLabel()self.labelclass.setText('预测类别')self.labelclass.setStyleSheet("font:16pt '楷体';border-width:2px;border-style: inset;border-color:gray")layout1=QVBoxLayout()layout1.addWidget(self.btn)layout1.addWidget(self.label)layout1.addWidget(self.labelimage)layout2 = QVBoxLayout()layout2.addWidget(self.btnclass)layout2.addWidget(self.labelclass)layout=QVBoxLayout()layout.addLayout(layout1)layout.addLayout(layout2)self.setLayout(layout)def openimage(self):imgName, imgType = QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")#jpg = QtGui.QPixmap(imgName).scaled(self.labelimage.width(), self.label.height())#适应labelimage尺寸,前提是label设置了尺寸jpg = QtGui.QPixmap(imgName)self.labelimage.setPixmap(jpg)self.label.setText(str(imgName))def fenlei(self):biaoqian = {'1': '猫', '0': '狗'}path=self.label.text()newName = re.sub('(D:/机器学习/学习草稿/)','', path)print(newName)img = cv2.imread(str(newName))img = cv2.resize(img, (100, 100))  # 使尺寸大小一样img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)img = np.array(img) / 255img = img.astype(np.float64)img = img.reshape(-1, 100, 100, 1)model = load_model('猫狗分类.h5')predict_y = model.predict(img)pred_y = int(np.round(predict_y))print(pred_y)self.labelclass.setText(biaoqian[str(pred_y)])if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)my = picture()my.show()sys.exit(app.exec_())

说明:
newName = re.sub(’(D:/机器学习/学习草稿/)’,’’, path)
这是因为我图片放在了当前项目文件夹里,导致图片绝对路径含有中文,cv.imread()会出错,我去除掉中文部分,使模型读取相对路径
如果你要读取任意文件夹里的图片,要使图片绝对路径无中文。

可以固定图片显示尺寸;
#self.labelimage.setFixedSize(500, 400)#设置尺寸
#jpg = QtGui.QPixmap(imgName).scaled(self.labelimage.width(), self.label.height())#适应labelimage尺寸,前提是label设置了尺寸

结果
预测界面:

识别cat

识别dog

这个结果还不能让我满意,等我多学习下知识再来吧。

当然也可以调用摄像头,实现对摄像头下的猫狗进行实时识别。
可以参考博文然后自己修改程序。就是一个定时器作用,每隔多少时间识别下摄像头下的物体。
opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像头并实时不断截屏,读取视频并截图)

送上其他资源:
计算机视觉:图像特征与描述大全 (一篇博文带你简单了解完图像特征提取技术)

电气专业的计算机萌新,写博文不容易。如果你觉得本文对你有用,请点个赞再走,谢谢。

python +keras实现图像分类(入门级例子讲解)相关推荐

  1. python图像分类示例_python +keras实现图像分类(入门级例子讲解)

    一.项目描述 数据集来源于kaggle猫狗大战数据集.训练集有25000张,猫狗各占一半.测试集12500张.希望计算机可以从这些训练集图片中学习到猫狗的特征,从而使得计算机可以正确的对未曾见过的猫狗 ...

  2. BPR贝叶斯个性化推荐算法—推荐系统基础算法(含python代码实现以及详细例子讲解)

    BPR贝叶斯个性化排序算法 一.问题导入 二.显示反馈与隐式反馈 2.1 显式反馈与隐式反馈基本概念 2.2 显式反馈与隐式反馈的比较 2.3 显式反馈与隐式反馈的评价方法 2.3.1 显式反馈数据模 ...

  3. Python的零基础超详细讲解(第十三天)-Python的类与对象

    基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...

  4. Python的零基础超详细讲解(第七天)-Python的数据的应用

    往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...

  5. Python的零基础超详细讲解(第五天)-Python的运算符

    往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...

  6. Python的零基础超详细讲解(第八天)-Python的条件判断

    我们在使用无线耳机听音乐的时候,我们可以设置轻点两下耳机就播放下一首.如果我只设置轻点两下耳机,就播放下一首,那么,由于缺少正在使用耳机(耳机塞进耳朵视为正在使用)的前提条件,无论你是否正在使用,只要 ...

  7. pythonappend教程_对python append 与浅拷贝的实例讲解

    在做Leetcode的第39题的时候,看到网上一个用递归的解法,很简洁.于是重写了一遍. class Solution(object): def combinationSum(self, candid ...

  8. python transpose_对python 矩阵转置transpose的实例讲解

    在读图片时,会用到这么的一段代码: image_vector_len = np.prod(image_size)#总元素大小,3*55*47 img = Image.open(path) arr_im ...

  9. python转置矩阵函数_对python 矩阵转置transpose的实例讲解

    在读图片时,会用到这么的一段代码: image_vector_len = np.prod(image_size)#总元素大小,3*55*47 img = Image.open(path) arr_im ...

最新文章

  1. 「2019中国大数据技术大会」超值学生票来啦!
  2. R构建指数回归模型(Exponential Regression)
  3. 源码资本张宏江:只有算法和技术,那你一定挣不到钱
  4. 五个指标看BCH,它距离“币圈金本位”还有多远?
  5. MySQL 语句外键 连接
  6. .NET中可空值类型实现原理
  7. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)...
  8. 2021暑假生产实习【SSM实习项目-超市积分管理系统】博客汇总表
  9. Web负载均衡学习笔记之四层和七层负载均衡的区别
  10. 【万字长文】Spring Cloud Alibaba 开箱即用!
  11. js中应用protocol buffer
  12. java netty 面试_Java 200+ 面试题补充② Netty 模块
  13. 【web必知必会】—— 图解HTTP(转)good
  14. 300字总结计算机flash,Flash学习心得体会范文
  15. 分页存储管理系统中内存有效访问时间的计算
  16. 图像增强算法Python实现之Retinex(含代码)
  17. 简历包装严重,作为面试官,我是如何甄别应聘者的包装程度
  18. 巴菲特致股东的一封信:2000年
  19. 喜欢的歌,老歌居多,呵呵,怀旧,改不了的毛病
  20. 目标检测、追踪梳理:帧差法、光流法、背景减除法

热门文章

  1. 【❤️算法系列之二叉树的实现(包含前序、中序、后序遍历以及节点的查找和删除)❤️】
  2. activiti实现跳转节点的方法
  3. 织梦内容管理系统(DedeCMS)
  4. ActiveMq消费端实现集群部署
  5. 微信小程序【腾讯云开发】创建并上线小程序项目(涉及-数据库操作)
  6. Android 显示 WebView ,加载URL 时,向webview的 header 里面传递参数
  7. 自动检测iOS网络并可跳转至设置界面设置网络
  8. JSP——EL语法总结
  9. 《剑指offer》-- 构建乘积数组、求1+2+3+...+n、不用加减乘除做加法、包含min函数的栈、用两个栈实现队列
  10. Spring使用JPA进行Dao层的数据访问以及事务管理