建立自己的影象資料集
適用範圍
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上,歡迎大家使用