前言:
近期有不少同学问,想学Ai如何入门、深度学习难吗、没有基础怎么办?百度飞桨(paddlepaddle)开源深度学习平台,致力于让深度学习技术的创新与应用更简单。本文以一个飞桨实战应用案例,简要介绍如何在AI Studio深度学习平台,利用paddlepaddle框架进行深度学习训练与预测。只要有热情,Everyone can AI。
一.如何快速入门
从零开始也没那么难,个人以为看视频、跑通Demo流程,是最快的学习途径。当然,想要开始,你需要具有以下知识储备:
1.火速入门视频课程
视频+文档+代码实操,AI学习三位一体。
AI核心技术:https://ai.baidu.com/paddlepaddle/player?id=11
Python基础入门:https://ai.baidu.com/paddlepaddle/player?id=88
AI Studio课程:https://aistudio.baidu.com/aistudio/course
2. PaddlePaddle深度学习框架
PaddlePaddle (PArallel Distributed Deep LEarning)是一个易用、高效、灵活、可扩展的深度学习框架,飞桨完整支持多框架、多硬件和多操作系统,为用户提供高兼容性、高性能的多端部署能力。依托业界领先的底层加速库,利用 Paddle Lite和 Paddle Serving 分别实现端侧和服务器上的部署。
PaddlePaddle官网:https://www.paddlepaddle.org.cn/
PaddlePaddle零基础入门:https://ai.baidu.com/forum/topic/show/943045
PaddlePaddle官方模型库:https://github.com/PaddlePaddle/models
由浅入深掌握深度学习技能:https://ai.baidu.com/forum/topic/show/956242
3. AI Studio深度学习平台
百度AI Studio是针对AI学习者的在线一体化开发实训平台. 本平台集合了AI教程, 深度学习样例工程, 各领域的经典数据集, 云端的超强运算及存储资源, 以及比赛平台和社区。
AI Studio 官网:https://aistudio.baidu.com/aistudio/index
AI Studio基本操作(一) Notebook篇:https://aistudio.baidu.com/aistudio/projectdetail/39212
AI Studio基本操作(二) Debug篇:https://aistudio.baidu.com/aistudio/projectdetail/69987
二.明确任务需求
登陆竞赛官网,明确任务需求、相关资料及提交说明:
https://aistudio.baidu.com/aistudio/competition/detail/8
1.比赛任务
以中文场景文字识别为主题,提供大规模的中文场景文字识别数据,对图像区域中的文字行进行预测,返回文字行的内容。
2.数据集的介绍
本次竞赛数据集共包括33万张图片,其中21万张图片作为训练集,12万张作为测试集。数据集采自中国街景,并由街景图片中的文字行区域(例如店铺标牌、地标等等)截取出来而形成。所有图像都经过一些预处理,将文字区域利用仿射变化,等比映射为一张高为48像素的图片,如下图所示:
(a) 标注:魅派集成吊顶
(b) 标注:母婴用品连锁
标注文件
平台提供的标注文件为.txt文件格式。样例如下:
其中,文件中的四列分别是图片的宽、高、文件名和文字标注。
3.提交格式
本次比赛要求必须提交使用深度学习平台飞桨(PaddlePaddle)训练的模型。参赛者要求以.txt 文本格式提交结果,其中每一行是图片名称和文字预测的结果,中间以 “\t” 作为分割符,示例如下:
4.基线使用教程
中文场景文字识别大赛官方基线:https://ai.baidu.com/forum/topic/show/954047
认真研究官方基线,往往可以事半功倍。
Step1 登录 https://aistudio.baidu.com/ ,创建Notebook项目,添加公开数据集《中文场景文字识别技术创新大赛_训练集》,运行项目。
Step2 解压训练数据集、baseline_code.zip压缩包
!tar xf data/data8429/train_images.tar.gz -C {解压路径}
!tar xf data/data8429/baseline_code.zip -C {解压路径}
Step3 建立数据集索引
本次比赛不限制词表,选手根据自行理解生成统计数据集中字符,并分配任意数字索引,将训练数据处理成数字。
Step4 根据{解压路径}修改train.py中的数据集路径,执行训练代码
!python {解压路径}/baseline_code/ocr_ctc_online/train.py
三.创建项目工程
1.进入AI Studio项目页,点击“创建项目”。
https://aistudio.baidu.com/aistudio/projectoverview/public/1
2.输入项目名称等相关信息,需要注意的是,预加载项目框架和项目环境需要与基线一致。
3.点击“添加数据集”,加入测试集和训练集。
4.运行项目
点击“运行”,运行项目。
5.选择“高级版”运行环境,点击“确定”进入项目工程。
6. AI Studio项目界面结构。
四.项目工程实现
总体思路:
(a)读取训练集文件,生成统计数据集中字符字典及反转字典(反转字典用于测试集检索中文字符),并分配顺序数字索引,将训练数据处理成数字。
(b)运用基线代码进行训练,生成训练模型。
(c)对测试集进行预测,生成预测结果txt
(d)提取测试集名称,与预测结果文件合并,生成最终提交结果txt
实现步骤:
1.解压数据集和基线代码
!unzip -q -d /home/aistudio data/data10140/baseline_code.zip && echo "baseline_code unzip finished"
!tar xf data/data10140/train_images.tar.gz -C data/data10140
!tar xf data/data8430/test_images.tar.gz -C data/data8430
2.训练集数据读取及预处理,生成中文字符字典(label_list.txt)。
生成结果如下图:
实现代码:
# 预处理数据,将其转化为标准格式。
#!/usr/bin/env python
# coding: utf-8
import codecs
import os
import random
import shutil
from PIL import Image
label_dict = {}
train_ratio = 9 / 10
all_file_dir = "data/data10140"
image_path_pre = os.path.join(all_file_dir, "train_images")
train_image_dir = os.path.join(all_file_dir, "trainImageSet")
if not os.path.exists(train_image_dir):
os.makedirs(train_image_dir)
eval_image_dir = os.path.join(all_file_dir, "evalImageSet")
if not os.path.exists(eval_image_dir):
os.makedirs(eval_image_dir)
train_file = codecs.open(os.path.join(all_file_dir, "train.txt"), 'w', encoding='utf-8')
eval_file = codecs.open(os.path.join(all_file_dir, "eval.txt"), 'w', encoding='utf-8')
#数据集总的标签
label_list = os.path.join(all_file_dir, "train.list")
train_count = 0
eval_count = 0
class_set = set()
with codecs.open(label_list, encoding='utf-8') as f:
for line in f:
parts = line.strip().split()
file, label = parts[2], parts[3]
if '/' in label or '\'' in label or '\n' in label or '.' in label or '!' in label or '-' in label or '$' in label or '&' in label or '@' in label or '?' in label or '%' in label or '(' in label or ')' in label or '~' in label:
continue
for e in label:
class_set.add(e)
if random.uniform(0, 1) <= train_ratio:
shutil.copyfile(os.path.join(image_path_pre, file), os.path.join(train_image_dir, file))
train_file.write("{0}\t{1}\n".format(os.path.join(train_image_dir, file), label))
train_count += 1
else:
shutil.copyfile(os.path.join(image_path_pre, file), os.path.join(eval_image_dir, file))
eval_file.write("{0}\t{1}\n".format(os.path.join(eval_image_dir, file), label))
eval_count += 1
print("train image count: {0} eval image count: {1}".format(train_count, eval_count))
class_list = list(class_set)
class_list.sort()
print("class num: {0}".format(len(class_list)))
print(class_list)
with codecs.open(os.path.join(all_file_dir, "label_list.txt"), "w",encoding='utf-8') as label_list:
label_id = 0
for c in class_list:
label_dict[c] = label_id
label_list.write("{0}\t{1}\n".format(c, label_id))
label_id += 1
print(label_dict)
3.开始训练,生成模型文件
!python work/baseline_code/ocr_ctc_online/train.py
根据{解压路径}修改train.py中的数据集路径,执行训练代码。
4.开始预测 ,生成预测结果(infer_reslut.txt)
!python work/baseline_code/ocr_ctc_online/infer.py --model_path="thirdparty/output/model_825000" --input_images_dir="data/data8430/test_images" --input_images_list="work/test1.txt"
根据{解压路径}修改 infer.py中的数据集路径,执行训练代码。
结果如下图:
5.提取文件名称(name_list.txt)
结果如下图:
实现代码:
# coding: utf8
# 获取指定图片的长和宽
from PIL import Image
import glob
import os
import codecs
WSI_MASK_PATH = 'data/data8430/test_images'#存放测试集图片的文件夹路径
WORK_PATH = 'work/'
#paths = glob.glob(os.path.join(WSI_MASK_PATH, '*.jpg'))
#paths.sort()
data_list = []
for root, dirs, files in os.walk(WSI_MASK_PATH):
#print(root) #当前目录路径
#print(dirs) #当前路径下所有子目录
#print(files) #当前路径下所有非目录子文件
n = len(files)
data_list = files
print("files num: {0}".format(len(files)))
'''with codecs.open(os.path.join(WORK_PATH, "test_list.txt"), 'w',encoding='utf-8') as test_list:
for f in data_list:
img = Image.open(os.path.join(WSI_MASK_PATH, f))
#print(img.size)
test_list.write("{0}\t{1}\t{2}\t{3}\n".format(img.size[0],img.size[1],f,'1'))'''
with codecs.open(os.path.join(WORK_PATH, "name_list.txt"), 'w',encoding='utf-8') as name_list:
for c in data_list:
#print(c)
name_list.write("{0}\n".format(c))
6. 合并测试集图片名称和预测结果(result_sub.txt)
最终结果如下图:
实现代码:
#合并测试集图片名称 生成提交预测结果
import os, sys
file1path = 'work/name_list.txt'
file2path = 'infer_reslut.txt'
file_1 = open(file1path,'r',encoding='utf-8')
file_2 = open(file2path,'r',encoding='utf-8')
list1 = []
for line in file_1.readlines():
ss = line.strip()
list1.append(ss)
file_1.close()
print(len(list1))
list2 = []
for line in file_2.readlines():
ss = line.strip()
list2.append(ss)
file_2.close()
print(len(list2))
file_new = open('result_sub.txt','w',encoding='utf-8')
for i in range(len(list1)):
sline = list1[i] + '\t' + list2[i]
file_new.write(sline+'\n')
file_new.close()
7.提交结果
点击 “立刻获取”获取token,利用下列命令提交(result_sub.txt根据自己路径修改)。
!rm -rf submit.sh
!wget -O submit.sh http://ai-studio-static.bj.bcebos.com/script/submit.sh
!sh submit.sh result_sub.txt token
五.几点体会
1.人工智能技术学习的门槛其实并不高,特别是国内AI开放平台逐步成熟之后,更是大大降低了人工智能技术的开发难度,正如百度所想达成的愿景:Everyone can AI。所以,有志于人工智能领域开发的同学,在AI技术如火如荼发展的当下,现在开始还不算晚。
2.真正的让AI技术为我所用,甚至实现具有行业/产业创新、前瞻性应用场景的落地,基础知识必不可少的,比如深度学习、计算机视觉、神经网络、模型算法等基础概念的理解,当然也必须掌握一门编程语言,这里推荐Python, Python 号称是最接近人工智能的语言,因为它的动态便捷性和灵活的三方扩展,成就了它在人工智能领域的丰碑地位,同时也是很容易入手的一门语言。
3. AI时代,未来已来。人工智能的发展先决条件,云计算、大数据、深度学习算法的成熟运用,以及已经到来的5G让万物互联成为可能,AI兴起可以说万事具备,只欠东风,人工智能正处于井喷式爆发的前夜,未来的场景,可以尽情想象。
目前识别准确率到达85%,mark一下
很多领域都能用,比如大数据、网络爬虫、人工智能
这个应用面广吗?
是啊,看到你就总获奖
学个python也不难
paddlepaddle官方模型都是python的
想要个C#的实例
付出就会有收获
感谢分享,从Python语言学起,相信一定会有一个好的开始的
提高识别效果还需要优化模型,是有一定难度的
这里介绍实现过程