【深度学习图像识别课程】毕业项目:狗狗种类识别(4)代码实现

2023-11-08

本博文涉及以下:六
目录:

Zero:导入数据集

一、检测人脸

二、检测狗狗

三、从头实现CNN实现狗狗分类

四、迁移VGG16实现狗狗分类

五、迁移ResNet_50实现狗狗分类

六、自己实现狗狗分类

 

六、自己实现狗狗分类整体流程

实现一个算法,它的输入为图像的路径,它能够区分图像是否包含一个人、狗或两者都不包含,然后:

  • 如果从图像中检测到一只,返回被预测的品种。
  • 如果从图像中检测到,返回最相像的狗品种。
  • 如果两者都不能在图像中检测到,输出错误提示。

可以自己编写检测图像中人类与狗的函数,可以随意使用已经完成的 face_detector 和 dog_detector 函数。使用在步骤5的CNN来预测狗品种。

下面提供了算法的示例输出,也可以自由地设计模型!

Sample Human Output

1、加载数据集

from sklearn.datasets import load_files       
from keras.utils import np_utils
import numpy as np
from glob import glob

# 定义函数来加载train,test和validation数据集
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,test和validation数据集
train_files, train_targets = load_dataset('dogImages/train')
valid_files, valid_targets = load_dataset('dogImages/valid')
test_files, test_targets = load_dataset('dogImages/test')

# 加载狗品种列表
dog_names = [item[20:-1] for item in sorted(glob("dogImages/train/*/"))]

# 打印数据统计描述
print('There are %d total dog categories.' % len(dog_names))
print('There are %s total dog images.\n' % len(np.hstack([train_files, valid_files, test_files])))
print('There are %d training dog images.' % len(train_files))
print('There are %d validation dog images.' % len(valid_files))
print('There are %d test dog images.'% len(test_files))

 

2、检测是否有狗狗

from keras.applications.resnet50 import ResNet50

# 定义ResNet50模型
ResNet50_model = ResNet50(weights='imagenet')

from keras.preprocessing import image                  
from tqdm import tqdm

def path_to_tensor(img_path):
    # 用PIL加载RGB图像为PIL.Image.Image类型
    img = image.load_img(img_path, target_size=(224, 224))
    # 将PIL.Image.Image类型转化为格式为(224, 224, 3)的3维张量
    x = image.img_to_array(img)
    # 将3维张量转化为格式为(1, 224, 224, 3)的4维张量并返回
    return np.expand_dims(x, axis=0)

def paths_to_tensor(img_paths):
    list_of_tensors = [path_to_tensor(img_path) for img_path in tqdm(img_paths)]
    return np.vstack(list_of_tensors)

from keras.applications.resnet50 import preprocess_input, decode_predictions
def ResNet50_predict_labels(img_path):
    # 返回img_path路径的图像的预测向量
    img = preprocess_input(path_to_tensor(img_path))
    return np.argmax(ResNet50_model.predict(img))

def dog_detector(img_path):
    prediction = ResNet50_predict_labels(img_path)
    return ((prediction <= 268) & (prediction >= 151)) 

 

3、检测是否有人

import cv2                
import matplotlib.pyplot as plt                        
%matplotlib inline                               

# 提取预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_alt.xml')

# 如果img_path路径表示的图像检测到了脸,返回"True" 
def face_detector(img_path):
    img = cv2.imread(img_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray)
    return len(faces) > 0

 

4、得到bottleneck特征:ResNet50

bottleneck_features = np.load('bottleneck_features/DogResnet50Data.npz')
train_Resnet50 = bottleneck_features['train']
valid_Resnet50 = bottleneck_features['valid']
test_Resnet50 = bottleneck_features['test']

 

5、模型建立、编译、训练和测试

### TODO: 定义你的框架
from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.models import Sequential

Resnet50_model = Sequential()
Resnet50_model.add(GlobalAveragePooling2D(input_shape=train_Resnet50.shape[1:]))
Resnet50_model.add(Dense(133, activation='softmax'))

Resnet50_model.summary()

### TODO: 编译模型
Resnet50_model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
### TODO: 训练模型
from keras.callbacks import ModelCheckpoint  

checkpointer = ModelCheckpoint(filepath='saved_models/weights.best.Resnet50.hdf5', 
                               verbose=1, save_best_only=True)
Resnet50_model.fit(train_Resnet50, train_targets, 
          validation_data=(valid_Resnet50, valid_targets),
          epochs=20, batch_size=20, callbacks=[checkpointer], verbose=1)
### TODO: 加载具有最佳验证loss的模型权重
Resnet50_model.load_weights('saved_models/weights.best.Resnet50.hdf5')
### TODO: 在测试集上计算分类准确率
Resnet50_predictions = [np.argmax(Resnet50_model.predict(np.expand_dims(feature, axis=0))) for feature in test_Resnet50]

# 报告测试准确率
test_accuracy = 100*np.sum(np.array(Resnet50_predictions)==np.argmax(test_targets, axis=1))/len(Resnet50_predictions)
print('Test accuracy: %.4f%%' % test_accuracy)

 

 6、测试新图片

### TODO: 写一个函数,该函数将图像的路径作为输入
### 然后返回此模型所预测的狗的品种
from extract_bottleneck_features import *

def Resnet50_predict_breed(img_path):
    # 提取bottleneck特征
    bottleneck_feature = extract_Resnet50(path_to_tensor(img_path))
    # 获取预测向量
    predicted_vector = Resnet50_model.predict(bottleneck_feature)
    # 返回此模型预测的狗的品种
    return dog_names[np.argmax(predicted_vector)]
def LastPredict(img_path):
    img = cv2.imread(img_path)
    # 将BGR图像转变为RGB图像以打印
    cv_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.imshow(cv_rgb)
    plt.show()
    if face_detector(img_path) > 0:
        print("Hello, Human")
        print("You look like a ... in dog world")
        print(Resnet50_predict_breed(img_path))
    elif dog_detector(img_path) == True:
        print("Hello, Dog")
        print("You are a ... ")
        print(Resnet50_predict_breed(img_path))
    else:
        print("Error Input")

(1)6张狗狗:只有第一张被误判为人类,但是检测的相似狗狗对了。另外5张没有错误。

 

(2)5张人的图片:5张没有误判的。另外,我像Poodle。

 

(3)3张猫咪:第二张错误,被误判为人类。其他2张正确。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【深度学习图像识别课程】毕业项目:狗狗种类识别(4)代码实现 的相关文章

  • [Python]一行代码铺平/拉直/展开多维列表list

    需求 展开为多维展开为一维列表 查阅了网上很多资料 方法各有好坏 有的方法就比较长 例如 def flap a Breadth First Traversal a list a r i 0 while 1
  • 使用WebStorm创建/运行/调试React Native项目

    说在前面 使用的WebStorm版本是2017 1 1 一 创建React Native项目 1 File gt New gt Project 2 在New Project窗口中选择React Native 并根据情况 修改项目路径和项目名
  • shell的学习笔记——变量的设置规则

    1 单引号和双引号的区别 双引号内有特殊符号 保留原本特性 单引号内则为一般字符 例如 var a is 则echo a 显示 a is var a is 则显示 a is 2 两边不能将直接接空格 需要加上引号 3 可以用转义字符 将特殊
  • ZZULIOJ--2825: 收集金币

    2825 收集金币 时间限制 1 Sec 内存限制 512 MB 提交 181 解决 55 状态 讨论版 提交 命题人 zzuliacm 题目描述 小辣在玩奇怪的的小游戏 在这一关中 游戏的主角的任务是收集金币 这时有n个事件依次发生 事件
  • Microsoft Word 教程:如何在 Word 中插入页码、目录?

    欢迎观看 Microsoft Word 教程 小编带大家学习 Microsoft Word 的使用技巧 了解如何在 Word 中插入页码 目录 插入页码 在 插入 选项卡上 选择 页眉和页脚 然后单击 页码 页码 Mac软件资源站 在打开的
  • Tensorflow和Pytorch通道维度总结

    Caffe 的通道顺序是NCHW Tensorflow的通道顺序默认是NHWC 但可以设置成NCHW NHWC 的访存局部性更好 每三个输入像素即可得到一个输出像素 NCHW 则必须等所有通道输入准备好才能得到最终输出结果 需要占用较大的临
  • 关于微信小程序图片不显示的问题解决方案

    关于微信小程序图片不显示的问题解决方案 经过查阅资料发现如下文档导致图片不显示 1 本地图片是用image加载的 src images ic header jpg 这样不能显示 应改为 https jpg 2 图片的url里面有中文 3 图
  • SQL常用语句

    简介 记录平时经常用到但是又扰你故意忘掉的SQL语句 关闭MySQL的严格模式 phpstudy默认开启了严格模式 很多时候需要在非严格模式下才有用 下面的语句说明如何关闭严格模式 在MYSQL配置文件my ini中 注释下面这行 sql
  • 【软件测试】多家公司面经合集分享,这次秋招不用再担心面试难的问题了

    文章目录 前言 绿盟 快手 Shein 网易云测开一面 挂 小米 测试开发 网易互娱 软件测试 广州 一面 一个小时 二面 45分钟 三面 30min 总监 爱奇艺侧开一面 挂 大疆测试 东方财富软件测试 东方财富软件测试 中金所 360测
  • VS2013配置SQLite数据库

    1 下载SQLite相关文件 官网 https sqlite org download html 下载这两个文件 3 编译 解压文件 里面存在两个文件 打开windows下的cmd 找到vs2013的安装路径下的lib exe所在的文件夹
  • 人工智能-搜索----启发式搜索

    搜索算法的形式化描述 lt 状态state 动作motion 状态转移state transition 路径path 测试目标test target gt 一 启发式搜索 有信息搜索 Heuristic Search 代表算法 贪婪最佳优先
  • latex 图片跑到引用后的解决办法

    问题描述 双栏情况下 当正文 参考文献占不到一页 而此时你的图片又刚好占了至少半页 此时图片就会被抵到参考文献后 解决办法 要想将参考文献调整到图片后 可以在论文开头引入包 usepackage section placeins 但这样的话
  • 用c语言开发一个安卓APP,c语言开发的app-用c语言可以开发app吗

    通常 IOS应用使用C 和对象的C 以写的 但到的xcode通过该程序 您可以写信给重用OC A应用程序也可以用一个OC C 结合起来写 我读了一外地开发商说 代码app1000行 他开发800是C 200条OC 电话软件 c编程语言都可以
  • 腾讯云Linux服务器搭建(二) DNS设置

    主机是用支付宝交钱 从付款到拿到主机用了20分钟左右吧 拿到后上去确认了配置是否相符 一切确认无误后 先把域名的DNS设置到主机上 然后再开始办理备案相关手续 域名解析 域名原来是从万网买的 现在万网早就被阿里收购了 只能去阿里云找了 直接
  • php curl 发起get和post网络请求.note

    curl介绍 curl是一个开源的网络链接库 支持http https ftp gopher telnet dict file and ldap 协议 之前均益介绍了python版本的pycurl http junyiseo com pyt
  • ClickHouse替换MySQL作为数仓APP层

    一 ClickHouse 是什么 二 业务问题 三 ClickHouse实践 四 遇到的坑 五 总结 一 ClickHouse 是什么 ClickHouse 是一个用于联机分析 OLAP 的列式数据库管理系统 DBMS 我们首先理清一些基础
  • 【转载】CNN模型复杂度(FLOPs、MAC)、参数量与运行速度

    备忘 作者写错了 1次乘加运算等于2次浮点运算 但在数值上正好反过来 即1 FLOPs 2 MACs 例如对于卷积运算的计算是 其MACs 参数m 输出尺寸 n 而FLOPs 2 MACs Nvidia团队论文里面写的是对的 2倍 CNN模
  • SQLServer导入导出excel及常见问题

    前几天考试系统导入导出学生信息 初次接触导入导出 为sqlserver和excel的数据传递方法之简和MS产品的高效兼容所震惊 但也遇到各种各样问题 在此介绍SQLServer导入导出excel方法及遇到的问题 SQLServer导出Exc
  • java 中Date日期类型

    4 日期相关 把1970年1月1日当做了时间原点 以毫秒值为单位 4 1 获得当前时间 System currentTimeMillis public class DateTest public static void main Strin
  • ifstream 和 ofstream 文件中读取和写入操作

    导读 ofstream是从内存到硬盘 ifstream是从硬盘到内存 其实所谓的流缓冲就是内存空间 在C 中 有一个stream这个类 所有的I O都以这个 流 类为基础的 包括我们要认识的文件I O stream这个类有两个重要的运算符

随机推荐

  • XGBoost和LightGBM的比较

    目录 1 XGBoost sgboost中树节点分裂时所采用的公式 xgboost的分裂步骤 xgboost总结 LightGBM 基于决策树算法的分布式梯度提升框架 LightGBM在模型的训练速度和内存方面的优化 LightGBM的le
  • arima模型 p q d 确定_【干货】时间预测之 ARIMA模型

    ARIMA 是 AutoRegressive Integrated Moving Average的简称 看起来很复杂 其实这个模型本身是多个模型的叠加或者说混合 AR 自相关模型 AutoRegressive MA 移动平均模型 Movin
  • Python显示目录的树形结构

    转自 http blog chinaunix net uid 21374062 id 5198995 html Python显示目录的树形结构 coding utf 8 仿Linux命令tree生成树形目录结构 并汇总当前目录下文件总算 A
  • pes2017服务器维护时间,PES2017授权详情与球场数据包发布时间

    East Dorsetshire AFC Bournemouth BOU Lancashire Claret Burnley BRN London FC Chelsea CHE South Norwood Crystal Palace CR
  • python:多维数组变一维数组

    python 多维数组变一维数组 b a flatten 将多维数组变为1维数组 具体代码如下 import numpy as np 1 随机生成一个4行3列的多维数组a a np random randn 4 3 print a prin
  • selenium自动化,更新到最新的chrome驱动

    很久没有做自动化了 最近想要熟悉下 发现之前的chrome驱动器与现在的chrome浏览器版本不匹配了导致报错 提示如下 raise exception class message screen stacktrace selenium co
  • (已解决)显卡(N卡)设置独显后,指定程序依旧使用集显渲染

    显卡 N卡 设置独显后 指定程序依旧使用集显渲染 设置流程如下 设置流程如下 1 打开 nvdia 控制面板 2 设置全局为独显 3 修改指定程序为独显 4 以上几步若无效 则按如下修改 选择对应的程序
  • Linux安装nginx

    Linux安装nginx 1 下载 2 准备目录 3 上传 解压 5 设置安装路径 如果 报错 gcc pcre 6 编译 7 安装 8 启动 9 其他命令 10 判断Nginx配置是否正确命令 11 开放nginx默认端口号80 12 访
  • 02_02_广度优先搜索(Breadth-First Search,BFS)

    广度优先搜索 Breadth First Search BFS 广度优先搜索 Breadth First Search BFS 介绍 是一种图遍历算法 其原理是逐层遍历图的节点 BFS从起始节点开始 先访问起始节点的所有邻居节点 然后再逐层
  • 【知识分享】关于建立GitHub个人博客的问题和解决办法

    前言 GitHub是可以共享 存储的平台 我们可以用它 1 管管自己代码 类似一个程序员专版的Onedrive 当然也不仅仅是代码 任何文件都支持 不少人用GitHub来写博客 也就是使用Github Pages服务 它会自动帮你记录代码的
  • Qt扫盲-QWidget理论使用总结

    QWidget理论使用总结 一 概述 二 顶层 控件 和子 控件 三 复合控件 四 自定义控件和绘制 五 大小提示和大小策略 六 事件 七 一组函数和属性 八 QWidget样式表 九 透明度和双缓冲 十 创建半透明窗口 一 概述 widg
  • Java中同一个文件里类和方法的引用

    Java中同一个文件里类和方法的引用 在项目开发时往往需要在同一个文件里创建几个类 并互相引用 但小白们搞不懂 所以我给大家讲解一下 目录 Java中同一个文件里类和方法的引用 1 权限修饰符 2 类的引用 1 注意修饰符 2 同文件引用
  • windows 各种消息

    win32 消息
  • H3C平台部署chatGLM2-6B 且通过两块GPU调用

    H3C平台部署chatGLM2 6B 且通过两块 调用 文件上传 首先在github上下载chatGLM2 6B的参数文件和模型文件 简单来说是在github上搜索chatGLM2 6B 如下图所示 点击右侧 下载 然后解压到新建文件夹 C
  • c++ /QT 加锁的懒汉式单例

    c 加锁的懒汉式单例 singleton h ifndef SHAREPTR T H define SHAREPTR T H pragma once include
  • Perl Getopt::Long命令行参数传递

    原文链接 https www javatpoint com perl command line arguments The simple command line options are done using s option Comple
  • 数论——欧拉函数

    在数论中 对正整数n 欧拉函数是少于或等于n的数中与n互质的数的数目 此函数以其首名研究者欧拉命名 它又称为Euler s totient function 函数 欧拉商数等 例如 8 4 因为1 3 5 7均和8互质 百度百科词条 欧拉函
  • 虚拟机的启动内核日志

    等有时间了 回来分析下 0 000000 Initializing cgroup subsys cpuset 0 000000 Initializing cgroup subsys cpu 0 000000 Initializing cgr
  • LaTeX各种矩阵输入方法总结

    begin Bmatrix 1 2 4 5 end Bmatrix 结果 1 2
  • 【深度学习图像识别课程】毕业项目:狗狗种类识别(4)代码实现

    本博文涉及以下 六 目录 Zero 导入数据集 一 检测人脸 二 检测狗狗 三 从头实现CNN实现狗狗分类 四 迁移VGG16实现狗狗分类 五 迁移ResNet 50实现狗狗分类 六 自己实现狗狗分类 六 自己实现狗狗分类整体流程 实现一个