基于Python实现一键找出磁盘里所有猫照
作者:Ckend 发布时间:2022-06-20 03:52:32
前言
最近在整理我磁盘上的照片,发现不少猫照,突然觉得若能把这些猫照都挑出来,观察它们的成长轨迹也是一件不错的事情。一张一张的找实在是太费劲了,能不能自动化地找出来呢?
目标检测,是许多计算机视觉应用的重中之重,比如说我们上次的实例分割: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)
来源:https://mp.weixin.qq.com/s/w21rAC3b9oomnfkyioaDnA


猜你喜欢
- 安装python之后,我们往往面临这样一个问题,在命令行输入“python”,竟然出错,难道是没有安装成功吗?非也,其实是你的系统环境变量没
- 一、排序排序查询语法:select * from 表名 order by 列1 asc/desc [,列2 asc/desc,..
- 核心提示:本文针对mysql-noinstall版本,也就是解压缩版的安装配置应用做了个总结,这些操作都是平时很常用的操作。文章中不对mys
- 网络上有很多个性化的404页面,但是404页面不仅仅是个性化展示,404页面本来目的是:告诉浏览者其所请求的页面不存在或链接错误,同时引导用
- 这篇文章主要介绍了基于Python获取城市近7天天气预报,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 背景:由于最近公司项目好像有点受不住并发压力了,优化迫在眉睫。由于当前系统是单数据库系统原因,能优化的地方也尽力优化了但是数据库瓶颈还是严重
- Web应用的发展,使得客户端存储使用得也越来越多,而实现客户端存储的方式则是多种多样。最简单而且兼容性最佳的方案是Cookie,但是作为真正
- 废话不多说了,先给大家展示下效果图:这是iOS下的效果,android下完全一致。通过do_GestureView组件和do_Animati
- 本文实例讲述了CodeIgniter分页类pagination使用方法。分享给大家供大家参考,具体如下:controller控制器(appl
- 本文实例为大家分享了Python实现简单层次聚类算法,以及可视化,供大家参考,具体内容如下基本的算法思路就是:把当前组间距离最小的两组合并成
- 模板图片如下:需识别的图片如下:一、模板预处理1.将模板设置为二值图2.检测模板的轮廓3.对模板轮廓排序,并将数字和轮廓一一对应,以字典存储
- 实现效果:方法一:1 print "+"+"-"*8+"+"+"-&q
- 在经过前面几个部分的操作之后,我们的网页已经图文并茂,具有相当的效果了,但是这对于网页来说还不够,为了网站中的众多网页能够成为一个有机的整体
- 如题,今天兜兜转转找了很多网站帖子,一个个环节击破,最后装好费了不少时间。希望这个帖子能帮助有需要的人,教你一篇帖子搞定python+num
- 一、项目工程目录:二、具体工程文件代码:1、新建一个包名:common(用于存放基本函数封装)(1)在common包下新建一个base.py
- A朋友:你直接问。B朋友:你女朋友睡了后,偷偷拿电脑查。C朋友:咱们不吊死在一棵树上,不对劲就早点脱身。D朋友:我觉得A的不行,直接问容易打
- 如下所示:' '.join(line.split())例如:'line dd',运行line.split()
- 在多数的现代语音识别系统中,人们都会用到频域特征。梅尔频率倒谱系数(MFCC),首先计算信号的功率谱,然后用滤波器和离散余弦变换的变换来提取
- MYSQLdump参数详解mysqldump备份:mysqldump -u用户名 -p密码 -h主机 数据库 a -w “sql条件” –l
- 一、yield迭代器在python深度学习模型读取数据时,经常遇到yield,互联网搜索后,将比较容易理解的说明记录一下。二、使用步骤1.引