BaiduAIオープンプラットフォームを使用してデータセットを処理する

手に持ったたくさんの顔データセットを処理する必要があるので、手動で処理することはできません。面倒です。

したがって、BaiduのAIオープンプラットフォームを使用します。アドレスは次のとおりです。

https://cloud.baidu.com/product/face

使い方はとても簡単です。まず、プラットフォーム上にアプリケーションを作成する必要があります。この時点で、AKとSKがあります。

 これはトークンを取得するために使用され、トークンを使用して直接リクエストできます

トークンコードを取得します。

あなた自身のAKとSKを記入することに注意してください

 # encoding:utf-8
import requests 

# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=XXXXXX&client_secret=XXXXXXX'
response = requests.get(host)
if response:
    print(response.json())

 トークンは文字列の長い文字列です。コピーして保存します

次に、この要件を認識し、顔の性別と眼鏡をかけるかどうかを取得し、それを4つのグループに分けて、移動する必要のあるファイルをそれぞれこれらの4つのフォルダーに移動します。必要に応じて、これに従って行うことができます。変更

import os
from shutil import move
import time

token="XXXXXXXXXXXXXXXXX"
_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect" + "?access_token=" + token
headers = {'content-type': 'application/json'}
trs='A'
tr_ts=['train','test']
path='F:\\XXX\\'+tr_ts[0]+trs#trainA,trainB,testA,testB
ls=os.listdir(path)
ls.sort()

for i in ls:
    start=time.time()
    imgBase64=base64.b64encode(open(path+'\\'+i,'rb').read())
    data={"image": imgBase64, "image_type": "BASE64","face_field":"age,gender,glasses"}
    res= requests.post(_url,data=data,headers=headers).json()['result']['face_list'][0]
    #print(res)
    if (res['glasses']['type']!='none')&(res['gender']['type']=='male'):
        move(path+'\\'+i,trs+'\\man_glasses\\')
        print(time.time()-start)
    elif  (res['glasses']['type']!='none')&(res['gender']['type']=='female'):
        move(path+'\\'+i,trs+'\\woman_glasses\\')
        print(time.time()-start)
    elif (res['glasses']['type']=='none')&(res['gender']['type']=='male'):
        move(path+'\\'+i,trs+'\\man_noglasses\\')
        print(time.time()-start)
    else:move(path+'\\'+i,trs+'\\woman_noglasses\\');print(time.time()-start)

認識されているコンテンツが多いため、このリンクを特に確認できます。ここで設定するだけです。face_fieldフィールドで変更できます。必要なのは年齢、性別、眼鏡だけです。

ドキュメントのコンテンツの一部をインターセプトすると、多くの属性を確認でき、必要な属性を選択できます

ただし、上記のコードによると、空き速度は1秒間に2回になる可能性があり、ネットワーク速度が制限されるため、速度は非常に遅くなります。

したがって、マルチプロセスバージョンがあります。

 # encoding:utf-8
import requests 
import base64
import os
import time
import multiprocessing as mp

class MSP():
    def __init__(self):
        self.h='trainB'
        self.token="XXXXX"
        self._url = "https://aip.baidubce.com/rest/2.0/face/v3/detect" + "?access_token=" + self.token
        self.headers = {'content-type': 'application/json'}
        self.path='F:\\XXX\\'+self.h
        self.ls=os.listdir(self.path)
        self.ls.sort()
        self.lres=[]
        self.manager = mp.Manager
        self.mp_lst = self.manager().list()
    def post_func(self, i):
        self.imgBase64=base64.b64encode(open(self.path+'\\'+i,'rb').read())
        self.data={"image": self.imgBase64, "image_type": "BASE64","face_field":"age,gender,glasses"}
        self.res= requests.post(self._url,data=self.data,headers=self.headers).json()['result']['face_list'][0]
        self.res['name']=i
        self.mp_lst.append(self.res)
        time.sleep(0.1)
        print(i)

    def flow(self):
        pool = mp.Pool(10)
        for i in self.ls:
            pool.apply_async(self.post_func, args=(i,))            
        pool.close()
        pool.join()

if __name__ == '__main__':
    start_time = time.time()
    msp = MSP()
    msp.flow()
    f=open('XXX.txt','w')
    f.write(str(msp.mp_lst))
    f.close()
    print(time.time() - start_time)

以前の約10倍の速さで、本当に速いです

属性の内容をtxtに保存します。ファイルの内容を読み取るには、独自のコードを移動する必要があります

 # encoding:utf-8
import os
from shutil import move
import time
 
#trainB
path='F:\\XXX\\trainB'
trs='B'
lres_trainB=open('XXXX.txt').read()
for res in eval(lres_trainB):
    start=time.time()
    i=res['name']
    if (res['glasses']['type']!='none')&(res['gender']['type']=='male'):
        move(path+'\\'+i,trs+'\\man_glasses\\')
        print(time.time()-start)
    elif  (res['glasses']['type']!='none')&(res['gender']['type']=='female'):
        move(path+'\\'+i,trs+'\\woman_glasses\\')
        print(time.time()-start)
    elif (res['glasses']['type']=='none')&(res['gender']['type']=='male'):
        move(path+'\\'+i,trs+'\\man_noglasses\\')
        print(time.time()-start)
    else:move(path+'\\'+i,trs+'\\woman_noglasses\\');print(time.time()-start)

この時点で、プロセスは終了します

おすすめ

転載: blog.csdn.net/zhou_438/article/details/111315977