python学习—图像识别

这是我从零基础开始学习的图像识别,当然用的是容易上手的python来写,持续更新中,记录我学习python基础到图像识别应用的一步步过程和踩过的一些坑。最终实现得到自己的训练模型(h5或者pb模型),可随意更改需要识别的物品,只要有数据就行。(若有错误或问题,肯请指正)

安装编译环境

此前确保已经安装并配置好了Python环境,在此我选择了比较流行的pycharm,具体安装教程网上很多,也比较简单。

安装所需库

我是利用了anaconda命令安装的,本项目所需用的库为:
keras、numpy、tensorflow2.0(我的是GPU版本),
GPU版本速度快但安装起来比较麻烦。

导包

import os
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras import datasets, layers, models

一、接下来就是处理你的图片数据集

在这里我只提供了需要的函数,若果是自己的数据学要修改其中的变量,包括图片路径、传入参数等。

1.转换图片像素,使其大小一致

def read_image(paths):
    os.listdir(paths)
    filelist = []
    for root, dirs, files in os.walk(paths):
        for file in files:
            if os.path.splitext(file)[1] == ".jpg":
                filelist.append(os.path.join(root, file))
    return filelist
def im_xiangsu(paths):
    for filename in paths:
        try:
            im = Image.open(filename)
            newim = im.resize((128, 128))
            newim.save('F:/CNN/test/' + filename[12:-4] + '.jpg')
            print('图片' + filename[12:-4] + '.jpg' + '像素转化完成')
        except OSError as e:
            print(e.args)

2.图片数据转化为数组

def im_array(paths):
	M=[]
	for filename in paths:
	    im=Image.open(filename)
	    im_L=im.convert("L")                #模式L
	    Core=im_L.getdata()
	    arr1=np.array(Core,dtype='float32')/255.0
	    list_img=arr1.tolist()
	    M.extend(list_img)
	return M

3.准备训练数据

dict_label={0:'汽车',1:'饮料瓶'}
train_images=np.array(M).reshape(len(filelist_all),128,128)
label=[0]*len(filelist_1)+[1]*len(filelist_2)
train_lables=np.array(label)        #数据标签
train_images = train_images[ ..., np.newaxis ]        #数据图片
print(train_images.shape)#输出验证一下(400, 128, 128, 1)

4.构建卷积神经网络并保存

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 1)))#过滤器个数,卷积核尺寸,激活函数,输入形状
model.add(layers.MaxPooling2D((2, 2)))#池化层
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())#降维
model.add(layers.Dense(64, activation='relu'))#全连接层
model.add(layers.Dense(2, activation='softmax'))#注意这里参数,我只有两类图片,所以是2.
model.summary()  # 显示模型的架构
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
#epochs为训练多少轮、batch_size为每次训练多少个样本
model.fit(train_images, train_lables, epochs=5)
model.save('my_model.h5') #保存为h5模型
#tf.keras.models.save_model(model,"F:\python\moxing\model")#这样是pb模型
print("模型保存成功!")

看一下准确度,还可以,但由于数据集太少,有可能会出现过拟合情况。

图像识别算法源码 图像识别入门项目_深度学习

二、用上面得到的模型预测随便一张图片

新建一个py,直接放完整代码

import os
from PIL import Image
import numpy as np
import tensorflow as tf

#导入图像数据
#测试外部图片
model= tf.keras.models.load_model('my_model.h5')
model.summary() #看一下网络结构

print("模型加载完成!")
dict_label={0:'汽车',1:'饮料瓶'}

def read_image(paths):
    os.listdir(paths)
    filelist = []
    for root, dirs, files in os.walk(paths):
        for file in files:
            if os.path.splitext(file)[1] == ".jpg":
                filelist.append(os.path.join(root, file))
    return filelist
def im_xiangsu(paths):
    for filename in paths:
        try:
            im = Image.open(filename)
            newim = im.resize((128, 128))
            newim.save('F:/CNN/test/' + filename[12:-4] + '.jpg')
            print('图片' + filename[12:-4] + '.jpg' + '像素转化完成')
        except OSError as e:
            print(e.args)
def im_array(paths):
    im = Image.open(paths[0])
    im_L = im.convert("L")  # 模式L
    Core = im_L.getdata()
    arr1 = np.array(Core, dtype='float32') / 255.0
    list_img = arr1.tolist()
    images = np.array(list_img).reshape(-1,128, 128,1)
    return images
    
test='F:/CNN/test/'   #你要测试的图片的路径
filelist=read_image(test)
im_xiangsu(filelist)
img=im_array(filelist)
#预测图像
predictions_single=model.predict(img)
print("预测结果为:",dict_label[np.argmax(predictions_single)])
#这里返回数组中概率最大的那个
print(predictions_single)

最后结果

图像识别算法源码 图像识别入门项目_深度学习_02


数组内的两个值分别表示为汽车和瓶子的概率大小。

三、总结

由于剩余时间有限,本项目用了两类图片汽车和瓶子进行训练预测,每类图片200张,共400张,所以很有可能出现过拟合,但增加数据集会在处理图片时耗费大量时间,所以我们尽量做个折中。一类几千张差不多就行。
图片数据不够的话可以扩充。
步骤:
1、调用上述函数,处理图片,我是把的所有图片的像素大小改成了128*128,
对应input_shape=(128, 128, 1)。
2、图片数据转成数组。
3、准备训练数据(train_images, train_lables)。
4、构建神经网络并保存模型

最后附一张我调用函数的流程:

图像识别算法源码 图像识别入门项目_神经网络_03