caffe-SSD源码解析——生成数据列表及数据集
与数据生成有关的.sh有以下两个:
caffe/data/VOC0712/create_list.sh
caffe/data/VOC0712/create_data.sh
按照github上作者的提示,顺序执行即可。
下面来详细研究一下源码,因为笔者没学过shell语言,python也是刚入门,顶多就会个C++.
#!/bin/bashroot_dir=$HOME/data/VOCdevkit/
sub_dir=ImageSets/Main
# get current executed file's path $CAFFE_ROOT/data/VOC0712
bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"# dataset is trainval or test
for dataset in trainval test
dodst_file=$bash_dir/$dataset.txtif [ -f $dst_file ]thenrm -f $dst_filefifor name in VOC2007 VOC2012do# continue means skep the rest of current loopif [[ $dataset == "test" && $name == "VOC2012" ]]thencontinuefiecho "Create list for $name $dataset..."# find each of the xxx.txt filedataset_file=$root_dir/$name/$sub_dir/$dataset.txtimg_file=$bash_dir/$dataset"_img.txt"# copy the file contents to $img_filecp $dataset_file $img_file# add /$name\/JPEGImages\ at the begining of each linesed -i "s/^/$name\/JPEGImages\//g" $img_file# add .jpg at the end of each linesed -i "s/$/.jpg/g" $img_file# create label filelabel_file=$bash_dir/$dataset"_label.txt"cp $dataset_file $label_file# add /$name\/Annotations\ at the begining of each linesed -i "s/^/$name\/Annotations\//g" $label_file# add .xml at the end of each linesed -i "s/$/.xml/g" $label_file# concate each line of the two files with a ' ' separatedpaste -d' ' $img_file $label_file >> $dst_filerm -f $label_filerm -f $img_filedone# Generate image name and size infomation.if [ $dataset == "test" ]then # [root folder list file output file]$bash_dir/../../build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"fi# Shuffle trainval file.if [ $dataset == "trainval" ]thenrand_file=$dst_file.randomcat $dst_file | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' > $rand_filemv $rand_file $dst_filefi
done
create_list.sh最终生成 text.txt、trainval.txt和test_name_size.txt。脚本首先获得数据所在的根目录root_dir,子目录sub_dir和当前脚本目录bash_dir。。然后分别在 VOC2007和VOC2012两个数据集文件里寻找数据集提供的trainval 和test的txt文件,这里面存放了所有图片的名称(不包含后缀.jpg)。假如已经有之前生成过的文件,则rm删除。
if [[ $dataset == "test" && $name == "VOC2012" ]]
thencontinue
fi
这句话是因为VOC2012里面没有test.txt。
dataset_file=$root_dir/$name/$sub_dir/$dataset.txt
这句话是定位到数据集中的.txt列表文本,然后以该dataset_file为母版,分别创建图片列表和Annotations 列表,
# add /$name\/JPEGImages\ at the begining of each line
sed -i "s/^/$name\/JPEGImages\//g" $img_file
# add .jpg at the end of each line
sed -i "s/$/.jpg/g" $img_file
img_file是在每一行前面添加VOC2007或VOC2012/JPEGImages/,以表明路径,在每一行的末尾添加.jpg后缀。label_file与前者类似,只不过后缀变为.xml。然后将$img_file、$label_file合并,每一行中间插入一个空格:paste -d' ' $img_file $label_file >> $dst_file,注意$是表示该变量的内容。这里最终生成: caffe/data/VOC0712/test.txt和 caffe/data/VOC0712/trainval.txt
当是test数据集时,还要调用get_image_size.cpp去获取所有图片的尺寸。
$bash_dir/../../build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"
参数分别是:[root folder list file output file],最终生成: caffe/data/VOC0712/test_name_size.txt
对于trainval.txt还需要进行随机排列shuffle。以上是create_list.sh的解释。
create_data比较简洁:
#!/bin/bash
cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
#root_dir=/home/nvidia/PycharmProjects/caffe_ssd/caffe
root_dir=$cur_dir/../../cd $root_dir
redo=1
data_root_dir="$HOME/data/VOCdevkit"
dataset_name="VOC0712"
mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt"
anno_type="detection"
db="lmdb"
min_dim=0
max_dim=0
width=0
height=0extra_cmd="--encode-type=jpg --encoded"
if [ $redo ]
thenextra_cmd="$extra_cmd --redo"
fi
for subset in test trainval
dopython $root_dir/scripts/create_annoset.py --anno-type=$anno_type --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width --resize-height=$height --check-label $extra_cmd $data_root_dir $root_dir/data/$dataset_name/$subset.txt $data_root_dir/$dataset_name/$db/$dataset_name"_"$subset"_"$db examples/$dataset_name
done
先获取当前文件目录,然后找到caffe-ssd的根目录,设置好数据存放的目录以及lmdb的目录等,找到VOC的类别描述文件:labelmap_voc.prototxt,调用 $root_dir/scripts/create_annoset.py生成数据。后面参数比较多,其中使用到的数据列表文件是刚才生成的$root_dir/data/$dataset_name/$subset.txt (for subset in test trainval,data_root_dir="$HOME/data/VOCdevkit" dataset_name="VOC0712")。
这个参数是生成的文件(db="lmdb",):
$data_root_dir/$dataset_name/$db/$dataset_name"_"$subset"_"$db
以及在这里 examples/$dataset_name 生成link(没有声明具体路径,那就是在执行.sh的那个文件夹下):
The directory to store the link of the database files.
caffe-SSD源码解析——生成数据列表及数据集相关推荐
- 2.2 SSD源码解析
前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容.来源于哔哩哔哩博主"霹雳吧啦Wz",博主学习作为笔记记录,欢 ...
- AlphaFold2源码解析(3)--数据预处理
AlphaFold2源码解析(3)–数据预处理 数据预处理整体流程 数据处理入口: feature_dict = data_pipeline.process( input_fasta_path=fas ...
- Attention is all you need pytorch实现 源码解析01 - 数据预处理、词表的构建
我们今天开始分析著名的attention is all you need 论文的pytorch实现的源码解析. 由于项目很大,所以我们会分开几讲来进行讲解. 先上源码:https://github.c ...
- weiler-atherton多边形裁剪算法_EAST算法超详细源码解析:数据预处理与标签生成...
作者简介 CW,广东深圳人,毕业于中山大学(SYSU)数据科学与计算机学院,毕业后就业于腾讯计算机系统有限公司技术工程与事业群(TEG)从事Devops工作,期间在AI LAB实习过,实操过道路交通元 ...
- EAST算法超详细源码解析:数据预处理与标签生成
作者简介 CW,广东深圳人,毕业于中山大学(SYSU)数据科学与计算机学院,毕业后就业于腾讯计算机系统有限公司技术工程与事业群(TEG)从事Devops工作,期间在AI LAB实习过,实操过道路交通元 ...
- 大数据之-Hadoop3.x_MapReduce_ReduceTask源码解析---大数据之hadoop3.x工作笔记0127
然后我们接着去reducetask的源码: 可以看到上面,maptask执行以后,数据被分区,然后溢写到磁盘文件中,然后 就到了执行reducetask的时候,首先走到reducetask的上面这个位 ...
- 大数据之-Hadoop3.x_MapReduce_MapTask源码解析---大数据之hadoop3.x工作笔记0126
然后我们来看一下maptask的源码,这个对理解maptask如何工作很重要 我们在一个例子的基础上去debug,去看,可以看到,我们用 partitioner2这个案例,这个是我们之前,用来区分,把 ...
- 源码解析-深刻理解Hash HashTable HashMap原理及数据hash碰撞问题
HashMap 前言 Hash HashTable 开地址法 线性探测法 平方探测法 双重散列探测法 拉链法 哈希表优势 HashMap 变量介绍 初始容量和负载因子 红黑树和链表转化 HashMap ...
- RN FlatList使用详解及源码解析
FlatList使用详解及源码解析 前言 长列表或者无限下拉列表是最常见的应用场景之一.RN 提供的 ListView 组件,在长列表这种数据量大的场景下,性能堪忧.而在最新的 0.43 版本中,提供 ...
最新文章
- sqlsever无法重新启动计算机,安装SQL server 提示重新启动计算机失败怎么处理
- java 必须存在默认构造器_Java默认构造方法在字节码的实现
- Deep GSP : 面向多目标优化的工业界广告智能拍卖机制
- 理论基础 —— 查找 —— 插值查找
- java etcd api_在java中如何使用etcd的v2 和v3 api获取配置,并且对配置的变化进行监控和监听...
- 在linux中安装snort框架
- ubuntu和win7共享文件
- 上海交通大学考研网络安全专业823复习策略
- 2022.5.2 HTML学习第二天
- 短视频矩阵/短视频SEO矩阵系统源码/系统搭建
- java list逆序_Java使用ListIterator逆序ArrayList
- 与时间赛跑!阿里云医疗 AI | 心血管识别技术
- 图匹配(Graph Matching)入门学习笔记——以《Factorized Graph Matching》为例(二)
- linux xz命令
- bp配置 sap_SAP HANA BP主数据增强-对标准字段客户化检查
- 换个姿势「模拟登录」
- 1. R语言中grep函数和gsub()函数的使用
- 智汀智能家居,带给你梦幻般的生活
- ionic android 禁止截屏设置
- python selenium 显式等待和隐式等待
热门文章
- 数字化方法基础(二)_点的投影
- matlab保存数据用什么指令_Matlab数据处理——数据的保存和读取方法操作
- 修改MySQL用户的host属性_如何快速修改MySQL用户的host属性
- svn迁移到git_SVN到GIT的迁移完整教程
- Node JS环境设置– Node.js安装
- Apache ActiveMQ
- python集合_Python集合
- 熊猫DataFrame apply()示例
- log4j.dtd_Eclipse log4j.xml –无法将log4j.dtd验证为XML定义
- jsf用于页面判断的标签_JSF –在JSF视图页面中添加标签,图像,按钮和文本字段