狗狗图片识别分类的CNN(卷积网络)实现

项目概述:

一种可用于移动应用或网络应用的算法。 代码将能够接受任何用户提供的图像作为输入。 如果从图像中检测出小狗,该算法将大致识别出小狗品种。 如果检测出人脸,该算法将大致识别出最相似的小狗品种。

项目学习步骤:

  • 导入以及预处理数据集
  • 建立人脸检测模块:采用OpenVC检测人脸(https://docs.opencv.org/trunk/db/d28/tutorial_cascade_classifier.html
  • 建立小狗识别模块:使用预训练的 ResNet-50 模型来检测图片中的狗狗
  • 从头开始创建预测小狗分类品种的 CNN:基于Keras添加CNN,此处使用categorical_crossentropy对于multiclassifier图片标签分类更有效(损失函数是用来估量模型中预测值y与真实值Y之间的差异,即不一致程度)
  • 使用迁移学习分类小狗品种的 CNN:基于预训练的模型获取瓶颈特征,在此基础上叠加CNN,以降低训练时间
    • VGG-16(Kaggle Compitition link if you are interested)
    • Xception(Kaggle Compitition link if you are interested)
  • 编写算法:将图像的文件路径作为输入,并首先判断图像中是否包含人脸、小狗
  • 测试算法:测试图片获取分类

项目实施步骤与分析:

数据导入与预处理

- 将准备完整的数据集,在本项目中为一系列狗狗图片,图片预存在服务器

- 项目数据集已分别存放在test, valid, train三个文件夹中

- 狗狗分类共133种,并以文件夹名与文件名形式预处理,例如:"train\001.Affenpinscher\Affenpinscher_00001.jpg"

- 导入人脸文件数据文件,并做随机排序,不做分类训练

- 处理异常数据:项目数据集并无异常数据,但仍可以考虑添加对于文件类型filter图片类型文件,以及格式错误的文件

通过以下示例代码读取对数据进行预处理,

# 函数获取test, train, valid数据,使用np array存储
def load_dataset(path):
    data = load_files(path)
    dog_files = np.array(data['filenames'])
    dog_targets = np_utils.to_categorical(np.array(data['target']), 133)
    return dog_files, dog_targets

# 从文件夹中获取
train_files, train_targets = load_dataset('文件地址/train')
valid_files, valid_targets = load_dataset('文件地址/data/dog_images/valid')
test_files, test_targets = load_dataset('文件地址/data/dog_images/test')

# 获取狗狗名称
dog_names = [item[20:-1] for item in sorted(glob("文件地址/train/*/"))]

random.seed(8675309)

# 获取人脸图片文件名
human_files = np.array(glob("../../../data/lfw/*/*"))
random.shuffle(human_files)

 

建立人脸检测模块

- 使用OpenCV 提供的预训练人脸检测器:可以将XML 文件的形式从github下载并使用。

- 本次测试代码使用Haar 特征级联分类器(Haar feature-based cascade classifiers来检测图片中的人脸

- 测试人脸检测模块的accuracy

通过以下示例代码建立人脸检测模块

# 读取xml
face_cascade = cv2.CascadeClassifier('目标文件夹/haarcascade_frontalface_alt.xml')

# 读取并将文件灰度化
img = cv2.imread(human_files[3])
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 调用探测人脸
faces = face_cascade.detectMultiScale(gray)

#如定义检测函数,此处可以return len(faces) > 0 作为检测结果

# 加个框
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    
# 将BGR通道转化为RGB
cv_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 展示找到的人脸图片
plt.imshow(cv_rgb)
plt.show()

如找到人脸,示例代码输出:

通过测试预先load的人脸与狗狗文件,做一个准确性测试,示例代码如下:

## 检测
print("Human detected: ",np.mean([face_detector(f) for f human_files[:100]]))
print("Dog detected: ",np.mean([face_detector(d) for d train_files[:100]]))
示例代码输出:
Human detected:  1.0
D
  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值