当前位置: 首页 > article >正文

Yolo v4 (Darknet) Mac M2 安装与运行

Yolo v4 (Darknet) Mac M2 安装与运行

源代码(有官方教程,大家有兴趣也可直接去里面看部署流程):AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet )

环境安装

brew

Homebrew — The Missing Package Manager for macOS (or Linux)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

PyTorch

由于是 Mac,这里的PyTorchCPU版本

pip3 install torch torchvision torchaudio

安装慢的话可以尝试添加镜像

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision torchaudio 

OpenCV

brew install opencv

如果以上命令报错,可以尝试先upgrade一下brew,命令如下:

brew upgrade

或者一些版本相对旧brew也可以尝试

brew install opencv@2

Darknet 部署

git clone https://github.com/AlexeyAB/darknet
cd darknet
mkdir build_release
cd build_release
cmake .. -DENABLE_CUDA=OFF
cmake --build . --target install --parallel 8

Weights下载:yolov4.weights,复制到darknet即可

测试运行

darknet项目目录下,终端运行

./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights data/dog.jpg -i 0 -thresh 0.25

终端输出类似

 GPU isn't used 
 OpenCV version: 4.11.0
mini_batch = 1, batch = 8, time_steps = 1, train = 0 
   layer   filters  size/strd(dil)      input                output
   0 conv     32       3 x 3/ 1    608 x 608 x   3 ->  608 x 608 x  32 0.639 BF
   1 conv     64       3 x 3/ 2    608 x 608 x  32 ->  304 x 304 x  64 3.407 BF
   2 conv     64       1 x 1/ 1    304 x 304 x  64 ->  304 x 304 x  64 0.757 BF
   3 route  1 		                           ->  304 x 304 x  64 
   4 conv     64       1 x 1/ 1    304 x 304 x  64 ->  304 x 304 x  64 0.757 BF
   5 conv     32       1 x 1/ 1    304 x 304 x  64 ->  304 x 304 x  32 0.379 BF
   6 conv     64       3 x 3/ 1    304 x 304 x  32 ->  304 x 304 x  64 3.407 BF
   7 Shortcut Layer: 4,  wt = 0, wn = 0, outputs: 304 x 304 x  64 0.006 BF
   8 conv     64       1 x 1/ 1    304 x 304 x  64 ->  304 x 304 x  64 0.757 BF
   9 route  8 2 	                           ->  304 x 304 x 128 
  10 conv     64       1 x 1/ 1    304 x 304 x 128 ->  304 x 304 x  64 1.514 BF
  11 conv    128       3 x 3/ 2    304 x 304 x  64 ->  152 x 152 x 128 3.407 BF
  12 conv     64       1 x 1/ 1    152 x 152 x 128 ->  152 x 152 x  64 0.379 BF
  13 route  11 		                           ->  152 x 152 x 128 
  14 conv     64       1 x 1/ 1    152 x 152 x 128 ->  152 x 152 x  64 0.379 BF
  15 conv     64       1 x 1/ 1    152 x 152 x  64 ->  152 x 152 x  64 0.189 BF
  16 conv     64       3 x 3/ 1    152 x 152 x  64 ->  152 x 152 x  64 1.703 BF
  17 Shortcut Layer: 14,  wt = 0, wn = 0, outputs: 152 x 152 x  64 0.001 BF
  18 conv     64       1 x 1/ 1    152 x 152 x  64 ->  152 x 152 x  64 0.189 BF
  19 conv     64       3 x 3/ 1    152 x 152 x  64 ->  152 x 152 x  64 1.703 BF

	....

并弹出预测图像

预测图像

部署成功!!

可能遇到的问题

opencv.pc

当使用brew install opencv可能会出现这个问题

解决方法:

  • 进入文件夹/opt/homebrew/Cellar/opencv/[opencv版本号]/lib/pkgconfig
  • 重命名文件夹内的文件为opencv.pc

OpenCV 4.x+ requires enabled C++11 support

解决方法:

  • 打开项目文件下的Makefile

  • 修改Makefile内容

# 删除原来 CPP=.... 的内容, 替换为下面这一句
CPP=g++ -std=c++11

./src/image_opencv.cpp:12:1: fatal error: unknown type name IplImage

解决方法:

  • 修改项目文件下的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 *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[y*step + x*im.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);
    int x, y, c;
    Mat m = Mat(Size(im.w, im.h), CV_8UC(im.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 = copy.data[c*im.h*im.w + y * im.w + x];
                m.data[y*step + x * im.c + c] = (unsigned char)(val * 255);
            }
        }
    }
/*    IplImage *ipl = image_to_ipl(copy);
    Mat m = cvarrToMat(ipl, true);
    cvReleaseImage(&ipl);*/
    free_image(copy);
    return m;
}

image mat_to_image(Mat m)
{
/*    IplImage ipl = m;
    image im = ipl_to_image(&ipl);
    rgbgr_image(im);*/
    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.;
            }
        }
    }
    if (im.c == 3) 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(c);
    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

参考链接

安装darknet 依赖 opencv4时报错的解决方法


http://www.kler.cn/a/589820.html

相关文章:

  • 前端UnoCSS面试题及参考答案
  • Forward Looking Radar Imaging by Truncated Singular Value Decomposition 论文阅读
  • gitlab将本地项目提交到远程dev分支
  • 【JAVA】深入浅出理解Comparator 和 Comparable接口
  • 【免费】怎么将MP4转换为GIF,如何在线实现多媒体文件格式互转
  • 【网络】数据流(Data Workflow)Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件)
  • 【004】deepseek本地化部署后,python的调用方式_#py
  • 【虚幻C++笔记】TArray,TMap,TSet容器
  • QListView、QListWidget、QTableView和QTableWidget
  • 【MySQL】MySQL是如何处理请求的?
  • JMeter 性能测试
  • P41-指针进阶1、2
  • 基于 YOLOv8 和 PyQt5 的火焰、烟雾检测
  • Grokking System Design 系统设计面试问题
  • 用UML搞懂ASPICE(6)过程能力确定的能力维度
  • [蓝桥杯 2023 省 B] 飞机降落
  • WinForm基础知识1-20
  • Unity Google登录
  • 深入解析音频编解码器(Audio CODEC):硬件、接口与驱动开发
  • WireShark自动抓包