项目介绍

小狗分类器可以做什么?

通过这个分类器,你只需要上传照片,就可以得到小狗的品种,以及更多的信息。

这就是所谓的「机器学习」,让机器自己去“学习”。我们今天要做的这个分类任务,是一个“监督学习”的过程。

监督学习的主要目标是从有标签的训练数据中学习模型,以便对未知或未来的数据做出预测。

我给大家讲一个例子。
用“房子的尺寸”预测“房子的价格”

图片来自(吴恩达-机器学习)

X-房子的尺寸(小狗的图片)
    Y-房子的价格(小狗的类别)

如图,我们根据已经有的数据集(图上的坐标),可以拟合出一条近似符合规律的直线。

这样,再有新的房子尺寸(1250),我们就可以估算出房子的价格(220k)了。

有了这些简单的基础,可以开始搞了。

效果展示

训练集的准确率为0.925,但测试集只有0.7

说明过拟合了,可以再增加一些图片,或者使用数据增强,来减少过拟合。

测试了两张图片,全都识别对了!

编写思路

整个分类器的实现,可以分为以下几个部分:

1 准备数据集

我们可以通过爬虫技术,把4类图像(京巴、拉布拉多、柯基、泰迪)保存到本地。总共有840张图片做训练集,188张图片做测试集。

2 数据集的预处理

1) 统一尺寸为100*100*3(RGB彩色图像)


# 统一尺寸的核心代码
img = Image.open(img_path)
new_img = img.resize((100, 100), Image.BILINEAR)
new_img.save(os.path.join('./dog_kinds_after/' + dog_name, jpgfile))

2) 由于数据是自己下载的,需要制作标签(label),可提取图像名称的第一个数字作为类别。(重命名图片)


kind = 0

# 遍历京巴的文件夹
images = os.listdir(images_path)
for name in images:
    image_path = images_path + '/'
    os.rename(image_path + name, image_path + str(kind) +'_' + name.split('.')[0]+'.jpg')

3)划分数据集

840张图片做训练集,188张图片做测试集。

4)把图片转换为网络需要的类型


# 只放了训练集的代码,测试集一样操作。

ima_train = os.listdir('./train')

# 图片其实就是一个矩阵(每一个像素都是0-255之间的数)(100*100*3)

# 1.把图片转换为矩阵
def read_train_image(filename):
    img = Image.open('./train/' + filename).convert('RGB')
    return np.array(img)

x_train = []
# 2.把所有的图片矩阵放在一个列表里 (840, 100, 100, 3)
for i in ima_train:
    x_train.append(read_train_image(i))

x_train = np.array(x_train)

# 3.提取kind类别作为标签
y_train = []
for filename in ima_train:
    y_train.append(int(filename.split('_')[0]))

# 标签(0/1/2/3)(840,)
y_train = np.array(y_train)

# 我是因为重命名图片为(1/2/3/4),所以都减了1
# 为了能够转化为独热矩阵
y_train = y_train - 1

# 4.把标签转换为独热矩阵
# 将类别信息转换为独热码的形式(独热码有利于神经网络的训练)
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
print(y_test)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

x_train /= 255
x_test /= 255

print(x_train.shape)  # (840, 100, 100, 3)
print(y_train.shape)  # (840,)

3 搭建卷积神经网络

Keras是基于TensorFlow的深度学习库,是由纯Python编写而成的高层神经网络API,也仅支持Python开发。

它是为了支持快速实践而对Tensorflow的再次封装,让我们可以不用关注过多的底层细节,能够把想法快速转换为结果。


# 1.搭建模型(类似于VGG,直接拿来用就行)

model = Sequential()
# 这里搭建的卷积层共有32个卷积核,卷积核大小为3*3,采用relu的激活方式。
# input_shape,字面意思就是输入数据的维度。

#这里使用序贯模型,比较容易理解
#序贯模型就像搭积木一样,将神经网络一层一层往上搭上去

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
#dropout层可以防止过拟合,每次有25%的数据将被抛弃

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4, activation='softmax'))

4 训练

训练的过程,就是最优解的过程。

对上图来说,就是根据数据集,不断的迭代,找到一条最近似的直线(y = kx + b),把参数k,b保存下来,预测的时候直接加载。


# 编译模型
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

# 一共进行32轮
# 也就是说840张图片,每次训练10张,相当于一共训练84次
model.fit(x_train, y_train, batch_size=10, epochs=32)

# 保存权重文件(也就是相当于“房价问题的k和b两个参数”)
model.save_weights('./dog_weights.h5', overwrite=True)
# 评估模型
score = model.evaluate(x_test, y_test, batch_size=10)
print(score)

5 预测

此时k、b(参数)和x(小狗的图像)都是已知的了,求k(类别)就完了。


# 1.上传图片
name = input('上传图片的名称(例如:XX.jpg)为:')

# 2.预处理图片(代码省略)

# 3.加载权重文件
model.load_weights('dog_weights.h5')

# 4.预测类别
classes = model.predict_classes(x_test)[0]

target = ['京巴', '拉布拉多', '柯基', '泰迪']
# 3-泰迪 2-柯基 1-拉布拉多 0-京巴

# 5.打印结果
print("识别结果为:" + target[classes])

依赖环境

1 深度学习框架Keras和TensorFlow

2 PIL扩展库(预处理图片)

3 Pycharm/Jupyter notebook

用 Python 图像识别打造一个小狗分类器的更多相关文章

  1. 简明Python中的一个小错误

    最近在学Python,先看的是<Python基础教程>,后来经别人推荐,感觉网络上的<简明Python教程>也挺好的,在里面发现一个小错误. 网址如下:http://sebug ...

  2. selenium,phantomJS,python整合的一个小示例,把某个网页画面整体保存成图片格式。

    本篇将使用selenium,phantomJS和python制作的一个示例,把某个网页整体保存为一个图片文件. 简单介绍下,selenium是一个开源的用于测试web程序的工具,当然,如果你要执行一些 ...

  3. 纯 css 打造一个小提示 tooltip

    最后编辑:2019/11/26 前 无意间在寻找资料时候,发现一个不错的小提示,查看源码竟然是纯手工 css 编写(文章底部参考链接). 效果 使用的特性 css2 中的 attr 函数,所以现在(2 ...

  4. 【源码项目+解析】C语言/C++开发,打造一个小项目扫雷小游戏!

    一直说写个几百行的小项目,于是我写了一个控制台的扫雷,没有想到精简完了代码才200行左右,不过考虑到这是我精简过后的,浓缩才是精华嘛,我就发出来大家一起学习啦,看到程序跑起来能玩,感觉还是蛮有成就感的 ...

  5. python笔记3----第一个小爬虫

    1.先看看要爬的网站有没有爬虫协议,可以看该网站有没有robots.txt,如豆瓣的: 2.requests模块:[requests是第三方,代码比python自带的urllib模块简单] 先加载re ...

  6. 如何用20行Python代码打造一个微信群聊助手?

    今天要教大家一个黑科技,20行代码实现自己定制的微信群聊助手,可以用来活跃群气氛,好多群主创建完群后,拉完一群人,之后就一片寂静,有个群聊助手,就可以帮忙活跃群里气氛,通过今天在自己的微信上有一大批好 ...

  7. python -Tkinter 实现一个小计算器功能

    文章来源:http://www.cnblogs.com/Skyyj/p/6618739.html 本代码是基于python 2.7的 如果是对于python3.X  则需要将 tkinter 改为Tk ...

  8. Python Flask打造一个视频网站实战视频教程

    下载链接:https://www.yinxiangit.com/607.html 目录: 本套课程从零基础讲解flask开发网站.涉及到的知识点包括:Python和pycharm的安装.urls和视图 ...

  9. python socket打造一个定位工具

    前言: 刚刚学习socket,打算后期得学习 怎么写exploit. 原理: 其实很简单,客户端写个爬虫.然后将获取到的IP放入高德地图 在通过socket发送.利用ngrok达到能外网搞事. 准备: ...

随机推荐

  1. 基于Pact的契约测试

    背景 如今,契约测试已经逐渐成为测试圈中一个炙手可热的话题,特别是在微服务大行其道的行业背景下,越来越多的团队开始关注服务之间的契约及其契约测试. 什么是契约测试     关于什么是契约测试这个问题, ...

  2. 2019年Java并发精选面试题,哪些你还不会?(含答案和思维导图)

    Java 并发编程 1.并发编程三要素? 2.实现可见性的方法有哪些? 3.多线程的价值? 4.创建线程的有哪些方式? 5.创建线程的三种方式的对比? 6.线程的状态流转图 7.Java 线程具有五中 ...

  3. 带你使用Visual Studio 2019创建一个MVC Web应用

    工欲善其事必先利其器,我们既然有Visual Studio2019这样的IDE为什么不用?学.Net Core而不用Visual Studio进行开发可谓是多么另类呀!既然你已经安装了VS2019的话 ...

  4. Test 1022

    T1 AERODROM (二分答案 TimeLimit: 1000MS Memory Limit: 32768KB \(N\)个登机口,办理登机业务,第\(i\)个窗口的单位办理时间为\(T_i\), ...

  5. 基于TCP协议之SSH

    #SSH客户端 import socket # 1. 创建符合TCp协议的手机 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # ...

  6. Django forms组件里的ChoiceField、ModelChoiceField和ModelMutipleChoiceField的区别

    阅读简要 首先我们要明白Django forms组件里的ChoiceField.ModelChoiceField和ModelMutipleChoiceField是继承关系 ChoiceField 1. ...

  7. NetCore MemoryCache使用

    引用类库 1.Install-Package Microsoft.Extensions.Caching.Memory MemoryCacheOptions 缓存配置 1.ExpirationScanF ...

  8. GPS NMEA-0183标准详解

    NMEA - 0183 是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式.目前业已成了 GPS/北斗导航设备统一的 ...

  9. android6.0系统Healthd深入分析

    概述 Healthd是android4.4之后提出来的一种中介模型,该模型向下监听来自底层的电池事件,向上传递电池数据信息给Framework层的BatteryService用以计算电池电量相关状态信 ...

  10. Java DAO 模式

    转载自https://www.runoob.com/note/27029 DAO 模式 DAO (DataAccessobjects 数据存取对象)是指位于业务逻辑和持久化数据之间实现对持久化数据的访 ...