建立自己的图像数据集

适用范围

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

猜你喜欢

转载自blog.csdn.net/nanbei2463776506/article/details/63253467
今日推荐