Semantic Segmentationで人物切り抜き(FCN_resnet101)

2021年2月24日記事を更新しました。

初めに

今回はデモのみ実行してみた

環境

Windows10 Pro
NVIDIA GeForce GTX1080
CUDA 10.2
Python 3.6.8

バージョン確認

インストールが必要なのは「mxnet」と「gluoncv」のみです。

autocfg==0.0.6
autogluon.core==0.1.0b20210222
autograd==1.3
bcrypt==3.2.0
boto3==1.17.12
botocore==1.20.12
certifi==2020.12.5
cffi==1.14.5
chardet==3.0.4
click==7.1.2
cloudpickle==1.6.0
ConfigSpace==0.4.18
contextvars==2.4
cryptography==3.4.6
cycler==0.10.0
Cython==0.29.22
dask==2021.2.0
dataclasses==0.8
decord==0.5.2
dill==0.3.3
distributed==2021.2.0
future==0.18.2
gluoncv==0.9.4.post1
graphviz==0.8.4
HeapDict==1.0.1
idna==2.6
immutables==0.15
jmespath==0.10.0
joblib==1.0.1
kiwisolver==1.3.1
matplotlib==3.3.4
msgpack==1.0.2
mxnet-cu102==1.7.0
numpy==1.19.5
opencv-python==4.5.1.48
pandas==1.1.5
paramiko==2.7.2
Pillow==8.1.0
portalocker==2.2.1
protobuf==3.15.1
psutil==5.8.0
pycparser==2.20
PyNaCl==1.4.0
pyparsing==2.4.7
python-dateutil==2.8.1
pytz==2021.1
pywin32==300
PyYAML==5.4.1
requests==2.25.1
s3transfer==0.3.4
scikit-learn==0.24.1
scipy==1.5.4
six==1.15.0
sortedcontainers==2.3.0
tblib==1.7.0
tensorboardX==2.1
threadpoolctl==2.1.0
toolz==0.11.1
tornado==6.1
tqdm==4.57.0
urllib3==1.26.3
yacs==0.1.8
zict==2.0.0

実行ファイル

import numpy as np
from PIL import Image
import mxnet as mx
from mxnet.gluon.data.vision import transforms
import gluoncv

ctx = mx.gpu()
filename = gluoncv.utils.download('https://raw.githubusercontent.com/dmlc/web-data/master/gluoncv/segmentation/voc_examples/1.jpg')

#画像をPILで読み込む
img = Image.open(filename)

#データの正規化
transform_fn = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize([.485, .456, .406], [.229, .224, .225])
])
mx_img = transform_fn(mx.nd.array(img))
mx_img = mx_img.expand_dims(0).as_in_context(ctx)

#モデルを読み込む(初回は自動でダウンロード)
model = gluoncv.model_zoo.get_model('fcn_resnet101_voc', pretrained=True)
model.collect_params().reset_ctx(ctx)

#モデルの適応
#人だけを抽出する(class:15)
output = model.predict(mx_img)
predict = mx.nd.squeeze(mx.nd.argmax(output, 1)).asnumpy()
a = np.where(predict ==15, 255, 0)
b = Image.fromarray(a).convert('L')

#元画像と結果を重ね合わせる
img.putalpha(b)
img.show()

結果

f:id:touch-sp:20190803205332j:plain
f:id:touch-sp:20190803205356p:plain

メモ1

1: aeroplane
2: bicycle
3: bird
4: boat
5: bottle
6: bus
7: car
8: cat
9: chair
10: cow
11: diningtable
12: dog
13: horse
14: motorbike
15: person
16: pottedplant
17: sheep
18: sofa
19: train
20: tvmonitor

メモ2

使用できるモデルは以下で表示できる。

gluoncv.model_zoo.get_model_list()