65.9K
CodeProject 正在变化。 阅读更多。
Home

UPV – UNIPEN 在线手写识别数据库查看器控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (13投票s)

2012年3月14日

CPOL

4分钟阅读

viewsIcon

53103

downloadIcon

5251

UPV – UNIPEN 在线手写识别数据库查看器控件

引言

自从我上一篇文章“使用 C# 的神经网络识别手写数字”在 Codeproject.com 上发布以来,我收到了几封有关它的邮件。我非常感激。为了鼓励那些想研究手写识别技术的人,我编写了一个名为 UPV(UNIPEN 手写数据库查看器)的小控件,用于查看 UNIPEN 的在线手写样本。UNIPEN 是世界上最大的手写数据库之一。通过这个控件,手写笔迹流可以导出为位图,用于其他程序。该控件使用一个名为 UPUnipenLib.dll 的 dll 文件,这是我为一项赞助的手写字符识别项目开发的一个小型库。目前它不是开源项目,但此文件可完全免费用于非商业用途。

背景 

要求

UNIPEN 数据库下载地址:http://unipen.nici.kun.nl/

(下载的文件夹在使用前应更改为“UnipenData”)

UNIPEN 库:UPUnipenLib.dll (附在源代码和演示中)

UNIPEN 与 MNIST 数据库

在我上一篇文章中,我使用了 MNIST 作为我的神经网络。它是一个包含 60,000 个训练样本和 10,000 个测试样本的手写数字数据库。它对于学习真实数据上的技术和模式识别方法来说是一个很好的数据库。然而,由于其限制,MNIST 数据库不足以构建更复杂的识别系统。

对于手写识别系统而言,拥有一个足够大的数据库是一项挑战。自 1999 年以来,国际 Unipen 基金会成立,以保障由 40 家公司和研究机构组成的联盟收集的大型在线手写样本数据库的分发。它是一个海量免费数据库,拥有超过 500 万个字符,来自 2200 多名书写者。该数据库已被世界各地的许多实验室和大学的研究人员使用。它也曾被用作 ICDAR 等许多模式识别竞赛的测试样本。

总的来说,UNIPEN 数据集尽管数据格式是标准化的,但仍难以识别。UNIPEN 格式可以在此处参考。

尽管 UNIPEN 项目在其网站上提供了一些查看和编辑数据库的工具,但它们是用 15 年前非常老的计算机系统编写的。因此,对我来说,它们几乎无法帮助我理解如何查看数据。因此,我在项目中使用的所有方法完全基于我对数据格式的理解而构建。

使用代码

如何使用 UPUnipenLib.dll 文件和 UPV 控件

UPUnipenLib.dll 是一个用于读取 UNIPEN 数据文件以及将 UNIPEN 流导出为位图对象的库。类已根据 UNIPEN 文件定义构建。下图将为您提供一个总体视图,有助于更容易地理解和使用库文件。

使用库获取笔迹流并将其导出为位图非常简单,如下所示: 

private void btnOpen_Click(object sender, EventArgs e)
{
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.InitialDirectory = Environment.CurrentDirectory;
    openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    openFileDialog.FilterIndex = 2;
    openFileDialog.RestoreDirectory = true;
    upDataset = new UPUnipenLib.UPDataSet();
    if (openFileDialog.ShowDialog(this) == DialogResult.OK)
    {
        try
        {
            //set upDataset.InitialDirectory=full path of unipen folder if it is not "UnipenData".
            upDataset.InitialDirectory = "";
            upDataset.FillDataSetFromFile(openFileDialog.FileName);
            if (upDataset.Datalayouts.Count > 0)
            {
                //fill up the treeview
                FillUpTreeview();
                //
                iDatalayout = 0;
                //
                foreach (UPDataLayout dl in upDataset.Datalayouts)
                {
                    if (dl.UpUnipens.Count > 0)
                    {
                        unipen = dl.UpUnipens[0];
                        UpdateBitmap();
                        break;
                    }
                    iDatalayout++;
                }
            }
            else
            {
                MessageBox.Show("The opened file is invalid, please select other file");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
    UpdatePanels(true);
}

导出到位图

private void UpdateBitmap()
{
    UnipenBitmap ibox = new UnipenBitmap(unipen, (int)udPenwidth.Value);
    if (rbLine.Checked)
    {
        ibox.Drawtype = DrawType.Line;
    }
    else if (rbPie.Checked)
    {
        ibox.Drawtype = DrawType.Pie;
    }
    ibox.Multicolor = cbMultipenColor.Checked;
    ibox.PenWidth =(int) udPenwidth.Value;
    ibox.Uppen = cbUppen.Checked;
    // convert to and show the bitmap 
    this.Image = ibox.Image;
}

关注点

UPV 控件是基于 Jordy "Kaiwa" Ruiter 的项目“Image Viewer UserControl”构建的,但已根据笔迹流演示的目的进行了调整。在这个控件上,您不仅可以查看笔迹流,还可以通过其颜色了解笔迹流的形成过程。您还可以查看落笔轨迹和提笔轨迹。

图 2:带有提笔轨迹的 Unipen 样本

图 2:没有提笔轨迹的 Unipen 样本

在大多数情况下,UPV 控件可以准确显示 UNIPEN 样本。但是,由于数据库太大,我没有时间修复所有应该存在的问题。非常感谢您的反馈。

历史 

版本 1.01

修复了特殊 SEGMENT 情况下的错误 (示例)

  .SEGMENT CHARACTER 1:40-3,5,6:0-6:12 OK "1" 

修复了多个包含文件的问题。 在几乎所有的 unipen 数据文件 (1a,1b,1c,1d,2) 中测试通过 

© . All rights reserved.