神经网络识别阿拉伯数字 Demo

135 天前
 nealot

技能需求

需求

  1. 使用神经网络实现一个识别单个阿拉伯数字的 Android 组件。神经网络推理部分使用纯 Java 实现,训练部分可以用 Python ,也可以使用其它语言,不依赖 CUDA 。
  2. 对 (1) 中生成的模型进行微调,调高阈值,仅识别书写 "端正" 的阿拉伯数字
  3. 扩展 (1) 和 (2) 生成的手写识别组件,使之可以识别两位阿拉伯数字

为了方便开始任务,我先提供一些基础代码。我们可以用几十行代码开发一个 Android "手写板" 组件:


public class BrushView extends View {
    private final Path path = new Path();
    private final Paint paint = new Paint();

    public BrushView(Context context, AttributeSet attrs) {
        super(context, attrs);

        paint.setColor(android.graphics.Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(10);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawPath(path, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(x, y);
                break;
            case MotionEvent.ACTION_MOVE:
                path.lineTo(x, y);
                break;
            case MotionEvent.ACTION_UP:
                break;
        }

        invalidate();
        return true;
    }
}

然后在 MainActivity 里加个这个东西,就可以开始测试了:

    <com.example.BrushView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#f8f8f8" />

下面说一下我对这个任务的理解。

需求一几乎就是神经网络的入门课,在网上你可以直接下载到公开的数据集,在 Python 中你可以用很少的代码搭建出一个模型,然后完成训练。

唯一有点工作量的大概是,针对采用的模型,手撸一个 Java 的神经网络出来。

识别阿拉伯数字这种任务大概手撸也不难,但是如果你要用现成的 Java 神经网络库,那也没问题。如果用现成的库,那么第一个需求几乎就是送分题了,唯一的工作量就是把这些东西整合到 Android 工程里去。

当用户输入一个数字后,Log.i 把数字打印出来。如果无法识别,Log.w 打印出来。


第二个任务是对模型进行调整,只识别 "书写端正" 的数字。

按我的理解,就是要在几千个数字中,对图片进行重新标注。本来有个潦草的 "4" 识别成 4 了,现在我希望把它识别成 Error 。

但是公开的数据集很大,要是这个标注很繁琐,那么就太痛苦了。因此,我希望标注的工作,可以使用 1 次鼠标点击来完成。比如鼠标滚轮可以让我一次查看几百张图,然后鼠标左键标记为正确,右键标记为错误。

这是个 GUI 程序,如果你熟悉 Python 可以用 PyQt ,如果你熟悉 C# 可以用 WinForms 。

当然,我对第二个任务的理解可能是有问题的,欢迎指正。如果你发现通过 Windows 资源管理器配合什么快捷键或者 TotalCommander 啥的可以达到等价的效率,那不写这个 GUI 程序也是可以的。


第三个任务有点超出我的认知范围了,或许可以用 "识别单个阿拉伯数字" 组合一下,让它能识别两位阿拉伯数字?你需要能帮我解第三个问题,这才是我花钱的目的。

交付物品

  1. 带手写识别的 Android 组件 (识别结果通过 Log 打出来) 不潦草认真写时,识别率在 95% 以上
  2. 训练脚本 (Python) 不要依赖 CUDA
  3. 模型微调工具,操作要便捷。接单人需要帮我做一轮调整,结项后我能自己微调

报酬

(先看看这个价有没有人接,欢迎吐槽)

联系方式

926 次点击
所在节点    外包
7 条回复
iOCZS
135 天前
这一块不是挺成熟的嘛,卷积神经网络
rickiey
135 天前
我 7 年前大三就做过手写数字识别,python tenseflow ,加载别人训练好的模型, github.com/rickiey/tensorFlow-mnist-web 给你个参考
nealot
135 天前
@rickiey 可以调潦草程度的识别阈值吗?可以识别两位数吗?
shm7
135 天前
@nealot #3 任务三是个简单的 CV 处理。可以使用 opencv 进行图像内的字符切分,然后再识别。考虑 java 已不熟,楼主可以自行处理。https://blog.csdn.net/qq_47281915/article/details/121705585 。c2htN0BvdXRsb29rLmNvbQ== 可随便打赏点。
jasdkasdjkas
135 天前
https://github.com/tesseract-ocr 有现成的好用的很
jasdkasdjkas
135 天前
https://huggingface.co/ 这个里面很多模型,有些虽然用模型,但是还有的是模型加上之前 ML 时代的产品代码一起用,总有一个满足你
nealot
131 天前
V 友倒是挺热心的,但是正经接单的人一个都没有

大概有能力一天搞定的神经网络熟练工,工资不低,不屑于赚这点小钱

另外一方面,普通的全栈开发,技能树很可能还不够全:神经网络、OpenCV 、Android 、桌面应用开发;万一要做个两三天甚至更长时间,这点报酬估计就不够了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1040901

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX