37,743
社区成员
发帖
与我相关
我的任务
分享#!/usr/bin/env python
#coding:utf-8
#2017年6月30日
import os
import shutil
import copy
import codecs
import cv2
import math
import numpy as np
import sys,os
import skimage.io
import threading
import multiprocessing
caffe_root='/caffe/caffe-master-ldz170222/caffe-master/'
sys.path.insert(0,caffe_root+'python')
sys.path.append(caffe_root + 'python') #
sys.path.append(caffe_root + 'python/caffe') #
import caffe
writeLock = threading.Lock()
writePSema = multiprocessing.Semaphore(1)
writePLock = multiprocessing.Lock()
class MulProcessEigenOutput(multiprocessing.Process):
def __init__(self, lstFeature, lstPicName, nStart, nEnd, outEigeValList, outEigeValListB): #, writePLock):
multiprocessing.Process.__init__(self)
self.mLstFeature = lstFeature
self.mLstPicName = lstPicName
self.mStart = nStart
self.mEnd = nEnd
self.fileA = outEigeValList
self.fileB = outEigeValListB
#self.wLock = writePLock
global writePLock
def run(self):
print "Start process: " + str(self.pid)
if self.mEnd > len(self.mLstFeature):
self.mEnd = len(self.mLstFeature) - 1
for i in range(self.mStart, self.mEnd): # 这里必须注意,可能有bug,即能被10除尽的时候,一般这里最后是 len(self.mLstFeature) - 1,注意是否越界
for j in range(i + 1, len(self.mLstFeature)):
eigeVal = 0
for k in range(0, 128):
eigeVal += math.pow((self.mLstFeature[i][k] - self.mLstFeature[j][k]), 2)
eigeVal = math.sqrt(eigeVal)
if (eigeVal <= 0.65):
print str(self.pid) + " " + str(eigeVal)
# if writePLock.acquire():
# self.fileA.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
# writePLock.release()
writePLock.acquire()
try:
self.fileA.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
finally:
writePLock.release()
elif (eigeVal <= 1.0):
# if writePLock.acquire():
# self.fileB.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
# writePLock.release()
#if writeLock.acquire():
writePLock.acquire()
try:
self.fileB.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
finally:
writePLock.release()#
else:
#outEigeValListB.write(lstPicName[i].split('.')[0] + ":" + lstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
continue
print "End process: " + str(self.pid)
class MulProcessEigenOutputSem(multiprocessing.Process):
def __init__(self, lstFeature, lstPicName, nStart, nEnd, outEigeValList, outEigeValListB):
multiprocessing.Process.__init__(self)
self.mLstFeature = lstFeature
self.mLstPicName = lstPicName
self.mStart = nStart
self.mEnd = nEnd
self.fileA = outEigeValList
self.fileB = outEigeValListB
global writePSema
def run(self):
print "Start process: " + str(self.pid)
if self.mEnd > len(self.mLstFeature):
self.mEnd = len(self.mLstFeature) - 1
for i in range(self.mStart, self.mEnd): # 这里必须注意,可能有bug,即能被10除尽的时候,一般这里最后是 len(self.mLstFeature) - 1,注意是否越界
for j in range(i + 1, len(self.mLstFeature)):
eigeVal = 0
for k in range(0, 128):
eigeVal += math.pow((self.mLstFeature[i][k] - self.mLstFeature[j][k]), 2)
eigeVal = math.sqrt(eigeVal)
if (eigeVal <= 0.65):
print str(self.pid) + " " + str(eigeVal)
# if writePLock.acquire():
# self.fileA.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
# writePLock.release()
writePSema.acquire()
self.fileA.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
writePSema.release()
elif (eigeVal <= 1.0):
# if writePLock.acquire():
# self.fileB.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
# writePLock.release()
#if writeLock.acquire():
writePSema.acquire()
self.fileB.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
writePSema.release()#
else:
#outEigeValListB.write(lstPicName[i].split('.')[0] + ":" + lstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
continue
print "End process: " + str(self.pid)
# 功能:从一个图片文件夹中寻找相似人脸图片文件,在输出相似人脸距离时使用多进程
# stPicDocPath 图片文件夹位置
# stOutEigeListPath 输出相似人脸图片列表.txt的路径
def findSamePeopleInOneDocMultiP(stPicDocPath, stOutEigeListPath):
#
net_file='/dataClean/triplet_deploy.prototxt'
caffe_model='/dataClean/_iter_175000.caffemodel'
caffe.set_mode_gpu()
caffe.set_device(0)
net=caffe.Net(net_file,caffe_model,caffe.TEST)
......
print "len(lstFeature): " + str(len(lstFeature))
everNum = len(lstFeature) / 10 + 1
myProcess = []
# writePLock = multiprocessing.Lock()
# writePSema = multiprocessing.Semaphore(1)
for pNum in range(0, 10):
p = MulProcessEigenOutput(lstFeature, lstPicName, pNum * everNum, (pNum + 1) * everNum, outEigeValList, outEigeValListB) #, writePLock)
# p = MulProcessEigenOutputSem(lstFeature, lstPicName, pNum * everNum, (pNum + 1) * everNum, outEigeValList, outEigeValListB)
p.start()
myProcess.append(p)
for p in myProcess:
p.join()
# findAndOutputSamePeople(lstFeature, lstPicName, 0, len(lstFeature), outEigeValList, outEigeValListB)
outEigeValList.close()
outEigeValListB.close()
if __name__ == '__main__':
stPicDocPath = "/home/facedata/Personlist"
stOutEigeListPath = "/home/facedata"
# findSamePeopleInOneDoc(stPicDocPath, stOutEigeListPath)
# findSamePeopleInOneDocMultiT(stPicDocPath, stOutEigeListPath)
findSamePeopleInOneDocMultiP(stPicDocPath, stOutEigeListPath)
print "All done ! (0723 version)"
