使用caffe完成图像目标检测和caffe全卷积网络

leoking01 leoking01     2022-09-09     299

关键词:

一、【用Python学习Caffe】2. 使用Caffe完成图像目标检测

标签: pythoncaffe深度学习目标检测ssd
技术分享 分类:
 
 

目录(?)[+]

 

2. 使用Caffe完成图像目标检测

本节将以一个快速的图像目标检测网络SSD作为例子,通过Python Caffe来进行图像目标检测。

必须安装windows-ssd版本的Caffe,或者自行在caffe项目中添加SSD的新增相关源代码.

图像目标检测网络同图像分类网络的大体原理及结构很相似,不过原始图像再经过深度网络后,并不是得到一组反映不同分类种类下概率的向量,而得到若干组位置信息,其反映不同目标在图像中的位置及相应分类等信息。但与分类网络的总体实施结构是一致的。

关于SSD的原理,可以参见其论文:Liu W, Anguelov D, Erhan D, et al. SSD : Single shot multibox detector[C]. In Proc. European Conference on Computer Vision (ECCV). 2016: 21-37.

2.1 准备文件

  • deploy.prototxt: 网络结构配置文件
  • VGG_VOC0712_SSD_300x300_iter_60000.caffemodel: 网络权重文件
  • labelmap_voc.prototxt: 数据集分类名称
  • 测试图像

本文的SSD是在VOC0712数据集下进行训练的,labelmap_voc.prototxt也是该数据库下的各目标的名称,该文件对于目标检测网络的训练任务是必须的,在下节中,我们将重点介绍如何生成LMDB数据库及Labelmap文件。

2.2 加载网络

加载网络的方法,目标检测网络同目标分类网络都是一致的。

    caffe_root = ‘../../‘
    # 网络参数(权重)文件
    caffemodel = caffe_root + ‘models/SSD_300x300/VGG_VOC0712_SSD_300x300_iter_60000.caffemodel‘
    # 网络实施结构配置文件
    deploy = caffe_root + ‘models/SSD_300x300/deploy.prototxt‘
    labels_file = caffe_root + ‘data/VOC0712/labelmap_voc.prototxt‘

    # 网络实施分类
    net = caffe.Net(deploy,  # 定义模型结构
                    caffemodel,  # 包含了模型的训练权值
                    caffe.TEST)  # 使用测试模式(不执行dropout)

2.3 测试图像预处理

预处理主要包含两个部分:

  1. 减去均值
  2. 调整大小
    # 加载ImageNet图像均值 (随着Caffe一起发布的)
    mu = np.load(caffe_root + ‘python/caffe/imagenet/ilsvrc_2012_mean.npy‘)
    mu = mu.mean(1).mean(1)  # 对所有像素值取平均以此获取BGR的均值像素值

    # 图像预处理
    transformer = caffe.io.Transformer({‘data‘: net.blobs[‘data‘].data.shape})
    transformer.set_transpose(‘data‘, (2,0,1))
    transformer.set_mean(‘data‘, mu)
    transformer.set_raw_scale(‘data‘, 255)
    transformer.set_channel_swap(‘data‘, (2,1,0))

2.4 运行网络

  1. 导入输入数据
  2. 通过forward()运行结果

    # 加载图像
    im = caffe.io.load_image(img)
    # 导入输入图像
    net.blobs[‘data‘].data[...] = transformer.preprocess(‘data‘, im)

    start = time.clock()
    # 执行测试
    net.forward()
    end = time.clock()
    print(‘detection time: %f s‘ % (end - start))

2.5 查看目标检测结果

SSD网络的最后一层名为‘detection_out‘,该层输出Blob结构‘detection_out‘中包含了多组元组结构,每个元组结构包含7个参数,其中第2参数表示分类类别序号,第3个参数表示概率置信度,第4~7个参数分别表示目标区域左上及右下的坐标,而元组的个数表明该图像中可能的目标个数。

当然可能不同网络模型的结构不一样,可能会有不同的设置,但至少对于SSD是这样设置的。

    # 查看目标检测结果
    # 打开labelmap_voc.prototxt文件
    file = open(labels_file, ‘r‘)
    labelmap = caffe_pb2.LabelMap()
    text_format.Merge(str(file.read()), labelmap)
    # 得到网络的最终输出结果
    loc = net.blobs[‘detection_out‘].data[0][0]
    confidence_threshold = 0.5
    for l in range(len(loc)):
      if loc[l][2] >= confidence_threshold:
        # 目标区域位置信息
        xmin = int(loc[l][3] * im.shape[1])
        ymin = int(loc[l][4] * im.shape[0])
        xmax = int(loc[l][5] * im.shape[1])
        ymax = int(loc[l][6] * im.shape[0])
        # 画出目标区域
        cv2.rectangle(im, (xmin, ymin), (xmax, ymax), (55 / 255.0, 255 / 255.0, 155 / 255.0), 2)
        # 确定分类类别
        class_name = labelmap.item[int(loc[l][1])].display_name
        cv2.putText(im, class_name, (xmin, ymax), cv2.cv.CV_FONT_HERSHEY_SIMPLEX, 1, (55, 255, 155), 2)

2.6 目标检测结果展示

技术分享

2.7 具体代码下载

GitHub仓库Caffe-Python-Tutorial中的detection.py

项目地址:https://github.com/tostq/Caffe-Python-Tutorial

 

 

二、caffe 全卷积网络

 

标签: caffe全卷积网络fcnsegnet
技术分享 分类:
 

目录(?)[+]

 

论文:Long_Fully_Convolutional_Networks

简介

  • 全卷积网络相对于之前的cnn,是对图像中的每个像素点进行分类
  • 常用于图像的语义分割中

参考

测试

  • 需要下载pascalVoc的数据集
  • 下载代码之后,在其根目录下新建py文件如下

    import numpy as np
    from PIL import Image
    import matplotlib.pyplot as plt
    caffe_root = ‘/home/gry/libs/caffe/‘
    import sys
    sys.path.insert(0,caffe_root + ‘python/‘)
    import caffe
    
    fn = ‘data/pascal/VOCdevkit/VOC2012/JPEGImages/2007_000129.jpg‘
    im = Image.open( fn )
    # im = im.resize([500,500],Image.ANTIALIAS)
    # im.save("1.jpg","JPEG")
    
    npimg = np.array( im, dtype=np.float32 )
    print( ‘max val of the npimg is : %f‘%(npimg.max()) )
    npimg -= np.array((104.00698793,116.66876762,122.67891434))
    npimg.shape
    
    
    npimg = npimg.transpose( (2,0,1) )
    
    # load net
    # net = caffe.Net( ‘voc-fcn8s/deploy.prototxt‘,‘voc-fcn8s/fcn8s-heavy-pascal.caffemodel‘, caffe.TEST )
    net = caffe.Net( ‘voc-fcn16s/deploy.prototxt‘,‘voc-fcn16s/fcn16s-heavy-pascal.caffemodel‘, caffe.TEST )
    # shape for input (data blob is N x C x H x W), set data
    # note : the H X W is not necessary to be equal with the network H X W
    # but the channel must be equal
    net.blobs[‘data‘].reshape(1, *npimg.shape)
    net.blobs[‘data‘].data[...] = npimg
    # net.blobs[‘data‘].data.shape
    # run net and take argmax for prediction
    net.forward()
    out = net.blobs[‘score‘].data[0].argmax(axis=0)
    
    plt.imshow(out,cmap=‘autumn‘);plt.axis(‘off‘)
    plt.savefig(‘test.png‘)
    plt.show()
    print(‘end now‘)
    
  • 用不同的caffemodel得到的结果如下

    • 原图 
      技术分享
    • voc-fcn8s 
      技术分享
    • voc-fcn16s 
      技术分享
    • voc-fcn32s 
      技术分享

SegNet

简介

  • 基于caffe

参考链接

测试

  • 下载基于cudnn5的segnet代码与segnet-tutorial的代码,按照参考链接里的教程组织文件结构
  • 修改trian.txttest.txt,并3进行训练
  • 如果显存超过限制,则需要减小训练的batchsize
  • 转换caffemodel并按照教程里的方式进行测试,可以实时显示原图、groudtruth与网络输出图像
  • 原代码中使用的是plt.show(),需要关闭之后才能继续运行,为更方便的显示,可以结合opencvimshowwaitKey

 








『caffe』图像检测程序(待续)

...检测涉及更多的技术基础,本程序是基于传统的滑窗模式完成检测,当下已经有了最新的基于caffe的RCNN、Fast-RCNN、Faster-RCNN以及SSD框架,个中思路不同,不得叹惋前路漫漫。由于接触本部时走了很多弯路,所以给出几个关键词用... 查看详情

使用caffe的hdf5数据完成回归任务

   一直在研究如何用caffe做行人检测问题,然而参考那些经典结构比如faster-rcnn等,都是自定义的caffe层来完成的检测任务。这些都要求对caffe框架有一定程度的了解。最近看到了如何用caffe完成回归的任务,就想把检... 查看详情

如何通过 Caffe 和 CNN 实现对象检测 [关闭]

...N[closed]【发布时间】:2016-03-1220:15:20【问题描述】:我想使用Caffe框架和卷积神经网络实现对象检测,您能推荐一些关于此的论文和演示吗?我只需要知道如何实现它。如果能提供源代码就完美了。【问题讨论】:我们不只是提... 查看详情

ssd源码解读(caffe)

...现的,这需要加入新的层来完成功能,caffe自定义层可以使用python和c++,fasterrcnn既使用了c++定义如smoothl1layer,又使用了python定义,如proposaltargetlayer、roidatalayer等。而ssd完全使用c++来定义层,包括:1)annotateddatalayer数据读 查看详情

caffe中卷积运算的原理与实现

...出原理示意图,为了方便,这里以二维核为例滑动窗口在图像中每滑动一个地方,将图像中该滑动窗口图像展开为一列,所有列组成图中的滑动窗口矩阵,这里假设pad=1,stride=1,K=3,则滑动窗口矩阵每行大小为W*H,一共K* 查看详情

ssd+caffe︱singleshotmultiboxdetector目标检测

...如果你用FasterRCNN的话,你可以优化前面的这个,在实际使用的时候可以把这个网络简化一下。Y 查看详情

用caffe给图像的混乱程度打分

Caffe应该是目前深度学习领域应用最广泛的几大框架之一了,尤其是视觉领域。绝大多数用Caffe的人,应该用的都是基于分类的网络,但有的时候也许会有基于回归的视觉应用的需要,查了一下Caffe官网,还真没有很现成的例子。... 查看详情

caffe和vgg-16和googlenet的区别

...领域应用最为广泛的深度学习平台,许多国内外的大牛都使用caffe做为实验平台,主要原因个人认为有两个,一是caffe发展较早,随着时间的积累积聚了大量的深度学习研究成果,例如能够直接运行的代码和使用预先训练好的模... 查看详情

caffe_实战之两个简单的例子(物体分类和人脸检测)

一、物体分类:这里使用的是caffe官网中自带的例子,我这里主要是对代码的解释~首先导入一些必要的库:importcaffeimportnumpyasnpimportmatplotlib.pyplotasplt%matplotlibinlineplt.rcParams[‘figure.figsize‘]=(10,10)#显示图像的最大范围,使用plt.rcParam... 查看详情

SHOGUN Toolbox 卷积神经网络与 Caffe 和 Theano 相比如何?

...序中实现卷积神经网络,我正在跟踪标记的昆虫(我也在使用OpenCV)。我看到人们经常提到Caffe、Torch和The 查看详情

如何使用 Spark 和 Caffe 对图像进行分类

】如何使用Spark和Caffe对图像进行分类【英文标题】:HowtoclassifyimagesusingSparkandCaffe【发布时间】:2016-03-0216:06:45【问题描述】:我是用Caffe做图像分类的,可以用MACOSX,Pyhton吗?现在我知道如何使用Caffe和Sparkpython对图像列表进行... 查看详情

tensorflow与caffe中卷积层featuremap大小计算

刚刚接触Tensorflow,由于是做图像处理,因此接触比较多的还是卷及神经网络,其中会涉及到在经过卷积层或者pooling层之后,图像Featuremap的大小计算,之前一直以为是与caffe相同的,后来查阅了资料发现并不相同,将计算公式贴... 查看详情

关于caffe的一些笔记

...t是你要生成的模型图的网络架构文件,my.jpg是你存放图像的位置以及图像名称;#cdpython#pythondraw_net.py/my.prototxt/my.jpg--rankdir=BT卷积和反卷积后特征计算公式I是input输入的大小,K是kernel卷积核的大小,P是pad边缘 查看详情

caffe的卷积层的乘积运算的优化

...自这篇paper,实际上就是将卷积核矩阵和featuremap矩阵(或者图像矩阵)转换为大的矩阵jiayangqing自己也分析了为何要做这种转换,如下图具体的优化过程如下图:在c 查看详情

caffe基础介绍

...re。特别是对于一些不知道如何设计feature的场合,比如说图像和speech。Caffe的设计:基本上,Caffefollow了神经网络的一个简单假设----所有的计算都是以layer的形式表示的,layer做的事情就是take一些数据,然后输出一些计算以后的... 查看详情

caffe基本数据结构blob

...annel:通道数量width:图像宽度height:图像高度caffe中默认使用的SGD随机梯度下降,其实是mini-batchSGD每个batch,就是一堆图片。这一个batch的图片,就存储在一个blob中。当然,blob并不是这么受限的、专门给batch内的图片做存储用的... 查看详情

caffe源码卷积层

通俗易懂理解卷积图示理解神经网络的卷积input: 3*5*5(c*h*w)pading: 1步长: 2卷积核: 2*3*3*3(n*c*k*k)output: 2*3*3(c*h*w)如下图所示: 深入理解卷积首先需要理解caffe里面的im2col和col2im然后卷积层其实和全连接... 查看详情

caffe源码阅读卷积层(代码片段)

...,Layer包括了数据和运算(Blobinput,Bloboutput,operation)。3、卷积 查看详情