网络程序设计课程项目学习总结

学习心得

私以为项目驱动学习是最高效的学习方式,而网络程序设计正式这样的一门课程。本课程先从一个手写数字识别系统入手,在孟老师的指导下,依靠全班同学的努力一步步地添砖加瓦,最后形成了一个完整的软件系统。

《网络程序设计》这门课程让我学习到了许多,从Python语言到Flask框架,从透视算法到图像识别,从神经网络到机器学习,更重要的是,让我了解到了如何运用这些碎片化的知识形成一个完整的项目。与此同时,也让我了解到了实际中完成一个开源项目的流程。然而这门课程让我感触最深的莫过于团队精神的体现,课程项目由全班60余名同学相互协作、共同开发,充分模拟了实际的开发环境。大家在孟老师的引领下不断地为项目添砖加瓦,最终实现了整个项目的要求。项目整体进展十分顺利,没有出现代码冗余、错删错改等重大失误。这不仅要归功于同学们对整个项目添砖加瓦贡献出的自己的一份力量,也得益于孟老师对于整个项目过程的严格把控。

通过半学期的课程学习,我学到了许多东西,例如python基本语法,OCR基本原理,和一些常用的机器学习算法的原理等。虽然对这些知识了解得不深入,但好歹入门了,而万事开头难,入门之后就可以朝着自己感兴趣的方向前进了。

由于自己python和机器学习都是零基础,所以对项目没有什么贡献,但好在整个过程中自己也学到不少,也自己尝试写和修改过代码,例如把A1项目中的神经网络算法改成SVM,和用SVM完成了性别预测等,但由于自己是个编程小白,感觉自己写的代码封装得不好,羞于提交pr,以至于对项目零贡献,这是本次课程最大的遗憾。但是现在我明白了,应该要大胆地提交pr,即使被拒,也能知道自己哪方面做得不好,才能朝着更好的方向前进,提高自己的代码能力。

项目概况

  • 项目托管地址
    • 项目采用多人合作开发的形式,由孟老师作为项目经理使用GitCoding进行代码托管和版本控制
    • coding.net:血常规检验报告OCR
  • 项目功能

该项目是基于机器学习神经网络的一个医学辅助诊断系统。通过对病人血常规化验单的图片的识别采集数据进行分析。利用通过大量真实数据训练出来的有一定可接受的准确率的模型对病人所提供的数据进行判断,通过对各项血常规数据的分析来实现对病人性别和年龄的预测。


  • 运行环境

    • 安装numpy

sudo apt-get install python-numpy

    • 安装opencv

sudo apt-get install python-opencv

    • 安装pytesseract

sudo apt-get install tesseract-ocr
sudo pip install pytesseract
sudo apt-get install python-tk
sudo pip install pillow

    • 安装Flask框架

sudo pip install Flask

    • 安装mongodb

sudo apt-get install mongodb # 如果提示no module name mongodb, 先执行sudo apt-get update
sudo service mongodb started
sudo pip install pymongo

  • 安装Tensorflow

sudo apt-get install python-numpy
sudo apt-get install python-imaging
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc0-cp27-none-linux_x86_64.whl

    • 运行

cd BloodTestReportOCR
python view.py # upload图像,在浏览器打开http://yourip:8080

  • 模块说明
    • view.py

基于Flask框架的简易服务器,主要实现Web端上传图片到服务器,存入mongodb并获取oid,稍作修整,希望能往REST架构设计,目前还不完善;


    • imageFilter.py

对图像透视裁剪和OCR进行了简单的封装,以便于模块间的交互,规定适当的接口。


  •  
         
    imageFilter = ImageFilter() # 可以传入一个opencv格式打开的图片
    num = 22
    print imageFilter.ocr(num)
    • ocr函数 - 模块主函数返回识别数据

用于对img进行ocr识别,先进行剪切,之后进一步做ocr识别,返回一个json对象,如果剪切失败,则返回None @num 规定剪切项目数

    • perspect函数做 - 初步的矫正图片

用于透视image,他会缓存一个透视后的opencv numpy矩阵,并返回该矩阵透视失败,则会返回None,并打印不是报告。@param透视参数

      • param参数:
        • 参数的形式为[p1, p2, p3 ,p4 ,p5] p1,p2,p3,p4,p5都是整型,其中p1必须是奇数。
        • p1是高斯模糊的参数,p2p3canny边缘检测的高低阈值,p4p5是和筛选有关的乘数。
        • 如果化验报告单放在桌子上时,有的边缘会稍微翘起,产生比较明显的阴影,这种阴影有可能被识别出来,导致定位失败。解决的方法是调整p2p3,来将阴影线筛选掉。但是如果将p2p3调的比较高,就会导致其他图里的黑线也被筛选掉了。参数的选择是一个问题。我在getinfo.default中设置的是一个较低的阈值,p2=70,p3=30,这个阈值不会屏蔽阴影线。如果改为p2=70,p3=50则可以屏蔽,但是会导致其他图片识别困难。
      • 目前,得到较好的结果的前提有:
        • 化验单尽量平整
        • 图片中应该包含全部的三条黑线
        •  图片尽量不要包含化验单的边缘,如果有的话,请尽量避开有阴影的边缘

    • filter函数 - 过滤掉不合格的或非报告图片

返回img经过透视过后的PIL格式的Image对象,如果缓存中有PerspectivImg则直接使用,没有先进行透视过滤失败则返回None@param filter参数


    • autocut函数 - 将图片中性别、年龄、日期和各项目名称数据分别剪切出来
      • 用于剪切ImageFilter中的img成员,剪切之后临时图片保存在out_path如果剪切失败,返回-1,成功返回0 @num 剪切项目数 @param剪切参数
      • 剪切出来的图片在BloodTestReportOCR/temp_pics/文件夹下
      • 函数输出为data0.jpg,data1.jpg……等一系列图片,分别是白细胞计数,中性粒细胞记数等的数值的图片。

    • classifier.py

用于判定裁剪矫正后的报告和裁剪出检测项目的编号。

    • imgproc.py

将识别的图像进行处理二值化等操作,提高识别率,包括对中文和数字的处理。


  • 运行演示
1. 启动程序

cd BloodTestReportOCR
python view.py
在浏览器访问 http://0.0.0.0:8080/

由此进入以下页面。

网络程序设计课程项目学习总结_第1张图片

2.上传图片

先找到一张血常规报告单,这是我使用的图片如下:
网络程序设计课程项目学习总结_第2张图片
3. 点“提交”之后得到经过矫正之后的图片。如下所示。
网络程序设计课程项目学习总结_第3张图片
4.生成血常规报告
网络程序设计课程项目学习总结_第4张图片
5.预测年龄性别,目前准确度待提升。
网络程序设计课程项目学习总结_第5张图片

  • 神经网络
在本项目中,定义了一个单隐层神经网络,根据线下使用电子表格的训练模型,进行前端传来的信息进行线上预测。神经网络的原理在此不再赘述,感兴趣的读者可自行了解。
  • OCR原理
OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。
为了得到一张给定图片属于某个特定数字类的证据(evidence),我们对图片像素值进行加权求和。如果这个像素具有很强的证据说明这张图片不属于该类,那么相应的权值为负数,相反如果这个像素拥有有利的证据支持这张图片属于这个类,那么权值是正数。下面的图片显示了一个模型学习到的图片上每个像素对于特定数字类的权值。红色代表负数权值,蓝色代表正数权值。
网络程序设计课程项目学习总结_第6张图片




你可能感兴趣的:(学习)