在前面有介绍过PicoDet超轻量目检算法,详情可以参看:23.基于PP-PicoDet轻量级目标检测模型——实现目标检测项目。
在工作或生活中,我们经常有些场景需要检测使用手机的行为,以便进行跟踪处理。
部分数据
部分数据
模型训练
import paddlex as pdxfrom paddlex import transforms as T# 定义训练和验证时的transformstrain_transforms = T.Compose([ T.RandomCrop(), T.RandomHorizontalFlip(), T.RandomDistort(), T.BatchRandomResize( target_sizes=[576, 608, 640, 672, 704], interp='RANDOM'), T.Normalize( mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])eval_transforms = T.Compose([ T.Resize( target_size=640, interp='CUBIC'), T.Normalize( mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])# 定义训练和验证所用的数据集train_dataset = pdx.datasets.VOCDetection( data_dir='train/0_phone', file_list='train/0_phone/train_list.txt', label_list='train/0_phone/labels.txt', transforms=train_transforms, shuffle=True)eval_dataset = pdx.datasets.VOCDetection( data_dir='train/0_phone', file_list='train/0_phone/val_list.txt', label_list='train/0_phone/labels.txt', transforms=eval_transforms, shuffle=False)# 初始化模型,并进行训练num_classes = len(train_dataset.labels)model = pdx.det.PicoDet(num_classes=num_classes, backbone='ESNet_l')model.train( num_epochs=20, train_dataset=train_dataset, train_batch_size=14, eval_dataset=eval_dataset, pretrain_weights='COCO', learning_rate=.05, warmup_steps=24, warmup_start_lr=0.005, save_interval_epochs=1, lr_decay_epochs=[6, 8, 11], use_ema=True, save_dir='output/picodet_phone', use_vdl=True)
部分训练过程epoch=12/20,使用训练的结果来看,bbox_map达到90%以上,基本还是可以的。
…………2022-05-22 10:44:07 [INFO] [TRAIN] Epoch=12/20, Step=452/468, loss_vfl=0.503368, loss_bbox=0.268626, loss_dfl=0.182570, loss=0.954564, lr=0.017488, time_each_step=0.49s, eta=0:42:362022-05-22 10:44:12 [INFO] [TRAIN] Epoch=12/20, Step=462/468, loss_vfl=0.551387, loss_bbox=0.314132, loss_dfl=0.203088, loss=1.068607, lr=0.017408, time_each_step=0.49s, eta=0:42:232022-05-22 10:44:15 [INFO] [TRAIN] Epoch 12 finished, loss_vfl=0.5484224, loss_bbox=0.31818506, loss_dfl=0.19476633, loss=1.0613737 .2022-05-22 10:44:15 [WARNING] Detector only supports single card evaluation with batch_size=1 during evaluation, so batch_size is forcibly set to 1.2022-05-22 10:44:15 [INFO] Start to evaluate(total_samples=1640, total_steps=1640)...2022-05-22 10:45:44 [INFO] Accumulating evaluatation results...2022-05-22 10:45:44 [INFO] [EVAL] Finished, Epoch=12, bbox_map=90.200701 .2022-05-22 10:45:44 [INFO] Model saved in output/picodet_phone/best_model.2022-05-22 10:45:44 [INFO] Current evaluated best model on eval_dataset is epoch_12, bbox_map=90.200700979121352022-05-22 10:45:45 [INFO] Model saved in output/picodet_phone/epoch_12.2022-05-22 10:45:48 [INFO] [TRAIN] Epoch=13/20, Step=4/468, loss_vfl=0.605212, loss_bbox=0.361655, loss_dfl=0.222297, loss=1.189165, lr=0.017327, time_each_step=0.59s, eta=0:46:532022-05-22 10:45:53 [INFO] [TRAIN] Epoch=13/20, Step=14/468, loss_vfl=0.486455, loss_bbox=0.302700, loss_dfl=0.186873, loss=0.976028, lr=0.017247, time_each_step=0.48s, eta=0:40:0…………
训练模型包括三个文件.
1、model.pdparams 模型参数2、model.pdopt 优化参数3、model.yml 配置文件
在训练模型目录运行命令,导出部署模型,生成一个inference_model目录。
>paddlex --export_inference --model_dir best_model --save_dir infer
模型预测
测试数据集,包括使用手机和未使用手机的图片。
import cv2import ospredictor=pdx.deploy.Predictor("output/picodet-phone/inference_model",use_gpu=True)for f in os.listdir("img/photo"): imgfile=os.path.join("img/photo",f) img=cv2.imread(imgfile) result=predictor.predict(img) #print(result) vis_img=pdx.det.visualize(img,result,threshold=0.5,save_dir=None) cv2.imshow("result",vis_img) cv2.waitKey(0) cv2.destroyAllWindows()
检测到使用手机
检测到使用手机
未检测到使用手机
检测到使用手机行为
从模型预测结果来看,基本上达到检测的要求,但还是会存在一些错检的行为,这里可能还需要多一些数据来进行训练。
对于人工智能,一是要有大数据,二是要有算力,三就是算法支持。
对于普通个人用户来说,即使有大数据,算力都很难保障。算法也都是人家的。
声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!