天天看點

【深度學習案例】批量檢測戴口罩

一、定義待預測資料

# 待預測圖檔
test_img_path = ["./img.png"]

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img = mpimg.imread(test_img_path[0])

# 展示待預測圖檔
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()      

傳回:

【深度學習案例】批量檢測戴口罩

若是待預測圖檔存放在一個檔案中,如左側檔案夾所示的test.txt。每一行是待預測圖檔的存放路徑。

代碼:

with open('mask.txt', 'r') as f:
    try:
        test_img_path=[]
        for line in f:
            test_img_path.append(line.strip())
    except:
        print('圖檔加載失敗')
print(test_img_path)      
【深度學習案例】批量檢測戴口罩

二、加載預訓練模型

PaddleHub口罩檢測提供了兩種預訓練模型,pyramidbox_lite_mobile_mask和pyramidbox_lite_server_mask。二者均是基于2018年百度發表于計算機視覺頂級會議ECCV 2018的論文PyramidBox而研發的輕量級模型,模型基于主幹網絡FaceBoxes,對于光照、口罩遮擋、表情變化、尺度變化等常見問題具有很強的魯棒性。不同點在于,pyramidbox_lite_mobile_mask是針對于移動端優化過的模型,适合部署于移動端或者邊緣檢測等算力受限的裝置上。

import paddlehub as hub

module = hub.Module(name="pyramidbox_lite_mobile_mask")
# module = hub.Module(name="pyramidbox_lite_server_mask")      

三、預測

PaddleHub對于支援一鍵預測的module,可以調用module的相應預測API,完成預測功能。

# 口罩檢測預測
visualization=True #将預測結果儲存圖檔可視化
output_dir='detection_result' #預測結果圖檔儲存在目前運作路徑下detection_result檔案夾下
results = module.face_detection(images=imgs, use_multi_scale=True, shrink=0.6, visualization=True, output_dir='detection_result/test.jpg')
for result in results:
    print(result)

# 預測結果展示
import matplotlib.image as im
import matplotlib.pyplot as plt
import os

# 需要讀取的路徑
path_name = r'./detection_result'

for item in os.listdir(path=path_name):
    img = im.imread(os.path.join(path_name, item))
    plt.imshow(img)
    plt.show()      

傳回如下:

【深度學習案例】批量檢測戴口罩

其中,label有’MASK’和’NO MASK’兩種選擇:'MASK’表示戴了口罩,'NO MASK表示沒有佩戴口罩。‘left’/‘rigth’/‘top’/'bottom’表示口罩在圖檔當中的位置。'confidence’表示預測為佩戴口罩’MASK’或者不佩戴口罩’NO MASK’的機率大小。同時,作為一項完善的開源工作,除了本地推斷以外,PaddleHub還支援将該預訓練模型部署到伺服器或移動裝置中。

四.完整源碼

需要檔案也可以左側聯系我,當然我也是百度随便找的。

# coding=gbk
"""
作者:川川
@時間  : 2021/8/30 0:14
群:970353786
"""
# 待預測圖檔
# test_img_path = ["./img.png"]

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# img = mpimg.imread(test_img_path[0])

# 展示待預測圖檔
# plt.figure(figsize=(10,10))
# plt.imshow(img)
# plt.axis('off')
# plt.show()

with open('mask.txt', 'r') as f:
    try:
        test_img_path=[]
        for line in f:
            test_img_path.append(line.strip())
    except:
        print('圖檔加載失敗')
print(test_img_path)
# import os

import cv2

# imgs =[cv2.imread(image_path) for image_path in test_img_path]
imgs=[cv2.imread(test_img_path[0])]
# for i in imgs:
#加載子產品
import paddlehub as hub

module = hub.Module(name="pyramidbox_lite_mobile_mask")
# module = hub.Module(name="pyramidbox_lite_server_mask")
# 口罩檢測預測
visualization=True #将預測結果儲存圖檔可視化
output_dir='detection_result' #預測結果圖檔儲存在目前運作路徑下detection_result檔案夾下
results = module.face_detection(images=imgs, use_multi_scale=True, shrink=0.6, visualization=True, output_dir='detection_result')
for result in results:
    print(result)

# 預測結果展示
import matplotlib.image as im
import matplotlib.pyplot as plt
import os

# 需要讀取的路徑
path_name = r'./detection_result'

for item in os.listdir(path=path_name):
    img = im.imread(os.path.join(path_name, item))
    plt.imshow(img)
    plt.show()      

如果你想放在伺服器上:

執行如下指令啟動模型:

hub serving start -m pyramidbox_lite_server_mask -p 8866      

代碼為:

# coding: utf8
import requests
import json
import base64
import os

# 指定要檢測的圖檔并生成清單[("image", img_1), ("image", img_2), ... ]
file_list = ["test.jpg"]
files = [("image", (open(item, "rb"))) for item in file_list]

# 指定檢測方法為pyramidbox_lite_server_mask并發送post請求
url = "http://127.0.0.1:8866/predict/image/pyramidbox_lite_server_mask"
r = requests.post(url=url, files=files, data={"visual_result": "True"})

results = eval(r.json()["results"])

# 儲存檢測生成的圖檔到output檔案夾,列印模型輸出結果
if not os.path.exists("output"):
    os.mkdir("output")
for item in results:
    with open(os.path.join("output", item["path"]), "wb") as fp:
        fp.write(base64.b64decode(item["base64"].split(',')[-1]))
        item.pop("base64")
print(json.dumps(results, indent=4, ensure_ascii=False))      

繼續閱讀