OFRecord 图片文件制数据集

在 OFRecord 数据格式 和 加载与准备 OFRecord 数据集 中,分别学习了 OFRecord 数据格式,以及如何将其它数据集转为 OFRecord 数据集并使用。

本文介绍如何将图片文件制作为 OFRecord 数据集,并提供了相关的制作脚本,方便用户直接使用或者在此基础上修改。内容包括:

  • 制作基于 MNIST 手写数字数据集的 OFRecord 数据集
  • OFRecord 的编解码方式
  • 在自制的 OFRecord 数据集上进行训练

用图片文件制作 OFRecord 文件

使用 MNIST 数据集中的图片文件来制作一个 OFRecord 格式文件。

作为示例,仅使用了50张图片,相关脚本和数据集的下载地址为 img2ofrecord

  • 下载相关压缩包并解压

$ wget https://oneflow-static.oss-cn-beijing.aliyuncs.com/oneflow-tutorial-attachments/img2ofrecord.zip

$ unzip img2ofrecord.zip

  • 进入到对应目录,并运行 OFRecord 制作脚本 img2ofrecord.py

$ cd ./img_to_ofrecord

$ python img2ofrecord.py --part_num=5 --save_dir=./dataset/ --img_format=.png --image_root=./images/train_set/

  • 脚本运行过程中,将输出以下内容

The image root is:  ./images/train_set/

The amount of OFRecord data part is:  5

The directory of Labels is:  ./images/train_label/label.txt

The image format is:  .png

The OFRecord save directory is:  ./dataset/

Start Processing......

./images/train_set/00000030_3.png feature saved

./images/train_set/00000034_0.png feature saved

./images/train_set/00000026_4.png feature saved

./images/train_set/00000043_9.png feature saved

......

Process image successfully !!!

至此 OFRecord 文件制作完毕,并保存在 ./dataset 目录下

代码解读

整个代码目录构造如下

img_to_ofrecord

├── images

├── train_set

├── 00000000_5.png

├── 00000001_0.png

├── 00000002_4.png

......

├── train_label

├── label.txt

├── img2ofrecord.py

├── lenet_train.py

  • images 目录存放原始示例训练数据集以及标签文件

的标签文件是以 json 格式存储的,格式如下:

{"00000030_3.png": 3}

{"00000034_0.png": 0}

{"00000026_4.png": 4}

{"00000043_9.png": 9}

{"00000047_5.png": 5}

{"00000003_1.png": 1}

......

  • img2ofrecord.py 脚本将 MNIST 图片转换成 OFRecord 数据集
  • lenet_train.py 脚本则读取制作好的 OFRecord 数据集,并使用 LeNet 模型进行训练。

img2ofrecord.py 的命令行选项如下:

  • image_root 指定图片的根目录路径
  • part_num 指定生成 OFRecord 文件个数,如果该数目大于总图片数目,会报错
  • label_dir 指定标签的目录路径
  • img_format 指定图片的格式
  • save_dir 指定 OFRecord 文件保存的目录

脚本的编码流程

与 OFRecord 文件编码的相关逻辑也在 img2ofrecord.py 内,其编码流程如下:

首先,对读取进来的图片数据进行编码

def encode_img_file(filename, ext=".jpg"):

img = cv2.imread(filename)

encoded_data = cv2.imencode(ext, img)[1]

return encoded_data.tostring()

这里的 ext 是图片编码格式,目前,OneFlow 图片编解码支持的格式与 OpenCV 的一致,可参见 cv::ImwriteFlags,包括:

然后,转化成 Feature 的形式,进行序列化,并将数据长度写入到文件中

def ndarray2ofrecords(dsfile, dataname, encoded_data, labelname, encoded_label):

topack = {dataname: bytes_feature(encoded_data),

labelname: int32_feature(encoded_label)}

ofrecord_features = ofrecord.OFRecord(feature=topack)

serilizedBytes = ofrecord_features.SerializeToString()

length = ofrecord_features.ByteSize()

dsfile.write(struct.pack("q", length))

dsfile.write(serilizedBytes)

使用自制的 OFRecord 数据集进行训练

运行目录下的 lenet_train.py,它将读取刚制作好的 OFRecord 数据集,在 Lenet 模型上进行训练

该训练脚本输出如下:

[6.778578]

[2.0212684]

[1.3814741]

[0.47514156]

[0.13277876]

[0.16388433]

[0.03788032]

[0.01225162]

......

至此,成功完成了数据集制作、读取与训练整个流程。

OFRecord 图片文件制数据集的更多相关文章

  1. JavaScript根据文件名后缀判断是否图片文件

    //JavaScript根据文件名后缀判断是否图片文件 //图片文件的后缀名 var imgExt = new Array(".png",".jpg",&quo ...

  2. 【荐】PHP操作MongoDB GridFS 存储文件,如图片文件

    GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容, ...

  3. FileReader:读取本地图片文件并显示

    最近忙得比狗还惨,导致长时间没能更新文章,真心对不住啊.抽空整理了下关于在页面上读取和显示本地图片的实例文章,本文通过实例讲解如何使用支持FileReader浏览器的用户将能够通过一个file inp ...

  4. springmvc图片文件上传接口

    springmvc图片文件上传 用MultipartFile文件方式传输 Controller package com.controller; import java.awt.image.Buffer ...

  5. C#对图片文件的压缩、裁剪操作初探

    在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便.毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强 ...

  6. Qt 怎么添加图片文件?

    1.新建一个.qrc的文件 2.起个.qrc的文件名 3.完成后,添加图片文件 4.如图 就好了.

  7. C#对图片文件的压缩、裁剪操作

    在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便.毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强 ...

  8. [深入浅出WP8.1(Runtime)]生成图片和存储生成的图片文件

    7.2.3 使用RenderTargetBitmap类生成图片 RenderTargetBitmap类可以将可视化对象转换为位图,也就是说它可以将任意的UIElement以位图的形式呈现.那么我们在实 ...

  9. 将gridFS中的图片文件写入硬盘

    开启用户验证下的gridfs 连接使用,在执行脚本前可以在python shell中 from pymongo import Connectionfrom gridfs import *con = C ...

随机推荐

  1. miui10 刷机

    起因 折腾一下老手机 名词解释 名称 内容 含义 REC Recovery的缩写 Android出厂时自带的恢复模式 (理解为win PE) 双清 data,cache 用户数据+系统缓存 三清 da ...

  2. hdu2276 矩阵构造

    题意:      给了n个灯泡的状态,他们绕成一个环,0是灭,1是亮,每一秒灯泡的状态都会改变,规则是如果当前这个灯泡的左边的灯泡当前是状态1,那么下一秒当前的这个灯泡状态就改变0变1,1变0,最后问 ...

  3. Python中Numpy模块的使用

    目录 NumPy ndarray对象 Numpy数据类型 Numpy数组属性 NumPy NumPy(Numerical Python) 是 Python 的一个扩展程序库,支持大量的维度数组与矩阵运 ...

  4. Win64 驱动内核编程-16.WFP网络监控驱动(防火墙)

    WFP驱动监控网络 WFP 是微软推出来替代 TDI HOOK.NDIS HOOK 等拦截网络通信的方案,WFP 的框架非常庞大,在 RING3 和 RING0 各有一套类似的函数,令人兴奋的是,即使 ...

  5. 【实用小技巧】spring springmvc集成shiro时报 No bean named 'shiroFilter' available

    查了网上的,很多情况,不同的解决办法,总归一点就是配置文件加载的问题. 先看下配置文件中的配置 web.xml中的主要配置(这是修改后不在报错的:仅仅修改了一个位置:[classpath:spring ...

  6. 【c#】 使用Directory.GetFiles获取局域网中任意电脑指定文件夹下的文件

    本文为老魏原创,如需转载请留言 格式如下: // 获取IP地址为10.172.10.167下D盘下railway下的所有文件 string[] picArray = Directory.GetFile ...

  7. nginx 配置后页面访问是报500错

    该问题是html文件权限问题. 用jenkins 并远程服务器上传到另一台服务器的html ,在配置好nginx 的location  root 绝对位置后还是报错500 手工用root上传时访问正常 ...

  8. C++逆向分析----多重继承和菱形继承

    多重继承 多重继承是指C++类同时继承两个类或两个以上的类. class Test { public: int num1; Test() { num1 = 1; } virtual void Proc ...

  9. MySQL binlog_ignore_db 参数最全解析

    前言: 经过前面文章学习,我们知道 binlog 会记录数据库所有执行的 DDL 和 DML 语句(除了数据查询语句select.show等).注意默认情况下会记录所有库的操作,那么如果我们有另类需求 ...

  10. FHE-Toolkit 安装

    什么是FHE-Toolkit? FHE-Toolkit-linux是用于Linux的IBM全同态加密工具包, 该工具包是一个基于Linux的Docker容器,可演示对加密数据的计算而无需解密, 该工具 ...