目录
1.前置知识点
LabelImg标注的YOLO格式txt标签中心坐标和物体边界框长宽的转换
python实现图片的大小变换之后图片中的目标坐标一起等比例变换
2.数据集准备
(1)下载数据集
链接:https://pan.baidu.com/s/1QCLjLZBAUbpwppHiHq3e_Q
提取码:t563
提示:这里的数据集是我已经标注好的,并且已经是处理好的一小部分数据集,读者首先利用这一部分数据集进行训练,确保数据集在代码上可以训练之后,再标注自己的数据集进行训练。
(2)标注自己的数据集步骤
第一步:使用LabelImg标注自己的数据集(采用的是YOLO格式,参考上面的链接);
提示:建议读者在标注数据集之前,首先将图片缩放到指定大小,这样后期就不需要对图片大小和对应坐标大小进行等比例缩放了。
def equalScaleImage(imgPath,savePath): """ :param imgPath: 需要转换图片的位置 :param savePath: 需要保存转换后图片的位置 :return: """ imgs=os.listdir(imgPath) i=0 for i,imgName in enumerate(imgs): img_path=os.path.join(imgPath,imgName) img=cv2.imread(img_path) newImg=cv2.resize(img,(224,224)) save_path=os.path.join(savePath,str(i)+'.png') i+=1 cv2.imwrite(save_path,newImg) print('正在转换...')
提示:读者需要注意给定的图片路径中的反斜杠的问题,不然读取失败。
第二步:标注得到的坐标值进行转换,由于使用YOLO格式标注得到的数据都是经过归一化的(需要重新进一步对数据进行处理,这样才能将图像中的人脸框画出来)。
提示:这里为什么需要将图片的坐标重新进行对应的处理呢?主要是我们使用的预训练模型的要求,如下图所示:
由于我们使用YOLO格式标注出来的数据集是下面这样的:
因此,需要将使用YOLO格式标注的坐标进行一定的转换(转换的程序已经在上面的链接中给出了)。
第三步:关于数据集的名称,读者可以根据自己的需要进行命名,对于图片进行批量的命名也已经给出链接。
提示:标注数据集和处理数据集的过程比较繁琐和无趣,希望读者可以坚持标完数据集。
(3)加载数据集
第一:由于加载到模型中的数据集都是有格式要求的,所以需要单独写一个加载数据集的程序对数据集进一步处理(MyDataset.py),并且数据集都是需要转换为Tensor格式;
比如:加载到目标检测模型中的数据集格式为:
#怎么使用预训练模型进行自己的数据集的一个小实例
def example():
model = fasterrcnn_resnet50_fpn(pretrained=True, progress=True)
#images:四张图像,每一张图像的格式为[C,H,W]
#boxes:对于每一张图像中包含11个目标,每一个目标包含四个坐标
images, boxes = torch.rand(4, 3, 600, 1200), torch.rand(4, 11, 4)
# print('images.shape: {}'.format(images.shape))
# print('boxes.shape: {}'.format(boxes.shape))
print('boxes: {}'.format(boxes))
boxes[:, :, 2:4] = boxes[:, :, 0:2] + boxes[:, :, 2:4]
print('boxes.shape: {}'.format(boxes.shape))
# print('boxes: {}'.format(boxes))
#这里的整数范围[1,91),其二维形状为[4,11]
labels = torch.randint(1, 91, (4, 11))
print('labels.shape: {}'.format(labels.shape))
#将图像存放在一个列表中
images = list(image for image in images)
targets = []
#将坐标和对应的标签存放在一个字典当中
for i in range(len(images)):
d = {}
d['boxes'] = boxes[i]
# print('boxes.shape: {}'.format(boxes[i].shape))
d['labels'] = labels[i]
# print('labels[i].shape: {}'.format(labels[i].shape))
targets.append(d)
# print('d: {}'.format(d))
print('images.shape: {}'.format(len(images)))
print('targets.shape: {}'.format(len(targets)))
print('images: {}'.format(images))
print('targets: {}'.format(targets))
#注意模型默认的模式为训练模式
# model.train()
# output = model(images, targets)
# print(output)
# print(output['loss_classifier'].item())
# For inference
#设置为eval模式并进行检测
model.eval()
x = [torch.rand(3, 300, 400), torch.rand(3, 500, 400)]
predictions = model(x)
print('predictions: {}'.format(predictions))
print('boxes.shape: {}')
3.预训练模型进行修改
提示:由于我们训练的数据集类别数和预训练模型的数据集类别数不一样,所以需要进行一定的修改,关于模型输出类别数的修改,可以看下面的文章:
4.Pytorch中TensorBoard的使用
推荐以下这位博主:
5.图像分类模型的训练
提示:如果训练的是人脸识别检测模型,不仅仅需要将人人脸的位置标注出来,而且也识别人脸的身份。
6.人脸检测模型训练
提示:这里的代码将放置在Github上面。