Mac/Linux上编译支持视频输入的YOLOv3程序

Mac/Linux上编译支持视频输入的YOLOv3程序

YOLOv3介绍:https://pjreddie.com/darknet/yolo/#demo

一、支持图片检测的编译步骤(官网)

图片检测只需要按照页面提示编译即可。

# 下载项目
git clone https://github.com/pjreddie/darknet
# 进入文件夹
cd darknet
# 编译,会输出"darknet","darknet.a","darknet.so"文件
make
# 下载权重文件
wget https://pjreddie.com/media/files/yolov3.weights
# 执行检测,项目文件夹下会输出检测图片"predictions.png"文件
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

二、支持视频输入的编译步骤

视频检测命令示例是

# 摄像头输入
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
# 视频文件输入
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

需要OpenCV的支持,因此先编译安装OpenCV。

1.编译安装OpenCV

OpenCV编译步骤(Linux、Mac均可)

# 下载项目
git clone  clone https://github.com/opencv/opencv.git
# 进入目录
cd opencv
# 创建编译目录
mkdir build
# 进入编译目录
cd build
# 创建编译文件(其他参数未实践) 
# 我是在cmake-gui上设置的,“BUILD_PNG”建议重新勾选以保证生效
cmake -DOPENCV_GENERATE_PKGCONFIG:BOOL="1" -DBUILD_PNG:BOOL="1" .
# 编译
make
# 安装
make install

参数介绍:
“OPENCV_GENERATE_PKGCONFIG”:生成 "opencv*.pc"文件,以便其他项目编译时正确导入文件和编译参数;
“BUILD_PNG”:内部libpng编译,防止调用时libpng版本不一致。

我是记录下OpenCV安装路径的,把编译输出文件放到了"darknet"项目下,这样就可以直接引用,防止不确定导入环境引起不必要的麻烦。
找到编译输出路径"/usr/local/Cellar/opencv/4.5.5_1",复制为"darknet/opencv",Linux路径类似。

2.编译YOLOv3

YOLOv3编译步骤:

# 下载项目
git clone https://github.com/pjreddie/darknet.git
# 进入目录
cd darknet
# 修改编译配置 # 修改内容见下文
vim MakeFile
# 修改源文件 # 修改内容见下文
vim src/image_opencv.cpp
# 编译
make
# 执行
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

修改编译配置:添加c++编译,替换OpenCV引入路径,启用类型转换代码

# vim MakeFile

# 启用OpenCV
GPU=0
CUDNN=0
# OPENCV=0
OPENCV=1
OPENMP=0
DEBUG=0

# 替换引入路径
ifeq ($(OPENCV), 1) 
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
# 先执行”pkg-config --libs opencv“然后替换为对应路径
# LDFLAGS+= `pkg-config --libs opencv` -lstdc++
LDFLAGS += -Lopencv/lib -lopencv_world -lstdc++
# 先执行”pkg-config --cflags opencv“然后替换为对应路径
# COMMON+= `pkg-config --cflags opencv` 
COMMON  += -Iopencv/include/opencv4 
endif

# 修改g++编译命令
# "--std=c++11":”image_opencv.cpp“需要启用c++11
# "CV__ENABLE_C_API_CTORS":启用"image_opencv.cpp"中"IplImage"与”Mat“的转换
$(OBJDIR)%.o: %.cpp $(DEPS)
#	$(CPP) $(COMMON) $(CFLAGS) -c $< -o $@
	$(CPP) --std=c++11 -DCV__ENABLE_C_API_CTORS $(COMMON) $(CFLAGS) -c $< -o $@

修改源文件,不需要改代码,只需要添加头文件包含即可。
头文件包含直接搜索OpenCV输出文件添加进去即可,IplImage的转换在该类的定义下面。

// vim src/image_opencv.cpp
#include <opencv2/videoio/legacy/constants_c.h>  // CV_CAP_PROP_FRAME_WIDTH
#include <opencv2/highgui/highgui_c.h>  // CV_WND_PROP_FULLSCREEN
#include <opencv2/core/types_c.h> // IplImage
#include <opencv2/core/core_c.h>  // cvCreateImage
// image mat_to_image(Mat m){IplImage ipl = m;...} 需要在编译时定义"CV__ENABLE_C_API_CTORS"

这时候编译出的可执行文件就支持摄像头和视频文件的输出了。

YOLOv3编译及运行错误记录:

# 运行时提示不支持视频输入:没有打开OpenCV宏

# 需要启用c++11:添加编译参数

# 找不到函数引用:MakeFile中确定"-lstdc++"是否被误删除

# 找不到OpenCV链接库:刷新链接库缓存,或指定链接库路径

# CMake遇到错误不能继续:查看出错的模块,删除该模块的编译

# libpng版本不一致
./darknet detector demo cfg/coco.data yolov3-tiny.cfg yolov3-tiny.weights .mp4 
libpng warning: Application built with libpng-1.4.12 but running with 1.6.37
Cannot load image "data/labels/32_0.png"

猜你喜欢

转载自blog.csdn.net/u012101384/article/details/124322317