1.生成so
- 修改Makefile配置,因为目标机器没有GPU,故使用cpu版本
- GPU=0
CUDNN=0
CUDNN_HALF=0
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1 - 在darknet目录执行
make
,在该目录下生成libdarknet.so,大小为1.5M
2.代码
#include <iostream>
#include <opencv2/opencv.hpp>
#include "darknet.h"
image mat_to_image(cv::Mat mat)
{
int w = mat.cols;
int h = mat.rows;
int c = mat.channels();
image im = make_image(w, h, c);
unsigned char *data = (unsigned char *)mat.data;
int step = mat.step;
for (int y = 0; y < h; ++y)
{
for (int k = 0; k < c; ++k)
{
for (int x = 0; x < w; ++x)
{
im.data[k * w * h + y * w + x] = data[y * step + x * c + k] / 255.0f;
}
}
}
return im;
}
int main()
{
char weight_file[255] = "/home/lwd/code/darknet/backup/yolov3-tiny_best.weights";
char cfg_file[255] = "/home/lwd/code/darknet/cfg/yolov3-tiny.cfg";
float nms = .45;
float thresh = 0.13;
network *net = load_network(cfg_file, weight_file, 0);
cv::Mat img = cv::imread("/home/lwd/data/candle/0820/image_raw/2526.jpg");
cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
image im = mat_to_image(img);
(*net).benchmark_layers = 0;
fuse_conv_batchnorm(*net);
calculate_binary_weights(*net);
image sized = resize_image(im, (*net).w, (*net).h);
layer l = (*net).layers[(*net).n - 1];
float *X = sized.data;
double time = get_time_point();
network_predict(*net, X);
int nboxes = 0;
detection *dets = get_network_boxes(net, im.w, im.h, thresh, 0.5, 0, 1, &nboxes, 0);
free_image(im);
free_image(sized);
if (nms)
{
if (l.nms_kind == DEFAULT_NMS)
do_nms_sort(dets, nboxes, l.classes, nms);
else
diounms_sort(dets, nboxes, l.classes, nms, l.nms_kind, l.beta_nms);
}
cv::cvtColor(img, img, cv::COLOR_RGB2BGR);
int i, j;
for (i = 0; i < nboxes; ++i)
{
int class_id = -1;
float prob = 0;
for (j = 0; j < l.classes; ++j)
{
if (dets[i].prob[j] > thresh && dets[i].prob[j] > prob)
{
prob = dets[i].prob[j];
class_id = j;
}
}
if (class_id >= 0)
{
std::cout << class_id << " " << dets[i].bbox.x << " " << dets[i].bbox.y << " " << dets[i].bbox.w
<< " " << dets[i].bbox.h << std::endl;
int x = dets[i].bbox.x * img.cols, y = dets[i].bbox.y * img.rows;
int w = dets[i].bbox.w * img.cols, h = dets[i].bbox.h * img.rows;
cv::rectangle(img, cv::Rect(x-w/2,y-h/2,w,h),cv::Scalar(255,0,0));
cv::putText(img, std::to_string(prob), cv::Point(x,y), cv::FONT_HERSHEY_PLAIN,1,cv::Scalar(0, 0, 255), 2);
}
}
cv::imshow("res", img);
cv::waitKey();
free_network(*net);
return 0;
}
3.CMAKE
cmake_minimum_required(VERSION 2.8.3)
project(deploy)
set(CMAKE_CXX_STANDARD 11)
find_package(OpenCV REQUIRED)
include_directories(
/home/lwd/code/darknet/include
${OpenCV_INCLUDE_DIRS}
)
add_executable(deploy src/deploy.cc)
target_link_libraries(deploy
${OpenCV_LIBRARIES}
/home/lwd/code/darknet/libdarknet.so
)