猫狗识别 动物识别

0922更新
众所周知 同人女学猫狗识别的第一件事情就是拿来看看自己cp到底是猫猫还是狗狗。
以下是代码,准确率只有百分之七十,赛博算着玩。

建模(抄的吴恩达的。一开始我自己的电脑根本跑不了epoch=100,都是改小了还跑着跑着就报错了。后面用了google colab终于能运行了,结果就在这个时候我发现验证集的准确率在28左右就不再上升,所以直接把epoch改小了。
colab比较不好的一点是模型跑完隔几分钟不看又废了,帮朋友算cp的时候多聊一会下又要重新跑)

!wget --no-check-certificate \
    https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
    -O /tmp/cats_and_dogs_filtered.zip
  
import os
import zipfile
import tensorflow as tf
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator

local_zip = '/tmp/cats_and_dogs_filtered.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp')
zip_ref.close()

base_dir = '/tmp/cats_and_dogs_filtered'
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')

# Directory with our training cat pictures
train_cats_dir = os.path.join(train_dir, 'cats')

# Directory with our training dog pictures
train_dogs_dir = os.path.join(train_dir, 'dogs')

# Directory with our validation cat pictures
validation_cats_dir = os.path.join(validation_dir, 'cats')

# Directory with our validation dog pictures
validation_dogs_dir = os.path.join(validation_dir, 'dogs')

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(learning_rate=1e-4),
              metrics=['acc'])

# All images will be rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

# Flow training images in batches of 20 using train_datagen generator
train_generator = train_datagen.flow_from_directory(
        train_dir,  # This is the source directory for training images
        target_size=(150, 150),  # All images will be resized to 150x150
        batch_size=20,
        # Since we use binary_crossentropy loss, we need binary labels
        class_mode='binary')

# Flow validation images in batches of 20 using test_datagen generator
validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

history = model.fit(
      train_generator,
      steps_per_epoch=100,  # 2000 images = batch_size * steps
      epochs=28,
      validation_data=validation_generator,
      validation_steps=5,  # 1000 images = batch_size * steps
      verbose=1)


查看准确率(百分之七十)

import matplotlib.pyplot as plt
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(len(acc))

plt.plot(epochs, acc, 'bo', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')

plt.figure()

plt.plot(epochs, loss, 'bo', label='Training Loss')
plt.plot(epochs, val_loss, 'b', label='Validation Loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

预测

import numpy as np
from google.colab import files
from tensorflow.keras.preprocessing import image
img_path='/content/5.jpg'

img=image.load_img(img_path,target_size=(150,150))
plt.imshow(img)
x=image.img_to_array(img)
x=np.expand_dims(x,axis=0)

classes=model.predict(x)

if classes[0]>0.5:
  print ("is a dog")
else:
  print("猫猫")

我有两个朋友的照片测出来是猫,朋友家的狗测出来是狗,朋友磕的cp两个人测出来都是狗。

朋友说能不能预测以下别的动物,所以我随便搜了搜,找到了mobilenet_v2_animals这是一个轻量化的卷积神经网络,它在 MobileNet 的基础上,做了 Inverted Residuals 和 Linear bottlenecks 这两大改进。该 PaddleHub Module 是在百度自建动物数据集上训练得到的,可用于图像分类和特征提取,当前已支持7978种动物的分类识别。

首先报错,说没有paddle。试了试!pip install paddlehub==1.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple,继续报错。又试了试!pip3 install paddlepaddle==2.1.1 ,这次可以了。但是图像继续报错,提示说too many indices for array: array is 2-dimensional, but 3 were indexed搜了半天感觉都不是,大家都在说彩色灰色图片什么的,最后我发现我把别人代码改了,本来图像有[]但我删了,属于是格式问题,加回去就可以了。
因为是已经做好了的模型,实际上在预测的只有区区一句module.classification
主要花时间的是下载paddle和这个模型。但是这个模型很不解风情,不像猫狗测试,结果你要么是猫,要么是狗。它有个专门的分类叫“非动物”,所以如果给人的照片,出来的一定是非动物。我和朋友都很失望。

明明人类也是一种动物呀!人类!你在高贵什么!


import paddlehub as hub
module = hub.Module(name="mobilenet_v2_animals")

from tensorflow.keras.preprocessing import image
image_path='/content/5.jpg'

import cv2
np_images =[cv2.imread(image_path)]

result = module.classification(images=np_images)
print(result)

以下是八月份的分割线========================

import zipfile
local_zip='C:/Users/LENOVO/all/Downloads/kagglecatsanddogs_5340.zip'
zip_ref=zipfile.ZipFile(local_zip)
zip_ref.extractall('C:/Users/LENOVO/all/Downloads/kagglecatsanddogs_5340')
zip_ref.close

我的数据集没有区分训练-验证,这该怎么办呢……我灵机一动用cmd来划分了(move c:*.* d:\)虽然不是很规范 但我毕竟不会用python写拆分文件夹的代码(如果只是csv我都努力一下了 图片太麻烦了

import os

base_dir='C:/Users/LENOVO/all/Downloads/kagglecatsanddogs_5340/PetImages'
train_dir = os.path.join(base_dir,'train')
validation_dir = os.path.join(base_dir,'validation')

train_cat_dir =os.path.join(train_dir,'cat')
train_dog_dir =os.path.join(train_dir,'dog')

validation_cat_dir =os.path.join(validation_dir,'cat')
validation_dog_dir =os.path.join(validation_dir,'dog')

train_cat_fnames=os.listdir(train_cat_dir)
print(train_cat_fnames[:10])
train_dog_fnames=os.listdir(train_dog_dir)
print(train_dog_fnames[:10])

print('total training cat images:',len(os.listdir(train_cat_dir)))
print('total training dog images:',len(os.listdir(train_dog_dir)))
print('total validation cat images:',len(os.listdir(validation_cat_dir)))
print('total validation dog images:',len(os.listdir(validation_dog_dir)))

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

nrows=4
ncols=4
pic_index=0


fig=plt.gcf()
fig.set_size_inches(nrows*4,ncols*4)

pic_index+=8
next_cat_pix=[os.path.join(train_cat_dir,fname)
              for fname in train_cat_fnames[pic_index-8:pic_index]]
next_dog_pix=[os.path.join(train_dog_dir,fname)
              for fname in train_dog_fnames[pic_index-8:pic_index]]     

for i,img_path in enumerate(next_cat_pix+next_dog_pix)              :
    sp=plt.subplot(nrows,ncols,i+1)
    sp.axis('Off')
    img=mpimg.imread(img_path)
    plt.imshow(img)
plt.show()

好啦!展示了十六张猫猫狗狗的图片!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的猫狗识别的CNN代码实现。 首先,导入必要的库和模块: ``` import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout from tensorflow.keras.preprocessing.image import ImageDataGenerator ``` 接着,定义一些超参数和数据处理的参数: ``` # 图像大小为 128x128 像素 img_width, img_height = 128, 128 # 训练和验证集的目录 train_dir = 'train' val_dir = 'val' # 批次大小 batch_size = 32 # 训练数据增强 train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) # 验证数据增强 val_datagen = ImageDataGenerator(rescale=1./255) # 载入训练和验证数据集 train_generator = train_datagen.flow_from_directory( train_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary') val_generator = val_datagen.flow_from_directory( val_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary') ``` 接着,定义一个简单的CNN模型: ``` # 初始化模型 model = Sequential() # 添加卷积层和池化层 model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(img_width, img_height, 3))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(128, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) # 添加全连接层 model.add(Flatten()) model.add(Dense(128, activation='relu')) # 添加 Dropout 层,减少过拟合 model.add(Dropout(0.5)) # 输出层 model.add(Dense(1, activation='sigmoid')) ``` 然后,编译模型并进行训练: ``` # 编译模型 model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) # 训练模型 model.fit(train_generator, steps_per_epoch=len(train_generator), epochs=50, validation_data=val_generator, validation_steps=len(val_generator)) ``` 最后,评估模型的性能: ``` # 评估模型 test_loss, test_acc = model.evaluate(val_generator, steps=len(val_generator)) print('Test accuracy:', test_acc) ``` 这就是一个简单的猫狗识别的CNN代码实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值