MASK-RCNNの学習済みモデルをCPU環境で動かしてみた


spmallickさんがGitHUbに上げている実コードを動かしてみました。
Macbook（mac Catalina OS）のCPU環境で、問題なく動くことを確認しました。

また、Wifi接続をオフにた後のオフライン環境でも、問題なく動きました。

###実行結果 

####（ 静止画像ファイル ）

![スクリーンショット 2021-08-07 15.16.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/0616fba9-6f82-f639-204d-50ec26960695.png)

![スクリーンショット 2021-08-07 16.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/af6330da-753d-7be3-9061-1c9b6c9b32e7.png)


![スクリーンショット 2021-08-07 16.00.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/0d409d8a-58cc-96f4-fc36-a421d33f94bf.png)


####（ 動画ファイル ）

![](https://user-images.githubusercontent.com/87643752/129127699-fde72a8c-174c-40c7-a732-a0fcf0098082.png)

![](https://user-images.githubusercontent.com/87643752/129127706-13f4ec78-339e-4a29-94c8-87ab36067fb4.png)

![](https://user-images.githubusercontent.com/87643752/129126845-c8d5991c-9ce2-415b-9a98-494dab562af0.png)


###git cloneした実装コード

今回、使うのは、以下のGitHubリポジトリにある実装コードです。

- [（GitHub） spmallick/learnopencv/tree/master/Mask-RCNN] (https://github.com/spmallick/learnopencv/tree/master/Mask-RCNN)


```bash:Termimal
electron@diynoMacBook-Pro Desktop % git clone https://github.com/spmallick/learnopencv.git
electron@diynoMacBook-Pro Desktop % 
```


```bash:Termimal
electron@diynoMacBook-Pro Desktop % cd learnopencv 
```

このリポジトリには、様々な用途で利用可能な多くの資源が同梱されている。

```bash:Termimal
electron@diynoMacBook-Pro learnopencv % ls 
AgeGender									Non-Maximum-Suppression
AlphaBlending									NonPhotorealisticRendering
AugmentedRealityWithArucoMarkers						OCR
Autoencoder-in-TensorFlow							ObjectDetection-YOLO
Background-Subtraction								OpenCV-dnn-gpu-support-Linux
Bag-Of-Tricks-For-Image-Classification						OpenCV-dnn-gpu-support-Windows
BatchNormalization								OpenPose
BlobDetector									OpenPose-Multi-Person
CI										OpenVINO-OpenCV
CameraCalibration								Optical-Flow-Estimation-using-Deep-Learning-RAFT
CenterofBlob									Optical-Flow-in-OpenCV
CharClassification								Photoshop-Filters-in-OpenCV
Classification-with-localization-convert-any-keras-classifier-into-a-detector	Playing-Chrome-TRex-Game-with-Facial-Gestures
ColorSpaces									Playing-rock-paper-scissors-with-AI
Colorization									PyTorch-Fully-Convolutional-Image-Classification
Colormap									PyTorch-Keypoint-RCNN
Conditional-GAN-PyTorch-TensorFlow						PyTorch-Mask-RCNN
Contour-Detection-using-OpenCV							PyTorch-Multi-Label-Image-Classification
ConvexHull									PyTorch-Multi-Label-Image-Classification-Image-Tagging
Creating-a-Virtual-Pen-and-Eraser						PyTorch-ONNX-TensorRT
DNN-OpenCV-Classification-Android						PyTorch-ONNX-TensorRT-CPP
DNN-OpenCV-Classification-with-Java						PyTorch-Receptive-Field-With-Backprop
Deep-Convolutional-GAN								PyTorch-Segmentation-torchvision
Deep-Learning-with-OpenCV-DNN-Module						PyTorch-Vision-Experiment-Logging
Delaunay									PyTorch-faster-RCNN
DenoisingAutoencoder								PyTorch-for-Beginners
Depth-Perception-Using-Stereo-Camera						PyTorch-to-CoreML-model-conversion
Efficient-image-loading								PyTorch-to-TensorFlow-Model-Conversion
EfficientNet									Pytorch-Lightning
EigenFace									Pytorch-Net-Surgery
EpipolarGeometryAndStereoVision							QRCode-OpenCV
ExposureFusion									Quora-Dataset-Duplicate-Search
FBAMatting									README.md
FPS										ReconstructFaceUsingEigenFaces
Face-Recognition-with-ArcFace							RedEyeRemover
FaceAverage									RotationMatrixToEulerAngles
FaceDetectionComparison								SVM-using-Python
FaceMaskOverlay									SeamlessCloning
FaceMorph									SelectiveSearch
FaceSwap									SnakeGame
FacialAttractiveness								Super-Resolution-in-OpenCV
FacialLandmarkDetection								TSNE
Federated-Learning-Intro							TensorBoard-With-Pytorch-Lightning
FunnyMirrors									TensorFlow-Fully-Convolutional-Image-Classification
GOTURN										TensorFlow-Receptive-Field-With-Backprop
Getting-Started-OpenCV-CUDA-Module						Tetris
Graph-Convolutional-Networks-Model-Relations-In-Data				TextDetectionEAST
HandPose									Threshold
Hangman										Training_a_custom_hand_detector_with_dlib
HeadPose									UI-cvui
Holes										UnderstandingLensDistortion
Homography									Universal-Sentence-Encoder
Hough-Transform									Variational-Autoencoder-TensorFlow
HuMoments									VideoBackgroundEstimation
Human-Action-Recognition-Using-Detectron2-And-Lstm				VideoReadWriteDisplay
Image-Classification-in-PyTorch							VideoStabilization
Image-Inpainting								WarpTriangle
Image-classification-pre-trained-models						XeusCling
Image-to-Image-Translation-with-GAN						YOLOv3-Training-Snowman-Detector
ImageAlignment									app-seperation-semseg
ImageAlignment-FeatureBased							barcode-QRcodeScanner
ImageMetrics									digits-classification
Improving-Illumination-in-Night-Time-Images					docs
Inference-for-PyTorch-Models							downloadOpenImages
Install-OpenCV-Windows-exe							forEach
InstallScripts									hdr
Intro-to-Generative-Adversarial-Network						heatmap
InvisibilityCloak								imread
Keras-Fine-Tuning								keras-linear-regression
Keras-ImageNet-Models								ninjaEyeDetector
Keras-Transfer-Learning								otsu-method
KerasCNN-CIFAR									pymodule
KerasMLP-MNIST									qt-test
MRNet-Single-Model								stereo-camera
MRnet-MultiTask-Approach							tracking
Mask-RCNN									video-classification-and-human-activity-recognition
MultiObjectTracker
electron@diynoMacBook-Pro learnopencv % 
electron@diynoMacBook-Pro learnopencv % ls MASK-RCNN
CMakeLists.txt					cars.mp4					mask_rcnn.py
LICENSE						colors.txt					mask_rcnn_inception_v2_coco_2018_01_28.pbtxt
README.md					mask_rcnn.cpp					mscoco_labels.names
cars.jpg					mask_rcnn.out
electron@diynoMacBook-Pro learnopencv %
```

このうち、__*MASK-RCNN*__を使います。

```bash:Termimal
electron@diynoMacBook-Pro learnopencv % cd MASK-RCNN
electron@diynoMacBook-Pro MASK-RCNN % ls
CMakeLists.txt					cars.mp4					mask_rcnn.py
LICENSE						colors.txt					mask_rcnn_inception_v2_coco_2018_01_28.pbtxt
README.md					mask_rcnn.cpp					mscoco_labels.names
cars.jpg					mask_rcnn.out
electron@diynoMacBook-Pro MASK-RCNN %
```

今回は、手元の独自データセットを用いたモデル学習は行いません。
学習済みモデルを動かして、推論工程だけを行うことにします。

推論工程を行うときには、__*mask_rcnn.py*__を使います。

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % ls mask_rcnn.py
mask_rcnn.py
electron@diynoMacBook-Pro MASK-RCNN %
```

推論対象のデータファイルを取得します。

- -https://github.com/spmallick/learnopencv/blob/master/Mask-RCNN/README.md

> Python
>
> wget http://download.tensorflow.org/models/object_detection/mask_rcnn_inception_v2_coco_2018_01_28.tar.gz tar zxvf mask_rcnn_inception_v2_coco_2018_01_28.tar.gz
>
> Download and extract the needed model files.
>
> Usage Examples :
>
> Python
>
> python3 mask_rcnn.py --image=cars.jpg python3 mask_rcnn.py --video=cars.mp4
>
> It starts the webcam - if no argument provided.

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % wget http://download.tensorflow.org/models/object_detection/mask_rcnn_inception_v2_coco_2018_01_28.tar.gz tar zxvf mask_rcnn_inception_v2_coco_2018_01_28.tar.gz
--2021-08-07 14:02:16--  http://download.tensorflow.org/models/object_detection/mask_rcnn_inception_v2_coco_2018_01_28.tar.gz
download.tensorflow.org (download.tensorflow.org) をDNSに問いあわせています... 2404:6800:4004:80e::2010, 172.217.175.112
download.tensorflow.org (download.tensorflow.org)|2404:6800:4004:80e::2010|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 177817887 (170M) [application/x-tar]
`mask_rcnn_inception_v2_coco_2018_01_28.tar.gz' に保存中

mask_rcnn_inception_v2_coco_2018_01_28.tar 100%[======================================================================================>] 169.58M  35.0MB/s 時間 5.4s     

2021-08-07 14:02:22 (31.1 MB/s) - `mask_rcnn_inception_v2_coco_2018_01_28.tar.gz' へ保存完了 [177817887/177817887]

--2021-08-07 14:02:22--  http://tar/
tar (tar) をDNSに問いあわせています... 失敗しました: nodename nor servname provided, or not known.
wget: ホストアドレス `tar' を解決できませんでした。
--2021-08-07 14:02:23--  http://zxvf/
zxvf (zxvf) をDNSに問いあわせています... 失敗しました: nodename nor servname provided, or not known.
wget: ホストアドレス `zxvf' を解決できませんでした。
--2021-08-07 14:02:23--  http://mask_rcnn_inception_v2_coco_2018_01_28.tar.gz/
mask_rcnn_inception_v2_coco_2018_01_28.tar.gz (mask_rcnn_inception_v2_coco_2018_01_28.tar.gz) をDNSに問いあわせています... 失敗しました: nodename nor servname provided, or not known.
wget: ホストアドレス `mask_rcnn_inception_v2_coco_2018_01_28.tar.gz' を解決できませんでした。
終了しました --2021-08-07 14:02:23--
経過時間: 6.4s
ダウンロード完了: 1 ファイル、170M バイトを 5.4s で取得 (31.1 MB/s)
electron@diynoMacBook-Pro MASK-RCNN % 
```

tar.gzで固められた圧縮ファイルが取得できました。

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % ls
CMakeLists.txt					cars.mp4					mask_rcnn.py
LICENSE						colors.txt					mask_rcnn_inception_v2_coco_2018_01_28.pbtxt
README.md					mask_rcnn.cpp					mask_rcnn_inception_v2_coco_2018_01_28.tar.gz
cars.jpg					mask_rcnn.out					mscoco_labels.names
electron@diynoMacBook-Pro MASK-RCNN % 
```

tar コマンド（zxvfオプション）で解凍します。

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % tar zxvf mask_rcnn_inception_v2_coco_2018_01_28.tar.gz 
x mask_rcnn_inception_v2_coco_2018_01_28/
x mask_rcnn_inception_v2_coco_2018_01_28/model.ckpt.index
x mask_rcnn_inception_v2_coco_2018_01_28/checkpoint
x mask_rcnn_inception_v2_coco_2018_01_28/pipeline.config
x mask_rcnn_inception_v2_coco_2018_01_28/model.ckpt.data-00000-of-00001
x mask_rcnn_inception_v2_coco_2018_01_28/model.ckpt.meta
x mask_rcnn_inception_v2_coco_2018_01_28/saved_model/
x mask_rcnn_inception_v2_coco_2018_01_28/saved_model/saved_model.pb
x mask_rcnn_inception_v2_coco_2018_01_28/saved_model/variables/
x mask_rcnn_inception_v2_coco_2018_01_28/frozen_inference_graph.pb
electron@diynoMacBook-Pro MASK-RCNN % 
```

解凍できたので、__*mask_rcnn_inception_v2_coco_2018_01_28*__というディレクトリが出来上がっています。

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % ls
CMakeLists.txt					colors.txt					mask_rcnn_inception_v2_coco_2018_01_28.pbtxt
LICENSE						mask_rcnn.cpp					mask_rcnn_inception_v2_coco_2018_01_28.tar.gz
README.md					mask_rcnn.out					mscoco_labels.names
cars.jpg					mask_rcnn.py
cars.mp4					mask_rcnn_inception_v2_coco_2018_01_28
electron@diynoMacBook-Pro MASK-RCNN % 
```

解凍した結果、次のファイルを取り出せました。
中身を見てみます。

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % ls mask_rcnn_inception_v2_coco_2018_01_28
checkpoint			model.ckpt.data-00000-of-00001	model.ckpt.meta			saved_model
frozen_inference_graph.pb	model.ckpt.index		pipeline.config
electron@diynoMacBook-Pro MASK-RCNN % 
```

ようやくこれで、推論実行スクリプト・ファイル（__*mask_rcnn.py*__）を実行する準備が整いました。

__*cars.jpg*__という静止画像ファイルと、__*cars.mp4*__という動画ファイルがあります。

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % ls
CMakeLists.txt					cars_mask_rcnn_out_py.avi			mask_rcnn.py
LICENSE						cars_mask_rcnn_out_py.jpg			mask_rcnn_inception_v2_coco_2018_01_28
README.md					colors.txt					mask_rcnn_inception_v2_coco_2018_01_28.pbtxt
cars.jpg					mask_rcnn.cpp					mask_rcnn_inception_v2_coco_2018_01_28.tar.gz
cars.mp4					mask_rcnn.out					mscoco_labels.names
electron@diynoMacBook-Pro MASK-RCNN % 
```

- __（ *cars.jpg* ）__

![cars.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/41796fa5-082d-6d68-bd06-c74b366546f2.jpeg)


- __（ *cars.mp4* ）__

![スクリーンショット 2021-08-07 15.12.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/1587b0d7-f74c-6a39-579d-11361790a591.png)

__*cars.jpg*__という静止画像ファイルを与えて、推論を実行します。

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % python3 mask_rcnn.py --image=cars.jpg                                      
Using CPU device
Done processing !!!
Output file is stored as  cars_mask_rcnn_out_py.jpg
electron@diynoMacBook-Pro MASK-RCNN % 
```

cars_mask_rcnn_out_py.jpgファイルが出力されたみたいです。

＞Output file is stored as  cars_mask_rcnn_out_py.jpg

たしかにありました。

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % ls cars_mask_rcnn_out_py.jpg
cars_mask_rcnn_out_py.jpg
```

開いてみます。

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % open cars_mask_rcnn_out_py.jpg
electron@diynoMacBook-Pro MASK-RCNN % 
```

![スクリーンショット 2021-08-07 14.32.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/b65825b1-a0a9-39b6-90ab-904b3a688104.png)


次は動画MP4ファイルを与えてみます。

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % python3 mask_rcnn.py --video=cars.mp4
Using CPU device
^CTraceback (most recent call last):
  File "/Users/electron/Desktop/learnopencv/Mask-RCNN/mask_rcnn.py", line 166, in <module>
    blob = cv.dnn.blobFromImage(frame, swapRB=True, crop=False)
KeyboardInterrupt

electron@diynoMacBook-Pro MASK-RCNN % 
```

![スクリーンショット 2021-08-07 15.12.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/702ae396-55ce-e64e-e574-17ac583dcdd8.png)

####別の静止画と動画ファイルを取得

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % ls *.jpg                             
cars.jpg			cars_mask_rcnn_out_py.jpg	doraemon.jpg			ioc_conference.jpg
electron@diynoMacBook-Pro MASK-RCNN %
````

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % ls *.mp4
cars.mp4	doraemon.mp4	trump.mp4
electron@diynoMacBook-Pro MASK-RCNN % 
```

###Wifi接続を切ってオフライン環境にする

オフライン環境でも、オンライン環境とまったく変わらない同じ動作をしました。

__（ 入力画像 ）__

![doraemon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/cfd528c3-cf81-95a4-2bb1-d1cc82cd1ad3.jpeg)


```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % python3 mask_rcnn.py --image=doraemon.jpg
Using CPU device
Done processing !!!
Output file is stored as  doraemon_mask_rcnn_out_py.jpg
electron@diynoMacBook-Pro MASK-RCNN %
```

__（ 出力画像 ）__

![doraemon_mask_rcnn_out_py.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/985ff759-96cf-7c73-3f4b-ad44d2358854.jpeg)

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % ls *doraemon*
doraemon.jpg			doraemon_mask_rcnn_out_py.jpg
electron@diynoMacBook-Pro MASK-RCNN % open doraemon_mask_rcnn_out_py.jpg
```

####別の画像を試してみます。

__（ 入力画像 ）__

![ioc_conference.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/5a46e3b2-5cb2-f139-4193-e5c840b8398a.jpeg)


```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % python3 mask_rcnn.py --image=ioc_conference.jpg
Using CPU device
Done processing !!!
Output file is stored as  ioc_conference_mask_rcnn_out_py.jpg
electron@diynoMacBook-Pro MASK-RCNN %
```

__（ 出力画像 ）__

![ioc_conference_mask_rcnn_out_py.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/0d196f65-52b2-168e-d66b-dc630a15b369.jpeg)


```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % ls *ioc*                                       
ioc_conference.jpg			ioc_conference_mask_rcnn_out_py.jpg
electron@diynoMacBook-Pro MASK-RCNN % 
electron@diynoMacBook-Pro MASK-RCNN % open ioc_conference_mask_rcnn_out_py.jpg
```

####今度はオフライン環境で、MP4ファイル（動画）を試してみます。

```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % python3 mask_rcnn.py --video=trump.mp4
Using CPU device
^CTraceback (most recent call last):
  File "/Users/electron/Desktop/learnopencv/Mask-RCNN/mask_rcnn.py", line 188, in <module>
    cv.imshow(winName, frame)
KeyboardInterrupt

electron@diynoMacBook-Pro MASK-RCNN % 
```

![スクリーンショット 2021-08-07 15.38.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/080559f3-46ba-df2f-a411-3805733b82d4.png)


```bash:Termimal
electron@diynoMacBook-Pro MASK-RCNN % python3 mask_rcnn.py --video=doraemon.mp4
Using CPU device
^C^CTraceback (most recent call last):
  File "/Users/electron/Desktop/learnopencv/Mask-RCNN/mask_rcnn.py", line 172, in <module>
    boxes, masks = net.forward(['detection_out_final', 'detection_masks'])
KeyboardInterrupt

electron@diynoMacBook-Pro MASK-RCNN % 
```

![スクリーンショット 2021-08-07 15.39.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/a741961b-fdf3-2329-7034-c8ed1b3c121d.png)

![スクリーンショット 2021-08-07 15.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/6839aace-48e5-c880-582c-56106868482e.png)