From 99221e4721a1246883465c2b52fbff14eb9aaa7a Mon Sep 17 00:00:00 2001
From: pans <pansen626@sina.com>
Date: 星期六, 30 三月 2019 12:12:02 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/yangwu1.3' into yangwu1.3
---
QiaoJiaSystem/YoloServer/DnDetect.cpp | 164 ++++++++++++++++++++++++++++++++----------------------
1 files changed, 98 insertions(+), 66 deletions(-)
diff --git a/QiaoJiaSystem/YoloServer/DnDetect.cpp b/QiaoJiaSystem/YoloServer/DnDetect.cpp
index 498ba0f..61ad8b0 100644
--- a/QiaoJiaSystem/YoloServer/DnDetect.cpp
+++ b/QiaoJiaSystem/YoloServer/DnDetect.cpp
@@ -1,90 +1,92 @@
+#include <basic/util/app/AppPreference.hpp>
#include "DnDetect.h"
-DnDetect::DnDetect(const int gpuIndex):m_net(nullptr),m_thresh(0.5),m_hier_thresh(0.5),m_nms(0.45),names(nullptr),alphabet(nullptr)
-{
- cuda_set_device(gpuIndex);
-
- char *datacfg = "cfg/coco.data";
- char *cfgfile = "cfg/yolov3.cfg";
- char *weightfile = "./yolov3.weights";
-
- double loadtime = what_time_is_it_now();
- list *options = read_data_cfg(datacfg);
- char *name_list = option_find_str(options, "names", "data/names.list");
- names = get_labels(name_list);
-
- alphabet = load_alphabet();
- m_net = load_network(cfgfile, weightfile, 0);
- set_batch_network(m_net, 1);
- printf("load mod use %f seconds.\n", what_time_is_it_now()-loadtime);
-
- srand(2222222);
- double attime;
- float nms=.45;
-}
-
-DnDetect::~DnDetect()
-{
+DnDetect::DnDetect::DnDetect(const int gpuIndex) : m_net(nullptr), m_thresh(0.5), m_hier_thresh(0.5), m_nms(0.45),
+ names(nullptr), alphabet(nullptr), m_thdInit(init, this),
+ m_bInitThd(false) {
}
-std::vector<cv::Rect2f> DnDetect::detect(cv::Mat & img)
-{
+DnDetect::DnDetect::~DnDetect() {
- double bttime=what_time_is_it_now();
+}
+
+std::vector<DnDetect::YoloObjInfo> DnDetect::DnDetect::detect(cv::Mat &img) {
+ std::lock_guard<std::mutex> dataGuard(dataMtx);
+
+ ClockTimer cl("DnDetect::DnDetect");
+ std::vector<YoloObjInfo> objInfos;
+ if (!m_bInitThd) return objInfos;
+ double bttime = what_time_is_it_now();
image im = matToImg(img);
+// DBG("matToImg : "<<what_time_is_it_now()-bttime);
+// printf("matToImg %f seconds.\n", what_time_is_it_now()-bttime);
image sized = letterbox_image(im, m_net->w, m_net->h);
- layer l = m_net->layers[m_net->n-1];
+ layer l = m_net->layers[m_net->n - 1];
float *X = sized.data;
- //attime=what_time_is_it_now();
+ //attime=what_time_is_it_now();p->
network_predict(m_net, X);
//printf("Predicted in %f seconds.\n", what_time_is_it_now()-attime);
int nboxes = 0;
- detection *dets = get_network_boxes(m_net, im.w, im.h, 0.5f, 0.1f, 0, 1, &nboxes);
- if (m_nms) do_nms_sort(dets, nboxes, l.classes, m_nms);
- // draw_detections(im, dets, nboxes, m_thresh, names, alphabet, l.classes);
- std::vector<cv::Rect2f> rects;
- for(int i=0;i<nboxes;i++)
+
+ detection *dets;
+
{
+// std::lock_guard<std::mutex> dataGuard(dataMtx);
+// dataMtx.lock();
+ dets = get_network_boxes(m_net, im.w, im.h, m_thresh, m_hier_thresh, 0, 1, &nboxes);
+ if (nboxes > 100) {
+// dataMtx.unlock();
+ return objInfos;
+ }
+ if (m_nms) do_nms_sort(dets, nboxes, l.classes, m_nms);
+// dataMtx.unlock();
+ }
+
+ // draw_detections(im, dets, nboxes, m_thresh, names, alphabet, l.classes);
+ for (int i = 0; i < nboxes; i++) {
+ YoloObjInfo objInfo;
std::vector<float> vec(80);
- memcpy(&vec[0],dets[i].prob,sizeof(float)*80);
+ memcpy(&vec[0], dets[i].prob, sizeof(float) * 80);
int type = -1;
- for(int j = 0; j < l.classes; ++j){
- if(j != 0){
+ for (int j = 0; j < l.classes; ++j) {
+//#todo new func in list out bool
+ if (j != 0) {
continue;
}
- if (dets[i].prob[j] > m_thresh){
+//#todo get score
+ if (dets[i].prob[j] > 0.0f) {
if (type < 0) {
type = j;
+ objInfo.prob = dets[i].prob[j];
} else {
}
- } else{
+ } else {
}
}
- if(type >= 0){
- if(type != 0){
- continue;
- }
- float left = (dets[i].bbox.x-dets[i].bbox.w/2.);
- float top = (dets[i].bbox.y-dets[i].bbox.h/2.);
- cv::Rect2f rect(left,top,dets[i].bbox.w,dets[i].bbox.h);
- std::cout<<"rect.x : "<<left<<" rect.y : "<<top<<" rect.w : "<<rect.width<<" rect.h : "<<rect.height<<std::endl;
- rects.push_back(rect);
+ if (type >= 0) {
+// if(type != 0){
+// continue;
+// }
+ objInfo.type = type;
+ objInfo.rcObj.left = (dets[i].bbox.x - dets[i].bbox.w / 2.);
+ objInfo.rcObj.top = (dets[i].bbox.y - dets[i].bbox.h / 2.);
+ objInfo.rcObj.right = (dets[i].bbox.x + dets[i].bbox.w / 2.);
+ objInfo.rcObj.bottom = (dets[i].bbox.y + dets[i].bbox.h / 2.);
+ objInfos.push_back(objInfo);
}
-
-
}
free_detections(dets, nboxes);
// show_image(im, "Video");
// cv::waitKey(10);
free_image(im);
free_image(sized);
- printf("all time use %f seconds.\n", what_time_is_it_now()-bttime);
- return rects;
+ //printf("all time use %f seconds.\n", what_time_is_it_now()-bttime);
+ return objInfos;
}
-image DnDetect::matToImg(cv::Mat& RefImg) {
+image DnDetect::DnDetect::matToImg(cv::Mat &RefImg) {
CV_Assert(RefImg.depth() == CV_8U);
int h = RefImg.rows;
@@ -92,23 +94,28 @@
int channels = RefImg.channels();
image im = make_image(w, h, 3);
int count = 0;
- switch(channels){
- case 1:{
+ switch (channels) {
+ case 1: {
cv::MatIterator_<unsigned char> it, end;
- for (it = RefImg.begin<unsigned char>(), end = RefImg.end<unsigned char>(); it != end; ++it){
- im.data[count] = im.data[w*h + count] = im.data[w*h*2 + count] = (float)(*it)/255.0;
-
+ for (it = RefImg.begin<unsigned char>(), end = RefImg.end<unsigned char>(); it != end; ++it) {
+ im.data[count] = im.data[w * h + count] = im.data[w * h * 2 + count] = (float) (*it) / 255.0;
++count;
}
break;
}
- case 3:{
- cv::MatIterator_<cv::Vec3b> it, end;
- for (it = RefImg.begin<cv::Vec3b>(), end = RefImg.end<cv::Vec3b>(); it != end; ++it){
- im.data[count] = (float)(*it)[2]/255.0;
- im.data[w*h + count] = (float)(*it)[1]/255.0;
- im.data[w*h*2 + count] = (float)(*it)[0]/255.0;
- ++count;
+ case 3: {
+ float *desData = im.data;
+ uchar *srcData = RefImg.data;
+
+ int size = w * h;
+ int size2 = size * 2;
+ for (int i = 0; i < size; i++) {
+ *(desData) = *(srcData + 2) / 255.0f;
+ *(desData + size) = *(srcData + 1) / 255.0f;
+ *(desData + size2) = *(srcData) / 255.0f;
+
+ desData++;
+ srcData += 3;
}
break;
}
@@ -119,3 +126,28 @@
}
return im;
}
+
+int DnDetect::DnDetect::init(void *arg) {
+ DnDetect *p = (DnDetect *) arg;
+
+ p->m_thresh = appPref.getFloatData("thresh.detect");
+ cuda_set_device(appPref.getIntData("gpu.index"));
+
+ char *datacfg = "cfg/coco.data";
+ char *cfgfile = "cfg/yolov3.cfg";
+ char *weightfile = "./yolov3.weights";
+
+ double loadtime = what_time_is_it_now();
+ list *options = read_data_cfg(datacfg);
+ char *name_list = option_find_str(options, "names", "data/names.list");
+ p->names = get_labels(name_list);
+
+ p->alphabet = load_alphabet();
+ p->m_net = load_network(cfgfile, weightfile, 0);
+ set_batch_network(p->m_net, 1);
+ printf("load mod use %f seconds.\n", what_time_is_it_now() - loadtime);
+
+ srand(2222222);
+ p->m_bInitThd = true;
+ return 0;
+}
--
Gitblit v1.8.0