1.前言
上周是第一个上课周,其中一门“中国马克思主义与当代”(这里可能更应该用书名号)课程成功的引起了我的注意,这门课的主讲老师不但幽默风趣,知道超多的梗,而且为人十分直率。他开宗明义的指出凡是如下图所示的蓝色直角方框的PPT页,都将是本课程的重点。
然而老师表示不会分享PPT,但允许拍照。根据一般经验,这种课程最早也要考试前两周启动复习,届时这种重点PPT的照片积攒下来可能多达几十张甚至上百张,如果到时候逐一翻看,显然效率不高。
因此我们想到,能否通过现有的一些技术,如OCR等对这些照片进行统一的识别及提取,从而快速识别整理出本课程的重点。
在本次实验中我们尝试了tesseract OCR、QQ截屏提供的OCR以及百度aip平台上的OCR,发现直接使用效果并不理想,因此设计了两阶段的方式,引入了YOLOv3(v4 v5还没看过,先用v3好了)进行第一阶段的检测定位,然后再对每个检测目标进行第二阶段OCR识别,将结果加以整理。
2.一些常见的OCR
目前常见的OCR工具有汉王、Tesseract、百度Aip等工具。经过测试,Tesseract的中文识别十分糟糕,这里就不做展示了,Tesseract似乎是可以支持训练的,但我并没那个闲工夫,于是放弃了Tesseract。
下面是百度Aip平台提供的OCR接口的效果图。
可以看到Aip对汉字的识别相当不错,基本能框定所有汉字。但同时也会造成一些误解,如把左侧的一排开关误认为是字符,以及右侧黑板上的字母,实际上这虽然是字符,但并非我们想要的内容。
QQ TIM也提供了截屏文字识别,目测效果还赶不上百度。
3.使用YOLO(v3)进行目标检测的准备工作
YOLO版本的不断升级和各类网络版本的实现都使得使用YOLO变得简单。目前YOLOv5已经推出了,但我怎么了解v4v5,感觉v3效果还行,勉强能达到目标。
这里我们采用darknet实现的YOLOv3,这是因为darknet基本是由C语言编写的,所需依赖比较少,在windows上需要安装并配置OpenCV(安装配置很简单,不再赘述,注意拷贝dll文件到System32目录下),如果需要GPU,有CUDA环境就可以了。GitHub链接如下。
yolo darknet
我是在windows上实验的,因此需要进入build/darknet目录下,显然.sln文件是visual studio的工程文件,所以强烈推荐使用Visual Studio!默认的darknet.sln是GPU版本,如果没有GPU的话就打开darknet_no_gpu.sln就好了。
打开之后,直接生成项目,一般来说不会报错,可以顺利在x64文件夹中找到生成的可执行文件,如下图红框所示。
在使用YOLOv3前,还需要准备模型文件,上网下载就可以啦,很容易找到,比如百度云链接。
同时注意上图蓝色框部分,可以根据这个脚本输入命令,用notepad打开后其中内容是
darknet.exe detector test cfg/coco.data yolov3.cfg yolov3.weights -i 0 -thresh 0.25 dog.jpg
标准的命令格式应该是
darknet.exe detector [train/test/valid/demo/map] [data] [cfg] [weights (optional)]
我们尝试直接双击这个cmd文件,会得到默认的检测图片结果。
4.制作数据集进行训练
制作数据集,本文不展开介绍了,可以参考知乎大佬的这篇文章。我的数据集只有四张图片,但事实证明够用了,YOLO预训练模型上训练我的数据集,学习能力很强。
有几个大坑需要在此提及一下!
首先是编写cfg文件的时候,需要注意,训练和检测所用的cfg在batch和subdivision两个参数上是不同的,yolov3的cfg文件也用注释指出了。
在测试阶段,两个参数都必须是1,而训练阶段推荐使用64/16 的参数。另一个大坑就是,千万不要用CPU训练,有GPU一定要用GPU,没有GPU也要创造GPU。使用CPU可以自行想象如下画面
一般此处倾向于使用大型linux服务器来完成训练。在linux上使用darknet更加简单,大致步骤如下。
1)首先下载项目
git clone https://github.com/AlexeyAB/darknet.git
2)修改Makefile
启用GPU,将此参数设为1
同时配置CUDA的位置,如果你的CUDA不在/usr/local/cuda,必须要手动配置,否则不用。总共有三处要修改,见下图
3)编译
直接make就行,可能会有很多warning,但一般不会出错,可以顺利得到可用gpu的darknet可执行文件。
4)训练
按照如下格式就可以了,我的数据集就叫marx
./darknet detector train data/marx.data cfg/yolov3-marx.cfg_train darknet53.conv.74
值得注意的是,许多大型服务器上,并不运行直接在终端提交命令,如果强行提交,也可能会找不到CUDA环境而退出。比较优雅的方式是以作业的形式提交任务,并不断查看作业的运行情况,当然这需要服务器本身提供作业调度。
5)耐心等待
我是某天晚上提交了作业,然后就去睡觉了,第二天还没结束,原来是因为cfg文件中预设的最大轮数太大了。
不过每经过一定轮数,darknet会自动保存模型在backup中,所以直接退出就好了。
其中xxx_last.weights 就是最终的模型文件,我们用它对一张不在训练集中的图片进行测试,得到如下效果图。
可以看到模型能够成功标定title(标题)和option(要点)。通过对这些区域单独做OCR识别,就可以很轻易地整理出这门课的重点了。
5.结果展示
关于怎样将目标检测的结果和OCR实现对接,此处不赘述了,代码写的也比较乱,准确的说是非常糟糕,但总能完成任务。最终整理的第一节课的重点如下:
========================
问:什么是当代
1.人类社会进入21世纪以来
2.科学社会主义焕发生机
3.特别是党的十八大以来
4.拓展了发展中国家的现代化路径
5.中国特色社会主义进入新时代
========================
一,当代世界正处于大发展大变革大调整时代机遇与挑战
1.思想文化交流交融交锋
2.生态环境问题
3.经济全球化深入发展
4.科学技术迅猛发展
5.世界多极化
6.人类社会加速转型
========================
二、和平、发展、合作、共赢的时代潮流更加强劲
1.中国走和平发展道路
2.全球命运与共各国相互依存
3.全球性矛盾和挑战也不断增
4.但决不放弃正当权益
========================
三、中国日益走近世界舞台中央所面临的复杂形势
1.世界格局中的稳定器
2.推动世界和平发展
3.贡献世界经济与转型高质量增长
4.中国“威胁论”与单边主义势力
========================
一、中国发展的新的历史方位思考1:“不平衡”和“不充分”有什么区别?思考2:“两个一百年”指的是什么?
1.发展阶段
2.奋斗目标
3.主要矛盾
4.国际环境
========================
中国特色社会主义进入新时代的重大意义
1.于己:伟大复兴前景
2.于世界:发展中国家的经验
3.于理:科学社会主义
4.于他人:打破普世模式
========================
中国推动构建人类命运共同体四个共
1.共同发展
2.共建发展
3.共商发展
4.共享发展
========================
6.总结
随着YOLO版本的发展,其检测能力不断提高,可应用性也大幅增强。YOLO也可以作为许多任务的前序步骤,如在本实验中,我们用于精确划定OCR的区域,对提高最终结果的精确度起到了重要作用。同时我们注意到CPU和GPU在训练darknet时速度差距十分巨大,因此在完成类似训练任务时,应当尽可能使用GPU进行训练,缩短训练时间。
另外,本实验最终结果显示,所谓“重点”,仍是一些大纲性质的内容,远不足以在考试中取得好成绩。要取得理想的考试成绩,出了了解重点大纲,还要认真学习课程本身,要对课本有一定了解。