当前位置: 首页 > news >正文

制作介绍的网站模板免费下载做养生的网站多吗

制作介绍的网站模板免费下载,做养生的网站多吗,怎么做淘宝返利网站吗,公司网站简介怎么做C多线程复习 下面的代码搭建了简单的一个生产者-消费者模型#xff0c;在capture()函数中进行入队操作#xff0c;infer()函数中进行出队操作#xff0c;为了模拟采图-推理流程#xff0c;在函数中调用Sleep()函数延时。 #include iostream #include string多线程复习 下面的代码搭建了简单的一个生产者-消费者模型在capture()函数中进行入队操作infer()函数中进行出队操作为了模拟采图-推理流程在函数中调用Sleep()函数延时。 #include iostream #include string #include queue #include thread #include windows.hstd::queuestd::string jobs;void capture() {int id 0;while (true){std::string name std::to_string(id) .jpg;std::cout capture: name jobs.size(): jobs.size() std::endl;jobs.push(name);Sleep(1000);} }void infer() {while (true){if (!jobs.empty()){auto pic jobs.front();jobs.pop();std::cout infer: pic std::endl;Sleep(1000);}} }int main() {std::thread t0(capture);std::thread t1(infer);t0.join();t1.join();return 0; }输出结果 capture: 0.jpg jobs.size():0 infer: 0.jpg capture: 1.jpg jobs.size():0 infer: 1.jpg capture: 2.jpg jobs.size():0 infer: 2.jpg capture: 3.jpg jobs.size():0 infer: 3.jpg capture: 4.jpg jobs.size():0 infer: 4.jpg capture: 5.jpg jobs.size():0 infer: 5.jpg capture: 6.jpg jobs.size():0 infer: 6.jpg capture: 7.jpg jobs.size():0 infer: 7.jpg capture: 8.jpg jobs.size():0 infer: 8.jpg capture: 9.jpg jobs.size():0 infer: 9.jpg capture: 10.jpg jobs.size():0 infer: 10.jpg ...现在我们把capture函数中的Sleep(1000)改成Sleep(500)再次执行程序则输出 capture: 0.jpg jobs.size():0 infer: 0.jpg capture: 1.jpg jobs.size():0 infer: 1.jpg capture: 2.jpg jobs.size():0 capture: 3.jpg jobs.size():1 infer: 2.jpg capture: 4.jpg jobs.size():1 capture: 5.jpg jobs.size():2 infer: 3.jpg capture: 6.jpg jobs.size():2 capture: 7.jpg jobs.size():3 infer: 4.jpg capture: 8.jpg jobs.size():3 capture: 9.jpg jobs.size():4 infer: 5.jpg capture: 10.jpg jobs.size():4 ...此时发现采图-推理流程不能同步。为了解决这个问题加入对队列长度的限制 #include iostream #include string #include queue #include thread #include windows.hstd::queuestd::string jobs;const int limit 3;void capture() {int id 0;while (true){std::string name std::to_string(id) .jpg;std::cout capture: name jobs.size(): jobs.size() std::endl;if(jobs.size() limit)jobs.push(name);Sleep(500);} }void infer() {while (true){if (!jobs.empty()){auto pic jobs.front();jobs.pop();std::cout infer: pic std::endl;Sleep(1000);}} }int main() {std::thread t0(capture);std::thread t1(infer);t0.join();t1.join();return 0; }此时输出结果 capture: 0.jpg jobs.size():0 infer: 0.jpg capture: 1.jpg jobs.size():0 infer: 1.jpg capture: 2.jpg jobs.size():0 capture: 3.jpg jobs.size():1 infer: 2.jpg capture: 4.jpg jobs.size():1 capture: 5.jpg jobs.size():2 infer: 3.jpg capture: 6.jpg jobs.size():2 capture: 7.jpg jobs.size():3 infer: 4.jpg capture: 8.jpg jobs.size():2 capture: 9.jpg jobs.size():3 infer: 5.jpg capture: 10.jpg jobs.size():2 ...由于std::queue不是线程安全的数据结构故引入锁std::mutex #include iostream #include string #include queue #include thread #include mutex #include condition_variable #include future #include windows.hstd::queuestd::string jobs;std::mutex lock;void capture() {int id 0;while (true){{std::unique_lockstd::mutex l(lock);std::string name std::to_string(id) .jpg;std::cout capture: name jobs.size(): jobs.size() std::endl;}Sleep(500);} }void infer() { while (true){if (!jobs.empty()){{std::lock_guardstd::mutex l(lock);auto job jobs.front();jobs.pop();std::cout infer: job std::endl;}Sleep(1000);}} }int main() {std::thread t0(capture);std::thread t1(infer);t0.join();t1.join();return 0; }此时输出 capture: 0.jpg jobs.size(): 0 capture: 1.jpg jobs.size(): 0 capture: 2.jpg jobs.size(): 0 capture: 3.jpg jobs.size(): 0 capture: 4.jpg jobs.size(): 0 capture: 5.jpg jobs.size(): 0 capture: 6.jpg jobs.size(): 0 capture: 7.jpg jobs.size(): 0 capture: 8.jpg jobs.size(): 0 capture: 9.jpg jobs.size(): 0 capture: 10.jpg jobs.size(): 0 ...有时候生产者还需要拿到消费者处理之后的结果因此引入std::promise和std::condition_variable对程序进行完善 #include iostream #include string #include queue #include thread #include mutex #include condition_variable #include future #include windows.hstruct Job {std::string input;std::shared_ptrstd::promisestd::string pro; };std::queueJob jobs;std::mutex lock;std::condition_variable cv;const int limit 5;void capture() {int id 0;while (true){Job job;{std::unique_lockstd::mutex l(lock);std::string name std::to_string(id) .jpg;std::cout capture: name jobs.size(): qjobs.size() std::endl;cv.wait(l, []() { return qjobs.size() limit; });job.input name;job.pro.reset(new std::promisestd::string());jobs.push(job);}auto result job.pro-get_future().get();std::cout result std::endl;Sleep(500);} }void infer() { while (true){if (!qjobs.empty()){{std::lock_guardstd::mutex l(lock);auto job jobs.front();jobs.pop();cv.notify_all();std::cout infer: job.input std::endl;auto result job.input after infer;job.pro-set_value(result);}Sleep(1000);}} }int main() {std::thread t0(capture);std::thread t1(infer);t0.join();t1.join();return 0; }输出 capture: 0.jpg jobs.size(): 0 infer: 0.jpg 0.jpg after infer capture: 1.jpg jobs.size(): 0 infer: 1.jpg 1.jpg after infer capture: 2.jpg jobs.size(): 0 infer: 2.jpg 2.jpg after infer capture: 3.jpg jobs.size(): 0 infer: 3.jpg 3.jpg after infer capture: 4.jpg jobs.size(): 0 infer: 4.jpg 4.jpg after infer capture: 5.jpg jobs.size(): 0 infer: 5.jpg 5.jpg after infer capture: 6.jpg jobs.size(): 0 infer: 6.jpg 6.jpg after infer capture: 7.jpg jobs.size(): 0 infer: 7.jpg 7.jpg after infer capture: 8.jpg jobs.size(): 0 infer: 8.jpg 8.jpg after infer capture: 9.jpg jobs.size(): 0 infer: 9.jpg 9.jpg after infer capture: 10.jpg jobs.size(): 0 infer: 10.jpg 10.jpg after infer ...yolov5目标检测多线程C部署 有了上面的基础我们来写一个基本的目标检测多线程部署程序为了简单起见选用OpenCV的dnn作为推理框架出于篇幅限制下面只给出main.cpp部分 #include iostream #include string #include queue #include thread #include mutex #include condition_variable #include future #include windows.h#include yolov5.hstruct Job {cv::Mat input_image;std::shared_ptrstd::promisecv::Mat output_image; };std::queueJob jobs;std::mutex lock;std::condition_variable c_v;const int limit 10;void capture(cv::VideoCapture cap) {while (true){Job job;cv::Mat frame;{cap.read(frame);if (frame.empty())break;std::unique_lockstd::mutex l(lock);c_v.wait(l, []() { return jobs.size() limit; });job.input_image frame;job.output_image.reset(new std::promisecv::Mat());jobs.push(job);}cv::Mat result job.output_image-get_future().get();cv::imshow(result, result);cv::waitKey(1);} }void infer(cv::dnn::Net net) { while (true){if (!jobs.empty()){std::lock_guardstd::mutex l(lock);auto job jobs.front();jobs.pop();c_v.notify_all();cv::Mat input_image job.input_image, blob, output_image;pre_process(input_image, blob);std::vectorcv::Mat network_outputs;process(blob, net, network_outputs);post_process(input_image, output_image, network_outputs);job.output_image-set_value(output_image);}} }int main(int argc, char* argv[]) {cv::VideoCapture cap(test.mp4);cv::dnn::Net net cv::dnn::readNet(yolov5n.onnx);std::thread t0(capture, cap);std::thread t1(infer, net);t0.join();t1.join();return 0; }接下来我们模拟多个模型同时推理先给出单线程串行的程序 #include iostream #include string #include queue #include thread #include mutex #include condition_variable #include future #include windows.h#include yolov5.hint main(int argc, char* argv[]) {cv::VideoCapture cap(test.mp4);//cap.open(0);cv::dnn::Net net1 cv::dnn::readNet(yolov5n.onnx);cv::dnn::Net net2 cv::dnn::readNet(yolov5s.onnx);cv::Mat frame;while (true) {clock_t start clock();cap.read(frame);if (frame.empty())break;cv::Mat input_image frame, blob;pre_process(input_image, blob);std::vectorcv::Mat network_outputs1, network_outputs2;process(blob, net1, network_outputs1);process(blob, net2, network_outputs2);cv::Mat output_image1, output_image2;post_process(input_image, output_image1, network_outputs1);post_process(input_image, output_image2, network_outputs2);clock_t end clock();std::cout end - start ms std::endl;cv::imshow(result1, output_image1);cv::imshow(result2, output_image2);cv::waitKey(1);}return 0; }输出结果 infer1infer2:191ms infer1infer2:142ms infer1infer2:134ms infer1infer2:130ms infer1infer2:129ms infer1infer2:124ms infer1infer2:124ms infer1infer2:121ms infer1infer2:124ms infer1infer2:122ms ...多线程并行的写法修改如下 #include iostream #include string #include queue #include thread #include mutex #include condition_variable #include future #include windows.h#include yolov5.hstruct Job {cv::Mat input_image;std::shared_ptrstd::promisecv::Mat output_image; };std::queueJob jobs1,jobs2;std::mutex lock1, lock2;std::condition_variable cv1, cv2;const int limit 10;void capture(cv::VideoCapture cap) {while (true){Job job1, job2;cv::Mat frame;clock_t start clock();cap.read(frame);if (frame.empty())break;{std::unique_lockstd::mutex l1(lock1);cv1.wait(l1, []() { return jobs1.size() limit; });job1.input_image frame;job1.output_image.reset(new std::promisecv::Mat());jobs1.push(job1);}{std::unique_lockstd::mutex l2(lock2);cv1.wait(l2, []() { return jobs2.size() limit; });job2.input_image frame;job2.output_image.reset(new std::promisecv::Mat());jobs2.push(job2);}cv::Mat result1 job1.output_image-get_future().get();cv::Mat result2 job2.output_image-get_future().get();clock_t end clock();std::cout capture: end - start ms std::endl;cv::imshow(result1, result1);cv::imshow(result2, result2);cv::waitKey(1);} }void infer1(cv::dnn::Net net) { while (true){if (!jobs1.empty()){clock_t start clock();std::lock_guardstd::mutex l1(lock1);auto job jobs1.front();jobs1.pop();cv1.notify_all();cv::Mat input_image job.input_image, blob, output_image;pre_process(input_image, blob);std::vectorcv::Mat network_outputs;process(blob, net, network_outputs);post_process(input_image, output_image, network_outputs);job.output_image-set_value(output_image);clock_t end clock();std::cout infer1: end - start ms std::endl;}} }void infer2(cv::dnn::Net net) {while (true){if (!jobs2.empty()){clock_t start clock();std::lock_guardstd::mutex l2(lock2);auto job jobs2.front();jobs2.pop();cv2.notify_all();cv::Mat input_image job.input_image, blob, output_image;pre_process(input_image, blob);std::vectorcv::Mat network_outputs;process(blob, net, network_outputs);post_process(input_image, output_image, network_outputs);job.output_image-set_value(output_image);clock_t end clock();std::cout infer2: end - start ms std::endl;}} }int main(int argc, char* argv[]) {cv::VideoCapture cap(test.mp4);//cap.open(0);cv::dnn::Net net1 cv::dnn::readNet(yolov5n.onnx);cv::dnn::Net net2 cv::dnn::readNet(yolov5s.onnx);std::thread t0(capture, cap);std::thread t1(infer1, net1);std::thread t2(infer2, net2);t0.join();t1.join();t2.join();return 0; }输出 infer1: 98ms infer2: 136mscapture: 155msinfer1: 80ms infer2: 110ms capture: 113ms infer1: 92ms infer2: 101mscapture: 103msinfer1: 85ms infer2: 97ms capture: 100ms infer1: 85ms infer2: 100mscapture: 102ms ...上面的程序还有一点小问题视频播放完时程序无法正常退出。继续修正如下 #include iostream #include string #include queue #include thread #include mutex #include condition_variable #include future #include windows.h#include yolov5.hstruct Job {cv::Mat input_image;std::shared_ptrstd::promisecv::Mat output_image; };std::queueJob jobs1,jobs2;std::mutex lock1, lock2;std::condition_variable cv1, cv2;const int limit 10;bool stop false;void capture(cv::VideoCapture cap) {while (true){Job job1, job2;cv::Mat frame;clock_t start clock();cap.read(frame);if (frame.empty()){stop true;break;}{std::unique_lockstd::mutex l1(lock1);cv1.wait(l1, []() { return jobs1.size()limit; });job1.input_image frame;job1.output_image.reset(new std::promisecv::Mat());jobs1.push(job1);}{std::unique_lockstd::mutex l2(lock2);cv1.wait(l2, []() { return jobs2.size() limit; });job2.input_image frame;job2.output_image.reset(new std::promisecv::Mat());jobs2.push(job2);}cv::Mat result1 job1.output_image-get_future().get();cv::Mat result2 job2.output_image-get_future().get();clock_t end clock();std::cout capture: end - start ms std::endl;cv::imshow(result1, result1);cv::imshow(result2, result2);cv::waitKey(1);} }void infer1(cv::dnn::Net net) { while (true){if (stop)break; //不加程序无法退出if (!jobs1.empty()){clock_t start clock();std::lock_guardstd::mutex l1(lock1);auto job jobs1.front();jobs1.pop();cv1.notify_all();cv::Mat input_image job.input_image, blob, output_image;pre_process(input_image, blob);std::vectorcv::Mat network_outputs;process(blob, net, network_outputs);post_process(input_image, output_image, network_outputs);job.output_image-set_value(output_image);clock_t end clock();std::cout infer1: end - start ms std::endl;}std::this_thread::yield(); //不加程序无法退出} }void infer2(cv::dnn::Net net) {while (true){if (stop)break; //不加程序无法退出if (!jobs2.empty()){clock_t start clock();std::lock_guardstd::mutex l2(lock2);auto job jobs2.front();jobs2.pop();cv2.notify_all();cv::Mat input_image job.input_image, blob, output_image;pre_process(input_image, blob);std::vectorcv::Mat network_outputs;process(blob, net, network_outputs);post_process(input_image, output_image, network_outputs);job.output_image-set_value(output_image);clock_t end clock();std::cout infer2: end - start ms std::endl;}std::this_thread::yield(); //不加程序无法退出} }int main(int argc, char* argv[]) {cv::VideoCapture cap(test.mp4);cv::dnn::Net net1 cv::dnn::readNet(yolov5n.onnx);cv::dnn::Net net2 cv::dnn::readNet(yolov5s.onnx);std::thread t0(capture, cap);std::thread t1(infer1, net1);std::thread t2(infer2, net2);t0.join();t1.join();t2.join();return 0; }多个视频不同模型同时推理 #include iostream #include string #include queue #include thread #include mutex #include condition_variable #include future #include windows.h#include yolov5.hbool stop false;void print_time(std::string video) {auto now std::chrono::system_clock::now();uint64_t dis_millseconds std::chrono::duration_caststd::chrono::milliseconds(now.time_since_epoch()).count()- std::chrono::duration_caststd::chrono::seconds(now.time_since_epoch()).count() * 1000;time_t tt std::chrono::system_clock::to_time_t(now);auto time_tm localtime(tt);char time[100] { 0 };sprintf(time, %d-%02d-%02d %02d:%02d:%02d %03d, time_tm-tm_year 1900,time_tm-tm_mon 1, time_tm-tm_mday, time_tm-tm_hour,time_tm-tm_min, time_tm-tm_sec, (int)dis_millseconds);std::cout infer video 当前时间为 time std::endl; }void capture(std::string video, cv::dnn::Net net) {cv::VideoCapture cap(video);while (cv::waitKey(1) 0){cv::Mat frame;cap.read(frame);if (frame.empty()){stop true;break;}cv::Mat input_image frame, blob, output_image;pre_process(input_image, blob);std::vectorcv::Mat network_outputs;process(blob, net, network_outputs);post_process(input_image, output_image, network_outputs);print_time(video);cv::imshow(video, output_image);} }int main(int argc, char* argv[]) {std::string video1(test1.mp4);std::string video2(test2.mp4);cv::dnn::Net net1 cv::dnn::readNet(yolov5n.onnx);cv::dnn::Net net2 cv::dnn::readNet(yolov5s.onnx);std::thread t1(capture, video1, net1);std::thread t2(capture, video2, net2);t1.join();t2.join();return 0; }推理效果如下
http://wiki.neutronadmin.com/news/194131/

相关文章:

  • 山东住房建设厅官网站网络推广方式的研究
  • 先做网站还是app个人网站做打赏流程
  • wordpress新建网站后台无法登陆海口高端品牌网站建设
  • 使用dw做门户网站永久免费云服务器无需注册
  • 阿里巴巴中文站官网网页设计与网站建设考试
  • wordpress播入视频播放wordpress安装说明seo工具好用
  • 郑州行业网站建设装饰设计做什么的
  • 网站有源码之后怎么建设网站如何开通网站
  • 郑州网站建设行情书店网站模版
  • 网站建设网站制作需要多少钱网站建设公司招网站设计
  • 四川建设厅证网站是中国手工活加工官方网站
  • 国内flask做的网站android毕业设计代做网站
  • 外贸网站示例建设局是干啥的
  • 怀化高速网站做网站刷东西
  • 一个主体如何添加网站怎样做淘宝客导购网站
  • python网站开发用什么山西省建设监理协会官方网站
  • 网站根目录多文件全国八大员报名官方网站
  • .net响应式网站模板辽宁建设工程信息网外网公示时间
  • 网站怎么登陆后台旅游网站的建设的意义
  • 外贸网站推广和建站网站建设免费模版
  • 深圳 福田网站建设建筑工程网招聘信息
  • 个人怎么进行网站建设wordpress使用手机号登录
  • 怎么把凡科网里做的网站保存成文件选择扬中网站建设
  • 建商城网站需要什么条件外贸建设企业网站服务
  • php做网站协会网站建站
  • 昆明建站网站资讯平台企业网站的建立
  • 旅行网站开发需求说明书免费企业网站开源系统
  • 竹子建站下载阜城县网站建设
  • 网站交易平台网站建设教程金旭亮
  • 网站seo多少钱国内著名设计公司