【源码】基于百度EasyDL平台的数字识别分类

一、引言

我目前是大二年级上学期,临近期末居然开了一门人工智能导论,最后要求使用百度EasyDL进行图像的分类识别,至于分类的内容嘛,哈哈哈,自己选择,课上脑子里各种分类的想法,最后由于懒惰,还是选择进行数字0-9的识别分类,当然还有更懒惰的,用python生成数据集和测试集,下面来看看流程吧~

二、生成数据

今天借鉴了一个大佬写的一个生成手写体图片的 Python 程序,可以批量生成手写体数字数据集,在此分享下大佬的生成 30*30像素 的手写体数字 1-9 图片 的实现方法:

大概流程:新建空白图像 >>> 生成随机数 1-9 >>> 将数字写到空白图像上 >>> 旋转、扭曲 处理 >>> 得到 “手写体数字”

lt29yt.png

具体的实现流程不再赘述,可直接看程序:

# Created on:   2019-12-31
# Author:       王荣胜
# Blog:      https://sqdxwz.com
# Github:       https://github.com/WangRongsheng
# 生成手写体数字


import random
import os
from PIL import Image, ImageDraw, ImageFont

random.seed(3)
path_img = "data_pngs/"


# 在目录下生成用来存放数字 1-9 的 9个文件夹,分别用 1-9 命名
def mkdir_for_imgs():
    for i in range(49, 58):
        if os.path.isdir(path_img + "Num_" + chr(i)):
            pass
        else:
            print(path_img + "Num_" + chr(i))
            os.makedirs(path_img + "Num_" + chr(i))


# generate folders
# mkdir_for_imgs()


# 删除路径下的图片
def del_imgs():
    for i in range(1, 10):
        dir_nums = os.listdir(path_img+ "Num_"  + str(i))
        for tmp_img in dir_nums:
            if tmp_img in dir_nums:
                # print("delete: ", tmp_img)
                os.remove(path_img + "Num_" + str(i) + "/" + tmp_img)
    print("Delete finish", "\n")

# del_imgs()


# 生成单张扭曲的数字图像
def generate_single():
    # 先绘制一个50*50的空图像
    im_50_blank = Image.new('RGB', (50, 50), (255, 255, 255))

    # 创建画笔
    draw = ImageDraw.Draw(im_50_blank)

    # 生成随机数1-9
    num = str(random.randint(1, 9))

    # 设置字体,这里选取字体大小25
    font = ImageFont.truetype('simsun.ttc', 20)

    # xy是左上角开始的位置坐标
    draw.text(xy=(18, 11), font=font, text=num, fill=(0, 0, 0))

    # 随机旋转-10-10角度
    random_angle = random.randint(-10, 10)
    im_50_rotated = im_50_blank.rotate(random_angle)

    # 图形扭曲参数
    params = [1 - float(random.randint(1, 2)) / 100,
              0,
              0,
              0,
              1 - float(random.randint(1, 10)) / 100,
              float(random.randint(1, 2)) / 500,
              0.001,
              float(random.randint(1, 2)) / 500]

    # 创建扭曲
    im_50_transformed = im_50_rotated.transform((50, 50), Image.PERSPECTIVE, params)

    # 生成新的30*30空白图像
    im_30 = im_50_transformed.crop([10, 10, 40, 40])

    return im_30, num


# 生成手写体数字1-9存入指定文件夹1-9
def generate_1to9(n):
    # 用cnt_num[1]-cnt_num[9]来计数数字1-9生成的个数,方便之后进行命名
    cnt_num = []
    for i in range(10):
        cnt_num.append(0)

    for m in range(1, n + 1):
        # 调用生成图像文件函数
        im, generate_num = generate_single()

        # 取灰度
        im_gray = im.convert('1')

        # 计数生成的数字1-9的个数,用来命名图像文件
        for j in range(1, 10):
            if generate_num == str(j):
                cnt_num[j] = cnt_num[j] + 1

                # 路径如 "F:/code/***/P_generate_handwritten_number/data_pngs/1/1_231.png"
                # 输出显示路径
                print("Generate:", path_img + "Num_" + str(j) + "/" + str(j) + "_" + str(cnt_num[j]) + ".png")
                # 将图像保存在指定文件夹中
                im_gray.save(path_img + "Num_" + str(j) + "/" + str(j) + "_" + str(cnt_num[j]) + ".png")

    print("\n")
    # 输出显示1-9的分布
    print("生成的1-9的分布:")
    for k in range(9):
        print("Num", k + 1, ":", cnt_num[k + 1], "in all")

# generate n times
# generate_1to9(1000)


def main():
    #删除操作
    del_imgs()
    #生成文件夹操作
    #mkdir_for_imgs()
    #生成数字图片操作,可以修改生成图片的数量
    generate_1to9(10)
    
main()

三、数据集与测试集

我的想法是对数据集的图片和测试集的图片分开生成,其中数据集的规模大小为1000张,测试集10张,至于测试集的数量为什么这么少,是因为在EasyDL平台需要每次自己上传测试的图片(每次一张),那就不要为难自己了嘛,就要十张~

四、EasyDL平台训练

跟着官方的操作文档和教学视频一顿骚操作:

  1. 创建模型
  2. 上传数据
  3. 训练模型
  4. 校验模型

其中最耗费时间的就是上传处理数据,因为是官方的开放免费平台,资源投入肯定不会很大,所以训练数据的数据集处理起来慢是很正常的。

其次是训练模型,我上传了1000张0-9数字的数据集,其实不到1000张,训练了我估计应该有三四十分钟吧,模型训练完毕。

ltfzAf.png

因为是同样的程序生成的数据图片,识别效果大部分还是不错的,除了一些我的眼睛都识别不太出来的。

lthhvj.png

五、实验心得

导论课还是挺有趣的,毕竟我大部分的东西都已经提前接触过了,听起来也游刃有余,对于实验,我觉得时间安排不太合适,不然我肯定会搞事情的啦,奈何期末已到,小弟渣渣复习,所以将就下吧…

对于百度的这个平台,我觉得还是不太稀奇的,因为每个大厂都有自己的API等平台,就像华为的AI平台一样,但是我的老师一直在谈论百度的,我觉得这个时候,(百度,打钱!!!)。

lt4jFf.png

总结来说,心情愉快,安心复习~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落难Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值