《記錄自己在使用yolov5遇到的一些問題》同時也供大家參考,如果對你們有幫助,希望大家可以給個點贊、收藏鼓勵下,非常感謝!
以自帶的一張圖片作為示例,yolov5(6.1版本)的初始檢測框應該是如下圖所示
修改線條粗細、隱藏標簽、隱藏置信度
?首先有一些參數作者已經放在detect.py的parse_opt()里,如下代碼所示:
parser.add_argument('--line-thickness', default=3, type=int, help='bounding box thickness (pixels)')
parser.add_argument('--hide-labels', default=False, action='store_true', help='hide labels')
parser.add_argument('--hide-conf', default=False, action='store_true', help='hide confidences')
顧名思義,“--line-thickness” 是修改矩形框和文本標簽線條的粗細的,如果你覺得標簽小了可以直接調整這里的數值(本人之前在這里踩了大坑,還去plot.py里修改一些參數,后面會說到,雖然大了但是會出現失真,標簽會變得模糊。)
?"--hide-labels"(隱藏標簽)和"--hide-conf"(隱藏置信度)就比較直觀了,直接上圖:
?想要修改其他信息就要打開utils文件夾里的plots.py文件了。打開文件后搜索(ctrl+f)box_label()這個函數,大概在82行左右。
def box_label(self, box, label='', color=(128, 128, 128), txt_color=(255, 255, 255)):# Add one xyxy box to image with labelif self.pil or not is_ascii(label):self.draw.rectangle(box, width=self.lw, outline=color) # boxif label:w, h = self.font.getsize(label) # text width, heightoutside = box[1] - h >= 0 # label fits outside boxself.draw.rectangle((box[0],box[1] - h if outside else box[1],box[0] + w + 1,box[1] + 1 if outside else box[1] + h + 1), fill=color)# self.draw.text((box[0], box[1]), label, fill=txt_color, font=self.font, anchor='ls') # for PIL>8.0self.draw.text((box[0], box[1] - h if outside else box[1]), label, fill=txt_color, font=self.font)else: # cv2p1, p2 = (int(box[0]), int(box[1])), (int(box[2]), int(box[3]))cv2.rectangle(self.im, p1, p2, color, thickness=self.lw, lineType=cv2.LINE_AA)if label:tf = max(self.lw - 1, 1) # font thicknessw, h = cv2.getTextSize(label, 0, fontScale=self.lw / 3, thickness=tf)[0] # text width, heightoutside = p1[1] - h - 3 >= 0 # label fits outside boxp2 = p1[0] + w, p1[1] - h - 3 if outside else p1[1] + h + 3cv2.rectangle(self.im, p1, p2, color, -1, cv2.LINE_AA) # filledcv2.putText(self.im, label, (p1[0], p1[1] - 2 if outside else p1[1] + h + 2), 0, self.lw / 3, txt_color,thickness=tf, lineType=cv2.LINE_AA)
如果想隱藏檢測框只需要注釋下面這行代碼即可,如果要修改檢測框的大小等參數,對應修改就行,效果如下圖:
cv2.rectangle(self.im, p1, p2, color, thickness=self.lw, lineType=cv2.LINE_AA)
#self.img 圖片
#p1 所畫檢測框的左上角坐標
#p2 所畫檢測框的右下角坐標
#thick 線的粗細
#linetype 線型
如果想隱藏標簽框只需要注釋掉下面這行代碼即可,同樣如果要修改標簽框的大小等參數,對應修改就行效果如下圖:
cv2.rectangle(self.im, p1, p2, color, -1, cv2.LINE_AA) # filled
#self.img 圖片
#p1 所畫框的左上角坐標
#p2 所畫框的右下角坐標
#color 框的顏色,可以以自己修改(b,g,r)
#-1 框的粗細 如果為負值則代表填充整個框
#cv2.LINE_AA 線型
修改標簽文本信息,可以配合上面兩行代碼一起修改,單獨注釋效果如下圖:?
cv2.putText(self.im, label, (p1[0], p1[1] - 2 if outside else p1[1] + h + 2), 0,self.lw / 3, txt_color,thickness=tf, lineType=cv2.LINE_AA)
#self.im 輸出在哪一張圖片,這里就是檢測的圖片
#label 輸出內容(str格式),這里就是標簽
#(p1[0], p1[1] - 2 if outside else p1[1] + h + 2) 左上角坐標位置
#0 官方解釋是Font scale factor that is multiplied by the font-specific base size.感覺這里也是改變字體的粗細
#tetcolor 文字顏色
#thickness 用于繪制文本的線條的粗細
#LineTypes 線型
2022/10/25日新增:有同學私信跟我交流如何添加坐標信息,本人的思路是直接用putText(),將打印內容改成你想打印的坐標(我這里打印的是左上角的坐標),稍微調整一下打印在圖上的位置坐標。
cv2.putText(self.im, "("+str(p1[0])+","+str(p1[1])+")", (p1[0]+5, p1[1] -50 if outside else p1[1] + h + 2), 2, self.lw / 3, txt_color,thickness=tf, lineType=cv2.LINE_AA)
2022/11/22日新增:有同學私信我跟我交流如何只顯示部分標簽和置信度,本人的思路是在detect.py中找到標簽顯示語句:
label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f}')
原標簽顯示邏輯為:“標簽 = 無 如果“隱藏標簽”否則顯示標簽”,我們只需要再加入我們所需要的判斷條件即可,比如不想顯示“person”只需修改代碼為:
label = None if hide_labels or names[c]=="person" else (names[c] if hide_conf else f'{names[c]} {conf:.2f}')
2023/4/3日新增:有同學私信問:如何給不同物體自定義方框顏色,比如想定義框選person的框為紫色(128,0,128),框選tie的為灰色(169,169,169)。我的思路:在畫框的前加一個if判斷,代碼(101行左右)如下:
else: # cv2p1, p2 = (int(box[0]), int(box[1])), (int(box[2]), int(box[3]))if 'person' in label:cv2.rectangle(self.im, p1, p2, (128,0,128), thickness=self.lw, lineType=cv2.LINE_AA)if 'tie' in label:cv2.rectangle(self.im, p1, p2, (169, 169, 169), thickness=self.lw, lineType=cv2.LINE_AA)if label:
如果想顯示部分目標框也是同理,比如你只想顯示person,你就在畫框的代碼前加一個if判斷是否為”person",就不要加后面“tie”的判斷了。
2023/5/16新增:v5之前的版本可能跟上面的差別比較大,其實道理是一樣的,你在detect.py里找到打印標簽的的那一行,如下圖所示,ctrl+鼠標左鍵plot_one_box,就可以進入這個函數,之后根據自己的需求修改就行。
2023/5/18新增:評論區提問:“檢測出來的都是顯示到小數點后一位,怎么可以讓他顯示到后兩位呀?”思路:其實就是修改打印的置信度精度(conf),在detect.py里搜索conf,找到下面這行代碼:最后的{conf:.2f}代表保留小數點后兩位,根據需求修改即可,結果如下圖:
label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f}')
?
注:以上只是本人對自己學習過程的總結,僅供大家參考,如果出現錯誤,希望大家可以理解并指正。博主現在也比較忙(笑發財了,被放養,根本不知道忙啥),佛系更新,大家如果問題解決了,可以把方法評論下來,或者私信給博主,我會跟新博文并添加上你的名字。