百度AIstudio服务器实现yolo3批量图片测试保存

北慕城南 提交于 2020-08-14 12:04:58

在aistudio服务器上配置深度学习环境

本文采用的百度aistudio服务器配置为NVIDIA-SMI 396.37+ubuntu16.04.1+cuda 9.0+cudnn 7.6.0

安装cuda9.0

wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda_9.0.176_384.81_linux-run
  1. 新建一个目录 : mkdir cuda-9.0
  2. 安装cuda :
sh cuda_9.0.176_linux-run --silent --toolkit --toolkitpath=$HOME/cuda-9.0 (HOME改为自己的路径)

配置cuda环境

  1. 使用 vi ~/.bashrc 命令行打开环境配置文件
  2. 在文件末尾添加(注意路径是否需要修改)
export PATH=/home/aistudio/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/home/aistudio/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
  1. source ~/.bashrc使环境配置文件生效

安装cudnn

  1. 下载cudnn
    CUDA的下载地址:https://developer.nvidia.com/rdp/cudnn-archive.
    随便选择一个与cuda 9.0向对应的版本
    在这里插入图片描述
    然后进去下载第一个以.tgz为后缀的Linux包
    在这里插入图片描述




  2. 通过新建数据集,将压缩包上传到百度aistudio服务器的data/目录下,由于上传数据集有名字长度要求,名字尽量短。
  3. 然后通过命令解压缩
tar -zxvf /home/aistudio/data/data25688/cudnn.tgz
  1. 将cudnn中的指定文件copy到之前安装的cuda-9.0文件夹中
cp /home/aistudio/cudnn/cuda/include/cudnn.h /home/aistudio/cuda-9.0/include/
cp /home/aistudio/cudnn/cuda/lib64/libcudnn* /home/aistudio/cuda-9.0/lib64/

安装opencv-3.4.0

接下来安装用于yolo3的opencv

  1. 下载安装包
    http://opencv.org/releases.html.
    选择opencv-3.4.0版本的source下载

  2. 安装opencv
unzip opencv-3.4.0.zip
cd opencv-3.4.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/home/aistudio/opencv_install ..
make -j8 (j后面的数字是cpu核数的两倍)
make install

等待opencv安装完毕
7. 配置opencv环境变量

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/aistudio/opencv_install/lib/pkgconfig
export LD_LIBRARY_PATH=/home/aistudio/opencv_install/lib:/home/aistudio/opencv-3.4.0/build/lib
source ~/.bashrc

下载yolo3

yolo3的官网 https://pjreddie.com/darknet/yolo/.
里面有一些简单测试图片的教程
首先从GitHub上下载项目

git clone https://github.com/pjreddie/darknet
cd darknet
make

下载yolo3官网训练好的权重参数

wget https://pjreddie.com/media/files/yolov3.weights

使用GPU和opencv的yolo3

打开配置文件

vim Makefile

输入i对文档进行编辑,将前三行都改为1
在这里插入图片描述
同时文档中还有几处需要修改为自己相应的路径

ARCH= -gencode arch=compute_70,code=[sm_70,compute_70]
NVCC=/home/aistudio/cuda-9.0/bin/nvcc

在这里插入图片描述

/home/aistudio/cuda-9.0/include/
/home/aistudio/cuda-9.0/lib64

编辑好Makefile后输入esc键退出编辑模式,然后键入:wq保存并退出文档
然后输入make生成文件

make

使用yolo3实现单张图片测试

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

使用yolo3实现图片批量测试保存

修改detector.c文件

首先修改darknet/examples路径下的detector.c文件中的test_detector函数,使用以下函数替换,(其中有三处路径需要修改)

void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen)
{
    list *options = read_data_cfg(datacfg);
    char *name_list = option_find_str(options, "names", "data/names.list");
    char **names = get_labels(name_list);
    image **alphabet = load_alphabet();
    network *net = load_network(cfgfile, weightfile, 0);
    set_batch_network(net, 1);
    srand(2222222);
    double time;
    char buff[256];
    char *input = buff;
    float nms=.45;
    int i=0;
    while(1){
        if(filename){
            strncpy(input, filename, 256);
            image im = load_image_color(input,0,0);
            image sized = letterbox_image(im, net->w, net->h);
            layer l = net->layers[net->n-1];
            float *X = sized.data;
            time=what_time_is_it_now();
            network_predict(net, X);
            printf("%s: Predicted in %f seconds.\n", input, what_time_is_it_now()-time);
            int nboxes = 0;
            detection *dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes);
            if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
                draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes);
                free_detections(dets, nboxes);
            if(outfile)
             {
                save_image(im, outfile);
             }
            else{
                save_image(im, "predictions");
            }
            free_image(im);
            free_image(sized);
            if (filename) break;
         } 
        else {
            printf("Enter Image Path: ");
            fflush(stdout);
            input = fgets(input, 256, stdin);
            if(!input) return;
            strtok(input, "\n");
            list *plist = get_paths(input);
            char **paths = (char **)list_to_array(plist);
            printf("Start Testing!\n");
            int m = plist->size;
            if(access("/home/FENGsl/darknet/data/out",0)==-1)//"/home/FENGsl/darknet/data"修改成自己的路径
            {
              if (mkdir("/home/FENGsl/darknet/data/out",0777))//"/home/FENGsl/darknet/data"修改成自己的路径
               {
                 printf("creat file bag failed!!!");
               }
            }
            for(i = 0; i < m; ++i){
             char *path = paths[i];
             image im = load_image_color(path,0,0);
             image sized = letterbox_image(im, net->w, net->h);
        layer l = net->layers[net->n-1];
        float *X = sized.data;
        time=what_time_is_it_now();
        network_predict(net, X);
        printf("Try Very Hard:");
        printf("%s: Predicted in %f seconds.\n", path, what_time_is_it_now()-time);
        int nboxes = 0;
        detection *dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes);
        if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
        draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes);
        free_detections(dets, nboxes);
        if(outfile){
            save_image(im, outfile);
        }
        else{
             char b[2048];
             sprintf(b,"/home/FENGsl/darknet/data/out/%s",GetFilename(path));//"/home/FENGsl/darknet/data"修改成自己的路径
             save_image(im, b);
             printf("save %s successfully!\n",GetFilename(path));
        }
        free_image(im);
        free_image(sized);
        if (filename) break;
        }
      }
    }
}

然后在detector.c文件的开头加入函数

char *GetFilename(char *p)
{ 
    static char name[20]={""};
    char *q = strrchr(p,'/') + 1;
    strncpy(name,q,4);//注意后面的6,如果你的测试集的图片的名字字符(不包括后缀)是其他长度,请改为你需要的长度(官方的默认的长度是6)
    return name;
}

在darknet下重新make

创建检测图片路径的txt文件

首先在windonws下生成包含图片路径的txt文件

import os
data_path = 'C:/Users/Apple/Desktop/test3' #包含图片的文件夹路径
img_names = os.listdir(data_path)
list_file = open('C:/Users/Apple/Desktop/test1.txt', 'w')#创建的txt文件路径

for img_name in img_names:
    list_file.write('/home/aistudio/test3/%s\n'%img_name) #要生成的图片路径名   
list_file.close()

这时一定不要直接copy到linux服务器上,要先使用notepad++转换格式,否则会报错。
进入notepad++,选择菜单栏中的View->Show Symbol->Show All Characters,可以看到目前的格式
在这里插入图片描述
然后选择菜单栏中Edit->EOL Conversion->Unix(LF),文档格式改变为
在这里插入图片描述
保存文档上传到服务器




批量检测

./darknet detect cfg/yolov3.cfg yolov3.weights

在这里插入图片描述
输入test.txt则可实现批量检测及保存

编译过程中遇到的问题报错

【"annot load image "/home/aistudio/test/test2/0001.jpg】
“cannot load image”可能有两方面原因,一是图片路径有错误,另外就是包含路径的.txt文件格式有问题。

【检测生成的图片中没有框】
可以将darknet的Makefile中的cudnn置为0,这样可以保证一定的速度;还可以将gpu和cudnn全部置为0,这样完全使用cpu速度较慢。注意修改完以后要重新make进行编译。

参考

https://blog.csdn.net/mieleizhi0522/article/details/79989754.
https://blog.csdn.net/firesolider/article/details/105023062

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!