利用mtcnn以及opencv对视频进行自动人脸图片标注

现在大多数图片标注的方式是用labelimg对图片进行框选,但是这样非常花时间,本文提出了一种利用mtcnn对视频进行自动图片标注,生成可以直接利用的txt文件和图片文件的方法,以下是我的代码链接
代码:https://github.com/pengjianqiang/mtcnn-pytorch
下面重点来看一下test.py关于用opencv剔除相似帧,生成数据集的部分

        cap = cv2.VideoCapture('/home/admin/face_detection/dataset/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mp4')

        mog = cv2.createBackgroundSubtractorMOG2(1,55)

cap为需要进行人脸标注的视频,这里我们还调用了Opencv的mog2算法,目的是剔除视频中相似的帧,保证数据集里的图片尽可能不一样,这里介绍一下mog2算法,这里history=1,指用于背景训练的帧数为1(仅和上一帧进行比较),varThreshold = 55,这里为方差阈值,用于判断当前像素是前景还是背景,这个值越大,代表灵敏度越低,代表2帧之间像素变化的部分要越大才能被判断成前景,这里大家可以根据自己的视频调一下这个参数,达到最好的效果

            bounding_boxes, landmarks = detect_faces(image1)
            #image = show_bboxes(image, bounding_boxes, landmarks)
            image2 = show_bboxes(image1, bounding_boxes, landmarks)
            a=0
            for b in bounding_boxes:
                a = 1
                break

这里为对视频逐帧进行人脸检测,如果检测到了人脸,a值就会设置为1,才会对该帧进行处理。

            if a:
            
                fgmask = mog.apply(frame,1)
                
                dilate = cv2.dilate(fgmask, (21, 21), iterations=1)
                
                (cnts, _) = cv2.findContours(dilate.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

                ee = open('chayi/' + j + ' chayi' + '.txt', 'a')

这里对检测到的人脸图片进行处理,dilate为形态学膨胀操作,用于过滤一些噪声和方便之后进行对图片变化部分进行框选,这个地方也可以在dilate前加一句erode = cv2.erode(fgmask, (21, 21), iterations=1),用于形态学腐蚀操作,cnts为整张图片中所有图片变化部分形成的框,我们等会通过计算各个框的面积来判断这个帧和前一个相比是否为相似帧。

                for c in cnts:
                
                    c_area = cv2.contourArea(c)
                    
                    if (c_area > 3000):

                        cc = str(c_area)
                        
                        ee.write(cc+'\n')

                        f = open('txt'+ p + '/' + j +'.txt', 'a')

c_area则为检测到变化部分的面积,这里我们阈值设为3000,超过这个值,我们就将其判断为非相似帧

                        for b in bounding_boxes:

                            x = ((b[0]+b[2])/2)/(image1.size[0])

                            y = (0.5*b[1] + 0.5*b[3])/(image1.size[1])

                            w = ((b[2] - b[0])*1.0)/(image1.size[0])

                            h = ((b[3] - b[1])*1.0)/(image1.size[1])

                            x = str(x)

                            y = str(y)

                            w = str(w)

                            h = str(h)

                            f.write('0 '+x+' '+y+' '+w+' '+h+'\n')

                            z = int(j)

                            image1.save('dataset'+ p +'/' + j + '.jpg')

                        break

接下来就是对提取的非相似帧按要求生成对应的图片和txt文件了,yolov3数据集中txt文件的格式要求是每行中的第一个数字代表为类别,这里我们只有人脸,因此直接取0,然后空格,接下来的四个数字分别为人脸位置框按图片比例对应的中心坐标和宽、高,所以这里我们需要得到这个四个参数,x,y,w,h分别由bounding_boxes的值计算得来,这里可以再将宽、高取大一些。最后我们只需要再根据自己的需要写一写classes.txt即可

新人发博客,如有错误的地方,欢迎指教!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值