python 智能识别,人脸识别 python
第三篇文章
数字图像处理的一个任务,技术上就是建立深度学习网络,训练模型,保存模型,调用模型实现预测。
其实程序的代码是一样的。我是通过看哔哩哔哩的教学视频一个一个打出来的。使用的编程语言是python加paddle,是百度关于人工智能的扩展库。虽然整个代码都是打出来的,我对深度学习的概念还是比较模糊,但是不得不说百度的paddle还是挺友好的。它的库使得一些不是专门研究深度学习的人也可以做一个基于深度学习的小demo。
先说我在哔哩哔哩看的一个人工智能学院的教学视频(这里不方便说全名)。由于这个程序没有在你自己的电脑上运行,你可能会面临这样的问题,你不知道如何用代码和数据集运行这个程序。这里简单说一下,这个项目是在百度的Ai studio(一个网页)上用在线编辑器创建的。程序运行的时候,为了训练百度云计算的GPU加速卡,用的比较快,如果真的需要可以加我Q2833306588(希望能帮到你,但不要只是抄作业)
源程序如下:(代码量相当客观)
#fruits_classify.py
#图像分类:水果分类和识别
#数据集介绍:
#1036水果图片
#共有五类(288个苹果、275个香蕉、216个葡萄、276个橙子和251个梨)
#1.数据预处理
导入操作系统
进口j
name_dict={ "苹果":0,"香蕉":1,"葡萄":2,
【橘子】:3、【梨】:4} #名称3354分类数字对应字典
#定义一些要使用的变量
Data _ root _ path="data/fruits/"#数据集目录
test _ file _ path=data _ root _ path " test . list " #测试集文件路径
train _ file _ path=data _ root _ path " train . list " #训练集文件路径
readme _ file=data _ root _ path " readme . JSON " #示例数据摘要文件
Name_data_list={} #定义一个字典保存所有图片的路径和标签。
定义保存_训练_测试_文件(路径,名称):
如果不在name _ data _ list中:#如果某一种水果不在字典中
Img_list=[] #创建一个空列表
Img_list.append(path) # Push in文件路径
Name_data_list[name]=img_list #将列表保存到字典中
否则:#如果某一种水果已经在字典中
名称数据列表[名称]。append (path) #直接存储在字典中。
#遍历目录将图片路径存储在字典中,然后字典会将图片路径写入文件。
dirs=OS . listdir(data _ root _ path)#列出data/fruits/目录中的所有内容。
对于dirs中的d:
Full_path=data_root_path d #拼出完整的目录路径
If.path.isdir (full _ path): #如果是目录,遍历目录中的图片。
imgs=os.listdir(完整路径)
对于img中的img:
save _ train _ test _ file(full _ path / img,d) #保存文件路径的函数
Else: #如果是文件,就不要处理。
及格
#print(name_data_list)#打印字典
#分为测试集和测试集
以(test _ file _ path," w ")为f: #以书面格式打开测试集文件。
Pass #不操作,相当于清空文件。
以open(train_file_path,“w”)为f:
及格
#遍历字典,没有10个数据项被分成一个数据测试集,其他的都包含在训练集中。
对于名称,name_data_list.items()中的img_list:
i=0
Num=len(img_list)#每种图片的打印数量
打印( %s: %d张 %(名称,数量))
对于img_list中的img:
如果==0: #放入测试集
用(test _ file _ path," a ")作为f: #以追加的格式打开文件。
Line=% s \ t% d \ n% (img,name _ dict [name]) #拼写一行
F.write(行)# write
否则:#放入训练集
用open(train_file_path,“a”)作为f:
Line=% s \ t% d \ n% (img,name _ dict [name]) #拼写一行
f .写(行)
i=1
#2.网络构建、模型训练/保存
进口桨
导入桨。流体作为流体
进口数量
导入系统
从多处理导入CPU _ count #多线程
将matplotlib.pyplot导入为plt #数据可视化
Def train_mapper(示例):# Function函数:trim数据。
Img,label=sample#sample由图像路径和标记组成。
如果不是os.path.exists(img):
Print("图片不存在:",img)
否则:
#看图,对多张图片进行色彩变换。
img=paddle . dataset . image . load _ image(img)#读图
#在图片上变换、构建、输出单通道100*100矩阵。
img=paddle . dataset . image . simple _ transform(im=img,
resize_size=100
crop_size=100
is_color=True,
is_train=True)
#图像的标准化,压缩0到1之间的值
Img=img.flatten()。astype ("float32")/255.0 #将每个像素的值除以255。
Img,label #处理过的图片和标签
#自定义阅读器,从数据集中读取数据,交给train_mapper处理。
定义训练列表(训练列表,缓冲大小=1024):
定义读取器():
其中open(train_list,“r”)为f:
# List推导,读出文件中的所有内容,放入lines列表中。
lines=[line . strip()for line in f]# strip()方法用于移除字符串开头和结尾指定的字符(默认为空格或换行符)。
对于线中的线:
img_path,lab=line.strip()。拆分( \t )
Yield img_path,int(lab) #读取文件中的一行数据。
#下面是一个高阶函数,相当于构建了一个通道将reader读取的数据映射到train_mapper。
return paddle . reader . xmap _ readers(train _ mapper,# mapper函数
阅读器,#阅读器功能
Cpu_count(),#线程数
缓冲区大小
#建立一个神经网络
#输入层-卷积-池化/丢弃-卷积-池化/丢弃
#-卷积-池/丢失-全连接层-丢失-全连接层
定义卷积_神经网络(图像,类型_大小):
#第一卷积池层
pool _池_ 1=流体.网.简单_ img _ conv _池(
输入=图像,#输入数据
Filter_size=3,#卷积核大小,经验值
Num_filters=32,#卷积核的数量,与输出通道的数量相同
Pool_size=2,#池层大小22
Pool _ stride=2,# Pool层的步长与卷积过程一致,只是算法不同,所以取pool核的最大值。
Act="relu" #激活功能
)
#dropout:丢弃学习,随机丢弃部分神经元的输出,防止过拟合。
drop=fluid . layers . dropout(x=conv池1,#输入
Dropout_prob=0.5 )#丢弃率
#第二卷积池层
pool _池_ 2=流体.网.简单_ img _ conv _池(
输入=丢弃,#输入数据
Filter_size=3,#卷积核大小
Num_filters=64,#卷积核的数量,与输出通道的数量相同
Pool_size=2,#池层大小22
Pool_stride=2,#池层步长
Act="relu" #激活功能
)
drop=fluid . layers . dropout(x=conv池2,#输入
Dropout_prob=0.5 )#丢弃率
#第三卷积池层
pool _池_ 3=流体.网.简单_ img _ conv _池(
输入=丢弃,#输入数据
Filter_size=3,#卷积核大小
Num_filters=64,#卷积核的数量,与输出通道的数量相同
Pool_size=2,#池层大小2*2
Pool_stride=2,#池层步长
Act="relu" #激活功能
)
drop=fluid . layers . dropout(x=conv池3,#输入
Dropout_prob=0.5 )#丢弃率
#全连接层,输出分类的函数fc=fluid.layers.fc (input=drop,size=512,#最后生成的分类act= relu )drop=fluid . layers . dropout(x=fc,# input drop _ prob=0.5) #丢弃率predict=fluid . layers . fc(input=drop,# input size=type_size,#最终分类数5分类act=softmax)#激活函数return predict #为训练准备数据。
BATCH_SIZE=32
trainer _ reader=train _ r(train _ list=train _ file _ path)
train _ reader=paddle . batch(paddle . reader . shuffle(reader=trainer _ reader,buf_size=1200),
批处理大小=批处理大小)
#培训期间输入数据
image=fluid . layers . data(name=" image ",
shape=[3100100],
dtype="float32 ")
#训练期间的期望输出值(真实类别)
label=fluid . layers . data(name=" label ",
shape=[1],
dtype="int64 ")
#调用函数创建一个卷积神经网络
predict=evolution _ nural _ network(image=image,#输入数据
Type_size=5 )#类别数
#交叉熵,衡量两个概率之间的差异
cost=fluid . layers . cross _ entropy(输入=预测值,#预测值
Label=label)#预期值
av _ cost=fluid . layers . mean(cost)#求损失值的平均值。
#计算精度
精度=流体.层.精度(输入=预测值,#预测值
label=label)#期望值
#定义优化器
#自适应梯度下降优化器
优化器=流体。优化器。Adam(learning _ rate=0.001)
optimizer.minimize(avg_cost)
#定义执行器
地点=流体CUDAPlace(0)#gpu上执行
exe=流体。遗嘱执行人(地点)
exe。运行(流体。default _ startup _程序())#初始化系统参数
进料器=流体data feeder(feed _ list=[图片,标签],
place=place)#喂入数据
对于范围(10)内的通行证id:#训练10轮
train_cost=0
对于批处理id,枚举(train_reader())中的数据:
train_cost,train _ ACC=exe。运行(程序=流体。default _ main _ program(),#执行默认程序
feed=feeder.feed(数据),#输入数据
fetch_list=[avg_cost,accuracy])#获取结果,损失值和正确率
如果batch_id==0:#没20次训练打印一笔
print("pass:%d,batch:%d,cost:%f,acc:%f"%(pass_id,batch_id,train_cost[0],train_acc[0]))
打印("训练完成!")
#保存模型
model _ save _ dir=" model/fruits/" #模型保存路径
如果不是os.path.exists(模型保存目录):
os.mkdir(模型保存目录)#如果文件不存在就新建一个文件
流体。io。保存推理模型(目录名=模型保存目录
feed _ var _ names=[" image "],
target _ vars=[预测],
执行者=exe)
打印("保存模型完成!")
#3.模型加载,执行预测
来自太平航运进口图片#引入一个图形库
地点=流体CPUPlace()#不需要再国家政治保卫局。参见国家政治保卫局上面跑
infer _ exe=流体。遗嘱执行人(地点)
#定义一个加载图像函数
定义加载图像(路径):#加载一张图片,并调整为100*100
img=桨。数据集。形象。load _ and _ transform(path,100,100,False).astype("float32 ")
img=img/255.0#归一化处理
返回图片
infer_imgs=[]#图像数据列表
test_img="apple.png"#待预测图像路径
infer _ imgs。追加(load _ image(test _ img))#加载图像数据,添加至列表
infer _ imgs=numpy。array(infer _ imgs)#!转换为排列
#加载模型
[推断程序,馈送目标名称,获取目标]=
流体。io。加载_推理_模型(模型_保存_目录,推理_执行)
#显示原始图片
img=Image.open(test_img)#打开原始图片
plt.imshow(img)#显示原始图片
plt.show()
#执行预测
结果=infer_exe.run(infer_program,
feed={ feed _ target _ names[0]:infer _ imgs },
获取列表=获取目标)
打印(结果)#结果为数组,包含每个类别的概率
结果=numpy。arg max(results[0])#获取最大概率的索引
对于k,name_dict.items()中的五:#根据字典获取预测结果的名字
如果结果==v:
打印("预测结果:",k)
数据集的话还是建议联系一下我,我同事可以把B站的博主推给你,观看视频来一遍可能更直观
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。