这里是课上老师给出的一个示例程序,演示图像检测的过程,本来以为是传统的滑窗检测,但实际上引入了selectivesearch来选择候选窗,所以看思路应该是RCNN的范畴,蛮有意思的,由于老师的注释写的蛮好的,我基本就不画蛇添足了,这里记录下来,为加深理解cs231n的课程做个铺垫。,所以做个储备,实在不行还有开学不是么233

  1. # coding: utf-8
  2. #copyRight by heibanke
  3. #如需转载请注明出处
  4. #<<用Python做深度学习1-数学基础>>
  5. #http://study.163.com/course/courseMain.htm?courseId=1050010
  6.  
  7. import numpy as np
  8. # 这里nnet是课程作业里实现的一个模块,参考资料里也会附上我的版本。大家也可以用自己做的版本。
  9. from nnet.layers import FCLayer,Activation,SoftMaxCostLayer
  10. from nnet.neuralnetwork import neuralnetwork
  11. from nnet.helpers import one_hot
  12. # MNIST数据不再上传了,相信大家学到这里,这个数据应该都有一份,复制到文件夹内即可
  13. import load_MNIST
  14.  
  15. # 需要安装selectivesearch,pip install selectivesearch
  16. import selectivesearch
  17. from matplotlib import pyplot as plt
  18. import matplotlib.patches as mpatches
  19.  
  20. # 需要安装opencv2
  21. import cv2
  22. %matplotlib inline

1. 用MNIST数据库训练分类器模型

这一步是我们之前课程里的重点,这里选用两层全连接神经网络模型进行训练。数据库的数据预测率能达到97%,大家可以根据自己喜好选择不同的模型试一下。

  1. def get_model():
  2. train_X,train_y,test_X,test_y = load_MNIST.get_data()
  3. n_classes = np.unique(train_y).size
  4.  
  5. w_decay = 0.0001
  6.  
  7. nn = neuralnetwork(
  8. layers=[
  9. FCLayer(
  10. n_out=128,
  11. weight_decay = w_decay,
  12. ),
  13. Activation('sigmoid'),
  14. FCLayer(
  15. n_out=n_classes,
  16. weight_decay = w_decay,
  17. ),
  18. Activation('softmax'),
  19. ],
  20. cost = SoftMaxCostLayer(),
  21.  
  22. )
  23.  
  24. X = train_X.reshape(train_X.shape[0],28*28)
  25. Y_one_hot = one_hot(train_y)
  26. nn._setup(X, Y_one_hot)
  27.  
  28. # Train neural network
  29. print('Training neural network')
  30. nn.train(X, train_y, learning_rate=1.0, max_epochs=8, batch_size=128)
  31.  
  32. # Evaluate on training data
  33. error = nn.error(test_X.reshape(test_X.shape[0],28*28), test_y)
  34. print('Test error rate: %.4f' % error)
  35.  
  36. return nn
  37.  
  38. nn=get_model()

2.读入待测图片,并在待测试图片上用selective search算法获得物体窗口

待测图片是我自己在Photoshop上手写的数字,几个数字在一张图片上,不同大小,不同位置。

  1. img = cv2.imread("test1.jpg")
  2. img_lbl, regions = selectivesearch.selective_search(
  3. img, scale=500, sigma=0.9, min_size=20)
  4.  
  5. print regions[0]
  6. print len(regions)

{'labels': [0.0], 'rect': (0, 0, 511, 511), 'size': 243048} 49

  1. # 接下来我们把窗口和图像打印出来,对它有个直观认识
  2. fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
  3. ax.imshow(img)
  4.  
  5. for reg in regions:
  6. x, y, w, h = reg['rect']
  7. rect = mpatches.Rectangle(
  8. (x, y), w, h, fill=False, edgecolor='red', linewidth=1)
  9. ax.add_patch(rect)
  10.  
  11. plt.show()

3.定义规则来筛选窗口

  1. candidates = []
  2. for r in regions:
  3. # 重复的不要
  4. if r['rect'] in candidates:
  5. continue
  6. # 太小和太大的不要
  7. if r['size'] < 200 or r['size']>20000:
  8. continue
  9.  
  10. x, y, w, h = r['rect']
  11. # 太不方的不要
  12. if w / h > 1.2 or h / w > 1.2:
  13. continue
  14. candidates.append((x,y,w,h))
  15.  
  16. print len(candidates)
  17. # 这一步的序号是事先设定好的,真正实现时不这样做,肯定会有多的窗口需要你以后来筛选。
  18. candidates_re = [candidates[i] for i in [0,4,7,9,11]]
  19.  
  20. print u"最终筛选后的窗口是:",candidates_re
  21.  
  22. fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
  23. ax.imshow(img)
  24. for x, y, w, h in candidates_re:
  25. rect = mpatches.Rectangle(
  26. (x, y), w, h, fill=False, edgecolor='red', linewidth=1)
  27. ax.add_patch(rect)
  28.  
  29. plt.show()

最终筛选后的窗口是: [(47, 31, 65, 89), (335, 124, 84, 116), (127, 230, 65, 90), (343, 375, 41, 50), (183, 399, 73, 81)]

4.对窗口内图片进行处理,大小resize,转换灰度图,最终转换成为784的输入向量

  1. img_sample = np.zeros((len(candidates_re),784))
  2. i=0
  3.  
  4. for rect in candidates_re:
  5. x,y,w,h = rect
  6. if w>h:
  7. largewh = w
  8. else:
  9. largewh = h
  10. bord_size = int(largewh*0.2)
  11. img_cut = img[y-bord_size:y+largewh+bord_size,x-bord_size:x+largewh+bord_size,:]
  12. img_resize = cv2.resize(img_cut,(28,28),interpolation=cv2.INTER_NEAREST)
  13. gray=cv2.cvtColor(img_resize, cv2.COLOR_BGR2GRAY)
  14. img_sample[i,:]=gray.ravel()
  15. i+=1
  16.  
  17. # 把转换后的数据用图来显示
  18. img_s=np.zeros((28,28*img_sample.shape[0]))
  19. for i in xrange(img_sample.shape[0]):
  20. img_s[:,i*28:28*(i+1)]=img_sample[i,:].reshape(28,28)
  21.  
  22. fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
  23. ax.imshow(img_s,cmap='gray')
  24. plt.show()

5.用训练好的模型对处理后的图片进行预测

  1. label = nn.predict(img_sample/255)
  2. print u"每个窗口的预测值为:",label

每个窗口的预测值为: [8 5 3 5 0]

[注],检测失败了一个。

『科学计算』图像检测微型demo的更多相关文章

  1. 『科学计算』可视化二元正态分布&3D科学可视化实战

    二元正态分布可视化本体 由于近来一直再看kaggle的入门书(sklearn入门手册的感觉233),感觉对机器学习的理解加深了不少(实际上就只是调包能力加强了),联想到假期在python科学计算上也算 ...

  2. 『科学计算』L0、L1与L2范数_理解

     『教程』L0.L1与L2范数 一.L0范数.L1范数.参数稀疏 L0范数是指向量中非0的元素的个数.如果我们用L0范数来规则化一个参数矩阵W的话,就是希望W的大部分元素都是0,换句话说,让参数W是稀 ...

  3. 『科学计算』通过代码理解SoftMax多分类

    SoftMax实际上是Logistic的推广,当分类数为2的时候会退化为Logistic分类 其计算公式和损失函数如下, 梯度如下, 1{条件} 表示True为1,False为0,在下图中亦即对于每个 ...

  4. 『科学计算』通过代码理解线性回归&Logistic回归模型

    sklearn线性回归模型 import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model de ...

  5. 『科学计算』科学绘图库matplotlib学习之绘制动画

    基础 1.matplotlib绘图函数接收两个等长list,第一个作为集合x坐标,第二个作为集合y坐标 2.基本函数: animation.FuncAnimation(fig, update_poin ...

  6. 『科学计算』科学绘图库matplotlib练习

    思想:万物皆对象 作业 第一题: import numpy as np import matplotlib.pyplot as plt x = [1, 2, 3, 1] y = [1, 3, 0, 1 ...

  7. 『科学计算_理论』优化算法:梯度下降法&牛顿法

    梯度下降法 梯度下降法用来求解目标函数的极值.这个极值是给定模型给定数据之后在参数空间中搜索找到的.迭代过程为: 可以看出,梯度下降法更新参数的方式为目标函数在当前参数取值下的梯度值,前面再加上一个步 ...

  8. 『科学计算_理论』PCA主成分分析

    数据降维 为了说明什么是数据的主成分,先从数据降维说起.数据降维是怎么回事儿?假设三维空间中有一系列点,这些点分布在一个过原点的斜面上,如果你用自然坐标系x,y,z这三个轴来表示这组数据的话,需要使用 ...

  9. 『科学计算_理论』SVD奇异值分解

    转载请声明出处 SVD奇异值分解概述 SVD不仅是一个数学问题,在工程应用中的很多地方都有它的身影,比如前面讲的PCA,掌握了SVD原理后再去看PCA那是相当简单的,在推荐系统方面,SVD更是名声大噪 ...

随机推荐

  1. Python入门之实现简单的购物车功能

    Talk is cheap,Let's do this! product_list = [ ['Iphone7 Plus', 6500], ['Iphone8 ', 8200], ['MacBook ...

  2. 20145220韩旭飞《网络对抗》Exp8 Web基础

    20145220韩旭飞<网络对抗>Exp8 Web基础 Web前端:HTML基础 首先,我们的Web开发是基于Apache服务器进行的,所以对于Apache的基本操作我们是应该要掌握的,对 ...

  3. 20145330 《网络攻防》 MSF基础应用

    20145330 <网络攻防> MSF基础应用 1.实验后回答问题 (1)用自己的话解释什么是exploit,payload,encode. exploit:进行渗透攻击的模块合集 pay ...

  4. 串口WIF简单I调试

    串口WIF简单I调试 /*********************************************************************** Title:Wifi串口调试 H ...

  5. Python3基础 try-except-finally 的简单示例

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  6. JavaScript紧凑学习

    JavaScript紧凑学习 windows本地,调用命令行: win键+R 键入cmd , (cmd是Command 命令行 简称) 目录是C盘下的 C:\Users\Administrator&g ...

  7. Unity3D学习笔记(二十一):InputFiled、Dropdown、Scroll Rect、Mask

    InputFiled组件(输入框) Text Component(显示内容):显示输入内容的Text的组件 Text(输入内容):输入的文本内容 Character Limit:字符数量限值,0是无限 ...

  8. WebApi——json返回多了 k_BackingField

    产生原因: model类添加了    [System.Serializable] 解决方案: xxxxx.WebApi\App_Start\WebApiConfig.cs的Register函数中添加如 ...

  9. junit中test注解测试使用案列解析一

    本文原创,转载请注明出处 在写代码的过程中,只想测试部分代码,调试一小段功能有没有通的情况下,可以用该方法: 以下为在项目中测试一个小功能的案例,在此记录一下, /**     * <解析查询磁 ...

  10. JS利用正则配合replace()函数替换指定字符

    定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp,replacement) ...