1. 程式人生 > >mxnet-model-server部署的坑總結

mxnet-model-server部署的坑總結

本文主要給自己備忘用的,語無倫次,見諒!

首先,官網MXNet Model Server,點選learn more,找到advanced installation,選擇原始碼安裝。有人問為啥原始碼安裝??因為要採坑啊!!!print走起,否則不知道怎麼死的。。。。

修改原始碼要頻繁用到:

pip install -e .         pip install -U -e .

安裝好後,按樣例

mxnet-model-server --models xxx=yyy.model zzzz.py

其中,xxx是後面client要POST的網址名的一部分,yyy.model是本地model的檔名字,zzzz.py是data(本處為圖片)的預先和後處理,這個zzz可不是瞎編的要繼承mms\model_service裡的類,最好直接改example裡的sdd的。sdd的程式碼如下:

 def _preprocess(self, data):
        """
            Input image buffer from data is read into NDArray. Then, resized to
            expected shape. Swaps axes to convert image from BGR format to RGB.
            Returns the preprocessed NDArray as a list for next step, Inference.
        """
        # Read input
        input_image = image.read(data[0])

        # Save original input image shape.
        # This is required for preparing the bounding box of the detected object relative to
        # original input
        self.input_height = input_image.shape[0]
        self.input_width = input_image.shape[1]

        # Transform input image - resize, BGR to RGB.
        # Reuse MXNetVisionService _preprocess to achieve above transformations.

        return super(SSDService, self)._preprocess(data)

因為最後一句return過載了MXNetVisionService.py裡的_preprocess(data),而改_preprocess(data)裡含有img.resize。所以,此處對輸入的圖片不要再resize了。。。。


最重要的坑是:這裡沒去RGB均值,我參考MXNetVisionService,編了一個,如下:

  self.input_height = input_image.shape[0]
  self.input_width = input_image.shape[1]

        img_list = []
        for idx, img in enumerate(data):
            input_shape = self.signature['inputs'][idx]['data_shape']
            # We are assuming input shape is NCHW
            [h, w] = input_shape[2:]
            img_arr = image.read(img)
            img_arr = image.resize(img_arr, w, h)
            img_arr = image.transform_shape(img_arr).astype('float32')
            bias=mx.nd.array([123.0, 117.0, 104.0]).reshape((3,1,1))
            img_arr[0,:,:,:]-=bias
            img_list.append(img_arr)

        return img_list

記住最後return的不是super(SSDService, self)._preprocess(data)了。切記,切記!!!!

官網也沒說部署後怎麼用GPU執行!!!我自己摸索出來的,獻給各位:


在__init__裡,輸入引數gpu=0就是用0號GPU,以此類推!!!