在jupyter里用python处理图像并提取图像特征做人脸识别实验

华工小软 2018-10-23 07:48:23
本人python小白一枚,学院突然要求用python做机器学习基于Adaboost算法的人脸识别实验。。猝不及防呀。。

写了一会儿代码之后发现,自己的程序调用老师提供feature.py的类方法时会报错index error,看了半天不知道哪里出错,希望能有高手指点。

顺便问一下,如何用pickle库中的dump()函数将特征数据存在缓存中,稍后再用load()读取?


报错信息:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-16-7de3db667e50> in <module>()
52 for k in range(data_size - 1):
53 npd = NPDFeature(img_set[k])
---> 54 npd.extract()

<ipython-input-16-7de3db667e50> in extract(self)
32 for i in range(self.n_pixels - 1):
33 for j in range(i + 1, self.n_pixels, 1):
---> 34 self.features[count] = NPDFeature.__NPD_table__[self.image[i]][self.image[j]]
35 count += 1
36 return self.features

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

代码:
from skimage import data_dir,transform,color
import numpy
import cv2
import skimage.io as io
import matplotlib.pyplot as plt


def convert_gray(f):
rgb=io.imread(f) # read RGB image
gray=color.rgb2gray(rgb) # convert RGB images to Gray images
dst=transform.resize(gray,(24,24)) # resize
return dst

path='/Users/jzh/Desktop/ML2018-lab-03-master/datasets/original/face/*.jpg:/Users/jzh/Desktop/ML2018-lab-03-master/datasets/original/nonface/*.jpg' # this is my images' path
img_set = io.ImageCollection(path,load_func=convert_gray) # load images and convert them

#io.imshow(img_set[20])


# %load feature.py
import numpy

data_size = 1000 # there are totally 1000 images

class NPDFeature():
"""It is a tool class to extract the NPD features.

Attributes:
image: A two-dimension ndarray indicating grayscale image.
n_pixels: An integer indicating the number of image total pixels.
features: A one-dimension ndarray to store the extracted NPD features.
"""
__NPD_table__ = None

def __init__(self, image):
'''Initialize NPDFeature class with an image.'''
if NPDFeature.__NPD_table__ is None:
NPDFeature.__NPD_table__ = NPDFeature.__calculate_NPD_table()
assert isinstance(image, numpy.ndarray)
self.image = image.ravel()
self.n_pixels = image.size
self.features = numpy.empty(shape=self.n_pixels * (self.n_pixels - 1) // 2, dtype=float)

def extract(self):
'''Extract features from given image.

Returns:
A one-dimension ndarray to store the extracted NPD features.
'''
count = 0
for i in range(self.n_pixels - 1):
for j in range(i + 1, self.n_pixels, 1):
self.features[count] = NPDFeature.__NPD_table__[self.image[i]][self.image[j]] #报错
count += 1
return self.features

@staticmethod
def __calculate_NPD_table():
'''Calculate all situations table to accelerate feature extracting.'''
print("Calculating the NPD table...")
table = numpy.empty(shape=(1 << 8, 1 << 8), dtype=float)
for i in range(1 << 8):
for j in range(1 << 8):
if i == 0 and j == 0:
table[i][j] = 0
else:
table[i][j] = (i - j) / (i + j)
return table

# extract features
for k in range(data_size - 1):
npd = NPDFeature(img_set[k])
npd.extract() #extract处报错
...全文
1142 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
notback 2018-12-19
  • 打赏
  • 举报
回复
其他的不说,你的报错明显是用了非int类型作为切片的索引了。
尝试强制转换一下 数据类型
人脸表情识别 2020.8.22,重构了整个仓库代码,改用Tensorflow2中的keras api实现整个系统。考虑到很多反映jupyter notebook写的train使用起来不太方便,这改成了py脚本实现。 2020.12.18,根据反馈,修改了Jaffe的优化器设置。 简介 使用卷积神经网络构建整个系统,在尝试了Gabor、LBP等传统人脸特征提取方式基础上,深度模型效果显著。在FER2013、JAFFE和CK+三个表情识别数据集上进行模型评估。 环境部署 基于Python3和Keras2(TensorFlow后端),具体依赖安装如下(推荐使用conda虚拟环境)。 git clone https://github.com/luanshiyinyang/FacialExpressionRecognition.git cd FacialExpressionRecognition conda create -n FER python=3.6 source activate FER conda install cudatoolkit=10.1 conda install cudnn=7.6.5 pip install -r requirements.txt 如果你是Linux用户,直接执行根目录下的env.sh即可一键配置环境,执行命令为bash env.sh。 数据准备 数据集和预训练模型均已经上传到百度网盘,链接给出,提取密码为2pmd。下载后将model.zip移动到根目录下的models文件夹下并解压得到一个*.h5的模型参数文件,将data.zip移动到根目录下的dataset文件夹下并解压得到包含多个数据集压缩文件,均解压即可得到包含图像的数据集(其中rar后缀的为原始jaffe数据集,这建议使用我处理好的)。 项目说明 传统方法 数据预处理 图片降噪 人脸检测(HAAR分类器检测(opencv)) 特征工程 人脸特征提取 LBP Gabor 分类器 SVM 深度方法 人脸检测 HAAR分类器 MTCNN(效果更好) 卷积神经网络 用于特征提取+分类 网络设计 使用经典的卷积神经网络,模型的构建主要参考2018年CVPR几篇论文以及谷歌的Going Deeper设计如下网络结构,输入层后加入(1,1)卷积层增加非线性表示且模型层次较浅,参数较少(大量参数集中在全连接层)。 模型训练 主要在FER2013、JAFFE、CK+上进行训练,JAFFE给出的是半身图因此了人脸检测。最后在FER2013上Pub Test和Pri Test均达到67%左右准确率(该数据集爬虫采集存在标签错误、水印、动画图片等问题),JAFFE和CK+5折交叉验证均达到99%左右准确率(这两个数据集为实验室采集,较为准确标准)。 执行下面的命令将在指定的数据集(fer2013或jaffe或ck+)上按照指定的batch_size训练指定的轮次。训练会生成对应的可视化训练过程,下图为在三个数据集上训练过程的共同绘图。 python src/train.py --dataset fer2013 --epochs 300 --batch_size 32 模型应用 与传统方法相比,卷积神经网络表现更好,使用该模型构建识别系统,提供GUI界面和摄像头实时检测(摄像必须保证补光足够)。预测时对一张图片进行水平翻转、偏转15度、平移等增广得到多个概率分布,将这些概率分布加权求和得到最后的概率分布,此时概率最大的作为标签(也就是使用了推理数据增强)。 GUI界面 注意,GUI界面预测只显示最可能是人脸的那个脸表情,但是对所有检测到的人脸都会框定预测结果并在图片上标记,标记后的图片在output目录下。 执行下面的命令即可打开GUI程序,该程序依赖PyQT设计,在一个测试图片(来源于网络)上进行测试效果如下图。 python src/gui.py 上图的GUI反馈的同时,会对图片上每个人脸进行检测并表情识别,处理后如下图。 实时检测 实时检测基于Opencv进行设计,旨在用摄像头对实时视频流进行预测,同时考虑到有些人的反馈,当没有摄像头想通过视频进行测试则修改命令行参数即可。 使用下面的命令会打开摄像头进行实时检测(ESC键退出),若要指定视频进行进行检测,则使用下面的第二个命令。 python src/recognition_camera.py python src/recognition_camera.py --source 1 --video_path 视频绝对路径或者相对于该项目的根目录的相对路径 下图是动态演示的在Youtube上某个视频上的识别结果。
计算机视觉 近年来,我们在计算机视觉领域取得了非凡的发展,其应用在人脸识别图像理解,搜索,无人机,地图,半自动和自动驾驶汽车中。 这些应用程序的许多关键部分是视觉识别任务,例如图像分类,目标检测和图像相似性。 该存储库提供了用于构建计算机视觉系统的示例和最佳实践准则。 该存储库的目标是构建一套全面的工具和示例,以利用计算机视觉算法,神经体系结构的最新进展以及此类系统的可操作性。 我们不是从头开始创建实现,而是从现有的最新库中提取资源,并围绕加载图像数据,优化和评估模型以及扩展到云构建其他实用程序。 此外,我们已经在这个领域工作了多年,旨在回答常见问题,指出经常观察到的陷阱,并展示如何使用云进行培训和部署。 我们希望这些示例和实用程序可以简化从定义业务问题到开发解决方案数量级的经验,从而大大减少“上市时间”。 另外,示例笔记本将作为指南,并以多种语言展示工具的最佳实践和用法。 这些示例作为和常用。 所有示例均使用PyTorch作为基础深度学习库。 例子 该存储库支持在单个映像上运行的各种计算机视觉方案: 以及将视频序列作为输入的诸如动作识别之类的场景: 目标观众 该存储库的目标

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧