DeepLearning

SSD与MobileNet详解

1.概述 本文档阐述SSD检测算法原理,及以MobileNet为Backbone的网络搭建方式。 十里桃园首发,转载请注明 Why SSD? 无论是机器学习或是深度学习一般都可分为两个部分:特征提取与分类任务。 在传统的机器学习方法中,特征提取需要依据图像以及特有的检测目的抓取特有特征,如偏重物体轮廓的HOG特征,注重明暗对比的Haar特征等,特征被描述之后送入机器学习算法分类,如SVM、Adaboost等,进而判断物体的分类。将上述的流程在图像上做滑框操作或代入已图像预处理的ROI框即完成了图像检测与识别任务。 图.1 机器学习目标检测简图 在深度学习中,特征提取需要由特有的特征提取神经网络来完成,如VGG、MobileNet,ResNet等,这些特征提取网络往往被称为Backbone。通常来讲在BackBone后面接全连接层(FC)来执行分类任务。但FC对目标的位置识别乏力。经过算法的发展,当前主要以特定的功能网络来代替FC的作用,如Mask-Rcnn、SSD、SSDlite、YOLO等。 图.2 深度神经网络特征提取+SSD分类器 本文主要阐述说明以MobileNet_v2为Backbone,以SSD为分类器来执行分类任务的具体架构。 SSD 分类框架 3.1.两种主流的深度学习目标检测分类算法 基于目标检测与识别算法分为两个类型: 1,Two-Stage方法,如R-CNN系列算法,其先产生一系列稀疏的候选框,然后对这些候选框进行分类和回归。 2,One-Stage算法,如Yolo、SSD等,其主要思路为均匀地在图片不同位置进行密集抽样,抽样时采用不同尺度和长宽比,进行分类和回归,整个过程只需一步,相应的其运行速度要远远优于Two-Stage方法 两种方法的mAP(Mean Average Precision)与运行速度如下图: 图.3 Two-Stage与One-Stage算法性能对比图 如上图,横轴为识别帧率,纵坐标为mAP。可以看出,One-Stage算法的帧率在保证mAP的前提下,普遍高于Two-Stage,更适合在嵌入式移动设备端部署。 3.2.SSD算法 和FC不同的是,SSD在多个尺度的特征图上分别执行目标检测工作。这样可以使得各个尺度的目标都能被兼顾,小尺度特征图预测大目标,大尺度特征图预测相对较小的目标。 3.2.1.感受野 感受野是指影响某个神经元的输入区域,也被称为理论感受野。 输入区域中每个像素点对输出影响的重要性不同,越靠近中心的像素点影响越大,呈高斯分布。中间一小部分区域对神经元的输出有绝对的影响,这中间一小部分被叫做有效感受野。 图.4 感受野与Default Box 如图.4,左侧整个黑色区域就是理论感受野,中间成高斯分布的白色点云区域为有效感受野。右侧图像蓝色框内对应理论感受野,绿色圆内对应有效感受野,而红色框内是Default Box大小,Default Box比理论感受野小很多,但是可以容纳大部分有效感受野内部信息。Default Box的具体含义与作用在下节给出。 3.2.2.Default Box 3.2.2.1 Default Box Acquisition 特征图是输入图像经过神经网络卷积产生的结果,表征的是神经空间内一种特征,其分辨率大小取决于先前卷积核的步长。SSD算法中共取6层不同尺度的特征图,在每层特征图的每个像素点处生产不同宽高比的框,此类的框统称为Default Box。 图.5 8*8特征图和Default Box 如上图,假定有8*8的特征图,特征图上的每个格子称为特征图小格,在每个特征图小格上面有一系列固定大小的Box,上图中每个小格上有4个Box,用虚线框标识。 泛化地来说,如果一个特征图的大小是mn,也即有mn个特征图小格。在每个小格上有k个Default Box,那么这层特征图Default Box的总数为mnk。 Default Box自身的尺度(scale)和宽高比(aspect ratio)也有特殊的规定的方式,假设一共用I个特征图做预测,对于每个特征图而言其Default Box的尺度按下面的公式计算: 尺度(scale)是相对于输入图像的分辨率,最终Default Box的实际像素尺寸需乘以输入图像的分辨率,如SDD300,则需乘以300。 3.2.3. Box regression 对于神经网络前向流动来说,需要将Prior Box与Ground Truth Box做匹配。匹配成功则说明,Prior Box所包含的是被检测的目标。但其力完整目标的Ground Truth Box还有一定的神经网络高维空间内的距离。显然地,将Prior Box的分类尽可能地通过一个高维向量分类并回归到Ground Truth Box为神经网络地最终目标之一。

CNN – 卷积神经网络卷积计算详解

卷积计算层:CONV Layer 人的大脑在识别图片的过程中,会由不同的皮质层处理不同方面的数据,比如:颜色、形状、光暗等,然后将不同皮质层的处理结果进行合并映射操作,得出最终的结果值,第一部分实质上是一个局部的观察结果,第二部分才是一个整体的结果合并。 基于人脑的图片识别过程,我们可以认为图像的空间联系也是局部的像素联系比较紧密,而较远的像素相关性比较弱,所以每个神经元没有必要对全局图像进行感知,只要对局部进行感知,而在更高层次对局部的信息进行综合操作得出全局信息。 卷积过程: 一个数据输入,假设为一个RGB的图片 在神经网络中,输入是一个向量,但是在卷积神经网络中,输入是一个多通道图像(比如这个例子中有3个通道,即RBG通道) 手动画一张图来理解一下吧,字丑见谅 … … 上述第3步骤, 表示 第 I 层特征图的第一个通道,后面的(1,1)表示该通道上位于第一行第一列的像素值。a,b,c分别表示卷积核的3个通道,它们的下标同样表示卷积核该通道上第n行第n列的参数值(权重值w)。 2、卷积过程实际意义理解: 对于一张图片“2”,我们来把这个’2‘分成块,一块一块看:你一块块看,是不是仍然会发现这是个数字’2‘? 也是说,你大脑会自动把这些分散的图片组合起来进行识别 也就是说,我们发现了两个现象: 如果我们只知道局部的图片,以及局部的相对位置,只要我们能将它正确组合起来,我们也可以对物体进行识别,即看做卷积核在特征图像上按步长扫描的过程,每个扫面块都是局部图片,且有局部相对位置。输出特征值也是按同样的相对位置生成在输出特征平面上。 同时局部与局部之间关联性不大,也就是局部的变化,很少影响到另外一个局部,即看做每个扫描块所有特征值经过卷积核卷积生成一个输出特征值,即局部图片通过卷积发生了变化。 实际上,我们还会遇到两个问题: 一张图片特征这么多,一个卷积层提取的特征数量有限的,提取不过来啊! 我怎么知道最后采样层选出来的特征是不是重要的呢? 我来大概介绍一下级联分类器: 大概意思就是我从一堆弱分类器里面,挑出一个最符合要求的弱分类器,用着这个弱分类器把不想要的数据剔除,保留想要的数据。 然后再从剩下的弱分类器里,再挑出一个最符合要求的弱分类器,对上一级保留的数据,把不想要的数据剔除,保留想要的数据。 最后,通过不断串联几个弱分类器,进过数据层层筛选,最后得到我们想要的数据。 那么,针对刚才的问题,我们是否也可以级联一个卷积层和池化层? 于是就有了CNN中[ ( 卷积 > 激活 ) * N > 池化? ] * M的过程。 大致上可以理解为: 通过第一个卷积层提取最初特征,输出特征图(feature map) 通过第一个采样层对最初的特征图(feature map )进行特征选择,去除多余特征,重构新的特征图 第二个卷积层是对上一层的采样层的输出特征图(feature map)进行二次特征提取 第二个采样层也对上层输出进行二次特征选择 全连接层就是根据得到的特征进行分类 其实整个框架很好理解,我举个生动形象的例子: 输入图像好比甘蔗。 卷积层好比A君要吃甘蔗,吃完之后(卷积),他得出一系列结论,这个甘蔗真好吃,我还想再吃! 啊不是,说错了 他得出结论,这个甘蔗是圆柱形,长条,甜的,白的,多汁的等等(提取特征,提取的特征即输出特征值) 采样层就好比第一个吃甘蔗的人告诉B君,吃甘蔗,重要的是吃个开心,为什么开心,因为它又甜又多汁,还嘎嘣脆(特征选取) 第二个卷积层就好比,B君并没有去吃剩下的甘蔗,而是 头也不回。 拦也拦不住的 去吃A君吐出的甘蔗渣 然后得出结论,嗯~~, 咦~~? 哦~~! ‘原来这甘蔗渣是涩的,是苦的,不易嚼,不好咽’B君这么说道(二次提取特征,提取的特征即输出特征值) 第二个采样层就好比,B君对别人说,这个甘蔗渣啊,吃的我不开心,因为它很涩,不好咽(二次特征选取) 如果你们要吃,注意点! 注意点!

deeplabv3+二:详细代码解读 data generator 数据生成器

3+支持三种数据库,voc2012,cityscapes,ade20k, 代码文件夹 -deeplab -datasets -data_generator.py 在开始之前,始终记住,网络模型的输入是非常简单的image,规格化到[-1,1]或[0,1],或者数据扩增(水平翻转,随机裁剪,明暗变化,模糊),以及一个实施了相同数据扩增的label(毕竟需要pixel对上),test的话只需要一个image。是非常简单的数据格式,也许程序员会为了存储的压缩量以及读取处理的速度(指的就是使用tf.example 与 tf.record)写复杂的代码,但是最终的结果始终都是很简单的。 觉得自己一定要先搞清楚tf.example 与tf.record:https://zhuanlan.zhihu.com/p/33223782 目录 数据库分析 代码重点类Dataset 1.方法_parse_function() 2. 方法_preprocess_image() 2.1 input_preprocess的preprocess_image_and_label方法介绍 3.方法 _get_all_files(self): 4.方法 get_one_shot_iterator(self) Class TFRecordDataset 代码使用是在train.py里面: 代码:先放代码,你可以尝试自己看,看得懂就不用往下翻浪费时间了。 # Copyright 2018 The TensorFlow Authors All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.

Graph Convolutional Neural Networks for Web-Scale Recommender Systems(用于Web级推荐系统的图形卷积神经网络)

Graph Convolutional Neural Networks for Web-Scale Recommender Systems 用于Web级推荐系统的图形卷积神经网络 ABSTRACT Recent advancements in deep neural networks for graph-structured data have led to state-of-the-art performance on recommender system benchmarks. However, making these methods practical and scalable to web-scale recommendation tasks with billions of items and hundreds of millions of users remains a challenge. Here we describe a large-scale deep recommendation engine that we developed and deployed at Pinterest. We develop a data-efficient Graph Convolutional Network (GCN) algorithm PinSage, which combines efficient random walks and graph convolutions to generate embeddings of nodes (i.

Win/Mac系统下,软件使用tor的多层socks5代理网络

不论win还是MAC,首先要打开tor洋葱头浏览器, 至于怎么安装运行起tor我就不多说了,使用代理或者vpn都可以。 tor启动后,默认配置了另一个9150端口的Socks5服务,其他软件接入这个端口就可以使用tor的网络: win系统下,使用SocksCap64,先把tor的代理添加进去: 然后把要使用tor代理的程序拉进SocksCap64工具里: 点击SocksCap64工具里的程序图标启动程序,这样程序就会自动使用tor的代理网络, tor断线的时候,程序会断线, tor不须用特殊设置,软件运行中IP会不定时每隔几分钟自动更换。 MAC系统下,使用Proxifier,可能很多人都用过。 也是先把tor的代理添加进去: 添加代理规则: 测试效果:

吴恩达卷积神经网络第一周笔记

第一周 卷积神经网络 1.1 计算机视觉 计算机视觉问题:图片分类、物体检测、神经风格转换 图片像素过多,用传统神经网络计算量过大 1.2 边缘检测 垂直检测 6×6 矩阵和 3×3 卷积核进行卷积运算,得到 4*4 矩阵 下图卷积核是垂直检测所用卷积核 通过该卷积核的卷积运算得到的结果能够成功检测出垂直边缘 1.3 更多边缘检测内容 左明右暗中间白(正),左暗右明中间黑(负) 上明下暗中间白(正),上暗下明中间黑(负) 还有一切其他的可以用来进行边缘检测的卷积核,大都是人为设计出来的效果比较好的卷积核 除此之外,还可以让机器自己学习卷积核的参数设置,通过不断训练迭代取得更贴合问题的卷积核参数 1.4 Padding 6×6 的矩阵和 3×3 的卷积核做卷积得到 4×4 的矩阵 n×n * f×f ——> (n-f+1)×(n-f+1) 规模变小的缺陷: 多次卷积运算之后图片可能就变成 1×1 缺失很多信息 边缘像素点和中心像素点运算的次数(权重)不同,容易失去边缘信息 如果不希望矩阵的规模发生改变,就需要对原来的矩阵进行 padding p 是边缘填充像素点的个数,因此卷积之后的矩阵变成 (n+2p)×(n+2p) * f×f ——> (n+2p-f+1)×(n+2p-f) Padding 方法 Valid:不填充 n×n * f×f ——> (n-f+1)×(n-f+1) Same:填充运算后得到相同大小矩阵 (n+2p)×(n+2p) * f×f ——> (n+2p-f+1)×(n+2p-f) p = f − 1

Python PIL库处理图片常用操作,图像识别数据增强的方法

在博客AlexNet原理及tensorflow实现训练神经网络的时候,做了数据增强,对图片的处理采用的是PIL(Python Image Library), PIL是Python常用的图像处理库. 下面对PIL中常用到的操作进行整理: 1. 改变图片的大小 from PIL import Image, ImageFont, ImageDraw def image_resize(image, save, size=(100, 100)): """ :param image: 原图片 :param save: 保存地址 :param size: 大小 :return: """ image = Image.open(image) # 读取图片 image.convert("RGB") re_sized = image.resize(size, Image.BILINEAR) # 双线性法 re_sized.save(save) # 保存图片 return re_sized 2. 对图片进行旋转: from PIL import Image, ImageFont, ImageDraw import matplotlib.pyplot as plt def image_rotate(image_path, save_path, angle): """ 对图像进行一定角度的旋转 :param image_path: 图像路径 :param save_path: 保存路径 :param angle: 旋转角度 :return: "

使用darknet识别点选验证码详细过程(附带源码)

项目源码:https://github.com/nickliqian/darknet_captcha darknet_captcha 项目基于darknet开发了一系列的快速启动脚本,旨在让图像识别新手或者开发人员能够快速的启动一个目标检测(定位)的项目。 如果有没有讲清楚的地方,欢迎提issue和PR,希望能和大家共同完善! 本项目分为两个部分: 提供两个目标检测(单分类和多分类点选验证码)的例子,你可以通过例子熟悉定位yolo3定位网络的使用方式 基于darknet提供一系列API,用于使用自己的数据进行目标检测模型的训练,并提供web server的代码 目录 项目结构 开始一个例子:单类型目标检测 第二个例子:多类型目标检测 训练自己的数据 Web服务 API文档 其他问题 使用阿里云OSS加速下载 GPU云推荐 CPU和GPU识别速度对比 报错解决办法 TODO 项目结构 项目分为darknet、extent、app三部分 darknet: 这部分是darknet项目源码,没有作任何改动。 extent: 扩展部分,包含生成配置、生成样本、训练、识别demo、api程序。 app: 每一个新的识别需求都以app区分,其中包含配置文件、样本和标签文件等。 开始一个例子:单类型目标检测 以点选验证码为例 darknet实际上给我们提供了一系列的深度学习算法,我们要做的就是使用比较简单的步骤来调用darknet训练我们的识别模型。 推荐使用的操作系统是ubuntu,遇到的坑会少很多。 如果使用windowns系统,需要先安装cygwin,便于编译darknet。(参考我的博客:安装cygwin) 下面的步骤都已经通过ubuntu16.04测试。 1.下载项目 git clone https://github.com/nickliqian/darknet_captcha.git 2.编译darknet 进入darknet_captcha目录,下载darknet项目,覆盖darknet目录: cd darknet_captcha git clone https://github.com/pjreddie/darknet.git 进入darknet目录,修改darknet/Makefile配置文件 cd darknet vim Makefile 如果使用GPU训练则下面的GPU=1 使用CPU训练则下面的GPU=0 GPU=1 CUDNN=0 OPENCV=0 OPENMP=0 DEBUG=0 然后使用make编译darknet: make 不建议使用CPU进行训练,因为使用CPU不管是训练还是预测,耗时都非常久。 如果你需要租用临时且价格低的GPU主机进行测试,后面介绍了一些推荐的GPU云服务。 如果在编译过程中会出错,可以在darknet的issue找一下解决办法,也可以发邮件找我要旧版本的darknet。 3.安装python3环境 使用pip执行下面的语句,并确保你的系统上已经安装了tk: pip install -r requirement.txt sudo apt-get install python3-tk 4.

SILVACO 使用中遇到的问题

bias step cut back more than 4 times. Cannot trap 这个是因为计算结果太粗糙而导致不收敛,使用trap参数可定义计算的折半次数。如果计算开始时候数值梯度太大,无法满足计算精度,电极的偏置步长将从最初值减小到原来的一半重新计算,如果结果还是太粗糙的话有折半计算知道满足精度要求。默认trap 次数是4次,如果初始值折半4次还很粗糙,计算将停止,并在实时输出窗口中显示不收敛的报错信息:max trap more than 4

基于深度学习的语义匹配若干模型DSSM,ESIM, BIMPM, ABCNN

本项目介绍了语义匹配的几个模型,分别为: DSSM Learning Deep Structured Semantic Models for Web Search using Clickthrough Data ESIM Enhanced LSTM for Natural Language Inference Pair-CNN Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks ABCNN ABCNN: Attention-Based Convolutional Neural Network for Modeling Sentence Pairs BIMPM bilateral multi-perspective matching for natural language sentences 顺带介绍料WMD的相关知识 论文集在papers文件夹中 github:https://github.com/pengming617/text_matching 纯属个人学习 如有侵权 实在抱歉 请联系我 上文中介绍的Bimpm代码复制于 https://zhuanlan.zhihu.com/p/50184415,特此感谢 简枫 同学