1. 程式人生 > >用自己的資料,製作python版本的cifar10資料集

用自己的資料,製作python版本的cifar10資料集

前期準備:3通道圖片60000張,如果你沒有那麼大的資料量,需要改變cifar-10-API中的定義,下面會具體說到。
如果你的圖片是灰度圖(單通道)可以用這種方法來改為三通道:
opencv將灰度圖轉化為RGB三通道影象
要求為python2.7版本,由於cifar10就是在python2.7下面定義的,用python3版本與2.7版本最主要的不同是在2.7版本中打包模組為cPickle,而在python3中為pickle。在cifar-10-API中開啟二進位制檔案為cPickle。
有任何問題的可以在下方留言,或者郵箱留言:[email protected]

1、將圖片轉化為32*32的三通道圖片

def img_tra():
    for k in range(0,num):
        currentpath=folder+"/"+imglist[k]
        im=Image.open(currentpath)
        #width=im.size[0]
        #height=im.size[1]
        x_s=32
        y_s=32
        out = im.resize((x_s,y_s),Image.ANTIALIAS)
        out.save(folder_ad+"/"+str(imglist[k]))

2、進行進行畫素點操作。

python版本的cifar資料集格式為在一個字典中存在batch_label,labels,data,filenames四種資訊,其中batch_label與filenames為utf-8編碼的字串,data為uint8編碼的numpy陣列,labels為utf-8編碼的列表。先將條桶圖片轉化為32*32的RGB圖,然後依次讀取RGB通道畫素值,存入3*1024numpy陣列,圖片標籤存入labels,圖片名存入filenames,將其打包成一個二進位制檔案。
下圖是開啟官方cifar資料集檔案內容(6個檔案都一樣,以data_batch_1為例)

import
cPickle as p import numpy as np import chardet def unpickle(file): import cPickle with open(file, 'rb') as fo: dict = cPickle.load(fo, encoding='latin-1') return dict cc=unpickle("J:/get4/data_atch_1") print(cc)

開啟後為:
這裡寫圖片描述

這裡寫圖片描述

我們將點操作與寫檔案寫在一個函式mkcf()函式中:

def mkcf():
    global data
    global list1
    global list2
    global list3
    global list4
    for k in range(0,num):
        currentpath=folder_ad+"/"+imglist[k]
        im=Image.open(currentpath)
        with open(binpath, 'a') as f:
            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    #print(imglist[k])
                    #print(type(cl[0]))
                    #with open(binpath, 'a') as f:
                        #print(str(cl[0]))
                    list1.append(cl[0])
                    #print(list1)


            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    #with open(binpath, 'a') as f:
                    #mid=str(cl[1])
                    #f.write(mid)
                    list1.append(cl[1])

            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    #with open(binpath, 'a') as f:
                    #mid=str(cl[2])
                    #f.write(mid)
                    list1.append(cl[2])
        list2.append(list1)
        list1=[]
        #arr2=np.array(list2)
        #print(arr4)
        f.close()
        print("image"+str(k+1)+"saved.")
        list3.append(imglist[k].encode('utf-8'))
    arr2=np.array(list2,dtype=np.uint8)
    data['batch_label'.encode('utf-8')]='testing batch 1 of 1'.encode('utf-8')
    #addWord(cifar10,"batch_label".encode('utf-8'),'training batch 5 of 5'.encode('utf-8'))
    data.setdefault('labels'.encode('utf-8'),label)
    data.setdefault('data'.encode('utf-8'),arr2)
    #addWord(cifar10,'labels'.encode('utf-8'),label)
    #addWord(cifar10,'data'.encode('utf-8'),arr2)
    data.setdefault('filenames'.encode('utf-8'),list3)
    #addWord(cifar10,'filenames'.encode('utf-8'),list3)
    output = open(binpath, 'wb')
    pickle.dump(data, output)
    output.close()

3、總體程式碼貼上如下

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 18 14:17:45 2017

@author: ielij
"""
import numpy as np
from PIL import Image
import operator
from os import listdir
import sys
import cPickle as pickle
import random
data={}
list1=[]
list2=[]
list3=[]
def img_tra():
    for k in range(0,num):
        currentpath=folder+"/"+imglist[k]
        im=Image.open(currentpath)
        #width=im.size[0]
        #height=im.size[1]
        x_s=32
        y_s=32
        out = im.resize((x_s,y_s),Image.ANTIALIAS)
        out.save(folder_ad+"/"+str(imglist[k]))
def addWord(theIndex,word,adder):
    theIndex.setdefault(word,[]).append(adder)
def seplabel(fname):
    filestr=fname.split(".")[0]
    label=int(filestr.split("_")[0])
    return label
def mkcf():
    global data
    global list1
    global list2
    global list3
    for k in range(0,num):
        currentpath=folder_ad+"/"+imglist[k]
        im=Image.open(currentpath)
        with open(binpath, 'a') as f:
            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    list1.append(cl[0])
            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    #with open(binpath, 'a') as f:
                    #mid=str(cl[1])
                    #f.write(mid)
                    list1.append(cl[1])

            for i in range (0,32):
                for j in range (0,32):
                    cl=im.getpixel((i,j))
                    list1.append(cl[2])
        list2.append(list1)
        list1=[]
        f.close()
        print("image"+str(k+1)+"saved.")
        list3.append(imglist[k].encode('utf-8'))
    arr2=np.array(list2,dtype=np.uint8)
    data['batch_label'.encode('utf-8')]='testing batch 1 of 1'.encode('utf-8')
    data.setdefault('labels'.encode('utf-8'),label)
    data.setdefault('data'.encode('utf-8'),arr2)
    data.setdefault('filenames'.encode('utf-8'),list3)
    output = open(binpath, 'wb')
    pickle.dump(data, output)
    output.close()

folder="H:/VOC2007/test_ad"
folder_ad="H:/VOC2007/test_rs"
imglist=listdir(folder_ad)
num=len(imglist)
img_tra()
label=[]
for i in range (0,num):
    label.append(seplabel(imglist[i]))
binpath="H:/VOC2007/get4/test_batch"
print(binpath)
mkcf()

需要說明一點,圖片儲存格式為:0_126.jpg,其中0為標籤,得到標籤的方式為(此函式已在總程式碼裡)

def seplabel(fname):
    filestr=fname.split(".")[0]
    label=int(filestr.split("_")[0])
    return label

4、結果展示

這裡寫圖片描述

100張精度
這裡寫圖片描述
1000張精度
這裡寫圖片描述

相關推薦

自己資料製作python版本cifar10資料

前期準備:3通道圖片60000張,如果你沒有那麼大的資料量,需要改變cifar-10-API中的定義,下面會具體說到。 如果你的圖片是灰度圖(單通道)可以用這種方法來改為三通道: opencv將灰度圖轉化為RGB三通道影象 要求為python2.7版本,

Python版本資料結構書_《Python解決資料結構與演算法問題》

源於經典 資料結構作為計算機從業人員的必備基礎,Java, c 之類的語言有很多這方面的書籍,Python 相對較少, 其中比較著名的一本 problem-solving-with-algorithms-and-data-structure-using-pyt

python讀取cifar10資料

最近學習卷積網路用到cifar10資料集,自己寫了一個工具類,用來讀取已經下載到本地的cifar10資料集。 程式碼寫的不算好,但是自己用起來還可以。所以放到網上,有需要的可以拿去用。程式碼比較少,所以沒有寫註釋。下面介紹一下實現的功能。完整的程式碼可以在github上下載。地址:https:/

深圳資料中心API-Python版本

# -*- coding: UTF-8 -*- _author_ = 'zy' _date_ = '2018/12/10 0010 19:56' import requests,pymongo,json,time APPKEY=‘’ appid='357415058' url='http

Python-Numpy多維陣列--來自現有資料資料來自數值範圍的資料

一、NumPy 來自現有資料的陣列 1.numpy.asarray此函式類似於numpy.array,除了它有較少的引數。 這個例程對於將 Python 序列轉換為ndarray非常有用。 numpy.asarray(a, dtype = None, order = None) 構造器接

python 在excel檔案中寫入date日期資料以及讀取excel日期資料如何在python中正確顯示date日期。

如何通過python寫入date資料了? 寫入還是很簡單的。 import xlwt3 import  datetime as dt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('Sheet1') wo

更新Python2.6.6至2.7.8之後檢視Python版本依然是2.6.6

1.下載2.7.8版本wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgztar zxvf Python-2.7.8.tgz2.進入到解壓檔案cd Python-2.7.8 ./configure --pr

Python超越R為何Python攀上資料科學巔峰?

根據 KDnuggets最新調查,Python 生態系統已經超過了 R,成為了資料分析、資料科學

SQL與eclipse的連線從資料庫讀取表資料將二維陣列資料匯入表

示例: import java.util.List; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; impor

按結束日期往前推30天12個周12個月獲取資料補齊缺失的資料

public List<Integer> getThirtyDates() { List<Integer> weeks = new ArrayList<Integer>(); long endTime = LDateTime.getTime(LDa

專案--點選按鈕顯示資料點選空白處隱藏資料

點選空白處隱藏資料 點選按鈕顯示資料在這裡插入程式碼片 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

MySQL操作的時候發現輸入當前資料資料庫中儲存的資料總比輸入的要小8個小時

在使用mybatis進行MySQL操作的時候,發現輸入當前資料,資料庫中儲存的資料總比輸入的要小8個小時,幾經搜尋找到了原因,原來是因為mybatis配置檔案中 <property name="url" value="jdbc:mysql://localhost:3306/mybatisD

出行大資料滴滴釋出400城資料視覺化分析

2017年,滴滴基於出行的大資料探討了城市連線、夜間出行、公共交通與網約車、智慧交通形態等多個熱

資料庫有資料但查詢不到資料沒查到還爆空指標

              今天在做springMVC專案的時候,因為粗心,忘了在控制層注入service的類上面加上@Autowired,執行程式碼就一直報空指標,把hql翻譯成sql放入資料庫查詢

laravel-admin表單提交隱藏一些資料回撥時獲取資料

laravel-admin表單提交隱藏一些資料,回撥時獲取資料 表單提交時隱藏資料 回撥時獲取資料 獲取提交資料 獲取隱藏提交中的資料 表單提交時隱藏資料 讀取最後一條的插入資料,但這樣會造成如果兩條資料同時插

oracle刪除重複資料只留一條資料

--worked well。可以刪除重複記錄,對於多個欄位也是一樣的原理  delete from T_USER  where id in (select id from T_USER group b

資料分析:Python分析學生資料

本文為優達學城資料分析入門課程的mini專案,所用資料集為優達學城某段時間內的學生資料。 資料簡介 全部資料包含三個檔案,其內容分別為: enrollments.csv: daily-engagement.csv project-submis

C#操作dataGridView新增資料庫中資料刪除dataGridView中的資料

      private void btn_AddData_Click(object sender,EventArgs e)//資料新增        {           //方法一            //stringid = "4";            //stringname = "Jim

list集合轉換成json資料ajax請求返回json資料再通過迴圈顯示出來

之前在網上查了很多關於迴圈顯示ajax返回值的方法,很多都不對的,顯示不了我要的結果。後來自己鼓搗出來了,發出來分享一下自己的成果。因為ajax不能返回集合的,需要把集合list轉換成json返回,再用迴圈的方式,顯示出結果。 操作層 //編碼方式request.set

每次選中陣列中的N條資料 如果讓每條資料被選中的次數做到平均??

經常有這樣的需求, 有一組資料, 每次展示其中的1條或N條,希望每條資料展示量可以做到平均。 一開始想依次展示每條資料並做記錄,整組資料全展示一遍之後清除記錄, 然後一直迴圈下去。 實現的過程中又覺得這個方法太麻煩, 可以每次先打亂陣列, 然後取其中的前N條來顯示, 這樣應該可以保證每條資料被選中的概率差