admin管理员组文章数量:1630191
大家好,欢迎来到专栏《CV项目实战》,在这个专栏中我们会讲述计算机视觉相关的项目实战,有大型的完整项目,也有精炼的核心算法实战。
本次主要讲述一个完整的工业级别图像分类项目的标准流程,涉及环境配置,数据准备,模型定义,模型训练,模型测试。
作者&编辑 | 言有三
本文资源与项目结果展示
本文篇幅:7900字
背景要求:会使用Python和任一深度学习开源框架
附带资料:代码一份,版本包括Pytorch+Tensorflow+Caffe
同步平台:有三AI知识星球(一周内)
1 项目背景
对于很多初入深度学习计算机视觉领域的朋友来说,当前开源资料非常多,但有时候难以适从,其中很多资料都没有包含完整的项目流程,而只是对某个流程的部分截取,对能力的锻炼不够。
图像分类是整个计算机视觉领域中最基础的任务,也是最重要的任务之一,最适合拿来进行学习实践。为了让新手们能够一次性体验一个工业级别的图像分类任务的完整流程,本次我们选择带领大家完成一个对视频中人脸进行表情识别的任务。人脸表情识别(facial expression recognition, FER)作为人脸识别技术中的一个重要组成部分,近年来在人机交互、安全、机器人制造、自动化、医疗、通信和驾驶领域得到了广泛的关注,成为学术界和工业界的研究热点,是人脸属性分析的重点。
2 准备工作
本次项目开发需要以下环境:
(1) Linux系统,推荐ubuntu16.04或者ubuntu18.04。使用windows系统也可以完成,但是使用Linux效率更高。
(2) 最好拥有一块显存不低于6G的GPU显卡,如果没有使用CPU进行训练速度较慢。
(3) 安装好的Tensorflow或者其他开源框架(caffe,pytorch等)
为什么要选择Linux就不多说了,公司开发都是使用Linux服务器,个人开发者机器常常会安装windows与Linux双系统。双系统的安装每个人的个人电脑环境不同,一定是会有差异的,只有安装过程中才会知道,推荐的双系统安装博客教程:
https://www.zhihu/question/34611974/answer/373037398,如果遇到了任何问题,可以自行百度解决,总的流程是:
(1) 去ubuntu官网下载ubuntu系统镜像16.04或者18.04。
(2) 制作U盘启动盘。
(3) 使用启动盘进行安装,安装过程中选择好分区大小。
(4) 安装完之后即可进入系统。
(5) Linux系统初学者需要掌握一些基本命令。
3 数据获取
很多实际项目我们不会有现成的数据集,虽然可以通过开源数据集获取,但是我们还是要学会自己从零开始获取和整理。下面讲述如何准备好本次项目所需要的数据集,包括以下部分。
(1) 学会使用爬虫爬取图像。
(2) 对获得的图片数据进行整理,包括重命名,格式统一。
(3) 利用人脸检测算法删选出有用的样本,利用关键点检测算法裁剪出用于算法训练的嘴唇区域。
3.1 数据爬取
由于没有直接对应的开源数据集,或者开源数据集中的数据比较少,尤其是对于嘟嘴,大笑等类的数据,而搜索引擎上有海量数据,所以我们可以从中爬取。下面开始讲述具体的步骤,我们的任务是一个表情分类任务,因此需要爬取相关图片,包括嘟嘴,微笑,大笑等表情。
参考有三AI公众号的爬虫文章,文章链接如下:
【杂谈】深度学习必备,各路免费爬虫一举拿下
爬虫的GUI界面如下:
我们对百度搜索引擎,自行定义搜索词(比如嘟嘴),爬取图片结果如下:
自此就可以获得数千张图像,然后进行第二步,数据整理。
3.2 数据整理
爬取得到的数据是比较脏的,需要进行整理,主要包括统一图片后缀和重命名。
统一后缀格式可以减少以后写数据API时的压力,也可以测试图片是不是可以正常的读取,及时防止未知问题的出现,这很重要。
首先我们看下爬取完毕的数据有多少种数据格式。
总共1364张图,可以看到总有jpeg,bmp,png格式,我们首先将其全部转换为jpg格式,这也是所有框架支持的格式,格式转换代码如下:
import os
import sys
import cv2
import numpy as np
def listfiles(rootDir):
list_dirs = os.walk(rootDir)
for root, dirs, files in list_dirs:
for d in dirs:
print os.path.join(root,d)
for f in files:
fileid = f.split('.')[0]
filepath = os.path.join(root,f)
try:
src = cv2.imread(filepath,1)
print "src=",filepath,src.shape
os.remove(filepath) cv2.imwrite(os.path.join(root,fileid+".jpg"),src)
except:
os.remove(filepath)
continue
listfiles(sys.argv[1]) ##输入文件夹即可
统一格式为jpg之后预览如下:
另外,在刚才的脚本中我们可以加上一个计数器完成重命名,不过因为这里爬虫已经完成了这个重命名操作,我们就略去。
3.3 数据清洗
利用搜索引擎爬取得到的图片肯定有不符合要求的,数据清洗主要是删除不合适的图片,即非人脸的照片。
可以采用肉眼观察的方式,也可以利用程序进行筛选,我们调用opencv的人脸检测算法进行筛选,代码如下:
#coding:utf8
import cv2
import dlib
import numpy as np
import sys
import os
cascade_path='haarcascade_frontalface_default.xml'
cascade = cv2.CascadeClassifier(cascade_path)
images = os.listdir(sys.argv[1])
for image in images:
im=cv2.imread(os.path.join(sys.argv[1],image),1)
rects = cascade.detectMultiScale(im, 1.3,5)
print "detected face",len(rects)
if len(rects) == 0:
cv2.namedWindow('Result',0)
cv2.imshow('Result',im)
os.remove(os.path.join(sys.argv[1],image))
k =cv2.waitKey(0)
if k == ord('q'):
break
这个人脸检测算法是传统算法,召回率不高,因此会有一些好样本被删除。
最后剩下732张样本,可以看到都是比较好的样本了,后面提取人脸关键点也会简单很多。
版权声明:本文标题:【CV项目实战】纯新手如何从零开始完成一个工业级的图像分类任务? 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729072824a1185091.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论