caffe安装_目标检测之caffe-ssd模型训练与测试

最近把一个ssd网络的net..prototxt网络结构和自己生成的hdf5格式数据一起做训练时发现经常报错,因为ssd中一些层在caffe中并没有实现,需要自己写相应的.cpp,.cu文件重新编译,比较麻烦,而大家通常训练caffe-ssd都是基于原作者公开的代码训练的,该代码中实现了这些层,于是把原作者代码跑了一遍.

我的机器是ubuntu16.04,装有两块GTX 1080TI 的显卡,一共20多个G显存,opencv是自己编译的3..3.0版本.

因为我机器主目录下已经有个装好的caffe了,所以再次在另一个目录下载该源码,该源码下载后编译也能import caffe,其他caffe项目也可以使用,如果没有装caffe,那就下载编译这个源码就能当做caffe使用,同时也能训练ssd.

1,先进入我这次操作的主目录(/home/user/yjf),下载源码

git clone https://github.com/weiliu89/caffe.gitcd caffegit checkout ssd(切换到ssd分支)

这时候我的工作目录为 /home/user/yjf/caffe.然后执行如下操作

cp Makefile.config.example Makefile.config

然后参考我前面博客说过的如何搭建caffe环境文章中的说法更改Makefile和Makefile.config文件,并参照里面提到的方法进行编译(我感觉caffe不管是cpu还是gpu编译起来其实很简单的,我一般30分钟就能弄好,没有大家想象中的有难度或者难装,我用的python2.7,opencv3.3.0,cudnn7.3, cuda8.0,我使用cuda9.0报错,看来cuda9.0不匹配)

2,下载预训练模型,这个模型在我们训练ssd的时候作为初始化模型,我放在百度云了,https://pan.baidu.com/s/11JcopVftsLELIUSYmt-8Bw,大家下载即可.下载后放在/home/user/yjf/caffe/models/VGGNet目录,如果没有VGGNet目录就新建一个.

3,下载VOC2007和VOC2012数据集,放到/caffe/data目录下,并解压(其实没多大,几个G而已)

cd data

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

tar -xvf VOCtrainval_11-May-2012.tar

tar -xvf VOCtrainval_06-Nov-2007.tar

tar -xvf VOCtest_06-Nov-2007.tar

4,把下载的数据转成训练需要的lmdb文件,在/home/user/yjf/caffe目录下执行

./data/VOC0712/create_list.sh当然,可以会报错的,打开这个文件,把第一行的root_dir换成root_dir=/home/user/yjf/caffe/data/VOCdevkit(你下载的VOCdevkit在哪里这个就换成那个目录就好,其他地方不改)

我改了原来代码中的3,5,41行,分别加了#yjf注释,我的放在这里,可以下载看下https://pan.baidu.com/s/1AETTYyjyKAnuKi27kE12Og

然后进行重新执行.执行结束后把data/VOC0712/create_data.sh里面的第七行root_dir换成root_dir=/home/user/yjf/caffe,注释掉cur_dir,data_root_dir="$root_dir/data/VOCdevkit")

然后执行./data/VOC0712/create_data.sh(执行前先在script/crerate_annoset.py中添加如下

import sys

sys.path.insert(0,'/home/user/yjf/caffe/python'))

5.然后在caffe目录下执行

python examples/ssd/ssd_pascal.py开始ssd训练,(训练过程可能报错SSD from caffe.proto import caffe_pb2 ImportError: No module named caffe.proto,解决:打开 caffe/scripts/create_annoset.py 文件,在from caffe.proto import caffe_pb2这段话之前加上

import sys

sys.path.insert(0,'/home/user/yjf/caffe/python')(这是刚刚安装的ssd-caffe的目录下的python目录)目标是让程序知道caffe在哪里.

另外,打开caffe/examples/ssd/ssd_pascal.py,看到gpus='0,1,2,3' 该成gpus='0',是指定训练使用的gpu,我用的0,然后python caffe/examples/ssd/ssd_pascal.py开始训练

(题外话:一般caffe需要net.prototxt和solver.prototxt,train.sh三个训练模型对吧,这次好像没看到,其实啊,caffe的这些net.prototxt网络结构文件是一般通过.py文件生成的,该代码中也是在训练的代码中先生成了这些东西,这些东西在/home/user/yjf/caffe/models/VGGNet/VOC0712/SSD_300x300目录下放着,train.prototxt和test.prototxt就是训练和测试的网络结构,同时人家还生成了deploy.prototxt文件,而solver.prototxt中存放了训练的超参数,snapshot: 8000指定训练8000个iters保存一次,我嫌弃时间太长,我想100次保存一个先看下结果,不过没到怎么改,然后我就等训练代码跑起来后在把程序停掉,这样就生成了这些文件,我直接在solver.prototx文件中改snapshot为100,然后写了一个train.sh文件,内容如下:

#!/usr/bin/env sh

set -e

# /home/user/caffe/build/tools/caffe train --solver=./solver.prototxt --gpu 1

/home/user/yjf/caffe/build/tools/caffe train --solver=./solver.prototxt --gpu 1

然后我在caffe/models/VGGNet/VOC0712/SSD_300x300目录直接执行sh ./tran.sh就开始训练了,训练的模型根据指定目录也在这个目录,大家可以不用这样,仅供参考

题外话结束####)

6,测试训练结果

在caffe目录执行

python examples/ssd/score_ssd_pascal.py,执行前先在该程序中的import caffe之前加上

import sys

caffe_root = '/home/user/yjf/caffe/'

sys.path.insert(0,caffe_root+'python')

目标是为了让程序找到caffe安装目录.​

Test net outpu的值一般为0.7左右吧,我这个值低是因为我刚刚开始训练,我跑了100个iters就把模型保存起来试了一下,使用效果肯定低,模型需要跑二十多万个iters这个值就上去了.

源码提供了在视频和摄像头上的测试,

在视频上测试

python examples/ssd/ssd_pascal_video.py

直接运行这段代码就可以在视频预测,默认视频路径为examples/videos下面有一个视频,效果如下

1c1310f2f1ef4f7b94c1d310dee50e4e
77dfd3617b834a09b9b7b0cd9de36652

57e78a99706e4ed4afaa919961073fce

​在摄像头上测试

python examples/ssd/ssd_pascal_webcam.py如果报错就按照第6点在代码中添加caffe的目录就好

7,预测

caffe目录执行python examples/ssd/ssd_detect.py --model_weights ../VGG_VOC0712_SSD_300x300_iter_120000.caffemodel(此处为你训练的模型地址) --image_files /home/user/yjf/caffe/examples/images/fish-bike.jpg即可在caffe目录生成一个detect_result.jpg图片为检测结果,预测之前在该代码开头部分参照第6点添加caffe目录,要不然报错

经过一个晚上的训练,用新模型预测一下,效果如下图所示:

551a9719c0d547ba87262a3262d29c00

​至此caffe-ssd测试结果,接下来将讲解使用直接的数据训练ssd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python之classmethod和staticmethod的区别

python中3种方式定义类方法,常规方式、classmethod修饰方式、staticmethod修饰方式。 class A(object):def foo(self, x):print(调用foo函数 (%s, %s)%(self, x))print(self:, self)classmethoddef class_foo(cls, x):print(调用class_foo函数 (%s, %s) % (cls, x))…

android 字符串反转,Golang之字符串操作(反转中英文字符串)

//字符串反转package mainimport "fmt"func reverse(str string) string {var result stringstrLen : len(str)for i : ; i < strLen; i {result result fmt.Sprintf("%c", str[strLen-i-])}return result}func reverse1(str string) string {var res…

Spring Integration Publisher

考虑一个假设的要求–您的应用程序中有一个服务类&#xff0c;并且想要捕获有关此服务调用的一些信息&#xff1a; Service public class SampleBean {private static final Logger logger LoggerFactory.getLogger(SampleBean.class);public Response call(Request request)…

POJ - 1125(Stockbroker Grapevine)

Stockbroker Grapevine 题目链接&#xff1a; http://poj.org/problem?id1125 题目&#xff1a; Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 39459 Accepted: 22024Description Stockbrokers are known to overreact to rumours. You have been contracted t…

php开发微信图灵机器人

本着开源为原则&#xff0c;为这个世界更美好作出一份共享&#xff0c;我就给大家做个指路人&#xff0c;如果实用&#xff0c;记得给提供开源的朋友一些鼓励。 简单介绍一下实现思路&#xff0c;使用swoole扩展接管php运行&#xff0c;由于swoole只能在类UNIX上运行&#xff0…

jQuery源码的基础知识

序言&#xff1a;DOM addEventListener attachEvent与addEventListener区别适应的浏览器版本不同&#xff0c;同时在使用的过程中要注意attachEvent方法 按钮onclickaddEventListener方法 按钮click一、arguments对象&#xff1a; 1、arguments 属性 为当前执行…

python如何读取数据并输出为表格_Python实现将数据库一键导出为Excel表格的实例...

数据库数据导出为excel表格&#xff0c;也可以说是一个很常用的功能了。毕竟不是任何人都懂数据库操作语句的。 下面先来看看完成的效果吧。 数据源导出结果依赖 由于是Python实现的&#xff0c;所以需要有Python环境的支持 Python2.7.11 我的Python环境是2.7.11。虽然你用的可…

android手机连接无线路由器上网设置,手机连接无线网络怎么设置?手机Wifi无线网设置教程...

随着智能手机无线上网的流行&#xff0c;如今很多家庭都会组建Wifi无线网络&#xff0c;目前组建Wifi网络&#xff0c;大致有两种情况&#xff0c;一种是使用无线路由器&#xff0c;另外一种是将笔记本变身无线无路由器&#xff0c;从而实现智能手机也可以免费Wifi上网&#xf…

Spring XD 1.0.0.M5在这里!

Spring XD宣布发布Spring XD 1.0.0.Milestone 5 。 您可以从这里下载。 根据发布的Spring XD 1.0.0.M5 &#xff0c;Spring XD是用于实时分析&#xff0c;批处理&#xff0c;数据注入和数据导出的统一&#xff0c;分布式和可扩展系统。 1.0.0.Milestone 5版本提供了解决大数据问…

通俗易懂了解Vuex

1.前言 在使用Vue进行开发的时候&#xff0c;关于vue组件通信的方式&#xff0c;除了通俗易懂了解Vue组件的通信方式这篇博文谈到三种通信方式&#xff0c;其实vue更提倡我们使用vuex来进行组件间的状态管理以及通信问题。Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。…

jQuery源码分析

(function( window, undefined ) {// jquery code})(window);这是一个自调用匿名函数。什么东东呢&#xff1f;在第一个括号内&#xff0c;创建一个匿名函数&#xff1b;第二个括号&#xff0c;立即执行为什么要创建这样一个“自调用匿名函数”呢&#xff1f; 通过定义一个匿名…

netcore 内存限制_.NET Core 和 Serverless 构建飞速发展的架构

(给DotNet加星标&#xff0c;提升.Net技能)英文&#xff1a;samueleresca.net译文&#xff1a;cnblogs.com/Rwing/p/fast-growing译者&#xff1a;Rwing本篇文章的第一部分介绍了有关Serverless计算的基本概念。第二部分展示了如何构建 .NET Core的Lambda函数&#xff0c;其中使…

更多Requests的小技巧以及总结

对于requests的爬虫库&#xff0c;我们已经学到了尾声。 我们在这儿可以挖掘出更多的requests的使用小技巧。 一.cookie对象与字典的转换 在爬取目标cookie的时候&#xff0c;我们可以将cookie信息进行简化处理。 现在做一个简单的代码验证看看&#xff0c;使用百度的cookies&a…

进入Undertow Web服务器

随着Java EE 7的到来以及处理诸如Web Sockets API和HTTP升级&#xff08;例如EJB over HTTP&#xff09;之类的高级功能的要求&#xff0c;WildFly开发团队已经做出了重要决定。 在长期致力于JBoss Web服务器&#xff08;Apache Tomcat的一个分支&#xff09;之后&#xff0c;新…

HTTPHandler有什么作用

一 asp.net请求的处理过程&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;Http…

centos 重启网卡_CentOS6 网络管理之网卡配置及简单路由设置

CentOS6中关于网络配置的命令有很多&#xff0c;本文将介绍几个平时最长用的几个命令&#xff0c;以及网卡IP地址的配置和简单路由配置。1、经常使用的查看IP地址命令为 ifconfig&#xff0c;不跟参数的情况下默认查看所有已启用的网卡信息&#xff0c;如下图所示&#xff1a;如…

绝地求生 android版支持蓝牙吗,《绝地求生》吃鸡必须要顶配吗?这些配置也能畅玩...

导读《绝地求生》火爆之余&#xff0c;很多人在想要加入这款游戏时&#xff0c;却被游戏传闻中的超高配置要求给吓到了&#xff0c;然后心生退意。事实上&#xff0c;吃鸡的配置要求真的这么高吗&#xff1f;其实并不是&#xff01;传言1&#xff1a;8G内存不能玩这则传言的说法…

《美团机器学习实践》高清PDF+思维导图+美团算法团队

在美团的搜索、推荐、计算广告、风控、图像处理等领域&#xff0c;相关的人工智能技术得到广泛的应用。《美团机器学习实践》包括通用流程、数据挖掘、搜索和推荐、计算广告、深度学习以及算法工程6大部分内容&#xff0c;全面介绍了美团在多个重要方面对机器学习的应用。通过本…

如何使用HttpModule来实现我们日常的应用:

1、向每个页面动态添加一些备注或说明性的文字&#xff1a; 有的网站每一个页面都会弹出一个广告或在每个页面都以注释形式&#xff08;<!-- -->&#xff09;加入网站的版权信息。如果在每个页面教编写这样的JS代码的话&#xff0c;对于大一点的网站&#xff…

Java 8中的java.util.Random

Java 8中java.util.Random类的简洁功能之一是对其进行了改进&#xff0c;现在可以返回随机的数字流 。 例如&#xff0c;要生成一个介于0&#xff08;含&#xff09;和1&#xff08;不含&#xff09;之间的随机双精度数的无限流&#xff1a; Random random new Random(); Do…