V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nealot
V2EX  ›  外包

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

  •  
  •   nealot · 14 天前 · 781 次点击

    技能需求

    • 熟悉神经网络基础
    • 熟悉 Java 语言、Python 语言
    • 熟悉基础的 Android 开发

    需求

    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. 模型微调工具,操作要便捷。接单人需要帮我做一轮调整,结项后我能自己微调

    报酬

    • 暂定每个需求 500 ,总计 1500 ,分 3 期支付

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

    联系方式

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

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

    另外一方面,普通的全栈开发,技能树很可能还不够全:神经网络、OpenCV 、Android 、桌面应用开发;万一要做个两三天甚至更长时间,这点报酬估计就不够了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5242 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:59 · PVG 13:59 · LAX 22:59 · JFK 01:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.