自定义数据集、模型,用QT、c++调用tensorflow编译好的pb模型的图像分类项目
第一步:本文
第二步:读取自定义的TFRecord数据集,训练卷积网络并保存pb模型
第三步:opencv读取自定义的pb模型,自定义softmax,argmax函数输出图像分类结果
流程图
参考如下:
Windows下用c++来调用tensorflow训练好的模型
flower_photos数据集
flower数据集下载
flower_photos文件夹包含了5个文件夹,每一个子文件夹的名称为一种花的名称,代表了不同的类别(daisy雏菊:633张,dandelion蒲公英:898张,roses玫瑰:641张,sunflowers向日葵:699张,tulips郁金香:799张)。平均每一种花都有734张图片,每一张图片都是RGB色彩模式的,大小也不相同。这里用flower数据集可以模拟实际项目。
保存为tfrecord文件
注意flower_photos文件夹下的txt文件要删掉,不然会报错。
1.get_files函数得到的实际是图片的文件名列表和标签列表。如果不打乱排列的话,最后划分数据集和验证集的时候会发现是按顺序划分的。这里我们为了保证数据集和验证集的分布,开始时先按比例划分每个文件夹。比如5个文件夹,每个文件夹100张图,我们先每个文件夹取80张,5个80张合起来就是训练集,5个20张合起来就是验证集。
2.image2tfrecord中可以看到按文件名读取图像后,图像resize大小为100了。
3.最后保存的训练集和验证集的名称分别是flower_tra100.tfrecords和flower_val100.tfrecords。
我们后面可能会用不同的模型训练,输入的张量大小也不尽相同。例如有的模型要求输入图像是224x224x3的,那我们这里在image2tfrecord函数中图像resize大小改成224x224,生成的文件名改成flower_tra224.tfrecords和flower_val224.tfrecords。生成的文件可以重复使用,适应不同的需求。
"""
这里的图片是采用的花朵集的图片 ,先将图片转化成tfrecorder格式。
这里有5种花朵的图片,每种花朵都放在同一个文件夹下
"""
import os
import numpy as np
from PIL import Image
import tensorflow as tf
def get_files(file_dir, ratio = 0.8):
"""得到训练集和验证集的图像列表和标签列表,默认划分比例为0.8"""
daisy = []
label_daisy = []
dandelion = []
label_dandelion = []
roses = []
label_roses = []
sunflowers = []
label_sunflowers = []
tulips = []
label_tulips = []
for file in os.listdir(file_dir):
pp=os.path.join(file_dir,file)
for pic in os.listdir(pp):
pic_path=os.path.join(pp,pic)
if file=="daisy":
daisy.append(pic_path)#读取所在位置名称
label_daisy.append(0)#labels标签为0
elif file=="dandelion":
dandelion.append(pic_path)#读取所在位置名称
label_dandelion.append(1)#labels标签为1
elif file=="roses":
roses.append(pic_path)#读取所在位置名称
label_roses.append(2)#labels标签为2
elif file=="sunflowers":
sunflowers.append(pic_path)#读取所在位置名称
label_sunflowers.append(3)#labels标签为3
elif file=="tulips":
tulips.append(pic_path)#读取所在位置名称
label_tulips.append