文章目录

  • 1.数据处理
    • 1)数据shuffle
    • 2)TFRecord
    • 3)TextLineDataset方式
    • 4)from_generator方法
  • 2.建模方法
    • 例子
  • 3.Baseline构建
    • 数据处理
    • 数据读取

1.数据处理

1)数据shuffle

2)TFRecord

3)TextLineDataset方式



4)from_generator方法



2.建模方法


例子



3.Baseline构建

数据处理

import json
import os
import datetime as dt
from tqdm import tqdm
import pandas as pd
import numpy as np# label
def f2cat(filename: str) -> str:return filename.split('.')[0]# 读取文件,label变成list
class Simplified():def __init__(self, input_path='./input'):self.input_path = input_pathdef list_all_categories(self):files = os.listdir(self.input_path)return sorted([f2cat(f) for f in files], key=str.lower)def read_training_csv(self, category, nrows=None, usecols=None, drawing_transform=False):df = pd.read_csv(os.path.join(self.input_path, category + '.csv'),nrows=nrows, parse_dates=['timestamp'], usecols=usecols)if drawing_transform:df['drawing'] = df['drawing'].apply(json.loads)return dfstart = dt.datetime.now()
# 加载数据路径
s = Simplified('./data/')
NCSVS = 100
# 加载类别
categories = s.list_all_categories()
print(len(categories))# tqdm显示进度
for y, cat in tqdm(enumerate(categories)):df = s.read_training_csv(cat)df['y'] = y# 构建cv,知道数据属于哪个文件df['cv'] = (df.key_id // 10 ** 7) % NCSVS # 100 # 将csv文件的1/100的数据写到里面,for循环for k in range(NCSVS):filename = './shuffle_data/train_k{}.csv'.format(k)chunk = df[df.cv == k]chunk = chunk.drop(['key_id'], axis=1)if y == 0:chunk.to_csv(filename, index=False)else:chunk.to_csv(filename, mode='a', header=False, index=False)#对csv数据打乱,进行压缩
for k in tqdm(range(NCSVS)):filename = './shuffle_data/train_k{}.csv'.format(k)if os.path.exists(filename):df = pd.read_csv(filename)df['rnd'] = np.random.rand(len(df))df = df.sort_values(by='rnd').drop('rnd', axis=1)df.to_csv('./shuffle_data_gzip/train_k{}.csv.gz'.format(k), compression='gzip', index=False)os.remove(filename)
print(df.shape)end = dt.datetime.now()
print('Latest run {}.\nTotal time {}s'.format(end, (end - start).seconds))

数据读取

import glob
import tensorflow as tf
import numpy as np
import pandas as pd
import os
import cv2
import json
import matplotlib.pyplot as plt
os.environ['CUDA_VISIBLE_DEVICES']='1'# 每一个csv.gz文件读取 -> y已经ok ->drawing 如何处理# 单通道-黑白照片
def draw_cv2(raw_strokes, size=256, lw=6, time_color=True):img = np.zeros((BASE_SIZE, BASE_SIZE), np.uint8) #画板for t, stroke in enumerate(raw_strokes):for i in range(len(stroke[0]) - 1):color = 255 - min(t, 10) * 13 if time_color else 255_ = cv2.line(img, (stroke[0][i], stroke[1][i]),(stroke[0][i + 1], stroke[1][i + 1]), color, lw)if size != BASE_SIZE:return cv2.resize(img, (size, size))else:return img# RGB图片
def draw_cv2(raw_strokes, size=256, lw=6):img = np.zeros((BASE_SIZE, BASE_SIZE, 3), np.uint8)for t, stroke in enumerate(raw_strokes):points_count = len(stroke[0]) - 1grad = 255//points_countfor i in range(len(stroke[0]) - 1):_ = cv2.line(img, (stroke[0][i], stroke[1][i]), (stroke[0][i + 1], stroke[1][i + 1]), (255, 255 - min(t,10)*13, max(255 - grad*i, 20)), lw)if size != BASE_SIZE:img = cv2.resize(img, (size, size))return imgclass DataLoader(object):def __init__(self, resize_height=64, resize_width=64, batch_size=512, fileList=None, size=256, lw=6):self.resize_height = resize_height #图片高self.resize_height = resize_height #图片宽self.batch_size = batch_size #batchself.fileList = fileList #文件数据self.size = size #画图时图片大小self.lw = lwdef __call__(self):def _generator(size,lw):while True: #for filename in np.random.permutation(self.fileList):df = pd.read_csv(filename)df['drawing'] = df['drawing'].apply(json.loads)x = np.zeros((len(df), size, size))for i, raw_strokes in enumerate(df.drawing.values):x[i] = draw_cv2(raw_strokes, size=size, lw=lw)x = x / 255.x = x.reshape((len(df), size, size, 1)).astype(np.float32)y = tf.keras.utils.to_categorical(df.y, num_classes=n_labels)for x_i,y_i in zip(x,y):yield (x_i,y_i)dataset = tf.data.Dataset.from_generator(generator=_generator,output_types=(tf.dtypes.float32, tf.dtypes.int32),output_shapes=((self.resize_height, self.resize_height, 1), (340, )),args=(self.size, self.lw))dataset = dataset.prefetch(buffer_size=10240)dataset = dataset.shuffle(buffer_size=10240).batch(self.batch_size)return dataset    DP_DIR = './shuffle_data_gzip/'BASE_SIZE = 256
n_labels = 340
np.random.seed(seed=1987)
size = 64
batchsize = 1024
# 利用正则读取文件路径
fileList = glob.glob("./shuffle_data_gzip/*.csv.gz")
train_fileList = fileList[:-1]
val_fileList = fileList[-1:]
train_ds = DataLoader(resize_height=64, resize_width=64, batch_size=batchsize, fileList=train_fileList, size=size, lw=6)()
val_ds = DataLoader(resize_height=64, resize_width=64, batch_size=batchsize, fileList=val_fileList, size=size, lw=6)()    # 建模
inputs = tf.keras.layers.Input(shape=(size, size, 1))
# include_top不用全连接层
base_model = tf.keras.applications.MobileNet(input_shape=(size, size, 1), include_top=False, weights=None, classes=n_labels)
x = base_model(inputs)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
predictions = tf.keras.layers.Dense(n_labels, activation='softmax')(x)
model = tf.keras.models.Model(inputs=inputs, outputs=predictions)model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.002), loss='categorical_crossentropy',metrics=[tf.keras.metrics.CategoricalCrossentropy(), tf.keras.metrics.CategoricalAccuracy(), tf.keras.metrics.TopKCategoricalAccuracy(k=3,name='top_3_categorical_accuracy')])# 训练
callbacks = [tf.keras.callbacks.ReduceLROnPlateau(monitor='val_top_3_categorical_accuracy', factor=0.75, patience=3, min_delta=0.001,mode='max', min_lr=1e-5, verbose=1),tf.keras.callbacks.ModelCheckpoint('model_all.h5', monitor='val_top_3_categorical_accuracy', mode='max', save_best_only=True,save_weights_only=True),
]model.fit(train_ds, epochs=50, verbose=1,steps_per_epoch=48500, #一个epoch用多少个step,为了快速迭代:可以设置1000。validation_data = val_ds,validation_steps = 400,callbacks = callbacks
)# 验证集测试
def apk(actual, predicted, k=3):"""Source: https://github.com/benhamner/Metrics/blob/master/Python/ml_metrics/average_precision.py"""if len(predicted) > k:predicted = predicted[:k]score = 0.0num_hits = 0.0for i, p in enumerate(predicted):if p in actual and p not in predicted[:i]:num_hits += 1.0score += num_hits / (i + 1.0)if not actual:return 0.0return score / min(len(actual), k)def mapk(actual, predicted, k=3):"""Source: https://github.com/benhamner/Metrics/blob/master/Python/ml_metrics/average_precision.py"""return np.mean([apk(a, p, k) for a, p in zip(actual, predicted)])

MobileNet论文参考

from glob import glob
import cv2
import os
import tensorflow as tf
import pandas as pd
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2"fileList = glob("./shuffle_data_gzip/*.csv.gz") def draw_cv2(raw_strokes,BASE_SIZE=256, size=256, lw=6):img = np.zeros((BASE_SIZE, BASE_SIZE), np.uint8)for stroke in raw_strokes:for i in range(len(stroke[0]) - 1):_ = cv2.line(img, (stroke[0][i], stroke[1][i]), (stroke[0][i + 1], stroke[1][i + 1]), 255, lw)if size != BASE_SIZE:return cv2.resize(img, (size, size)) else:return imgtfrecord_file = "./tfrecord_data/train.tfrecords"with tf.io.TFRecordWriter(tfrecord_file) as writer:for filename in fileList[:1]:df = pd.read_csv(filename)df['drawing'] = df['drawing'].apply(json.loads)for row in range(df.shape[0]):drawing = df.loc[row,'drawing']img = draw_cv2(drawing,BASE_SIZE=128, size=128, lw=6)img = img.tostring()label = df.loc[row,'y']# 建立 tf.train.Feature 字典feature = {                             'image': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img])),  # 图片是一个 Bytes 对象'label': tf.train.Feature(int64_list=tf.train.Int64List(value=[label]))   # 标签是一个 Int 对象}example = tf.train.Example(features=tf.train.Features(feature=feature)) # 通过字典建立 Examplewriter.write(example.SerializeToString())   # 将Example序列化并写入 TFRecord 文件# 读取 TFRecord 文件
raw_dataset = tf.data.TFRecordDataset(tfrecord_file)
# 定义Feature结构,告诉解码器每个Feature的类型是什么
feature_description = { 'image': tf.io.FixedLenFeature([], tf.string),'label': tf.io.FixedLenFeature([], tf.int64),
}# 将 TFRecord 文件中的每一个序列化的 tf.train.Example 解码
def _parse_example(example_string): feature_dict = tf.io.parse_single_example(example_string, feature_description)image = tf.io.decode_raw(feature_dict['image'], tf.uint8)    # 解码JPEG图片image = tf.reshape(image, [128,128,1])image = tf.dtypes.cast(image,tf.float32)image = image / 255.0label = tf.one_hot(feature_dict['label'],depth=340)return image, labeldataset = raw_dataset.map(_parse_example)train_ds = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE).shuffle(buffer_size=tf.data.experimental.AUTOTUNE).batch(1024)class MobileNetModel(tf.keras.models.Model):def __init__(self, size, n_labels, **kwargs):super(MobileNetModel, self).__init__(**kwargs)# 预训练模型self.base_model = tf.keras.applications.MobileNet(input_shape=(size, size, 1), include_top=False, weights=None, classes=n_labels)self.flatten = tf.keras.layers.Flatten()self.dense = tf.keras.layers.Dense(1024, activation='relu')self.outputs =  tf.keras.layers.Dense(n_labels, activation='softmax')def call(self, inputs):x = self.base_model(inputs)x = self.flatten(x)x = self.dense(x)output_ = self.outputs(x)return output_model = MobileNetModel(size=128,n_labels=340)loss_object = tf.keras.losses.CategoricalCrossentropy()learning_rate = 0.001
optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)train_loss = tf.keras.metrics.Mean(name='train_loss')
train_accuracy = tf.keras.metrics.CategoricalAccuracy(name='train_accuracy')
train_top3_accuracy = tf.keras.metrics.TopKCategoricalAccuracy(k=3,name='train_top_3_categorical_accuracy')test_loss = tf.keras.metrics.Mean(name='test_loss')
test_accuracy = tf.keras.metrics.CategoricalAccuracy(name='test_accuracy')
test_top3_accuracy = tf.keras.metrics.TopKCategoricalAccuracy(k=3,name='test_top_3_categorical_accuracy')# @tf.function
def train_one_step(images, labels):with tf.GradientTape() as tape:predictions = model(images)loss = loss_object(labels, predictions)gradients = tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))train_loss(loss)train_accuracy(labels, predictions)train_top3_accuracy(labels, predictions)def val_one_step(images, labels):predictions = model(images)t_loss = loss_object(labels, predictions)test_loss(t_loss)test_accuracy(labels, predictions)test_top3_accuracy(labels, predictions)EPOCHS=10
for epoch in range(EPOCHS):# 在下一个epoch开始时,重置评估指标train_loss.reset_states()train_accuracy.reset_states()train_top3_accuracy.reset_states()test_loss.reset_states()test_accuracy.reset_states()test_top3_accuracy.reset_states()for step,(images, labels) in enumerate(train_ds):train_one_step(images, labels)if step % 200 == 0:print("step:{0}; Samples:{1}; Train Loss:{2}; Train Accuracy:{3},Train Top3 Accuracy:{4}".format(step, (step + 1) * 1024, train_loss.result(), train_accuracy.result()*100, train_top3_accuracy.result()*100))template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy{}'
print(template.format(epoch + 1,train_loss.result(),train_accuracy.result() * 100,train_top3_accuracy()*100,test_loss.result(),test_accuracy.result() * 100,test_top3_accuracy()*100))

深度学习15-Google涂鸦识别挑战项目(下)相关推荐

  1. 【人工智能项目】深度学习实现汉字书法识别

    [人工智能项目]深度学习实现汉字书法识别 背景介绍 竞赛数据提供100个汉字书法单字,包括碑帖,手写书法,古汉字等.图片全部为单通道宽度jpg,宽高不定. 数据集介绍 训练集:每个汉字400张图片,共 ...

  2. 基于深度学习的命名实体识别研究综述——论文研读

    基于深度学习的命名实体识别研究综述 摘要: 0引言 1基于深度学习的命名实体识别方法 1.1基于卷积神经网络的命名实体识别方法 1.2基于循环神经网络的命名实体识别方法 1.3基于Transforme ...

  3. 【深度学习】OCR文本识别

    OCR文字识别定义 OCR(optical character recognition)文字识别是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,然后用字符识别方法将形状翻译成计算机文字的过程: ...

  4. NLP入门(五)用深度学习实现命名实体识别(NER)

    前言   在文章:NLP入门(四)命名实体识别(NER)中,笔者介绍了两个实现命名实体识别的工具--NLTK和Stanford NLP.在本文中,我们将会学习到如何使用深度学习工具来自己一步步地实现N ...

  5. 一种基于深度学习的增值税发票影像识别系统

    一种基于深度学习的增值税发票影像识别系统-专利技术交底书 缩略语和关键术语定义 1.卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构 ...

  6. 基于深度学习的人脸性别识别系统(含UI界面,Python代码)

    摘要:人脸性别识别是人脸识别领域的一个热门方向,本文详细介绍基于深度学习的人脸性别识别系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面.在界面中可以选择人脸图片.视频进行检 ...

  7. 一文掌握基于深度学习的人脸表情识别开发(基于PaddlePaddle)

    目录 一.概述 1.1 表情分类 1.2 表情识别方法 1.2.1 人工特征方法 1.2.2 神经网络方法 1.3 本文实现 二.环境准备 2.1 安装PaddlePaddle 2.2 安装Paddl ...

  8. 表单识别(四)-基于深度学习的表单识别)-OCR

    (论文研读后,感觉有用的一些笔记,主要是给自己记录) 论文:熊雨点,基于深度学习的表单识别系统的研究与实现 基于深度学习的表单识别 前言: 文档检测方法: 基于扩张卷积残差网络的表单文档定位方法: 扩 ...

  9. 浙江大学《深度学习与行人重识别》课程课件

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要3分钟 Follow小博主,每天更新前沿干货 课程介绍 该课程为浙江大学罗浩博士于2018年10月录制的<基于深度学习和行人重识别> ...

  10. opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统

    教你从零开始做一个基于深度学习的交通标志识别系统 基于Yolo v3的交通标志识别系统及源码 自动驾驶之--交通标志识别 在本文章你可以学习到如何训练自己采集的数据集,生成模型,并用yolo v3算法 ...

最新文章

  1. python四大软件-Python未来可能面临的四大转折
  2. 对账 java 龙果支付,龙果支付开源项目对账接口说明
  3. PHP使用GD库封装验证码类
  4. 如何划分man文档的章节
  5. k8s往secret里导入证书_K8S之Secret
  6. python3进阶_Python3 进阶教程 2020全新版
  7. JavaScript数组sort()方法小结
  8. Rust中Box、Rc、Arc、Cell、RefCell、Cow简介
  9. 一步一步写算法(之链表逆转)
  10. centos7时间同步_基于 Canal 和 Kafka 实现 MySQL 的 Binlog 近实时同步
  11. 矩池云如何使用 conda create 创建纯净的 Python3.6 环境?
  12. 本地apk安装是什么意思_Sony电视安装第三方播放器
  13. mysql修改表只读属性_VF设置的疑问
  14. 使用JFlash往Nordic nRF系列芯片烧写程序
  15. 批量修改横断面图高程范围
  16. Denoise: from image to point cloud
  17. Linux实用命令杂集
  18. matlab 关键路径函数,用线性规划建模(确定参数)关键路径法
  19. 程序员面试揭秘之程序员靠什么途径去美国工作?
  20. 目前住院病人主要由护士护理

热门文章

  1. linux用命令行来执行php程序
  2. 在InstallShield中发布单一的Setup.exe文件
  3. 转:Secure CRT 中文乱码问题解决
  4. 《构建之法》阅读笔记03
  5. 解决EasyDSS、EasyNVR流媒体RTMP、HLS(m3u8)、HTTP-FLV播放提示H5播放错误的问题
  6. Linux 怎么重启 mysql
  7. BitmapFactory.decodeResource(res, id); 第一个参数跟第二个参数有什么关系?
  8. opencl初探-sobel检测
  9. Android开发中Ant命令编译和APK签名的一些心得
  10. 两种改变 Windows Vista UI语言的途径