1. 程式人生 > >建立自己的影象資料集

建立自己的影象資料集

適用範圍

1、python機器學習庫scikit learn

2、有監督/無監督

程式碼組成

1、裁剪圖片建立初始影象資料集

2、將影象資料集轉換為可以訓練的模式

我們在運用機器學習演算法對影象進行分類、識別時,是將二維矩陣拉成一維向量。sklearn提供的手寫字元資料集由data和target兩部分組成。

from sklearn import datasets

MNIST = datasets.load_digits()

print MNIST.data.shape,MNIST.target.shape

print type
(MNIST.data),type(MNIST.target)

這裡寫圖片描述

可以看到data是一個1797 * 64 的ndarray陣列,target是 1797 *1 的ndarray陣列。說明一共有1797張圖片,每張圖片是由64個畫素組成。我們的目標是將自己的影象資料集中的每一張圖片變成一個向量,將所有向量組成一個ndarray的陣列。

一、建立初始影象資料集

參考

python+OpenCV 滑鼠互動圖片切割矩形區域
https://www.jianshu.com/p/5f7df3d8b237

筆者只是在參考的程式碼上做了小小改動,將只能擷取一次變成可以擷取多次。

效果演示

1、擷取圖片

這裡寫圖片描述

這裡寫圖片描述

2、圖片儲存

我們在這裡擷取兩張圖片為例,然後按ESC鍵退出程式

這裡寫圖片描述

擷取的圖片就被儲存在相應的資料夾中

3、程式碼釋義

注意在運用程式碼的過程中有些地方是需要自己進行改動的,我已在下面的程式碼部分進行說明

# -- coding: utf-8 --
import cv2
global img
global point1, point2

# 要擷取的圖片的大小(根據情況自行改動)
width =50
height =50

# 要擷取的圖片的路徑 (我是與py檔案放在同一級,要根據自己情況進行改動)
imgpath='img.jpg'
#獲取滑鼠事件的函式 def on_mouse(event, x, y, flags, param): flag = 1 global img, point1, point2,count img2 = img.copy() # while (flag): if event == cv2.EVENT_LBUTTONDOWN: # 左鍵點選 point1 = (x, y) cv2.circle(img2, point1, 10, (0, 255, 0), 5) cv2.imshow('image', img2) elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON): # 按住左鍵拖曳 cv2.rectangle(img2, point1, (x, y), (255, 0, 0), 5) cv2.imshow('image', img2) elif event == cv2.EVENT_LBUTTONUP: # 左鍵釋放 point2 = (x, y) cv2.rectangle(img2, point1, point2, (0, 0, 255), 5) cv2.imshow('image', img2) min_x = min(point1[0], point2[0]) min_y = min(point1[1], point2[1]) cut_img = img[min_y:min_y + width, min_x:min_x + height] #檔案存放路徑與檔名(根據自己情況進行改動) cv2.imwrite('smaple\\%s_remote'%(count) + '.bmp', cut_img) count = count + 1 print count def main(): global img,count count =2000 img = cv2.imread(imgpath) cv2.namedWindow('image') # while(1): cv2.setMouseCallback('image', on_mouse) while(1): cv2.imshow('image', img) #27是ESC的ASCII碼,表示只有按下ESC鍵才會關閉視窗 if (cv2.waitKey(0) == 27): break; if __name__ == '__main__': main()

要注意的地方

1、檔名,由於接下來對資料集提取target(類別)是建立在檔名的基礎上,所以請保持原有格式進行改動

格式 1000_name.jpg

1000中的1是表示類別,及count要賦予的初始值,count會在此基礎上自動計數,不改變類別。如果要擷取不同類別的,需要為count賦予其他的初值,如2000,3000

2、由於所處理的影象資料大小應該一致,所以在width與height時是寫死的,不用擔心所截圖的大小是否超出預期

二、資料集格式轉換

這部分就不再詳細介紹只說明使用的方法

使用說明

1、在檔案頭部引入相應的py模組

2、運用函式

image_datasets()

輸入:資料集所在的資料夾

輸出:data ,target

from sklearn_data import *

path = "sample\\"

data,target = image_datasets(path)

即可獲得sklearn可以運用的資料集

希望可以幫助到大家,程式碼放在了git上,歡迎大家使用

https://github.com/nanbei629/build_datasets