Person search 学习 二
来源:互联网 发布:主角创造人工智能小说 编辑:程序博客网 时间:2024/06/14 12:23
Fast R-CNN
许多文章都是基于R-cnn系列做的Person search,同时R-cnn系列的算法也都是非常经典的。所以今天准备详细的学习一下Fast R-cnn,。代码网址: https://github.com/rbgirshick/fast-rcnn
- 一、编译运行程序
首先肯定是要先把程序调通,运行出结果,才有继续看下去的欲望。Fast R-cnn是基于caffe的,所以首先做的就是编译caffe。
编译caffe
下载代码 : git clone –recursive https://github.com/rbgirshick/fast-rcnn.git
确认一下这三个包是否安装,cython, python-opencv, easydict。没安装的安装一下。
然后开始调试:
cd /home/mmt/Desktop/fast-rcnn/caffe-fast-rcnn cp Makefile.config.example Makefile.config 然后修改里面的内容 WITH_PYTHON_LAYER := 1 USE_CUDNN := 1 将这两句前面的 # 号去掉 然后 make -j8
- 出现错误1
./include/caffe/data_layers.hpp:9:18: fatal error: hdf5.h: No such file or directory
解决方法:
将Makefile.config中的 INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib 修改为: INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnumake 将 Makefile中下一行修改如下: LIBRARIES += glog gflags protobuf leveldb snappy \ lmdb boost_system hdf5_serial_hl hdf5_serial m \ opencv_core opencv_highgui opencv_imgproc
重新编译 make -j8
- 出现错误2
./include/caffe/util/cudnn.hpp:124:41: error: too few arguments to function ‘cudnnStatus_t cudnnSetPooling2dDescriptor(cudnnPoolingDescriptor_t, cudnnPoolingMode_t, cudnnNanPropag
ation_t, int, int, int, int, int, int)’
这个是cudnn版本的问题,解决方法如下:
将BVLC(https://github.com/BVLC/caffe)中的下列文件copy 到相应的文件夹,即将这2个文件夹里的cudnn开头的文件全部换成新的,例如: ./include/util/cudnn.hpp ./src/caffe/layers/cudnn_conv_layer.cpp ./src/caffe/layers/cudnn_conv_layer.cu ./src/caffe/layers/cudnn_relu_layer.cpp ./src/caffe/layers/cudnn_relu_layer.cu ./src/caffe/layers/cudnn_sigmoid_layer.cpp ./src/caffe/layers/cudnn_sigmoid_layer.cu ./src/caffe/layers/cudnn_tanh_layer.cpp ./src/caffe/layers/cudnn_tanh_layer.cu
make clean make -j8
- 出现错误3
src/caffe/layers/cudnn_softmax_layer.cpp:6:48: fatal error: caffe/layers/cudnn_softmax_layer.hpp: No such file or directory
提示说找不到这个文件。发现Fast-rcnn自带的Caffe的 include 里面没有layers文件夹,因此将官网中caffe中的layers文件夹拷贝过去。
然后 make clean
make -j8 - 出现错误4
.build_release/lib/libcaffe.so: undefined reference to `cv::imread(cv::String const&, int)’
解决方法: 在Makefile中下一行的末尾添加 opencv_imgcodecs 修改如下: LIBRARIES += glog gflags protobuf leveldb snappy \ lmdb boost_system hdf5_serial_hl hdf5_serial m \ opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
make clean
make -j8
编译成功。
然后
make pycaffe
出现错误
python/caffe/_caffe.cpp:10:31: fatal error: numpy/arrayobject.h: No such file or directory
解决方法:将Makefile.config中的下行加一个localPYTHON_INCLUDE := /usr/include/python2.7 \ /usr/local/lib/python2.7/dist-packages/numpy/core/include
make pycaffe,编译成功。
接下来,运行Fast-rcnn中的demo,看看是否能够运行成功。
cd /home/mmt/Desktop/fast-rcnn下载models./data/scripts/fetch_fast_rcnn_models.sh./tools/demo.py
出现错误
ImportError: No module named cython_bbox
回到lib文件夹里没找到。重新进入到lib里,然后,make 一下。可能是之前make clean 把编译的都删掉了。
./tools/demo.py
出现错误
Floating point exception
网上说是由于使用高版本的gcc glibc 编译后在低版本的上运行导致.但是不想更改这个版本,怕损坏之前其他程序配好的环境。(以后有时间可以试一下)
但是找不到其他的解决办法。
因为之前编译过faster-rcnn,它里面是基于fast-rcnn的Caffe做的,因此将其caffe拷贝过来,放到fast-rcnn里,重新编译。(有些人可能会说,如果这样做不就是成为了fast-rcnn了吗?并不是的,faster与fast的代码的区别在于lib文件中,还有net模型上,caffe并没有区别。)
运行 ./tools/demo.py
- 二、代码
静下心来,安静的看代码(带上耳机,听自己喜欢的音乐,很容易静下心来!!)
首先,看一下demo的代码:
#!/usr/bin/env python# --------------------------------------------------------# Fast R-CNN# Copyright (c) 2015 Microsoft# Licensed under The MIT License [see LICENSE for details]# Written by Ross Girshick# --------------------------------------------------------"""Demo script showing detections in sample images.See README.md for installation instructions before running."""import _init_paths from fast_rcnn.config import cfgfrom fast_rcnn.test import im_detectfrom utils.cython_nms import nmsfrom utils.timer import Timerimport matplotlib.pyplot as pltimport numpy as npimport scipy.io as sioimport caffe, os, sys, cv2import argparse#数据集中 class 的种类CLASSES = ('__background__', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor')#可供选择的集中 net 类型NETS = {'vgg16': ('VGG16', 'vgg16_fast_rcnn_iter_40000.caffemodel'), 'vgg_cnn_m_1024': ('VGG_CNN_M_1024', 'vgg_cnn_m_1024_fast_rcnn_iter_40000.caffemodel'), 'caffenet': ('CaffeNet', 'caffenet_fast_rcnn_iter_40000.caffemodel')}def vis_detections(im, class_name, dets, thresh=0.5): """Draw detected bounding boxes.""" inds = np.where(dets[:, -1] >= thresh)[0] if len(inds) == 0: return im = im[:, :, (2, 1, 0)] fig, ax = plt.subplots(figsize=(12, 12)) ax.imshow(im, aspect='equal') for i in inds: bbox = dets[i, :4] score = dets[i, -1] ax.add_patch( plt.Rectangle((bbox[0], bbox[1]), bbox[2] - bbox[0], bbox[3] - bbox[1], fill=False, edgecolor='red', linewidth=3.5) ) ax.text(bbox[0], bbox[1] - 2, '{:s} {:.3f}'.format(class_name, score), bbox=dict(facecolor='blue', alpha=0.5), fontsize=14, color='white') ax.set_title(('{} detections with ' 'p({} | box) >= {:.1f}').format(class_name, class_name, thresh), fontsize=14) plt.axis('off') plt.tight_layout() plt.draw()def demo(net, image_name, classes): """Detect object classes in an image using pre-computed object proposals.""" # Load pre-computed Selected Search object proposals #首先下载已经计算好的box,box有很多,obj_proposals是一个R*4的矩阵,R表示检测到的box的数量,4分别表示box的中心点与宽和高。 box_file = os.path.join(cfg.ROOT_DIR, 'data', 'demo', image_name + '_boxes.mat') obj_proposals = sio.loadmat(box_file)['boxes'] # Load the demo image im_file = os.path.join(cfg.ROOT_DIR, 'data', 'demo', image_name + '.jpg') im = cv2.imread(im_file) # Detect all object classes and regress object bounds timer = Timer() timer.tic() #scores的维数为2888*21,21为类的数,boxes为2888*84 scores, boxes = im_detect(net, im, obj_proposals) timer.toc() print ('Detection took {:.3f}s for ' '{:d} object proposals').format(timer.total_time, boxes.shape[0]) # Visualize detections for each class CONF_THRESH = 0.8 NMS_THRESH = 0.3 #classes为要检测的类别 for cls in classes: cls_ind = CLASSES.index(cls) #返回类别在CASESS中的索引位置 cls_boxes = boxes[:, 4*cls_ind:4*(cls_ind + 1)]#返回该类别的框 cls_scores = scores[:, cls_ind] #返回该类别框的参数 keep = np.where(cls_scores >= CONF_THRESH)[0]#返回得分值大于0.8的框的索引 cls_boxes = cls_boxes[keep, :] #返回相应的框的参数 cls_scores = cls_scores[keep] #返回得分值 dets = np.hstack((cls_boxes, cls_scores[:, np.newaxis])).astype(np.float32)#dets是一个46*5的矩阵,即阈值之后保留下来46个框,前四列对应着框的位置,第5列对应着得分值 keep = nms(dets, NMS_THRESH) #经过非最大值抑制后得到的框的位置 dets = dets[keep, :] print 'All {} detections with p({} | box) >= {:.1f}'.format(cls, cls, CONF_THRESH) vis_detections(im, cls, dets, thresh=CONF_THRESH) #显示框的函数#如果不设置默认参数,demo运行的一些参数就要通过终端输入,https://www.cnblogs.com/zknublx/p/6106343.htmldef parse_args(): """Parse input arguments.""" parser = argparse.ArgumentParser(description='Train a Fast R-CNN network') parser.add_argument('--gpu', dest='gpu_id', help='GPU device id to use [0]', default=0, type=int) parser.add_argument('--cpu', dest='cpu_mode', help='Use CPU mode (overrides --gpu)', action='store_true') parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16]', choices=NETS.keys(), default='vgg16') args = parser.parse_args() return argsif __name__ == '__main__': args = parse_args()# os.path.join将多个路径组合后返回#cfg.ROOT_DIR,fast-rcnn中编写的自动获取当前路径的程序, prototxt = os.path.join(cfg.ROOT_DIR, 'models', NETS[args.demo_net][0], 'test.prototxt') print(cfg.ROOT_DIR ) print(prototxt) print(args.demo_net) /home/mmt/eclipse-workspace/day9/src/fast-rcnn /home/mmt/eclipse-workspace/day9/src/fast-rcnn/models/VGG16/test.prototxt vgg16 caffemodel = os.path.join(cfg.ROOT_DIR, 'data', 'fast_rcnn_models', NETS[args.demo_net][1])#如果没有该路径的文件,会提示你下载该文件 if not os.path.isfile(caffemodel): raise IOError(('{:s} not found.\nDid you run ./data/scripts/' 'fetch_fast_rcnn_models.sh?').format(caffemodel))# caffe中设置GPU的模块 if args.cpu_mode: caffe.set_mode_cpu() else: caffe.set_mode_gpu() caffe.set_device(args.gpu_id) net = caffe.Net(prototxt, caffemodel, caffe.TEST) print '\n\nLoaded network {:s}'.format(caffemodel) print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' print 'Demo for data/demo/000004.jpg' demo(net, '000004', ('car',)) print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' print 'Demo for data/demo/001551.jpg' demo(net, '001551', ('sofa', 'tvmonitor')) plt.show()
阅读全文
2 0
- Person search 学习 二
- Person Search 学习 一
- 【论文笔记】Neural Person Search Machines (ICCV2017)
- person
- person
- Person
- 论文笔记-Person Re-Identification Meets Image Search
- 论文笔记《End-to-End Deep Learning for Person Search》
- iOS9-by-Tutorials-学习笔记二:App-Search
- Elastic search系统学习之二: 插件安装
- cas 入门之二十六:person directory(上)
- cas入门之二十七:person directory(中)
- 基于深度学习的Person Re-ID(度量学习)
- 论文笔记之---Joint Detection and Identification Feature Learning for Person Search
- 论文笔记之--Joint Detection and Identification Feature Learning for Person Search
- java 我的java学习之路 Person对象信息管理
- 深度学习triplet loss 做人再识别(person-reid)
- 基于深度学习的Person Re-ID(综述)
- MyBatis源码(六)之动态Sql解析运行阶段BoundSql
- centos 7 安装无线网卡驱动
- 如何写一个播放器-解析MNVideoPlayer(一)
- python from import 自定义模块
- docker相关产品情况
- Person search 学习 二
- BZOJ2005 能量汇集 【gcd求和】
- Android UI Libs之android-stackblur模糊照片
- CentOS Git配置
- each用法、mybatis传递多个参数方法
- Java反射机制操作对象赋值
- 职业规划---菜鸟级
- FL Studio12汉化版教程之如何将音轨转录为波形文件
- 动画大全:nineoldandroids