找回密码
 会员注册
查看: 21|回复: 0

YOLOv8测试3:在Python中将YOLOv8模型封装成API接口使用(上传测试图片并返回识别结果,附测试代码)

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
67462
发表于 2024-9-10 15:03:48 | 显示全部楼层 |阅读模式
一、概述记录时间[2024-4-4]本文讲述的是在Windows系统(Python+PyTorch+Conda+cpu)中YOLOv8模型的简单应用。这里附带上YOLOv8官方文档,里面记载了详细的使用方法,如果觉得看文档比较麻烦的话,可以直接看文章,需要用到的部分已经在文章中进行了摘录。经过了前几次的尝试,我们不仅能使用CLI的方式运行yolov8n.pt模型,对图像和视频进行目标识别,并得到结果。参考文章:YOLOv8模型的简单测试,Windows环境下安装部署(Python+PyTorch+Conda+cpu+CLI)也可以在PyCharm集成开发环境中编写简单的python文件,以python的方式对YOLOv8模型进行简单的测试。参考文章:YOLOv8模型的简单测试2,PyCharm集成开发环境安装使用(Windows+Python+PyTorch+Conda+cpu)同时也了解了在Python中使用Flask封装网络接口的方法,能实现文件的上传。参考文章:API接口简单使用(二):Python中使用Flask(接口封装整理版,含文件上传接口的详细实现)接下来,本文将介绍在Python中将YOLOv8模型封装成API接口使用的方法,然后通过调用封装好的API接口,我们可以上传自定义的测试图片,并返回识别结果。识别结果有两种:一种是完成识别后的图片;另一种是识别目标的类型,以及它们在图片中的坐标、大小,以文本形式返回。二、思路整理想要实现在Python中将YOLOv8模型封装成API接口使用,首先整理下思路:(服务端)使用Flask框架编写一个简单的测试实例,可以实现文件上传(客户端)通过API接口,以文件形式上传自定义的测试图片(服务端)获取图片名称和类型,然后保存到指定路径(服务端)下载并使用YOLOv8模型进行图片预测/识别(服务端)保存图片目标识别的结果(服务端)返回目标识别的结果(客户端)得到服务端返回的识别结果三、过程实现此处主要讲述这个案例的实现过程,想要直接上手的朋友可以在文章下半部分获取详细完整版的测试代码哦。1.编写测试实例(服务端)使用Flask框架编写一个简单的测试实例,可以实现文件上传简单了解简单的测试实例如下:fromflaskimportFlask,requestapp=Flask(__name__)@app.route('/...')defhanshu():#这里是写接口函数的地方if__name__=='__main__':app.run()12345678910文件上传功能的网络接口参考这个:(简单看一下即可)@app.post('/upload')defupload():#文件作为参数传递,其id为file#如果没有接收到这个请求,返回Nofilepartif'file'notinrequest.files:return"Nofilepart"#获取上传的文件file=request.files['file']#获取文件名iffile.filename=='':return"Noselectedfile"#file_format获取文件类型,并返回iffile:filename=file.filenamefile_format=filename.rsplit('.',1)[1]return"Fileformatis:"+file_format.upper()1234567891011121314151617181920创建测试文件然后,开始动手操作。使用PyCharm打开我们之前从仓库下载的YOLOv8项目ultralytics-main,找到tests目录,在该目录下新建image_test.py文件。导入依赖导入YOLOv8项目运行所需的依赖和配置:#UltralyticsYOLO🚀,AGPL-3.0licenseimportcontextlibfromcopyimportcopyfrompathlibimportPathimportcv2importnumpyasnpimportpytestimporttorchimportyamlfromPILimportImagefromtorchvision.transformsimportToTensorfromultralyticsimportRTDETR,YOLOfromultralytics.cfgimportTASK2DATAfromultralytics.data.buildimportload_inference_sourcefromultralytics.utilsimport(ASSETS,DEFAULT_CFG,DEFAULT_CFG_PATH,LINUX,MACOS,ONLINE,ROOT,WEIGHTS_DIR,WINDOWS,Retry,checks,is_dir_writeable,)fromultralytics.utils.downloadsimportdownloadfromultralytics.utils.torch_utilsimportTORCH_1_9,TORCH_1_13MODEL=WEIGHTS_DIR/"pathwithspaces"/"yolov8n.pt"#testspacesinpathCFG="yolov8n.yaml"SOURCE=ASSETS/"bus.jpg"TMP=(ROOT/"../tests/tmp").resolve()#tempdirectoryfortestfilesIS_TMP_WRITEABLE=is_dir_writeable(TMP)123456789101112131415161718192021222324252627282930313233343536373839导入Flask框架使用所需依赖:(如果Flask依赖报错,说明没有导入成功,重新导入一下即可。)fromflaskimportFlask,request,send_file1编写文件上传接口app=Flask(__name__)@app.post('/image')defreturn_image():return"Succeed"if__name__=='__main__':app.run(host='0.0.0.0',port=5001)123456789大家可以自行测试下这个接口可不可用,后面我们在return_image()函数中编写内容。创建上传目录在ultralytics-main/tests/tmp/目录下新建upload文件夹,用来存放我们上传的文件。2.上传测试图片(客户端)通过API接口,以文件形式上传自定义的测试图片这里简单写一个HTML文件用于测试即可: 123456789101112131415161718192021223.获取图片信息并保存(服务端)获取图片名称和类型,然后保存到指定路径在return_image()函数中编写内容:#1.获取上传的图片资源#文件作为参数传递,其id为file#如果没有接收到这个请求,返回Nofilepartif'file'notinrequest.files:return"Nofilepart"#获取图片文件file=request.files['file']#获取文件名iffile.filename=='':return"Noselectedfile"filename=file.filename#2.保存到指定位置file.save(TMP/'upload'/filename)1234567891011121314151617184.进行图片预测(服务端)下载并使用YOLOv8模型进行图片预测/识别在return_image()函数中编写内容:#3.使用YOLOv8模型对该图片进行预测model=YOLO(MODEL)#Definepathtotheimagefilesource=TMP/'upload'/filename#具体要在predict中添加一些参数model.predict(source)123456785.保存图片目标识别的结果(服务端)保存图片目标识别的结果图片结果我们要保存识别后的图片结果,主要使用的参数是save,我们设置save=True即可。#4.保存结果results=model.predict(source,save=True,imgsz=320,conf=0.5)12文本结果如果要保存识别目标的类型,以及它们在图片中的坐标、大小,以文本形式返回则使用参数save_txt,设置为True:results=model.predict(source,save_txt=True)1结果会以txt文件的形式保存在tests\tmp\runs\detect\predict[i]\labels目录下。6.返回目标识别的结果(服务端)返回目标识别的结果图片结果send_file(image_path)是直接将返回的结果在浏览器中进行预览,如果想要下载图片,就添加as_attachment=True参数。#获取文件保存的路径save_path=Path(results[0].save_dir)image_path=save_path/filename#5.返回结果returnsend_file(image_path)#下载版returnsend_file(image_path,as_attachment=True)12345678文本结果想要获取识别目标的类型,以及它们在图片中的坐标、大小的信息,我们需要读取tests\tmp\runs\detect\predict[i]\labels目录中的txt文件#获取文件保存的路径save_path=Path(results[0].save_dir)#获取label标签文件forrinresults:im_name=Path(r.path).stemlabels=save_path/f"labels/{im_name}.txt"#读取标签文件中的内容txt_file=labelswithopen(txt_file,'r')asfile:content=file.read()#返回结果returncontent1234567891011121314157.得到返回结果(客户端)得到服务端返回的识别结果图片结果我们可以用上面写的HTML文件来进行测试,双击运行,选择文件,然后上传即可。这里为了呈现结果更加直观,所以使用了Postman来测试,如图所示。注意:测试图片素材来源于网络,仅用于测试演示。文本结果如图所示,返回识别目标的类型,以及它们在图片中的坐标、大小等信息。下面对YOLOv8标签文件label中的内容进行解释:如图,在项目中打开一个模型训练文件进行查看以第一行标签为例,首个数字5代表的是names中的第五类,即bus后面的四个参数分别是bus在图片中的纵横坐标,以及它的长宽通过这些参数,我们就可以确定识别目标的类型,以及它在图片中的位置啦四、详细完整版测试代码1.得到图片目标版本image_test.py#UltralyticsYOLO🚀,AGPL-3.0licenseimportcontextlibfromcopyimportcopyfrompathlibimportPathimportcv2importnumpyasnpimportpytestimporttorchimportyamlfromPILimportImagefromtorchvision.transformsimportToTensorfromultralyticsimportRTDETR,YOLOfromultralytics.cfgimportTASK2DATAfromultralytics.data.buildimportload_inference_sourcefromultralytics.utilsimport(ASSETS,DEFAULT_CFG,DEFAULT_CFG_PATH,LINUX,MACOS,ONLINE,ROOT,WEIGHTS_DIR,WINDOWS,Retry,checks,is_dir_writeable,)fromultralytics.utils.downloadsimportdownloadfromultralytics.utils.torch_utilsimportTORCH_1_9,TORCH_1_13fromflaskimportFlask,request,send_fileMODEL=WEIGHTS_DIR/"pathwithspaces"/"yolov8n.pt"#testspacesinpathCFG="yolov8n.yaml"SOURCE=ASSETS/"bus.jpg"TMP=(ROOT/"../tests/tmp").resolve()#tempdirectoryfortestfilesIS_TMP_WRITEABLE=is_dir_writeable(TMP)app=Flask(__name__)@app.post('/image')defreturn_image():#1.获取上传的图片资源#文件作为参数传递,其id为file#如果没有接收到这个请求,返回Nofilepartif'file'notinrequest.files:return"Nofilepart"#获取图片文件file=request.files['file']#获取文件名iffile.filename=='':return"Noselectedfile"filename=file.filename#2.保存到指定位置file.save(TMP/'upload'/filename)#3.使用YOLOv8模型对该图片进行预测model=YOLO(MODEL)#Definepathtotheimagefilesource=TMP/'upload'/filename#4.保存结果results=model.predict(source,save=True,imgsz=320,conf=0.5)#获取文件保存的路径save_path=Path(results[0].save_dir)image_path=save_path/filename#5.返回结果returnsend_file(image_path)if__name__=='__main__':app.run(host='0.0.0.0',port=5001)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182832.得到文本参数版本text_test.py#UltralyticsYOLO🚀,AGPL-3.0licenseimportcontextlibfromcopyimportcopyfrompathlibimportPathimportcv2importnumpyasnpimportpytestimporttorchimportyamlfromPILimportImagefromtorchvision.transformsimportToTensorfromultralyticsimportRTDETR,YOLOfromultralytics.cfgimportTASK2DATAfromultralytics.data.buildimportload_inference_sourcefromultralytics.utilsimport(ASSETS,DEFAULT_CFG,DEFAULT_CFG_PATH,LINUX,MACOS,ONLINE,ROOT,WEIGHTS_DIR,WINDOWS,Retry,checks,is_dir_writeable,)fromultralytics.utils.downloadsimportdownloadfromultralytics.utils.torch_utilsimportTORCH_1_9,TORCH_1_13fromflaskimportFlask,request,send_fileMODEL=WEIGHTS_DIR/"pathwithspaces"/"yolov8n.pt"#testspacesinpathCFG="yolov8n.yaml"SOURCE=ASSETS/"bus.jpg"TMP=(ROOT/"../tests/tmp").resolve()#tempdirectoryfortestfilesIS_TMP_WRITEABLE=is_dir_writeable(TMP)app=Flask(__name__)@app.post('/text')defreturn_text():#1.获取上传的图片资源#文件作为参数传递,其id为file#如果没有接收到这个请求,返回Nofilepartif'file'notinrequest.files:return"Nofilepart"#获取图片文件file=request.files['file']#获取文件名iffile.filename=='':return"Noselectedfile"filename=file.filename#2.保存到指定位置file.save(TMP/'upload'/filename)#3.使用YOLOv8模型对该图片进行预测model=YOLO(MODEL)#Definepathtotheimagefilesource=TMP/'upload'/filename#4.保存结果results=model.predict(source,save_txt=True)#获取文件保存的路径save_path=Path(results[0].save_dir)#获取label标签文件forrinresults:im_name=Path(r.path).stemlabels=save_path/f"labels/{im_name}.txt"#读取标签文件中的内容txt_file=labelswithopen(txt_file,'r')asfile:content=file.read()#5.返回结果returncontentif__name__=='__main__':app.run(host='0.0.0.0',port=5001)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192五、总结本文在Python中将YOLOv8模型封装成API接口进行使用,通过调用封装好的API接口来实现自定义测试图片的上传,并返回识别结果。识别结果有两种:一种是完成识别后的图片;另一种是识别目标的类型,以及它们在图片中的坐标、大小,以文本形式返回。一些参考资料YOLOv8官方文档:https://docs.ultralytics.com/zh/YOLOv8模型仓库地址:https://github.com/ultralytics/ultralyticsPyCharm官网:https://www.jetbrains.com/pycharm/download/?section=windows
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-3 02:25 , Processed in 0.451563 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表