cifar数据集介绍及到图像转换的实现
CIFAR是一个用于普通物体识别的数据集。CIFAR数据集分为两种:CIFAR-10和CIFAR-100。The CIFAR-10 and CIFAR-100 are labeled subsets of the 80 million tiny images dataset. They were collected by Alex Krizhevsky, Vinod Nair, and Geoffrey Hinton.
CIFAR-10由60000张大小为32*32的三通道彩色图像组成,被分为10类,分别为airplane、automobile、bird、cat、deer、dog、frog、horse、ship、truck。每类由6000张图像。其中50000张图像用来训练,10000张图像用来测试。数据集分为5个训练块和1个测试块,每个块包含10000张图像.训练集每类包含5000张图像,测试集每类包含1000张图像.
CIFAR-100由60000张大小为32*32的三通道彩色图像组成,分为20个大类,每个大类又包含5个小类,总共100个小类。每个小类包含600张图像,其中500张用于训练,100张用于测试。
从https://www.cs.toronto.edu/~kriz/cifar.html 下载CIFAR C版本的二进制数据:
(1)、CIFAR-10:下载cifar-10-binary.tar.gz,解压缩,共8个文件,batches.meta.txt中存放10个种类名,data_batch_1.bin… data_batch_5.bin、test_batch.bin共6个文件,每个文件中存放10000张图像数据。
(2)、CIFAR-100:下载cifar-100-binary.tar.gz,解压缩,共5个文件,coarse_label_names.txt中存放20个大类名,fine_label_names.txt中存放100个小类名,train.bin中存放50000张训练图像,test.bin中存放10000张测试图像。
CIFAR数据集到图像转换实现的代码如下:
static void write_image_cifar(const cv::Mat& bgr, const std::string& image_save_path, const std::vector<int>& label_count, int label_class)
{std::string str = std::to_string(label_count[label_class]);if (label_count[label_class] < 10) {str = "0000" + str;} else if (label_count[label_class] < 100) {str = "000" + str;} else if (label_count[label_class] < 1000) {str = "00" + str;} else if (label_count[label_class] < 10000) {str = "0" + str;} else {fprintf(stderr, "save image name fail\n");return;}str = std::to_string(label_class) + "_" + str + ".png";str = image_save_path + str;cv::imwrite(str, bgr);
}static void read_cifar_10(const std::string& bin_name, const std::string& image_save_path, int image_count, std::vector<int>& label_count)
{int image_width = 32;int image_height = 32;std::ifstream file(bin_name, std::ios::binary);if (file.is_open()) {for (int i = 0; i < image_count; ++i) {cv::Mat red = cv::Mat::zeros(image_height, image_width, CV_8UC1);cv::Mat green = cv::Mat::zeros(image_height, image_width, CV_8UC1);cv::Mat blue = cv::Mat::zeros(image_height, image_width, CV_8UC1);int label_class = 0;file.read((char*)&label_class, 1);label_count[label_class]++;file.read((char*)red.data, 1024);file.read((char*)green.data, 1024);file.read((char*)blue.data, 1024);std::vector<cv::Mat> tmp{ blue, green, red };cv::Mat bgr;cv::merge(tmp, bgr);write_image_cifar(bgr, image_save_path, label_count, label_class);}file.close();}
}int CIFAR10toImage()
{std::string images_path = "E:/GitCode/NN_Test/data/database/CIFAR/CIFAR-10/";// train imagestd::vector<int> label_count(10, 0);for (int i = 1; i <= 5; i++) {std::string bin_name = images_path + "data_batch_" + std::to_string(i) + ".bin";std::string image_save_path = "E:/GitCode/NN_Test/data/tmp/cifar-10_train/";int image_count = 10000;read_cifar_10(bin_name, image_save_path, image_count, label_count);}// test imagestd::fill(&label_count[0], &label_count[0] + 10, 0);std::string bin_name = images_path + "test_batch.bin";std::string image_save_path = "E:/GitCode/NN_Test/data/tmp/cifar-10_test/";int image_count = 10000;read_cifar_10(bin_name, image_save_path, image_count, label_count);// save big imagsimages_path = "E:/GitCode/NN_Test/data/tmp/cifar-10_train/";int width = 32 * 20;int height = 32 * 10;cv::Mat dst(height, width, CV_8UC3);for (int i = 0; i < 10; i++) {for (int j = 1; j <= 20; j++) {int x = (j - 1) * 32;int y = i * 32;cv::Mat part = dst(cv::Rect(x, y, 32, 32));std::string str = std::to_string(j);if (j < 10)str = "0000" + str;elsestr = "000" + str;str = std::to_string(i) + "_" + str + ".png";std::string input_image = images_path + str;cv::Mat src = cv::imread(input_image, 1);if (src.empty()) {fprintf(stderr, "read image error: %s\n", input_image.c_str());return -1;}src.copyTo(part);}}std::string output_image = images_path + "result.png";cv::imwrite(output_image, dst);return 0;
}static void write_image_cifar(const cv::Mat& bgr, const std::string& image_save_path,const std::vector<std::vector<int>>& label_count, int label_class_coarse, int label_class_fine)
{std::string str = std::to_string(label_count[label_class_coarse][label_class_fine]);if (label_count[label_class_coarse][label_class_fine] < 10) {str = "0000" + str;} else if (label_count[label_class_coarse][label_class_fine] < 100) {str = "000" + str;} else if (label_count[label_class_coarse][label_class_fine] < 1000) {str = "00" + str;} else if (label_count[label_class_coarse][label_class_fine] < 10000) {str = "0" + str;} else {fprintf(stderr, "save image name fail\n");return;}str = std::to_string(label_class_coarse) + "_" + std::to_string(label_class_fine) + "_" + str + ".png";str = image_save_path + str;cv::imwrite(str, bgr);
}static void read_cifar_100(const std::string& bin_name, const std::string& image_save_path, int image_count, std::vector<std::vector<int>>& label_count)
{int image_width = 32;int image_height = 32;std::ifstream file(bin_name, std::ios::binary);if (file.is_open()) {for (int i = 0; i < image_count; ++i) {cv::Mat red = cv::Mat::zeros(image_height, image_width, CV_8UC1);cv::Mat green = cv::Mat::zeros(image_height, image_width, CV_8UC1);cv::Mat blue = cv::Mat::zeros(image_height, image_width, CV_8UC1);int label_class_coarse = 0;file.read((char*)&label_class_coarse, 1);int label_class_fine = 0;file.read((char*)&label_class_fine, 1);label_count[label_class_coarse][label_class_fine]++;file.read((char*)red.data, 1024);file.read((char*)green.data, 1024);file.read((char*)blue.data, 1024);std::vector<cv::Mat> tmp{ blue, green, red };cv::Mat bgr;cv::merge(tmp, bgr);write_image_cifar(bgr, image_save_path, label_count, label_class_coarse, label_class_fine);}file.close();}
}int CIFAR100toImage()
{std::string images_path = "E:/GitCode/NN_Test/data/database/CIFAR/CIFAR-100/";// train imagestd::vector<std::vector<int>> label_count;label_count.resize(20);for (int i = 0; i < 20; i++) {label_count[i].resize(100);std::fill(&label_count[i][0], &label_count[i][0] + 100, 0);}std::string bin_name = images_path + "train.bin";std::string image_save_path = "E:/GitCode/NN_Test/data/tmp/cifar-100_train/";int image_count = 50000;read_cifar_100(bin_name, image_save_path, image_count, label_count);// test imagefor (int i = 0; i < 20; i++) {label_count[i].resize(100);std::fill(&label_count[i][0], &label_count[i][0] + 100, 0);}bin_name = images_path + "test.bin";image_save_path = "E:/GitCode/NN_Test/data/tmp/cifar-100_test/";image_count = 10000;read_cifar_100(bin_name, image_save_path, image_count, label_count);// save big imagsimages_path = "E:/GitCode/NN_Test/data/tmp/cifar-100_train/";int width = 32 * 20;int height = 32 * 100;cv::Mat dst(height, width, CV_8UC3);std::vector<std::string> image_names;for (int j = 0; j < 20; j++) {for (int i = 0; i < 100; i++) {std::string str1 = std::to_string(j);std::string str2 = std::to_string(i);std::string str = images_path + str1 + "_" + str2 + "_00001.png";cv::Mat src = cv::imread(str, 1);if (src.data) {for (int t = 1; t < 21; t++) {if (t < 10)str = "0000" + std::to_string(t);elsestr = "000" + std::to_string(t);str = images_path + str1 + "_" + str2 + "_" + str + ".png";image_names.push_back(str);}}}}for (int i = 0; i < 100; i++) {for (int j = 0; j < 20; j++) {int x = j * 32;int y = i * 32;cv::Mat part = dst(cv::Rect(x, y, 32, 32));cv::Mat src = cv::imread(image_names[i * 20 + j], 1);if (src.empty()) {fprintf(stderr, "read image fail: %s\n", image_names[i * 20 + j].c_str());return -1;}src.copyTo(part);}}std::string output_image = images_path + "result.png";cv::imwrite(output_image, dst);cv::Mat src = cv::imread(output_image, 1);if (src.empty()) {fprintf(stderr, "read result image fail: %s\n", output_image.c_str());return -1;}for (int i = 0; i < 4; i++) {cv::Mat dst = src(cv::Rect(0, i * 800, 640, 800));std::string str = images_path + "result_" + std::to_string(i + 1) + ".png";cv::imwrite(str, dst);}return 0;
}
cifar-10转换的结果如下:cifar-100转换的结果如下:
GitHub:https://github.com/fengbingchun/NN_Test
相关文章:

取代Python?Rust凭什么
作者 | Nathan J. Goldbaum译者 | 弯月,责编 | 屠敏来源 | CSDN(ID:CSDNnews)【导语】Rust 也能实现神经网络?在前一篇帖子中,作者介绍了MNIST数据集以及分辨手写数字的问题。在这篇文章中,他将…

【Mac】解决「无法将 chromedriver 移动到 /usr/bin 目录下」问题
问题描述 在搭建 Selenium 库 ChromeDriver 爬虫环境时,遇到了无法将 chromedriver 移动到 /usr/bin 目录下的问题,如下图: 一查原来是因为系统有一个 System Integrity Protection (SIP) 系统完整性保护,如果此功能不关闭&#…

【译文】怎样让一天有36个小时
作者:Jon Bischke原文地址:How to Have a 36 Hour Day 你经常听人说“真希望一天能多几个小时”或者类似的话吗?当然,现实中我们每天只有24小时。这么说吧,人和人怎样度过这24个小时是完全不同的。到现在这样的说法已经…
Dlib库中实现正脸人脸关键点(landmark)检测的测试代码
Dlib库中提供了正脸人脸关键点检测的接口,这里参考dlib/examples/face_landmark_detection_ex.cpp中的代码,通过调用Dlib中的接口,实现正脸人脸关键点检测的测试代码,测试代码如下:/* reference: dlib/examples/face_l…

LeetCode--004--寻找两个有序数组的中位数(java)
转自https://blog.csdn.net/chen_xinjia/article/details/69258706 其中,N14,N26,size4610. 1,现在有的是两个已经排好序的数组,结果是要找出这两个数组中间的数值,如果两个数组的元素个数为偶数,则输出的是中间两个元…

开源sk-dist,超参数调优仅需3.4秒,sk-learn训练速度提升100倍
作者 | Evan Harris译者 | Monanfei编辑 | Jane 出品 | AI科技大本营(ID:rgznai100)【导语】这篇文章为大家介绍了一个开源项目——sk-dist。在一台没有并行化的单机上进行超参数调优,需要 7.2 分钟,而在一百多个核心的 Spark 群集…
Windows和Linux下通用的线程接口
对于多线程开发,Linux下有pthread线程库,使用起来比较方便,而Windows没有,对于涉及到多线程的跨平台代码开发,会带来不便。这里参考网络上的一些文章,整理了在Windows和Linux下通用的线程接口。经过测试&am…

MySQL 性能调优的10个方法
MYSQL 应该是最流行了 WEB 后端数据库。WEB 开发语言最近发展很快,PHP, Ruby, Python, Java 各有特点,虽然 NOSQL 最近越來越多的被提到,但是相信大部分架构师还是会选择 MYSQL 来做数据存储。MYSQL 如此方便和稳定,以…

他们用卷积神经网络,发现了名画中隐藏的秘密
作者 | 神经小刀来源 |HyperAI超神经( ID: HyperAI)导语:著名的艺术珍品《根特祭坛画》,正在进行浩大的修复工作,以保证现在的人们能感受到这幅伟大的巨制,散发出的灿烂光芒。而随着技术的进步,…

机器学习公开课~~~~mooc
https://class.coursera.org/ntumlone-001/class/index

DLM:微信大规模分布式n-gram语言模型系统
来源 | 微信后台团队Wechat & NUS《A Distributed System for Large-scale n-gram Language Models at Tencent》分布式语言模型,支持大型n-gram LM解码的系统。本文是对原VLDB2019论文的简要翻译。摘要n-gram语言模型广泛用于语言处理,例如自动语音…
Ubuntu14.04 64位机上安装cuda8.0+cudnn5.0操作步骤
查看Ubuntu14.04 64位上显卡信息,执行:lspci | grep -i vga lspci -v -s 01:00.0 nvidia-smi第一条此命令可以显示一些显卡的相关信息;如果想查看某个详细信息,可以执行第二条命令;如果是NVIDIA卡, 可继续执行第三条命…

SQLI DUMB SERIES-5
less5 (1)输入单引号,回显错误,说明存在注入点。输入的Id被一对单引号所包围,可以闭合单引号 (2)输入正常时:?id1 说明没有显示位,因此不能使用联合查询了;可…

javascript RegExp
http://www.w3schools.com/jsref/jsref_obj_regexp.asp声明-------------modifiers:{i,g,m}1. var pattnew RegExp(pattern,modifiers);2. var patt/pattern/modifiers;------------------------例子:var str "Visit W3Schools"; //两…

Ubuntu14.04 64位机上安装OpenCV2.4.13(CUDA8.0)版操作步骤
Ubuntu14.04 64位机上安装CUDA8.0的操作步骤可以参考http://blog.csdn.net/fengbingchun/article/details/53840684,这里是在已经正确安装了CUDA8.0的基础上安装OpenCV2.4.13(CUDA8.0)操作步骤:1. 从http://opencv.org/downloads.html 下载OpenCV2.…

一篇文章能够看懂基础代码之CSS
web页面主要分为三块内容:js:控制用户行为和执行代码行为html元素:控制页面显示哪些控件(例如按钮,输入框,文本等)css:控制如何显示页面上的空间,例如布局,颜…

谷歌NIPS论文Transformer模型解读:只要Attention就够了
作者 | Sherwin Chen译者 | Major,编辑 | 夕颜出品 | AI科技大本营(ID:rgznai100)导读:在 NIPS 2017 上,谷歌的 Vaswani 等人提出了 Transformer 模型。它利用自我注意(self-attention)来计算其…

中国移动与苹果联姻 三星在华霸主地位或遭取代
据国外媒体12月24日报道,在各方的期待下,苹果终于宣布中国移动将于2014年1月17日开始销售支持其网络的iPhone手机。而中国移动也将于12 月25日开始正式接受预定。作为中国以及世界最大的移动运营商,中国移动与苹果的合作,将会帮助…
二维码Data Matrix编码、解码使用举例
二维码Data Matrix的介绍见: http://blog.csdn.net/fengbingchun/article/details/44279967 ,这里简单写了个生成二维码和对二维码进行识别的测试例子,如下:int test_data_matrix_encode() {std::string str "中国_abc_DEF…

PDF文件如何转成markdown格式
百度上根据pdf转makrdown为关键字进行搜索,结果大多数是反过来的转换,即markdown文本转PDF格式。 但是PDF转markdown的解决方案很少。 正好我工作上有这个需求,所以自己实现了一个解决方案。 下图是一个用PDF XChange Editor打开的PDF文件&am…

关于SAP BW提示“Carry out repairs in non-original only
为什么80%的码农都做不了架构师?>>> 这个提示是由于你在生产系统(正式系统)里面修改了一些东西,才提示"Carry out repairs in non-original system only if they are urgent"这个警告,理论上我们…
windows7 64位机上安装配置CUDA7.5(或8.0)+cudnn5.0操作步骤
按照官网文档 http://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html#axzz4TpI4c8vf 进行安装:在windows7上安装cuda8.0/cuda7.5的系统需求:(1)、ACUDA-capable GPU(本机显卡为GeForce GT 640M);(2)、A support…

多重影分身:一套代码如何生成多个小程序?
前言 影分身术,看过火影的都知道,一个本体,多个分身。 大家肯定要问了,那小程序开发跟影分身术也能扯上关系?没错,那自然就是:一套代码,多个小程序啦。 各位先别翻白眼,且…

TensorFlow全家桶的落地开花 | 2019 Google开发者日
作者 | 唐小引写于上海世博中心出品 | GDD 合作伙伴 CSDN(ID:CSDNnews)Android 10 原生支持 5G,Flutter 1.9、Dart 2.5 正式发布这是 Google Developer Days 在中国的第四年,从 2016 年 Google Developers 中国网站正式…

css的background
背景属性——background是css中的核心属性。你应该对它有充分的了解。这篇文章详细讨论了background的所有相关属性,甚至包括background-p_w_upload,还为我们介绍了它在即将到来的CSS3中的样子,还有那些新加入的背景属性。使用CSS2中的背景属…
windows7 64位机上配置支持GPU版(CUDA7.5)的OpenCV2.4.13操作步骤
很久之前在windows7 32位上配置过GPU版的opencv,可参考http://blog.csdn.net/fengbingchun/article/details/9831837Windows7 64位CUDA7.5的配置可以参考:http://blog.csdn.net/fengbingchun/article/details/53892997这里是在CUDA7.5已正确安装后的操作…

值得注意的知识点
ImageView的属性adjustViewBounds www.jianshu.com/p/13de17744… 转载于:https://juejin.im/post/5c8b7742e51d454e02716e44

阿里深度序列匹配模型SDM:如何刻画大型推荐系统的用户行为?
作者 | 石晓文来源 | 小小挖掘机(ID:wAIsjwj)今天给大家介绍的论文是:《SDM: Sequential Deep Matching Model for Online Large-scale Recommender System》论文下载地址:https://arxiv.org/abs/1909.00385v11、背景像…

find ip from hostname or find hostname from ip
1. find ip from hostname ping <hostname> 2.fin hostname from ip nslookup <ip>

Linux下多线程编程中信号量介绍及简单使用
在Linux中有两种方法用于处理线程同步:信号量和互斥量。线程的信号量是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行…