How to use Ubuntu 18 Install caffe+darknet2caffe environment on 04

For Ubuntu installation, please refer to< How to quickly install Ubuntu 18 04>

For the configuration of samba service, please refer to< How to configure Samba service in Ubuntu>

0. You need to download and install torch when installing Darknet 2caffe environment

  • When executing pip3 install torch, it will always be killed, so you need to configure the running memory of Ubuntu.
    Make sure your Ubuntu is in the shutdown state, click memory, adjust the memory to 4GB (at least), and then boot Ubuntu. At this time, the running memory of Ubuntu is 4GB.

1, At Ubuntu 18 Installing caffe environment on 04

1. Execute the following commands step by step to update the software in Ubuntu

sudo apt-get update
sudo apt-get upgrade

2. Execute the following commands step by step to install the required dependent software.

sudo apt-get install  -y libopencv-dev
sudo apt-get install -y build-essential cmake git pkg-config
sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install -y liblapack-dev
sudo apt-get install -y libatlas-base-dev 
sudo apt-get install -y --no-install-recommends libboost-all-dev
sudo apt-get install -y libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install -y python-numpy python-scipy
sudo apt-get install -y python3-pip
sudo apt-get install -y python3-numpy python3-scipy

3. Execute the following command to download caffe open source software

git clone https://github.com/BVLC/caffe.git

4. Enter the cafe / Python / directory, execute the following command, and download the dependent software

cd caffe/python/
for req in $(cat requirements.txt); do pip3 install $req; done

5. Enter the cafe directory and execute the following command to create the makefile config. Copy an example file and rename it makefile config

cp Makefile.config.example  Makefile.config

6. The next step is to modify the makefile For the configuration in config, use the vim command to open makefile config.

vim Makefile.config
  • ① CPU_ The comments in front of only are removed.
take 
# CPU_ONLY := 1
 Change to
CPU_ONLY := 1
  • ② Opencv_ Remove the comments in front of version
take
# OPENCV_VERSION := 3
 Change to
OPENCV_VERSION := 3
  • ③ Because our Ubuntu environment is python, please put PYTHON_INCLUDE = python2.7 this configuration is annotated and python_ INCLUDE=python3. Open the comment of 5 and change all 3.5 to 3.6. The specific modifications are as follows
  • ④ With_ PYTHON_ Layer: = 1, remove the previous note
take 
# WITH_PYTHON_LAYER := 1
 Change to
WITH_PYTHON_LAYER := 1
  • ⑤ Modify INCLUDE_DIRS and LIBRARY_DIRS
take 
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
 Change to
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

The modified file is as follows:

## Refer to http://caffe.berkeleyvision.org/installation.html
# Contributions simplifying and improving our build system are welcome!

# cuDNN acceleration switch (uncomment to build with cuDNN).
# USE_CUDNN := 1

# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1

# uncomment to disable IO dependencies and corresponding data layers
# USE_OPENCV := 0
# USE_LEVELDB := 0
# USE_LMDB := 0
# This code is taken from https://github.com/sh1r0/caffe-android-lib
# USE_HDF5 := 0

# uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)
#	You should not set this flag if you will be reading LMDBs with any
#	possibility of simultaneous read and write
# ALLOW_LMDB_NOLOCK := 1

# Uncomment if you're using OpenCV 3
OPENCV_VERSION := 3

# To customize your choice of compiler, uncomment and set the following.
# N.B. the default for Linux is g++ and the default for OSX is clang++
# CUSTOM_CXX := g++

# CUDA directory contains bin/ and lib/ directories that we need.
CUDA_DIR := /usr/local/cuda
# On Ubuntu 14.04, if cuda tools are installed via
# "sudo apt-get install nvidia-cuda-toolkit" then use this instead:
# CUDA_DIR := /usr

# CUDA architecture setting: going with all of them.
# For CUDA < 6.0, comment the *_50 through *_61 lines for compatibility.
# For CUDA < 8.0, comment the *_60 and *_61 lines for compatibility.
# For CUDA >= 9.0, comment the *_20 and *_21 lines for compatibility.
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
		-gencode arch=compute_20,code=sm_21 \
		-gencode arch=compute_30,code=sm_30 \
		-gencode arch=compute_35,code=sm_35 \
		-gencode arch=compute_50,code=sm_50 \
		-gencode arch=compute_52,code=sm_52 \
		-gencode arch=compute_60,code=sm_60 \
		-gencode arch=compute_61,code=sm_61 \
		-gencode arch=compute_61,code=compute_61

# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := atlas
# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.
# Leave commented to accept the defaults for your choice of BLAS
# (which should work)!
# BLAS_INCLUDE := /path/to/your/blas
# BLAS_LIB := /path/to/your/blas

# Homebrew puts openblas in a directory that is not on the standard search path
# BLAS_INCLUDE := $(shell brew --prefix openblas)/include
# BLAS_LIB := $(shell brew --prefix openblas)/lib

# This is required only if you will compile the matlab interface.
# MATLAB directory should contain the mex binary in /bin.
# MATLAB_DIR := /usr/local
# MATLAB_DIR := /Applications/MATLAB_R2012b.app

# NOTE: this is required only if you will compile the python interface.
# We need to be able to find Python.h and numpy/arrayobject.h.
# PYTHON_INCLUDE := /usr/include/python2.7 \
#		/usr/lib/python2.7/dist-packages/numpy/core/include
# Anaconda Python distribution is quite popular. Include path:
# Verify anaconda location, sometimes it's in root.
# ANACONDA_HOME := $(HOME)/anaconda
# PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
		# $(ANACONDA_HOME)/include/python2.7 \
		# $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include

# Uncomment to use Python 3 (default is Python 2)
PYTHON_LIBRARIES := boost_python3 python3.6m
PYTHON_INCLUDE := /usr/include/python3.6m \
                 /usr/lib/python3.6/dist-packages/numpy/core/include

# We need to be able to find libpythonX.X.so or .dylib.
PYTHON_LIB := /usr/lib
# PYTHON_LIB := $(ANACONDA_HOME)/lib

# Homebrew installs numpy in a non standard path (keg only)
# PYTHON_INCLUDE += $(dir $(shell python -c 'import numpy.core; print(numpy.core.__file__)'))/include
# PYTHON_LIB += $(shell brew --prefix numpy)/lib

# Uncomment to support layers written in Python (will link against Python libs)
WITH_PYTHON_LAYER := 1

# Whatever else you find you need goes here.
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

# If Homebrew is installed at a non standard location (for example your home directory) and you use it for general dependencies
# INCLUDE_DIRS += $(shell brew --prefix)/include
# LIBRARY_DIRS += $(shell brew --prefix)/lib

# NCCL acceleration switch (uncomment to build with NCCL)
# https://github.com/NVIDIA/nccl (last tested version: v1.2.3-1+cuda8.0)
# USE_NCCL := 1

# Uncomment to use `pkg-config` to specify OpenCV library paths.
# (Usually not necessary -- OpenCV libraries are normally installed in one of the above $LIBRARY_DIRS.)
# USE_PKG_CONFIG := 1

# N.B. both build and distribute dirs are cleared on `make clean`
BUILD_DIR := build
DISTRIBUTE_DIR := distribute

# Uncomment for debugging. Does not work on OSX due to https://github.com/BVLC/caffe/issues/171
# DEBUG := 1

# The ID of the GPU that 'make runtest' will use to run unit tests.
TEST_GPUID := 0

# enable pretty build (comment to see full commands)
Q ?= @

7. Modify some configurations in the Makefile file. Open the Makefile with vim and make modifications.

vim Makefile
  • ① Modify dynamic_ VERSION_ Value of revision
take
DYNAMIC_VERSION_REVISION 	:= 0
 Change to
DYNAMIC_VERSION_REVISION 	:= 0-rc3
  • ② Modify the value of LIBRARIES.
take
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m
 Change to
LIBRARIES += glog gflags protobuf boost_system boost_filesystem boost_regex m hdf5_hl hdf5

take
LIBRARIES += opencv_imgcodecs
 Change to
LIBRARIES += opencv_imgcodecs opencv_videoio

  • ③ Comment out the # four lines under NCCL acceleration configuration
take
# NCCL acceleration configuration
ifeq ($(USE_NCCL), 1)
	LIBRARIES += nccl
	COMMON_FLAGS += -DUSE_NCCL
endif
 Change to
# NCCL acceleration configuration
# ifeq ($(USE_NCCL), 1)
#	LIBRARIES += nccl
#	COMMON_FLAGS += -DUSE_NCCL
# endif

8. In the caffe directory, execute the following commands step by step to compile caffe.

make -j4
make pycaffe


9. Execute the following command to set the python path of caffe as the environment variable and update the environment variable.

Execute the following command to open bashrc

sudo vim ~/.bashrc 

Add the following statement at the end of the file

export PYTHONPATH=/home/hispark/code/caffe/python:$PYTHONPATH


Then execute the following command to update the environment variable

source ~/.bashrc

10. Test whether the caffe environment is OK. Run Python 3 in any directory of Ubuntu. When the "> > >" prompt appears, enter import caffe. If there is no error message, it indicates that the caffe environment has been built successfully.

python3
import caffe

2, Perform the following steps to install the Darknet 2caffe environment

1. Execute the following command to download the code of darknet2caffe to Ubuntu.

git clone https://github.com/ChenYingpeng/darknet2caffe

2. Because the local version of Python is Python 3 6. The open source code is python2 10. Therefore, the code syntax needs to be adjusted appropriately

  • ① Set darknet2caffe All if blocks in py has_ Key ('name '): replace with if' name 'in block:

  • ② Then put caffe_ Change root to the actual absolute path of cafe, such as: / home / hispark / code / cafe/
take
caffe_root='/home/chen/caffe/'
Change to
caffe_root='/home/hispark/code/caffe/'  # /Home / hispark / code / Cafe / is your cafe path
  • ③ Set prototext Py installation is modified as shown in the figure below

    Modified protxt Py is shown below
from collections import OrderedDict
try:
    import caffe.proto.caffe_pb2 as caffe_pb2
except:
    try:
        import caffe_pb2
    except:
        print('caffe_pb2.py not found. Try:')
        print('  protoc caffe.proto --python_out=.')
        exit()

def parse_caffemodel(caffemodel):
    model = caffe_pb2.NetParameter()
    print('Loading caffemodel: ', caffemodel)
    with open(caffemodel, 'rb') as fp:
        model.ParseFromString(fp.read())

    return model


def parse_prototxt(protofile):
    def line_type(line):
        if line.find(':') >= 0:
            return 0
        elif line.find('{') >= 0:
            return 1
        return -1

    def parse_block(fp):
        block = OrderedDict()
        line = fp.readline().strip()
        while line != '}':
            ltype = line_type(line)
            if ltype == 0: # key: value
                #print line
                line = line.split('#')[0]
                key, value = line.split(':')
                key = key.strip()
                value = value.strip().strip('"')
                if block.has_key(key):
                    if type(block[key]) == list:
                        block[key].append(value)
                    else:
                        block[key] = [block[key], value]
                else:
                    block[key] = value
            elif ltype == 1: # blockname {
                key = line.split('{')[0].strip()
                sub_block = parse_block(fp)
                block[key] = sub_block
            line = fp.readline().strip()
            line = line.split('#')[0]
        return block

    fp = open(protofile, 'r')
    props = OrderedDict()
    layers = []
    line = fp.readline()
    while line != '':
        line = line.strip().split('#')[0]
        if line == '':
            line = fp.readline()
            continue
        ltype = line_type(line)
        if ltype == 0: # key: value
            key, value = line.split(':')
            key = key.strip()
            value = value.strip().strip('"')
            if props.has_key(key):
               if type(props[key]) == list:
                   props[key].append(value)
               else:
                   props[key] = [props[key], value]
            else:
                props[key] = value
        elif ltype == 1: # blockname {
            key = line.split('{')[0].strip()
            if key == 'layer':
                layer = parse_block(fp)
                layers.append(layer)
            else:
                props[key] = parse_block(fp)
        line = fp.readline()

    if len(layers) > 0:
        net_info = OrderedDict()
        net_info['props'] = props
        net_info['layers'] = layers
        return net_info
    else:
        return props

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

def print_prototxt(net_info):
    # whether add double quote
    def format_value(value):
        #str = u'%s' % value
        #if str.isnumeric():
        if is_number(value):
            return value
        elif value == 'true' or value == 'false' or value == 'MAX' or value == 'SUM' or value == 'AVE':
            return value
        else:
            return '\"%s\"' % value

    def print_block(block_info, prefix, indent):
        blanks = ''.join([' ']*indent)
        print('%s%s {' % (blanks, prefix))
        for key,value in block_info.items():
            if type(value) == OrderedDict:
                print_block(value, key, indent+4)
            elif type(value) == list:
                for v in value:
                    print('%s    %s: %s' % (blanks, key, format_value(v)))
            else:
                print('%s    %s: %s' % (blanks, key, format_value(value)))
        print('%s}' % blanks)
        
    props = net_info['props']
    layers = net_info['layers']
    print('name: \"%s\"' % props['name'])
    print('input: \"%s\"' % props['input'])
    print('input_dim: %s' % props['input_dim'][0])
    print('input_dim: %s' % props['input_dim'][1])
    print('input_dim: %s' % props['input_dim'][2])
    print('input_dim: %s' % props['input_dim'][3])
    print('')
    for layer in layers:
        print_block(layer, 'layer', 0)

def save_prototxt(net_info, protofile, region=True):
    fp = open(protofile, 'w')
    # whether add double quote
    def format_value(value):
        #str = u'%s' % value
        #if str.isnumeric():
        if is_number(value):
            return value
        elif value == 'true' or value == 'false' or value == 'MAX' or value == 'SUM' or value == 'AVE':
            return value
        else:
            return '\"%s\"' % value

    def print_block(block_info, prefix, indent):
        blanks = ''.join([' ']*indent)
        print('%s%s {' % (blanks, prefix), end="\n", file=fp)
        for key,value in block_info.items():
            if type(value) == OrderedDict:
                print_block(value, key, indent+4)
            elif type(value) == list:
                for v in value:
                    print('%s    %s: %s' % (blanks, key, format_value(v)), end="\n", file=fp)
            else:
                if key[0:6] == 'biases':
                    key = 'biases'
                print('%s    %s: %s' % (blanks, key, format_value(value)), end="\n", file=fp)
        print('%s}' % blanks, end="\n", file=fp)
        
    props = net_info['props']
    layers = net_info['layers']
    print('name: \"%s\"' % props['name'], end="\n", file=fp)
    print('input: \"%s\"' % props['input'], end="\n", file=fp)
    print('input_dim: %s' % props['input_dim'][0], end="\n", file=fp)
    print('input_dim: %s' % props['input_dim'][1], end="\n", file=fp)
    print('input_dim: %s' % props['input_dim'][2], end="\n", file=fp)
    print('input_dim: %s' % props['input_dim'][3], end="\n", file=fp)
    print('', end="\n", file=fp)
    for layer in layers:
        if layer['type'] != 'Region' or region == True:
            print_block(layer, 'layer', 0)
    fp.close()


if __name__ == '__main__':
    import sys
    if len(sys.argv) != 2:
        print('Usage: python prototxt.py model.prototxt')
        exit()

    net_info = parse_prototxt(sys.argv[1])
    print_prototxt(net_info)
    save_prototxt(net_info, 'tmp.prototxt')
    

3. Enter the darknet2caffe directory, execute the following command, and copy the three files to the Caffe directory

cp caffe_layers/upsample_layer/upsample_layer.hpp  ../caffe/include/caffe/layers/
cp caffe_layers/upsample_layer/upsample_layer.c*  ../caffe/src/caffe/layers/


4. Enter the src/caffe/proto / directory of caffe and modify caffe Proto file

cd ../caffe/src/caffe/proto/


Add optional upsampleparameter upsample in message LayerParameter {}_ param = 150;

In Caffe Finally, add the UpsampleParameter parameter to proto, as shown in the following figure:

 message UpsampleParameter {
         optional int32 scale = 1 [default = 1];
}

5. In the caffe directory, execute the following command to recompile the caffe environment.

make clean
make -j4
make pycaffe


At this point, the environment of Caffe and darknet2caffe is installed in Ubuntu.

Keywords: Ubuntu caffe

Added by simon_belak on Thu, 20 Jan 2022 16:55:16 +0200