caffe如何自定义网络以及自定义层(python)(五)_param_str_ caffe-程序员宅基地

技术标签: caffe  

前面铺垫了这么多,终于到主题了。

先写一个配置文件conv.protxt

layer {
  name: 'MyPythonLayer'
  type: 'Python'
  top: 'output'
  python_param {
    module: 'mypythonlayer'
    layer: 'MyLayer'
    param_str: "{\'data_dir\':\'../../images\',\'num\': 100}"
  }
}
然后就是这个python模块怎么写?mypythonlayer.py

#!/usr/bin/env python
#coding=utf-8
import sys 
import os
import numpy as np
import os.path as osp
import matplotlib.pyplot as plt
import pylab
from copy import copy
caffe_root = '/home/x/git/caffe/'
sys.path.insert(0, caffe_root + 'python')
import caffe
import numpy as np
import yaml
import numpy as np
from PIL import Image

class MyLayer(caffe.Layer):

    def setup(self, bottom, top):
        params = eval(self.param_str)
	self.data_dir = params['data_dir']
        self.num = yaml.load(self.param_str)["num"]
	self.cat  = '{}/{}.jpg'.format(self.data_dir,'cat')
	print "Image:",self.cat
        print "Parameter num : ", self.num
	

    def reshape(self, bottom, top):
        im = Image.open(self.cat)
        in_ = np.array(im, dtype=np.float32)
        in_ = in_[:,:,::-1]
        self.data = in_.transpose((2,0,1))
	top[0].reshape(1, *self.data.shape)


    def forward(self, bottom, top):
	top[0].data[...] = self.data
	print "forward=============================>cat"
	print self.data
	print type(top[0])
	print dir(top[0])
	print type(top[0].data)
	#print help(top[0].data)
	print type(top[0].data[...])

    def backward(self, top, propagate_down, bottom):
        pass
里面包括几个基本的设置,然后就是参数的读取,我这里添加了两个参数,路径和一个num参数。

基本实现里面有参数读取和图片读取的简单实现。

接下来调用test_python.py

#!/usr/bin/env python
#coding=utf-8
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

caffe_root = '/home/x/git/caffe/'
import sys
sys.path.insert(0, caffe_root + 'python')
import caffe
import mypythonlayer
sys.path.append("/home/x/git/caffe/examples/test_layer_lb/mypython")

caffe.set_device(0)
caffe.set_mode_gpu()

print "================================="
net = caffe.Net('/home/x/git/caffe/examples/test_layer_lb/mypython/conv.prototxt',caffe.TEST)
#print net.blobs.items()
#print dir(net.blobs)
net.forward()
日志:

WARNING: Logging before InitGoogleLogging() is written to STDERR
I1129 19:11:46.731223 16691 net.cpp:49] Initializing net from parameters: 
state {
  phase: TEST
}
layer {
  name: "MyPythonLayer"
  type: "Python"
  top: "output"
  python_param {
    module: "mypythonlayer"
    layer: "MyLayer"
    param_str: "{\'data_dir\':\'../../images\',\'num\': 100}"
  }
}
I1129 19:11:46.731266 16691 layer_factory.hpp:77] Creating layer MyPythonLayer
I1129 19:11:46.731314 16691 net.cpp:91] Creating Layer MyPythonLayer
I1129 19:11:46.731322 16691 net.cpp:399] MyPythonLayer -> output
I1129 19:11:46.744997 16691 net.cpp:141] Setting up MyPythonLayer
I1129 19:11:46.745023 16691 net.cpp:148] Top shape: 1 3 360 480 (518400)
I1129 19:11:46.745028 16691 net.cpp:156] Memory required for data: 2073600
I1129 19:11:46.745035 16691 net.cpp:219] MyPythonLayer does not need backward computation.
I1129 19:11:46.745039 16691 net.cpp:261] This network produces output output
I1129 19:11:46.745045 16691 net.cpp:274] Network initialization done.
=================================
Image: ../../images/cat.jpg
Parameter num :  100
forward=============================>cat
[[[  49.   50.   47. ...,   30.   36.   45.]
  [  51.   52.   48. ...,   32.   37.   45.]
  [  51.   51.   49. ...,   27.   35.   42.]
  ..., 
  [  15.   13.   13. ...,  156.  162.  164.]
  [  19.   20.   22. ...,  167.  158.  167.]
  [  25.   25.   27. ...,  188.  157.  158.]]

 [[  57.   58.   55. ...,   77.   87.   94.]
  [  57.   58.   56. ...,   82.   89.   96.]
  [  57.   57.   57. ...,   88.   95.   99.]
  ..., 
  [  47.   46.   47. ...,  173.  179.  181.]
  [  53.   56.   58. ...,  184.  175.  184.]
  [  62.   64.   66. ...,  205.  174.  175.]]

 [[  26.   27.   25. ...,   45.   50.   56.]
  [  26.   27.   25. ...,   50.   52.   58.]
  [  26.   26.   26. ...,   52.   55.   60.]
  ..., 
  [  36.   32.   36. ...,  182.  188.  190.]
  [  42.   42.   44. ...,  193.  184.  193.]
  [  46.   49.   51. ...,  214.  183.  184.]]]
<class 'caffe._caffe.Blob'>
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'channels', 'count', 'data', 'diff', 'height', 'num', 'reshape', 'shape', 'width']
<type 'numpy.ndarray'>
<type 'numpy.ndarray'>
本人水平有点菜,开始一看python的protxt里面的参数有点懵逼,如果看不懂里面的某个东西直接写个文件调试,慢慢就懂了。
a="{\'sbdd_dir\': \'../data/sbdd/dataset\', \'seed\': 1337, \'split\': \'train\', \'mean\': (104.00699, 116.66877, 122.67892)}"
params = eval(a)
print type(())
print params.items()
params_dir=params['sbdd_dir']
print params_dir

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/langb2014/article/details/53309618

智能推荐

让Openwrt 默认开启wifi_openwrt默认开启wifi教程-程序员宅基地

文章浏览阅读1.6w次。源码中位置看起来是在一个mac80211的包里面openwrt/trunk/package/mac80211/files/lib/wifi/mac80211.sh修改关闭wifi,修改热点名实践上更改上面的内容之后并没有让wifi开启,根本原因是不同的平台这个位置是不一定的(参考https://downloads.openwrt.org/kamikaze_openwrt默认开启wifi教程

ASP.NET Core 2.2 基础知识(七) 选项模式-程序员宅基地

文章浏览阅读102次。原文:ASP.NET Core 2.2 基础知识(七) 选项模式承接上一篇 配置,选项模式是专门用类来表示相关配置的服务.基本选项配置新建一个选项类,该类必须是包含无参数的构造函数的非抽象类. public class MyOptions { public MyOptions() { Id = 1;..._.net core 设计点击按钮显示两个选项

进程 线程 协程-程序员宅基地

文章浏览阅读157次。进程进程 :什么是进程?是操作系统的发展过程中,为了提高CPU的利用率,在操作系统同时运行多个程序的时候,为了数据的安全\代码不混乱而被创造出来的一个概念每一个程序运行起来都至少是一个进程.进程是计算机中最小的资源分配单位进程被操作系统调度的,有很多相关的算法 - 早期的操作系统进程之间是数据隔离的进程的三状态 就绪 运行 阻塞同步异步 ..._父进程负责创建子进程并且最后回收其资源;

python外环是什么意思_爬取上海地铁站并且规划出行路线-程序员宅基地

文章浏览阅读779次。源码源码:源码链接需求和目标爬取网站:上海地铁的百科词条获取的爬虫数据结果保存样式如下{'莘庄站':{'subway': ['上海地铁1号线', '上海地铁5号线'],'neibour': ['外环路站', '春申路站']},'莲花路站':{'subway': ['上海地铁1号线'],'neibour': ['外环路站', '锦江乐园站']}}爬取的数据保存中这种格式是为了方便后续处理根据爬取的数..._python 查找上海所有地铁站百度地图

足下校园C语言评估系统答案,江苏省江阴市南闸实验学校2020-2021学年八年级下学期第4周周练语文卷(word含答案))...-程序员宅基地

文章浏览阅读876次。ID:27210083资源大小:33KB资料简介:江阴市南闸实验学校初二语文周练习3一、语言积累与运用(24分)1、根据拼音写汉字(4分)①wó 旋 ②mó 然 ③rǒng杂 ④销声nì迹2、解释下列句中加点的词。(4分)①诎右臂之船 ②椎髻仰面③其两膝相比者 ..._足下评估系统c语言答案

Digital Image Processing 学习笔记1-程序员宅基地

文章浏览阅读174次。第一章1.1 数字图像一幅图像可以定义为一个而为函数, 其中x和y是空间坐标,而在任何一对空间坐标(x, y)处的幅值f称为图像在该点处的强度或灰度。当x, y和灰度值f是有限的离散数值时,该图像称为数字图像。1.2 数字图像处理的起源计算机断层(CT)是一种处理方法,图像处理在医学诊断领域最重要的应用之一。计算机方法用于增强对比度或将灰度编码为彩色,以解释工业、医学以及生物科..._是计算机生成图像的显著例子,它只不过是根据一些数学规则对一个基本模式的迭

随便推点

2019 面试实战 - 第二回合-程序员宅基地

文章浏览阅读411次。Create by jsliang on 2019-3-7 22:26:08Recently revised in 2019-3-10 18:28:53Hello 小伙伴们,如果觉得本文还不错,记得给 jsliang 的文档库点个 star , 你们的 star 是我学习折腾的动力!GitHub 地址并不是只有特定的季节才能跑路,只因为人跑得多了,这条路就定下来了。金三银四跑路季,js..._cata测评 开发岗位

某型机电综合管理计算机便携自动测试系统ETest的设计与实现_机电管理计算机-程序员宅基地

文章浏览阅读78次。设备组成Etest_CPS系统主要由硬件部分与软件部分组成。硬件部分由PCI机箱、PCI控制器以及各种PCI接口板卡组成。软件部分由测试设计软件模块、测试执行服务软件模块、测试执行客户端软件模块、设备资源管理软件模块等主要软件模块以及曲线数据生成、CRC插件生成与诊断、测试数据记录与查看、应用协议生成工具、应用协议模板管理、测试报告生成等系列工具组成。各模块主要功能(1)硬件部分Etest硬件部分采用标准的机柜形式,主机采用PCI工业控制计算机,各类接口板块采用PCI总线的接口板卡。主要硬件部分的指_机电管理计算机

培养你的品格-程序员宅基地

文章浏览阅读121次。A:选出你想具有的人格,然后进行自我暗示。想象自己已经具备了这些优秀的品质。然后对自己讲:我已经是这样一个人了。那么不久你会发现自己身上出了你所羡慕的美德。B:用自制力控制住自己,每天多次提醒自己,并抓住每个表现的机会,把它展现出来。C:找到一些人,发现他们的长处并赞美他们,但切记不要虚伪、奉承,而是真诚热情的,这将证你养成发现别人美德的习惯,从而你将获得自尊及来自他人的感激。“吸引法则”..._培养和谐的个性和自尊的品格 博客

easyUI conbobox 简单使用_easyui bobox-程序员宅基地

文章浏览阅读895次。1.关于conbobox取值以及赋值问题!使用的conbobox必须有class="easyui-combobox"的字样,否则为普通select!并非easyUi的控件。取值:var ex = $("#ex").combobox('getText');方法用于获取select中被选择的text字段。 var ex = $("#ex").combobox('getValue_easyui bobox

mysql修改索引长度设置_mysql设置合适的索引长度-程序员宅基地

文章浏览阅读1.1k次。标签:理想的索引:相对于写操作来说,表查询很频繁的表建立索引字段区分度高长度小(合适的长度,不是越小越好)尽量能够覆盖常用字段这些条件综合起来才能够达到最优索引,本次我们着重聊一下建立合适长度的索引,索引的长度直接影响索引文件的大小,因此会影响增删改查的速度给字符类型的字段设置长度字段查询时区分度要高,如果字段只是设置了一个那么回查询很多相似的匹配度不高,长度要恰到好处,否则太长索引文件就会大,因..._mysql修改字段长度二级索引

WPF 控件专题 TextBlock 控件详解_wpf textblock-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏22次。WPF 控件专题 TextBlock 控件详解_wpf textblock