人工智能里,深度学习的关键是训练。无论是从图像处理到语音识别,每个问题都有其独特的细微差别和方法。

你可以从哪里获得这些数据?现在你看到的很多研究论文都使用专有数据集,而这些数据集通常不会向公众发布。如果你想学习并应用你新掌握的技能,数据就成为一个问题。例如MNIST是来自美国国家标准与技术研究所,National Institute of Standards and Technology(NIST)训练集(training set)来自250不同的人手写的数字构成的一个数据集,其中训练集55000,验证集5000,测试集10000,总共70000个.

但是,这还仅仅知识简单的数字识别数据集。可是我们还需物体识别,阿拉伯数字才10个,可这个世界上的物体有千千万,同一个物体又可以有不同形态,给数据打标签本身就是一件十分耗人力财力的事,碰上这么大的数据,我们该如何是好。

于是,自动生成数据集技术便化解了难题。简单来说就是从人工自己获取数据自己打标签,到机器自己生成数据并且附带标签,不需要很多人为参与,那么对于很多需要庞大数据集的情况,就很有用处了。

数据样例

分析一手:背景色相同,有四个干扰线,颜色不同。字体经过自己子产生数据过程中的对比是书宋,有干扰点,分布均匀。想想都觉得很适合机器自己生成啊。

生成步骤

1、产生与真实数据相同的背景

2、产生干扰点,你们会想为什么这么早产生干扰点,因为我是用改变像素点的方法产生,我遍历整个图的像素,根据自己的设定随机改变一些像素值,就会产生了干扰点,而对后面汉字产生没有影响。(经过实验比较好的方法)

3、用drawimage的方法在背景上生成汉字,汉字我用的是shusong.ttf

4、旋转字体,字体写上以后就是整张图旋转了,但是旋转以后背景图的四个角是改变的。因为背景是有层次感的,导致旋转后四个角遮挡不了了,漏出黑色。

5、这一步大家应该知道,把四个角的黑色三角变成白色。网上很多方法,先对图片根据像素值对其进行截取,只留下汉字所在的方框,然后在放在另外一个背景下,让背景统一。

6、旋转以后,我们就要对图片产生干扰线。随机生成四条线,宽度和汉字的相同,颜色随机产生。

7、批量产生,我把常用汉字存到一个字典里,然后产生某个汉字的图片,都放在汉字所对应的key值文件夹下,这样我在训练的时候,根据访问文件夹就知道样本的标签啦。

代码

from PIL import Image
import matplotlib.pyplot as plt
from PIL import ImageFont
from PIL import ImageDraw
import tensorflow as tf
import numpy as np
import random
import os
import cv2
import skimage.util
from code7 import ImageChar
 
class Creatimage(object):
    def __init__(self, font=ImageFont.truetype('fangzheng_shusong.ttf', 30),
                 img_r=Image.new("RGB", (50, 50), (255, 255, 255)), size=(50, 50),
                 chars="作", image_arr=np.zeros((256, 256, 3), np.uint8), value=0,
                 count=0, image_list = [[255,240,245],[185,211,238],[187,255,255]]):
        self.font = font
        self.img_r = img_r
        self.image_arr = image_arr
        self.size = size
        self.char = chars
        self.value = value
        self.count = count
        self.image_list=image_list
    def addnoise(self):
        self.img_r = np.array(self.img_r)
        for i in range(50):
            for j in range(50):
                if i%2 ==0 and j%2==0:
                    list =self.image_list[random.randint(0,2)]
                    self.img_r[i][j][0]=list[0]
                    self.img_r[i][j][1]=list[1]
                    self.img_r[i][j][2]=list[2]
    def drawText(self):
        self.img_r = Image.fromarray(self.img_r)
        draw = ImageDraw.Draw(self.img_r)
        draw.text((15, 20), self.char, self.randRGB(), font=self.font)
        del draw
    def rotate(self):
        self.img_r = self.img_r.rotate(random.randint(0,90), expand=0)
 
    def randLine(self, num):
        draw = ImageDraw.Draw(self.img_r)
        lineColor = self.randRGB()
        for i in range(0, num):
            draw.line([self.randPoint(), self.randPoint()], lineColor, 2)
        del draw
 
    def randPoint(self):
        (width, height) = self.size
        return (random.randint(0, width), random.randint(0, height))
 
    def randRGB(self):
        return (random.randint(1, 255),
                random.randint(1, 255),
                random.randint(1, 255))
 
 
    def changeIm(self):
        self.image_arr = np.array(self.img_r)
        for i in range(50):
            for j in range(50):
                if self.image_arr[i][j][0]==0 and self.image_arr[i][j][0]==0 and self.image_arr[i][j][0]==0:
                    self.image_arr[i][j][0]=255
                    self.image_arr[i][j][1]=255
                    self.image_arr[i][j][2]=255
                    if i % 2 == 0 and j % 2 == 0:
                        list = self.image_list[random.randint(0, 2)]
                        self.image_arr[i][j][0] = list[0]
                        self.image_arr[i][j][1] = list[1]
                        self.image_arr[i][j][2] = list[2]
        # print(self.image_arr)
    #im=np.array(img_r)
    #imshow(im)
 
    def printimage(self):
        plt.imshow(self.image_arr)
        plt.show()
 
 
    def createImage(self, num):
        self.addnoise()
        self.drawText()
        self.rotate()
        self.randLine(num)
        self.changeIm()
        self.printimage()
 
    def saveImage(self):
        out_dir = os.path.expanduser("./dateset")
        train_images_dir = os.path.join(out_dir, "train")
        if not os.path.isdir(train_images_dir):
            os.makedirs(train_images_dir)
        char_dir = os.path.join(train_images_dir, "%0.5d" % self.value)
        path_image = os.path.join(char_dir, "%d.jpeg" % self.count)
        if not os.path.isdir(char_dir):
            os.makedirs(char_dir)
        cv2.imwrite(path_image, self.image_arr)
        im = Image.fromarray(self.image_arr)
 
        im.save(path_image)
 
if __name__ == "__main__":
    ic = Creatimage()
    ic.createImage(4)
    ic.saveImage()

六、产生数据的样例

Q:

    其实技术还尚有欠缺,机器对背景的过度敏感可以归因于有限的数据集大小。对于任何对象,数据集中仅出现有限数量的背景,因此神经网络就会发生判断偏差。  捕捉各种各样背景的困难,以及探索大范围的滋扰因素的需要,造成了Deep Nets这类方法的缺陷。

    如果我们可以通过将模板贴在任意背景图像的方式生成数据集,是不是就意味着我们可以将目标从原有背景中解耦出来,从而解决组合爆炸的问题。

初入人工智能,多多包涵

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐