前言
在做CV识别或检测任务的时候,想必大家都曾为数据集发愁过,在这里我将介绍一个快捷方式,制作属于自己的的数据集
此数据集我们以人脸为例子,为了区分带口罩和不带口罩的区别。我们需要的图像有两类,一类是不带口罩的人脸,另一类是带口罩的人脸。我在使用OpenCv模块的时候,发现有一个很好的模块:haarcascade_frontalface_alt2.xml,可以很好的检测到人脸;我这里将在它的基础上拓展制作属于自己的数据集。
摄像头采集制作
PC机+摄像头+自己+demo ='数据集' 大家可以借鉴juejin.cn/post/707483… 实现人脸检测,在这个demo的基础上做一些改进。
人脸检测已经具备了的话,我们现在需要在检测到人脸的基础上把人脸扣出来,摄像头是使用CV读取的,这里我们采用矩阵的裁剪,将人脸部分裁剪下来并存至指定位置。
我们分别制作两份数据:带口罩和不带口罩,在摄像头下都可以顺利的裁剪出自己的人脸
if __name__ == "__main__": capture = cv2.VideoCapture(0) fps = 0.0 while True: t1 = time.time() ref, frame = capture.read() frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) (p_image, face_coor) = format_image(frame) if face_coor is not None: # 获取人脸的坐标,并用矩形框出 [x, y, w, h] = face_coor cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 1) x0 = x y0 = y x1 = x + w y1 = y + h crop_img = frame[y0:y1, x0:x1] # x0,y0为裁剪区域左上坐标;x1,y1为裁剪区域右下坐标 img_name = uuid.uuid1() cv2.imwrite('C:/Users/kiven/Desktop/do_img/faces/%s.jpg' % img_name, crop_img) # save_path为保存路径 frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) fps = (fps + (1. / (time.time() - t1)))/2 frame = cv2.putText(frame, "fps= %.2f" % (fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow("video", frame) c = cv2.waitKey(1) & 0xff if c == 27: capture.release() break capture.release() cv2.destroyAllWindows()
文件夹读取制作
大家或许没有摄像头或者不喜欢用自己的头像制作数据集,那么可以在网上爬取一些带口罩图像和不带口罩图像,定位模块同摄像头部分一样,在数据读取上有些许差异。
可参考:
if __name__ == "__main__": NewPersonImgPath = 'C:/Users/kiven/Desktop/Doimgs/score/images/val/' # NewPersonImgPathLine = os.listdir(NewPersonImgPath) # 获取工程车辆文件夹 for NewPersonName in NewPersonImgPathLine: NewPersonImage = Image.open(NewPersonImgPath + NewPersonName) frame = cv2.cvtColor(numpy.asarray(NewPersonImage), cv2.COLOR_RGB2BGR) (p_image, face_coor) = format_image(frame) if face_coor is not None: # 获取人脸的坐标,并用矩形框出 [x, y, w, h] = face_coor cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 1) x0 = x y0 = y x1 = x + w y1 = y + h crop_img = frame[y0:y1, x0:x1] # x0,y0为裁剪区域左上坐标;x1,y1为裁剪区域右下坐标 # crop_img = cv2.cvtColor(crop_img, cv2.COLOR_RGB2BGR) crop_imgs = cv2.resize(crop_img, (50, 50), interpolation=cv2.INTER_CUBIC) img_name = uuid.uuid1() cv2.imwrite('C:/Users/kiven/Desktop/Doimgs/faces/%s.jpg' % img_name, crop_imgs) # save_path为保存路径