|
|
|
From 7f503bd9a19758a173064e299ab9d4cac65ed60f Mon Sep 17 00:00:00 2001
|
|
|
|
From: Daniel Bermond <danielbermond@gmail.com>
|
|
|
|
Date: Mon, 26 Nov 2018 13:11:23 +0000
|
|
|
|
Subject: [PATCH] Fix build with OpenCV 4.0
|
|
|
|
|
|
|
|
---
|
|
|
|
Makefile | 16 ++++++++++++++--
|
|
|
|
Makefile.config.example | 2 +-
|
|
|
|
src/caffe/layers/window_data_layer.cpp | 2 +-
|
|
|
|
src/caffe/test/test_io.cpp | 4 ++--
|
|
|
|
src/caffe/util/io.cpp | 8 ++++----
|
|
|
|
5 files changed, 22 insertions(+), 10 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/Makefile b/Makefile
|
|
|
|
index b7660e852d6..95f3443adab 100644
|
|
|
|
--- a/Makefile
|
|
|
|
+++ b/Makefile
|
|
|
|
@@ -200,9 +200,17 @@ endif
|
|
|
|
ifeq ($(USE_OPENCV), 1)
|
|
|
|
LIBRARIES += opencv_core opencv_highgui opencv_imgproc
|
|
|
|
|
|
|
|
- ifeq ($(OPENCV_VERSION), 3)
|
|
|
|
+ ifeq ($(OPENCV_VERSION), $(filter $(OPENCV_VERSION), 3 4))
|
modify to use caffe ssd fork
There was a deleted `caffe-pkg` package by jerry73204 with the
following PKGBUILD:
========================= BEGIN CODE BLOCK ==========================
# Maintainer : jerry73204 < jerry73204 at gmail dot com >
# NOTE:
# In order to build with NCCL support, uncomment the NCCL
# lines in 'depends' and 'preprare()'.
pkgname=caffe-ssd
_srcname=caffe
pkgver=ssdv1.0.r0.g4817bf8b
pkgrel=3
pkgdesc="weiliu89's caffe"
arch=('x86_64')
url="http://caffe.berkeleyvision.org/"
license=('BSD')
depends=(
# official repositories:
'boost-libs' 'protobuf' 'google-glog' 'gflags' 'hdf5' 'opencv' 'leveldb'
'lmdb' 'cuda' 'cudnn' 'python' 'boost' 'cython' 'python-numpy' 'python-scipy'
'python-matplotlib' 'ipython' 'python-h5py' 'python-networkx' 'python-nose'
'python-pandas' 'python-dateutil' 'python-protobuf' 'python-gflags'
'python-yaml' 'python-pillow' 'python-six'
# AUR:
# required:
'openblas-lapack'
# not required:
# 'nccl'
#python:
'python-leveldb' 'python-scikit-image' 'python-pydotplus'
# NOTE:
# python-pydotplus (or python-pydot) is required by python executable draw_net.py
# https://github.com/BVLC/caffe/blob/691febcb83d6a3147be8e9583c77aefaac9945f8/python/caffe/draw.py#L7-L22
)
makedepends=('git' 'gcc6' 'doxygen' 'texlive-core' 'findutils')
provides=('caffe')
conflicts=('caffe' 'caffe-cpu' 'caffe-cpu-git' 'caffe-dr-git' 'caffe-mnc-dr-git'
'caffe2' 'caffe2-git' 'caffe2-cpu' 'caffe2-cpu-git' 'caffe-git' 'caffe-ssd-cpu')
source=("${pkgname}"::"git+https://github.com/weiliu89/caffe.git#branch=ssd")
sha256sums=('SKIP')
prepare() {
cd "$pkgname"
# prepare to configure options in Makefile.config
cp -f Makefile.config.example Makefile.config
# enable cuDNN acceleration switch
sed -i '/USE_CUDNN/s/^#[[:space:]]//g' Makefile.config
# enable NCCL acceleration switch
# sed -i '/USE_NCCL/s/^#[[:space:]]//g' Makefile.config
# fix compatibility OpenCV 4
sed -i '/INCLUDE_DIRS += $(BUILD_INCLUDE_DIR) .\/src .\/include/a\INCLUDE_DIRS += /usr/include/opencv4' Makefile
sed -i 's|COMMON_FLAGS += \$(foreach includedir,\$(INCLUDE_DIRS),-isystem \$(includedir))|COMMON_FLAGS += \$(foreach includedir,\$(INCLUDE_DIRS),-I \$(includedir))|' Makefile
find -name '*.cpp' -exec \
sed -i -e 's/CV_LOAD_IMAGE_COLOR/cv::IMREAD_COLOR/g' \
-e 's/CV_LOAD_IMAGE_GRAYSCALE/cv::IMREAD_GRAYSCALE/g' \
-e 's/CV_CAP_PROP_FRAME_COUNT/cv::CAP_PROP_FRAME_COUNT/g' \
-e 's/CV_CAP_PROP_POS_FRAMES/cv::CAP_PROP_POS_FRAMES/g' \
-e 's/CV_HSV2BGR/cv::COLOR_HSV2BGR/g' \
-e 's/CV_BGR2HSV/cv::COLOR_BGR2HSV/g' \
-e 's/CV_BGR2Lab/cv::COLOR_BGR2Lab/g' \
-e 's/CV_BGR2YCrCb/cv::COLOR_BGR2YCrCb/g' \
-e 's/CV_YCrCb2BGR/cv::COLOR_YCrCb2BGR/g' \
-e 's/CV_GRAY2BGR/cv::COLOR_GRAY2BGR/g' \
-e 's/CV_BGR2GRAY/cv::COLOR_BGR2GRAY/g' \
-e 's/CV_THRESH_BINARY_INV/cv::THRESH_BINARY_INV/g' \
-e 's/CV_THRESH_OTSU/cv::THRESH_OTSU/g' \
-e 's/CV_IMWRITE_JPEG_QUALITY/cv::IMWRITE_JPEG_QUALITY/g' \
-e 's/CV_FOURCC/cv::VideoWriter::fourcc/g' \
-e 's/CV_FILLED/cv::FILLED/g' \
{} ';'
# strictly enable I/O dependencies
sed -i '/USE_OPENCV/s/^#[[:space:]]//;/USE_OPENCV/s/0/1/' Makefile.config
sed -i '/USE_LEVELDB/s/^#[[:space:]]//;/USE_LEVELDB/s/0/1/' Makefile.config
sed -i '/USE_LMDB/s/^#[[:space:]]//;/USE_LMDB/s/0/1/' Makefile.config
sed -i '/OPENCV_VERSION/s/^#[[:space:]]//g' Makefile.config
# use gcc6 (CUDA 9.0 code requires gcc6)
sed -i '/CUSTOM_CXX/s/^#[[:space:]]//;/CUSTOM_CXX/s/$/-6/' Makefile.config
# set CUDA directory
sed -i '/CUDA_DIR/s/\/usr\/local\/cuda/\/opt\/cuda/' Makefile.config
# remove gpu architectures not supported by CUDA 9.0
sed -i 's/-gencode[[:space:]]arch=compute_20,code=sm_20//' Makefile.config
sed -i 's/-gencode[[:space:]]arch=compute_20,code=sm_21//' Makefile.config
# set OpenBLAS as the BLAS provider and adjust its directories
sed -i '/BLAS[[:space:]]\:=[[:space:]]atlas/s/atlas/open/' Makefile.config
sed -i 's/.*BLAS_INCLUDE[[:space:]]\:=[[:space:]]\/path.*/BLAS_INCLUDE := \/usr\/include/' Makefile.config
sed -i 's/.*BLAS_LIB[[:space:]]\:=[[:space:]]\/path.*/BLAS_LIB := \/usr\/lib/' Makefile.config
# python3 settings
_py2inc_line="$(sed -n '/PYTHON_INCLUDE[[:space:]]\:=[[:space:]]\/usr\/include\/python2\.7/=' Makefile.config)"
_py3inc_line="$(sed -n '/PYTHON_INCLUDE[[:space:]]\:=[[:space:]]\/usr\/include\/python3\.5m/=' Makefile.config)"
_py3libs_line="$(sed -n '/PYTHON_LIBRARIES/=' Makefile.config)"
sed -i "$((_py2inc_line))s/^/# /" Makefile.config # comment python2 lines
sed -i "$((_py2inc_line+1))s/^/#/" Makefile.config
sed -i "$((_py3inc_line))s/^#[[:space:]]//" Makefile.config # uncomment python3 PYTHON_INCLUDE lines
sed -i "$((_py3inc_line+1))s/^#//" Makefile.config
sed -i "$((_py3libs_line))s/^#[[:space:]]//" Makefile.config # uncomment PYTHON_LIBRARIES line
sed -i "$((_py3libs_line))s/5/7/" Makefile.config # change version in PYTHON_LIBRARIES
sed -i "$((_py3inc_line))s/5/7/" Makefile.config # change version in python3 PYTHON_INCLUDE
sed -i "$((_py3inc_line+1))s/5/7/;$((_py3inc_line+1))s/dist/site/" Makefile.config
# use python layers
sed -i '/WITH_PYTHON_LAYER/s/^#[[:space:]]//g' Makefile.config
# if you want to use python2 _instead_ of python3:
# - uncomment this block
# - comment the python3 block
# - change python3 dependencies to python2
# - change python2 directories in package() to python3
# - NOTE: do not enable both python2 and python3 blocks. choose only one.
# - NOTE: python2 is the Caffe default but this package uses python3 by default
# python2 settings
#_py2inc_line="$(sed -n '/PYTHON_INCLUDE[[:space:]]\:=[[:space:]]\/usr\/include\/python2\.7/=' Makefile.config)"
#sed -i "$((_py2inc_line+1))s/dist/site/" Makefile.config
}
pkgver() {
cd "$pkgname"
# git, tags available
git describe --long --tags | sed 's/\([^-]*-g\)/r\1/;s/-/./g'
}
build() {
cd "$pkgname"
export CC=gcc-6
export CXX=g++-6
msg2 "Building target 'all'..."
make all
msg2 "Building target 'pycaffe'..."
make pycaffe
msg2 "Building target 'docs'..."
rm -rf doxygen
make docs
msg2 "Building target 'distribute'..."
make distribute
}
# uncomment this block if you want to run the checks/tests
#check() {
# cd "$pkgname"
# msg2 "Building target 'test'..."
# make test
# msg2 "Making target 'runtest'..."
# make runtest
#}
package() {
# directories creation
mkdir -p "${pkgdir}/usr/bin"
mkdir -p "${pkgdir}/usr/include/caffe/"{layers,proto,test,util}
mkdir -p "${pkgdir}/usr/lib/python3.7/site-packages/caffe/"{imagenet,proto,test}
mkdir -p "${pkgdir}/usr/share/"{caffe,doc/"${_srcname}"/search,licenses/"${pkgname}"}
# binaries
cd "${pkgname}/distribute/bin"
install -D -m755 * "${pkgdir}/usr/bin"
# libraries
cd "${srcdir}/${pkgname}/distribute/lib"
install -D -m755 *.so "${pkgdir}/usr/lib"
# includes
cd "${srcdir}/${pkgname}/distribute/include/caffe"
install -D -m644 *.hpp "${pkgdir}/usr/include/caffe"
for _dir in layers proto test util
do
cd "${srcdir}/${pkgname}/distribute/include/caffe/${_dir}"
install -D -m644 * "${pkgdir}/usr/include/caffe/${_dir}"
done
# python
cd "${srcdir}/${pkgname}/distribute/python"
install -D -m755 *.py "${pkgdir}/usr/bin"
rm -rf python # remove duplicated 'python' folder
cd caffe
for _file in *
do
[ -d "$_file" ] && continue # skip directories
_mode="$(stat --format '%a' "$_file")"
install -D -m"$_mode" "$_file" "${pkgdir}/usr/lib/python3.7/site-packages/caffe"
done
for _dir in imagenet proto test
do
cd "${srcdir}/${pkgname}/distribute/python/caffe/${_dir}"
for _file in *
do
_mode="$(stat --format '%a' "$_file")"
install -D -m"$_mode" "$_file" "${pkgdir}/usr/lib/python3.7/site-packages/caffe/${_dir}"
done
done
# proto
cd "${srcdir}/${pkgname}/distribute/proto"
install -D -m644 * "${pkgdir}/usr/share/caffe"
# docs
cd "${srcdir}/${pkgname}/doxygen/html"
for _file in *
do
[ -d "$_file" ] && continue # skip directories
install -D -m644 "$_file" "${pkgdir}/usr/share/doc/${_srcname}"
done
cd search
install -D -m644 * "${pkgdir}/usr/share/doc/${_srcname}/search"
# license
cd "${srcdir}/${pkgname}"
install -D -m644 LICENSE "${pkgdir}/usr/share/licenses/${pkgname}"
}
======================+=== END CODE BLOCK ===========================
2 years ago
|
|
|
LIBRARIES += opencv_imgcodecs opencv_videoio
|
|
|
|
endif
|
|
|
|
+ ifeq ($(OPENCV_VERSION), 4)
|
|
|
|
+ ifeq ($(USE_PKG_CONFIG), 1)
|
|
|
|
+ INCLUDE_DIRS += $(shell pkg-config opencv4 --cflags-only-I | sed 's/-I//g')
|
|
|
|
+ else
|
|
|
|
+ INCLUDE_DIRS += /usr/include/opencv4 /usr/local/include/opencv4
|
|
|
|
+ INCLUDE_DIRS += /usr/include/opencv4/opencv /usr/local/include/opencv4/opencv
|
|
|
|
+ endif
|
|
|
|
+ endif
|
|
|
|
|
|
|
|
endif
|
|
|
|
PYTHON_LIBRARIES ?= boost_python python2.7
|
|
|
|
@@ -429,7 +437,11 @@ LINKFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS)
|
|
|
|
|
|
|
|
USE_PKG_CONFIG ?= 0
|
|
|
|
ifeq ($(USE_PKG_CONFIG), 1)
|
|
|
|
- PKG_CONFIG := $(shell pkg-config opencv --libs)
|
|
|
|
+ ifeq ($(OPENCV_VERSION), 4)
|
|
|
|
+ PKG_CONFIG := $(shell pkg-config opencv4 --libs)
|
|
|
|
+ else
|
|
|
|
+ PKG_CONFIG := $(shell pkg-config opencv --libs)
|
|
|
|
+ endif
|
|
|
|
else
|
|
|
|
PKG_CONFIG :=
|
|
|
|
endif
|
|
|
|
diff --git a/Makefile.config.example b/Makefile.config.example
|
|
|
|
index 24ca632783a..24802e91534 100644
|
|
|
|
--- a/Makefile.config.example
|
|
|
|
+++ b/Makefile.config.example
|
|
|
|
@@ -19,7 +19,7 @@
|
|
|
|
# possibility of simultaneous read and write
|
|
|
|
# ALLOW_LMDB_NOLOCK := 1
|
|
|
|
|
|
|
|
-# Uncomment if you're using OpenCV 3
|
|
|
|
+# Uncomment and set accordingly if you're using OpenCV 3/4
|
|
|
|
# OPENCV_VERSION := 3
|
|
|
|
|
|
|
|
# To customize your choice of compiler, uncomment and set the following.
|
|
|
|
diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp
|
|
|
|
index 1bf3760e9fd..f41169debe4 100644
|
|
|
|
--- a/src/caffe/layers/window_data_layer.cpp
|
|
|
|
+++ b/src/caffe/layers/window_data_layer.cpp
|
|
|
|
@@ -290,7 +290,7 @@ void WindowDataLayer<Dtype>::load_batch(Batch<Dtype>* batch) {
|
|
|
|
image_database_cache_[window[WindowDataLayer<Dtype>::IMAGE_INDEX]];
|
|
|
|
cv_img = DecodeDatumToCVMat(image_cached.second, true);
|
|
|
|
} else {
|
|
|
|
- cv_img = cv::imread(image.first, CV_LOAD_IMAGE_COLOR);
|
|
|
|
+ cv_img = cv::imread(image.first, cv::IMREAD_COLOR);
|
|
|
|
if (!cv_img.data) {
|
|
|
|
LOG(ERROR) << "Could not open or find file " << image.first;
|
|
|
|
return;
|
|
|
|
diff --git a/src/caffe/test/test_io.cpp b/src/caffe/test/test_io.cpp
|
|
|
|
index c2c919e90dc..b80df287fba 100644
|
|
|
|
--- a/src/caffe/test/test_io.cpp
|
|
|
|
+++ b/src/caffe/test/test_io.cpp
|
|
|
|
@@ -20,8 +20,8 @@ class IOTest : public ::testing::Test {};
|
|
|
|
bool ReadImageToDatumReference(const string& filename, const int label,
|
|
|
|
const int height, const int width, const bool is_color, Datum* datum) {
|
|
|
|
cv::Mat cv_img;
|
|
|
|
- int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
|
|
|
|
- CV_LOAD_IMAGE_GRAYSCALE);
|
|
|
|
+ int cv_read_flag = (is_color ? cv::IMREAD_COLOR :
|
|
|
|
+ cv::IMREAD_GRAYSCALE);
|
|
|
|
|
|
|
|
cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag);
|
|
|
|
if (!cv_img_origin.data) {
|
|
|
|
diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp
|
|
|
|
index 5295d9dddb9..1f9167a114f 100644
|
|
|
|
--- a/src/caffe/util/io.cpp
|
|
|
|
+++ b/src/caffe/util/io.cpp
|
|
|
|
@@ -73,8 +73,8 @@ void WriteProtoToBinaryFile(const Message& proto, const char* filename) {
|
|
|
|
cv::Mat ReadImageToCVMat(const string& filename,
|
|
|
|
const int height, const int width, const bool is_color) {
|
|
|
|
cv::Mat cv_img;
|
|
|
|
- int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
|
|
|
|
- CV_LOAD_IMAGE_GRAYSCALE);
|
|
|
|
+ int cv_read_flag = (is_color ? cv::IMREAD_COLOR :
|
|
|
|
+ cv::IMREAD_GRAYSCALE);
|
|
|
|
cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag);
|
|
|
|
if (!cv_img_origin.data) {
|
|
|
|
LOG(ERROR) << "Could not open or find file " << filename;
|
|
|
|
@@ -179,8 +179,8 @@ cv::Mat DecodeDatumToCVMat(const Datum& datum, bool is_color) {
|
|
|
|
CHECK(datum.encoded()) << "Datum not encoded";
|
|
|
|
const string& data = datum.data();
|
|
|
|
std::vector<char> vec_data(data.c_str(), data.c_str() + data.size());
|
|
|
|
- int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
|
|
|
|
- CV_LOAD_IMAGE_GRAYSCALE);
|
|
|
|
+ int cv_read_flag = (is_color ? cv::IMREAD_COLOR :
|
|
|
|
+ cv::IMREAD_GRAYSCALE);
|
|
|
|
cv_img = cv::imdecode(vec_data, cv_read_flag);
|
|
|
|
if (!cv_img.data) {
|
|
|
|
LOG(ERROR) << "Could not decode datum ";
|