参考博客:https://blog.csdn.net/eereere/article/details/79118645#commentBox

目录

1.准备图片

2. 将 图片路径写入txt

参考 这篇文章

3.转换格式

还是参考这篇文章

4.训练模型

参考这篇

参考这篇

参考这篇

5.测试模型

看过这篇转换均值文件

看过这篇

—————————————————————————————正文——————————————————————————————————————

1.准备图片

在data下新建文件夹myself    ,在myself文件夹下新建两个文件夹  train和val。

train用来存放 训练的图片,在train文件夹下新建两个文件夹0和1 。图片有2类,包包(文件夹0)和裤子(文件夹1),每类55种。

Tips:大家从网上找的图片可能命名不规范,身为强迫症当然无法忍受了,一个一个修改太麻烦。

我分两步重命名图片:

第一,在每个图片名字前面加上类别名,这样就会规整很多 ;

rename 's/^/bag/' *

第二,把jpg的后缀改为jpeg,别问我为啥,小白看别人这么做,我也这么做了。

rename 's/.jpg $/.jpeg/' *

val 用来放训练过程中用来验证的图片(来计算准确率),val中的图片和train中的不一样。我这里放了15张包包和15张裤子。只将图片后缀重命名了一下。

2. 将 图片路径写入txt

在data/myself/中新建train.txt 和val.txt

需要将图片的路径以及标签都写进去,包包标签为0,裤子标签为1

①  写入路径

find -name *jpeg | grep train | cut -d / -f 3-4  > train.txt
    find -name *jpeg | grep val | cut -d / -f 3  > val.txt

② 在写入标签,val.txt 图片比较少,我是手动标记的。。。

sed -i "1,55s/.*/& 1/" train.txt    # 1~55是裤子,标签为1
    sed -i "55,110s/.*/& 0/" train.txt    # 55~110是包包,标签为0

3.  转换数据

在caffe/example目录下新建目录myself。并将caffe/examples/imagenet 目录下create_imagenet.sh文件拷贝到myself中。

注释里是需要改的地方

EXAMPLE=examples/myself     #这里修改为自己的路径
    DATA=data/myself           #  修改为自己的路径
    TOOLS=build/tools
     
    TRAIN_DATA_ROOT=/home/caffe/data/myself/train/     # 修改为自己的路径
    VAL_DATA_ROOT=/home/caffe/data/myself/val/         #修改为自己的路径
     
    # Set RESIZE=true to resize the images to 256x256. Leave as false if images have
    # already been resized using another tool.
    RESIZE=true              #这里一定要改成true!!!!!!  
    if $RESIZE; then
      RESIZE_HEIGHT=256
      RESIZE_WIDTH=256
    else
      RESIZE_HEIGHT=0
      RESIZE_WIDTH=0

echo "Creating train lmdb..."
     
    GLOG_logtostderr=1 $TOOLS/convert_imageset \
        --resize_height=$RESIZE_HEIGHT \
        --resize_width=$RESIZE_WIDTH \
        --shuffle \
        $TRAIN_DATA_ROOT \
        $DATA/train.txt \
        $EXAMPLE/myself_train_lmdb      #把这里改成自己命名的数据库
     
    echo "Creating val lmdb..."
     
    GLOG_logtostderr=1 $TOOLS/convert_imageset \
        --resize_height=$RESIZE_HEIGHT \
        --resize_width=$RESIZE_WIDTH \
        --shuffle \
        $VAL_DATA_ROOT \
        $DATA/val.txt \
        $EXAMPLE/myself_val_lmdb    #这里也改一下

返回caffe根目录 运行  sh ./examples/myself/create_imagenet.sh

接下来就会在examples/myself  下生成 两个文件夹 myself_train_lmdb和  myself_train_lmdb

4. 训练数据

把caffe/models/bvlc_reference_caffenet中所有文件复制到caffe/examples/myself文件夹中

①  修改train_val.prototxt

#data/myself文件夹下myimagenet_mean.binaryproto没有这个文件,把data/ilsvrc12下的imagenet_mean.binaryproto复制到该文件夹下,并重命名为myimagenet_mean.binaryproto

name: "CaffeNet"
    layer {
      name: "data"
      type: "Data"
      top: "data"
      top: "label"
      include {
        phase: TRAIN
      }
      transform_param {
        mirror: true
        crop_size: 227
        mean_file: "data/myself/myimagenet_mean.binaryproto"
      }
    # mean pixel / channel-wise mean instead of mean image
    #  transform_param {
    #    crop_size: 227
    #    mean_value: 104
    #    mean_value: 117
    #    mean_value: 123
    #    mirror: true
    #  }
      data_param {
        source: "examples/myself/myself_train_lmdb"
        batch_size: 256
        backend: LMDB
      }
    }
    layer {
      name: "data"
      type: "Data"
      top: "data"
      top: "label"
      include {
        phase: TEST
      }
      transform_param {
        mirror: false
        crop_size: 227
        mean_file: "data/myself/myimagenet_mean.binaryproto"
      }
    # mean pixel / channel-wise mean instead of mean image
    #  transform_param {
    #    crop_size: 227
    #    mean_value: 104
    #    mean_value: 117
    #    mean_value: 123
    #    mirror: false
    #  }
      data_param {
        source: "examples/myself/myself_val_lmdb"
        batch_size: 50
        backend: LMDB
      }
    }
    ------------------------------往后拉,在最后----------------------------------------------------
    layer {
      name: "fc8"
      type: "InnerProduct"
      bottom: "fc7"
      top: "fc8"
      param {
        lr_mult: 1
        decay_mult: 1
      }
      param {
        lr_mult: 2
        decay_mult: 0
      }
      inner_product_param {
        num_output: 2       #改这里,图片有几个分类,就写几
        weight_filler {
          type: "gaussian"
          std: 0.01
        }
        bias_filler {
          type: "constant"
          value: 0
        }
      }
    }

②修改solver.prototxt

test_iter: 1000是指测试的批次,我们就10张照片,设置10就可以了。 test_interval: 1000是指每1000次迭代测试一次,我改成了10。 base_lr: 0.01是基础学习率,因为数据量小,0.01就会下降太快了,因此改成0.001 lr_policy: “step”学习率变化 gamma: 0.1学习率变化的比率 stepsize: 100000每100000次迭代减少学习率 display: 20每20层显示一次 max_iter: 4000最大迭代次数, momentum: 0.9学习的参数,不用变 weight_decay: 0.0005学习的参数,不用变 snapshot: 10000每迭代10000次显示状态,这里改为1000次 solver_mode: GPU末尾加一行,代表用GPU进行

③     图像均值

减去图像均值会获得更好的效果,所以我们使用tools/compute_image_mean.cpp实现,这个cpp是一个很好的例子去熟悉如何操作多个组建,例如协议的缓冲区,leveldbs,登录等。我们同样复制caffe-maester/examples/imagenet的./make_imagenet_mean到examples/myself中,将其改名为make_myimagenet_mean.sh,加以修改路径。

#!/usr/bin/env sh
    # Compute the mean image from the imagenet training lmdb
    # N.B. this is available in data/ilsvrc12
     
    EXAMPLE=/home/caffe/examples/myself
    DATA=/home/caffe/data/myself
    TOOLS=/home/caffe/build/tools
     
    $TOOLS/compute_image_mean $EXAMPLE/myself_train_lmdb \
      $DATA/myimagenet_mean.binaryproto
     
    echo "Done."

④  运行

拷贝examples/imagenet目录下的train_caffenet.sh文件到example/myself目录下。

#!/usr/bin/env sh
     
    ./build/tools/caffe train \
        --solver=examples/myself/solver.prototxt

在caffe的主目录下输入命令:./ examples/myself/train_caffenet.sh开始训练网络。

我电脑快,训练了十分钟左右就好啦(默默炫耀一下。。。)出现  【Restarting data prefetching from start.】的提示不要慌,因为图片太少,又从第一幅图片开始训练了。哈哈,我的精确率0.996 还是挺高的。

5 .   测试数据

① 找一个你要测试的图片,我找了一个想买但买不起的包包的图片。。

。。

②修改deploy.prototxt  并编写一个labels.txt

deploy.prototxt 修改一个地方

layer {
      name: "fc8"
      type: "InnerProduct"
      bottom: "fc7"
      top: "fc8"
      inner_product_param {
        num_output: 2      #改成2
      }
    }

labels.txt的内容如下:

bag
    pants

②  打开data/myself 将myimagenet_mean.binaryproto 转换成 mymean.npy

打开jupyter写个python

import caffe
    import numpy as np
     
    proto_path='myimagenet_mean.binaryproto'
    npy_path='mymean.npy'
     
    blob=caffe.proto.caffe_pb2.BlobProto()
    data=open(proto_path,'rb').read()
    blob.ParseFromString(data)
     
    array=np.array(caffe.io.blobproto_to_array(blob))
    mean_npy=array[0]
    np.save(npy_path,mean_npy)

把生成的mymean.npy复制到examples/myself下

③用Python写代码对 包包图片 分类

import caffe
    import sys
    import numpy as np
     
    caffe_root='/home/caffe/'
    sys.path.insert(0,caffe_root+'python')
     
    caffe.set_mode_cpu()
     
    deploy=caffe_root+'examples/myself/deploy.prototxt'
    caffe_model=caffe_root+'examples/myself/mycaffenet_train_iter_1000.caffemodel'
    img=caffe_root+'examples/myself/pinko.jpeg'
    labels_name=caffe_root+'examples/myself/labels.txt'
    mean_file=caffe_root+'examples/myself/mymean.npy'
     
    net=caffe.Net(deploy,caffe_model,caffe.TEST)
     
    transformer=caffe.io.Transformer({'data':net.blobs['data'].data.shape})
    transformer.set_transpose('data',(2,0,1))
    transformer.set_mean('data',np.load(mean_file).mean(1).mean(1))
    transformer.set_raw_scale('data',255)
    transformer.set_channel_swap('data',(2,1,0))
     
    image=caffe.io.load_image(img)
    net.blobs['data'].data[...]=transformer.preprocess('data',image)
     
    out=net.forward()
    labels=np.loadtxt(labels_name,str,delimiter='\t')
     
    prob=net.blobs['prob'].data[0].flatten()
    top_k=net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]
    for i in np.arange(top_k.size):
        print top_k[i],labels[top_k[i]],prob[top_k[i]]

Ubuntu下caffe:用自己的图片训练并测试AlexNet模型的更多相关文章

  1. Ubuntu16.04下caffe CPU版的图片训练和测试

    一 数据准备 二.转换为lmdb格式 1.首先,在examples下面创建一个myfile的文件夹,来用存放配置文件和脚本文件.然后编写一个脚本create_filelist.sh,用来生成train ...

  2. Caffe学习系列(12):训练和测试自己的图片--linux平台

    Caffe学习系列(12):训练和测试自己的图片   学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测 ...

  3. ubuntu下Chrome谷歌浏览器部分网站图片显示不正常的解决方法

    title: ubuntu下Chrome谷歌浏览器部分网站图片显示不正常的解决方法 toc: false date: 2018-09-02 14:37:26 categories: methods t ...

  4. Ubuntu下Caffe实现物体分类

    参考链接: ubuntu下配置Caffe:https://blog.csdn.net/a_z666666/article/details/72853346 https://www.cnblogs.co ...

  5. Caffe学习系列(12):训练和测试自己的图片

    学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...

  6. 转 Caffe学习系列(12):训练和测试自己的图片

    学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...

  7. Ubuntu下录制和制作Gif图片--实战版

    1.背景 ubuntu下,写文章的时候,经常用到Gif图片,这个自己怎么制作呢? 网上查了一下资料,大致的流程就是:安装 录屏软件(kazam) 和 视频 转 Jpeg 的工具(mplayer) ,使 ...

  8. Ubuntu下预览raw格式图片

    默认Ubuntu下资源管理器是不可以直接预览raw格式图片的,这就给查看图片带来很大的不便,下面我们就选择安装UFRaw来预览Raw格式图片 1. 首先在terminal安装UFRaw sudo ap ...

  9. CAFFE(三):Ubuntu下Caffe框架安装(仅仅Caffe框架安装)

    步骤一. 从github上下载(克隆)安装包 1.1 在你要安装的路径下 clone 此处我直接安装到home目录,执行: ~$ cd ~ 2 :~$ git clone https://github ...

随机推荐

  1. Java中数组的创建

    Java中数组的使用 1.普通数组变量的定义: //数组 //1.数组是Java中很重要的一部分,今天对数组进行了大致的了解,Java中的数组和C中数组还是有一定的区别的 //以下是总结的几种方法 p ...

  2. windows搭建安装react-native环境

    在win10环境下,利用Genymotion模拟器,配置react-native的环境. 一.安装JDK 在网上下载jdk,版本最好是1.8以上.安装后要对环境变量进行配置. 同时在 Path 中配置 ...

  3. Java 文件

    章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...

  4. 08 SSM整合案例(企业权限管理系统):06.产品操作

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.用户操作 09.权限控制 10.权限关联与控制 11.AOP日志 06.产品操作 SSM 环境搭 ...

  5. Golang的变量定义及使用案例

    Golang的变量定义及使用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.变量的定义 package main import "fmt" func m ...

  6. 小程序之scroll-view用法 - 水平滚动

    <scroll-view class="box" scroll-x="true" > <view class="box-item&q ...

  7. duilib 之 List控件

    List控件是我们常用到的控件,也是应用很广泛. 对LIST控件添加元素有两种方法,一种是直接在XML中写死元素,另一种是动态创建.另外,LIST的应用也分为两种,一种需要表头,另一种是不需要表头.对 ...

  8. LocalDateTime整合到SpringBoot + MyBatis中

    啥也不说先贴两个代码: 一:MVC层配置 @Configuration public class JacksonConfig { /** 默认日期时间格式 */ public static final ...

  9. 第二阶段scrum-10

    1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 等待发布

  10. Apache服务器多站点配置

    Apache多站点设置,主要是关于httpd.conf配置文件的设置. 在httpd.conf配置文件中最后面的<VirtualHost>标签 #<VirtualHost *:80& ...