可以实现人脸的检测和校正,采样完毕后保存

[复制链接]
3755|4
 楼主 | 2019-1-24 10:06 | 显示全部楼层 |阅读模式
本帖最后由 keer_zu 于 2019-1-24 13:19 编辑

保存到文件夹的结果作为后边识别的比较对象:  实现过程参看

连载:一步步实现人脸数据的提取【原创


下边是完整代码:

  1. import cv2
  2. import dlib
  3. import os
  4. import sys
  5. from scipy import misc
  6. import time
  7. from multiprocessing import Process, JoinableQueue, Queue
  8. from random import random
  9. import time
  10. import glob
  11. import facenet.src.align.detect_face as detect_face
  12. import numpy as np
  13. import tensorflow as tf

  14. #tasks_queue = JoinableQueue()
  15. results_queue = Queue()
  16. convert_queue = Queue()
  17. message_queue = Queue()

  18. image_extension = ".jpg"
  19. target_img_size = 160

  20. IsCatchVideoQuit = False
  21. IsFaceDectecdQuit = False


  22. name = input('please input your name:')
  23. window_name = "face picture entry"
  24. src_path,_ = os.path.split(os.path.realpath(__file__))
  25. print(src_path)
  26. data_dir = os.path.join(src_path,"data")
  27. print(data_dir)
  28. output_dir = os.path.join(data_dir,name)
  29. #size = 64

  30. img_dir = os.path.join(src_path,"images")
  31. size_dir = os.path.join(img_dir,"%d" % target_img_size)


  32. if not os.path.exists(output_dir):
  33.     os.makedirs(output_dir)

  34. # 改变图片的亮度与对比度
  35. def relight(img, light=1, bias=0):
  36.     w = img.shape[1]
  37.     h = img.shape[0]
  38.     #image = []
  39.     for i in range(0,w):
  40.         for j in range(0,h):
  41.             for c in range(3):
  42.                 tmp = int(img[j,i,c]*light + bias)
  43.                 if tmp > 255:
  44.                     tmp = 255
  45.                 elif tmp < 0:
  46.                     tmp = 0
  47.                 img[j,i,c] = tmp
  48.     return img

  49. #使用dlib自带的frontal_face_detector作为我们的特征提取器
  50. detector = dlib.get_frontal_face_detector()

  51. #videoName = './' + name + '.avi'
  52. videoName = "rtsp://admin:ABC_123456@172.17.208.150:554/Streaming/Channels/101?transportmode=unicast"
  53. # 打开摄像头 参数为输入流,可以为摄像头或视频文件


  54. def CatchUsbVideo(out_queue,msg_q):
  55.     process_flag = False
  56.     cv2.namedWindow(window_name)

  57.     #视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
  58.     cap = cv2.VideoCapture(videoName)      
  59.     n = 1
  60.     while cap.isOpened():
  61.         ok, frame = cap.read() #读取一帧数据
  62.         if not ok:            
  63.             break                    

  64.         #显示图像并等待10毫秒按键输入,输入‘q’退出程序
  65.         cv2.namedWindow(window_name, cv2.WINDOW_NORMAL) #cv2.WND_PROP_FULLSCREEN)
  66.         #cv2.moveWindow(window_name, screen.x - 1, screen.y - 1)
  67.         cv2.setWindowProperty(window_name, cv2.WND_PROP_FULLSCREEN,
  68.                           cv2.WINDOW_FULLSCREEN)
  69.         n = n + 1
  70.         if n == 30:
  71.             if process_flag == True:
  72.                 out_queue.put(frame)
  73.             n = 1
  74.             
  75.         else:
  76.             frameresize = cv2.resize(frame,(1280,800))
  77.             cv2.imshow(window_name, frameresize)

  78.         c = cv2.waitKey(10)
  79.         if c & 0xFF == ord('q'):
  80.             break        
  81.         if c & 0xFF == ord('d'):
  82.             process_flag = True
  83.         if not msg_q.empty():
  84.             if msg_q.get() == "complate_msg":
  85.                 break



  86.     #释放摄像头并销毁所有窗口
  87.     cap.release()
  88.     cv2.destroyAllWindows()

  89. def ConvertUseTensorflowMtcnn(in_queue,msg_q):
  90.     margin = 32
  91.     index_num = 0
  92.     target_dir = os.path.join(img_dir,"images_data_%d" % target_img_size)
  93.     output_user_dir = os.path.join(target_dir, name)
  94.     if not os.path.exists(output_user_dir):
  95.         os.makedirs(output_user_dir)

  96.     minsize = 30 # minimum size of face
  97.     threshold = [ 0.6, 0.7, 0.7 ]  # three steps's threshold
  98.     factor = 0.709 # scale factor


  99.     with tf.Graph().as_default():
  100.         gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.25)
  101.         sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
  102.         with sess.as_default():
  103.             pnet, rnet, onet = detect_face.create_mtcnn(sess, None)
  104.     while 1:
  105.         file_name = in_queue.get()
  106.         print("====== file: %s" % file_name)
  107.         img = cv2.imread(file_name)
  108.         
  109.         bounding_boxes, _ = detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)
  110.         print(bounding_boxes)
  111.         nrof_faces = bounding_boxes.shape[0]
  112.         print(nrof_faces)
  113.         if nrof_faces>0:
  114.             det = bounding_boxes[:,0:4]
  115.             det_arr = []
  116.             img_size = np.asarray(img.shape)[0:2]
  117.             print("====nrof_face: %d  img size:"  % nrof_faces)
  118.             print(img_size)
  119.             if nrof_faces == 1:
  120.                 bounding_box_size = (det[:,2]-det[:,0])*(det[:,3]-det[:,1])
  121.                 img_center = img_size / 2
  122.                 offsets = np.vstack([ (det[:,0]+det[:,2])/2-img_center[1], (det[:,1]+det[:,3])/2-img_center[0] ])
  123.                 offset_dist_squared = np.sum(np.power(offsets,2.0),0)
  124.                 index = np.argmax(bounding_box_size-offset_dist_squared*2.0) # some extra weight on the centering
  125.                 det_arr.append(det[index,:])
  126.             for i, det in enumerate(det_arr):
  127.                 det = np.squeeze(det)
  128.                 bb = np.zeros(4, dtype=np.int32)
  129.                 bb[0] = np.maximum(det[0]-margin/2, 0)
  130.                 bb[1] = np.maximum(det[1]-margin/2, 0)
  131.                 bb[2] = np.minimum(det[2]+margin/2, img_size[1])
  132.                 bb[3] = np.minimum(det[3]+margin/2, img_size[0])
  133.                 cropped = img[bb[1]:bb[3],bb[0]:bb[2],:]
  134.                 scaled = misc.imresize(cropped, (target_img_size, target_img_size), interp='bilinear')

  135.                 output_filename = os.path.join(output_user_dir, ("%d" % index_num) +'.png')

  136.                 filename_base, file_extension = os.path.splitext(output_filename)

  137.                 output_filename_n = "{}{}".format(filename_base, file_extension)

  138.                 misc.imsave(output_filename_n, scaled)

  139.                 index_num += 1
  140.         #if os.path.exists(file_name):
  141.             #os.remove(file_name)
  142.         if index_num >= 5:
  143.             msg_q.put("complate_msg")
  144.             msg_q.put("complate_msg")
  145.             break



  146. add = 30
  147. def FaceDectection(in_queue,out_convert_queue,msg_q):
  148.     index = 0
  149.     num = 0
  150.     temporary_dir = os.path.join(output_dir,"%d" % index)
  151.     if  not os.path.exists(temporary_dir):
  152.         os.makedirs(temporary_dir)
  153.     while 1:
  154.         img = in_queue.get()
  155.         g_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  156.         # 使用detector进行人脸检测
  157.         dets = detector(g_img, 1)

  158.         for i, d in enumerate(dets):
  159.             print("----- i:%d\n" % i)
  160.             x1 = d.top() if d.top() > 0 else 0
  161.             y1 = d.bottom() if d.bottom() > 0 else 0
  162.             x2 = d.left() if d.left() > 0 else 0
  163.             y2 = d.right() if d.right() > 0 else 0

  164.             print("index: %d   num %d " % (index,num))


  165.             face = img[x1-add:y1 + add,x2-add:y2 + add]


  166.             if face.shape[0] > 300 :  # check picture size
  167.                 g_img = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
  168.                 if cv2.Laplacian(g_img, cv2.CV_64F).var() < 300:
  169.                     continue
  170.                 file = os.path.join(temporary_dir,str(num)+image_extension)
  171.                 cv2.imwrite(file, face)
  172.                 #out_convert_queue.put(file)
  173.                 num += 1
  174.         

  175.         if num >= 5:
  176.             img_file = os.path.join(temporary_dir,"*" + image_extension)
  177.             print(img_file)
  178.             img_name_list = glob.glob(img_file)

  179.             for nm in img_name_list:
  180.                 out_convert_queue.put(nm)
  181.             index += 1
  182.             temporary_dir = os.path.join(output_dir,"%d" % index)
  183.             if  not os.path.exists(temporary_dir):
  184.                 os.makedirs(temporary_dir)
  185.             num = 0

  186.         if not msg_q.empty():
  187.             if msg_q.get() == "complate_msg":
  188.                 break


  189. #if __name__ == '__main__':
  190. #    CatchUsbVideo()
  191. processes = []

  192. p = Process(target=CatchUsbVideo, args=(results_queue,message_queue,))
  193. p.start()
  194. processes.append(p)

  195. p = Process(target=FaceDectection, args=(results_queue,convert_queue,message_queue,))
  196. p.start()
  197. processes.append(p)

  198. p = Process(target=ConvertUseTensorflowMtcnn, args=(convert_queue,message_queue,))
  199. p.start()
  200. processes.append(p)


  201. for p in processes:
  202.     p.join()

  203. while 1:
  204. time.sleep(1)
复制代码



 楼主 | 2019-1-24 13:21 | 显示全部楼层
接下来要用facenet训练的模型做两个人脸的欧氏距离运算,判断是不是一个人了。


欢迎关注后续。。。

| 2019-1-25 12:02 | 显示全部楼层
要是能分享全套资料就好了
 楼主 | 2019-1-25 12:32 | 显示全部楼层
本帖最后由 keer_zu 于 2019-1-25 12:36 编辑
divdir 发表于 2019-1-25 12:02
要是能分享全套资料就好了

步骤,代码都分享了,电脑也分享出来吗?
| 2019-1-25 17:32 | 显示全部楼层
厉害!
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册
本版积分规则
我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /4 下一条

快速回复 返回顶部 返回列表