# Facemask_Detection人臉口罩偵測(python)
### Facemask detection 模組 介紹
1. 模組功能: 偵測圖片中人臉的表情
2. 安裝參考: https://pypi.org/project/facemask-detection/
3. 安裝指令: !pip install Facemask detection
4. 官方網站: https://github.com/ternaus/retinaface
5. 注意事項:
- <font color='red' size=5>**必須在GPU下執行**</font>
```python=
!pip install facemask_detection
```
![](https://i.imgur.com/vP6srdX.png)
1. 從 facemask_detection.pre_trained_models 匯入 get_model 模組 來取得 模型
- 使用預先已經訓練的 model 來取得分類器
- 以 get_classifer
```python=
from facemask_detection.pre_trained_models import get_model as get_classifer
```
2. 必須匯入以下的模組<br>
<font color='red'> **import albumentation as A** <br></font>
<font color='grend'> **import torch**<br></font>
<font color='red'> **import cv2**<br></font>
<font color='grend'> **import numpy**<br></font>
```python=
# albumentations 負責處理圖片增強的一個模組
import albumentations as A
# 負責 針對 tenosr 運算的模組
import torch
import cv2
import numpy as np
```
3. 載入 已經訓練好的 acemask_detection model
- 模組名稱: tf_efficientnet_b0_ns_2020-07-29
- 語法:
model變數 = get_model("tf_efficientnet_b0_ns_2020-07-29")<br>
model變數.eval()
```python=
model = get_classifer("tf_efficientnet_b0_ns_2020-07-29")
model.eval()
```
4. 以 openCV 讀取要偵測的圖片 並轉為 RGB 格式 <br>
**圖片變數 = <font color='red'>cv2.cvtColor(</font><font color='grend'>cv2.imread(圖片路徑)</font>,<font color='red'>cv2.COLOR_BGR2RGB)** </font><br>
```python=
img1 = cv2.cvtColor(cv2.imread("angry1.jpg"), cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(cv2.imread("mask1.jpg"), cv2.COLOR_BGR2RGB)
```
5. 將圖片變數轉換成 facemask-detection 模組可以辨識的格式
```python=
transform = A.Compose(
[
A.SmallestMaxSize(max_size=256, p=1),
A.CenterCrop(height=244, width=244, p=1),
A.Normalize(p=1)
]
)
trans_image = transform(image=img1)["image"]
input = torch.from_numpy(
np.transpose(trans_image, (2, 0, 1))
).unsqueeze(0)
```
6. 將轉換後的圖片輸入資料(張量: tensor) 傳給 facemask-detection的 model來偵測
```python=
model(input)[0].item()
```
![](https://i.imgur.com/0NEo1p0.png)
### 偵測圖片中的人臉是否有戴口罩完整程式碼
```python=
#### 匯入所需的所有模組 ####
from facemask_detection.pre_trained_models import get_model as get_classifer
# albumentations 負責處理圖片增強的一個模組
import albumentations as A
# 負責 針對 tenosr 運算的模組
import torch
import cv2
import numpy as np
#### 載入 facemask_detection 的辨識 model #####
model = get_classifer("tf_efficientnet_b0_ns_2020-07-29")
model.eval()
#### 設計圖片轉換格式的轉換樣式 ####
transform = A.Compose(
[
A.SmallestMaxSize(max_size=256, p=1),
A.CenterCrop(height=244, width=244, p=1),
A.Normalize(p=1)
]
)
#### 讀取圖片並轉換成的轉換樣式並以 tensor 作為辨識輸入的資料 ####
# 讀取圖片並轉為 RGB 格式
image = cv2.imread("mask1.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 利用 transform 轉換成所需的格式
trans_image = transform(image=image)["image"] #取得image欄位的資料(numpy陣列資料)
# 利用 torch 將 numpy 陣列資料作為輸入辨識的 tensor
input = torch.from_numpy(
np.transpose(trans_image, (2, 0, 1))
).unsqueeze(0)
# 使用 model 進行偵測取得辨識結果
score = model(input)[0].item()
print(f"有戴口罩的機率是:{score}")
from google.colab.patches import cv2_imshow
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2_imshow(image)
```
![](https://i.imgur.com/lIiVH49.png)
```python=
#### 匯入所需的所有模組 ####
from facemask_detection.pre_trained_models import get_model as get_classifer
# albumentations 負責處理圖片增強的一個模組
import albumentations as A
# 負責 針對 tenosr 運算的模組
import torch
import cv2
import numpy as np
#### 載入 facemask_detection 的辨識 model #####
model = get_classifer("tf_efficientnet_b0_ns_2020-07-29")
model.eval()
#### 設計圖片轉換格式的轉換樣式 ####
transform = A.Compose(
[
A.SmallestMaxSize(max_size=256, p=1),
A.CenterCrop(height=244, width=244, p=1),
A.Normalize(p=1)
]
)
#### 讀取圖片並轉換成的轉換樣式並以 tensor 作為辨識輸入的資料 ####
# 讀取圖片並轉為 RGB 格式
IMG_FILES = ["mask1.jpg", "mask2.jpg", "mask3.jpg"]
for idx, file in enumerate(IMG_FILES):
image = cv2.imread(file)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 利用 transform 轉換成所需的格式
trans_image = transform(image=image)["image"] #取得image欄位的資料(numpy陣列資料)
# 利用 torch 將 numpy 陣列資料作為輸入辨識的 tensor
input = torch.from_numpy(
np.transpose(trans_image, (2, 0, 1))
).unsqueeze(0)
# 使用 model 進行偵測取得辨識結果
score = model(input)[0].item()
print(f"有戴口罩的機率是:{score}")
from google.colab.patches import cv2_imshow
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2_imshow(image)
```
![](https://i.imgur.com/JbPrY0c.png)
![](https://i.imgur.com/urcME8l.png)
![](https://i.imgur.com/T2XCQKh.png)
```python=
import math # 匯入數學函式庫
import cv2 # 匯入openCV
FH, FW = 480, 480
def resizeImgAndShow(img):
h, w = img.shape[ : 2]
if h < w: img = cv2.resize(img, (FW, math.floor(h/(w/FW))))
else: cv2.resize(img, (math.floor(w/(h/FH)), FH))
cv2_imshow(img)
cv2.imwrite("mask5.jpg", img)
image = cv2.imread("mask1.jpg")
resizeImgAndShow(image)
```
![](https://i.imgur.com/cvxL3At.png)