经过前面的工作,两部分的数据集都已经准备好了,接下来就将原始的数据集划分为训练集和验证集两部分。在这里,每一类图片的验证集数量都相同,等于总数最少的那一类图片的10%,比如说在80类图片中,数量最少的那类图片为100张,那么每类图片的验证集数量都等于10张。

训练集、验证集划分程序如下,文本部分和图像部分共用相同的划分函数,代码如下。

import os
import shutil
import collections
import math#创建文件夹的函数,路径参数为列表形式
def mkdir_if_not_exist(dir_lst):try:os.mkdir('/'.join(dir_lst[:2]))except FileExistsError:passtry:os.mkdir('/'.join(dir_lst[:3]))except FileExistsError:passtry:os.mkdir('/'.join(dir_lst))except FileExistsError:pass#训练集、验证集划分函数
def reorg_train_valid(data_dir, train_dir, input_dir, valid_ratio, idx_label):# 训练集中数量最少一类的物品的样本数min_n_train_per_label = (collections.Counter(idx_label.values()).most_common()[:-2:-1][0][1])# 验证集中每类物品的样本数n_valid_per_label = math.floor(min_n_train_per_label * valid_ratio)label_count = {}for train_file in os.listdir(os.path.join(data_dir, train_dir)):idx = train_file.split('.')[0]label = idx_label[idx]mkdir_if_not_exist([data_dir, input_dir, 'Train_valid', label])shutil.copy(os.path.join(data_dir, train_dir, train_file),os.path.join(data_dir, input_dir, 'Train_valid', label))if label not in label_count or label_count[label] < n_valid_per_label:mkdir_if_not_exist([data_dir, input_dir, 'Valid', label])shutil.copy(os.path.join(data_dir, train_dir, train_file),os.path.join(data_dir, input_dir, 'Valid', label))label_count[label] = label_count.get(label, 0) + 1else:mkdir_if_not_exist([data_dir, input_dir, 'Train', label])shutil.copy(os.path.join(data_dir, train_dir, train_file),os.path.join(data_dir, input_dir, 'Train', label))def reorg_data(data_dir, label_file, train_dir, input_dir, valid_ratio):# 读取训练数据标签with open(os.path.join(data_dir, label_file), 'r') as f:# 跳过文件头行(栏名称)lines = f.readlines()[1:]tokens = [l.rstrip().split(',') for l in lines]idx_label = dict(((idx, label) for idx, label in tokens))reorg_train_valid(data_dir, train_dir, input_dir, valid_ratio, idx_label)

接下来先进行文本图片部分的划分,程序如下

data_dir ='D:/data_text'   #存储根目录,根据自己的情况更改
#标签文件和原始数据集目录
label_file, train_dir= 'labels.csv', 'text_captcha'
#数据划分后存储的根目录以及划分比例
input_dir, valid_ratio = 'Train_Valid', 0.1
reorg_data(data_dir, label_file, train_dir, input_dir, valid_ratio)

上面的程序运行完之后,在Train_Valid文件夹下会产生如下图所示的3个文件夹。
其中Train文件夹中包含的是训练集,Valid文件夹包含的是验证集,而Train_valid文件夹包含的是所有数据,即训练集和验证集的总和。
文本数据增广:
因为我训练的时候文本部分的数据集较少,所以做了一些数据增广操作,放出来供大家参考,看情况是否使用。注意,这部分的数据增广仅针对文本图片!!
文本的数据增广操作,主要是对文字进行扭曲,包括正弦扭曲、余弦扭曲以及鱼眼扭曲(凸透镜效果)
文本数据增广程序如下

import cv2
import math
import numpy as np
import hashlib
import io, os
from PIL import Image
import random
import matplotlib.pyplot as plt#正余弦扭曲
def sin_cos_change(img):r = random.choice([6, 8, 10])  #正余弦幅度,代表扭曲程度,r越大,扭曲越大,在这里进行小幅度扭曲即可row, col, channel = img.shape[0], img.shape[1], img.shape[2]sin_img = np.zeros([row,col,channel], dtype=np.uint8)cos_img = np.zeros([row, col, channel], dtype=np.uint8)def helper(func, new_img):for j in range(col):temp = r + r * func(j*math.pi*2/col)for i in range(int(temp), int(row+temp-2*r)):m = int((i-temp) * row / (row-r))if m >= row:m = row - 1if m < 0:m = 0new_img[i,j,:] = img[m,j,:]for k in range(int(temp)):new_img[k,j] = (255,255,255)for n in range(int(row+temp-2*r), row):new_img[n,j] = (255,255,255)return new_imgsin_img = helper(math.sin, sin_img)cos_img = helper(math.cos, cos_img)return sin_img, cos_img#鱼眼扭曲,效果不太好,在实际的增广操作中,并未使用,也放出来参考参考
#算法参考链接:https://blog.csdn.net/u010736662/article/details/89388972?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.controldef fish_eye_change(img):row, col, channel = img.shape[0], img.shape[1], img.shape[2]new_img = np.zeros([row,col,channel], dtype=np.uint8)center_x, center_y = row/2, col/2radius = min(center_x, center_y)  #代表扭曲程度for i in range(row):for j in range(col):dis = ((i-center_x)**2 + (j-center_y)**2)new_dis = math.sqrt(dis)new_img[i,j,:] = img[i,j,:]if dis <= radius**2:new_i = np.int(np.floor(new_dis*(i-center_x)/radius+center_x))new_j = np.int(np.floor(new_dis*(j-center_y)/radius+center_y))new_img[i,j,:] = img[new_i, new_j,:]return new_img#保存扩增的文本图片
def save_img(path, img):img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))byter = io.BytesIO()img.save(byter, format='JPEG')#用图片的哈希值为其命名path = os.path.join(path, hashlib.md5(byter.getvalue()).hexdigest() + '.jpg')img.save(path)print(path, '保存成功!')#base_path是上面划分数据集所使用的上层目录
base_path = 'D:\data_text\Train_Valid'
for each in ['Train', 'Valid']: #分别对训练集和验证集的文本图片进行扭曲增广items = os.listdir(os.path.join(base_path, each))for item in items:save_path = os.path.join(base_path, each, item)imgs = os.listdir(save_path)for img in imgs:sin_img, cos_img = sin_cos_change(cv2.imread(os.path.join(save_path, img)))save_img(save_path, sin_img)save_img(save_path, cos_img)

接下来开始处理图形验证码的数据。在第一篇博客中爬那些图片的时候,对每一类图片是分文件夹保存的,为了复用上面划分训练集、验证集的代码,先把每个文件夹下的图片都移动到一个文件夹里,然后把这个文件夹和标签文件labels.csv放在同一个目录下,就可复用上述代码,只需改一下文件路径即可。
在第三篇博客中,80类图形验证码的文件夹以及labels.csv文件都放在cap_data文件夹下,。那么,先创建data_picture文件夹,作为根目录,然后在这个文件夹下再创建一个pic_captcha文件夹,用以不区分的保存所有图片;同时把labels文件也移动到data_picture文件夹下。程序如下。

import os
import shutilold_path = 'D:/cap_data/'
new_path = 'D:/data_picture/'
os.mkdir(new_path)
os.mkdir(new_path+'pic_captcha')#将labels.csv复制到data_picture文件夹下
shutil.copy(old_path+'labels.csv', new_path+'labels.csv')items = os.listdir(old_path)
items.remove('labels.csv')for item in items:for each in os.listdir(old_path+item):shutil.copy(old_path+item+'/'+each, new_path+'pic_captcha/'+each)

完成数据移动之后,就能利用前面的代码划分训练集和验证集,只需要把data_dir、train_dir这两个变量的值改成相应的名字即可。
至此,就完成了前期所有的准备工作,接下来可以开始正式训练模型了,下一篇博客再见。
祝各位学习愉快!

利用神经网络识别12306验证码——(四)数据增广以及训练集、验证集的划分相关推荐

  1. csv数据,已区分训练集和验证集,需要用r语言建立随机森林回归模型,计算模型精度,包括训练集和验证集的r方、mae、rmse

    csv数据,已区分训练集和验证集,需要用r语言建立随机森林回归模型,计算模型精度,包括训练集和验证集的r方.mae.rmse #读取训练集 train <- read.csv("tra ...

  2. 【深度学习】基于深度学习的数据增广技术一览

    ◎作者系极市原创作者计划特约作者Happy 周末在家无聊,偶然兴心想对CV领域常用的数据增广方法做个简单的调研与总结,重点是AI时代新兴的几种反响还不错的方法.各种第三方与官方实现代码等.那么今天由H ...

  3. Pytorch 数据增广(Data Augmentation)

    Pytorch 数据增广(Data Augmentation) 0. 环境介绍 环境使用 Kaggle 里免费建立的 Notebook 教程使用李沐老师的 动手学深度学习 网站和 视频讲解 小技巧:当 ...

  4. 基于深度学习的数据增广技术一览

    周末在家无聊,偶然兴心想对CV领域常用的数据增广方法做个简单的调研与总结,重点是AI时代新兴的几种反响还不错的方法.各种第三方与官方实现代码等.那么今天由Happy来跟大家聊一聊深度学习中那些常用的数 ...

  5. 【深度学习】利用一些API进行图像数据增广

    [深度学习]利用一些API进行图像数据增广 文章目录 [深度学习]利用一些API进行图像数据增广 1 先送上一份最强的翻转代码(基于PIL) 2 Keras中的数据增强API种类概述 3 特征标准化 ...

  6. 计算机视觉的数据增广技术大盘点!附涨点神器,已开源!

    如果要把深度学习开发过程中几个环节按重要程度排个序的话,相信准备训练数据肯定能排在前几位.要知道一个模型网络被编写出来后,也只是一坨代码而已,和智能基本不沾边,它只有通过学习大量的数据,才能学会如何作 ...

  7. 炼丹手册——数据增广

    数据增广这个知识点放在炼丹手册里说,总感觉不太搭,不过看到bag of freebies这个词,心想也算是提高训练精度的一种手段,那就和其他knowledge躺在一起吧. 数据增广的目的是增加训练样本 ...

  8. 动手深度学习13——计算机视觉:数据增广、图片分类

    文章目录 一.数据增广 1.1 为何进行数据增广? 1.2 常见图片增广方式 1.2.1 翻转 1.2.2 切割(裁剪) 1.2.3 改变颜色 1.2.4 综合使用 1.3 使用图像增广进行训练 1. ...

  9. 【工大SCIR笔记】自然语言处理领域的数据增广方法

    点击上方,选择星标或置顶,每天给你送干货! 作者:李博涵 来自:哈工大SCIR 1.摘要 本文介绍自然语言处理领域的数据增广方法.数据增广(Data Augmentation,也有人将Data Aug ...

  10. 嵌入式AI —— 6. 为糖葫芦加糖,浅谈深度学习中的数据增广

    没有读过本系列前几期文章的朋友,需要先回顾下已发表的文章: 开篇大吉 集成AI模块到系统中 模型的部署 CMSIS-NN介绍 从穿糖葫芦到织深度神经网络 又和大家见面了,上次本程序猿介绍了CMSIS- ...

最新文章

  1. 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】
  2. php 的ob start,php ob_start()函数详解
  3. OpenCV4.5.x DNN + YOLOv5 C++推理
  4. 华视电子读卡器web开发_业界动态:华视电子官方微信公众号电子书架正式上线...
  5. 成功解决tensorboard调用events.out.tfevents文件得到网址出现No dashboards are active for the current data set问题
  6. 使用Docker部署SpringBoot+Vue博客系统
  7. 【推荐】技术人必看的音视频学习资源清单
  8. .NET Core with 微服务 - Elastic APM
  9. mono for android mysql_mono for android 自定义titleBar Actionbar 顶部导航栏 修改 样式 学习...
  10. php实现飘窗,JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)
  11. ubuntu18.04 出现 Command 'ifconfig' not found 问题的解决办法
  12. python中的matlibplot_python中如何用matlibplot画时间序列图?
  13. 程序员为什么要关注代码质量?
  14. 【精华版】cw2vec理论及其实现
  15. 虚拟机克隆后修改网络部分
  16. web 前端小记_1 :hasLayout
  17. 外篇 评相对论
  18. 经典面试题【老鼠喝水】
  19. 6-23 sdust-Java-可实现多种排序的Book类 (20 分)
  20. 如何设置HTML背景特效,HTML5之按钮背景不同动画特效设计

热门文章

  1. 农历阳历转换 java_Java编程实例:Java版农历和阳历转换源码
  2. jQuery计算时间差和阴阳历转换
  3. csp是什么比赛_2020年CSP-J/S来了,你想知道的都在这里
  4. Linux之CentOS tar压缩与解压命令大全
  5. html下拉框字体大小,select下拉框选择字体大小
  6. 机房重构总结之步履蹒跚
  7. 搜索算法的感悟——解空间
  8. ❤️「Python」初阶,必看系列, 万字只为你,建议点赞收藏~❤️
  9. 洛谷 P2414 [NOI2011] 阿狸的打字机 题解
  10. 操作系统安装磁盘清理方法