日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python在通信中的应用_基于Redis的进程间通信——在C++里使用python的深度学习模型...

發布時間:2025/4/16 python 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python在通信中的应用_基于Redis的进程间通信——在C++里使用python的深度学习模型... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要是為進程間通信(特別是語言都不同的進程)提供一種新的思路本想法來源于RoboMaster比賽中的神符檢測,神符是指一個9宮格的手寫體數字(Mnist)或火焰體動態數字,需要用到機器學習或深度學習模型對數字進行識別,從檢測大符到識別全部數字到發射子彈,整個過程不能超過1.5秒,全部的運算量都集中在搭載在機器小車上的miniPC,由于miniPC性能有限,且除了這個程序之外還有個非常占用資源的自動射擊程序,所以整個程序使用的是C++的代碼。一開始我們使用的是xgboost,在python上把模型訓練完成之后,把預測代碼再改寫成C++。而后來發現xgboost在真實場景上的準確率較低(只有70%),于是改為了復雜的深度學習模型,準確率上幾乎可以達到100%。但此時的python代碼已經比較復雜,再全部改成C++已經不現實,所以開始尋找一種能實現兩者間通信的方案。

網上已有的通信方案C++ 與python的混合編程方案比較多,比如使用,說實話,我沒認真看,需要的自己去百度或谷歌吧

進程間通信的常見的方案有共享內存、消息隊列、管道等等,但是實現難度較大,特別是對于不同語言的程序

基于Redis的通信方案

基本思路Redis是一種基于內存的NoSQL 數據庫,所以讀寫速度非常快,且使用非常簡單。但其底層是基于socket通信,所以速度比共享內存、消息隊列要慢一個級別,但在本場景中,能有效解決問題

在本應用場景中,每次需要通信的數據是9張圖片,每張圖片是28×28像素,所以其實就是 9 x 28 x 28的矩陣

所以,在C++程序中進行檢測和提取圖像,將9張圖片的像素值依次讀取進來,存儲進Redis,通過標志位的方式告訴python程序進行讀取,完成預測之后再將結果存儲進redis,并讓C++程序進行調用。整個程序的活動圖如下:

理論上,因為都是基于內存的,所以這種方法的速度只會稍慢于C++的引用傳參,相當于進行了一次深拷貝。

得益于redis的高效讀取,在沒有gpu的加速下,在mac i7 16G的配置上跑完一次讀取和預測大概需要0.3秒,即使在性能較差的miniPC上,一次耗時大概在0.6秒,主要時間消耗都在預測上,如下圖:

代碼實現C++ 使用hiredis

mac上安裝方法:brew install hiredis

ubuntu安裝方法:apt-get install hiredisCMake(僅供參考):

cmake_minimum_required(VERSION 3.6)

project(rune)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)

find_package(OpenCV REQUIRED)

add_executable(rune ${SOURCE_FILES})

link_directories(/usr/local/Cellar/hiredis/0.13.3/lib)

target_link_libraries(rune libhiredis.dylib libhiredis.0.13.dylib libhiredis.a)

TARGET_LINK_LIBRARIES(rune ${OpenCV_LIBS})demo1: 連接數據庫

redisContext* connect_redis(){

redisContext *context = redisConnect("127.0.0.1", 6379);

if(context->err) {

redisFree(context);

printf("connect redisServer err:%s\n", context->errstr);

return NULL;

}

printf("connect redisServer success\n");

return context;

}demo2: 測試redis lrange 操作

void test_redis_lrange(redisContext *context){

redisReply *result = (redisReply *)redisCommand(context, "lrange IMAGE_NAME_LIST 0 -1");

redisReply **elements = result->element;

size_t size = result->elements;

for(int i=0; i < size; i++){

string re = elements[i]->str;

int r = re.at(7) - 48;

cout << "r:" << r<<endl;

}

freeReplyObject(result);

cout << endl;

}一點經驗:由于關于hiredis的文檔比較少,所以很多參數、返回值不得不自己進行測試,通過閱讀源代碼是一種方式,我比較喜歡的是通過jetbrain CLion的debug模式進行查看。如下圖,在不清楚hiredis的lrange返回的參數的情況下,我通過在返回值那里設斷點,通過添加監視等操作來判斷如何正確獲取返回值。并且,Clion是可以跨平臺的,對學生免費。

Python 使用redis這個比較簡單,在這里僅提供一個demo,這個demo是我自己寫某個比較大的爬蟲項目時對redis進行封裝的一系列接口。

Redis 踩坑筆記

以前寫的一篇博客,記錄了Redis使用過程中的一些坑,歡迎交流

Redis 踩坑筆記

總結

以上是生活随笔為你收集整理的python在通信中的应用_基于Redis的进程间通信——在C++里使用python的深度学习模型...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。