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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容