新版yolov5配合自带摄像头使用时显示样式的调整

一、框线粗细
这个最简单 通用设置里倒数第四个 改掉默认值就行

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))

你可能感兴趣的:(模式识别)