Python老師給了三個小組項目:1.自身專業問題 2.人工智能 3.游戲或者小工具
提前告知了,寫游戲不好拿高分,小工具又不能展示自己的水平。大一剛來也沒碰到什么專業問題,於是經過討論,決定了做人工智能項目。
又因才疏學淺,只好踐行拿來主義,把現成的yolov5拿來用,做一個口罩佩戴識別。
1.環境配置:本項目使用miniconda + pytorch + yolov5,IDE使用的是Pycharm。
miniconda官網:https://conda.io/en/latest/miniconda.html
pytorch官網:https://pytorch.org/get-started/locally/
Pycharm官網:https://www.jetbrains.com/pycharm/download/#section=windows
miniconda配置pytorch教程:https://blog.csdn.net/weixin_41297324/article/details/109478948
Pycharm安裝教程:https://www.runoob.com/w3cnote/pycharm-windows-install.html
Anaconda可以虛擬化管理python環境,自帶許多科學計算的python庫。這是個非常方便的選擇,也為后面封裝exe挖了個坑。
不使用conda配置pytorch教程:https://blog.csdn.net/qq_23013309/article/details/103965619
Yolov5項目地址:https://github.com/ultralytics/yolov5
python版本是3.8,cuda版本我選擇的是11.3,yolov5使用的是v6.0版本。
2.收集數據、打標簽
訓練人工智能是很吃數據的,推薦的數據規模是每一類1000+圖片,因為是小組項目,所以采用的是小數據集。
目標數據部分來自:https://www.bilibili.com/video/BV1i7411376y
背景數據來自我手機相冊、朋友圈。
打標簽工具Labelimg:https://github.com/tzutalin/labelImg
將所有數據進行打標簽,過程應當是十分痛苦的。
3.調整代碼訓練數據
yolov5-v6.0下載解壓后,找到train.py,對其中代碼進行修改。
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
選擇預訓練的模型,如果數據集足夠大,不選擇預訓練模型也可以取得很好的成果。
parser.add_argument('--epochs', type=int, default=100)
訓練次數,這里默認是300,因為性能有限所以選擇了100.
parser.add_argument('--batch-size', type=int, default=3, help='total batch size for all GPUs')
default需要根據顯卡和內存性能修改,電腦是GTX3060+16G內存,我這里設置的比較保守。如果設置過大,會導致顯存溢出。
其他的配置可以保持默認,直接把數據和標簽扔進coco128的train2017文件夾中進行訓練即可。
找到coco128.yaml,對其中的代碼進行修改:
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco128 # dataset root dir
train: images/train2017 # train images (relative to 'path') 128 images
val: images/train2017 # val images (relative to 'path') 128 images
test: # test images (optional)
# Classes
nc: 2 # number of classes
names: ['masked','no_mask'] # class names
nc改成2,names改為masked no_mask。
4.運行train.py,訓練模型。
5.修改並調用detect.py
在yolov5的文件夾下新建一個mask_kid.py,內容如下:
from detect import run
run_dict = {
'weights': 'best.pt',
'source': 0,
'imgsz': [640, 640],
'conf_thres': 0.85,
'iou_thres': 0.75,
'max_det': 10,
'device': '0',
'view_img': False,
'save_txt': False,
'save_conf': False,
'save_crop': False,
'nosave': True,
'classes': None,
'agnostic_nms': False,
'augment': False,
'visualize': False,
'update': False,
'project': 'runs/detect',
'name': 'exp',
'exist_ok': False,
'line_thickness': 3,
'hide_labels': False,
'hide_conf': False,
'half': False,
'dnn': False
}
run(**run_dict)
從訓練結果文件夾中找到best.pt復制到yolov5文件夾下。
圖形界面還沒寫,主要是加載參數並且調用detect.py。基本沒有太大技術含量。
運行此代碼嘗試一下,似乎效果還可以?
5.優化
雖然能夠正確識別無遮擋的人臉和口罩遮擋的人臉,但是此模型在面對其他類型的遮擋攻擊時表現較差。
目前的優化思路有兩個:
一、二次識別
二、增加攻擊數據
二次識別需要更多的數據,需要更多的代碼。才疏學淺,只好選擇增加攻擊數據重新訓練。
6.封裝項目
由於之前使用的是虛擬環境,在使用Pyinstaller打包時遇到問題無數。
打包后的程序在自己電腦上運行正常,去其他電腦上運行頻繁報錯。
最后經高人指點乃是conda導致部分庫打包不完全,需要在實際環境中打包或是指定路徑,在此一並感謝。
時間緊迫,后續工作就不開展了。
附模型分享:
鏈接:https://pan.baidu.com/s/1tmT_9oE6tWw7s2Wa_KYpTA
提取碼:z3k1