要什么openmv,来试试我们的powersensor吧,深度学习-剪刀石头布!!
介绍
上一期的minist案例是为了让大家熟悉一下powersensor ai的整个流程,使用的数据集是google提供好的minist数据集,是灰度的、尺寸统一的。然而,实际的识别任务往往需要从不同的来源获取不同尺寸的原始图像,且一般是彩色。为了解决这个问题,本章主要介绍如何对收集的数据进行预处理,以及生成适合tensorflow训练的训练集,以及如何调用powersensor获取彩色的图片并进行识别。
这次的案例是一个大家熟知的小游戏,“石头剪刀布。。”,这个布要拉长音。
-
案例下载地址:
链接:https://pan.baidu.com/s/14c1HMKiTjMRll-jyWN7PCQ
提取码:jl1f -
虚拟机下载地址:
链接:https://pan.baidu.com/s/1mdZV9jn74RCxKp_pUh4mew
提取码:623k -
powersensor镜像下载地址:
链接:https://pan.baidu.com/s/11gkYUFSI25sPDn0CSw4zDQ
提取码:gvsr
PC训练模型
数据集准备与预处理
本节使用数据集是google的石头剪刀布数据集,已经包含在我们的百度网盘下载包里。下载解压完在dataset目录下,可以看到:
除了minist这种封装好的数据集,更普遍的机器学习数据集(如本节的数据集)一般是以原图像文件分文件夹存放的形式提供,这样有两个优势,一个是便于压缩和分享,避免传输大体积文件;另一个是用户较容易添加自己的数据集,以及便于使用网络上下载的不同来源数据集的合并。但是,它也存在问题,深度网络训练时使用的数据集输入往往是尺寸一致并经过标准化、归一化操作的。因此,我们在获取完数据集后,需要对数据集进行预处理,主要解决以下问题
- 原图像的存在分辨率的差异
- 图像的标签和样本没有有机绑定(往往是一个标签的图片放一个文件夹)
- 图像没有随机排列,不利于训练
为了解决上述问题,我们使用tensorflow的tf recorder来完成数据集的准备和预处理工作。
- 首先,包含一些重要的头文件和定义参数:
import cv2
import numpy as np
import os
import tensorflow as tf
from tensorflow import keras
import random
import time
import matplotlib.pyplot as plt
# 有GPU才能打印
gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
cpus = tf.config.experimental.list_physical_devices(device_type='CPU')
print(gpus, cpus)
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
# 让Matplotlib正确显示中文
import matplotlib as mpl
mpl.style.use('seaborn')
mpl.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
mpl.rcParams['axes.unicode_minus']=False # 正常显示负号
# 训练用的图像尺寸
img_size_net = 128
# 训练的batch大小
batch_size = 32
# 数据库路径
dataset_path = '../dataset/'
# 存放过程和结果的路径
run_path = './run/'
if not os.path.exists(run_path):
os.mkdir(run_path)
wordlist = ['布', '石头', '剪刀']
sorts_pathes = ['paper', 'rock', 'scissors']
# 存放转换后的tf数据集的路径
dataset_tf_path_train = run_path + 'datasetTfTrain.tfrecords'
dataset_tf_path_test = run_path + 'datasetTfTest.tfrecords'
# # 存放转换后的tf数据集的路径
# dataset_tf_path = run_path + 'flowersTf.tfrecords'
dataset_nums = 2520
testSet_nums = 372
- 使用tf-recorder生成数据集
def generate_dataset(raw_data_path, dataset_path):
tick_begin = time.time()
img_cnt = int(0)
label_cnt = int(0)
with tf.io.TFRecordWriter(dataset_path) as writer:
for sort_path in sorts_pathes:
exp_list = os.listdir(raw_data_path + sort_path)
for img_name in exp_list:
img_path = raw_data_path + sort_path + "/" + img_name
img = cv2.imread(img_path)
img_scale = cv2.resize(img,(img_size_net, img_size_net), interpolation = cv2.INTER_CUBIC)
if not img is None:
feature = {
'img1':tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_scale.tostring()])),
'label':tf.train.Feature(int64_list=tf.train.Int64List(value=[label_cnt]))
# 'label':tf.train.Feature(int64_list=tf.train.Int64List(value=[label_cnt]))
}
example = tf.train.Example(features=tf.train.Features(feature=feature))
writer.write(example.SerializeToString())
# 每隔50张打印一张图片
if img_cnt % 100 == 0:
print('The ', str(img_cnt), ' image')
plt.imshow(cv2.cvtColor(img_scale, cv2.COLOR_BGR2RGB))
plt.show()