モデル展開変換パドルハブ

1.プロジェクト関連のディレクトリ構造を作成します

 1.1ディレクトリと2つのファイル

   まず、モデル構造を出力するmaskため。フォルダーの下__init__.pyに作成されたファイルはmodule.py、特定のモデルのエクスポート情報を保存するために使用されます。もちろん、フォルダーの名前はカスタマイズできます。実際、これはのパッケージpythonの定義あり、スクリプトのモデル呼び出しを容易にするために、他の関連するエクスポートモデルもこのフォルダーに配置されます。

 1.2モジュールファイル情報

  このスクリプトファイルには、特定のモデル情報を書き込む必要があります。

  まず、関連する依存関係ライブラリをインポートする必要があります。独自のモデルに必要なパッケージに加えて、モデルのパッケージ出力に必要な次の2つのパッケージもインポートする必要があります。

  • import paddlehub as hub
    from paddlehub.module.module import runnable, moduleinfo, serving
    复制代码

  次に、モデルの関連情報を入力する必要があり、パッケージが注がれた後にそれを書き込むことができます。パラメーターは名前の意味を参照します。

  • @moduleinfo(
        name="mask", 
        version="1.0.0",
        summary="This is a PaddleHub Module. Just for test.",
        author="beordie",
        author_email="",
        type="mask",
    )
    复制代码

  最後に、パッケージ化して出力する必要のあるモデルコードをカプセル化し、オブジェクトをグローバルに宣言して、後続のモデルがそれを使用できるようにします。

  • class MaskPredict:
        def __init__(self, in_path = 'img', out_path = 'demo'):
            self.maskNet = load_model('/home/aistudio/work/mask_detector.model')
            self.in_path = in_path
            self.out_path = out_path
    
        def Iou(self, bbox1, bbox2):
            # 计算Iou
            area1 = (bbox1[2] - bbox1[0]) * (bbox1[3] - bbox1[1])
            area2 = (bbox2[2] - bbox2[0]) * (bbox2[3] - bbox2[1])
            w = min(bbox1[3], bbox2[3]) - max(bbox1[1], bbox2[1])
            h = min(bbox1[2], bbox2[2]) - max(bbox1[0], bbox2[0])
            if w <= 0 or h <= 0:
                return 0
            area_mid = w * h
            return area_mid / (area1 + area2 - area_mid)
    
        def GetFace(self):
            files = os.listdir(self.in_path)
            face_detector = hub.Module(name="pyramidbox_lite_server")
            for i in range(len(files)):
                faces = []
                preds = []
                img = cv2.imread(self.in_path + '/%d.jpg' % i)
                result = face_detector.face_detection(images=[img])
                img = img_to_array(img)
                data = result[0]['data']
                bbox_upgrade = []
                index = []
                for j in range(len(data)):
                    left, right = int(data[j]['left']), int(data[j]['right'])
                    top, bottom = int(data[j]['top']), int(data[j]['bottom'])
                    bbox = (left, top, right, bottom)
                    if right > 1600 and bottom > 1600:
                        for k in range(len(bbox_buffer)):
                            if Iou(bbox, bbox_buffer[k]) > 0.1 and k not in index:
                                index.append(k)
                                break
                        bbox_upgrade.append((left, top, right, bottom))
                    else:
                        preds.append([left, top, right, bottom])
                        faces.append(img[top:bottom, left:right])
                bbox_buffer = bbox_upgrade.copy()
                if len(faces) > 0:
                    count = 0
                    for face in faces:
                        face = cv2.cvtColor(face, cv2.COLOR_BGR2RGB)
                        face = cv2.resize(face, (224, 224))
                        face = img_to_array(face)
                        face = preprocess_input(face)
                        face = np.expand_dims(face, axis=0)
                        (mask, withoutMask) = self.maskNet.predict(face)[0]
                        lable = "Mask" if mask > withoutMask else "No Mask"
                        color = (0, 255, 0) if lable == "Mask" else (0, 0, 255)
                        lable = "{}:{:.2f}%".format(lable, max(mask, withoutMask) * 100)
                        cv2.putText(img, lable, (preds[count][0], preds[count][1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.45, color,
                                    2)
                        cv2.rectangle(img, (preds[count][0], preds[count][1]), (preds[count][2], preds[count][3]), color, 2)
                        count += 1
                cv2.imwrite(self.out_path + '/%d.jpg' % i, img)
                print('正在进行{}张图的处理'.format(i))
    
    mask = MaskPredict()
    复制代码

  これで簡単なモデルエクスポートの準備は完了です。もちろん、他の関数が必要な場合は、パラメーターを記述する必要があります。

 1.3コマンドラインの呼び出しとサービスの展開

Moduleコマンドライン呼び出しを    サポートする(必要なパラメーター解析を動的に指定する)場合は、runnable変更されたインターフェース(つまり、@ runnableで装飾されたメソッド)を提供する必要があります。インターフェースは、着信パラメーターの解析とモデル予測の実行を担当します。結果が返されます。コマンドライン機能を提供する必要がない場合、このインターフェイスを実装することはできません。PaddleHubコマンドラインで実行すると、コマンドラインモードModuleがサポートされていない対応するプロンプトが表示されます。

  • 配置解析参数
    self.parser = argparse.ArgumentParser(
                description="Run the mnist_predict module.",
                prog='hub run mnist_predict',
                usage='%(prog)s',
                add_help=True)
    self.parser.add_argument('--img', type=str, default=None, help="img to predict")
    复制代码
  • @runnable
    def runnable(self, argvs):
        args = self.parser.parse_args(argvs)
    	self.in_path = args['img']
    	return self.GetFace()
    复制代码

Module予測サービスの展開を    サポートする場合PaddleHub Servingは、serving装飾されたます。このインターフェイスは、受信データの解析、予測の実行、および結果の返送を担当します。PaddleHub Servingデプロイメント予測サービスを提供する必要がない場合は、サービング修飾子を追加する必要はありません。

  • @serving
    def serving(self, img_b64):
        print('serving')
        return json.dumps()
    复制代码

2.モデルのインストールと使用

    在 module.py 中编写好代码后,就可以通过 hub install 文件名 的方式来安装模型了,当然需要 cd 到父级目录下,不然报一堆 XXXX 怀疑人生。

  • ! hub install mask
    复制代码

    之后便可以向普通的模型一样进行导出使用了。

  • import paddlehub as hub
    Mask = hub.Module(name="mask")
    Mask.GetFace()
    复制代码

おすすめ

転載: juejin.im/post/7082572585283633165