yov5检测结果裁剪并保存2021/1/22

将yolov5每张图片检测出的物体根据矩形框进行裁剪并保存

                k=-1
                for *xyxy, conf, cls in reversed(det):
                    aa = int(xyxy[1])
                    bb = int(xyxy[3])
                    cc = int(xyxy[0])
                    dd = int(xyxy[2])
                    #裁剪crop = im0[y1:y2, x1:x2]
                    crop = im0[aa:bb, cc:dd]
                    if k < len(det):
                        k = k + 1
                       #保存的路径以及 图片名Path(p).name_1_jpg,Path(p).name_2.jpg等
                    cv2.imwrite("E:\object_detection\yolo v5\yolov5-6class\crop/" + Path(p).name.split(".")[
                        0] + "_{0}.jpg".format(k), crop)

在这里插入图片描述

循环遍历文件夹下的图片,加灰条resize图片大小,并保存resize后图片。

这部分代码是用来加灰条的,iw和ih是原图的行列数,w和h是需要生成的图像的行列数,scale得到的是新图与原图的宽高比,简单想一下,宽高比越小的,变化的范围就越大,那么反之,就要给另外一边补灰条。所以先得到scale这个较小的宽高比,然后对图片进行缩放,new_image是一张灰色的新图,然后将缩放好的图像粘贴到灰色图像上,覆盖掉一部分,那么剩下的部分就是灰条了。

#加灰条
def letterbox_image(image, size):
    # 对图片进行resize,使图片不失真。在空缺的地方进行padding
    iw, ih = image.size
    w, h = size
    scale = min(w / iw, h / ih)
    nw = int(iw * scale)
    nh = int(ih * scale)

    image = image.resize((nw, nh), Image.BICUBIC)
    new_image = Image.new('RGB', size, (128, 128, 128))
    new_image.paste(image, ((w - nw) // 2, (h - nh) // 2))
    return new_image

#遍历directory_name放图片的文件夹

    for filename in os.listdir(directory_name):
        image = Image.open(directory_name + "/" + filename)
        image = letterbox_image(image, [224, 224])
        #下面这句话很重要,如果不加会报错,具体下面解释
        image_data = np.asarray(image)
        cv2.imwrite("E:\\fenlei\efficientnet-pytorch-master\inference1/" + filename,image_data)


######################################################出错:
Error: img is not a numpy array, neither a scalar
原来image = letterbox_image(image, [224, 224])获得的image是
<class 'PIL.JpegImagePlugin.JpegImageFile'>
无法直接写,需要转为数据,如下:
 image_data = np.asarray(image)

分割提取文件前缀名,比如0004_1.jpg,结果为0004.jpg

 filename = filename.rsplit('_')[0]+'.jpg'
#将图像名称与类别组成字典
 arr = {f'{filename}': f'{h}'}
 #接着上面循环遍历每个图片并添加
 dict.append(arr)

字典根据键key去找值value

dict={'aa': 0, 'bb': 1, 'cc': 2, 'dd': 3, 'ee': 4, 'ff': 5, 'gg': 6}

pring(dict['aa'])
>>>0

字典根据值value去找键key

{'aa': 0, 'bb': 1, 'cc': 2, 'dd': 3, 'ee': 4, 'ff': 5, 'gg': 6, 'hh': 7, 'ii': 8, 'jj': 9, 'kk': 10, 'll': 11, 'mm': 12, 'nn': 13, 'oo': 14, 'pp': 15, 'qq': 16}
#idx=3
  h = list(c.keys())[list(c.values()).index(idx)]
>>>dd

for合并列表中key相同的value值

 #合并列表中key相同的value值
[{'00004.jpg': 'ee'}, {'00004.jpg': 'ee'}, {'00081.jpg': 'dd'}, {'401.jpg': 'ff'}, {'404.jpg': 'gg'}, {'404.jpg': 'hh'}, {'584.jpg': 'kk'}, {'584.jpg': 'hh'}, {'584.jpg': 'jj'}, {'985.jpg': 'mm'}, {'985.jpg': 'pp'}]

    for _ in dict:
        for k, v in _.items():
            dic.setdefault(k, []).append(v)

    merge=[{k: v}for k, v in dic.items()]
[{'00004.jpg': ['ee', 'ee']}, {'00081.jpg': ['dd']}, {'401.jpg': ['ff']}, {'404.jpg': ['gg', 'hh']}, {'584.jpg': ['kk', 'hh', 'jj']}, {'985.jpg': ['mm', 'pp']}]

for读取合并字典的键值key value

#读取合并字典的键值
 for _ in merge:
        for key,value in _.items():
            print(f'图片{key}检测结果有:{value}')

#将类别名画在图像上
draw = ImageDraw.Draw(image)
font = ImageFont.truetype("C:\Windows\Fonts\Arial.ttf", 24)
draw.text((120,10),"class:{}".format(h), (255, 0, 0),font=font)  # 写文字,参数为文字添加位置,添加的文字字符串,文字颜色,格式
image.save("results/det_results{}".format(filename))


在这里插入图片描述
Python字典包含了以下内置方法:

dict.clear()    #删除字典内所有元素
dict.copy()    #返回一个字典的浅复制
dict.fromkeys()    #创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
dict.get(key, default=None)    #返回指定键的值,如果值不在字典中返回default值
dict.has_key(key)    #如果键在字典dict里返回true,否则返回false
sdict.items()    #以列表返回可遍历的(键, 值) 元组数组
sdict.keys()    #以列表返回一个字典所有的键
dict.setdefault(key, default=None)    #和get()类似, 但如果键不已经存在于字典中,将会添加键并将值设为default
dict.update(dict2)    #把字典dict2的键/值对更新到dict里
dict.values()    #以列表返回字典中的所有值
  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
YOLOv3是一种基于深度学习的目标检测算法,它可以在图像中同时检测多个目标,并给出它们的位置和类别。YOv3的网络结构相对较简单但在速度和准确性方面表现出色。 如果你想使用YOv3进行目标检测保存检测结果的图片,可以使用Python编程语言和相应的库来实现。以下是一个简单的示例代码: ```python import cv2 import numpy as np # 加载YOLOv3模型 net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg") # 加载类别标签 classes = [] with open("coco.names", "r") as f: classes = [line.strip() for line in f.readlines()] # 加载图像 image = cv2.imread("image.jpg") # 获取图像尺寸 height, width, _ = image.shape # 构建输入图像的blob blob = cv2.dnn.blobFromImage(image, 1/255.0, (416, 416), swapRB=True, crop=False) # 设置网络的输入 net.setInput(blob) # 前向传播获取输出层 layer_names = net.getLayerNames() output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()] outs = net.forward(output_layers) # 解析输出层的结果 class_ids = [] confidences = [] boxes = [] for out in outs: for detection in out: scores = detection[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5: center_x = int(detection[0] * width) center_y = int(detection[1] * height) w = int(detection[2] * width) h = int(detection[3] * height) x = int(center_x - w / 2) y = int(center_y - h / 2) class_ids.append(class_id) confidences.append(float(confidence)) boxes.append([x, y, w, h]) # 应用非最大值抑制获取最终的检测结果 indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4) for i in indices: i = i[0] x, y, w, h = boxes[i] label = classes[class_ids[i]] confidence = confidences[i] color = (255, 0, 0) cv2.rectangle(image, (x, y), (x + w, y + h), color, 2) cv2.putText(image, f"{label}: {confidence:.2f}", (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) # 保存检测结果的图片 cv2.imwrite("result.jpg", image) ``` 上述代码中,首先加载YOLOv3模型和类别标签。然后,读取待检测的图像,并将其转换为网络所需的输入格式。接下来,通过前向传播获取输出层的结果,并解析得到目标的位置、类别和置信度。最后,应用非最大值抑制算法获取最终的检测结果,并将结果绘制在图像上,最终保存为一张新的图片。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

噢耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值