【深度学习主题月】飞桨实战应用案例
wangwei8638 发布于2019-10 浏览:8226 回复:11
1
收藏
最后编辑于2022-04

前言:

近期有不少同学问,想学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兴起可以说万事具备,只欠东风,人工智能正处于井喷式爆发的前夜,未来的场景,可以尽情想象。

 

收藏
点赞
1
个赞
共11条回复 最后由用户已被禁言回复于2022-04
#12wangwei8638回复于2020-07

目前识别准确率到达85%,mark一下

0
#11wangwei8638回复于2019-11
#10 小雨青青润无声回复
这个应用面广吗?

很多领域都能用,比如大数据、网络爬虫、人工智能

0
#10小雨青青润无声回复于2019-11
#8 wangwei8638回复
学个python也不难

这个应用面广吗?

0
#9小雨青青润无声回复于2019-11
#5 wangwei8638回复
付出就会有收获

是啊,看到你就总获奖

0
#8wangwei8638回复于2019-11
#6 用户已被禁言回复
想要个C#的实例

学个python也不难

0
#7wangwei8638回复于2019-10
#6 用户已被禁言回复
想要个C#的实例

paddlepaddle官方模型都是python的

0
#6用户已被禁言回复于2019-10

想要个C#的实例

0
#5wangwei8638回复于2019-10
#4 小雨青青润无声回复
感谢分享,从Python语言学起,相信一定会有一个好的开始的

付出就会有收获

0
#4小雨青青润无声回复于2019-10

感谢分享,从Python语言学起,相信一定会有一个好的开始的

0
#3wangwei8638回复于2019-10

提高识别效果还需要优化模型,是有一定难度的

0
#2wangwei8638回复于2019-10

这里介绍实现过程

1
TOP
切换版块