手に持ったたくさんの顔データセットを処理する必要があるので、手動で処理することはできません。面倒です。
したがって、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)
この時点で、プロセスは終了します