圖像處理項目部署1:so部署

圖像處理項目怎麼部署,是很多圖像處理工程師一大問題。現在很多工程師不止只做圖像演算法,有時自己會做個小項目。隨著深度學習的風行,各種深度學習框架的盛行,而且很多框架都喜歡提供python介面,這也造就很多工程師都喜歡用快糙猛的python進項相關開發,開發起來速度快,上線快。今天我就分享下怎麼用python做一個演算法應用,而且不需要暴露自己的腳本代碼的情況下給其他小夥伴使用。

首先我們講下怎麼使用so文件進行相關部署。

相信用linux,unix的都熟悉這種類型的文件。之所以用這個so文件部署,我是跟之前架構師同事學來的(哈哈哈)。當時他們是用java直接(使用jpy)調用的我們演算法組的so文件,我們工程師只要把類封裝成so就成,這個so文件python也可以調用,我沒試過c++是不是也可以使用。

前段時間在騰訊公眾號提到過so文件進行部署,他們內部具體是不是使用這個技術不得而已,但是我相信這個是個不錯的方法,只要演算法工程師和服務端溝通好介面以後就可以部署了。騰訊的方法可以看文末的鏈接。

我們使用pytorch預訓練的模型resnet50進行相關演示。

首先寫需要生成so文件的代碼:

#coding:utf-8import torchfrom PIL import Imagefrom torch import nnimport torch.nn.functional as Ffrom torchvision import transforms as transformsdef preProcessImg(image, target_size): 將讀入的圖片轉換到模型需要的模型輸入 if image.mode != RGB: image = image.convert("RGB") image = transforms.Resize(target_size)(image) image = transforms.ToTensor()(image) image = transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])(image) image = image[None] return torch.autograd.Variable(image, volatile=True)class Worker: def __init__(self,parameter): self.model = parameter.get("model") self.idx2label = parameter.get("idx2label") def process(self,img_path): image = Image.open(img_path) img = preProcessImg(image,target_size=(224,224)) preds = F.softmax(self.model(img), dim=1) results = torch.topk(preds.cpu().data, k=3, dim=1) return self.idx2label.get(results[1][0].numpy()[0])

然後寫將上面代碼生成為so的代碼:

from Cython.Build import cythonizefrom Cython.Build.Dependencies import create_extension_listfrom distutils.core import setupfrom distutils.extension import Extensionfrom Cython.Distutils import build_extsetup(cmdclass = {"build_ext":build_ext},ext_modules=[Extension("imageClass",[imageClass.py])])

具體如何寫相關代碼,可以網上查看相關的一些說明。

然後運行:

python setup.py build_ext --build-lib .

然後就可以在當前目錄下生成imageClass.so文件。

如何使用這個so文件,可以使用python調用,也可以使用java調用。

用python寫一個測試程序:

#coding:utf-8from imageClass import Workerfrom torchvision.models import resnet50with open(idx2label.txt, r) as f: idx2label = eval(f.read())def loadModel(): 載入模型 model = resnet50(pretrained=True) return model.eval()if __name__==__main__: model = loadModel() params = {"model":model,"idx2label":idx2label} worker = Worker(params) path = "./pug.jpg" pred_result = worker.process(path) print ("result:",pred_result)

測試圖片:

操作視頻:

https://www.zhihu.com/video/978303139389030400

如果喜歡圖像處理,可以加我微信(lixianjie0518),拉你進群。

參考:數平精準推薦 | OCR技術之系統篇

推薦閱讀:

每天一練P11-Python和OpenCV做圖像處理(erode)
去霧演算法 顏色衰減先驗 《A Fast Image Haze Removal Algorithm Using Attenuation Prior》
紅外熱成像
圖像風格化演算法綜述三部曲之 (二) (Neural Style Transfer: A Review)
圖像基本知識:判斷圖像通道順序

TAG:圖像處理 | 計算機視覺 | 深度學習DeepLearning |