项目概要
· 本项目主要可分为两大方面:
1 .血常规检查报告的OCR识别
相关链接:神经网络实现手写字符识别系统点击打开链接
· 2.根据OCR识别的血常规数据预测性别和年龄(本例中使用的是Spark平台下的朴素贝叶斯算法)
项目托管地址: 点击前往(项目整合版在Spark/Merge目录下)
学习收获
孟宁老师的《网络程序设计》这门课程循序渐进,以手写识别OCR作为学习神经网络的突破口,从Python语言到Flask框架,从透视算法到图像识别,从神经网络到机器学习,课程项目由全班70余名同学相互协作、共同开发,群策群力开源共享。这不仅是对我们团队精神和协作能力的一种锻炼,也是对孟老师准确把控项目团队、高效管理开发过程的一种体现。项目整体进展十分顺利,没有出现代码冗余、错删错改等重大失误。这不仅要归功于同学们对整个项目添砖加瓦贡献出的自己的一份力量,也得益于孟老师对于整个项目过程的严格把控。自己从一个机器学习的小白,逐步跟进,努力为项目做出贡献。孟老师也作为团队内的一名全栈工程师帮助我们完善、改进项目,不仅给予我们技术上的指导,还让我们注意到团队协作开发当中文档的重要性。规范的文档、标准的模块接口、良好的代码书写习惯是团队合作项目中必不可少的部分。每周的分享阶段,更是发扬了软件工程师开源的精神,大家分享各个领域的知识,使我们团队的每个人都进步飞速。
通过半学期的课程学习,我学到了许多东西,从之前没有写过一句Python到如今基本熟知Python语法;从之前的图像识别小白到如今初步了解图像透视算法;之前都是仰望机器学习大神,如今对神经网络和机器学习的基本原理都有了一定的了解,自己也可以深入的尝试。做任何事情最困难的就是迈出第一步,而《网络程序设计》这门课已经帮我迈出了许许多多的第一步,为今后的学习提供了更多的选择和方向。
血常规检查报告的OCR识别
主要功能:
· 前端页面接收用户上传的血常规报告单图片并提交至服务器
· 服务器首先图片进行预处理,使用透视变换算法对图片做一定的矫正。之后对图片进行识别,将识别结果转换成JSON格式与矫正后的图片一并存储至MongoDB数据库。然后将矫正后的图片反馈至前端页面供用户确认矫正过程是否正确
· 当前端页面监听到“生成报告”的点击事件时,使用Ajax技术向服务器请求识别结果并打印血常规报告单
预处理
在获取到上传的血常规化验单图片后,项目中对其进行了预处理,作用主要是为了减小噪声,为后边的识别算法服务,在这里主要用到了以下两个方法:
a)高斯平滑
img_gb= cv2.GaussianBlur(img_gray, (gb_param, gb_param), 0)
b)腐蚀、膨胀
closed =cv2.morphologyEx(img_gb, cv2.MORPH_CLOSE, kernel)
opened =cv2.morphologyEx(closed, cv2.MORPH_OPEN, kernel)
线段检测
为了对图片各个数值所在的区域进行定位,这里需要检测出图片中比较明显的标识,3条黑线,然后利用这三条线对整张图片进行标定。主要用到了以下3个步骤:
a)Canny边缘检测
edges= cv2.Canny(opened, canny_param_lower , canny_param_upper)
b)轮廓提取
contours,hierarchy = cv2.findContours(edges, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
c)求最小外接矩形
def getbox(i):
rect = cv2.minAreaRect(contours[i])
box = cv2.cv.BoxPoints(rect)
box = np.int0(box)
return box
OCR
这里主要利用OCR对血常规报告中的字符进行识别,得到具体的数值,用于后续的预测。其中步骤主要是根据上边求得的三条线段对图片进行透射变换,根据标定好的像素位置,利用pytesseract进行字符识别。
a)透射变换
#设定透视变换的矩阵
points =np.array([[line_upper[0][0],line_upper[0][1]], [line_upper[1][0],line_upper[1][1]],
[line_lower[0][0], line_lower[0][1]],[line_lower[1][0