PowerSensorAI教程2-石头剪刀布-彩色数据预处理

要什么openmv,来试试我们的powersensor吧,深度学习-剪刀石头布!!

介绍

上一期的minist案例是为了让大家熟悉一下powersensor ai的整个流程,使用的数据集是google提供好的minist数据集,是灰度的、尺寸统一的。然而,实际的识别任务往往需要从不同的来源获取不同尺寸的原始图像,且一般是彩色。为了解决这个问题,本章主要介绍如何对收集的数据进行预处理,以及生成适合tensorflow训练的训练集,以及如何调用powersensor获取彩色的图片并进行识别。

这次的案例是一个大家熟知的小游戏,“石头剪刀布。。”,这个布要拉长音。

PC训练模型

数据集准备与预处理

本节使用数据集是google的石头剪刀布数据集,已经包含在我们的百度网盘下载包里。下载解压完在dataset目录下,可以看到:
在这里插入图片描述
除了minist这种封装好的数据集,更普遍的机器学习数据集(如本节的数据集)一般是以原图像文件分文件夹存放的形式提供,这样有两个优势,一个是便于压缩和分享,避免传输大体积文件;另一个是用户较容易添加自己的数据集,以及便于使用网络上下载的不同来源数据集的合并。但是,它也存在问题,深度网络训练时使用的数据集输入往往是尺寸一致并经过标准化、归一化操作的。因此,我们在获取完数据集后,需要对数据集进行预处理,主要解决以下问题

  • 原图像的存在分辨率的差异
  • 图像的标签和样本没有有机绑定(往往是一个标签的图片放一个文件夹)
  • 图像没有随机排列,不利于训练

为了解决上述问题,我们使用tensorflow的tf recorder来完成数据集的准备和预处理工作。

  1. 首先,包含一些重要的头文件和定义参数:
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
  1. 使用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()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值