洞察:YOLOv8 图片识别教程:获取识别信息与源码分享 - 幽络源
背景有个项目要求:使用yolov8训练出的模型将图片进行识别后,需要识别后的信息,信息中包括耗时(毫秒)、类别、类别对应的方框坐标,本篇教程便是完成此功能。
前提
有自己的yolov8环境且有训练好的模型
直接上源码
注意:这里提供了两个函数,一个是只信息不识别后的图片,一个是即信息又图片
importbase64
importos
importshutil
importtime
importuuid
'''
输入:图picId,图片路径picPath,识别模型identifyYolo
输出:
{
"picId":"图id",
"wastedTime":耗时(毫秒),
"results":[
{
"cls":"类别",
"location":"方框坐标"
}
]
}
'''
defPicPathToInfo(picId,picPath,identifyYolo):
#进行识别并记录耗时(毫秒)
startTime=timetime()
results=identifyYolo(source=picPath,save=False)#不需要保存识别后的图片,因此将save设置False
endTime=timetime()
wastedTime=int((endTime-startTime)*1000)
#获取类别称列表
class_names=identifyYolonames
#因为只处理一张图,所以取第0个结果就行了
result=results
#获取所有检测结果
detections=resultboxes
#构造结果
resDict={"picId":picId,"wastedTime":wastedTime,"results":}
#遍历检测结果
fordetectionindetections:
cls_id=int(detectioncls)#类别ID
cls_name=class_names#类别称
location=detectionxyxytolist()#获取边界框坐标
obj={
"cls":cls_name,
"location":location
}
resDict["results"]脚本end(obj)
returnresDict
'''
输入:图片二进制文件流picBytes,识别模型identifyYolo
输出:
{
"wastedTime":耗时(毫秒),
"identifiedPicBytesBase64":识别后的图片二进制文件流的Base54编码
"results":[
{
"cls":"类别",
"location":"方框坐标"
}
]
}
'''
defPicBytesToIdentifiedPicBytes(picBytes,identifyYolo):
#创建原图临时目录以保存图片(如果不存在),后续删掉里面的图片
tempOriginDir="originTemp"
ifnotospathexists(tempOriginDir):
osmakedirs(tempOriginDir)
uuidName=str(uuiduuid4())+'jpg'#将图片保存为jpg格式
#将二进制数据写入临时目录
withopen(ospathjoin(tempOriginDir,uuidName),'wb')asf:
fwrite(picBytes)
#进行识别并记录耗时(毫秒)
startTime=timetime()
results=identifyYolo(source=ospathjoin(tempOriginDir,uuidName),save=True)
endTime=timetime()
wastedTime=int((endTime-startTime)*1000)
#删掉原图,防止占用空间
osremove(ospathjoin(tempOriginDir,uuidName))
#获取类别称列表
class_names=identifyYolonames
#因为只处理一张图,所以取第0个结果就行了
result=results
#获取识别后的图片
identifyPicPath=ospathjoin(resultsave_dir,uuidName)
#将其读取为二进制文件流
withopen(identifyPicPath,'rb')aspicFile:
identifiedPicBytes=picFileread()
#将识别后的图片的所在目录删掉,防止占用空间
shutilrmtree(resultsave_dir)
#将文件流转为Base64编码用于传入json
identifiedPicBytesBase64=base64b64encode(identifiedPicBytes)decode('utf-8')
#获取所有检测结果
detections=resultboxes
#构造结果
resDict={"identifiedPicBytesBase64":identifiedPicBytesBase64,"wastedTime":wastedTime,"results":}
#遍历检测结果
fordetectionindetections:
cls_id=int(detectioncls)#类别ID
cls_name=class_names#类别称
location=detectionxyxytolist()#获取边界框坐标
obj={
"cls":cls_name,
"location":location
}
resDict["results"]脚本end(obj)
returnresDict
使用方法
PicPathToInfo的使用
1在yolv8源码根目录新建IdentifyUtilpy,将上面的源码粘贴进去,如图
2新建testpy,然后这里我训练好的模型为Mergedpt,因此需先加载Mergedpt获取yolo对象,如图
fromultralyticsimportYOLO
#混合缺陷识别模型
mergedYolo=YOLO(model=r"D:\A01PythonProjects3123\ultralytics-main\Mergedpt",task="detect")
3调用函数进行识别并获取信息
PicPathToInfo参数解释:
picId:这个原本是用于后端项目上的,不需要的可以随便传,也可以自行删掉
picUrl:可以是本地路径,也可以是链接的图片
identtifyYolo:加载了模型的yolo对象
如图,我这里因为是本地测试,随便传了个id和本地的图片,比较终的结果为json数据,非常方便
PicBytesToIdentifiedPicBytes的使用
1同样的,需要先加载自己的模型获取yolo对象,和上面第2步一样
2需注意的是,这个方法要求我们传入图片的二进制文件流,那就找一张本地的图片,先获取它的二进制文件流,代码与图如下:
fromultralyticsimportYOLO
fromIdentifyUtilimport*
#混合缺陷识别模型
mergedYolo=YOLO(model=r"D:\A01PythonProjects3123\ultralytics-main\Mergedpt",task="detect")
#读取图片为二进制文件流
picPath=r"D:\测试图jpg"
withopen(picPath,'rb')asf:
picBytes=fread()
#调用函数识别图片获取识别信息
mergedResult=PicBytesToIdentifiedPicBytes(picBytes,mergedYolo)
print(mergedResult)
3执行后可以看到的json结果中包括了如下个
wastedTime:耗时(毫秒)
results:包括了识别出的类别和类别对应的方框坐标
identifiedPicBytesBase64:这个是图片的二进制文件流的Base64编码,我们可以通过这个数据来获取到识别后的图片
4将的Base64码写为图片,代码与图如下:
#将Base64码写为图片
image_data=base64b64decode(mergedResult["identifiedPicBytesBase64"])
image_bytes=ioBytesIO(image_data)
image=Imageopen(image_bytes)
#保存图片到目录
savePath="savePath"
ifnotospathexists(savePath):
osmkdir(savePath)
output_path=savePath+"识别后的图jpg"
imagesave(output_path)
你可能的疑问
你或许会问:对于PicBytesToIdentifiedPicBytes函数为什么要传入流再识别后的图片的Base64编码yolov8本身就可以在本地生成识别后的图片啊
我想说的是这两个方法主要是用于远程调用的,比如我在一台服务器部署了识别服务,我需要在本地用去调用这个服务,那么此时就需要通过传文件流和图片Base64编码来进行图片的传输了
因此我们可以初步得出结论,源码网有助于行业市场需要,有助于社会发展需要。提供经过严格测试的免费源码、各种线上兼职和网络兼职的网创教程、编程及网络相关的技术教程分享,助您轻松获取资源和技术支持。https://www.youluoyuan.com/https://www.youluoyuan.com/wp-content/uploads/2024/10/ylyapp.png
页:
[1]