【AI参赛经验】汉字书法识别入门—by:真的学不会
各位人工智能爱好者,大家好!
由TinyMind发起的 #第一届汉字书法识别挑战赛# 正在火热进行中,比赛才开始3周,已有数只黑马冲进榜单。目前TOP54全部为90分以上!可谓竞争激烈,高手如林。不是比赛太简单,是大佬们太厉害了啊!
查看榜单
本次比赛主要是以学习交流为目的,吸引了不少萌新们报名参赛~虽是入门级别的赛题,对于没动手实战过的同学,还是有些不知所措。为此TinyMind特邀战场中奋勇拼搏的三名前锋,为大家整理了一些经验心得,用不同的解题思路,以启发新手们如何开动,参与到本次书法识别比赛中。
以下为参赛ID:真的学不会 的经验分享
汉字书法识别入门
前段时间参加了一次TinyMind举办的汉字书法识别挑战赛,说是挑战赛其实就是一场练习赛。为一些刚刚入门的同学和没有比赛经验的同学提供了一个探索图像识别领域的平台。我目前是暂列榜首(没想到转眼就被超越了-。-),所以把自己的思路和想法稍微做一个分享,给有需要的人提供一个base line。
先来看数据集~~
100个汉字的训练集
10000张书法图片的测试集
上面的训练集总共有100个汉字,每一个汉字都有400张不同字体的图片,数据量上来看算是一个比较小的数据集。
等等,看到的确定是汉字吗,第一眼望过去我是真的emmmmm…..甲骨文,篆体各种字体都冒出来了。先喝口水冷静一下,仔细看一看发现图片都是gray的。想了一想突然觉得这个和mnist并没有太大的区别只是字体更加复杂一些,可能要用稍微深一点的网络来训练。
图片看完了,那么开始撸代码了。分析终究是分析,还是实践才能说明一切。
数据集划分
竞赛中只给了train和test,所以需要自己手动划分一个val来做模型训练的验证测试。在这里简单说明一下经常用的两种划分数据集的方法。
- 本地划分
- 内存划分
本地划分:图片是按照文件夹分类的,所以只需要从每个文件夹中按ratio抽取部分图片到val中即可,当然不要忘记了shuffle。
内存划分:把所有图片和标签读进内存中,存为list或者array然后shuffle后按长度划分。前提是把数据读进去内存不会爆炸掉。内存划分只适合小型数据集,不然会Boom!!!
注:划分数据集的时候一定要打乱数据,shuffle很重要!!!
1 def move_ratio(data_list, original_str, replace_str):
2 for x in data_list:
3 fromImage = Image.open(x)
4 x = x.replace(original_str, replace_str)
5 fromImage.save(x)
注:这里只给出部分代码,文章最下面github有完整链接。
1 for d in $(ls datadir); do
2 for f in $(ls datadir/$d | shuf | head -n 100 ); do
3 mkdir -p valid_dir/$d/
4 mv datadir/$d/$f valid_dir/$d/;
5 done;
6 done
注:这里引用dwSun的linux shell脚本,如果想用简单脚本实现也可以采用他的代码~
模型建立与数据预处理
对于CNN网络来说,大的数据集对应大的训练样本,如果小的数据集想要用深层次的网络来训练的话,那么必不可少的一步就是数据增强。
数据增强的大部分方法,所有深度学习框架都已经封装好了。这里我采用的是keras自带的数据增强方法。
1 from keras.preprocessing.image import ImageDataGenerator
2 datagen = ImageDataGenerator(
3 # horizontal_flip=True,
4 width_shift_range=0.15,
5 height_shift_range=0.15,
6 rescale=1 / 255
7)
由于汉字是具有笔画顺序的,所以做了翻转以后训练的效果不是很好。这里就做了一个宽度和高度的偏移,由于给的数据集图片长宽不是固定的而且字体的内容也是有长有短。所以用这两种增强方式可以提高模型的准确率,结果测试这两种方式还是有效的。
数据处理完了,那么下面就是我们可爱的CNN网络模型了
cnn一把梭
嗯,就是干。
1# bn + prelu2def bn_prelu(x):3 x = BatchNormalization()(x)4 x = PReLU()(x)5 return x6# build baseline model7def build_model(out_dims, input_shape=(128, 128, 1)):8 inputs_dim = Input(input_shape)9 x = Conv2D(32, (3, 3), strides=(2, 2), padding='valid')(inputs_dim)
10 x = bn_prelu(x)
11 x = Conv2D(32, (3, 3), strides=(1, 1), padding='valid')(x)
12 x = bn_prelu(x)
13 x = MaxPool2D(pool_size=(2, 2))(x)
14 x = Conv2D(64, (3, 3), strides=(1, 1), padding='valid')(x)
15 x = bn_prelu(x)
16 x = Conv2D(64, (3, 3), strides=(1, 1), padding='valid')(x)
17 x = bn_prelu(x)
18 x = MaxPool2D(pool_size=(2, 2))(x)
19 x = Conv2D(128, (3, 3), strides=(1, 1), padding='valid')(x)
20 x = bn_prelu(x)
21 x = MaxPool2D(pool_size=(2, 2))(x)
22 x = Conv2D(128, (3, 3), strides=(1, 1), padding='valid')(x)
23 x = bn_prelu(x)
24 x = AveragePooling2D(pool_size=(2, 2))(x)
25 x_flat = Flatten()(x)
26 fc1 = Dense(512)(x_flat)
27 fc1 = bn_prelu(fc1)
28 dp_1 = Dropout(0.3)(fc1)
29 fc2 = Dense(out_dims)(dp_1)
30 fc2 = Activation('softmax')(fc2)
31 model = Model(inputs=inputs_dim, outputs=fc2)
32 return model
这里用了6个简单的卷积层,和PRelu+bn层。
下面是一个比较大的模型ResNet50,模型是已经merge在了keras的applications中,可以直接用。不过需要调整分类层。
1def resnet50_100(feat_dims, out_dims):2 # resnett50 only have a input_shape=(128, 128, 3), if use resnet we must change3 # shape at least shape=(197, 197, 1)4 resnet_base_model = ResNet50(include_top=False, weights=None, input_shape=(128, 128, 1))5 # get output of original resnet506 x = resnet_base_model.get_layer('avg_pool').output7 x = Flatten()(x)8 fc = Dense(feat_dims)(x)9 x = bn_prelu(fc)
10 x = Dropout(0.5)(x)
11 x = Dense(out_dims)(x)
12 x = Activation("softmax")(x)
13 # buid myself model
14 input_shape = resnet_base_model.input
15 output_shape = x
16 resnet50_100_model = Model(inputs=input_shape, outputs=output_shape)
17 return resnet50_100_model
好了,炼丹炉有了接下来就是你懂的。
训练模型
训练模型和调参真的是一个技术活,这里我跑了共40个epoch。思路只有一个那就是先把train的数据跑到loss下降并且先过拟合再说。只要过拟合了后面的一切都好调整了,如果训练数据都不能到过拟合或者99以上那么要仔细想想数据量够不够和模型的选择了。
loss
acc
可以很清楚的看出来,训练数据集已经过拟合了。我用的优化器是sgd,学习率设置的是lr=0.01。val_acc可以跑到了0.94左右,这是一个比较正常的训练水平。还可以进一步的提高。
提高方法
数据增强:采取其他的数据增强方法进一步扩大训练数据,这里可以采用GAN来生成近似于真实图片的数据。
衰减学习率:当到达一定epoch的时候,loss不再下降了这个时候可以通过减小学习率的方法进一步训练。
模型融合:模型融合的方法在大部分数据集上都会有所提高,这个是最常用的一种竞赛方式。
以上就是我自己做的流程和思路,提交结果和评测的代码写在我的github上面了,有兴趣参加比赛练手的同学可以参考一下。
github地址:https://github.com/FlyEgle/chinese_font_recognition/
好多小伙伴是从开发或者是其他工程上转到AI的,所以下面我给有需要的同学列举出一些必要的基础知识点.
基础知识
数学:线性代数和概率论是必须要会的,而且基本的概念和计算都要懂。可以把高数,线性代数和概率论看一遍,这里推荐李航的统计学习方法。
图像处理:如果是做图像方面的小伙伴,那么需要把冈萨雷斯的图像处理那本巨作看一遍,需要懂基本的图像概念和基本方法。
机器学习:周志华的西瓜书
深度学习:
如果能把这几本书完全吃透那也很厉害了,当然学习知识点的途径还有很多。
- 知乎
- 微信公众号
- TinyMind
加油!!
欢迎对汉字书法识别感兴趣的同学踊跃参赛!竞赛地址:https://www.tinymind.cn/competitions/41
文章转自 #汉字书法识别挑战赛#经验分享 专栏
【AI参赛经验】汉字书法识别入门—by:真的学不会相关推荐
- 【AI参赛经验】深度学习入门指南:从零开始TinyMind汉字书法识别——by:Link
各位人工智能爱好者,大家好! 由TinyMind发起的#第一届汉字书法识别挑战赛#正在火热进行中,比赛才开始3周,已有数只黑马冲进榜单.目前TOP54全部为90分以上!可谓竞争激烈,高手如林.不是比赛 ...
- TinyMind第一届汉字书法识别挑战赛
报名地址:http://www.tinymind.cn/competitions/41?from=blog 比赛介绍 手写字体识别一直是人工智能领域一个热门研究方向,这次我们联合书法领域的权威合作伙伴 ...
- 【AI参赛经验】汉字书法识别比赛经验心得——by:microfat_htu
各位人工智能爱好者,大家好! 由TinyMind发起的#第一届汉字书法识别挑战赛#正在火热进行中,比赛才开始3周,已有数只黑马冲进榜单.目前TOP54全部为90分以上!可谓竞争激烈,高手如林.不是比赛 ...
- 【AI竞赛】TinyMind汉字书法识别挑战赛开始报名啦!!
书法是中国及深受中国文化影响过的国家和地区特有的一种文字美的艺术表现形式.书法艺术的背景是中国传统文化.书法植根于中国传统文化土壤,传统文化是书法赖以生存.发展的背景.我们今天能够看到的汉代以来的书法 ...
- 深度学习入门指南:从零开始TinyMind汉字书法识别
深度学习入门指南:从零开始TinyMind汉字书法识别 这几天在刷这个新出的比赛,受举办方邀请谢了一篇文章,也转到CSDN来和大家分享下吧.话说TinyMind不是被CSDN收购了么,我这算不算把统一 ...
- 基于PyTorch的TinyMind 汉字书法识别部分代码详解
文章目录 0. 前言 1 遇到的问题 1.1 NameError: name 'cv2' is not defined 1.1.1 OpenCV下载 1.1.2 OpenCV安装 打开Anacoda3 ...
- TinyMind 汉字书法识别竞赛开启总决赛啦!!
手写字体识别一直是人工智能领域一个热门研究方向,TinyMind联合书法领域的权威合作伙伴举办了一次汉字书法识别大赛,为广大人工智能和手写字体识别技术爱好者提供了一个练习和交流的机会. 竞赛开始后,高 ...
- 【人工智能项目】深度学习实现汉字书法识别
[人工智能项目]深度学习实现汉字书法识别 背景介绍 竞赛数据提供100个汉字书法单字,包括碑帖,手写书法,古汉字等.图片全部为单通道宽度jpg,宽高不定. 数据集介绍 训练集:每个汉字400张图片,共 ...
- TinyMind汉字书法识别大赛2018百度-西交大·大数据竞赛 比赛模板
最近真的太忙太忙太忙/(ㄒoㄒ)/~ --------------------------------------- 某些新手(没错,说的就是我)在刚接触深度学习比赛的时候,往往会有些不知所措.嗯,直 ...
最新文章
- 中科院微生物所王军课题组建立靶向RNA的病原检测新方法mtNGS和mtTGS
- java 字符串原子变量,如何在java中提供原子读/写2个变量?
- android 电源管理 关闭屏幕,Android之PowerManager电源管理
- ruby连接mysql
- xbox one s驱动_理想照进现实 理想ONE开始接受预定
- nginx实现负载均衡配置
- 20145101 《Java程序设计》第7周学习总结
- 将XML文件数据插入到数据库中
- celery+rabbitmq+redis 分布任务队列探索(一)
- 将点分十进制转换为ip地址表示
- 实习周记----第三周
- Tmall商品详情API接口
- 关于CDN和DNS技术的解析以及搭建智能DNS的方法
- 纯属娱乐的涂色绘画系统
- LORA大模型加速微调和训练算法
- 判断并求出两个圆的交点(平面几何)
- php大商创商城,news.php · Mihok/ecshop大商创商城 - Gitee.com
- ODOO实现环境检测机构检测业务管理系统
- 范德堡计算机科学硕士,范德堡大学计算机科学硕士排名第58(2020年TFE Times排名)...
- 群体创新更能促进社会进步