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 數據庫,所以讀寫速度非???#xff0c;且使用非常簡單。但其底層是基于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的深度学习模型...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python configuration
- 下一篇: php 去重_php求两数组交集的四种方