Lesson 4: 创建自定义Caffe训练数据库

这篇文章介绍如何定义自己的图像数据库,给Caffe训练识别器,然后给python调用,并且识别。

此教程在ubuntu 16下面通过测试。

当然这里还是用ocr作为例子。

我们这里还是通过Docker安装和配置系统,避免太多配置问题。

首先创建一个工作空间(~/deep_ocr_workspace),输出训练的模型

下载docker镜像:

用下面命令创建一个图像数据库

逐一解释上面的参数,所有创建的图片会放在路径/workspace/caffe_dataset_lower_eng,自动化利用所有的字体文件/opt/deep_ocr/data/fonts/chinese_fonts,所有图片都归一化到(width, height),空隙为4,语言为lower_eng(小写字母,所有的语言可以在deep_ocr/python/deep_ocr/langs/找到),下面是数据库的一些截图:

screenshot-from-2016-10-09-18-57-02

screenshot-from-2016-10-09-18-57-49

创建lmdb数据库

训练数据库

如果有其他图片数据库,可以按照/opt/deep_ocr/data/caffe_nets/lower_eng里面的所有文件内容的对应目录,自己做一个新的脚本,记得修改lenet_train_test.prototxt和lenet.prototxt最后的输出。

复制lenet.prototxt到训练好的模型。

这里的26小编经常忘记修改,在mnist是10,当然,如果用其他net,不是lenet也需要相应的修改。

测试训练好的模型,(识别/workspace/caffe_dataset_lower_eng/images/20里面所有的内容。)

还是两个识别错误了。。。可能样本实在太少了。以后加一点旋转参数

识别测试源代码

微信公众号 changdata

wechat: changdata
wechat: changdata

《Lesson 4: 创建自定义Caffe训练数据库》有25个想法

  1. docker 映像正常下载下来了,也能跑起来,但是运行deep_ocr_make_caffe_dataset的时候报错了,貌似是因为fonts下面少了chinese_fonts这个目录……

    1. 谢谢测试~~应该是fonts那个文件夹我忘记git pull了。北京时间的凌晨我再测试一下,谢谢反馈,明早应该可以修复。

  2. 重新pull了之后,生成训练图片没有问题了;但是后面生成lmdb数据库有问题,运行create_lmdb.sh后,先是报没有/workspace/caffe_dataset/这个目录,手工建立后再运行脚本,报如下错误:
    root@9cc4cd3ee9ac:/opt/deep_ocr/data/caffe_nets/lower_eng# ./create_lmdb.sh
    Creating train lmdb…
    libdc1394 error: Failed to initialize libdc1394
    I1023 02:04:31.980443 147 convert_imageset.cpp:86] Shuffling data
    I1023 02:04:31.980963 147 convert_imageset.cpp:89] A total of 234 images.
    I1023 02:04:31.981664 147 db_lmdb.cpp:35] Opened lmdb /workspace/caffe_dataset_lower_eng/train_lmdb
    E1023 02:04:31.981714 147 io.cpp:80] Could not open or find file /workspace/caffe_dataset/images/22/8_NotoSansHans-Light.otf.jpg
    E1023 02:04:31.981731 147 io.cpp:80] Could not open or find file /workspace/caffe_dataset/images/7/1_mingliu.ttc.jpg
    E1023 02:04:31.981747 147 io.cpp:80] Could not open or find file /workspace/caffe_dataset/images/16/5_NotoSansHans-DemiLight.otf.jpg
    E1023 02:04:31.981763 147 io.cpp:80] Could not open or find file /workspace/caffe_dataset/images/19/1_mingliu.ttc.jpg
    E1023 02:04:31.981780 147 io.cpp:80] Could not open or find file /workspace/caffe_dataset/images/19/4_NotoSansHans-Bold.otf.jpg
    E1023 02:04:31.981833 147 io.cpp:80] Could not open or find file /workspace/caffe_dataset/images/0/0_NotoSansHans-Regular.otf.jpg
    E1023 02:04:31.981849 147 io.cpp:80] Could not open or find file /workspace/caffe_dataset/images/4/3_fangzheng_jieti.TTF.jpg
    E1023 02:04:31.981865 147 io.cpp:80] Could not open or find file /workspace/caffe_dataset/images/3/7_fangzheng_shusong.ttf.jpg
    ……

    报错后仍然会在caffe_dataset_lower_eng目录下产生train_lmdb和val_lmdb目录,目录里面也有文件,我想问一下这两个文件是什么格式的,可以通过什么工具查看么?

    1. 周末忘记看网站,没有留意你的回复,不好意思。lmdb 是caffe定义的数据库格式,不容易查看。看上面的错误应该是deep_ocr_make_caffe_dataset没有成功生产所有训练图片。你可以运行下面命令看看是否生成了所有图像文件?

      1. 我查看过了,对应目录下是有这些生成图片的,可能还是某个环境变量的问题(ps:我run docker用的是-v选项挂载的本地文件系统到workspace目录,用–volume的时候报~字符非法,Docker version 1.12.2, build bb80604):
        root@24110e27fe8e:/workspace# ls /workspace/caffe_dataset_lower_eng/images/0
        0_NotoSansHans-Regular.otf.jpg 4_NotoSansHans-Bold.otf.jpg
        10_NotoSansHans-Medium.otf.jpg 5_NotoSansHans-DemiLight.otf.jpg
        11_NotoSansHans-Thin-Windows.otf.jpg 6_NotoSansHans-Black.otf.jpg
        12_fangzheng_fangsong.ttf.jpg 7_fangzheng_shusong.ttf.jpg
        1_mingliu.ttc.jpg 8_NotoSansHans-Light.otf.jpg
        2_DroidSansFallbackFull.ttf.jpg 9_fangzheng_heiti.TTF.jpg

        1. 我重新调整一下格式,可以看到是有13个图片文件输出的,总共有26个目录对应26个英文字母的图片:
          root@d4f543ceaaef:/workspace/caffe_dataset_lower_eng/images/0# ls -l
          total 52
          -rw-r–r– 1 root root 918 Oct 22 23:36 0_NotoSansHans-Regular.otf.jpg
          -rw-r–r– 1 root root 942 Oct 22 23:36 10_NotoSansHans-Medium.otf.jpg
          -rw-r–r– 1 root root 902 Oct 22 23:36 11_NotoSansHans-Thin-Windows.otf.jpg
          -rw-r–r– 1 root root 827 Oct 22 23:36 12_fangzheng_fangsong.ttf.jpg
          -rw-r–r– 1 root root 814 Oct 22 23:36 1_mingliu.ttc.jpg
          -rw-r–r– 1 root root 880 Oct 22 23:36 2_DroidSansFallbackFull.ttf.jpg
          -rw-r–r– 1 root root 730 Oct 22 23:36 3_fangzheng_jieti.TTF.jpg
          -rw-r–r– 1 root root 948 Oct 22 23:36 4_NotoSansHans-Bold.otf.jpg
          -rw-r–r– 1 root root 902 Oct 22 23:36 5_NotoSansHans-DemiLight.otf.jpg
          -rw-r–r– 1 root root 933 Oct 22 23:36 6_NotoSansHans-Black.otf.jpg
          -rw-r–r– 1 root root 745 Oct 22 23:36 7_fangzheng_shusong.ttf.jpg
          -rw-r–r– 1 root root 938 Oct 22 23:36 8_NotoSansHans-Light.otf.jpg
          -rw-r–r– 1 root root 835 Oct 22 23:36 9_fangzheng_heiti.TTF.jpg

          1. 想了想,想不出哪里有问题, 猜测–volume 是windows下面的输入法问题,因为是两条横杠在前面,这里自动转换为中文的 长横杆。想问问你在windows下测试这个docker吗?我昨晚在ubuntu 16.04测试了,还是可以用的。如果你不是在windows下面测试的,也可以告诉我在哪个系统测试?

  3. 我也是在ubuntu 16.04(kylin)下面测的,这个系统刚装上去,docker pull, run 都没什么问题,也可以正常生成图片……

    1. 今晚用virtualbox装了ubuntu 16.04 kylin,确实有个小问题 (https://github.com/JinpengLI/deep_ocr/commit/5bb8abd3055126520b9f508fdb58898ae5f67c11),纠正了,你在container里面试试git pull更新deep_ocr,然后重新试试这个教程。

      告诉我行不行,谢谢测试。

      1. root@f9385656b074:/opt/deep_ocr/data/caffe_nets/lower_eng# deep_ocr_make_caffe_dataset –out_caffe_dir /workspace/caffe_dataset_lower_eng –font_dir /opt/deep_ocr/data/fonts/chinese_fonts –width 28 –height 28 –margin 4 –langs lower_eng
        Traceback (most recent call last):
        File “/opt/deep_ocr/bin/deep_ocr_make_caffe_dataset”, line 83, in
        lang_chars = lang_chars_gen.do()
        File “build/bdist.linux-x86_64/egg/deep_ocr/lang_aux.py”, line 27, in do
        ImportError: No module named langs.lower_eng

    2. 我的ubuntu是64位的kylin,在docker run的时候如果用 –volume选项的话不能使用”~”符号表示当前路径,所以我才用的-v选项加全路径替换原来的方式

      1. 确实是,“~”不能用,如果手动替换“~”了后,然后进入deep ocr的目录,用git pull更新之后,还能运行./create_lmdb.sh吗?

        1. 训练完成了,测试也都正常,全部识别出来了,但是测试结果好像和你教程中的不太一样,全部都识别出来了:

          6_NotoSansHans-Black.otf.jpg
          (u’t’, 0.99991465)
          2_DroidSansFallbackFull.ttf.jpg
          (u’t’, 0.99999726)
          0_NotoSansHans-Regular.otf.jpg
          (u’t’, 0.99940979)
          5_NotoSansHans-DemiLight.otf.jpg
          (u’t’, 0.99998307)
          11_NotoSansHans-Thin-Windows.otf.jpg
          (u’t’, 0.9938215)
          8_NotoSansHans-Light.otf.jpg
          (u’t’, 0.999933)
          10_NotoSansHans-Medium.otf.jpg
          (u’t’, 0.99999809)
          1_mingliu.ttc.jpg
          (u’t’, 0.99849045)
          4_NotoSansHans-Bold.otf.jpg
          (u’t’, 0.99999142)
          3_fangzheng_jieti.TTF.jpg
          (u’t’, 0.99928826)
          7_fangzheng_shusong.ttf.jpg
          (u’t’, 0.99746644)
          12_fangzheng_fangsong.ttf.jpg
          (u’t’, 0.9987638)
          9_fangzheng_heiti.TTF.jpg
          (u’t’, 0.88195914)

  4. 您好,请问字体库有什么要求吗?
    另外找的字体在PIL的ImageFont.truetype函数中运行失败,显示unknown file format
    多谢~

    1. 这样我挺难回答,因为我没有你的文件,github上面有一些常用字体,我测试过。你可以参考一下。https://github.com/JinpengLI/deep_ocr_fonts

  5. 您好,根据您提供的代码,我已经完成对于简单字符集(1234567890.,)
    生成图片 create_lmdb train_lenet,并根据您提供的lesson4,也是完全正确的.

    现在我利用生成的caffemodel文件,调用 reco_chars 并将 图片改成 我的图片进行识别,在源码 46行出现了错误:
    output_prob = output[‘prob’][i]
    output没有prob,key_error.如果能够得到您的指点,万分感谢.

  6. 如果我用汉字的话,我整理了汉字分了七千多个,那需要修改lenet_solver.prototxt里的内容嘛,因为我看很多其他的教程都要修改里面的test_iter参数,不太清楚,所以问问需要修改这个参数吗

    1. 这个比较难回答,一般是用early stop来判断是否最后停止,这里不需要修改,因为我觉得这个参数是用于最大的循环次数。

发表评论

电子邮件地址不会被公开。 必填项已用*标注