YOLO: Real-Time Object Detection

1、下载yolo权重文件

mkdir model  #新建文件夹放权重文件
cd model
wget https://pjreddie.com/media/files/yolov3.weights

2、测试图片

执行命令

./darknet detect cfg/yolov3.cfg model/yolov3.weights data/dog.jpg

结果显示

data/dog.jpg: Predicted in 0.048545 seconds.
dog: 100%
truck: 92%
bicycle: 99%

  • 问题:
CUDA Error: out of memory
darknet: ./src/cuda.c:36: check_error: Assertion é0' failed.

修改 yolov3.cfg中的参数,注释掉training,启用testing参数。

# Testing
batch=1
subdivisions=1
# Training
# batch=32
# subdivisions=16

3、利用摄像头进行目标检测

执行命令

./darknet detector demo cfg/coco.data cfg/yolov3.cfg model/yolov3.weights 

  • 视频流检测的前提是正确安装opencv
wget https://codeload.github.com/opencv/opencv/zip/refs/tags/4.6.0
unzip 4.6.0
mv opencv-4.6.0 opencv
cd opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES -D CMAKE_INSTALL_PREFIX=/usr/local/opencv4 WITH_GTK=ON ..
sudo make install

编译成功后,开始配置opencv。sudo find / -iname opencv4.pc查找opencv4.pc的路径,并添加到sudo vim /etc/profile.d/pkgconfig.sh 中:

[sudo] guo 的密码: 
find: ‘/run/user/1000/doc’: 权限不够
find: ‘/run/user/1000/gvfs’: 权限不够
/home/guo/opencv/build/unix-install/opencv4.pc
/usr/local/opencv4/lib/pkgconfig/opencv4.pc

source /etc/profile之后验证一下 pkg-config --libs opencv4

-L/usr/local/opencv4/lib -lopencv_gapi -lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
  • 编译出现的问题1 记得修改makefile中48/49行,opencv改成opencv4
LDFLAGS+= `pkg-config --libs opencv4` -lstdc++
COMMON+= `pkg-config --cflags opencv4` 
  • 编译出现的问题2
./src/image_opencv.cpp:12:1: error: ‘IplImage’ 报错

这个是由于opencv版本问题导致,修改src/image_opencv.cpp文件,用下面的内容替换:

---
title: darknet测试yolo
top_img: 'https://pjreddie.com/media/image/yologo_2.png'
cover: 'https://pjreddie.com/media/image/yologo_2.png'
categories: AI
tags:
  - darknet
  - yolo
abbrlink: 38432
date: 2022-12-10 00:16:53

---

> YOLO: Real-Time Object Detection

<!--more-->

#### 1、下载yolo权重文件

```shell
mkdir model  #新建文件夹放权重文件
cd model
wget https://pjreddie.com/media/files/yolov3.weights
```

#### 2、测试图片

执行命令

```shell
./darknet detect cfg/yolov3.cfg model/yolov3.weights data/dog.jpg
```

![](./darknet测试yolo/dog.jpg)
结果显示

```shell
data/dog.jpg: Predicted in 0.048545 seconds.
dog: 100%
truck: 92%
bicycle: 99%
```

![](./darknet测试yolo/predictions.jpg)

- 问题:

```shell
CUDA Error: out of memory
darknet: ./src/cuda.c:36: check_error: Assertion é0' failed.
```

修改``` yolov3.cfg```中的参数,注释掉training,启用testing参数。

```shell
# Testing
batch=1
subdivisions=1
# Training
# batch=32
# subdivisions=16
```

#### 3、利用摄像头进行目标检测

执行命令

```shell
./darknet detector demo cfg/coco.data cfg/yolov3.cfg model/yolov3.weights 
```

![](./darknet测试yolo/vedeotest.gif)

- 视频流检测的前提是正确安装opencv

```
wget https://codeload.github.com/opencv/opencv/zip/refs/tags/4.6.0
unzip 4.6.0
mv opencv-4.6.0 opencv
cd opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES -D CMAKE_INSTALL_PREFIX=/usr/local/opencv4 WITH_GTK=ON ..
sudo make install
```

编译成功后,开始配置opencv。```sudo find / -iname opencv4.pc```查找opencv4.pc的路径,并添加到```sudo vim /etc/profile.d/pkgconfig.sh ```中:

```shell
[sudo] guo 的密码: 
find: ‘/run/user/1000/doc’: 权限不够
find: ‘/run/user/1000/gvfs’: 权限不够
/home/guo/opencv/build/unix-install/opencv4.pc
/usr/local/opencv4/lib/pkgconfig/opencv4.pc
```

```source /etc/profile```之后验证一下``` pkg-config --libs opencv4```

```shell
-L/usr/local/opencv4/lib -lopencv_gapi -lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
```

- 编译出现的问题1
  记得修改```makefile```中48/49行,opencv改成opencv4

```shell
LDFLAGS+= `pkg-config --libs opencv4` -lstdc++
COMMON+= `pkg-config --cflags opencv4` 
```


- 编译出现的问题2

```shell
./src/image_opencv.cpp:12:1: error: ‘IplImage’ 报错
```

这个是由于opencv版本问题导致,修改```src/image_opencv.cpp```文件,用下面的内容替换:

```shell
#ifdef OPENCV

#include "stdio.h"
#include "stdlib.h"
#include "opencv2/opencv.hpp"
#include "image.h"

using namespace cv;

extern "C" {

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

    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);
            }
        }
    }

    free_image(copy);
    return m;
}

image mat_to_image(Mat m)
{
    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.;
            }
        }
    }
    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
```