1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        人臉識(shí)別:insightface自定義數(shù)據(jù)集制作 | 附練手?jǐn)?shù)據(jù)集

        共 8418字,需瀏覽 17分鐘

         ·

        2020-12-23 16:43

        點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

        重磅干貨,第一時(shí)間送達(dá)

        轉(zhuǎn)自|小白玩轉(zhuǎn)python

        01

        人臉識(shí)別簡介


        簡單來講,人臉識(shí)別這個(gè)問題,就是給定兩個(gè)人臉,然后判定他們是不是同一個(gè)人,這是它最原始的定義。它有很多應(yīng)用場景,比如銀行柜臺(tái)、海關(guān)、手機(jī)解、酒店入住、網(wǎng)吧認(rèn)證,會(huì)查身份證跟你是不是同一個(gè)人。


        關(guān)于人臉識(shí)別的內(nèi)容,網(wǎng)上資料很多,這里推薦一篇綜述,詳細(xì)介紹了一些人臉識(shí)別的背景和目前的相關(guān)研究,以及常用的人臉識(shí)別模型:

        http://www.elecfans.com/d/709424.html


        好了,直接進(jìn)入主題,今天的重點(diǎn):

        insightface論文:https://arxiv.org/abs/1801.07698

        insightface github項(xiàng)目:https://github.com/deepinsight/insightface



        02

        制作數(shù)據(jù)集


        一、環(huán)境配置


        官方提供的項(xiàng)目是基于mxnet框架的

        因此首先需要配置好這些環(huán)境,這里假設(shè)已經(jīng)安裝好cuda等


        mxnet的安裝相對(duì)來說比較簡單(相對(duì)于caffe)

        (1)查詢自己cuda的版本

        # 輸入nvcc -V# 輸出結(jié)果nvcc: NVIDIA (R) Cuda compiler driverCopyright (c) 2005-2017 NVIDIA CorporationBuilt on Fri_Sep__1_21:08:03_CDT_2017Cuda?compilation?tools,?release?9.0,?V9.0.176

        (2)用pip安裝mxnet(GPU版本)

        pip?install?mxnet-cu90# 根據(jù)自身情況查詢對(duì)應(yīng)的安裝命令,例如我服務(wù)器的cuda版本是10.0的,安裝命令為 pip install mxnet-cu100


        二、克隆項(xiàng)目和數(shù)據(jù)集下載


        將insight項(xiàng)目克隆到本地

        git clone --recursive https://github.com/deepinsight/insightface.git

        下載lfw數(shù)據(jù)集

        鏈接:http://vis-www.cs.umass.edu/lfw/index.html#download


        這里為了方便,提供了lfw的部分用于練手

        練手?jǐn)?shù)據(jù)集https://www.lanzous.com/i7gdxva,僅用于制作數(shù)據(jù)集練手


        觀察數(shù)據(jù)集:

        這里提供了20個(gè)用于練手,完整數(shù)據(jù)集可以去上面的鏈接或自行查找下載。

        說明:每個(gè)文件夾名為人的姓名,文件夾內(nèi)包含多張人臉(>=1)。


        三、開始制作所需要格式的數(shù)據(jù)集


        (1)數(shù)據(jù)對(duì)齊并生成lst文件


        將lfw數(shù)據(jù)集下載好并放置在datasets下(這里以lfwdata命名的文件夾),然后新建一個(gè)文件夾并命名為output保存對(duì)齊后的人臉圖片,新建一個(gè)文件夾命名為train用于保存輸出結(jié)果


        運(yùn)行insightface項(xiàng)目下 src/align下的align_lfw.py文件

        python align_lfw.py --input-dir ../../datasets/lfwdata --output-dir ../../datasets/output

        --input :輸入需要對(duì)齊的數(shù)據(jù)的路徑

        --output:輸出對(duì)齊后的數(shù)據(jù)保存路徑


        對(duì)齊后的圖片



        遇到問題1:

        ValueError: Object arrays cannot be loaded when allow_pickle=False

        解決方案:

        pip3 install numpy==1.16.1?

        如果已安裝了多個(gè)numpy版本,需要先將其卸載后在運(yùn)行

        遇到問題2:

        AttributeError: module 'scipy.misc' has no attribute 'imread'

        解決方案:

        pip install scipy==1.1.0


        如果成功運(yùn)行,output文件夾下會(huì)產(chǎn)生對(duì)齊后的人臉以及一個(gè)lst文件(將lst文件改名為 train.lst,并移動(dòng)到train文件下

        終端下,移動(dòng)和重命名的操作

        # 重命名 mv [原始文件名] [改變后的文件名] mv lst train.lst# 移動(dòng) mv [起始文件路徑] [目標(biāo)文件路徑]mv train.lst ../train/

        觀察生成的 lst 文件內(nèi)容:

        1       ../../datasets/train/Abbas_Kiarostami/Abbas_Kiarostami_0001.jpg 01       ../../datasets/train/Abdel_Aziz_Al-Hakim/Abdel_Aziz_Al-Hakim_0001.jpg   1# 其中1代表對(duì)齊,最后的數(shù)字0,1代表class label 中間是地址;需要用\t表示tab鍵,不能用空格間隔。

        (2)創(chuàng)建property配置文件

        在datasets/train下創(chuàng)建property,沒有后綴

        寫入下面內(nèi)容,含義1000,112,112代表ID數(shù)量,尺寸,尺寸

        1000,112,112


        (3)生成rec&idx文件(依托于lst文件)


        運(yùn)行src/data face2rec2.py

        python face2rec2.py ../../datasets/train/


        運(yùn)行可能會(huì)報(bào)錯(cuò),需要修改,可能原因是源代碼是基于python2的

        在python3下運(yùn)行,修改第105行成如下所示:

        s = mx.recordio.pack(header, b'')

        運(yùn)行成功后會(huì)出現(xiàn)兩個(gè)文件

        train.idx和train.rec

        將train.idx, train.rec是放置在train文件夾中,用于后續(xù)訓(xùn)練使用,不然后續(xù)創(chuàng)建pair會(huì)報(bào)錯(cuò)


        (4)創(chuàng)建pair文件


        為了做測試我們需要生成驗(yàn)證集用的bin文件,bin文件生成前需要做pair文件,就是一對(duì)一對(duì)的數(shù)據(jù),每一行分別是

        圖A的目錄 空格 圖B的目錄 空格 標(biāo)志0/1(代表兩張圖類別一致否)

        在src/data下新建一個(gè)代碼generate_image_pairs.py用于生成pairs

        代碼來源:https://blog.csdn.net/CLOUD_J/article/details/100672392

        # coding:utf-8import sysimport osimport randomimport timeimport itertoolsimport pdbimport argparse#src = '../../datasets/lfw2'#dst = open('../../datasets/lfw/train.txt', 'a')parser = argparse.ArgumentParser(description='generate image pairs')# generalparser.add_argument('--data-dir', default='', help='')parser.add_argument('--outputtxt', default='', help='path to save.')parser.add_argument('--num-samepairs',default=100)args = parser.parse_args()cnt = 0same_list = []diff_list = []list1 = []list2 = []folders_1 = os.listdir(args.data_dir)dst = open(args.outputtxt, 'a')count = 0dst.writelines('\n')# 產(chǎn)生相同的圖像對(duì)for folder in folders_1:    sublist = []    same_list = []    imgs = os.listdir(os.path.join(args.data_dir, folder))    for img in imgs:        img_root_path = os.path.join(args.data_dir, folder, img)        sublist.append(img_root_path)        list1.append(img_root_path)    for item in itertools.combinations(sublist, 2):        for name in item:            same_list.append(name)    if len(same_list) > 10 and len(same_list) < 13:        for j in range(0, len(same_list), 2):                if count < int(args.num_samepairs):#數(shù)量可以修改                    dst.writelines(same_list[j] + ' ' + same_list[j+1]+ ' ' + '1' + '\n')                    count += 1    if count >= int(args.num_samepairs):        breaklist2 = list1.copy()# 產(chǎn)生不同的圖像對(duì)diff = 0print(count)# 如果不同的圖像對(duì)遠(yuǎn)遠(yuǎn)小于相同的圖像對(duì),則繼續(xù)重復(fù)產(chǎn)生,直到兩者相差很小while True:    random.seed(time.time() * 100000 % 10000)    random.shuffle(list2)    for p in range(0, len(list2) - 1, 2):        if list2[p] != list2[p + 1]:            dst.writelines(list2[p] + ' ' + list2[p + 1] + ' ' + '0'+ '\n')            diff += 1            if diff >= count:                break            #print(diff)    if diff < count:        #print('--')        continue    else:        break

        運(yùn)行g(shù)enerate_image_pairs.py

        python3 generate_image_pairs.py --data-dir ../../datasets/output --outputtxt ../../datasets/train/train.txt --num-samepairs 5


        --data-dir 后接對(duì)齊后的人臉

        --outputtxt 用于保存train.txt文件

        --num-samepairs ?生成多少對(duì)(具體如何設(shè)置,還需要好好研究一下)

        運(yùn)行成功后在datasets/train下會(huì)生成一個(gè)train.txt文件

        內(nèi)容:

        ../../datasets/output/Abdullah/Abdullah_0002.jpg ../../datasets/output/Abdullah/Abdullah_0004.jpg 1# 前面兩個(gè)分布是生成的pairs的路徑,后面的0/1代表是否同一個(gè)人或類


        (5)生成驗(yàn)證集bin文件

        成功后利用/src/data/下的 lfw2pack.py生成bin文件

        但是存在點(diǎn)問題,對(duì)lfw2pack.py進(jìn)行稍微的修改,修改lfw2pack.py中19行,打#的為更改的,改為兩個(gè)參數(shù),一個(gè)是txt讀出來的列表,另一個(gè)是總數(shù)量。

        import mxnet as mxfrom mxnet import ndarray as ndimport argparseimport pickleimport sysimport ossys.path.append(os.path.join(os.path.dirname(__file__), '..', 'eval'))import lfwparser = argparse.ArgumentParser(description='Package LFW images')# generalparser.add_argument('--data-dir', default='', help='')# 修改1:圖像大小修改為112,112parser.add_argument('--image-size', type=str, default='112,112', help='')parser.add_argument('--output', default='', help='path to save.')# 修改2:添加解析參數(shù) parser.add_argument('--num-samepairs',default=100)args = parser.parse_args()lfw_dir = args.data_dirimage_size = [int(x) for x in args.image_size.split(',')]# 修改3:將文件名pairs.txt修改成train.txtlfw_pairs = lfw.read_pairs(os.path.join(lfw_dir, 'train.txt'))print(lfw_pairs)# 修改4:下一行進(jìn)行修改成需要的格式# lfw_paths, issame_list = lfw.get_paths(lfw_dir, lfw_pairs, 'jpg')lfw_paths, issame_list = lfw.get_paths(lfw_pairs,int(args.num_samepairs)+1)#, 'jpg')lfw_bins = []#lfw_data = nd.empty((len(lfw_paths), 3, image_size[0], image_size[1]))print(len(issame_list))i = 0for path in lfw_paths:  with open(path, 'rb') as fin:    _bin = fin.read()    lfw_bins.append(_bin)    #img = mx.image.imdecode(_bin)    #img = nd.transpose(img, axes=(2, 0, 1))    #lfw_data[i][:] = img    i+=1    if i%1000==0:      print('loading lfw', i)with open(args.output, 'wb') as f:  pickle.dump((lfw_bins, issame_list), f, protocol=pickle.HIGHEST_PROTOCOL)

        對(duì)應(yīng)的get_paths這個(gè)文件存在src/eval/lfw.py下,把它也改了

        def get_paths(pairs, same_pairs):    nrof_skipped_pairs = 0    path_list = []    issame_list = []    cnt = 1    for pair in pairs:      path0 = pair[0]      path1 = pair[1]      if cnt < same_pairs:        issame = True      else:        issame = False       if os.path.exists(path0) and os.path.exists(path1):    # Only add the pair if both paths exist        path_list += (path0,path1)        issame_list.append(issame)      else:        print('not exists', path0, path1)        nrof_skipped_pairs += 1      cnt += 1    if nrof_skipped_pairs>0:        print('Skipped %d image pairs' % nrof_skipped_pairs)    return path_list, issame_list

        vim中多行注釋方法:

        多行注釋:1. 進(jìn)入命令行模式,按ctrl + v進(jìn)入 visual block模式,然后按j, 或者k選中多行,把需要注釋的行標(biāo)記起來2. 按大寫字母I,再插入注釋符,例如 #3. 按esc鍵就會(huì)全部注釋了取消多行注釋:1. 進(jìn)入命令行模式,按ctrl + v進(jìn)入 visual block模式,按字母l橫向選中列的個(gè)數(shù),例如 # 需要選中2列2. 按字母j,或者k選中注釋符號(hào)3. 按d鍵就可全部取消注釋

        之后再運(yùn)行

        python3 lfw2pack.py --data-dir ../../datasets/train --output ../../datasets/train/lfw.bin --num-samepairs 2

        注意:我這里報(bào)錯(cuò)了(沒有報(bào)錯(cuò)的小伙伴可以忽略)

            path0 = pair[0]IndexError: list index out of range

        仔細(xì)分析之后,是因?yàn)樵趖rain.txt中存在空白行導(dǎo)致,直接刪除即可,如果沒有報(bào)錯(cuò)可以直接忽略


        至此,我們已經(jīng)完成了數(shù)據(jù)集的制作,后續(xù)會(huì)更新如何訓(xùn)練,以及使用。

        這部分內(nèi)容,是本人摸索了很久才搞定的,本文盡可能的寫的詳細(xì),希望能幫到大家,寫這篇的時(shí)候又重新操作了一遍,如果可以懇請(qǐng)小伙伴們能點(diǎn)個(gè)“在看”或分享到朋友圈。謝謝啦!

        參考鏈接:

        https://blog.csdn.net/CLOUD_J/article/details/100672392

        https://blog.csdn.net/hanjiangxue_wei/article/details/86566497

        ·? END? ·

        下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
        在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

        下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目31講
        小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目31講即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

        下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
        小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

        下載4:leetcode算法開源書
        小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):leetcode,即可下載。每題都 runtime beats 100% 的開源好書,你值得擁有!



        交流群


        歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動(dòng)駕駛、計(jì)算攝影、檢測、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


        瀏覽 35
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人免费视频 网站 | 国产一区二区三区人妖 | 强扒开腿挺进湿润的花苞 | 无码aaa | 一道无码在线视 | 操日本熟妇 | 国产操骚逼视频 | 翔田千里无码免费播放 | 亚洲乱伦色 | 成人黄网免费观看视频 |