2016np网络程序设计学习总结

2016np网络程序设计学习总结

SA16225402  余鑫


1.学习心得总结

知道孟宁老师的这门课是在暑假,那时候老师正在微博上推广这门课程,说新学期玩个大的,做最热门的神经网络和机器诊断。因为家里人工作与医疗相关,对这个还挺感兴趣,所以开学选课就毫不犹豫选择了这门课。

这门课内容思路也没有辜负老师说的“玩个大的”,利用深度学习的方法,让机器成为医生,通过一张化验单就能给出你的疾病诊断。如果做到了,这就能颠覆医疗这个行业,让机器代替医生做普通的诊断,有限的医生资源就能投入到真正需要专家的复杂疾病中去,大大减少医生的工作量。这样,就不会出现“30年工作经验专家80%时间在告诉感冒患者多喝热水少抽烟”以及“重病患者排号1上午,候诊2小时,看病5分钟”的状况。


最开始做的是课程项目A1a:神经网络实现手写字符识别系统。这是入门的深度学习项目,让我们对神经网络有了一定的了解。


之后是课程项目A2:血常规检验报告的图像OCR识别。这个项目将检验报告中的数字内容给识别出来,为之后的工作打下基础。其中有很多有意思的关于图片处理的方法,也很值得学习。


再接下来就是课程项目A3:根据血常规检验的各项数据预测年龄和性别。通过深度学习的方法,建立并训练模型,最后能对血常规检验报告单给出一个性别及年龄的预测。


这门课程中我收获很多,不仅是学习了神经网络&深度学习&图片处理&项目构架,更感受了团队协作共同开发的魅力,通过git的方式,大家在老师的引领下不断为项目添砖加瓦,最终实现整个项目的需求。当然,这种万马齐奔看谁跑得快的开发策略下,就注定有人被碾在泥土里,作为一只编程萌新,我感觉我一直在挣扎,想为项目做出自己的贡献,但是孱弱的编程能力加上深度学习复杂的接口以及算法,让我多次从研究官方文档到开了满屏博客教程,越研究发现自己不会的越多,无疾而终,只能看着别人不断pullrequest,心里也确实有些沮丧。不过唯一值得庆幸的是,在整个过程中,我的心态都还挺好,虽然没做出什么贡献,但是也学到了不少。希望接下来的学习的路上,能继续保持良好的心态,跑的最快不一定走得最远,最重要的还是要继续走下去嘛。(但还要保持微笑)


2.commit/pr

(由于缺少编码经验,所以贡献比较少。自行车都不会骑,只能看人家飙车离去,心塞)

pr:#250 简单的mxnet的mnist的DEMO


import os
import argparse
import logging
logging.basicConfig(level=logging.DEBUG)
from common import find_mxnet, fit
from common.util import download_file
import mxnet as mx
import numpy as np
import gzip, struct

def read_data(label, image):
    """
    download and read data into numpy
    """
    base_url = 'http://yann.lecun.com/exdb/mnist/'
    with gzip.open(download_file(base_url+label, os.path.join('data',label))) as flbl:
        magic, num = struct.unpack(">II", flbl.read(8))
        label = np.fromstring(flbl.read(), dtype=np.int8)
    with gzip.open(download_file(base_url+image, os.path.join('data',image)), 'rb') as fimg:
        magic, num, rows, cols = struct.unpack(">IIII", fimg.read(16))
        image = np.fromstring(fimg.read(), dtype=np.uint8).reshape(len(label), rows, cols)
    return (label, image)


def to4d(img):
    """
    reshape to 4D arrays
    """
    return img.reshape(img.shape[0], 1, 28, 28).astype(np.float32)/255

def get_mnist_iter(args, kv):
    """
    create data iterator with NDArrayIter
    """
    (train_lbl, train_img) = read_data(
            'train-labels-idx1-ubyte.gz', 'train-images-idx3-ubyte.gz')
    (val_lbl, val_img) = read_data(
            't10k-labels-idx1-ubyte.gz', 't10k-images-idx3-ubyte.gz')
    train = mx.io.NDArrayIter(
        to4d(train_img), train_lbl, args.batch_size, shuffle=True)
    val = mx.io.NDArrayIter(
        to4d(val_img), val_lbl, args.batch_size)
    return (train, val)

if __name__ == '__main__':
    # parse args
    parser = argparse.ArgumentParser(description="train mnist",
                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('--num-classes', type=int, default=10,
                        help='the number of classes')
    parser.add_argument('--num-examples', type=int, default=60000,
                        help='the number of training examples')
    fit.add_fit_args(parser)
    parser.set_defaults(
        # network
        network        = 'mlp',
        # train
        gpus           = None,
        batch_size      = 64,
        disp_batches = 100,
        num_epochs     = 20,
        lr             = .05,
        lr_step_epochs = '10',
    )
    args = parser.parse_args()

    # load network
    from importlib import import_module
    net = import_module('symbol.'+args.network)
    sym = net.get_symbol(**vars(args))

    # train
    fit.fit(args, sym, get_mnist_iter)

2016np网络程序设计学习总结_第1张图片


注意:新版本使用图片数据集方法

新版本较老版本的变化在于将老版本中的make_list.py和im2rec.py两个文件的功能合并到im2rec.py一个文件中去了,使用参数--list=True(make_list),默认是--list=False(im2rec.py).
制作 image_list 定位im2rec.py路径,我的在E:\Mxnet\mxnet\tools,执行命令Python im2rec.py --list=True --exts .jpg --exts .jpeg(也可以是--exts=[.jpg,.jpeg]或者--exts=.jpg --exts=.jpeg) --recursive=True E:\lfw\imge E:\lfw\    
将image_list转换成image.rec


3.DEMO及安装运行方法

版本库: 点击打开链接

A1a:神经网络实现手写字符识别系统

BP神经网络
输入层维数 400
隐藏层神经元 15
输出层维数 10
学习率 0.1
激活函数 sigmoid
参数保存在 nn.json

环境配置(如果在本地运行):
系统: ubuntu 14.04 64位
# 安装pip
sudo apt-get install python-pip

# 用pip安装numpy和scipy, 使用科大镜像加速
pip install --user numpy scipy -i https://pypi.mirrors.ustc.edu.cn/simple

# 如果上一步安装失败就使用ubuntu的包管理器试试
sudo apt-get install python-numpy python-scipy

# 安装sklearn, neural_network_design.py需要调用它做交叉验证
pip install -U scikit-learn -i https://pypi.mirrors.ustc.edu.cn/simple

# 如果在服务器上运行,修改ocr.js里的HOST为服务器的地址,如http://2016.mc2lab.com
运行

下载图像和标签数据
 wget http://labfile.oss.aliyuncs.com/courses/593/data.csv
 wget http://labfile.oss.aliyuncs.com/courses/593/dataLabels.csv
训练模型
 python neural_network_design.py
创建服务器
 python -m SimpleHTTPServer 3000
加载服务器
 python server.py
访问
 localhost:3000
2016np网络程序设计学习总结_第2张图片
2016np网络程序设计学习总结_第3张图片





A2:血常规检验报告的图像OCR识别;A3:根据血常规检验的各项数据预测年龄和性别

运行环境

#
安装numpy,
sudoapt-get install python-numpy # http://www.numpy.org/
#
安装opencv
sudoapt-get install python-opencv #http://opencv.org/

##
安装OCR和预处理相关依赖
sudoapt-get install tesseract-ocr
sudo pip install pytesseract
sudoapt-get install python-tk
sudo pip install pillow

#
安装Flask框架、mongo
sudopip install Flask
sudo apt-get install mongodb #
如果找不到可以先sudoapt-get update
sudo service mongodb started
sudo pipinstall pymongo
运行

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

view.py

Web
端上传图片到服务器,存入mongodb并获取oid,稍作修整,希望能往REST架构设计,目前还不完善;前端采用了vue.js,mvvm模式。写了两个版本,一个是index.html无插件,另一个使用了bootstrap-fileinput插件,有点问题;

imageFilter.py
对图像透视裁剪和OCR进行了简单的封装,以便于模块间的交互,规定适当的接口
   imageFilter = ImageFilter() #
可以传入一个opencv格式打开的图片
  
    num = 22
    printimageFilter.ocr(num)
ocr
函数-模块主函数返回识别数据
用于对img进行ocr识别,他会先进行剪切,之后进一步做ocr识别,返回一个json对象如果剪切失败,则返回None@num规定剪切项目数
perspect
函数做-初步的矫正图片
用于透视image,他会缓存一个透视后的opencvnumpy矩阵,并返回该矩阵透视失败,则会返回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
将识别的图像进行处理二值化等操作,提高识别率包括对中文和数字的处理

digits
将该文件替换Tesseract-OCR\tessdata\configs中的digits


2016np网络程序设计学习总结_第4张图片 2016np网络程序设计学习总结_第5张图片 2016np网络程序设计学习总结_第6张图片




你可能感兴趣的:(深度学习,mxnet)