国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

人臉識(shí)別實(shí)戰(zhàn)之基于開(kāi)源模型搭建實(shí)時(shí)人臉識(shí)別系統(tǒng)(二):人臉檢測(cè)概覽與模型選型

這篇具有很好參考價(jià)值的文章主要介紹了人臉識(shí)別實(shí)戰(zhàn)之基于開(kāi)源模型搭建實(shí)時(shí)人臉識(shí)別系統(tǒng)(二):人臉檢測(cè)概覽與模型選型。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

進(jìn)行人臉識(shí)別首要的任務(wù)就是要定位出畫(huà)面中的人臉,這個(gè)任務(wù)就是人臉檢測(cè)。人臉檢測(cè)總體上算是目標(biāo)檢測(cè)的一個(gè)特殊情況,但也有自身的特點(diǎn),比如角度多變,表情多變,可能存在各類(lèi)遮擋。早期傳統(tǒng)的方法有Haar Cascade、HOG等,基本做法就是特征描述子+滑窗+分類(lèi)器,隨著2012年Alexnet的出現(xiàn),慢慢深度學(xué)習(xí)在這一領(lǐng)域開(kāi)始崛起。算法和硬件性能的發(fā)展,也讓基于深度學(xué)習(xí)的人臉識(shí)別不僅性能取得了很大的提升,速度也能達(dá)到實(shí)時(shí),使得人臉技術(shù)真正進(jìn)入了實(shí)用。
開(kāi)源人臉識(shí)別,人臉識(shí)別,深度學(xué)習(xí),目標(biāo)檢測(cè),人工智能,python
人臉檢測(cè)大體上跟隨目標(biāo)檢測(cè)技術(shù)的發(fā)展,不過(guò)也有些自己的方法,主要可以分為一下幾類(lèi)方法.
開(kāi)源人臉識(shí)別,人臉識(shí)別,深度學(xué)習(xí),目標(biāo)檢測(cè),人工智能,python

人臉檢測(cè)算法概覽

由于這個(gè)系列重點(diǎn)并不在于算法細(xì)節(jié)本身,因而對(duì)于一些算法只是提及,有興趣可以自己精讀。

Cascade-CNN Based Models

這類(lèi)方法通過(guò)級(jí)聯(lián)幾個(gè)網(wǎng)絡(luò)來(lái)逐步提高準(zhǔn)確率,比較有代表性的是MTCNN方法。
開(kāi)源人臉識(shí)別,人臉識(shí)別,深度學(xué)習(xí),目標(biāo)檢測(cè),人工智能,python
MTCNN通過(guò)級(jí)聯(lián)PNet, RNet, ONet,層層過(guò)濾來(lái)提高整個(gè)檢測(cè)的精度。這個(gè)方法更適合CPU,那個(gè)時(shí)期的嵌入式設(shè)備使用比較多。 由于有3個(gè)網(wǎng)絡(luò),訓(xùn)練起來(lái)比較麻煩。

R-CNN

這一塊主要來(lái)源于目標(biāo)檢測(cè)中的RCNN, Fast RCNN, Faster RCNN
開(kāi)源人臉識(shí)別,人臉識(shí)別,深度學(xué)習(xí),目標(biāo)檢測(cè),人工智能,python

這類(lèi)方法精度高,但速度相對(duì)較慢。

Single Shot Detection Models

SSD是目標(biāo)檢測(cè)領(lǐng)域比較有代表性的一個(gè)算法,與RCNN系列相比,它是one stage方法,速度比較快?;谒挠糜谌四槞z測(cè)的代表性方法是SSH.

Feature Pyramid Network Based Models

開(kāi)源人臉識(shí)別,人臉識(shí)別,深度學(xué)習(xí),目標(biāo)檢測(cè),人工智能,python

YOLO系列

YOLO系列在目標(biāo)檢測(cè)領(lǐng)域比較成功,自然的也會(huì)用在人臉檢測(cè)領(lǐng)域,比如tiny yolo face,yolov5face, yolov8face等,基本上每一代都會(huì)應(yīng)用于人臉。

開(kāi)源模型的選型

為了能夠達(dá)到實(shí)時(shí),同時(shí)也要有較好的效果,我們將目光鎖定在yolo系列上,yolo在精度和速度的平衡上做的比較好,也比較易用。目前最新的是yolov8, 經(jīng)過(guò)搜索,也已經(jīng)有人將其用在人臉檢測(cè)上了:derronqi/yolov8-face: yolov8 face detection with landmark (github.com),
開(kāi)源人臉識(shí)別,人臉識(shí)別,深度學(xué)習(xí),目標(biāo)檢測(cè),人工智能,python

推理框架的選擇

簡(jiǎn)單起見(jiàn),我們選擇onnxruntime,該框架既支持CPU也支持GPU, 基本滿足了我們的開(kāi)發(fā)要求。

yolov8-face的使用

為了減少重復(fù)工作,我們可以定義一個(gè)模型的基類(lèi), 對(duì)模型載入、推理的操作進(jìn)行封裝,這樣就不需要每個(gè)模型都實(shí)現(xiàn)一遍了:

from easydict import EasyDict as edict
import onnxruntime
import threading

class BaseModel:
    def __init__(self, model_path, device='cpu', **kwargs) -> None:
        self.model = self.load_model(model_path, device)
        self.input_layer = self.model.get_inputs()[0].name
        self.output_layers = [output.name for output in self.model.get_outputs()]
        self.lock = threading.Lock()

    def load_model(self, model_path:str, device:str='cpu'):
        available_providers = onnxruntime.get_available_providers()
        if device == "gpu" and "CUDAExecutionProvider" not in available_providers:
            print("CUDAExecutionProvider is not available, use CPUExecutionProvider instead")
            device = "cpu"

        if device == 'cpu':
            self.model = onnxruntime.InferenceSession(model_path, providers=['CPUExecutionProvider'])
        else:
            self.model = onnxruntime.InferenceSession(model_path,providers=['CUDAExecutionProvider'])
            
        return self.model
        
    def inference(self, input):
        with self.lock:
            outputs = self.model.run(self.output_layers, {self.input_layer: input})
        return outputs
        
    def preprocess(self, **kwargs):
        pass

    def postprocess(self, **kwargs):
        pass

    def run(self, **kwargs):
        pass

繼承BaseModel, 實(shí)現(xiàn)模型的前處理和后處理:

class Yolov8Face(BaseModel):
    def __init__(self, model_path, device='cpu',**kwargs) -> None:
        super().__init__(model_path, device, **kwargs)
        self.conf_threshold = kwargs.get('conf_threshold', 0.5)
        self.iou_threshold = kwargs.get('iou_threshold', 0.4)
        self.input_size = kwargs.get('input_size', 640)
        self.input_width, self.input_height = self.input_size, self.input_size
        self.reg_max=16
        self.project = np.arange(self.reg_max)
        self.strides=[8, 16, 32]

        self.feats_hw = [(math.ceil(self.input_height / self.strides[i]), math.ceil(self.input_width / self.strides[i])) for i in range(len(self.strides))]
        self.anchors = self.make_anchors(self.feats_hw)

    def make_anchors(self, feats_hw, grid_cell_offset=0.5):
        """Generate anchors from features."""
        anchor_points = {}
        for i, stride in enumerate(self.strides):
            h,w = feats_hw[i]
            x = np.arange(0, w) + grid_cell_offset  # shift x
            y = np.arange(0, h) + grid_cell_offset  # shift y
            sx, sy = np.meshgrid(x, y)
            # sy, sx = np.meshgrid(y, x)
            anchor_points[stride] = np.stack((sx, sy), axis=-1).reshape(-1, 2)
        return anchor_points
    
    def preprocess(self, image, **kwargs):
        return resize_image(image, keep_ratio=True, dst_width=self.input_width, dst_height=self.input_height)
    
    def distance2bbox(self, points, distance, max_shape=None):
        x1 = points[:, 0] - distance[:, 0]
        y1 = points[:, 1] - distance[:, 1]
        x2 = points[:, 0] + distance[:, 2]
        y2 = points[:, 1] + distance[:, 3]
        if max_shape is not None:
            x1 = np.clip(x1, 0, max_shape[1])
            y1 = np.clip(y1, 0, max_shape[0])
            x2 = np.clip(x2, 0, max_shape[1])
            y2 = np.clip(y2, 0, max_shape[0])
        return np.stack([x1, y1, x2, y2], axis=-1)

    def postprocess(self, preds, scale_h, scale_w, top, left, **kwargs):
        bboxes, scores, landmarks = [], [], []
        for i, pred in enumerate(preds):
            stride = int(self.input_height/pred.shape[2])
            pred = pred.transpose((0, 2, 3, 1))
            
            box = pred[..., :self.reg_max * 4]
            cls = 1 / (1 + np.exp(-pred[..., self.reg_max * 4:-15])).reshape((-1,1))
            kpts = pred[..., -15:].reshape((-1,15)) ### x1,y1,score1, ..., x5,y5,score5

            # tmp = box.reshape(self.feats_hw[i][0], self.feats_hw[i][1], 4, self.reg_max)
            tmp = box.reshape(-1, 4, self.reg_max)
            bbox_pred = softmax(tmp, axis=-1)
            bbox_pred = np.dot(bbox_pred, self.project).reshape((-1,4))

            bbox = self.distance2bbox(self.anchors[stride], bbox_pred, max_shape=(self.input_height, self.input_width)) * stride
            kpts[:, 0::3] = (kpts[:, 0::3] * 2.0 + (self.anchors[stride][:, 0].reshape((-1,1)) - 0.5)) * stride
            kpts[:, 1::3] = (kpts[:, 1::3] * 2.0 + (self.anchors[stride][:, 1].reshape((-1,1)) - 0.5)) * stride
            kpts[:, 2::3] = 1 / (1+np.exp(-kpts[:, 2::3]))

            bbox -= np.array([[left, top, left, top]])  ###合理使用廣播法則
            bbox *= np.array([[scale_w, scale_h, scale_w, scale_h]])
            kpts -= np.tile(np.array([left, top, 0]), 5).reshape((1,15))
            kpts *= np.tile(np.array([scale_w, scale_h, 1]), 5).reshape((1,15))

            bboxes.append(bbox)
            scores.append(cls)
            landmarks.append(kpts)

        bboxes = np.concatenate(bboxes, axis=0)
        scores = np.concatenate(scores, axis=0)
        landmarks = np.concatenate(landmarks, axis=0)
    
        bboxes_wh = bboxes.copy()
        bboxes_wh[:, 2:4] = bboxes[:, 2:4] - bboxes[:, 0:2]  ####xywh
        classIds = np.argmax(scores, axis=1)
        confidences = np.max(scores, axis=1)  ####max_class_confidence
        
        mask = confidences>self.conf_threshold
        bboxes_wh = bboxes_wh[mask]  ###合理使用廣播法則
        confidences = confidences[mask]
        classIds = classIds[mask]
        landmarks = landmarks[mask]

        if len(bboxes_wh) == 0:
            return np.empty((0, 5)), np.empty((0, 5))
        
        indices = cv2.dnn.NMSBoxes(bboxes_wh.tolist(), confidences.tolist(), self.conf_threshold,
                                   self.iou_threshold).flatten()
        if len(indices) > 0:
            mlvl_bboxes = bboxes_wh[indices]
            confidences = confidences[indices]
            classIds = classIds[indices]
            ## convert box to x1,y1,x2,y2
            mlvl_bboxes[:, 2:4] = mlvl_bboxes[:, 2:4] + mlvl_bboxes[:, 0:2]

            # concat box, confidence, classId
            mlvl_bboxes = np.concatenate((mlvl_bboxes, confidences.reshape(-1, 1), classIds.reshape(-1, 1)), axis=1)
            
            landmarks = landmarks[indices]
            return mlvl_bboxes, landmarks.reshape(-1, 5, 3)[..., :2]
        else:
            return np.empty((0, 5)), np.empty((0, 5))

    
    def run(self, image, **kwargs):
        img, newh, neww, top, left = self.preprocess(image)
        scale_h, scale_w = image.shape[0]/newh, image.shape[1]/neww
        # convert to RGB
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img = img.astype(np.float32)
        img = img / 255.0
        img = np.transpose(img, (2, 0, 1))
        img = np.expand_dims(img, axis=0)
        output = self.inference(img)
        bboxes, landmarks = self.postprocess(output, scale_h, scale_w, top, left)
        # limit box in image
        bboxes[:, 0] = np.clip(bboxes[:, 0], 0, image.shape[1])
        bboxes[:, 1] = np.clip(bboxes[:, 1], 0, image.shape[0])
        
        return bboxes, landmarks

測(cè)試

在Intel? Core? i5-10210U上,yolov8-lite-t耗時(shí)50ms, 基本可以達(dá)到實(shí)時(shí)的需求。
開(kāi)源人臉識(shí)別,人臉識(shí)別,深度學(xué)習(xí),目標(biāo)檢測(cè),人工智能,python

參考文獻(xiàn):
ZOU, Zhengxia, et al. Object detection in 20 years: A survey. Proceedings of the IEEE, 2023.
MINAEE, Shervin, et al. Going deeper into face detection: A survey. arXiv preprint arXiv:2103.14983, 2021.文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-767169.html

到了這里,關(guān)于人臉識(shí)別實(shí)戰(zhàn)之基于開(kāi)源模型搭建實(shí)時(shí)人臉識(shí)別系統(tǒng)(二):人臉檢測(cè)概覽與模型選型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于OpenCV的人臉識(shí)別和模型訓(xùn)練系統(tǒng)(萬(wàn)字詳解)

    基于OpenCV的人臉識(shí)別和模型訓(xùn)練系統(tǒng)(萬(wàn)字詳解)

    我們身邊的人臉識(shí)別有車(chē)站檢票,監(jiān)控人臉,無(wú)人超市,支付寶人臉支付,上班打卡,人臉解鎖手機(jī)。? 人臉檢測(cè)是人臉識(shí)別系統(tǒng)組成的關(guān)鍵部分之一,其目的是檢測(cè)出任意給定圖片中的包含的一個(gè)或多個(gè)人臉,是人臉識(shí)別、表情識(shí)別等下游任務(wù)的基礎(chǔ)。人臉識(shí)別是通過(guò)采集

    2024年02月12日
    瀏覽(24)
  • 基于OpenCV進(jìn)行ESP32 CAM 的人臉和眼睛識(shí)別系統(tǒng)搭建

    在這個(gè)項(xiàng)目中,我們將構(gòu)建一個(gè) 基于 ESP32 CAM 的人臉和眼睛識(shí)別系統(tǒng) 。本教程向大家介紹一種高效的無(wú)線 視頻串流 方式。這里我們使用了 ESP32-CAM 模組,它是一個(gè)帶有 ESP32-S 芯片的 小型攝像頭模組。除了 OV2640 相機(jī)和多個(gè)用于連接外圍設(shè)備的 GPIO 外,它還具有一個(gè) microSD 卡

    2024年02月14日
    瀏覽(30)
  • 【實(shí)戰(zhàn)項(xiàng)目】網(wǎng)絡(luò)編程:在Linux環(huán)境下基于opencv和socket的人臉識(shí)別系統(tǒng)--C++實(shí)現(xiàn)

    【實(shí)戰(zhàn)項(xiàng)目】網(wǎng)絡(luò)編程:在Linux環(huán)境下基于opencv和socket的人臉識(shí)別系統(tǒng)--C++實(shí)現(xiàn)

    這里我們會(huì)實(shí)現(xiàn)一個(gè)項(xiàng)目:在linux操作系統(tǒng)下基于OpenCV和Socket的人臉識(shí)別系統(tǒng)。 目錄 ??前言 ??一、項(xiàng)目介紹 ??二、項(xiàng)目分工 ??三、項(xiàng)目難題 ??四、實(shí)現(xiàn)細(xì)節(jié) ??4.1?關(guān)鍵程序 ??4.2?運(yùn)行結(jié)果 ??五、程序分析 ??5.1 wkcv.link ??5.2?客戶端client.cpp ??5.3?服務(wù)端server.cpp 項(xiàng)目

    2024年03月12日
    瀏覽(14)
  • 人臉情緒識(shí)別開(kāi)源代碼、模型以及說(shuō)明文檔

    隊(duì)名:W03KFgNOc 排名:3 正確率: 0.75564 隊(duì)員:yyMoming,xkwang,RichardoMu。 比賽鏈接:人臉情緒識(shí)別挑戰(zhàn)賽 項(xiàng)目鏈接:link 該項(xiàng)目分別訓(xùn)練八個(gè)模型并生成csv文件,并進(jìn)行融合 打開(kāi) train.sh ,可以看到訓(xùn)練的命令行,依次注釋和解注釋隨后運(yùn)行 train.sh 。 因?yàn)槭怯?xùn)練八個(gè)模型,分別是

    2023年04月09日
    瀏覽(20)
  • 基于深度學(xué)習(xí)的高精度人臉口罩檢測(cè)識(shí)別系統(tǒng)(PyTorch+Pyside6+YOLOv5模型)

    基于深度學(xué)習(xí)的高精度人臉口罩檢測(cè)識(shí)別系統(tǒng)(PyTorch+Pyside6+YOLOv5模型)

    摘要:基于深度學(xué)習(xí)的高精度人臉口罩檢測(cè)識(shí)別系統(tǒng)可用于日常生活中或野外來(lái)檢測(cè)與定位人臉口罩目標(biāo),利用深度學(xué)習(xí)算法可實(shí)現(xiàn)圖片、視頻、攝像頭等方式的人臉口罩目標(biāo)檢測(cè)識(shí)別,另外支持結(jié)果可視化與圖片或視頻檢測(cè)結(jié)果的導(dǎo)出。本系統(tǒng)采用YOLOv5目標(biāo)檢測(cè)模型訓(xùn)練數(shù)

    2024年02月08日
    瀏覽(26)
  • 機(jī)器學(xué)習(xí)實(shí)戰(zhàn)-SVM模型實(shí)現(xiàn)人臉識(shí)別

    機(jī)器學(xué)習(xí)實(shí)戰(zhàn)-SVM模型實(shí)現(xiàn)人臉識(shí)別

    首先進(jìn)行導(dǎo)包 我們加載sklearn已經(jīng)幫我們收集好的人臉數(shù)據(jù) 查看結(jié)果: 我們?nèi)〕銎渲械臄?shù)據(jù)進(jìn)行查看: 運(yùn)行結(jié)果: 我們隨機(jī)選取一個(gè)人的圖片并通過(guò)索引獲取名字: 結(jié)果展示: 由于原來(lái)的數(shù)據(jù)很大,而且數(shù)據(jù)量多,我們首先對(duì)原始數(shù)據(jù)進(jìn)行PCA降維 結(jié)果展示: 然后對(duì)降維后

    2024年02月04日
    瀏覽(17)
  • 開(kāi)源人臉識(shí)別系統(tǒng)compareface介紹

    Exadel CompreFace是一種免費(fèi)的open-source人臉識(shí)別服務(wù),無(wú)需事先具備機(jī)器學(xué)習(xí)技能,即可輕松集成到任何系統(tǒng)中。CompreFace為人臉識(shí)別、人臉驗(yàn)證、人臉檢測(cè)、里程碑檢測(cè)、年齡和性別識(shí)別提供了REST API,并且易于與docker一起部署。 https://www.5axxw.com/wiki/content/cledeb 官網(wǎng)地址:Tech

    2023年04月09日
    瀏覽(17)
  • 項(xiàng)目實(shí)戰(zhàn)解析:基于深度學(xué)習(xí)搭建卷積神經(jīng)網(wǎng)絡(luò)模型算法,實(shí)現(xiàn)圖像識(shí)別分類(lèi)

    項(xiàng)目實(shí)戰(zhàn)解析:基于深度學(xué)習(xí)搭建卷積神經(jīng)網(wǎng)絡(luò)模型算法,實(shí)現(xiàn)圖像識(shí)別分類(lèi)

    隨著人工智能的不斷發(fā)展,深度學(xué)習(xí)這門(mén)技術(shù)也越來(lái)越重要,很多人都開(kāi)啟了學(xué)習(xí)機(jī)器學(xué)習(xí),本文將通過(guò)項(xiàng)目開(kāi)發(fā)實(shí)例,帶領(lǐng)大家從零開(kāi)始設(shè)計(jì)實(shí)現(xiàn)一款基于深度學(xué)習(xí)的圖像識(shí)別算法。 學(xué)習(xí)本章內(nèi)容, 你需要掌握以下基礎(chǔ)知識(shí): Python 基礎(chǔ)語(yǔ)法 計(jì)算機(jī)視覺(jué)庫(kù)(OpenCV) 深度學(xué)習(xí)

    2024年02月03日
    瀏覽(99)
  • 基于python-opencv,svm的開(kāi)源人臉識(shí)別項(xiàng)目

    基于python-opencv,svm的開(kāi)源人臉識(shí)別項(xiàng)目

    ? 前言 ? ? ? 本項(xiàng)目是我自己在學(xué)校里完成的一個(gè)小項(xiàng)目,本項(xiàng)目為基于python-opencv,svm的人臉識(shí)別開(kāi)源項(xiàng)目,不同于其他的直接從kaggle等獲取劃分好的數(shù)據(jù)集,本項(xiàng)目致力于從無(wú)到有的完成機(jī)器學(xué)習(xí)的所有步驟,即: 目錄 項(xiàng)目展示: 一、數(shù)據(jù)采集 1.創(chuàng)建爬蟲(chóng)項(xiàng)目 2.修改set

    2024年02月08日
    瀏覽(17)
  • Python 基于 OpenCV 視覺(jué)圖像處理實(shí)戰(zhàn) 之 OpenCV 簡(jiǎn)單人臉檢測(cè)/識(shí)別實(shí)戰(zhàn)案例 之六 簡(jiǎn)單進(jìn)行人臉訓(xùn)練與識(shí)別

    Python 基于 OpenCV 視覺(jué)圖像處理實(shí)戰(zhàn) 之 OpenCV 簡(jiǎn)單人臉檢測(cè)/識(shí)別實(shí)戰(zhàn)案例 之六 簡(jiǎn)單進(jìn)行人臉訓(xùn)練與識(shí)別

    目錄 Python 基于 OpenCV 視覺(jué)圖像處理實(shí)戰(zhàn) 之 OpenCV 簡(jiǎn)單人臉檢測(cè)/識(shí)別實(shí)戰(zhàn)案例 之六 簡(jiǎn)單進(jìn)行人臉訓(xùn)練與識(shí)別 一、簡(jiǎn)單介紹 二、簡(jiǎn)單進(jìn)行人臉訓(xùn)練與識(shí)別 1、LBPH(Local Binary Patterns Histograms)算法進(jìn)行人臉訓(xùn)練和識(shí)別 2、實(shí)現(xiàn)步驟: 3、判斷是誰(shuí)的人臉: 案例中涉及的關(guān)鍵函數(shù)說(shuō)

    2024年04月26日
    瀏覽(144)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包