TD(webcam)→python(Deeplab)→TDする

前回の続き

TD側

videoDeviceOut->SpoutOut(senderName=input)で設定
SpoutIn(senderName=output)で設定

Python側

前回のwebcam用deeplabのコードを参考に変更させていただく。

モデルをローカルから読み込む
サンプルままだとwebからモデルをダウンロードしてたので、ローカルに落として毎回そこから読み込みたい。

コード内モデルダウンロードのところをコメント

## Select and download models
"""
_MODEL_URLS = {
   'mobilenetv2_coco_voctrainaug':'http://download.tensorflow.org/models/deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz',
   'mobilenetv2_coco_voctrainval':'http://download.tensorflow.org/models/deeplabv3_mnv2_pascal_trainval_2018_01_29.tar.gz',
   'xception_coco_voctrainaug': 'http://download.tensorflow.org/models/deeplabv3_pascal_train_aug_2018_01_04.tar.gz',
   'xception_coco_voctrainval': 'http://download.tensorflow.org/models/deeplabv3_pascal_trainval_2018_01_04.tar.gz',
}

_TARBALL_NAME = 'deeplab_model.tar.gz'

## fast model
model_url = _MODEL_URLS['mobilenetv2_coco_voctrainaug']
## accurate model
#model_url = _MODEL_URLS['xception_coco_voctrainaug']

model_dir = tempfile.mkdtemp()
tf.io.gfile.makedirs(model_dir)

download_path = os.path.join(model_dir, _TARBALL_NAME)
print('downloading model to %s, this might take a while...' % download_path)
urllib.request.urlretrieve(model_url, download_path)
print('download completed!')
"""

代わりにコード内のモデルリンクからダウンロードしてdeeplab内にmodelsファイルを作成して中に配置した。

##  Select local models
download_path = 'models/deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz'
#download_path = 'deeplabv3_pascal_train_aug_2018_01_04.tar.gz'


SpoutForPythonの追加

セットアップは前回ページ参照

Libraryフォルダをdeeplab階層に移動させる。

コードの追加

# load spout
from Library.Spout import Spout

spout sender, receiver作成

# create spout object
spout = Spout(silent = False)
# create receiver
spout.createReceiver('input')
# create sender
spout.createSender('output')

receiverで受け取り、PILへ渡す。あとは従来通りseg_imageを生成

while True:

   # From Spout to PIL
   data = spout.receive()
   pil_im = Image.fromarray(data)

   # Run model
   resized_im, seg_map = model.run(pil_im)
   
   # Adjust color of mask
   seg_image = get_dataset_colormap.label_to_color_image(
       seg_map, get_dataset_colormap.get_pascal_name()).astype(np.uint8)
       
   #show seg_image
   #cv2.imshow('frame', seg_image)

seg_imageをcvに変換、リサイズしてspoutでsend

#Convert PIL seg_image back to cv2 and resize
   frame = np.array(seg_image)
   r = data.shape[1] / frame.shape[1]
   dim = (int(frame.shape[0] * r), data.shape[1])[::-1]
   resized = cv2.resize(frame, dim, interpolation = cv2.INTER_AREA)
   resized = cv2.cvtColor(resized, cv2.COLOR_RGB2BGR)

   # check on close window
   spout.check()

   # send data
   spout.send(resized)

これでOK。あとはTD側で煮るなり焼くなり。



いいなと思ったら応援しよう!