YoloObjectDetector.cpp
Go to the documentation of this file.
1 /*
2  * YoloObjectDetector.cpp
3  *
4  * Created on: Dec 19, 2016
5  * Author: Marko Bjelonic
6  * Institute: ETH Zurich, Robotic Systems Lab
7  */
8 
9 // yolo object detector
11 
12 // Check for xServer
13 #include <X11/Xlib.h>
14 
15 #ifdef DARKNET_FILE_PATH
16 std::string darknetFilePath_ = DARKNET_FILE_PATH;
17 #else
18 #error Path of darknet repository is not defined in CMakeLists.txt.
19 #endif
20 
21 namespace darknet_ros {
22 
23 char* cfg;
24 char* weights;
25 char* data;
27 
29  : nodeHandle_(nh), imageTransport_(nodeHandle_), numClasses_(0), classLabels_(0), rosBoxes_(0), rosBoxCounter_(0) {
30  ROS_INFO("[YoloObjectDetector] Node started.");
31 
32  // Read parameters from config file.
33  if (!readParameters()) {
35  }
36 
37  init();
38 }
39 
41  {
42  boost::unique_lock<boost::shared_mutex> lockNodeStatus(mutexNodeStatus_);
43  isNodeRunning_ = false;
44  }
45  yoloThread_.join();
46 }
47 
49  // Load common parameters.
50  nodeHandle_.param("image_view/enable_opencv", viewImage_, true);
51  nodeHandle_.param("image_view/wait_key_delay", waitKeyDelay_, 3);
52  nodeHandle_.param("image_view/enable_console_output", enableConsoleOutput_, false);
53 
54  // Check if Xserver is running on Linux.
55  if (XOpenDisplay(NULL)) {
56  // Do nothing!
57  ROS_INFO("[YoloObjectDetector] Xserver is running.");
58  } else {
59  ROS_INFO("[YoloObjectDetector] Xserver is not running.");
60  viewImage_ = false;
61  }
62 
63  // Set vector sizes.
64  nodeHandle_.param("yolo_model/detection_classes/names", classLabels_, std::vector<std::string>(0));
65  numClasses_ = classLabels_.size();
66  rosBoxes_ = std::vector<std::vector<RosBox_> >(numClasses_);
67  rosBoxCounter_ = std::vector<int>(numClasses_);
68 
69  return true;
70 }
71 
73  ROS_INFO("[YoloObjectDetector] init().");
74 
75  // Initialize deep network of darknet.
76  std::string weightsPath;
77  std::string configPath;
78  std::string dataPath;
79  std::string configModel;
80  std::string weightsModel;
81 
82  // Threshold of object detection.
83  float thresh;
84  nodeHandle_.param("yolo_model/threshold/value", thresh, (float)0.3);
85 
86  // Path to weights file.
87  nodeHandle_.param("yolo_model/weight_file/name", weightsModel, std::string("yolov2-tiny.weights"));
88  nodeHandle_.param("weights_path", weightsPath, std::string("/default"));
89  weightsPath += "/" + weightsModel;
90  weights = new char[weightsPath.length() + 1];
91  strcpy(weights, weightsPath.c_str());
92 
93  // Path to config file.
94  nodeHandle_.param("yolo_model/config_file/name", configModel, std::string("yolov2-tiny.cfg"));
95  nodeHandle_.param("config_path", configPath, std::string("/default"));
96  configPath += "/" + configModel;
97  cfg = new char[configPath.length() + 1];
98  strcpy(cfg, configPath.c_str());
99 
100  // Path to data folder.
101  dataPath = darknetFilePath_;
102  dataPath += "/data";
103  data = new char[dataPath.length() + 1];
104  strcpy(data, dataPath.c_str());
105 
106  // Get classes.
107  detectionNames = (char**)realloc((void*)detectionNames, (numClasses_ + 1) * sizeof(char*));
108  for (int i = 0; i < numClasses_; i++) {
109  detectionNames[i] = new char[classLabels_[i].length() + 1];
110  strcpy(detectionNames[i], classLabels_[i].c_str());
111  }
112 
113  // Load network.
114  setupNetwork(cfg, weights, data, thresh, detectionNames, numClasses_, 0, 0, 1, 0.5, 0, 0, 0, 0);
115  yoloThread_ = std::thread(&YoloObjectDetector::yolo, this);
116 
117  // Initialize publisher and subscriber.
118  std::string cameraTopicName;
119  int cameraQueueSize;
120  std::string objectDetectorTopicName;
121  int objectDetectorQueueSize;
122  bool objectDetectorLatch;
123  std::string boundingBoxesTopicName;
124  int boundingBoxesQueueSize;
125  bool boundingBoxesLatch;
126  std::string detectionImageTopicName;
127  int detectionImageQueueSize;
128  bool detectionImageLatch;
129 
130  nodeHandle_.param("subscribers/camera_reading/topic", cameraTopicName, std::string("/camera/image_raw"));
131  nodeHandle_.param("subscribers/camera_reading/queue_size", cameraQueueSize, 1);
132  nodeHandle_.param("publishers/object_detector/topic", objectDetectorTopicName, std::string("found_object"));
133  nodeHandle_.param("publishers/object_detector/queue_size", objectDetectorQueueSize, 1);
134  nodeHandle_.param("publishers/object_detector/latch", objectDetectorLatch, false);
135  nodeHandle_.param("publishers/bounding_boxes/topic", boundingBoxesTopicName, std::string("bounding_boxes"));
136  nodeHandle_.param("publishers/bounding_boxes/queue_size", boundingBoxesQueueSize, 1);
137  nodeHandle_.param("publishers/bounding_boxes/latch", boundingBoxesLatch, false);
138  nodeHandle_.param("publishers/detection_image/topic", detectionImageTopicName, std::string("detection_image"));
139  nodeHandle_.param("publishers/detection_image/queue_size", detectionImageQueueSize, 1);
140  nodeHandle_.param("publishers/detection_image/latch", detectionImageLatch, true);
141 
142  imageSubscriber_ = imageTransport_.subscribe(cameraTopicName, cameraQueueSize, &YoloObjectDetector::cameraCallback, this);
144  nodeHandle_.advertise<darknet_ros_msgs::ObjectCount>(objectDetectorTopicName, objectDetectorQueueSize, objectDetectorLatch);
146  nodeHandle_.advertise<darknet_ros_msgs::BoundingBoxes>(boundingBoxesTopicName, boundingBoxesQueueSize, boundingBoxesLatch);
148  nodeHandle_.advertise<sensor_msgs::Image>(detectionImageTopicName, detectionImageQueueSize, detectionImageLatch);
149 
150  // Action servers.
151  std::string checkForObjectsActionName;
152  nodeHandle_.param("actions/camera_reading/topic", checkForObjectsActionName, std::string("check_for_objects"));
153  checkForObjectsActionServer_.reset(new CheckForObjectsActionServer(nodeHandle_, checkForObjectsActionName, false));
154  checkForObjectsActionServer_->registerGoalCallback(boost::bind(&YoloObjectDetector::checkForObjectsActionGoalCB, this));
155  checkForObjectsActionServer_->registerPreemptCallback(boost::bind(&YoloObjectDetector::checkForObjectsActionPreemptCB, this));
157 }
158 
159 void YoloObjectDetector::cameraCallback(const sensor_msgs::ImageConstPtr& msg) {
160  ROS_DEBUG("[YoloObjectDetector] USB image received.");
161 
162  cv_bridge::CvImagePtr cam_image;
163 
164  try {
165  if (msg->encoding == "mono8" || msg->encoding == "bgr8" || msg->encoding == "rgb8") {
166  cam_image = cv_bridge::toCvCopy(msg, msg->encoding);
167  } else if ( msg->encoding == "bgra8") {
168  cam_image = cv_bridge::toCvCopy(msg, "bgr8");
169  } else if ( msg->encoding == "rgba8") {
170  cam_image = cv_bridge::toCvCopy(msg, "rgb8");
171  } else if ( msg->encoding == "mono16") {
172  ROS_WARN_ONCE("Converting mono16 images to mono8");
173  cam_image = cv_bridge::toCvCopy(msg, "mono8");
174  } else {
175  ROS_ERROR("Image message encoding provided is not mono8, mono16, bgr8, bgra8, rgb8 or rgba8.");
176  }
177  } catch (cv_bridge::Exception& e) {
178  ROS_ERROR("cv_bridge exception: %s", e.what());
179  return;
180  }
181 
182  if (cam_image) {
183  {
184  boost::unique_lock<boost::shared_mutex> lockImageCallback(mutexImageCallback_);
185  imageHeader_ = msg->header;
186  camImageCopy_ = cam_image->image.clone();
187  }
188  {
189  boost::unique_lock<boost::shared_mutex> lockImageStatus(mutexImageStatus_);
190  imageStatus_ = true;
191  }
192  frameWidth_ = cam_image->image.size().width;
193  frameHeight_ = cam_image->image.size().height;
194  }
195  return;
196 }
197 
199  ROS_DEBUG("[YoloObjectDetector] Start check for objects action.");
200 
202  sensor_msgs::Image imageAction = imageActionPtr->image;
203 
204  cv_bridge::CvImagePtr cam_image;
205 
206  try {
208  } catch (cv_bridge::Exception& e) {
209  ROS_ERROR("cv_bridge exception: %s", e.what());
210  return;
211  }
212 
213  if (cam_image) {
214  {
215  boost::unique_lock<boost::shared_mutex> lockImageCallback(mutexImageCallback_);
216  camImageCopy_ = cam_image->image.clone();
217  }
218  {
219  boost::unique_lock<boost::shared_mutex> lockImageCallback(mutexActionStatus_);
220  actionId_ = imageActionPtr->id;
221  }
222  {
223  boost::unique_lock<boost::shared_mutex> lockImageStatus(mutexImageStatus_);
224  imageStatus_ = true;
225  }
226  frameWidth_ = cam_image->image.size().width;
227  frameHeight_ = cam_image->image.size().height;
228  }
229  return;
230 }
231 
233  ROS_DEBUG("[YoloObjectDetector] Preempt check for objects action.");
234  checkForObjectsActionServer_->setPreempted();
235 }
236 
238  return (ros::ok() && checkForObjectsActionServer_->isActive() && !checkForObjectsActionServer_->isPreemptRequested());
239 }
240 
241 bool YoloObjectDetector::publishDetectionImage(const cv::Mat& detectionImage) {
242  if (detectionImagePublisher_.getNumSubscribers() < 1) return false;
243  cv_bridge::CvImage cvImage;
244  cvImage.header.stamp = ros::Time::now();
245  cvImage.header.frame_id = "detection_image";
247  cvImage.image = detectionImage;
249  ROS_DEBUG("Detection image has been published.");
250  return true;
251 }
252 
253 // double YoloObjectDetector::getWallTime()
254 // {
255 // struct timeval time;
256 // if (gettimeofday(&time, NULL)) {
257 // return 0;
258 // }
259 // return (double) time.tv_sec + (double) time.tv_usec * .000001;
260 // }
261 
263  int i;
264  int count = 0;
265  for (i = 0; i < net->n; ++i) {
266  layer l = net->layers[i];
267  if (l.type == YOLO || l.type == REGION || l.type == DETECTION) {
268  count += l.outputs;
269  }
270  }
271  return count;
272 }
273 
275  int i;
276  int count = 0;
277  for (i = 0; i < net->n; ++i) {
278  layer l = net->layers[i];
279  if (l.type == YOLO || l.type == REGION || l.type == DETECTION) {
280  memcpy(predictions_[demoIndex_] + count, net->layers[i].output, sizeof(float) * l.outputs);
281  count += l.outputs;
282  }
283  }
284 }
285 
286 detection* YoloObjectDetector::avgPredictions(network* net, int* nboxes) {
287  int i, j;
288  int count = 0;
289  fill_cpu(demoTotal_, 0, avg_, 1);
290  for (j = 0; j < demoFrame_; ++j) {
291  axpy_cpu(demoTotal_, 1. / demoFrame_, predictions_[j], 1, avg_, 1);
292  }
293  for (i = 0; i < net->n; ++i) {
294  layer l = net->layers[i];
295  if (l.type == YOLO || l.type == REGION || l.type == DETECTION) {
296  memcpy(l.output, avg_ + count, sizeof(float) * l.outputs);
297  count += l.outputs;
298  }
299  }
300  detection* dets = get_network_boxes(net, buff_[0].w, buff_[0].h, demoThresh_, demoHier_, 0, 1, nboxes);
301  return dets;
302 }
303 
305  running_ = 1;
306  float nms = .4;
307 
308  layer l = net_->layers[net_->n - 1];
309  float* X = buffLetter_[(buffIndex_ + 2) % 3].data;
310  float* prediction = network_predict(net_, X);
311 
313  detection* dets = 0;
314  int nboxes = 0;
315  dets = avgPredictions(net_, &nboxes);
316 
317  if (nms > 0) do_nms_obj(dets, nboxes, l.classes, nms);
318 
319  if (enableConsoleOutput_) {
320  printf("\033[2J");
321  printf("\033[1;1H");
322  printf("\nFPS:%.1f\n", fps_);
323  printf("Objects:\n\n");
324  }
325  image display = buff_[(buffIndex_ + 2) % 3];
326  draw_detections(display, dets, nboxes, demoThresh_, demoNames_, demoAlphabet_, demoClasses_);
327 
328  // extract the bounding boxes and send them to ROS
329  int i, j;
330  int count = 0;
331  for (i = 0; i < nboxes; ++i) {
332  float xmin = dets[i].bbox.x - dets[i].bbox.w / 2.;
333  float xmax = dets[i].bbox.x + dets[i].bbox.w / 2.;
334  float ymin = dets[i].bbox.y - dets[i].bbox.h / 2.;
335  float ymax = dets[i].bbox.y + dets[i].bbox.h / 2.;
336 
337  if (xmin < 0) xmin = 0;
338  if (ymin < 0) ymin = 0;
339  if (xmax > 1) xmax = 1;
340  if (ymax > 1) ymax = 1;
341 
342  // iterate through possible boxes and collect the bounding boxes
343  for (j = 0; j < demoClasses_; ++j) {
344  if (dets[i].prob[j]) {
345  float x_center = (xmin + xmax) / 2;
346  float y_center = (ymin + ymax) / 2;
347  float BoundingBox_width = xmax - xmin;
348  float BoundingBox_height = ymax - ymin;
349 
350  // define bounding box
351  // BoundingBox must be 1% size of frame (3.2x2.4 pixels)
352  if (BoundingBox_width > 0.01 && BoundingBox_height > 0.01) {
353  roiBoxes_[count].x = x_center;
354  roiBoxes_[count].y = y_center;
355  roiBoxes_[count].w = BoundingBox_width;
356  roiBoxes_[count].h = BoundingBox_height;
357  roiBoxes_[count].Class = j;
358  roiBoxes_[count].prob = dets[i].prob[j];
359  count++;
360  }
361  }
362  }
363  }
364 
365  // create array to store found bounding boxes
366  // if no object detected, make sure that ROS knows that num = 0
367  if (count == 0) {
368  roiBoxes_[0].num = 0;
369  } else {
370  roiBoxes_[0].num = count;
371  }
372 
373  free_detections(dets, nboxes);
374  demoIndex_ = (demoIndex_ + 1) % demoFrame_;
375  running_ = 0;
376  return 0;
377 }
378 
380  {
381  boost::shared_lock<boost::shared_mutex> lock(mutexImageCallback_);
382  CvMatWithHeader_ imageAndHeader = getCvMatWithHeader();
383  free_image(buff_[buffIndex_]);
384  buff_[buffIndex_] = mat_to_image(imageAndHeader.image);
385  headerBuff_[buffIndex_] = imageAndHeader.header;
387  }
388  rgbgr_image(buff_[buffIndex_]);
389  letterbox_image_into(buff_[buffIndex_], net_->w, net_->h, buffLetter_[buffIndex_]);
390  return 0;
391 }
392 
394  int c = show_image(buff_[(buffIndex_ + 1) % 3], "YOLO", 1);
395  if (c != -1) c = c % 256;
396  if (c == 27) {
397  demoDone_ = 1;
398  return 0;
399  } else if (c == 82) {
400  demoThresh_ += .02;
401  } else if (c == 84) {
402  demoThresh_ -= .02;
403  if (demoThresh_ <= .02) demoThresh_ = .02;
404  } else if (c == 83) {
405  demoHier_ += .02;
406  } else if (c == 81) {
407  demoHier_ -= .02;
408  if (demoHier_ <= .0) demoHier_ = .0;
409  }
410  return 0;
411 }
412 
414  while (1) {
415  displayInThread(0);
416  }
417 }
418 
420  while (1) {
421  detectInThread();
422  }
423 }
424 
425 void YoloObjectDetector::setupNetwork(char* cfgfile, char* weightfile, char* datafile, float thresh, char** names, int classes, int delay,
426  char* prefix, int avg_frames, float hier, int w, int h, int frames, int fullscreen) {
427  demoPrefix_ = prefix;
428  demoDelay_ = delay;
429  demoFrame_ = avg_frames;
430  image** alphabet = load_alphabet_with_file(datafile);
431  demoNames_ = names;
432  demoAlphabet_ = alphabet;
433  demoClasses_ = classes;
434  demoThresh_ = thresh;
435  demoHier_ = hier;
436  fullScreen_ = fullscreen;
437  printf("YOLO\n");
438  net_ = load_network(cfgfile, weightfile, 0);
439  set_batch_network(net_, 1);
440 }
441 
443  const auto wait_duration = std::chrono::milliseconds(2000);
444  while (!getImageStatus()) {
445  printf("Waiting for image.\n");
446  if (!isNodeRunning()) {
447  return;
448  }
449  std::this_thread::sleep_for(wait_duration);
450  }
451 
452  std::thread detect_thread;
453  std::thread fetch_thread;
454 
455  srand(2222222);
456 
457  int i;
459  predictions_ = (float**)calloc(demoFrame_, sizeof(float*));
460  for (i = 0; i < demoFrame_; ++i) {
461  predictions_[i] = (float*)calloc(demoTotal_, sizeof(float));
462  }
463  avg_ = (float*)calloc(demoTotal_, sizeof(float));
464 
465  layer l = net_->layers[net_->n - 1];
466  roiBoxes_ = (darknet_ros::RosBox_*)calloc(l.w * l.h * l.n, sizeof(darknet_ros::RosBox_));
467 
468  {
469  boost::shared_lock<boost::shared_mutex> lock(mutexImageCallback_);
470  CvMatWithHeader_ imageAndHeader = getCvMatWithHeader();
471  buff_[0] = mat_to_image(imageAndHeader.image);
472  headerBuff_[0] = imageAndHeader.header;
473  }
474  buff_[1] = copy_image(buff_[0]);
475  buff_[2] = copy_image(buff_[0]);
476  headerBuff_[1] = headerBuff_[0];
477  headerBuff_[2] = headerBuff_[0];
478  buffLetter_[0] = letterbox_image(buff_[0], net_->w, net_->h);
479  buffLetter_[1] = letterbox_image(buff_[0], net_->w, net_->h);
480  buffLetter_[2] = letterbox_image(buff_[0], net_->w, net_->h);
481  disp_ = image_to_mat(buff_[0]);
482 
483  int count = 0;
484  if (!demoPrefix_ && viewImage_) {
485  cv::namedWindow("YOLO", cv::WINDOW_NORMAL);
486  if (fullScreen_) {
487  cv::setWindowProperty("YOLO", cv::WND_PROP_FULLSCREEN, cv::WINDOW_FULLSCREEN);
488  } else {
489  cv::moveWindow("YOLO", 0, 0);
490  cv::resizeWindow("YOLO", 640, 480);
491  }
492  }
493 
494  demoTime_ = what_time_is_it_now();
495 
496  while (!demoDone_) {
497  buffIndex_ = (buffIndex_ + 1) % 3;
498  fetch_thread = std::thread(&YoloObjectDetector::fetchInThread, this);
499  detect_thread = std::thread(&YoloObjectDetector::detectInThread, this);
500  if (!demoPrefix_) {
501  fps_ = 1. / (what_time_is_it_now() - demoTime_);
502  demoTime_ = what_time_is_it_now();
503  if (viewImage_) {
504  displayInThread(0);
505  } else {
506  generate_image(buff_[(buffIndex_ + 1) % 3], disp_);
507  }
508  publishInThread();
509  } else {
510  char name[256];
511  sprintf(name, "%s_%08d", demoPrefix_, count);
512  save_image(buff_[(buffIndex_ + 1) % 3], name);
513  }
514  fetch_thread.join();
515  detect_thread.join();
516  ++count;
517  if (!isNodeRunning()) {
518  demoDone_ = true;
519  }
520  }
521 }
522 
524  CvMatWithHeader_ header = {.image = camImageCopy_, .header = imageHeader_};
525  return header;
526 }
527 
529  boost::shared_lock<boost::shared_mutex> lock(mutexImageStatus_);
530  return imageStatus_;
531 }
532 
534  boost::shared_lock<boost::shared_mutex> lock(mutexNodeStatus_);
535  return isNodeRunning_;
536 }
537 
539  // Publish image.
540  cv::Mat cvImage = disp_;
541  if (!publishDetectionImage(cv::Mat(cvImage))) {
542  ROS_DEBUG("Detection image has not been broadcasted.");
543  }
544 
545  // Publish bounding boxes and detection result.
546  int num = roiBoxes_[0].num;
547  if (num > 0 && num <= 100) {
548  for (int i = 0; i < num; i++) {
549  for (int j = 0; j < numClasses_; j++) {
550  if (roiBoxes_[i].Class == j) {
551  rosBoxes_[j].push_back(roiBoxes_[i]);
552  rosBoxCounter_[j]++;
553  }
554  }
555  }
556 
557  darknet_ros_msgs::ObjectCount msg;
558  msg.header.stamp = ros::Time::now();
559  msg.header.frame_id = "detection";
560  msg.count = num;
562 
563  for (int i = 0; i < numClasses_; i++) {
564  if (rosBoxCounter_[i] > 0) {
565  darknet_ros_msgs::BoundingBox boundingBox;
566 
567  for (int j = 0; j < rosBoxCounter_[i]; j++) {
568  int xmin = (rosBoxes_[i][j].x - rosBoxes_[i][j].w / 2) * frameWidth_;
569  int ymin = (rosBoxes_[i][j].y - rosBoxes_[i][j].h / 2) * frameHeight_;
570  int xmax = (rosBoxes_[i][j].x + rosBoxes_[i][j].w / 2) * frameWidth_;
571  int ymax = (rosBoxes_[i][j].y + rosBoxes_[i][j].h / 2) * frameHeight_;
572 
573  boundingBox.Class = classLabels_[i];
574  boundingBox.id = i;
575  boundingBox.probability = rosBoxes_[i][j].prob;
576  boundingBox.xmin = xmin;
577  boundingBox.ymin = ymin;
578  boundingBox.xmax = xmax;
579  boundingBox.ymax = ymax;
580  boundingBoxesResults_.bounding_boxes.push_back(boundingBox);
581  }
582  }
583  }
584  boundingBoxesResults_.header.stamp = ros::Time::now();
585  boundingBoxesResults_.header.frame_id = "detection";
586  boundingBoxesResults_.image_header = headerBuff_[(buffIndex_ + 1) % 3];
588  } else {
589  darknet_ros_msgs::ObjectCount msg;
590  msg.header.stamp = ros::Time::now();
591  msg.header.frame_id = "detection";
592  msg.count = 0;
594  }
595  if (isCheckingForObjects()) {
596  ROS_DEBUG("[YoloObjectDetector] check for objects in image.");
597  darknet_ros_msgs::CheckForObjectsResult objectsActionResult;
598  objectsActionResult.id = buffId_[0];
599  objectsActionResult.bounding_boxes = boundingBoxesResults_;
600  checkForObjectsActionServer_->setSucceeded(objectsActionResult, "Send bounding boxes.");
601  }
602  boundingBoxesResults_.bounding_boxes.clear();
603  for (int i = 0; i < numClasses_; i++) {
604  rosBoxes_[i].clear();
605  rosBoxCounter_[i] = 0;
606  }
607 
608  return 0;
609 }
610 
611 } /* namespace darknet_ros*/
darknet_ros::YoloObjectDetector::frameWidth_
int frameWidth_
Camera related parameters.
Definition: YoloObjectDetector.hpp:159
darknet_ros::YoloObjectDetector::isNodeRunning
bool isNodeRunning(void)
Definition: YoloObjectDetector.cpp:533
darknet_ros::YoloObjectDetector::actionId_
int actionId_
Definition: YoloObjectDetector.hpp:212
darknet_ros::YoloObjectDetector::net_
network * net_
Definition: YoloObjectDetector.hpp:173
darknet_ros::YoloObjectDetector::rememberNetwork
void rememberNetwork(network *net)
Definition: YoloObjectDetector.cpp:274
darknet_ros::YoloObjectDetector::getImageStatus
bool getImageStatus(void)
Definition: YoloObjectDetector.cpp:528
darknet_ros::RosBox_::y
float y
Definition: YoloObjectDetector.hpp:70
darknet_ros::weights
char * weights
Definition: YoloObjectDetector.cpp:24
darknet_ros::YoloObjectDetector::buffLetter_
image buffLetter_[3]
Definition: YoloObjectDetector.hpp:176
darknet_ros::YoloObjectDetector::mutexImageCallback_
boost::shared_mutex mutexImageCallback_
Definition: YoloObjectDetector.hpp:204
boost::shared_ptr
darknet_ros::RosBox_::w
float w
Definition: YoloObjectDetector.hpp:70
cv_bridge::CvImage::toImageMsg
sensor_msgs::ImagePtr toImageMsg() const
darknet_ros::YoloObjectDetector::boundingBoxesPublisher_
ros::Publisher boundingBoxesPublisher_
Definition: YoloObjectDetector.hpp:151
darknet_ros::YoloObjectDetector::detectInThread
void * detectInThread()
Definition: YoloObjectDetector.cpp:304
darknet_ros::YoloObjectDetector::yoloThread_
std::thread yoloThread_
Definition: YoloObjectDetector.hpp:166
darknet_ros::CvMatWithHeader_::header
std_msgs::Header header
Definition: YoloObjectDetector.hpp:76
darknet_ros::detectionNames
char ** detectionNames
Definition: YoloObjectDetector.cpp:26
darknet_ros::YoloObjectDetector::nodeHandle_
ros::NodeHandle nodeHandle_
ROS node handle.
Definition: YoloObjectDetector.hpp:136
darknet_ros::YoloObjectDetector::running_
int running_
Definition: YoloObjectDetector.hpp:182
darknet_ros::CvMatWithHeader_
Definition: YoloObjectDetector.hpp:74
darknet_ros::YoloObjectDetector::frameHeight_
int frameHeight_
Definition: YoloObjectDetector.hpp:160
darknet_ros::YoloObjectDetector::publishDetectionImage
bool publishDetectionImage(const cv::Mat &detectionImage)
Definition: YoloObjectDetector.cpp:241
darknet_ros::YoloObjectDetector::readParameters
bool readParameters()
Definition: YoloObjectDetector.cpp:48
darknet_ros::YoloObjectDetector::displayLoop
void * displayLoop(void *ptr)
Definition: YoloObjectDetector.cpp:413
darknet_ros::RosBox_::h
float h
Definition: YoloObjectDetector.hpp:70
darknet_ros::RosBox_::prob
float prob
Definition: YoloObjectDetector.hpp:70
darknet_ros::YoloObjectDetector::fps_
float fps_
Definition: YoloObjectDetector.hpp:179
darknet_ros::data
char * data
Definition: YoloObjectDetector.cpp:25
darknet_ros::YoloObjectDetector::publishInThread
void * publishInThread()
Definition: YoloObjectDetector.cpp:538
ROS_WARN_ONCE
#define ROS_WARN_ONCE(...)
darknet_ros::YoloObjectDetector::checkForObjectsActionGoalCB
void checkForObjectsActionGoalCB()
Definition: YoloObjectDetector.cpp:198
darknet_ros::YoloObjectDetector::classLabels_
std::vector< std::string > classLabels_
Definition: YoloObjectDetector.hpp:140
cv_bridge::Exception
darknet_ros::RosBox_::Class
int Class
Definition: YoloObjectDetector.hpp:71
darknet_ros::YoloObjectDetector::YoloObjectDetector
YoloObjectDetector(ros::NodeHandle nh)
Definition: YoloObjectDetector.cpp:28
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
ros::requestShutdown
ROSCPP_DECL void requestShutdown()
darknet_ros::YoloObjectDetector::fullScreen_
int fullScreen_
Definition: YoloObjectDetector.hpp:199
darknet_ros::RosBox_::num
int num
Definition: YoloObjectDetector.hpp:71
ros::NodeHandle::advertise
Publisher advertise(AdvertiseOptions &ops)
ros::ok
ROSCPP_DECL bool ok()
darknet_ros::YoloObjectDetector::predictions_
float ** predictions_
Definition: YoloObjectDetector.hpp:186
darknet_ros::YoloObjectDetector::getCvMatWithHeader
CvMatWithHeader_ getCvMatWithHeader()
Definition: YoloObjectDetector.cpp:523
darknet_ros::YoloObjectDetector::boundingBoxesResults_
darknet_ros_msgs::BoundingBoxes boundingBoxesResults_
Definition: YoloObjectDetector.hpp:156
darknet_ros::YoloObjectDetector::camImageCopy_
cv::Mat camImageCopy_
Definition: YoloObjectDetector.hpp:203
darknet_ros::YoloObjectDetector::checkForObjectsActionServer_
CheckForObjectsActionServerPtr checkForObjectsActionServer_
Check for objects action server.
Definition: YoloObjectDetector.hpp:143
darknet_ros::YoloObjectDetector::demoPrefix_
char * demoPrefix_
Definition: YoloObjectDetector.hpp:200
darknet_ros::YoloObjectDetector::demoDone_
int demoDone_
Definition: YoloObjectDetector.hpp:188
darknet_ros::YoloObjectDetector::disp_
cv::Mat disp_
Definition: YoloObjectDetector.hpp:183
darknet_ros::YoloObjectDetector::demoNames_
char ** demoNames_
Definition: YoloObjectDetector.hpp:169
darknet_ros::YoloObjectDetector::isNodeRunning_
bool isNodeRunning_
Definition: YoloObjectDetector.hpp:209
darknet_ros::YoloObjectDetector::mutexNodeStatus_
boost::shared_mutex mutexNodeStatus_
Definition: YoloObjectDetector.hpp:210
darknet_ros
Definition: YoloObjectDetector.hpp:66
darknet_ros::YoloObjectDetector::rosBoxCounter_
std::vector< int > rosBoxCounter_
Definition: YoloObjectDetector.hpp:155
darknet_ros::YoloObjectDetector::fetchInThread
void * fetchInThread()
Definition: YoloObjectDetector.cpp:379
cv_bridge::toCvCopy
CvImagePtr toCvCopy(const sensor_msgs::CompressedImage &source, const std::string &encoding=std::string())
cv_bridge::CvImage::header
std_msgs::Header header
ROS_DEBUG
#define ROS_DEBUG(...)
image_transport::ImageTransport::subscribe
Subscriber subscribe(const std::string &base_topic, uint32_t queue_size, const boost::function< void(const sensor_msgs::ImageConstPtr &)> &callback, const ros::VoidPtr &tracked_object=ros::VoidPtr(), const TransportHints &transport_hints=TransportHints())
darknet_ros::YoloObjectDetector::demoAlphabet_
image ** demoAlphabet_
Definition: YoloObjectDetector.hpp:170
darknet_ros::YoloObjectDetector::CheckForObjectsActionServer
actionlib::SimpleActionServer< darknet_ros_msgs::CheckForObjectsAction > CheckForObjectsActionServer
Using.
Definition: YoloObjectDetector.hpp:132
darknet_ros::YoloObjectDetector::isCheckingForObjects
bool isCheckingForObjects() const
Definition: YoloObjectDetector.cpp:237
darknet_ros::YoloObjectDetector::imageStatus_
bool imageStatus_
Definition: YoloObjectDetector.hpp:206
darknet_ros::YoloObjectDetector::imageSubscriber_
image_transport::Subscriber imageSubscriber_
ROS subscriber and publisher.
Definition: YoloObjectDetector.hpp:149
darknet_ros::YoloObjectDetector::imageHeader_
std_msgs::Header imageHeader_
Definition: YoloObjectDetector.hpp:202
darknet_ros::YoloObjectDetector::demoDelay_
int demoDelay_
Definition: YoloObjectDetector.hpp:184
darknet_ros::YoloObjectDetector::yolo
void yolo()
Definition: YoloObjectDetector.cpp:442
darknet_ros::YoloObjectDetector::sizeNetwork
int sizeNetwork(network *net)
Definition: YoloObjectDetector.cpp:262
darknet_ros::YoloObjectDetector::~YoloObjectDetector
~YoloObjectDetector()
Definition: YoloObjectDetector.cpp:40
darknet_ros::RosBox_
Bounding box of the detected object.
Definition: YoloObjectDetector.hpp:69
darknet_ros::YoloObjectDetector::avgPredictions
detection * avgPredictions(network *net, int *nboxes)
Definition: YoloObjectDetector.cpp:286
darknet_ros::YoloObjectDetector::demoFrame_
int demoFrame_
Definition: YoloObjectDetector.hpp:185
darknet_ros::YoloObjectDetector::buff_
image buff_[3]
Definition: YoloObjectDetector.hpp:175
darknet_ros::YoloObjectDetector::avg_
float * avg_
Definition: YoloObjectDetector.hpp:191
darknet_ros::YoloObjectDetector::objectPublisher_
ros::Publisher objectPublisher_
Definition: YoloObjectDetector.hpp:150
darknet_ros::YoloObjectDetector::demoTotal_
int demoTotal_
Definition: YoloObjectDetector.hpp:192
darknet_ros::YoloObjectDetector::rosBoxes_
std::vector< std::vector< RosBox_ > > rosBoxes_
Detected objects.
Definition: YoloObjectDetector.hpp:154
generate_image
void generate_image(image p, cv::Mat &disp)
darknet_ros::RosBox_::x
float x
Definition: YoloObjectDetector.hpp:70
darknet_ros::YoloObjectDetector::mutexImageStatus_
boost::shared_mutex mutexImageStatus_
Definition: YoloObjectDetector.hpp:207
show_image
int show_image(image p, const char *name, int ms)
mat_to_image
image mat_to_image(cv::Mat m)
cv_bridge::CvImage::encoding
std::string encoding
darknet_ros::YoloObjectDetector::imageTransport_
image_transport::ImageTransport imageTransport_
Advertise and subscribe to image topics.
Definition: YoloObjectDetector.hpp:146
darknet_ros::YoloObjectDetector::demoClasses_
int demoClasses_
Definition: YoloObjectDetector.hpp:171
darknet_ros::YoloObjectDetector::detectionImagePublisher_
ros::Publisher detectionImagePublisher_
Publisher of the bounding box image.
Definition: YoloObjectDetector.hpp:163
darknet_ros::CvMatWithHeader_::image
cv::Mat image
Definition: YoloObjectDetector.hpp:75
darknet_ros::YoloObjectDetector::roiBoxes_
RosBox_ * roiBoxes_
Definition: YoloObjectDetector.hpp:195
ROS_ERROR
#define ROS_ERROR(...)
cv_bridge::CvImage
image_to_mat
cv::Mat image_to_mat(image im)
ros::NodeHandle::param
T param(const std::string &param_name, const T &default_val) const
darknet_ros::YoloObjectDetector::buffId_
int buffId_[3]
Definition: YoloObjectDetector.hpp:177
darknet_ros::YoloObjectDetector::viewImage_
bool viewImage_
Definition: YoloObjectDetector.hpp:196
darknet_ros::YoloObjectDetector::demoHier_
float demoHier_
Definition: YoloObjectDetector.hpp:181
sensor_msgs::image_encodings::BGR8
const std::string BGR8
darknet_ros::YoloObjectDetector::demoIndex_
int demoIndex_
Definition: YoloObjectDetector.hpp:187
darknet_ros::YoloObjectDetector::init
void init()
Definition: YoloObjectDetector.cpp:72
darknet_ros::YoloObjectDetector::enableConsoleOutput_
bool enableConsoleOutput_
Definition: YoloObjectDetector.hpp:197
ros::Publisher::getNumSubscribers
uint32_t getNumSubscribers() const
darknet_ros::cfg
char * cfg
Definition: YoloObjectDetector.cpp:23
darknet_ros::YoloObjectDetector::demoThresh_
float demoThresh_
Definition: YoloObjectDetector.hpp:180
header
const std::string header
YoloObjectDetector.hpp
darknet_ros::YoloObjectDetector::headerBuff_
std_msgs::Header headerBuff_[3]
Definition: YoloObjectDetector.hpp:174
ROS_INFO
#define ROS_INFO(...)
darknet_ros::YoloObjectDetector::numClasses_
int numClasses_
Class labels.
Definition: YoloObjectDetector.hpp:139
darknet_ros::YoloObjectDetector::buffIndex_
int buffIndex_
Definition: YoloObjectDetector.hpp:178
darknet_ros::YoloObjectDetector::waitKeyDelay_
int waitKeyDelay_
Definition: YoloObjectDetector.hpp:198
darknet_ros::YoloObjectDetector::displayInThread
void * displayInThread(void *ptr)
Definition: YoloObjectDetector.cpp:393
cv_bridge::CvImage::image
cv::Mat image
darknet_ros::YoloObjectDetector::mutexActionStatus_
boost::shared_mutex mutexActionStatus_
Definition: YoloObjectDetector.hpp:213
darknet_ros::YoloObjectDetector::demoTime_
double demoTime_
Definition: YoloObjectDetector.hpp:193
darknet_ros::YoloObjectDetector::cameraCallback
void cameraCallback(const sensor_msgs::ImageConstPtr &msg)
Definition: YoloObjectDetector.cpp:159
darknet_ros::YoloObjectDetector::detectLoop
void * detectLoop(void *ptr)
Definition: YoloObjectDetector.cpp:419
darknet_ros::YoloObjectDetector::checkForObjectsActionPreemptCB
void checkForObjectsActionPreemptCB()
Definition: YoloObjectDetector.cpp:232
darknet_ros::YoloObjectDetector::setupNetwork
void setupNetwork(char *cfgfile, char *weightfile, char *datafile, float thresh, char **names, int classes, int delay, char *prefix, int avg_frames, float hier, int w, int h, int frames, int fullscreen)
Definition: YoloObjectDetector.cpp:425
load_alphabet_with_file
image ** load_alphabet_with_file(char *datafile)
Definition: image_interface.cpp:16
ros::NodeHandle
ros::Time::now
static Time now()


darknet_ros
Author(s): Marko Bjelonic
autogenerated on Wed Mar 2 2022 00:10:00