大家好,给大家分享一下python训练好的模型保存py后调用,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!
Source code download: 本文相关源码
以图像识别为例
有时候我们可以用别人训练好的模型来进行图像处理,那么如何使用呢,这里就以Keras为例
我的配置:
- Win10
- 笔记本自带的MX250显卡
- CUDA10.1+TF 2.3.2
- VSCode
程序的设计
会使用到的函数和库,先导入,主要的还是os和numpy和keras以及Pillow
from keras.models import load_model
import numpy as np
from keras.preprocessing import image
from keras.preprocessing.image import load_img
from PIL import ImageFilter
from PIL import Image
import cv2
import os
import keyboard
会使用到的几个参数主要有输入目录,输出目录,权重所在的目录,而在几个参数中,输入到神经网络的图像的预处理大小,必须要知道,比如常用的是32*32还有64*64,以及100*100和150*150
PHOTO_SIZE = 120 #对图片大小进行限制,低于120KB的抛弃
test_path = r'E:\样本图片 GroupImage\Group\Imageo' # 目标
weight_path = r'C:\code\model\CHKAnimal.h5' #权重文件
outpath = r'C:\code\检测到的图片3' #输出目录
re_x = 64 #输入到神经网络中的文件的大小
加载模型,使用到的函数有load_model;文件这边我们要通过操作os函数来把工作目录变化到输入图片的目录
model = load_model(weight_path)
files = os.listdir(test_path)
os.chdir(test_path)
因为想要统计下有多少图片被处理以及总共多少图片所以设置两个计数器,其中i是处理的图片
i = 0
allpic = 0
通过一个for循环,遍历文件夹,因为这里的文件是不做筛选的,所以我们要自行的筛选一下图片的格式防止出错
for file in files:
# 加载图像,只加载可以识别的类型的文件
if(file.split('.')[1] == "jpg"
or file.split('.')[1] == "bmp"
or file.split('.')[1] == "png"
or file.split('.')[1] == "jpeg"
or file.split('.')[1] == "gif"):
然后图片我们需要进行预先处理再输入到神经网络,首先是转换成RGB通道,因为有的图片可能是PNG,为RGBA(多一个透明度通道),另外就是缩放到设计的大小,这也是一开始我们设置的参数
img = Image.open(file)
if img.mode != 'RGB': #如果不是RGB是其他的就转换成RGB
img = img.convert("RGB")
img_origin = img
img = img.resize((re_x,re_x), Image.ANTIALIAS) #缩放到事先指定的大小
img = np.expand_dims(img, axis=0)
然后就可以获取预测值了
predictions = model.predict(img) #获取预测值
获取后,就是判断图片以及文件操作,我在测试时候用的是一个二分类的模型,输出预测值是数组,而我期望获取的是预测值1代表的文件,所以进行大小的判断后保存到我指定文件夹中,后删除原本文件
allpic += 1 #张数统计
if(predictions[0][1]>predictions[0][0] #如果分类1的预测值大于分类0并且文件大小超过设置值
and os.path.getsize(file)>PHOTO_SIZE*1024):
print(file,"predict:", predictions) #打印出预测值
img_origin.save(os.path.join(outpath,file)) #保存文件
os.remove(file) #删除原先的图片
i+=1
整个程序结束后,输出统计值,这个是个人兴趣
print("【Check Out : ",i)
print("【Scaned Picture : ",allpic)
print("【Percent:",i/allpic)
所有的代码如下
主要思想就是,加载模型,判断文件,转换格式和缩小图片,过神经网络,继而处理预测值对应图片
from keras.models import load_model
import numpy as np
from keras.preprocessing import image
from keras.preprocessing.image import load_img
from PIL import ImageFilter
from PIL import Image
import cv2
import os
import keyboard
PHOTO_SIZE = 120
test_path = r'E:\样本图片 GroupImage\Group\Imageo' # 目标
weight_path = r'C:\code\model\CHKAnimal.h5' #权重文件
outpath = r'C:\code\检测到的图片3' #输出目录
re_x = 64 #输入到神经网络中的文件的大小
# 加载权重
model = load_model(weight_path)
files = os.listdir(test_path)
os.chdir(test_path)
i = 0
allpic = 0
for file in files:
# 加载图像,只加载可以识别的类型的文件
if(file.split('.')[1] == "jpg"
or file.split('.')[1] == "bmp"
or file.split('.')[1] == "png"
or file.split('.')[1] == "jpeg"
or file.split('.')[1] == "gif"):
img = Image.open(file)
if img.mode != 'RGB': #如果不是RGB是其他的就转换成RGB
img = img.convert("RGB")
img_origin = img
img = img.resize((re_x,re_x), Image.ANTIALIAS) #缩放到事先指定的大小
img = np.expand_dims(img, axis=0)
predictions = model.predict(img) #获取预测值
if(not os.path.exists(outpath)): #如果输出文件夹不存在就创建
os.makedirs(outpath)
allpic += 1 #张数统计
if(predictions[0][1]>predictions[0][0] #分类1(是动漫图片)的可能性更大并且文件大小超过设置值
and os.path.getsize(file)>PHOTO_SIZE*1024):
print(file,"predict:", predictions) #打印出预测值
img_origin.save(os.path.join(outpath,file)) #保存文件
os.remove(file) #删除原先的图片
i+=1
print("【Check Out : ",i)
print("【Scaned Picture : ",allpic)
print("【Percent:",i/allpic)
后面说明如何打包成EXE