猫狗大战 python_猫狗大战

2023-10-29

这个项目我们要做一个识别猫狗的模型,这和上次的数字识别一样,也是运用深度学习,不过这次模型较为复杂,我们会用到迁移学习,站在巨人的肩膀上,借用大佬们已经训练好的模型来搭建我们自己的模型并让它做我们想做的事。

安装要求Python3

Numpy

Scipy

matplotlib

tensorflow

keras

opencv

数据预处理

def make_label(file_name):

label = file_name.split('.')[0]

##one-hot-encoding

if label == 'cat':

return [0]

elif label == 'dog':

return [1]

def make_data(img_path,img_size):

path_length = len(os.listdir(img_path))

images = np.zeros((path_length,img_size,img_size, 3), dtype=np.uint8)

labels = np.zeros((path_length,1),dtype=np.float32)

count = 0

for file_name in os.listdir(img_path):

labels[count] = make_label(file_name)

images[count] = cv2.resize(cv2.imread(img_path+'/'+file_name),(img_size,img_size))

b,g,r = cv2.split(images[count]) # get b,g,r

images[count] = cv2.merge([r,g,b]) # switch it to rgb

count+=1

##shuffle

p = np.random.permutation(path_length)

images,labels = images[p],labels[p]

return images,labels

(猫的标签为0.,狗的标签为1.)

模型基于VGG16的模型

input = Input(shape=(img_size, img_size, 3))

base_model = VGG16(weights='imagenet', input_tensor=input,include_top=False)

x = Flatten()(base_model.output)

x = Dense(2048, activation='relu')(x)

x = Dense(1024, activation='relu')(x)

x = Dropout(0.7)(x)

output = Dense(1, activation='sigmoid')(x)

model = Model(input=input, output=output)训练

from keras.callbacks import TensorBoard

from keras.optimizers import SGD

for layer in model.layers[:19]:

layer.trainable = False

opt = SGD(lr=0.0001, momentum=0.9)

model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])

model.fit(train_img,train_label,validation_split=0.2, callbacks=[TensorBoard(log_dir='./log')])

model.save('model.h5')

基于Xception的模型

train_img, train_label = make_data(train_path,299) ## Xception要求的shape为299*299

from keras.applications.xception import Xception

from keras.callbacks import TensorBoard

from keras.optimizers import SGD

input = Input(shape=(img_size, img_size, 3))

base_model_2 = Xception(weights='imagenet', input_tensor=input,include_top=False)

x = Flatten()(base_model_2.output)

#x = Dense(2048, activation='relu')(x)

x = Dense(512, activation='relu')(x)

x = Dropout(0.85)(x)

output = Dense(1, activation='sigmoid')(x)

model_2 = Model(input=input, output=output)

for layer in model_2.layers[:132]: ## Xception除了top的全连接还有132层

layer.trainable = False

opt = SGD(lr=0.0001, momentum=0.9)

model_2.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])

model_2.fit(train_img,train_label,validation_split=0.2, batch_size=10, callbacks=[TensorBoard(log_dir='./log')])

model_2.save('model_2.h5')

上面是Xception模型结构,较为复杂,我只更改了它的全连接层。

Xception相比VGG16更为庞大和复杂,当然效果也更好。预测可视化

数据提升

from scipy.ndimage.interpolation import shift

def img_change_brightness(img):

# Convert the image to HSV

img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Compute a random brightness value and apply to the image

brightness = np.random.uniform(0.25,1) ##调整范围在0.25到1之间

img[:, :, 2] = img[:, :, 2] * brightness

# Convert back to RGB

return cv2.cvtColor(img, cv2.COLOR_HSV2BGR)

index = random.randint(0,len(train_images))

for i in range(4):

plt.subplot(2,2,i+1)

img = [train_images[index], #原图

np.flipud(train_images[index]), #上下翻转

np.fliplr(train_images[index]), #左右翻转

img_change_brightness(train_images[index])] #亮度调整

plt.imshow(img[i])

plt.axis('off')

#随机将25%的训练数据进行亮度调整

for i in range(int(len(train_images)*0.25)):

index = random.randint(0,len(train_images))

train_images[index] = img_change_brightness(train_images[index])

#随机将25%的训练数据进行左右翻转

for i in range(int(len(train_images)*0.25)):

index = random.randint(0,len(train_images))

train_images[index] = np.fliplr(train_images[index])

#随机将25%的训练数据进行上下翻转

for i in range(int(len(train_images)*0.25)):

index = random.randint(0,len(train_images))

train_images[index] = np.flipud(train_images[index])

训练第n次

from keras.callbacks import TensorBoard

from keras.models import load_model

model_3 = load_model('model_2.h5')

model_3.fit(train_images,train_labels,validation_data=(valid_images,valid_labels), batch_size=16, callbacks=[TensorBoard(log_dir='./log')])

model_3.save('model_3.h5')

我们可以直接用上面已经构建好的模型,直接载入新数据来训练

模型效果比较

VGG16

Xception

数据提示后的Xception

结尾

文章代码/数据地址ciozhang

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

猫狗大战 python_猫狗大战 的相关文章

  • SpringBoot + redis 简单运用

    初始项目 pom xml引入redis
  • LeetCode每日一题之二分搜索

    文章目录 1 关于二分搜索常见的误区 2 左闭右闭区间的写法 3 左闭右开区间的写法 4 找到第一个大于target的数 5 找到第一个小于target的数 6 找到第一个大于等于taregt的数 7 找到第一个小于等于target的数 1
  • Vue3 word如何转成pdf代码实现

    博主 锅盖哒 文章核心 word如何转换pdf 目录 1 前端部分 2 后端部分 在Vue 3中 前端无法直接将Word文档转换为PDF 因为Word文档的解析和PDF的生成通常需要在后端进行 但是 你可以通过Vue来触发后端的转换过程 下
  • 牛客网刷题-java

    大部分解答为牛客网各位同学的精彩回答 本文只是选择一些互联网常考题目记录备忘 1 一个类的构造器可以调用这个类中的其他构造器 this的作用其中一个就是在一个构造方法中调用另一个构造方法 格式为this 参数 如 this x super是
  • 小程序挣钱_抖推之家抖音小程序怎么挣钱?

    最近很多朋友来公司咨询 抖推之家到底是个什么样的项目 用抖音小程序怎么挣钱 真的只需要发发视频就可以了 大家对于它的好奇 疑问越来越多 今天小编就来为大家一一解答 一 抖推之家是个什么样的项目 抖推之家 专注于短视频流量变现服务 整合短视频
  • anaconda 创建虚拟环境、激活,使用的基本方法及安装包的基本方法

    第一步 打开Anaconda Prompt 可以看到这里是base环境 第二步 我们现在要创建一个新的虚拟环境 名叫test 且python版本为3 8 在安装过程中会出现下面这个选项 输入y就好了 创建成功如下图所示 hiahia 我们已
  • js 实现同时调两个接口

    let promiseValues getScreeningFileList id report getScreeningFileList id pathology Promise all promiseValues then res gt
  • 方舟生存进化服务器文件设置,方舟生存进化私人服务器设置教程[多图]

    方舟生存进化私人服务器怎样设定 得到使用权后 就能设置进入途径 下面小编为大家带来方舟生存进化私人服务器设置教程 一起来看看吧 私人服务器购买后 服主可以在里边配置自己的服务器信息 私人服务器进入方法 点击多人游戏下方的英文字母选项 就是私
  • win7及以上系统C++实现Hook explorer文件级监控复制、剪切和删除操作

    最近项目组需要实现一个对windows用户文件操作进行监控的功能 也就是使用explorer资源管理器的操作 于是乎我就想到了使用Hook的方法进行拦截 查找一番资料后发现XP调用的是最简单的CopyFileEx MoveFileWithP
  • 时间序列匹配之dtw的python实现(一)

    简介 Dynamic Time Warping 动态时间序列扭曲匹配 简称DTW 是时间序列分析的经典算法 用来比较两条时间序列之间的距离 发现最短路径 笔者在github上搜索dtw时发现了两个比较经典的库 dtw和dtw python
  • 最强英语翻译技巧-IT人士专用

    最强英语翻译技巧 IT人士专用 github传送门
  • UE4导入插件后编译无法通过,提示缺少typeinfo.h的坑。(VS2019踩坑记录)

    先说结论 VS有时候不用急着更新最新版本 包括工具也是 都是坑 再出问题我换17用了 参考链接 http papalqi cn 201910 cid 406 html https developercommunity visualstudi
  • 博客转站了~

    由于 CSDN 的博客功能经常有问题 所以把博文站点搬迁到 https www runzhliu cn 欢迎订阅 评论
  • Unity_物体旋转方法归纳

    0 旋转的三种方式 1 矩阵旋转 2 欧拉旋转 会造成万向节锁问题 3 四元数旋转 可避免万向节锁现象 1 方法1 Transform rotation Transform localRotation 旋转角度 void Update if
  • VC获取Unix时间戳

    获取Unix时间戳 std wstring GetUnixTimeStamp void FILETIME ft 0 SYSTEMTIME st 0 ULARGE INTEGER ull 0 GetSystemTime st SystemTi
  • 【数据分析】如何量化时间序列之间的相似性?

    如何量化时间序列之间的相似性 逝者如斯夫 不舍昼夜 时间不会停止 世界上的一切都在不断运动 抛开物理学或哲学的概念不提 几乎所有东西都可以被描述为一系列的事件 对数据更感兴趣的人来说 它们又可以被看做是一系列的测量 这就是我们所说的时间序列
  • 外卖店优先级问题(双指针降低时间复杂度)

    外卖店优先级问题 文章目录 外卖店优先级问题 问题详情 问题分析 1 普通思路 1 1输入储存问题 1 2 遍历存储的数据 1 3遍历 st N 数组 获得最终值 2 双指针 时间复杂度 O n 代码 具体的解析都在注释当中 其中困惑的点都
  • 面试题:InnoDB中一棵B+树能存多少行数据?

    作者 李平 原文地址 www cnblogs com leefreeman p 8315844 html 一 InnoDB一棵B 树可以存放多少行数据 InnoDB一棵B 树可以存放多少行数据 这个问题的简单回答是 约2千万 为什么是这么多
  • 怎么让qt程序在Android系统上运行

    我们都知道支持跨平台是Qt的特点之一 也是比较重要的特点 最近在学习Qt的开发 就在想 它是怎么支持跨平台的呢 我平时的程序都是windows系统下开发和运行 语言用c 那怎么把我用c 写的qt程序运行在android平台上呢 带着这个问题

随机推荐

  • 利用Vulnhub复现漏洞 - Discuz!X ≤3.4 任意文件删除漏洞

    Discuz X 3 4 任意文件删除漏洞 Vulnhub官方复现教程 漏洞原理 复现漏洞 启动环境 漏洞复现 Formhash Cookie 发送数据包 原文 Vulnhub官方复现教程 https vulhub org environm
  • angular.js官方文档的一些说明

    由于angular phonecat那个项目更新了 中文翻译资料很多还是之前版本的 用起来会有问题 自己也碰到一些坑 在此说明下 windows 1 node js官网下载node的安装包 http nodejs org dist v0 1
  • PWN学习---1、基本漏洞-缓冲区溢出

    环境 Ubuntu12 04 32位 一 存在漏洞代码 vuln c include
  • p值小于0.05拒绝还是接受_计算p-值和第二类错误

    专栏里有一篇 两类错误弃真与取假 对显著性水平 P value 第二类错误 功效进行了解释 这里换种行文说 并给出具体计算例子 用来增加对这几个概念的认识和理解 首先我们要清楚我们手上只有一份容量为 的样本 实践中希望通过该份样本进行统计推
  • 老司机教你如何用Unity和Cardboard把3D游戏做成VR游戏

    原网址 随着Oculus宣布1月6日开启预售 2016年很可能成为VR游戏元年 但很多的调研显示 手游设备才是市场增长的关键 SuperData发布的报告显示 2016年全球VR游戏市场规模预计在51亿美元左右 消费者设备安装量在3890万
  • 你一定要知道的那些以太坊术语解释

    block 区块 包含交易 0或多个 父区块 parent hash及其他数据的数据包 在区块链中 除创世区块的每个区块都要包含其父区块的hash 整个区块链包含一个网络的所有交易历史 注意 有些基于区块链的加密货币自称 账本 而非 区块链
  • HashMap底层原理分析

    HashMap的实现原理在Jdk1 7之前底层实现是基于数组 链表的形式 即通过HashMap的key值进行Hash 然后对容量 默认16 负载因子 默认是0 75 进行取余获取到其桶的位置 比如某一个key的hash值是18 容量为为16
  • C语言if语句,for循环相关年月日应用

    文章目录 一 if双分支语句变成单分支语句 1 if单分支语句 2 if双分支语句 3 if双分支语句改成单分支语句 二 采用冒泡排序法对n个数据排序 编写n个元素数组 用冒泡排序法进行排序 三 输入一个年份 判断是不是闰年 1 满足两个条
  • 俞敏洪演讲:创业不需要有钱 只需想着挣钱

    各位朋友大家下午好 上午我坐下面我发现我跟郭凡生郭总很大不同 他认为他自己很聪明 而我恰恰认为自己不聪明 我呢认为自己也不一定笨 他认为他很有吸引力 确实是对三四十岁的中年人来说 郭总很有创业热情 因为这个年龄的人 能够用那样的语气语调 两
  • RabbitMQ(八)【高级 - 过期时间 TTL】

    八 RabbitMQ高级 过期时间 TTL 上一篇文章 SpringBoot案例 概述 过期时间 TTL 表示可以对消息设置预期的时间 在这个时间内都可以被消费者接收获取 过了之后消息将自动被删除 RabbitMQ可以对 消息和队列 设置
  • 技术博客?

    我认为技术博客是一个非常好的工具 能够帮助我们更好地学习和理解各种技术 同时还能够帮助我们建立自己的品牌和声誉 在我的博客中 我会分享各种最新的技术 开发工具 以及一些我在实际项目中的经验和教训 我的博客主题主要分为以下几个方面 1 前端开
  • 如何高效解决问题?

    前言 我相信很多人在生活中和工作中都会遇到大大小小的问题 每个人解决问题的效率和思维都是有差别的 那么怎么样才能高效解决问题呢 其实问题的产生 从现象到逻辑 考验着我们的知识储备 磨砺着能力的段位 训练着思维的灵活度 从现象到方法论 5W1
  • Elasticsearch学习系列之term和match查询 Elasticsearch查询模式

    Elasticsearch查询模式 一种是像传递URL参数一样去传递查询语句 被称为简单查询 GET library books search 查询index为library type为books的全部内容 GET library book
  • Bean的自动装配 Spring使用注解开发

    Bean的自动装配 自动装配是Spring满足bean依赖的一种方式 Spring会在上下文自动寻找 并自动给bean装配 1 在xml中显示的配置 2 在java中显示的配置 3 隐式 的自动装配bean 重要 测试 autowire b
  • GPT-3 模型

    GPT 3 Generative Pre training Transformer 3 是由 OpenAI 开发的一种大型语言生成模型 它可以用来进行文本生成 翻译 问答等任务 GPT 3 使用了 Transformer 架构 并在大量的网
  • day14-多线程01

    1 实现多线程 1 1简单了解多线程 理解 是指从软件或者硬件上实现多个线程并发执行的技术 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程 提升性能 1 2并发和并行 理解 并行 在同一时刻 有多个指令在多个CPU上同时执行
  • [4G/5G/6G专题基础-160]: BLER与MCS的关系、MCS表格的选择

    目录 第1章 什么是MCS 1 1 基本概念 1 2 三张不同的MCS表 1 3 MCS表的选择 1 4 MCS index的选择 第2章 什么是BLER 2 1 什么是比特误码率BER 2 2 什么是BLER 第3章 BLER与MCS的关
  • 机器学习——建筑能源得分预测

    前言 编码之前是了解我们试图解决的问题和可用的数据 在这个项目中 我们将使用公共可用的纽约市的建筑能源数据 目标是使用能源数据建立一个模型 来预测建筑物的Enerqy Star Score 能源之星分数 并解释结果以找出影响评分的因素 数据
  • 运维必学

    欢迎关注 全栈工程师修炼指南 专注 企业运维实践 网络安全 系统运维 应用开发 物联网实战 全栈文章 等知识分享 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 作者主页 https www weiyigeek top 博客
  • 猫狗大战 python_猫狗大战

    这个项目我们要做一个识别猫狗的模型 这和上次的数字识别一样 也是运用深度学习 不过这次模型较为复杂 我们会用到迁移学习 站在巨人的肩膀上 借用大佬们已经训练好的模型来搭建我们自己的模型并让它做我们想做的事 安装要求Python3 Numpy