一个使用 OCR 技术简化 D1 树木生长调查的设想

2021-01-22 09:00:31, 祝介东 北京力高泰科技有限公司


Dendrometer D1树体茎干生长记录仪。D1用于测量直径介于10-66cm的树体生长变化。如果树体直径超过66cm,可将两个卷尺相连,扩展量程。图源/developmentnews

尽管使用方便,搞过森林调查的都知道,每次调查完后输入数据都很累人。借助OCR 技术,如果我们能将一些必要信息直接在树木上挂牌(当然这是流行做法),然后拍照将其上面的信息读取,那么能减少很多数据输入工作。这里尝试使用 python 比较流行的一个 easyocr 库来尝试实现。

声明:我没有试过真实场景,仅仅探索其可能性,因为我上一次搞调查还是十几年前了。没照片,没数据,没测试真实情况,但想来应该不难,至少是部分实现起来不难。


整个测试使用的 anaconda + vscode,没有安装 CUDA,因为嫌弃英伟达麻烦,我不介意跑程序的这点时间,介意的可以安装。

创建虚拟环境

移除清华源

我原来使用的 anaconda 用的是清华源,但有一段时间没装库,这次用一直报错,查了之后发现原来是清华被迫停止了服务 https://blog.csdn.net/sean2100/article/details/80998643

1conda config --remove-key channels

不用清华源,恢复默认的源,这也是无奈之举。

创建虚拟环境

创建一个虚拟环境,以免破坏我原来的依赖关系(这点python 做的挺好,当然也因为它太容易破坏依赖关系了,R 多数情况下还好):

1conda create -n easyocr python=3.8

话说我使用官方源也并不觉得多慢,可能是心里不急吧,随他下去,反正我有别的事情要做。

激活虚拟环境,在这个环境下进行相关操作:

1conda activate easyocr

在 pytorch 官方网站(https://pytorch.org/)进行选择,也就是选择与电脑相对应的版本:



其中,为了避免 CUDA 安装的麻烦,我选择了 NONE,也就是在 CPU 模式下使用,


1conda install pytorch torchvision torchaudio cpuonly -c pytorch


后尝试使用清华的 PyPI  进行easyocr 的安装:


1pip install https://pypi.mirrors.ustc.edu.cn/simple/ easyocr


这个都说清华或中科大的国内源快,但我试了几次之后都报错,无法成功安装,最后用官方源的尝试了大概三四次安装成功了:


1pip install easyocr


历经艰辛,测试后无问题,终于安装完成了, import  一下该库,如果不报错,一切就 ok 了:


1(easyocr) C:\\Users\\ASUS>ipython
2Python 3.8.5 (default, Sep  3 202021:29:08) [MSC v.1916 64 bit (AMD64)]
3Type ''copyright''''credits'' or ''license'' for more information
4IPython 7.19.0 -- An enhanced Interactive Python. Type ''?'' for help.
5
6In [1]: import easyocr
7Matplotlib is building the font cache; this may take a moment.
8
9In [2]:


正常导入,没有问题,波折当然算作是网络的锅。

测试

vscode 选择创建的虚拟环境:

ctr+shift+p -> python: select interperter ,然后找到刚才新建的 easyocr 虚拟环境即可。不多说,直接看看其识别能力。

测试图片为网上搜的蒙古栎的挂牌:

处理一张图片的用法很简单


1from os import listdir
2import easyocr
3
4reader = easyocr.Reader([''ch_sim'',''en''])
5print(result)


结果为:


1[([[1871], [4471], [44791], [18791]], ''蒙古栎'', 0.9842442870140076), ([[091], [12991], [129135], [0135]], ''拉丁名:'', 0.860361635684967), ([[13891], [45991], [459143], [138143]], ''Quercus mongolica'', 0.4963034391403198), ([[0128], [322128], [322176], [0176]], ''科`属:壳斗科栎属'', 0.44434353709220886), ([[0166], [462166], [462214], [0214]], ''原产地:`中国.俄罗斯.日本'', 0.40092286467552185), ([[243200], [630200], [630250], [243250]], ''极度耐寒.保持水土能力'', 0.6140349507331848), ([[67207], [225207], [225251], [67251]], ''征:喜光'', 0.9321740865707397), ([[0209], [41209], [41251], [0251]], ''特'', 0.9985476136207581), ([[138237], [560237], [560288], [138288]], ''极强.能防止火灾快速蔓延'', 0.9191053509712219)]


有点小小的误差,但看上去只是最后一行字太多,然后排列不规则的原因,因为字是都识别了。如果想一下子看到需要的内容,而不带边框坐标以及判断的准确率,则可以:


1reader.readtext(''mgl.png'', detail = 0)


结果对人眼比较友好:


1[''蒙古栎'',
2 ''拉丁名:'',
3 ''Quercus mongolica'',
4 ''科`属:壳斗科栎属'',
5 ''原产地:`中国.俄罗斯.日本'',
6 ''极度耐寒.保持水土能力'',
7 ''征:喜光'',
8 ''特'',
9 ''极强.能防止火灾快速蔓延'']

大批量数据的处理

那怎么结合 D1 来用呢?每棵树都挂牌了,如果仅仅是记录 D1 数据最简单了,每棵树拍两幅图片,一副是需要的挂牌信息,另一幅为 D1 数据,拍完走人,回办公室程序处理挂牌信息(间隔一个图片,也就是 D1 的读数照片,读取照片即可,非常简单),自己读取 D1 数据(OCR 搞定 D1 很难)。这样我们不必在样地耽搁太久,也不用担心读数出错,处理数据时如果发现问题,回去核对图片就好了。办公室怎么也比林子舒服。


假定我们进行的是大样地调查,那么我们很难按照一定顺序来记录数据,怎么做省事呢?我觉得可以这么试试:

  1. 两人一组,分为若干组,每组负责样地的几个区域。

  2. 一人负责拍照,一人负责记录树木生长数据(也可回办公室再通过照片读取)或其他数据,照片的顺序即记录数据的顺序,名字等简单信息有照片提供,不做记录。

  3. 批量处理照片数据的中文名和拉丁名等,整理成列,直接拷到记录数据的 excel 里即可对应上。

  4. 合并所有人的数据。

那么我们简单看一下批处理的程序怎么做(我们样地的标牌不会搞得和上面的图一样不正规,这种图片毕竟是给游客看的,我们挂牌当然无需这些特征原产地之类的东西,同时我们拍照也尽量只拍需要的部分,这样能降低处理的量):

使用的图片是网上随便找的,大概这个样子,只能意思一下了,我没有找到清晰的一致的图片,我们的样地自然不是这个样子的:

其中京桃这个图片,没有找到高清图片,像素有点低,所以识别率差。我们直接上代码(此处为演示,上完整代码和 print 的结果):

 1from os import listdir
2import easyocr
3
4reader = easyocr.Reader([''ch_sim'',''en''])
5
6picture_name = []
7dir_path = r''./plant/''
8png_files = listdir(dir_path)
9for filename in png_files:
10    # display png names
11    print(filename)
12    result = reader.readtext(filename, detail = 0)
13    # print each picture results
14    print(result)
15    with open (''species.txt''''a''as f:
16        f.write(result[0])
17        f.write(''\\n'')
18    picture_name.append(result[0])
19print(picture_name)

终端上显示的结果为

 1jt.png
2[''京桃''''Prunus porsica1 rubro plena''''拉丁名:''''[:444444''''科''''原产地:申臼西北.华北:华东.西南''''征:阳性$光.耐2拊甲''''特'']
3
4mgl.png
5[''蒙古栎''''拉丁名:''''Quercus mongolica''''科`属:壳斗科栎属''''原产地:`中国.俄罗斯.日本''''极度耐寒.保持水土能力''''征:喜光''''特''''极强.能防止火灾快速蔓延'']
6
7ym.png
8[''杨梅''''科属:杨梅科''''学名:''''Myrica rubra''''常绿乔木6_耐阴,喜温''''习性''''暖湿润气候,不耐寒,''''观果乔木6'']
9
10[''京桃''''蒙古栎''''杨梅'']

这里的代码是将内容输出到文件,例如输出为 txt 的格式,结果如下图:

当然了,实际使用过程中,要么直接存 txt,然后在 excel 分列,要么输出到 picture_name 的 list 中,直接用 pandas 将该 list 导出为 excel 格式,无需这么麻烦,此处仅作演示。

想了解Dendrometer D1树体茎干生长记录仪的更多信息?请点击「阅读原文」。



  • 客服电话: 400-6699-117 转 1000
  • 京ICP备07018254号
  • 电信与信息服务业务经营许可证:京ICP证110310号
  • 京公网安备1101085018
  • 客服电话: 400-6699-117 转 1000
  • 京ICP备07018254号
  • 电信与信息服务业务经营许可证:京ICP证110310号
  • 京公网安备1101085018

Copyright ©2007-2024 ANTPEDIA, All Rights Reserved