当前位置: 首页 > 后端技术 > Python

Python一键吸猫!把盘里所有的猫照片找出来

时间:2023-03-26 12:23:47 Python

最近整理了盘里的照片,发现了很多猫的照片。我突然觉得,如果我能把这些猫咪的照片都挑出来,观察一下它们的成长轨迹,那该多好啊。一个一个找太费力了,能自动找到吗?目标检测是很多计算机视觉应用的重中之重,比如我们上一个实例分割:Python20行代码批量自动抠图,人体关键点提取,人脸识别等。而这次,我们要识别猫相片。由于我们时间不多,没有时间收集训练集,那么有没有已经训练好的目标检测模型呢?这个时候,我们就要搬出paddlehub了。Puddlehub有一个名为YOLOv3的模型,它基于JosephRedmon和AliFarhadi提出的单级检测器。与达到相同精度的传统物体检测方法相比,检测器的推理速度快了近一倍。YOLOv3将输入图像分成S*S个网格,每个网格预测B个boundingboxes,每个boundingbox预测内容包括:Location(x,y,w,h)、ConfidenceScore和C类的概率,所以我们不仅你能找到一张猫的照片,但你也能找到它!它甚至可以自动计算一张照片中有多少只猫!一、准备为了实现这个实验,Python是必不可少的。如果你还没有安装Python,推荐阅读我们的文章:超级详细的Python安装指南。然后,我们需要安装百度的paddlepaddle。进入他们的官网有详细的说明:https://www.paddlepaddle.org.cn/install/quick根据自己的情况选择这些选项。最后一个CUDA版本,由于这个实验不需要训练数据,也不需要大量的计算,所以直接选择CPU版本就可以了。选择完成后,下方会出现安装指南。不得不说,Paddlepaddle在这些方面还是挺用心的(只是名字不好听)。不过虽然里面写了这么多,但大多数人都是一句话安装,打开CMD(Win+R)或者Terminal(Command+空格搜索)输入如下命令安装:pipinstallpaddlepaddle-ihttps://mirror.baidu.com/pypi/simple也需要安装paddlehub,别忘了:pipinstall-ihttps://mirror.baidu.com/pypi/simplepaddlehub2.写代码,先试试单图识别找猫:新建一个predict.py文件,将猫的照片存放在当前文件夹的imgs文件夹中,命名为c1.jpg。输入以下代码:importpaddlehubashub#loadmodelyolov3=hub.Module(name="yolov3_darknet53_coco2017")#pictureLocationtest_img_path="imgs/c1.jpg"#Inputimageinput_dict={"image":[test_img_path]}#Outputresultresults=yolov3.object_detection(data=input_dict)forresultinresults:print(result['path'])print(result['data'])在终端/CMD中输入如下命令运行文件:**>>pythonpredict.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。根据这个位置,可以给两只猫打上框:写代码把猫框在相应位置:defpaint_rect(input_img:str,output_path:str,labels:list,position:list):"""drawRectangle:paraminput_img:inputimage:paramoutput_path:outputimage:paramlabels:label:parampositions:coordinates"""img=cv2.imread(input_img)forpositioninpositions:print(position)#画一个矩形,分别输入参数图像,左上坐标,右下坐标,颜色数组,厚度cv2.rectangle(img,(position['left'],position['top']),(position['right'],position['bottom']),(0,255,0),thickness=10)if'cat'inlabels:#如果是猫,将它保存到另一个地方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.批量自动识别这样,我们有ideas自动识别后,首先获取所有图片res文件夹中,其次将这些图片放入分类器中进行分类,最后根据分类标签将其提取并移动到其他地方。获取该文件夹下的所有图片:defget_all_path(dirpath,*suffix):"""获取所有路径@paramdirpath:directory@param*suffix:suffix"""path_array=[]forr,ds,fsinos.walk(dirpath):forfninfs:ifos.path.splitext(fn)[1]insuffix:fname=os.path.join(r,fn)path_array.append(fname)returnpath_array#获取所有jpg和pngimageimage_paths=get_all_path(source_path,'.jpg','.JPG','png','PNG')**放入分类器中进行分类:**#loadmodelyolov3=hub.Module(name="yolov3_darknet53_coco2017")#Inputimageinput_dict={"image":image_paths}#Outputresultresults=yolov3.object_detection(data=input_dict,labels=['cat'])**根据标签绘制移动:**defpaint_rect(input_img:str,output_path:str,labels:list,position:list):"""画一个矩形:paraminput_img:输入图像:paramoutput_path:输出图像:paramlabels:label:parampositions:coordinates"""img=cv2.imread(input_img)forpositioninpositions:#画一个矩形框,输入参数为图像,左上角坐标,右下角坐标标记、颜色数组、厚度cv2.rectangle(img,(position['left'],position['top']),(position['right'],position['bottom']),(0,255,0),thickness=10)if'cat'inlabels:#如果是猫,将它保存到另一个地方shutil.move(input_img,output_path+os.sep+input_img.split('/')[-1])简历2。imwrite(output_path+os.sep+'rect_%s'%input_img.split('/')[-1],img)results=yolov3.object_detection(data=input_dict,labels=['cat'])结果为结果:path=result['path']labels=[]positions=[]fortargetinresult['data']:labels.append(target.get('label',''))positions.append({'左':target.get('left',-1),'top':target.get('top',-1),'右':target.get('right',-1),'bottom':target.get('bottom',-1)})paint_rect(path,target_path,labels,positions)完整代码如下,希望大家能成功提取自己的“猫片”:importpaddlehubashubimportcv2importosimport关闭ildefget_all_path(dirpath,*suffix):"""获取所有路径@paramdirpath:directory@param*suffix:suffix"""path_array=[]forr,ds,fsinos.walk(dirpath):forfninfs:如果后缀为os.path.splitext(fn)[1]:fname=os.path.join(r,fn)path_array.append(fname)returnpath_arraydefpaint_rect(input_img:str,output_path:str,labels:list,position:list):"""画一个矩形:paraminput_img:inputimage:paramoutput_path:outputimage:paramlabels:label:parampositions:coordinates"""img=cv2.imread(input_img)forpositioninpositions:#绘制矩形框,输入参数为图像、左上坐标、右下坐标、颜色数组、粗细cv2.rectangle(img,(position['left'],position['top']),(position['right'],position['bottom']),(0,255,0),thickness=10)if'cat'inlabels:#如果是猫,就把它存到别的地方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'])forresultinresults:path=result['path']labels=[]positions=[]fortargetinresult['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实战教程,尽在Python实战宝典欢迎关注公众号:Python实战宝典原文来自Python实战宝典:Python一键猫猫!查找磁盘中所有的猫照片