久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

口罩檢測(cè)識(shí)別率驚人,這個(gè)Python項(xiàng)目開(kāi)源了

 板橋胡同37號(hào) 2020-03-08



首先感謝 AIZOOTech 的開(kāi)源項(xiàng)目 —— FaceMaskDetection??,,以下為該項(xiàng)目的 GitHub 地址:
https://github.com/AIZOOTech/FaceMaskDetection

測(cè)試環(huán)境

我們采用:
  • Windows 系統(tǒng),;

  • 軟件:PyCharm;

  • 使用模型:TensorFlow,。

先看一下效果:
檢測(cè)出帥氣的胡歌沒(méi)有帶口罩,。紅色框框是圈出人臉部分,上方的字體:NoMask ,,準(zhǔn)確率 1 (即有 100% 把握認(rèn)為沒(méi)帶口罩),。
如果在多人的情況下,能檢測(cè)出來(lái)嗎,?如下圖所示,。
不錯(cuò)不錯(cuò),這個(gè)模型能同時(shí)檢測(cè)多人的,,并且準(zhǔn)確高,。
有人帶口罩,有人沒(méi)帶口罩,,能檢測(cè)出來(lái)嗎,?
哇,這個(gè)模型很棒,。檢測(cè)出帶口罩大叔,,和兩個(gè)沒(méi)帶口罩的小伙子。
大家可以先在網(wǎng)頁(yè)體驗(yàn)一下:
https:///face-mask-detection.html
接下來(lái),,我們具體分析一下這個(gè)項(xiàng)目:
  • 支持 5 大主流深度學(xué)習(xí)框架(PyTorch,、TensorFlow、MXNet,、Keras 和 Caffe),,已經(jīng)寫好接口了;可以根據(jù)自身的環(huán)境選擇合適的框架,,比如:TensorFlow,;所有模型都在 models 文件夾下。

  • 公開(kāi)了近 8000 張的人臉口罩?jǐn)?shù)據(jù)和模型,,數(shù)據(jù)集來(lái)自于 WIDER Face 和 MAFA 數(shù)據(jù)集, 重新修改了標(biāo)注并進(jìn)行了校驗(yàn)(主要是 MAFA 和 WIDER Face 的人臉位置定義不一樣,,所以進(jìn)行了修改標(biāo)注)并將其開(kāi)源出來(lái)。


模型結(jié)構(gòu)

在本項(xiàng)目中使用了 SSD 類型的架構(gòu),為了讓模型可以實(shí)時(shí)的跑在瀏覽器以及終端設(shè)備上,,將模型設(shè)計(jì)的非常小,,只有 101.5 萬(wàn)個(gè)參數(shù)。模型結(jié)構(gòu)在本文附錄部分,。
本模型輸入大小為 260x260,,主干網(wǎng)絡(luò)只有 8 個(gè)卷積層,加上定位和分類層,,一共只有 24 層(每層的通道數(shù)目基本都是 32\64\128),,所以模型特別小,,只有 101.5 萬(wàn)參數(shù),。模型對(duì)于普通人臉基本都能檢測(cè)出來(lái),但是對(duì)于小人臉,,檢測(cè)效果肯定不如大模型,。
網(wǎng)頁(yè)使用了 Tensorflow.js 庫(kù),所以模型是完全運(yùn)行在瀏覽器里面的,。運(yùn)行速度的快慢,,取決于電腦配置的高低。
模型在五個(gè)卷積層上接出來(lái)了定位分類層,,其大小和 anchor 設(shè)置信息如下表,。

工程包目錄結(jié)構(gòu)分析

GitHub 工程包下載:
https://github.com/AIZOOTech/FaceMaskDetection
下載完 FaceMaskDetection 壓縮包后,解壓后如下圖:

如何運(yùn)行程序,?

以 TensorFlow 模型為例子,,代碼中 TensorFlow 版本應(yīng)該是 1.x;
如果是 TensorFlow 版本是 2.x 的朋友,,對(duì)應(yīng)函數(shù)修改為 tf.compat.v1.xxxx,使函數(shù)與 1.x 版本兼容,。
如果想運(yùn)行圖片:

python tenforflow_infer.py  --img-path /path/to/your/img


比如,img 目錄中作者放了一些圖片的,,選擇 demo2.jpg,。

python tenforflow_infer.py  --img-path  img/demo2.jpg


運(yùn)行結(jié)果:
如果想運(yùn)行運(yùn)行視頻:

python tenforflow_infer.py --img-mode 0 --video-path /path/to/video


/path/to/video 為視頻所在的路徑+視頻名。
如果想實(shí)時(shí)使用攝像頭檢測(cè):

python tenforflow_infer.py --img-mode 0 --video-path 0


這里的 0 ,,代表在電腦中設(shè)備號(hào),;0 默認(rèn)為電腦自帶的攝像頭。
如果想使用外接攝像頭,,可以改為 1 (比如外接上一個(gè) USB 攝像頭),。
這里看一下 tenforflow_infer.py 代碼:

# -*- coding:utf-8 -*-
import cv2
import time
import argparse

import numpy as np
from PIL import Image
from keras.models import model_from_json
from utils.anchor_generator import generate_anchors
from utils.anchor_decode import decode_bbox
from utils.nms import single_class_non_max_suppression
from load_model.tensorflow_loader import load_tf_model, tf_inference


#sess, graph = load_tf_model('FaceMaskDetection-master\models\face_mask_detection.pb')
sess, graph = load_tf_model('models\face_mask_detection.pb')
# anchor configuration
feature_map_sizes = [[3333], [1717], [99], [55], [33]]
anchor_sizes = [[0.040.056], [0.080.11], [0.160.22], [0.320.45], [0.640.72]]
anchor_ratios = [[10.620.42]] * 5

# generate anchors
anchors = generate_anchors(feature_map_sizes, anchor_sizes, anchor_ratios)

#用于推斷,批大小為1,,模型輸出形狀為[1,,N,4],因此將錨點(diǎn)的dim擴(kuò)展為[1,,anchor_num,,4]
anchors_exp = np.expand_dims(anchors, axis=0)
id2class = {0'Mask'1'NoMask'}


def inference(image, conf_thresh=0.5, iou_thresh=0.4, target_shape=(160160), draw_result=True, show_result=True):
    '''  檢測(cè)推理的主要功能
   # :param image:3D numpy圖片數(shù)組
    #  :param conf_thresh:分類概率的最小閾值。
   #  :param iou_thresh:網(wǎng)管的IOU門限
   #  :param target_shape:模型輸入大小,。
   #  :param draw_result:是否將邊框拖入圖像,。
   #  :param show_result:是否顯示圖像。
    '''

    # image = np.copy(image)
    output_info = []
    height, width, _ = image.shape
    image_resized = cv2.resize(image, target_shape)
    image_np = image_resized / 255.0  # 歸一化到0~1
    image_exp = np.expand_dims(image_np, axis=0)
    y_bboxes_output, y_cls_output = tf_inference(sess, graph, image_exp)

    # remove the batch dimension, for batch is always 1 for inference.
    y_bboxes = decode_bbox(anchors_exp, y_bboxes_output)[0]
    y_cls = y_cls_output[0]
    # 為了加快速度,,請(qǐng)執(zhí)行單類NMS,,而不是多類NMS。
    bbox_max_scores = np.max(y_cls, axis=1)
    bbox_max_score_classes = np.argmax(y_cls, axis=1)

    # keep_idx是nms之后的活動(dòng)邊界框,。
    keep_idxs = single_class_non_max_suppression(y_bboxes, bbox_max_scores, conf_thresh=conf_thresh,iou_thresh=iou_thresh)
    for idx in keep_idxs:
        conf = float(bbox_max_scores[idx])
        class_id = bbox_max_score_classes[idx]
        bbox = y_bboxes[idx]
        # 裁剪坐標(biāo),,避免該值超出圖像邊界。
        xmin = max(0, int(bbox[0] * width))
        ymin = max(0, int(bbox[1] * height))
        xmax = min(int(bbox[2] * width), width)
        ymax = min(int(bbox[3] * height), height)

        if draw_result:
            if class_id == 0:
                color = (02550)
            else:
                color = (25500)
            cv2.rectangle(image, (xmin, ymin), (xmax, ymax), color, 2)
            cv2.putText(image, '%s: %.2f' % (id2class[class_id], conf), (xmin + 2, ymin - 2),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, color)
        output_info.append([class_id, conf, xmin, ymin, xmax, ymax])

    if show_result:
        Image.fromarray(image).show()
    return output_info


def run_on_video(video_path, output_video_name, conf_thresh):
    cap = cv2.VideoCapture(video_path)
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    fps = cap.get(cv2.CAP_PROP_FPS)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    #writer = cv2.VideoWriter(output_video_name, fourcc, int(fps), (int(width), int(height)))
    total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
    if not cap.isOpened():
        raise ValueError('Video open failed.')
        return
    status = True
    idx = 0
    while status:
        start_stamp = time.time()
        status, img_raw = cap.read()
        img_raw = cv2.cvtColor(img_raw, cv2.COLOR_BGR2RGB)
        read_frame_stamp = time.time()
        if (status):
            inference(img_raw,
                      conf_thresh,
                      iou_thresh=0.5,
                      target_shape=(260260),
                      draw_result=True,
                      show_result=False)
            cv2.imshow('image', img_raw[:, :, ::-1])
            cv2.waitKey(1)
            inference_stamp = time.time()
            # writer.write(img_raw)
            write_frame_stamp = time.time()
            idx += 1
            print('%d of %d' % (idx, total_frames))
            print('read_frame:%f, infer time:%f, write time:%f' % (read_frame_stamp - start_stamp,
                                                                   inference_stamp - read_frame_stamp,
                                                                   write_frame_stamp - inference_stamp))
    # writer.release()


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Face Mask Detection')
    parser.add_argument('--img-mode', type=int, default=0, help='set 1 to run on image, 0 to run on video.')  #這里設(shè)置為1:檢測(cè)圖片,;還是設(shè)置為0:視頻文件(實(shí)時(shí)圖像數(shù)據(jù))檢測(cè)
    parser.add_argument('--img-path', type=str, help='path to your image.')
    parser.add_argument('--video-path', type=str, default='0', help='path to your video, `0` means to use camera.')
    # parser.add_argument('--hdf5', type=str, help='keras hdf5 file')
    args = parser.parse_args()
    if args.img_mode:
        imgPath = args.img_path
        #img = cv2.imread('imgPath')
        img = cv2.imread(imgPath)
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        inference(img, show_result=True, target_shape=(260260))
    else:
        video_path = args.video_path
        if args.video_path == '0':
            video_path = 0
        run_on_video(video_path, '', conf_thresh=0.5)


測(cè)試集 PR 曲線

因?yàn)?WIDER face 是一個(gè)任務(wù)比較復(fù)雜的數(shù)據(jù)集,,模型又設(shè)計(jì)的非常小,所以對(duì)于人臉的 PR 曲線并不是那么性感,。這點(diǎn)可以通過(guò)設(shè)計(jì)大模型來(lái)提升對(duì)于小人臉的檢測(cè)效果,。
再次感謝 AIZOOTech 的開(kāi)源項(xiàng)目 —— FaceMaskDetection。

【end】


原力計(jì)劃


《原力計(jì)劃【第二季】- 學(xué)習(xí)力挑戰(zhàn)》正式開(kāi)始,!即日起至 3月21日,,千萬(wàn)流量支持原創(chuàng)作者!更有專屬【勛章】等你來(lái)挑戰(zhàn)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多