/easy-pva

easy way to train and detect

Primary LanguageJupyter Notebook

easy-pvanet

描述

基于Pvanet目标检测代码进行修改,使得PVANET能够一键训练和一键测试。

编译

需要对caffe-fast-rcnnlib进行编译。

基本功能点

1. 模型训练

命令

cd easy-pvanet
./tools/train_demo.sh

参数修改

  • 修改训练数据集的软链接ln -s "/home/cvrsg/VOCdataset/Hand/hand_dataset" "$vocPath",将/home/cvrsg/VOCdataset/Hand/hand_dataset设置为自己的数据集;

  • 训练数据集中需要包含的文件结构

    hand_dataset
    |
    |____ VOC2007
    |     |
    |     |____ Annotations
    |     |
    |     |____ ImageSets
    |     |     |
    |     |     |____ Main
    |     |
    |     |____ JPEGImages
    |
    |____ classes_name.txt

预训练模型下载

  • 下载地址:萃舟服务器中model-zoo/easy-pvanet/model/train/original_train.model
  • 将预训练模型放置在easy-pvanet/model/train文件夹下,并命名为original_train.model

2. 目标检测测试

命令

cd easy-pvanet
./tools/detect_demo.sh

测试模式

  • 单张图片
  • 一段视频
  • 文件夹(包含多张图片)

参数解析

  • ./tools/detect_demo.sh文件进行分析,可知目标检测测试模式,由命令行参数pic_mode决定。--pic_mode image表示测试单张图片;--pic_mode video表示测试一段视频;--pic_mode dir表示某个文件夹下的所有图片进行目标检测。--test_path表示图片、视频或者文件夹路径。
  • --gpu 0表示采用编号为0的GPU进行目标检测;--cpu表示屏蔽GPU,采用CPU进行目标检测;
  • --net (1) -- model (2) --cfg (3) --classes (4) 表示对目标检测网络结构、模型权值、配置参数以及目标类别(不包含背景)的设置。

目标检测(VOC2007压缩)模型下载地址

  • 下载地址:萃舟服务器中model-zoo/easy-pvanet/model/voc2007_comp/test.model

3. 模型压缩

命令

cd easy-pvanet
./tools/compress_model.sh

命令解析

./tools/compress_model.sh文件进行分析,其命令为

python ./tools/compress_model.py --net model/voc2007/test.pt --weights model/voc2007/test.model --cfg model/voc2007/test.yml --classes model/voc2007/classes_name.txt 
  • --net设置原始网络的网络结构;
  • --weights设置原始网络的模型权值;
  • --cfg设置原始网络的配置参数;
  • -classes设置原始网络的目标类别(不包含背景);
  • 压缩后的模型输出在文件夹easy-pvanet/model/comp_model下。

4. 目标检测(客户端-服务器)测试

命令

cd easy-pvanet
./tools/demo_server_client.sh

命令解析

# 启动demo的服务器端
gnome-terminal -t "demo_server" -x bash -c "python ./tools/demo_server.py; exec bash;"

启动目标检测的服务器端

sleep 1 #睡眠1s,以便客户端能够反应过来

睡眠1s

# 启动demo的客户端
gnome-terminal -t "demo_client" -x bash -c "python ./tools/demo_client.py; exec bash;"

启动目标检测的客户端

目标检测模型

./tools/demo_server.py中使用的目标检测模型为VOC2007压缩模型,模型路径直接在./tools/demo_server.py设置。

5. 目标精度计算

命令

cd easy-pvanet
./tools/test_demo.sh

命令解析

#!/bin/bash
# add root_dir into PYTHONPATH
# 返回脚本文件放置的目录
SHELL_FOLDER=$(dirname $(readlink -f "$0"))
# 将根目录添加之PYTHONPATH中
ROOT_PTAH=$SHELL_FOLDER/../
export PYTHONPATH=$PYTHONPATH:$ROOT_PATH

cd './data'
#
vocPath="VOCdevkit2007"
if [ -d "$vocPath" ]; then
# do nothing
echo "Had softlink"
else
echo "Create SymbolicLink VOCdevkit2007"
# should change the directory as yours
ln -s  "/home/cvrsg/VOCdataset/VOCdevkit" "$vocPath"
fi

# whether renew trainval/test
if [ -d "$vocPath/VOC2007/ImageSets/Main/test.txt" ]; then
# do nothing
echo "Had test.txt"
else
# make the label(general, test in a new dataset, so set trainval to 0, test 1)
python makeMain.py --trainval 0.0 #--train 0.9
fi
# if results is not existed, make the directory
if [ -d "$vocPath/results/VOC2007/Main" ]; then
# do nothing
echo "Had folder 'results/VOC2007/Main'"
else
mkdir -p "$vocPath/results/VOC2007/Main"
fi

cd '..'
# test
python ./tools/test_demo.py --cpu --def model/voc2007_comp/test.pt --weights model/voc2007_comp/test.model --cfg model/voc2007_comp/test.yml --imdb voc_2007_test --classes data/VOCdevkit2007/classes_name.txt 2>&1 | tee log/log.txt
  1. 如果VOCdevkit2007文件夹不存在,建立软链接

  2. 如果未对数据集进行trainval/test的分配,重新分配数据集训练集和测试集的占比;如果是验证模型在新数据集上的精度,通常将--trainval设置为0即可。

  3. 如果不存在文件夹VOCdevkit2007/results/VOC2007/Main,则重新创建以存储精度结果(目前脚本仍存在问题,并没有将结果保存至文件夹下)

  4. # test
    python ./tools/test_demo.py --cpu --def model/voc2007_comp/test.pt --weights model/voc2007_comp/test.model --cfg model/voc2007_comp/test.yml --imdb voc_2007_test --classes data/VOCdevkit2007/classes_name.txt 2>&1 | tee log/log.txt
    • 测试脚本,可设置cpu模式--cpu,也可设置gpu模式和启用显卡编号--gpu 0
    • --def --weights -- cfg --classes分别设置测试模型的网络结构文件,网络权重,配置文件,检测目标类型
    • --imdb设置为voc_2007_test表示为在VOC2007格式数据集上的测试
    • 2>&1 | tee log/log.txt 保存日志文件

中间修改

  1. easy-pvanet中将ubuntu_bread项目中的lib/fast_rcnn/config.py中的(2017/01/27)

    __C.ROOT_DIR = osp.abspath(osp.join(osp.dirname(__file__), '..', '..','..', '..'))
    

    重新更改为

    __C.ROOT_DIR = osp.abspath(osp.join(osp.dirname(__file__), '..', '..'))
    

    和原始pvanet相同

功能增加

2018/04/03

  1. 添加模型测试model_test选项(2018/05/02已删除,测试集上的检测,可采用test_demo.sh完成)

    python ./tools/detect_demo.py --gpu 0 --net model/Always/test.prototxt --weights model/Always/Always_iter_100000.caffemodel --cfg model/Always/test.yml --classes model/Always/classes_name.txt --pic_mode model_test --test_path data/VOCdevkit2007/VOC2007 --result_dir data/result 2>&1 | tee log/log.txt

    --pic_mode选项在原有三个选项imagevideodir的基础上,添加model_test,并将--test_path指定为data/VOCdevkit2007/VOC2007实现模型在测试集的检测

2018-04-27

  1. 修改makeMain.py文件,将trainval,train的比例设置提至脚本train_demo.sh
  2. 增加精度测试功能(需在VOCdevkit2007/results/VOC2007/Main文件夹下建立results文件夹)

2018-05-02

  1. 完成精度计算脚本的测试tools/test_dem0.pytools/test_demo.sh
  2. 删除2018/04/03增加的测试选项model_test

Bug修复(2018/04/13)

  1. 修复目标框左边角点处于边界时的越界问题

    easy-pvanet/lib/datasets/pascal_voc.py215-218行

    # Make pixel indexes 0-based
    x1 = float(bbox.find('xmin').text)-1
    y1 = float(bbox.find('ymin').text)-1
    x2 = float(bbox.find('xmax').text)-1
    y2 = float(bbox.find('ymax').text)-1

    改为

    # Make pixel indexes 0-based
    x1 = float(bbox.find('xmin').text)
    y1 = float(bbox.find('ymin').text)
    x2 = float(bbox.find('xmax').text)
    y2 = float(bbox.find('ymax').text)

    因为一开始的pascal_voc数据标注起始坐标从1开始;而我们样本标注时,本身是从0开始,没必要再-1转换标注方式。【 indexes 0-based(即从0开始的标注方式); indexes 1-based(即从1开始的标注方式)】

  2. 修复目标检测调用easy_detect.py/detect函数时,阈值CONF_THRESH NMS_THRESH设置不生效的问题

    easy_detect.py87行

    detections = demo(net, img, _t, CLASSES, CONF_THRESH=0.7, NMS_THRESH=0.3)

    改为

    detections = demo(net, img, _t, CLASSES, CONF_THRESH, NMS_THRESH)

    以避免阈值形参不固定死。

  3. 修复compress_model.py运行不生效的问题

    • compress_model.py主函数第一行增加命令

      args = parse_args()
    • net_weights前后命名不一致,将net_weight统一修改为net_weights

      net_weights = '' #line 42
      output_pt,output_weight = aux_tools.gen_merged_model(net_pt, net_weights) #line 51
  4. 修复easy_module模块找不到的问题

    修改tools文件夹下的四个shell执行文件,在文件的开头添加如下命令

    # 返回脚本文件放置的目录
    SHELL_FOLDER=$(dirname $(readlink -f "$0"))
    # 将根目录添加之PYTHONPATH中
    ROOT_PTAH=$SHELL_FOLDER/../
    export PYTHONPATH=$PYTHONPATH:$ROOT_PATH

    easy-pvanet目录添加进PYTHONPATH

感谢