Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neural network 运行时错误:basic_filebuf::读取文件时发生下溢错误:是一个目录_Neural Network_Dataset_Prediction_Wiki_Imdb - Fatal编程技术网

Neural network 运行时错误:basic_filebuf::读取文件时发生下溢错误:是一个目录

Neural network 运行时错误:basic_filebuf::读取文件时发生下溢错误:是一个目录,neural-network,dataset,prediction,wiki,imdb,Neural Network,Dataset,Prediction,Wiki,Imdb,我不知道我的代码抛出运行时错误的原因。错误: 拉什_96@Panega:~/Master/files/Age-Gender-Pred-Master$python3 preprocess.py 回溯(最近一次呼叫最后一次): 文件“preprocess.py”,第120行,在 FL=面对齐器() 文件“/home/rakshith_96/Master/files/Age-Gender-Pred-Master/align_faces.py”,第25行,在init self.predictor=dli

我不知道我的代码抛出运行时错误的原因。错误:

拉什_96@Panega:~/Master/files/Age-Gender-Pred-Master$python3 preprocess.py 回溯(最近一次呼叫最后一次): 文件“preprocess.py”,第120行,在 FL=面对齐器() 文件“/home/rakshith_96/Master/files/Age-Gender-Pred-Master/align_faces.py”,第25行,在init self.predictor=dlib.shape_predictor(self.Path2ShapePred) 运行时错误:basic_filebuf::读取文件时发生下溢错误:是一个目录

import os
import cv2
import re
import time
import random
import shutil
import glob
import scipy.io

import numpy as np

from shutil import copyfile
from datetime import datetime, timedelta
from multiprocessing import Pool

from config import config, parser
from align_faces import FaceAligner

parser = parser['DATA']

def parse_matlab_date(x):
  """
  :param x: date string in matlab format
  :return: int, year
  """
  x, date = int(x), -1
  try:
    date = (datetime.fromordinal(int(x))
          + timedelta(days=x % 1)
          - timedelta(days=366)).year
  except:
    print("[convertMatlabDate] Failed to parse string {}".format(x))
  return date


def clear_dir(path):
  """
  remove all files in this directionary
  :param path: path to dir
  :return: 
  """
  if os.path.exists(path):
    shutil.rmtree(path)
    os.mkdir(path)
  return


def addlabels(data = 'wiki', clean = False):
  """
  move pictures to labled dir and rename to [Age]_[Gender]_[Name].jpg format
  :param data: 'wiki' or 'imdb'
  :return: 
  """
  # 1, clean previous
  origin_dir = config.wiki_raw if data == 'wiki' else config.imdb_raw
  if clean: clear_dir(config.labeled)

  # 2, read meta data
  mat = scipy.io.loadmat(origin_dir + data + '.mat')[data][0][0]

  # records
  no_face_image = 0
  multiple_face_image = 0
  wrong_age = 0
  wrong_gender = 0
  successful = 0
  for dob, dop, path, gender, name, face_score, face_score2 \
          in zip(mat[0][0], mat[1][0], mat[2][0], mat[3][0], mat[4][0], mat[6][0], mat[7][0]):
    if face_score < 0 or not np.isnan(face_score2):
      if face_score < 0: no_face_image += 1
      if not np.isnan(face_score2): multiple_face_image += 1
      continue

    age = dop - parse_matlab_date(dob)
    if age < int(parser['age_lower']) or age > int(parser['age_upper']):
      wrong_age += 1
      continue

    if gender not in [1.0, 0.0]:
      wrong_gender += 1
      continue

    newName = "{}_{}_{}.jpg".format(age,
                                    int(gender),
                                    name[0]
                                    .replace(' ', '')
                                    .replace('/', '')
                                    .replace(':', ''))
    # 2.1 check duplicate
    # 2.1 if duplicate exist, append a random number to it name
    newNameNoDupli = newName
    while os.path.exists(config.labeled + newNameNoDupli):
      newNameNoDupli = "{}{}{}".format(newName[:-4], random.randint(1, 9999), newName[-4:])
    # 2.2 save as a new file
    copyfile(origin_dir + path[0], config.labeled + newNameNoDupli)
    successful += 1
  print("{} Successful, {} no_face_image, {} multiple_face_image, {} wrong_age, {} wrong_gender"
        .format(successful, no_face_image, multiple_face_image, wrong_age, wrong_gender))
  return


# sort photos by their names
def sort_out_by_name(clean = False):
  pwd = os.getcwd()
  if clean:
    clear_dir(config.named)
  os.chdir(config.aligned)
  for img in glob.glob("*.jpg"):
    name = re.findall(r'[^_]*_[^_]*_([\D]*)[0-9]*.jpg', img)
    if not len(name): continue
    name = name[0].lower()
    if not os.path.exists(config.named + name + '/'):
      os.mkdir(config.named + name + '/')
    copyfile(img, config.named + name + '/' + img)
  os.chdir(pwd)



# TODO: any other ways to get around this public variable?
FL = FaceAligner()
def sub_align_face(picname):
  """
  sub thread function to get and store aligned faces
  :param picname: pic names
  :return: 
  """
  aligned = FL.getAligns(picname)
  if len(aligned) == 0:
    return
    # copyfile(picname, config.aligned + picname)
  cv2.imwrite(config.aligned + picname, aligned[0])


def creat_fgnet_val(clean = False):
  if clean:
    clear_dir(config.val)
  pwd = os.getcwd()
  os.chdir(config.fgnet_raw)
  for pic in glob.glob("*"):
    name, age = re.findall(r'(\d)*A(\d*).*', pic)[0]
    newName = "{}_1_{}.jpg".format(age,
                                    name[0]
                                    .replace(' ', '')
                                    .replace('/', '')
                                    .replace(':', ''))
    # 2.1 check duplicate
    # 2.1 if duplicate exist, append a random number to it name
    newNameNoDupli = newName
    while os.path.exists(config.labeled + newNameNoDupli):
      newNameNoDupli = "{}{}{}".format(newName[:-4], random.randint(1, 9999), newName[-4:])
    # 2.2 save as a new file
    copyfile(config.fgnet_raw + pic, config.val + newNameNoDupli)
  os.chdir(pwd)


def align_faces(clean = False):
  """
  get aligned faces from labeled folder and store it in aligned folder for training
  :param data: 'wiki' or 'imdb'
  :param clean: if set, clean aligned folder, else append or rewrite to it
  :return: 
  """
  if clean: clear_dir(config.aligned)
  os.chdir(config.labeled)
  jobs = glob.glob("*.jpg")

  # un-parallel
  # for picname in jobs:
  #   aligned = FL.getAligns(picname)
  #   if len(aligned) != 1: return
  #   cv2.imwrite(config.aligned + picname, aligned[0])

  # parallel
  with Pool() as pool:
    try:
      pool.map(sub_align_face, jobs)
    finally:
      pool.close()
  return



def sub_divideTrainVal(img):
  """
  distribute images randomly to train or test foled by 95% train prob
  :param img: image path
  :return: 
  """
  if np.random.rand() < float(parser['train_test_div']):
    copyfile(config.aligned + img, config.train + img)
  else:
    copyfile(config.aligned + img, config.val + img)
  return

def divideTrainVal():
  """
  distribute images randomly to train or test foled by 95% train prob
  :return: 
  """
  pwt = os.getcwd()
  os.chdir(config.aligned)

  # clean
  clear_dir(config.train)
  clear_dir(config.val)

  # read into mem
  # train, val = [], []

  # parallel
  with Pool() as pool:
    try:
      pool.map(sub_divideTrainVal, glob.glob("*.jpg"))
    finally:
      pool.close()

  # for img in glob.glob("*.jpg"):
  #   if np.random.rand() < float(parser['train_test_div']):
  #     cv2.imwrite(config.train + img, cv2.imread(img))
      # train.append([cv2.imread(img), img])
    # else:
    #   cv2.imwrite(config.val + img, cv2.imread(img))
      # val.append([cv2.imread(img), img])

  # dump out of mem
  # for img, name in train:
  #   cv2.imwrite(config.train + img, name)
  # for img, name in val:
  #   cv2.imwrite(config.val + img, name)
  os.chdir(pwt)
  return


if __name__ == "__main__":
  print("labeling..")
  addlabels(data='imdb', clean=True)
  
  print("aligning..")
  align_faces(clean = True)
  
  print("dividing..")
  divideTrainVal()

#   creat_fgnet_val(clean=True)
  pass
导入操作系统
进口cv2
进口稀土
导入时间
随机输入
进口舒蒂尔
导入glob
导入scipy.io
将numpy作为np导入
从shutil导入复制文件
从datetime导入datetime,timedelta
来自多处理导入池
从配置导入配置,解析器
从对齐面导入面对齐器
parser=parser['DATA']
def解析日期(x):
"""
:param x:matlab格式的日期字符串
:return:int,year
"""
x、 日期=整数(x),-1
尝试:
日期=(datetime.fromordinal(int(x))
+时间增量(天=x%1)
-时间增量(天数=366))。年
除:
打印(“[convertMatlabDate]未能分析字符串{}”。格式(x))
返回日期
def清除目录(路径):
"""
删除此目录中的所有文件
:param path:指向目录的路径
:返回:
"""
如果os.path.存在(路径):
shutil.rmtree(路径)
os.mkdir(路径)
返回
def addlabels(数据='wiki',clean=False):
"""
将图片移动到带标签的目录,并重命名为[Age][Gender][Name].jpg格式
:参数数据:“wiki”或“imdb”
:返回:
"""
#1、清洁上一道工序
如果数据='wiki'else config.imdb\u raw,则原点\u dir=config.wiki\u raw
如果清除:清除目录(配置标签)
#2、读取元数据
mat=scipy.io.loadmat(origin_dir+data+'.mat')[data][0][0]
#记录
无面部图像=0
多个面图像=0
错误的年龄=0
错误的性别=0
成功=0
对于dob、dop、路径、性别、姓名、面部评分、面部评分2\
在zip中(垫[0][0]、垫[1][0]、垫[2][0]、垫[3][0]、垫[4][0]、垫[6][0]、垫[7][0]):
如果面部评分<0或不是np.isnan(面部评分2):
如果面部评分<0:无面部图像+=1
如果不是np.isnan(面部评分2):多张面部图像+=1
持续
年龄=dop-解析日期(dob)
如果ageint(解析器['age\u upper']):
错误的年龄+=1
持续
如果性别不在[1.0,0.0]中:
错误的性别+=1
持续
newName=“{}}{}}{}.jpg”。格式(年龄,
int(性别),
名称[0]
.替换('','')
.替换(“/”,“”)
.替换(“:”,“))
#2.1检查副本
#2.1如果存在重复项,则在其名称后附加一个随机数
newNameNoDupli=newName
当os.path.exists(config.label+newNameNoDupli)存在时:
newNameNoDupli=“{}{}{}”。格式(newName[:-4]、random.randint(19999)、newName[-4:])
#2.2另存为新文件
copyfile(源目录+路径[0],config.label+newNameNoDupli)
成功+=1
打印({}成功,{}无人脸图像,{}多张人脸图像,{}错误的年龄,{}错误的性别”
.格式(成功、无面部图像、多面部图像、错误的年龄、错误的性别))
返回
#按照片的名称排序
def按名称排序(clean=False):
pwd=os.getcwd()
如果清洁:
清除目录(config.named)
chdir(config.aligned)
对于glob.glob(“*.jpg”)中的img:
name=re.findall(r'[^.]*.[^.]*.[0-9]*.jpg',img)
如果不是len(名称):继续
name=名称[0]。下()
如果不存在os.path.exists(config.named+name+'/'):
os.mkdir(config.named+name+'/'))
复制文件(img,config.named+name+'/'+img)
os.chdir(pwd)
#TODO:还有其他方法可以绕过这个公共变量吗?
FL=面对齐器()
def sub_align_面(图片名称):
"""
获取和存储对齐面的子线程函数
:param picname:pic名称
:返回:
"""
对齐=FL.getAligns(picname)
如果len(对齐)==0:
返回
#copyfile(picname,config.aligned+picname)
cv2.imwrite(config.aligned+picname,aligned[0])
def create_fgnet_val(clean=False):
如果清洁:
清除目录(config.val)
pwd=os.getcwd()
chdir(config.fgnet_raw)
对于glob.glob(“*”)中的pic:
姓名,年龄=re.findall(r'(\d)*A(\d*)*,图片)[0]
newName=“{}}u 1{}.jpg”。格式(年龄,
名称[0]
.替换('','')
.替换(“/”,“”)
.替换(“:”,“))
#2.1检查副本
#2.1如果存在重复项,则在其名称后附加一个随机数
newNameNoDupli=newName
当os.path.exists(config.label+newNameNoDupli)存在时:
newNameNoDupli=“{}{}{}”。格式(newName[:-4]、random.randint(19999)、newName[-4:])
#2.2另存为新文件
复制文件(config.fgnet_raw+pic,config.val+newNameNoDupli)
os.chdir(pwd)
def align_面(清洁=假):
"""
从带标签的文件夹中获取对齐的面,并将其存储在对齐的文件夹中进行培训
:参数数据:“wiki”或“imdb”
:param clean:如果设置,则清除对齐的文件夹,否则追加或重写到该文件夹
:返回:
"""
如果清除:清除目录(config.aligned)
chdir(config.label)
jobs=glob.glob(“*.jpg”)
#非平行
#对于作业中的picname:
#对齐=FL.getAligns(picname)
#如果len(对齐)!=1:返回
#cv2.imwrite(config.aligned+picname,aligned[0])
#平行的
使用Pool()作为池:
尝试:
pool.map(子对象对齐面、作业)
最后:
pool.close()
返回
def sub_divideTrainVal(img):
"""
按95%的列车概率随机分配图像进行列车或测试
:param img:图像路径
:返回:
"""
如果np.random.rand()