将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() #以列表返回字典中的所有值