一、框线粗细
这个最简单 通用设置里倒数第四个 改掉默认值就行
def parse_opt():
。。。。。
parser.add_argument('--line-thickness', default=1, 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')
parser.add_argument('--half', action='store_true', help='use FP16 half-precision inference')
opt = parser.parse_args()
二、英文改中文
网上一位大神教了怎么从训练层就把标签改成中文,我弄不来,我直接再显示层改了
if save_img or save_crop or view_img: # Add bbox to image
c = int(cls) # integer class
label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f}')
if names[c]=="masking":
label = "已佩戴口罩"
im0=plot_one_box_PIL(xyxy, im0, label=label, color=colors(5,True), line_thickness=line_thickness)
if names[c]=="unmasked":
label = "未佩戴口罩"
im0=plot_one_box_PIL(xyxy, im0, label=label, color=colors(0,True), line_thickness=line_thickness)
if save_crop:
save_one_box(xyxy, imc, file=save_dir / 'crops' / names[c] / f'{p.stem}.jpg', BGR=True)
这块逻辑简单 强行改字符 但是python特性是默认不识别中文
下一步就需要修改plot_one_box_PIL了(原plot_one_box 这里将两个该函数结合使用)
这里注意一下 解决问题第一步先搞清楚层次,再去找答案
比如这里 改文字就和yolov pytorch无关了 是python 和 cv层的问题
换句话说就是需要解决draw.text中改文字属性的问题
结论:层次不对 再查也不会有结果
def plot_one_box_PIL(x, im, color=(128, 128, 128), label=None, line_thickness=3):
# Plots one bounding box on image 'im' using OpenCV
assert im.data.contiguous, 'Image not contiguous. Apply np.ascontiguousarray(im) to plot_on_box() input image.'
tl = line_thickness or round(0.002 * (im.shape[0] + im.shape[1]) / 2) + 1 # line/font thickness
c1, c2 = (int(x[0]), int(x[1])), (int(x[2]), int(x[3]))
cv2.rectangle(im, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)
if label:
tf = max(tl - 1, 1) # font thickness
t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]
#font = ImageFont.truetype("msyh.ttc", font_size,encoding='utf-8')
sm=Image.fromarray(im)
font = ImageFont.truetype("msyh.ttc", size=max(round(max(sm.size) / 45), 6))
txt_width, txt_height = font.getsize(label)
t_size = font.getsize(label)
c2 = c1[0] + t_size[0], c1[1] - t_size[1]
cv2.rectangle(im, c1, c2, color, -1, cv2.LINE_AA) # filled
img_PIL = Image.fromarray(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img_PIL)
draw.text((x[0], x[1] - txt_height + 1), label, fill=(255, 255, 255), font=font)
return cv2.cvtColor(np.array(img_PIL), cv2.COLOR_RGB2BGR)
对照yolov5源码很容易明白改了哪里
三 、改表示框颜色
if names[c]=="masking":
label = "已佩戴口罩"
im0=plot_one_box_PIL(xyxy, im0, label=label, color=colors(5,True), line_thickness=line_thickness)
if names[c]=="unmasked":
label = "未佩戴口罩"
im0=plot_one_box_PIL(xyxy, im0, label=label, color=colors(0,True), line_thickness=line_thickness)
颜色折腾的最久 其实很简单 文中5,0对应 plot py文件中的class Colors:中的数组 也可以根据需要改写来自定义颜色
class Colors:
# Ultralytics color palette https://ultralytics.com/
def __init__(self):
# hex = matplotlib.colors.TABLEAU_COLORS.values()
hex = ('FF0000', 'FF9D97', 'FF701F', 'FFB21D', 'CFD231', '48F90A', '92CC17', '3DDB86', '1A9334', '00D4BB',
'2C99A8', '00C2FF', '344593', '6473FF', '0018EC', '8438FF', '520085', 'CB38FF', 'FF95C8', 'FF37C7')
self.palette = [self.hex2rgb('#' + c) for c in hex]
self.n = len(self.palette)
def __call__(self, i, bgr=False):
c = self.palette[int(i) % self.n]
return (c[2], c[1], c[0]) if bgr else c
@staticmethod
def hex2rgb(h): # rgb order (PIL)
return tuple(int(h[1 + i:1 + i + 2], 16) for i in (0, 2, 4))