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() 复制代码