RFCN识别Pascal VOC 2007

参考:


TensorFlow implementation of RFCN

效仿R-CNN,采用流行的物体检测策略,包括区域建议和区域分类两步。用Faster R-CNN中的区域建议网络(RPN)提取候选区域,该RPN为全卷积网络。效仿Faster R-CNN,同享RPN和R-FCN的特点。


论文可在https://arxiv.org/abs/1605.06409上找到。

Building

ROI汇集和MS COCO加载器需要首先编译。为此,请在项目的根目录中运行make。如果您需要特殊的链接器/编译器选项,则可能需要编辑BoxEngine/ROIPooling/Makefile

注意:如果您的系统上有多个python版本,并且您想使用与“python”不同的版本,请在调用make之前提供一个名为PYTHON的环境变量。例如:

# python3编译
vim /etc/profile
# 加入以下语句
export PYTHON=python3

source /etc/profile # 这句一定要执行
# 再运行
make

训练自己的数据

参考问题#7

要在此repo上训练您自己的数据集:

  • 训练阶段:
    [1]用你自己的脚本替换CocoDataset.py,读取图像,加载坐标和类标签/索引
    [2]在此更新类别的总数(Dataset/BoxLoader.py 48行位置修改)
    [3]更新[1]中的main.py,导入脚本

  • 推理阶段
    [1]在test.py中,更新类别定义(更改categories)

或者

  • 【1】你可以制作一个脚本,将你的数据重新格式化为coco format,它只是按照这种格式解析json文件中的值(4.1节)
  • 【2】在此更新类别的总数(Dataset/BoxLoader.py 48行位置修改)
  • 【3】不需要按[1]更新main.py

Pascal VOC 2007数据下载

共20个类别

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
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
# 执行以下命令将解压到一个名为VOCdevkit的目录中
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar

数据预览

1、VOC2007/Annotations

类别名与对象的矩形框位置

2、VOC2007/JPEGImages

这里写图片描述

3、VOC2007/SegmentationClass

这里写图片描述

4、VOC2007/SegmentationObject

这里写图片描述


train stage

将Pascal VOC转成COCO格式

注:按照SegmentationObject来提取Segmentation,并不是JPEGImages中的图片都有对应的Segmentation

ls SegmentationObject/|wc # 632
ls JPEGImages/|wc # 9963
# JPEGImages中大部分图片没有对应的掩膜,即无法做训练数据
# 需从JPEGImages选出可以做训练的图片 执行以下程序
# -*- coding:utf-8 -*-

import json
import shutil,os

json_file='new.json'
data=json.load(open(json_file))

# 图片名
img_name=[]
for img in data['images']:
    img_name.append(img['file_name'])

# mkdir train2014
for img in img_name:
    shutil.copy(os.path.join('./JPEGImages',img),'./train2014')

# print(len(img_name))
  • 将VOC2007目录下的JPEGImages 文件夹复制到./RFCN-tensorflow/data/Datasets/COCO 目录下,并重命名为train2014(或者 如果执行了上一步,将VOC2007目录下的train2014文件夹复制到./RFCN-tensorflow/data/Datasets/COCO 目录下 ) ,再将train2014 复制一份成val2014 (只是为了演示,其实两者是不同的)

  • 将生成的new.json (使用Pascal VOC转COCO数据得到的 )复制到./RFCN-tensorflow/data/Datasets/COCO/annotations 目录,并重命名为instances_train2014.json

  • 还需要一个instances_val2014.json 这里直接把instances_train2014.json 复制一份成instances_val2014.json 即可(实际上两者是不一样的)

最终 ./RFCN-tensorflow/data/Datasets/COCO 目录结构如下:

<COCO>
├─  annotations
│    ├─  instances_train2014.json
│    └─  instances_val2014.json
|
|─  train2014
|       |--*.jpg
└─  val2014
        |--*.jpg
  • 先手动下载模型文件
wget http://download.tensorflow.org/models/inception_resnet_v2_2016_08_30.tar.gz
# 将文件解压到./RFCN-tensorflow 目录下
tar zxf inception_resnet_v2_2016_08_30.tar.gz
  • 修改Dataset/BoxLoader.py 48行位置
def categoryCount(self):
   return 80 # 改成数据的实际类别数 Pascal VOC2017只有20个类别 所以这里修改成20(不算背景)

执行命名:

python3 main.py -dataset ./RFCN-tensorflow/data/Datasets/COCO -name save

test stage

  • 在test.py中,更新类别定义(更改categories 按照自己的数据中的categories 重新修改)

注:要按照类别ID顺序,依次排列,不可以随意

可以加上以下语句:

# -*- coding:utf-8 -*-

import json

json_file='new.json'
data=json.load(open(json_file))

# 按类别顺序取出
cats={}
for cat in data['categories']:
    cats[cat['id']]=cat['name']

sorted(cats)
categories=list(cats.values())
print(categories)
'''
['diningtable', 'person', 'bottle', 'boat', 'train', 'bird', 'dog', 'cat', 'tvmonitor', 'cow', 'car', 'sofa', 'horse', 'chair', 'pottedplant', 'bicycle', 'motorbike', 'aeroplane', 'sheep', 'bus']
'''

打开test.py 将categories 换成上面的即可。

  • 修改test.py82行
if not CheckpointLoader.loadCheckpoint(sess, None, opt.n, ignoreVarsInFileNotInSess=True):

# 改成
if not CheckpointLoader.loadCheckpoint(sess, opt.n, None,ignoreVarsInFileNotInSess=True):

# 即 None与opt.n对调一下 去Utils找到loadCheckpoint函数,会发现test.py中的调用参数顺序不对

执行命令

python3 test.py -n save/save/ -i <input image> -o <output image>

运行结果

这里写图片描述

这里写图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值