SSD的安装与测试, invalid pointer double free解决方案

I suggest you use atlas not openblas, and use cuda 8.0.
Now the best solution is to remake openCV with qt5 I think.
What’s more, Here is something I suggest: when making openCV, I strongly suggest add -D WITH_GTK=NO, without this my computer will automatically build with gtk if it can find gtk packs on computer.

1. 安装cuda和caffe, 暂略

2. 安装相应库依赖

sudo apt-get update
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libgflags-dev
sudo apt-get install libgoogle-glog-dev
sudo apt-get install libblas-dev
sudo apt-get install libhdf5-serial-dev
sudo apt-get instal libopenblas-base libopenblas-dev

3. 安装opencv3.1

强烈建议使用QT安装,不要用GTK, 默认的GTK带来的double-link problem 让我连续三天苦不堪言,一直是munmap_chunk(),invalid pointer,简直崩溃,参考解决方案:https://github.com/BVLC/caffe/issues/5282#issuecomment-306063718

#依赖库的安装
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

#安装cmake
sudo apt-get install cmake
#安装pkg-config
sudo apt-get install pkg-config

#安装QT
sudo apt-get install cmake qt5-default qtcreator

#下载opencv (http://opencv.org/opencv-3-1.html),并解压
进入opencv-3.1.0/modules/cudalegacy/src/目录,修改graphcuts.cpp文件,将:
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
改为
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)

cd opencv-3.1.0/
sudo mkdir build
cd build
cmake  -DWITH_GTK=NO -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DFORCE_VTK=ON -DWITH_TBB=ON -DWITH_V4L=ON -DWITH_QT=ON -DWITH_OPENGL=ON -DWITH_CUBLAS=ON -DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" -DWITH_GDAL=ON -DWITH_XINE=ON -DBUILD_EXAMPLES=ON ..
sudo make
sudo make install

注意:cmake编译时,会临时从网络上下载第三方依赖库,因此要保证网络的畅通,如果网速过慢,长时间下载不完,cmake也会报错,经常会用到的是ippicv_linux_20151201.tgz。如果长时间下载不成功,可以自行下载(下载地址),然后手动放入opencv源码文件夹下的3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e/文件夹中,再使用cmake进行编译。

4.获取源码并编译

  • 说明:SSD采用的是在caffe文件夹中内嵌例程的方式,作者改动了原版caffe,所以你需要把原来的caffe文件夹移除,Git命令会新建一个带有SSD程序的caffe文件夹,当然,这个新的caffe要重新编译一次。

    sudo git clone https://github.com/weiliu89/caffe.git  
    sudo cd caffe  
    sudo git checkout ssd  
    
  • 编译Caffe

cd 到caffe的文件夹
sudo cp Makefile.config.example Makefile.config
sudo vi Makefile.config

将USE_CUDNN :=1取消注释

将# Whatever else you find you need goes here.下面的
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-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
//这是因为ubuntu16.04的文件包含位置发生了变化,尤其是需要用到的hdf5的位置,所以需要更改这一路径

将
PYTHON_INCLUDE := /usr/include/python2.7 
/usr/lib/python2.7/dist-packages/numpy/core/include
改成
PYTHON_INCLUDE := /usr/include/python2.7 
/usr/local/lib/python2.7/dist-packages/numpy/core/include

//Step2: 取消BLAS的 47行,Blas这里使用atblas
# BLAS := open
BLAS := atlas
然后再安装atblas: sudo apt-get install libatlas-base-dev
sudo vi Makefile
替换NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

为NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) 
cd caffe文件夹
sudo mkdir build
cd build
sudo cmake ..
cd ..
sudo make -j4
sudo make py
sudo make test
sudo make runtest

5. 可能出现的问题:

  • error: 'NppiGraphcutState' has not been declared
进入opencv-3.1.0/modules/cudalegacy/src/目录,修改graphcuts.cpp文件,将:
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
改为
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
  • undefined reference to `cv::VideoCapture::set(int, double)'
LIBRARIES += glog gflags protobuf leveldb snappy 
 lmdb boost_system boost_filesystem hdf5_hl hdf5 m 
 opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs opencv_videoio
  • munmap_chunk(): Invalid pointer
    apt-get install libtcmalloc-minimal4
    然后打开~/.bashrc文件: vi ~/.bashrc 在末尾添加export LD_PRELOAD="/usr/lib/libtcmalloc_minimal.so.4" 最后,再sudo source ~/.bashrc
    如果这样还不成功,请按照上面的方法使用QT重新安装opencv,并重新编译caffe
    本人就是之前opencv用默认的GTK装的,导致libprotobuf-lite.so.10 and libmirprotobuf.so.3同时链接到opencv_highgui, 从而导致错误;
    the only place that used functions in highgui_core is in bbox_util.cpp. Comment these lines: cv::imshow("detections", image); if (cv::waitKey(1) == 27) { raise(SIGINT); } should solve the problem. However, I do think jmuncaster's solution is better, since the root cause is the libprotobuf-lite incurred by libgtk-3.0. Roll back to Ubuntu 14.04 will also solve this problem, since Ubuntu 14.04 use gtk-2.0 that did not include libprotobuf-lite.
    参考:munmap_chunk:Invalid pointer or Double free or corruption issue when make runtest
  • fatal error: numpy/arrayobject.so
    先安装sudo apt-get install python-numpy
    再打开Makefile.config并修改(第二行加了一个local)
    PYTHON_INCLUDE := /usr/include/python2.7
    /usr/lib/python2.7/dist-packages/numpy/core/include
    改成
    PYTHON_INCLUDE := /usr/include/python2.7
    /usr/local/lib/python2.7/dist-packages/numpy/core/include
  • fatal error: glog/logging.h: 没有那个文件或目录
    apt-get install libgoogle-glog-dev
  • fatal error: boost/shared_ptr.hpp: No such file or directory
    apt-get install --no-install-recommends libboost-all-dev
    若不成功,先apt-get update,再执行上面

6. 训练与测试

在caffe目录下执行python examples/ssd/ssd_pascal.py ,此时就不会报错找不到 ./build/tools/caffe 了。

7. 绘制损失和精度曲线(loss and accuracy)

7.1 损失曲线需要利用到训练存下来的日志,对于SSD, 日志存在于caffe/jobs/VGGNet/VOC2007/SSD_300x300/VGG_VOC2007_SSD_300x300.log
7.2 caffe在tools/extra中自带日志分析工具parse_log.sh

 cd caffe/tools/extra
 sudo ./parse.sh ../../jobs/VGGNet/VOC2007/SSD_300x300/VGG_VOC2007_SSD_300x300.log  

这样会生成VGG_VOC2007_SSD_300x300.log.test,VGG_VOC2007_SSD_300x300.log.train两个解析过的文件
parse
内容打开如下:
train.png
test.png
7.3 修改gpuplot设置,在caffe/tools/extra/下存在有plot_log.gnuplot.example,我们照着上面修改即可

cd caffe/tools/extra
sudo cp plot_log.gnuplot.example plot_log.gnuplot

绘制train loss单曲线:下面有例程,改名字就可以
loss.png
再安装gnuplot:sudo apt-get install gnuplot
再执行:sudo gnuplot plot_log.gnuplot
即可得到当前目录下生成一张png图片
7.4 accuracy等等曲线修改对应的代码即可,对于在一张图上画多个曲线,可以参考https://www.ibm.com/developerworks/cn/linux/l-gnuplot/index.html

原文地址:https://www.cnblogs.com/qiulinzhang/p/9513493.html