『计算机视觉』SSD源码学习_基于TensorFlow(待续)

原项目地址:SSD-Tensorflow

根据README的介绍,该项目收到了tf-slim项目中包含了多种经典网络结构(分类用)的启发,使用了模块化的编程思想,可以替换检查网络的结构,其模块组织如下:

  • datasets:              数据及接口,interface to popular datasets (Pascal VOC, COCO, ...) and scripts to convert the former to TF-Records;
  • networks:             网络结构定义,definition of SSD networks, and common encoding and decoding methods (we refer to the paper on this precise topic);
  • pre-processing:    预处理和数据增强,pre-processing and data augmentation routines, inspired by original VGG and Inception implementations.

项目给提供了两个已训练的VGG网络,输入分别为300和512。

除此之外,还有一个迷你的SSD展示ipynb脚本,可以快读演示预测ssd_notebook

脚本tf_convert_data.py

将数据转换为一组TF-Record文件,调用示意如下:

DATASET_DIR=./VOC2007/test/
OUTPUT_DIR=./tfrecords
python tf_convert_data.py     --dataset_name=pascalvoc     --dataset_dir=${DATASET_DIR}     --output_name=voc_2007_train     --output_dir=${OUTPUT_DIR}

脚本caffe_to_tensorflow.py

可以讲caffe的模型转换为checkpoints,供程序使用:

CAFFE_MODEL=./ckpts/SSD_300x300_ft_VOC0712/VGG_VOC0712_SSD_300x300_ft_iter_120000.caffemodel
python caffe_to_tensorflow.py     --model_name=ssd_300_vgg     --num_classes=21     --caffemodel_path=${CAFFE_MODEL}

脚本train_ssd_network.py

用于训练模型,

  • 可以自定义训练的明细(dataset, optimiser, hyper-parameters, model, ...)
  • 可以载入ckeckpoints后fine-tune

使用VGG-300模型进行微调的示意如下,

DATASET_DIR=./tfrecords
TRAIN_DIR=./logs/
CHECKPOINT_PATH=./checkpoints/ssd_300_vgg.ckpt
python train_ssd_network.py     --train_dir=${TRAIN_DIR}     --dataset_dir=${DATASET_DIR}     --dataset_name=pascalvoc_2012     --dataset_split_name=train     --model_name=ssd_300_vgg     --checkpoint_path=${CHECKPOINT_PATH}     --save_summaries_secs=60     --save_interval_secs=600     --weight_decay=0.0005     --optimizer=adam     --learning_rate=0.001     --batch_size=32

脚本eval_ssd_network.py

使用checkpoint文件来检验训练效果,调用示意如下:

EVAL_DIR=./logs/
CHECKPOINT_PATH=./checkpoints/VGG_VOC0712_SSD_300x300_ft_iter_120000.ckpt
python eval_ssd_network.py     --eval_dir=${EVAL_DIR}     --dataset_dir=${DATASET_DIR}     --dataset_name=pascalvoc_2007     --dataset_split_name=test     --model_name=ssd_300_vgg     --checkpoint_path=${CHECKPOINT_PATH}     --batch_size=1

这个脚本可以在训练脚本运行的同时运行,动态的监测当前训练效果,此时命令如下:

EVAL_DIR=${TRAIN_DIR}/eval
python eval_ssd_network.py     --eval_dir=${EVAL_DIR}     --dataset_dir=${DATASET_DIR}     --dataset_name=pascalvoc_2007     --dataset_split_name=test     --model_name=ssd_300_vgg     --checkpoint_path=${TRAIN_DIR}     --wait_for_checkpoints=True     --batch_size=1     --max_num_batches=500

而且文档描述的很不简单,eval脚本可以监测到GPU空闲,

one can pass to training and validation scripts a GPU memory upper limit such that both can run in parallel on the same device. If some GPU memory is available for the evaluation script, the former can be run in parallel as follows:

脚本ssd_vgg_preprocessing.pyssd_vgg_300/512.py

one may also want to experiment with data augmentation parameters (random cropping, resolution, ...) in ssd_vgg_preprocessing.py or/and network parameters (feature layers, anchors boxes, ...) in ssd_vgg_300/512.py

原文地址:https://www.cnblogs.com/hellcat/p/9248489.html

时间: 2024-08-30 06:47:33

『计算机视觉』SSD源码学习_基于TensorFlow(待续)的相关文章

redis源码学习_简单动态字符串

SDS相比传统C语言的字符串有以下好处: (1)空间预分配和惰性释放,这就可以减少内存重新分配的次数 (2)O(1)的时间复杂度获取字符串的长度 (3)二进制安全 主要总结一下sds.c和sds.h中的关键函数 1.sdsmapchars 1 /* Modify the string substituting all the occurrences of the set of 2 * characters specified in the 'from' string to the corresp

redis源码学习_整数集合

redis里面的整数集合保存的都是整数,有int_16.int_32和int_64这3种类型,和C++中的set容器差不多. 同时具备如下特点: 1.set里面的数不重复,均为唯一. 2.set里面的数是从小到大有序的,这在后面的intsetAdd函数中可以看到. 然后由于我们可以同时存储int_16.int_32和int_64这3种类型,一开始只能为一种类型.假设为int_32,那么我们要插入一个int_16类型的数,只需要找到位置直接插入就可以了:但是我们要插入一个int_64类型的数,我们

redis源码学习_链表

redis的链表是双向链表,该链表不带头结点,具体如下: 主要总结一下adlist.c和adlist.h里面的关键结构体和函数. 链表节点结构如下: 1 /* 2 * 双端链表节点 3 */ 4 typedef struct listNode { 5 6 // 前置节点 7 struct listNode *prev; //如果是list的头结点,则prev指向NULL 8 9 // 后置节点 10 struct listNode *next;//如果是list尾部结点,则next指向NULL

redis源码学习_字典

redis中字典有以下要点: (1)它就是一个键值对,对于hash冲突的处理采用了头插法的链式存储来解决. (2)对rehash,扩展就是取第一个大于等于used * 2的2 ^ n的数作为新的hash表大小:缩紧就是取第一个大于等于used的2 ^ n的数作为新的hash表大小.后面会介绍到dict结构体中是有dictht ht[2]这个成员变量的,为什么是2个呢?就是为了做rehash时交替使用的.那么何时扩展,何时缩紧呢?有个负载因子的概念(负载因子 = used / size,注意这里面

nginx源码学习_数据结构(ngx_int_t)

nginx中关于整型的数据结构位于src/core/ngx_config.h中 结构比较简单,就是一个typedef的操作,具体如下: 1 typedef intptr_t ngx_int_t; 2 typedef uintptr_t ngx_uint_t; 3 typedef intptr_t ngx_flag_t; 里面的intptr_t和uintptr_t的定义位于/usr/include/stdint.h中 1 /* Types for `void *' pointers. */ 2 #

『计算机视觉』Mask-RCNN_关键点检测分支(待续)

Github地址:Mask_RCNN 『计算机视觉』Mask-RCNN_论文学习 『计算机视觉』Mask-RCNN_项目文档翻译 『计算机视觉』Mask-RCNN_推断网络其一:总览 『计算机视觉』Mask-RCNN_推断网络其二:基于ReNet101的FPN共享网络 『计算机视觉』Mask-RCNN_推断网络其三:RPN锚框处理和Proposal生成 『计算机视觉』Mask-RCNN_推断网络其四:FPN和ROIAlign的耦合 『计算机视觉』Mask-RCNN_推断网络其五:目标检测结果精炼

spring源码学习(1)——spring整体架构和设计理念

Spring是在Rod Johnson的<Expert One-On-One J2EE Development and Design >的基础上衍生而来的.主要目的是通过使用基本的javabean来完成以前只能用EJB完成的事情降低企业应用的复杂性.这一系列源码学习是基于Spring-4.3.11版本的. 一.Spring的整体架构 如图所示,spring可以被总结为一下几个部分: (1)Core Container 为Spring的核心容器,包含Beans,Core,Context和SpEL

lodash源码学习(10)

_.delay(func, wait, [args]) 延迟wait毫秒之后调用该函数,添加的参数为函数调用时的参数 //delay.js var baseDelay = require('./_baseDelay'),//baseDelay方法 baseRest = require('./_baseRest'),//创建使用rest参数方法 toNumber = require('./toNumber');//转化为数字 /** * * @param {Function} func 需要延迟执

lodash源码学习(2)

继续学习lodash,依然是数组的方法 “Array” Methods _.indexOf(array, value, [fromIndex=0]) 获取value在数组 array所在的索引值 使用 SameValueZero方式比较(第一个全等===的元素). 如果 fromIndex 值是负数, 则从array末尾起算 该方法依赖于strictIndexOf和baseIndexOf方法,先看它们的源码 //_strictIndexOf.js /** * _.indexOf的专业版本,对元素