Darknet图像识别及训练

Darknet图像识别及训练

Darknet图像识别及训练
环境:CentOS 7.8
GCC/g++:7.5.0
查看操作系统命令:
cat /etc/redhat-release
uname -a
在这里插入图片描述
使用工具集:putty、WinSCP
1.安装git
如果没有安装git,则yum安装:yum install git(版本查看:git --version)
2.下载指定gcc版本
因为如果开启GPU的话,英伟达SDK指定了必须要用gcc7(所以我安装的GCC版本 7.5.0),下载地址:http://mirror.hust.edu.cn/gnu/gcc/
在这里插入图片描述
在root权限下面进行这些操作(安装环境)
yum -y update
yum -y install bzip2 wget gcc gcc-c++ gmp-devel mpfr-devel libmpc-devel make
yum -y install zlib
yum -y install zlib-devel
tar -zxvf gcc-7.5.0.tar.gz
cd gcc-7.5.0

安装若干gcc的依赖包
./contrib/download_prerequisites
mkdir gcc-build-7.5
cd gcc-build-7.5

生成Makefile文件(下面这个是一行,请直接复制粘贴):
…/configure --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --enable-gnu-indirect-function --with-tune=generic --disable-multilib

编译(编译过程非常耗时):make -j$(nproc)
安装:make install

版本查看:
gcc -v
g++ -v

参考:
https://www.cnblogs.com/music-liang/p/12900457.html
https://www.cnblogs.com/freeweb/p/9321520.html

3.安装wget
如果未安装wget ,yum安装:则yum -y install wget

4.安装OpenMPI
下载源码:https://www.open-mpi.org/
在这里插入图片描述
在这里插入图片描述
下载后解压:tar -zxvf openmpi-4.0.3.tar.gz
cd openmpi-4.0.3
./configure
make && make install
安装完毕后,进入examples目录,执行make命令编译示例程序,通过运行示例程序验证是否成功安装openmpi,如下所示:
验证安装:cd examples/
make
./hello_c
在这里插入图片描述
如上图,则安装成功

5.安装python
参见:https://www.cnblogs.com/xiujin/p/11477419.html
先安装相应的编译工具:
yum -y groupinstall “Development tools”

yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

yum install -y libffi-devel zlib1g-dev

yum install zlib* -y

再索引到官网“https://www.python.org/ftp/python/”下载相应版本安装包。蒲皓注:如我下载的是:wget wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tar.xz
解压:先 xz -d Python-3.8.3.tar.xz,再 tar -xvf Python-3.8.3.tar
cd Python-3.8.3
创建编译安装目录:mkdir /usr/local/python3
./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl
#第一个指定安装的路径,不指定的话,安装过程中可能软件所需要的文件复制到其他不同目录,删除软件很不方便,复制软件也不方便.
#第二个可以提高python10%-20%代码运行速度.
#第三个是为了安装pip需要用到ssl,后面报错会有提到.

make -j8 && make install

创建软链接
ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
ln -s /usr/local/python3/bin/python3 /usr/local/bin/python
ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip

验证是否成功
python3 -V
pip3 -V
如下图则安装成功
在这里插入图片描述

6.安装并配置GPU
centos下安装anaconda 以及搭建python3虚拟环境:
在官网查看最新版本:https://repo.anaconda.com/archive/
如下载此版本:wget https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh
chmod 777 Anaconda3-5.2.0-Linux-x86_64.sh
./Anaconda3-5.2.0-Linux-x86_64.sh -u

编辑.bashrc配置文件:vi /root/.bashrc
export PATH="/root/anaconda3/bin:$PATH"
source /root/.bashrc
参考网站:https://www.cnblogs.com/haoyiyang/p/11309701.html 和
https://cloud.tencent.com/developer/article/1555688

7.安装CUDA
参见:https://zhuanlan.zhihu.com/p/67663006?from_voters_page=true
chmod 755 cuda_10.0.130_410.48_linux.run
./cuda_10.0.130_410.48_linux.run
安装完成后:vi /root/.bashrc
在末尾加一行:
export PATH="/usr/local/cuda-10.0/bin:$PATH"
保存后:source /root/.bashrc
查看版本:nvcc -V,如下图则安装成功
在这里插入图片描述

8.安装cuDNN
官网:https://developer.nvidia.com/cudnn
在这里插入图片描述
登陆后下载与CUDA安装版本一致的版本如:
在这里插入图片描述
如下载文件名为:cudnn-10.0-linux-x64-v7.6.4.38.tgz
安装参见官网:https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#install-linux
在这里插入图片描述
[root@localhost ph]# tar -zxvf cudnn-10.0-linux-x64-v7.6.4.38.tgz
[root@localhost ph]# cp cuda/include/cudnn.h /usr/local/cuda-10.0/include
[root@localhost ph]# cp cuda/lib64/libcudnn* /usr/local/cuda-10.0/lib64
[root@localhost ph]# chmod a+r /usr/local/cuda-10.0/include/cudnn.h /usr/local/cuda-10.0/lib64/libcudnn*

配置库:
vi /etc/profile
在profile文件最末尾添加如下三行:
export PATH= P A T H : / u s r / l o c a l / c u d a − 10.0 / b i n e x p o r t L D L I B R A R Y P A T H = PATH:/usr/local/cuda-10.0/bin export LD_LIBRARY_PATH= PATH:/usr/local/cuda10.0/binexportLDLIBRARYPATH=LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib64
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/cuda-10.0/lib64/stubs
即如下图:
在这里插入图片描述
让配置生效:source /etc/profile
查看版本:nvcc -V
在这里插入图片描述

9.OpenCV4.3.0编译
参见“https://blog.csdn.net/whudee/article/details/93379780”或“https://zhuanlan.zhihu.com/p/120859243?from_voters_page=true”。
用“pkg-config --modversion opencv”查看是否已经安装版本号。
查看已经安装的版本:rpm -qa |grep -i opencv
卸载已经安装版本(如我的计算机已经安装了如下,所以卸载,因为新旧版本容易产生):
yum remove opencv-core-2.4.5-3.el7.x86_64
yum remove opencv-2.4.5-3.el7.x86_64
yum remove opencv-devel-2.4.5-3.el7.x86_64
9.1安装依赖项:
yum -y install epel-release # 安装epel扩展源
yum -y install git gcc gcc-c++ cmake3
yum -y install qt5-qtbase-devel
yum install -y python34 python34-devel python34-pip
yum install -y python python-devel python-pip
yum -y install python-devel numpy python34-numpy
yum -y install gtk2-devel
yum install -y libpng-devel
yum install -y jasper-devel
yum install -y openexr-devel
yum install -y libwebp-devel
yum -y install libjpeg-turbo-devel
yum install -y freeglut-devel mesa-libGL mesa-libGL-devel
yum -y install libtiff-devel
yum -y install libdc1394-devel
yum -y install tbb-devel eigen3-devel
yum -y install boost boost-thread boost-devel
yum -y install libv4l-devel
yum -y install gstreamer-plugins-base-devel

#=========== 安装 ffmpeg ===========
yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
yum localinstall --nogpgcheck https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm
yum localinstall --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
yum localinstall -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
yum -y install ffmpeg ffmpeg-devel # 安装ffmpeg依赖,可以用“ffmpeg –version”查看其版本
在这里插入图片描述

yum install epel-release git gcc gcc-c++ cmake3 qt5-qtbase-devel python3 python3-devel python3-pip cmake python3-devel python3-numpy gtk2-devel libpng-devel jasper-devel openexr-devel libwebp-devel libjpeg-turbo-devel libtiff-devel tbb-devel libv4l-devel eigen3-devel freeglut-devel mesa-libGL mesa-libGL-devel boost boost-thread boost-devel gstreamer1-plugins-base

9.2下载最新的OpenCV
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout master # 选择master版本分支
cd …
git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout master # 选择master版本分支
cd …

9.3编译安装OpenCV
cd opencv
mkdir build
cd build

cmake3 -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_C_EXAMPLES=ON -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=…/…/opencv_contrib/modules -D BUILD_EXAMPLES=ON -D with-contrib=ON -D with-cuda=ON -D with-ffmpeg=ON -D with-tbb=ON -D WITH_GSTREAMER=ON -D WITH_JPEG=ON -D WITH_GTK=ON -D WITH_PNG=ON -D WITH_FFMPEG=ON -D WITH_V4L=ON -D WITH_LIBV4L=ON …

make -j$(nproc) #有几个CPU就用几个CPU
make install
ln -s /usr/local/lib64/pkgconfig/opencv4.pc /usr/share/pkgconfig/
ln -s /usr/local/lib64/pkgconfig/opencv4.pc /usr/share/pkgconfig/opencv.pc
(最好直接重命名为opencv.pc:
mv /usr/local/lib64/pkgconfig/opencv4.pc /usr/local/lib64/pkgconfig/opencv.pc)

ldconfig

安装完成。验证是否安装成功及可以输入命令opencv_version检查已安装的opencv的版本号:
pkg-config --modversion opencv4(或pkg-config --modversion opencv)
pkg-config --cflags opencv4(或pkg-config --cflags opencv)
pkg-config –libs opencv4(或pkg-config –libs opencv)
在这里插入图片描述
9.4编译错误处理,蒲皓特注
9.4.1 boostdesc_bgm.i等文件找不到
如果编译的过程中报错如下:
在这里插入图片描述
则参见“https://www.cnblogs.com/zhang-hongbo/p/12859405.html”或“https://github.com/opencv/opencv_contrib/issues/1301”,
解决方式:
采用的是源码编译的方式,所以可以查看 build 文件夹下的日志文件 CMakeDownloadLog.txt,在日志文件CMakeDownloadLog.txt中搜索 boostdesc_bgm.i 关键词 (不是在文件夹中搜索),
发现这个文件下载失败了。日志文件里就有它的下载地址,直接复制其下载地址到网页可以看该到文件的源码,直接拷贝源码并生存同名文件,放在 opencv_contrib/modules/xfeatures2d/src/ 路径下即可。

总共缺了以下几个文件,都需要拷贝:
在这里插入图片描述
boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i
参考:
https://github.com/opencv/opencv_contrib/issues/1301
ps: 不懂操作的,点开上面这个网址往下拉,有人提供了缺失的各个文件的链接,点击保存. 或者直接在这个网页里搜索 BenbenIO 这个用户的回复.
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_lbgm.i > 0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_256.i > e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_128.i > 98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_064.i > 202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm_hd.i > 324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm_bi.i > 232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm.i > 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_120.i > 151805e03568c9f490a5e3a872777b75-vgg_generated_120.i
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_64.i > 7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_48.i > e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i
curl https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_80.i > 7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i

9.4.2致命错误:features2d/test/test_detectors_invariance.impl.hpp:没有那个文件或目录
报错如下图
在这里插入图片描述
具体错误如下:

/opencv_contrib/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp:7:10: 致命错误:features2d/test/test_detectors_invariance.impl.hpp:没有那个文件或目录
#include “features2d/test/test_detectors_invariance.impl.hpp” // main OpenCV repo
如上图

头文件include地址不对,解决方法如下:

将opencv/modules/features2d/test/文件下的

test_descriptors_regression.impl.hpp
test_detectors_regression.impl.hpp
test/test_detectors_invariance.impl.hpp
test_descriptors_invariance.impl.hpp
test_invariance_utils.hpp
拷贝到opencv_contrib/modules/xfeatures2d/test/文件下。

同时,将opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp文件下的

#include “features2d/test/test_detectors_regression.impl.hpp”
#include “features2d/test/test_descriptors_regression.impl.hpp”
改成:

#include “test_detectors_regression.impl.hpp”
#include “test_descriptors_regression.impl.hpp”
将opencv_contrib/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp文件下的

#include “features2d/test/test_detectors_invariance.impl.hpp”
#include “features2d/test/test_descriptors_invariance.impl.hpp”
改成:

#include “test_detectors_invariance.impl.hpp”
#include “test_descriptors_invariance.impl.hpp”
-wget https://pjreddie.com/media/files/yolov3.weights

10.编译darknet
10.1下载及编译
下载源码处:https://pjreddie.com/darknet/,下载最新。
git clone https://github.com/pjreddie/darknet.git
cd darknet
将“darknet”目录下“Makefile”文件最开始的地方对应的(GPU=1,CUDNN=1,OPENCV=1,OPENMP=1)改为1,因为在darknet下只用CPU训练太慢(经过我的计算机实测相差近50倍),建议开通多线程的openMP和GPU,如下图:
在这里插入图片描述
编译:make -jKaTeX parse error: Expected 'EOF', got '#' at position 11: (nproc) #̲有几个CPU就用几个CPU(或…(nproc)”,编译,我的CPU是i7-4700MQ,是为4核8线程,所以使用指令-j$(nproc)(或-j8),每次使用make指令时都要加上j8,会加快编译速度。同时,根据我的编译经验发现(NVIDIA官网要求必须用gcc7),开启GPU,则必须要在gcc7(我用的是gcc7.5)下才能编译通过。
如果这命令运行正常,你会看到屏幕划过一大堆编译信息:
mkdir -p obj
gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast…
gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast…
gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast…

gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast -lm…
I如果遇到任何错误,请尝试修复它们?如果一切看起来都编译正确,则请尝试运行:
./darknet
应获得如下输出:
usage: ./darknet

下载相应的训练结果的“yolov3.weights”文件,参见https://pjreddie.com/darknet/yolo/:
wget https://pjreddie.com/media/files/yolov3.weights

编译成功后,可以用“./darknet detect cfg/yolov3.cfg yolov3.weights -thresh 0.1 ./data/IMG_20130617_100050.jpg”命令看下结果。

10.2编译纠错:
在这里插入图片描述
(参见“https://blog.csdn.net/qq_43697649/article/details/104502113”)
在src文件夹下查找错误里的image_opencv.cpp,修改以下两个函数,注释里的是原始代码,确保你的文件里的这两个函数函数和以下一致:
Mat image_to_mat(image im)
{
image copy = copy_image(im);
constrain_image(copy);
if(im.c == 3) rgbgr_image(copy);

/*IplImage *ipl = image_to_ipl(copy);
Mat m = cvarrToMat(ipl, true);
cvReleaseImage(&ipl);*///被改变的代码
///  ***** begin:改变后的代码,ph:2020.6.4   *****  ///
Mat m(cv::Size(im.w,im.h), CV_8UC(im.c));
int x,y,c;

int step = m.step;
for(y = 0; y < im.h; ++y){
    for(x = 0; x < im.w; ++x){
        for(c= 0; c < im.c; ++c){
            float val = im.data[c*im.h*im.w + y*im.w + x];
            m.data[y*step + x*im.c + c] = (unsigned char)(val*255);
        }
    }
}
///  ***** end:改变后的代码   *****  ///

free_image(copy);
return m;

}

image mat_to_image(Mat m)
{
/IplImage ipl = m;
image im = ipl_to_image(&ipl);
///被改变的代码
/// ***** begin:改变后的代码,ph:2020.6.4 ***** ///
int h = m.rows;
int w = m.cols;
int c = m.channels();
image im = make_image(w, h, c);
unsigned char *data = (unsigned char *)m.data;
int step = m.step;
int i, j, k;

for(i = 0; i < h; ++i){
    for(k= 0; k < c; ++k){
        for(j = 0; j < w; ++j){
            im.data[k*w*h + i*w + j] = data[i*step + j*c + k]/255.;
        }
    }
}
///  ***** end:改变后的代码   *****  ///

rgbgr_image(im);
return im;

}

如下图:
在这里插入图片描述
在这里插入图片描述
同时删除所有含有IplImage的函数,保存,如下图:
在这里插入图片描述
重新make,会出现:
在这里插入图片描述
这是由于opencv版本问题,现在版本没有CV_前缀,所以将image_opencv.cpp里所有大写含有CV_前缀的全局变量的前缀删掉,如上面的变量修改后为CAP_PROP_FRAME_WIDTH。修改分别如下图:
(1)、函数1改动前:
在这里插入图片描述

函数1改动后:
在这里插入图片描述

(2)、函数2改动前:
在这里插入图片描述
函数2改动后:
在这里插入图片描述

保存,重新make(make -j$(nproc)),成功!

下面贴出“darknet/src/image_opencv.cpp”修改后的完整代码:
#ifdef OPENCV

#include “stdio.h”
#include “stdlib.h”
#include “opencv2/opencv.hpp”
#include “image.h”

using namespace cv;

extern “C” {
//同时注释所有含有IplImage的函数,即如下2个函数image_to_ipl()和ipl_to_image(),ph:2020.6.4
/IplImage image_to_ipl(image im)
{
int x,y,c;
IplImage disp = cvCreateImage(cvSize(im.w,im.h), IPL_DEPTH_8U, im.c);
int step = disp->widthStep;
for(y = 0; y < im.h; ++y){
for(x = 0; x < im.w; ++x){
for(c= 0; c < im.c; ++c){
float val = im.data[c
im.h
im.w + y
im.w + x];
disp->imageData[ystep + xim.c + c] = (unsigned char)(val*255);
}
}
}
return disp;
}

image ipl_to_image(IplImage* src)
{
int h = src->height;
int w = src->width;
int c = src->nChannels;
image im = make_image(w, h, c);
unsigned char *data = (unsigned char *)src->imageData;
int step = src->widthStep;
int i, j, k;

for(i = 0; i < h; ++i){
    for(k= 0; k < c; ++k){
        for(j = 0; j < w; ++j){
            im.data[k*w*h + i*w + j] = data[i*step + j*c + k]/255.;
        }
    }
}
return im;

}*/
Mat image_to_mat(image im)
{
image copy = copy_image(im);
constrain_image(copy);
if(im.c == 3) rgbgr_image(copy);

/*IplImage *ipl = image_to_ipl(copy);
Mat m = cvarrToMat(ipl, true);
cvReleaseImage(&ipl);*///被改变的代码
///  ***** begin:改变后的代码,ph:2020.6.4   *****  ///
Mat m(cv::Size(im.w,im.h), CV_8UC(im.c));
int x,y,c;

int step = m.step;
for(y = 0; y < im.h; ++y){
    for(x = 0; x < im.w; ++x){
        for(c= 0; c < im.c; ++c){
            float val = im.data[c*im.h*im.w + y*im.w + x];
            m.data[y*step + x*im.c + c] = (unsigned char)(val*255);
        }
    }
}
///  ***** end:改变后的代码   *****  ///

free_image(copy);
return m;

}

image mat_to_image(Mat m)
{
/IplImage ipl = m;
image im = ipl_to_image(&ipl);
///被改变的代码
/// ***** begin:改变后的代码,ph:2020.6.4 ***** ///
int h = m.rows;
int w = m.cols;
int c = m.channels();
image im = make_image(w, h, c);
unsigned char *data = (unsigned char *)m.data;
int step = m.step;
int i, j, k;

for(i = 0; i < h; ++i){
    for(k= 0; k < c; ++k){
        for(j = 0; j < w; ++j){
            im.data[k*w*h + i*w + j] = data[i*step + j*c + k]/255.;
        }
    }
}
///  ***** end:改变后的代码   *****  ///

rgbgr_image(im);
return im;

}

void *open_video_stream(const char *f, int c, int w, int h, int fps)
{
VideoCapture *cap;
if(f) cap = new VideoCapture(f);
else cap = new VideoCapture©;
if(!cap->isOpened()) return 0;
if(w) cap->set(CAP_PROP_FRAME_WIDTH, w);
if(h) cap->set(CAP_PROP_FRAME_HEIGHT, w);
if(fps) cap->set(CAP_PROP_FPS, w);
return (void *) cap;
}

image get_image_from_stream(void *p)
{
VideoCapture *cap = (VideoCapture *)p;
Mat m;
*cap >> m;
if(m.empty()) return make_empty_image(0,0,0);
return mat_to_image(m);
}

image load_image_cv(char *filename, int channels)
{
int flag = -1;
if (channels == 0) flag = -1;
else if (channels == 1) flag = 0;
else if (channels == 3) flag = 1;
else {
fprintf(stderr, “OpenCV can’t force load with %d channels\n”, channels);
}
Mat m;
m = imread(filename, flag);
if(!m.data){
fprintf(stderr, “Cannot load image “%s”\n”, filename);
char buff[256];
sprintf(buff, “echo %s >> bad.list”, filename);
system(buff);
return make_image(10,10,3);
//exit(0);
}
image im = mat_to_image(m);
return im;
}

int show_image_cv(image im, const char* name, int ms)
{
Mat m = image_to_mat(im);
imshow(name, m);
int c = waitKey(ms);
if (c != -1) c = c%256;
return c;
}

void make_window(char *name, int w, int h, int fullscreen)
{
namedWindow(name, WINDOW_NORMAL);
if (fullscreen) {
setWindowProperty(name, WND_PROP_FULLSCREEN, WINDOW_FULLSCREEN);
} else {
resizeWindow(name, w, h);
if(strcmp(name, “Demo”) == 0) moveWindow(name, 0, 0);
}
}

}

#endif

10.3测试yolov3时报错:内存溢出
测试结果:
./darknet detect cfg/ yolov3-voc yolov3.weights -thresh 0.1 ./data/IMG_20130617_100050.jpg
如下图:
在这里插入图片描述
修改cfg文件夹下的yolov3.cfg文件,原始为:
在这里插入图片描述
修改后为:
在这里插入图片描述

减少其batch数量能大大缓解内存紧张。
如果按照上面这样做还是出现内存不足的现象(在我的计算机上就是这样),那么:
方案一:用小一点的模型。
方案二:更改cfg目录下yolov3.cfg第8、9行height、width值,在我的计算机将其修改为宽、高都为416(我采用该方案)。
方案三:取消random多尺度,默认情况下random=1,取消将random=0(一共3处)。
再测试就OK。修改后的“darknet/cfg/ yolov3-voc.cfg”文件开头部分:
在这里插入图片描述
再测试就没问题了。

11.训练自己的数据
11.1下载再训练文件
从 http://pjreddie.com/media/files/darknet53.conv.74 下载卷积层的预训练权重 darknet53.conv.74文件(约155 MB)
11.2 用labelImg工具标注被训练文件
本标注工具为labelImg-1.8.1,使用安装步骤如下。
参考资料:
https://github.com/tzutalin/labelImg或
https://blog.csdn.net/python_pycharm/article/details/85338801

11.2.1安装python
(1)、进入官网并选中要下载的版本python:https://www.python.org/downloads/windows/,如下图
在这里插入图片描述
进入选中的下载页面的最下端,选择安装文件下载,如下图
在这里插入图片描述
下载后,直接安装,安装步骤如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装完成后,在cmd中输入命令:“python --version”如下图,则安装成功
在这里插入图片描述
如果失败,则检查下路径是否正确:开始图标—此电脑(右击)—更多—属性(左击)–“高级”标签下子项的 “环境变量—系统变量—Path—编辑”,整个编辑过程如下3图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果路劲都正确,但还是失败,则重新启动计算机(终极杀招)再在cmd内查看,应该成功(目前我安装了几个版本还没有通过此方法还不成功的)。

11.2.2安装PyQt5
在保证网络通信正常情况下,在cmd中通过pip工具安装“pip install PyQt5”。
如下图:
11.2.3安装lxml
在保证网络通信正常情况下,在cmd中通过pip工具安装“pip install lxml”。
如下图:
在这里插入图片描述

11.2.4使用labelImg工具
以上环境安装完成后,直接进入“labelImg-1.8.1”目录下,双击“labelImg.py”就会出现程序界面。
开始图像数据标注:一般操作的顺序:“open file ” -----"create rectbox " -----"输入类别名称 "-----“change save dir ”-----“Save”

11.3创建训练VOC2007 数据集
参考:https://blog.csdn.net/qq_38451119/article/details/83313857
11.3.1创建所需相应的文件及文件集
在“darknet/scripts”目录下新建“VOCdevkit”文件夹;在“VOCdevkit”文件夹下新建“VOC2007”文件夹,在其“darknet/scripts/VOCdevkit/VOC2007”文件夹下新建“Annotations、ImageSets、JPEGImages”三个文件夹和“test.py”文件,
在这里插入图片描述
“darknet/scripts/VOCdevkit/VOC2007/ImageSets”文件夹下新建“Main”文件夹。
在这里插入图片描述
再在“darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main”目录下创建“test.txt、train.txt、trainval.txt、val.txt”四个空文件
在这里插入图片描述
创建“darknet/scripts/VOCdevkit/VOC2007/test.py”文件,内容如下:
import os
import random

trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = ‘Annotations’
txtsavepath = ‘ImageSets\Main’
total_xml = os.listdir(xmlfilepath)

num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)

ftrainval = open(‘ImageSets/Main/trainval.txt’, ‘w’)
ftest = open(‘ImageSets/Main/test.txt’, ‘w’)
ftrain = open(‘ImageSets/Main/train.txt’, ‘w’)
fval = open(‘ImageSets/Main/val.txt’, ‘w’)

for i in list:
name = total_xml[i][:-4] + ‘\n’
if i in trainval:
ftrainval.write(name)
if i in train:
ftest.write(name)
else:
fval.write(name)
else:
ftrain.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
如下图:
在这里插入图片描述

11.3.2放置标注文件
将被标注训练图片文件放于“darknet/scripts/VOCdevkit/VOC2007/JPEGImages”文件夹内:
在这里插入图片描述
将用labelImg标注工具生成被标注训练图片的标注配置文件(均为.xml文件,每张图片会自动生成一个对应的.xml文件)放于“/darknet/scripts/VOCdevkit/VOC2007/Annotations”文件夹内:
在这里插入图片描述

11.3.3运行test.py生成标注列表文件
在“darknet/scripts/VOCdevkit/VOC2007”目录下运行“test.py”文件:
python test.py(或python3 test.py)
在这里插入图片描述
运行成功后,会在“darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main/train.txt”文件夹内写入训练文件名:
在这里插入图片描述

11.3.4运行voc_label.py文件
修改“darknet/scripts”文件夹内的“voc_label.py”文件的对应处:
在这里插入图片描述
在这里插入图片描述
修改后的voc_label.py文件完整内容如下:
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets=[(‘2007’, ‘train’), (‘2007’, ‘val’), (‘2007’, ‘test’)]

classes = [“pig”]

def convert(size, box):
dw = 1./(size[0])
dh = 1./(size[1])
x = (box[0] + box[1])/2.0 - 1
y = (box[2] + box[3])/2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = xdw
w = w
dw
y = ydh
h = h
dh
return (x,y,w,h)

def convert_annotation(year, image_id):
in_file = open(‘VOCdevkit/VOC%s/Annotations/%s.xml’%(year, image_id))
out_file = open(‘VOCdevkit/VOC%s/labels/%s.txt’%(year, image_id), ‘w’)
tree=ET.parse(in_file)
root = tree.getroot()
size = root.find(‘size’)
w = int(size.find(‘width’).text)
h = int(size.find(‘height’).text)

for obj in root.iter('object'):
    difficult = obj.find('difficult').text
    cls = obj.find('name').text
    if cls not in classes or int(difficult)==1:
        continue
    cls_id = classes.index(cls)
    xmlbox = obj.find('bndbox')
    b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
    bb = convert((w,h), b)
    out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()

for year, image_set in sets:
if not os.path.exists(‘VOCdevkit/VOC%s/labels/’%(year)):
os.makedirs(‘VOCdevkit/VOC%s/labels/’%(year))
image_ids = open(‘VOCdevkit/VOC%s/ImageSets/Main/%s.txt’%(year, image_set)).read().strip().split()
list_file = open(’%s_%s.txt’%(year, image_set), ‘w’)
for image_id in image_ids:
list_file.write(’%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n’%(wd, year, image_id))
convert_annotation(year, image_id)
list_file.close()

os.system(“cat 2007_train.txt 2007_val.txt > train.txt”)
os.system(“cat 2007_train.txt 2007_val.txt 2007_test.txt > train.all.txt”)

修改完成后,再运行“darknet/scripts/voc_label.py”文件:
[root@localhost scripts]# python voc_label.py
在这里插入图片描述
成功运行后,
一、会在“darknet/scripts”目录下生成相应文件:
在这里插入图片描述
二、在“darknet/scripts/VOCdevkit/VOC2007/labels”文件夹下生成相应的文件:
在这里插入图片描述

11.4修改voc.data文件
修改“darknet/cfg/voc.data”文件:
classes= 1
train = /ph/darknet/scripts/train.txt
valid = /ph/darknet/scripts/2007_test.txt
names = data/voc.names
backup = backup
在这里插入图片描述
说明:
(1)、classes= 1,因为在“darknet/scripts/voc_label.py”文件内“classes = [“pig”]”只有一个类型,所以该处赋值为1:
在这里插入图片描述
(2)、其中“train、valid”属性赋值是运行“darknet/scripts/voc_label.py”文件后生成的绝对路径。
在这里插入图片描述

11.5修改voc.names文件
编辑“darknet/data/voc.names”文件,添加:pig。此处填写具体训练类型可以是一个或多个,如果为多个类型则每个类型独占1行即可。因为我这里只需要一个类型pig,所以配置如下图:
[root@localhost data]# chmod 777 voc.names
[root@localhost data]# vi voc.names
在这里插入图片描述

11.6修改darknet.c源码
为了与前面配置文件完全对一个,在“darknet/examples/darknet.c”文件中修改:将"cfg/coco.data"修改为"cfg/voc.data"。
修改前:
在这里插入图片描述
修改后为:
在这里插入图片描述

11.7修改detector.c源码
为了更清晰地显示最终结果,则需要修改“darknet/examples/detector.c”文件。
增加printfInfo_ph函数如下:
void printfInfo_ph(detection *dets, const int num, const float thresh, char **names, int classes){
int i,j;
char ch[50]={0};
printf("\n\nbegin–:\n");
int nTotall = 0;
for(i = 0; i < num; ++i){
for(j = 0; j < classes; ++j){
if (dets[i].prob[j] > thresh){
printf(“ph------%s: %f\n”, names[j], dets[i].prob[j]);
nTotall++;
}
}
}
sprintf(ch, “end. Totall=%d\n”, nTotall);
printf(ch);
}
在“test_detector”函数中的程序块“draw_detections、free_detections”之间插入该添加函数:
draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes);
printfInfo_ph(dets, nboxes, thresh, names, l.classes);
free_detections(dets, nboxes);
添加函数如下图:
在这里插入图片描述

调用该函数如下图(在test_detector函数中)
在这里插入图片描述

11.8修改yolov3-voc.cfg文件classes属性值
将“/darknet/cfg/yolov3-voc.cfg”文件每个“[yolo]”标签(共3处)下的“classes”属性赋予相应的值。
注意:该值必须与前面“voc_label.py、voc.names、voc.data”等多个文件定义的“classes”属性值保持完全一致。
第一处:
在这里插入图片描述

第二处:
在这里插入图片描述

第三处:
在这里插入图片描述

11.9修改yolov3-voc.cfg文件filters属性值
修改“darknet/cfg/yolov3-voc.cfg”文件每个“filters”属性值。
公式:filters =(classes数目 + 5)*3。
我的filters =(1 + 5)*3=18。因为我的训练类型只有一个“pig”(见前面的详细配置相应文件即过程)。即将“yolov3-voc.cfg”文件内的每个“filters”属性值设为18。共好几十处地方需要修改。
在这里插入图片描述

11.10开始训练
11.10.1执行原始训练命令。
(1)、指定GPU
因为我训练用的计算机是图形化工作站ThinkPad W530,有2块显卡,但第二块才是NVIDIA,所以我用如下命令:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpu 1 >>log.txt

(2)、利用多个GPU
如果有多个GPU,则可以用如下命令:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpu 0,1 >>log.txt

训练完成后会在“darknet/backup”目录下生成相应的训练文件:
在这里插入图片描述

11.10.2断点重新训练
如果从某次断了重新开始训练,只需要把 darknet53.conv.74 换成你的某一次的weights即可
即把命令行中的参数darknet53.conv.74改成相应weights即可

12.写在最后的话
我踩过很多坑,当然也获得过了很多网友的帮助,其中我引用了的基本都保持了原链接,有些可能也搞忘了链接,希望被引用了的但本人未提供链接的请原谅。具体编译情况也可能与具体环境不同而不同。但大多数都是我的原创。念在本人整理本文档确实不易,不喜勿喷。如果有人遇到问题欢迎给我发邮件:haoyun_ph@163.com,可能我回复不太及时,望谅。
最后的最后,强烈建议用GPU训练,因为CPU训练它真的没法与GPU比,速度太那个啥了。我

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值