基于Python实现一键找出磁盘里所有猫照

目录
  • 前言
  • 1.准备
  • 2.编写代码
  • 3.批量自动识别
  • 4.完整代码

前言

最近在整理我磁盘上的照片,发现不少猫照,突然觉得若能把这些猫照都挑出来,观察它们的成长轨迹也是一件不错的事情。一张一张的找实在是太费劲了,能不能自动化地找出来呢?

目标检测,是许多计算机视觉应用的重中之重,比如说我们上次的实例分割:Python 20行代码批量自动抠图,人体关键点提取、人脸识别等。而我们这一次,是要识别猫照。由于时间不多,我们没有时间收集训练集,那么有没有已经训练好的目标检测模型呢?

这时候就要搬出paddlehub了,puddlehub有一个模型叫做YOLOv3,基于 Joseph Redmon和Ali Farhadi提出的单阶段检测器。该检测器与达到同样精度的传统目标检测方法相比,推断速度能达到接近两倍。

YOLOv3将输入图像分成S*S个格子,每个格子预测B个bounding box,每个bounding box预测内容包括: Location(x, y, w, h)、Confidence Score和C个类别的概率,因此我们不仅能够找出猫的照片,还能定位它的位置!甚至能自动数出一张照片里有多少只猫!

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点

为了实现识别猫的功能,我们需要安装 paddlepaddle, 进入他们的官方网站就有详细的指引

根据你自己的情况选择这些选项,最后一个CUDA版本,由于本实验不需要训练数据,也不需要太大的计算量,所以直接选择CPU版本即可。选择完毕,下方会出现安装指引,不得不说,Paddlepaddle 这些方面做的还是比较贴心的。

要注意,如果你的Python3环境变量里的程序名称是Python,记得将python3 xxx 语句改为Python xxx 如下进行安装:

python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple

你还需要安装paddlehub:

pip install -i https://mirror.baidu.com/pypi/simple paddlehub

2.编写代码

我们先试试单图片识别,找到猫猫:

新建predict.py文件,存放猫照在当前文件夹的imgs文件夹下,命名为c1.jpg. 输入以下代码:

import paddlehub as hub

# 加载模型
yolov3 = hub.Module(name="yolov3_darknet53_coco2017")

# 图片位置
test_img_path = "imgs/c1.jpg"

# 输入图片
input_dict = {"image": [test_img_path]}

# 输出结果
results = yolov3.object_detection(data=input_dict)
for result in results:
    print(result['path'])
    print(result['data'])

在终端/CMD输入以下命令运行文件:

python predict.py
# [{'left': 684.79376, 'right': 2024.4724, 'top': 961.53644, 'bottom': 2299.855, 'label': 'cat', 'confidence': 0.94765514}, {'left': 1461.0829, 'right': 3853.3633, 'top': 621.53064, 'bottom': 2769.5376, 'label': 'cat', 'confidence': 0.8093604}]

可以看到,识别到了两只猫,其中第一只猫顶部位置为961,右部位置为2024,左部位置为684,底部位置为2299。根据这个位置,编写代码,用于框出相应位置的猫:

def paint_rect(input_img: str, output_path: str,
               labels: list, position: list):
    """
    画出矩形
        :param input_img: 输入图片
        :param output_path: 输出图片
        :param labels: 标签
        :param positions: 坐标
    公众号:Python实用宝典
    """
    img = cv2.imread(input_img)

    for position in positions:
        print(position)
        # 画矩形框, 输入参数分别为图像、左上角坐标、右下角坐标、颜色数组、粗细
        cv2.rectangle(
            img, (position['left'], position['top']),
            (position['right'], position['bottom']),
            (0, 255, 0), thickness=10
        )

    if 'cat' in labels:
        # 若是猫,则存到另一个地方
        shutil.move(input_img, output_path + os.sep + input_img.split('/')[-1])
        cv2.imwrite(output_path + os.sep + 'rect_%s' % input_img.split('/')[-1], img)

效果如下:

3.批量自动识别

这样,我们就有思路进行自动识别了,首先获得该文件夹下所有的图片,其次,将这些图片都放入分类器中进行分类,最后,再根据分类的标签将其提取出来移动到其他地方。

获得该文件夹下所有图片:

def get_all_path(dirpath, *suffix):
    """
    获得所有路径

    @param dirpath: 目录
    @param *suffix: 后缀
    公众号:Python实用宝典
    """

    path_array = []
    for r, ds, fs in os.walk(dirpath):
        for fn in fs:
            if os.path.splitext(fn)[1] in suffix:
                fname = os.path.join(r, fn)
                path_array.append(fname)
    return path_array
# 获得所有jpg和png图片
image_paths = get_all_path(source_path, '.jpg', '.JPG', 'png', 'PNG')

放入分类器中分类:

# 加载模型
yolov3 = hub.Module(name="yolov3_darknet53_coco2017")
# 输入图片
input_dict = {"image": image_paths}
# 输出结果
results = yolov3.object_detection(data=input_dict, labels=['cat'])

根据标签画框并移动:

def paint_rect(input_img: str, output_path: str,
               labels: list, position: list):
    """
    画出矩形
        :param input_img: 输入图片
        :param output_path: 输出图片
        :param labels: 标签
        :param positions: 坐标
    公众号:Python实用宝典
    """
    img = cv2.imread(input_img)

    for position in positions:
        # 画矩形框, 输入参数分别为图像、左上角坐标、右下角坐标、颜色数组、粗细
        cv2.rectangle(
            img, (position['left'], position['top']),
            (position['right'], position['bottom']),
            (0, 255, 0), thickness=10
        )

    if 'cat' in labels:
        # 若是猫,则存到另一个地方
        shutil.move(input_img, output_path + os.sep + input_img.split('/')[-1])
        cv2.imwrite(output_path + os.sep + 'rect_%s' % input_img.split('/')[-1], img)

results = yolov3.object_detection(data=input_dict, labels=['cat'])
for result in results:
    path = result['path']
    labels = []
    positions = []
    for target in result['data']:
        labels.append(target.get('label', ''))
        positions.append({
            'left': target.get('left', -1),
            'top': target.get('top', -1),
            'right': target.get('right', -1),
            'bottom': target.get('bottom', -1)
        })
    paint_rect(path, target_path, labels, positions)

4.完整代码

import paddlehub as hub
import cv2
import os
import shutil

def get_all_path(dirpath, *suffix):
    """
    获得所有路径

    @param dirpath: 目录
    @param *suffix: 后缀
    """

    path_array = []
    for r, ds, fs in os.walk(dirpath):
        for fn in fs:
            if os.path.splitext(fn)[1] in suffix:
                fname = os.path.join(r, fn)
                path_array.append(fname)
    return path_array

def paint_rect(input_img: str, output_path: str,
               labels: list, position: list):
    """
    画出矩形
        :param input_img: 输入图片
        :param output_path: 输出图片
        :param labels: 标签
        :param positions: 坐标
    """
    img = cv2.imread(input_img)

    for position in positions:
        # 画矩形框, 输入参数分别为图像、左上角坐标、右下角坐标、颜色数组、粗细
        cv2.rectangle(
            img, (position['left'], position['top']),
            (position['right'], position['bottom']),
            (0, 255, 0), thickness=10
        )

    if 'cat' in labels:
        # 若是猫,则存到另一个地方
        shutil.move(input_img, output_path + os.sep + input_img.split('/')[-1])
        cv2.imwrite(output_path + os.sep + 'rect_%s' % input_img.split('/')[-1], img)

if __name__ == '__main__':
    source_path = './imgs/'
    target_path = './target/'

    # 获得所有jpg和png图片
    image_paths = get_all_path(source_path, '.jpg', '.JPG', 'png', 'PNG')

    # 加载模型
    yolov3 = hub.Module(name="yolov3_darknet53_coco2017")

    # 输入图片
    input_dict = {"image": image_paths}

    # 输出结果
    results = yolov3.object_detection(data=input_dict, labels=['cat'])
    for result in results:
        path = result['path']
        labels = []
        positions = []
        print(path)
        for target in result['data']:
            labels.append(target.get('label', ''))
            positions.append({
                'left': target.get('left', -1),
                'top': target.get('top', -1),
                'right': target.get('right', -1),
                'bottom': target.get('bottom', -1)
            })
        paint_rect(path, target_path, labels, positions)

到此这篇关于基于Python实现一键找出磁盘里所有猫照的文章就介绍到这了,更多相关Python找出磁盘猫照内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python调用opencv实现猫脸检测功能

    Python 小猫检测,通过调用opencv自带的猫脸检测的分类器进行检测. 分类器有两个:haarcascade_frontalcatface.xml和 haarcascade_frontalcatface_extended.xml.可以在opencv的安装目录下找到 D:\Program Files\OPENCV320\opencv\sources\data\haarcascades 小猫检测代码为: 1. 直接读取图片调用 import cv2 image = cv2.imread("ca

  • Python机器学习之基于Pytorch实现猫狗分类

    一.环境配置 安装Anaconda 具体安装过程,请点击本文 配置Pytorch pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torchvision 二.数据集的准备 1.数据集的下载 kaggle网站的数据集下载地址: https://www.kaggle.com/lizhensheng/-2000 2.

  • Python实战之OpenCV实现猫脸检测

    开发工具 Python版本:3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 简单地讲一讲Haar分类器,也就是Viola-Jones识别器. 详细的原理说明可参考相关文件中的两篇论文: Rapid Object Detection using a Boosted Cascade of Simple Features; Robust Real-Time Face Detection. (1

  • Python通过TensorFlow卷积神经网络实现猫狗识别

    这份数据集来源于Kaggle,数据集有12500只猫和12500只狗.在这里简单介绍下整体思路 处理数据 设计神经网络 进行训练测试 1. 数据处理 将图片数据处理为 tf 能够识别的数据格式,并将数据设计批次. 第一步get_files() 方法读取图片,然后根据图片名,添加猫狗 label,然后再将 image和label 放到 数组中,打乱顺序返回 将第一步处理好的图片 和label 数组 转化为 tensorflow 能够识别的格式,然后将图片裁剪和补充进行标准化处理,分批次返回. 新建

  • 基于Python实现一键找出磁盘里所有猫照

    目录 前言 1.准备 2.编写代码 3.批量自动识别 4.完整代码 前言 最近在整理我磁盘上的照片,发现不少猫照,突然觉得若能把这些猫照都挑出来,观察它们的成长轨迹也是一件不错的事情.一张一张的找实在是太费劲了,能不能自动化地找出来呢? 目标检测,是许多计算机视觉应用的重中之重,比如说我们上次的实例分割:Python 20行代码批量自动抠图,人体关键点提取.人脸识别等.而我们这一次,是要识别猫照.由于时间不多,我们没有时间收集训练集,那么有没有已经训练好的目标检测模型呢? 这时候就要搬出padd

  • 使用Python+wxpy 找出微信里把你删除的好友实例

    之前看到好友在发各种"群发"来检验对方是不是把自己删除了,好吧,其实那个没啥用处. 所以决定自己动手做一个 百度了一下,检测是否被删除,总结出大概网上的一些方法 第一种方法: 拉群法 就是拉一定数量的人进群,再审查群里的人是否和拉进群的名单相对,缺失的即已经将你删除(因为删除了你的人你无法拉入群聊),然后再移除这一批好友,再拉进来另一批,这样只要不发信息,也不会对你的好友产生困扰. 但是.... 这个方法是好几年前的了,web微信已经把拉群这个功能去掉了,所以在使用wxpy的add_m

  • 基于Python实现一键获取电脑浏览器的账号密码

    目录 导语 相关文件 开发工具 环境搭建 原理简介 导语 发现很多人在学校图书馆喜欢用电脑占座(以古度今,我好像好多年没去过学校图书馆了),而且出去的时候经常不锁屏,为了让大家养成良好的习惯,我来带大家写个小程序吧,无需输入任何密码就可以快速获取你存储在电脑浏览器中的所有账号和密码,算是通过实践出真知来给大家提个醒了~ 废话不多说,让我们愉快地开始吧~ 相关文件 Github地址 开发工具 Python版本:3.7.8 相关模块: pikachupytools模块: pycryptodome模块

  • python 如何快速找出两个电子表中数据的差异

    最近刚接触python,找点小任务来练练手,希望自己在实践中不断的锻炼自己解决问题的能力. 公司里会有这样的场景:有一张电子表格的内容由两三个部门或者更多的部门用到,这些员工会在维护这些表格中不定期的跟新一些自己部门的数据,时间久了,大家的数据就开始打架了,非常不利于管理.怎样快速找到两个或者多个电子表格中数据的差异呢? 解决办法: 1. Excel自带的方法(有兴趣的自行百度) 2. python 写一个小脚本 #!/usr/bin/env python # -*- coding: utf-8

  • 基于Python制作一键桌面整理工具

    目录 前言 效果展示 开发思路 完整代码 前言 我承认我不是一个爱整理桌面的人,因为我觉得乱糟糟的桌面,反而容易找到文件. 哈哈,可是最近桌面实在是太乱了,自己都看不下去了,几乎占满了整个屏幕.虽然一键整理桌面的软件很多,但是对于其他路径下的文件,我同样需要整理,于是我想到使用Python,完成这个需求. 效果展示 我一共为将文件分为9个大类,分别是图片.视频.音频.文档.压缩文件.常用格式.程序脚本.可执行程序和字体文件. # 不同文件组成的嵌套字典 file_dict = { '图片': [

  • Python pandas.DataFrame 找出有空值的行

    0.摘要 pandas中DataFrame类型中,找出所有有空值的行,可以使用.isnull()方法和.any()方法. 1.找出含有空值的行 方法:DataFrame[DataFrame.isnull().T.any()] 其中,isnull()能够判断数据中元素是否为空值:T为转置:any()判断该行是否有空值. import pandas as pd import numpy as np n = np.arange(20, dtype=float).reshape(5,4) n[2,3]

  • Python找出9个连续的空闲端口

    一.项目需求 安装某软件,配置时候需要填写空闲的端口.查看5个平台的某个端口是否被占用 5个平台为windows, linux, aix, hp, solaris 二.实现方案有两种 1.利用 python 的 socket 模块里的 def isInuse(ipList, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) flag=True for ip in ipList: try: s.connect((ip, int

  • Python一句代码实现找出所有水仙花数的方法

    水仙花数是指一个 3位正整数,它的每个位上的数字的 3 次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153) 下面用一句代码实现找出所有的水仙花数: 方法一: >>> >>> a = list(map(lambda x: x[1], filter(lambda x: x[0], [(i*100+j*10+k == i**3+j**3+k**3, i**3+j**3+k**3) for i in range(1, 10) for j in range(0

  • Python找出列表中出现次数最多的元素三种方式

    通过三种方式给大家介绍,具体详情如下所示: 方式一: 原理:创建一个新的空字典,用循环的方式来获取列表中的每一个元素,判断获取的元素是否存在字典中的key,如果不存在的话,将元素作为key,值为列表中元素的count # 字典方法 words = [ 'my', 'skills', 'are', 'poor', 'I', 'am', 'poor', 'I', 'need', 'skills', 'more', 'my', 'ability', 'are', 'so', 'poor' ] dict

  • Python面试不修改数组找出重复的数字

    目录 数组中重复的数字 不修改数组找出重复的数字 思路 思路一:哈希表 思路二:二分法 测试 总结 数组中重复的数字 在上一篇博客中剑指Offer之面试题3: 数组中重复的数字中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素. 然后我们在博客​用最复杂的方式学会数组(Python实现动态数组)​这篇博客中介绍了数组这一结构的本质,并自己动手实现了一个动态数组. 今天我们介绍一下另一道来自<剑指Offer>的关于数组的面试题——不修改数组找出重复的数字. 不修改数组找出重复的数字

随机推荐