首次利用YOLOV5源码对Fight和noFight进行训练检测
- 数据集不好寻找就自己从kaggle上下载打架和不打架的avi数据,再利用代码进行划帧分割成图片
import cv2 import os def close_VideoCapture(cap): cap.release() def load_avi_file_sid_cid_time(video_filename): try: cap = cv2.VideoCapture(video_filename) if cap.isOpened(): return cap else: print("load avi file failed!\n") return None except: return None def search_avi_and_get_frame(path1,savepath): for filename in os.listdir(path1): if os.path.isdir(os.path.join(path1,filename)): path1_ = os.path.join(path1,filename) savepath_ = os.path.join(savepath,filename) search_avi_and_get_frame(path1_,savepath_) print('is dir',filename) elif filename[0] == '.': print('is . continue') continue else: print(filename) firstname,lastname =filename.split('.')[0],filename.split('.')[1] # print(firstname,lastname) if lastname == 'avi': # try: # new_dir = savepath+'\\' + newmakedirname newmakedir = os.path.join(savepath,firstname) # newmakedir = os.path.join(new_dir, firstname) if not os.path.exists(newmakedir): os.makedirs(newmakedir) cap = load_avi_file_sid_cid_time(os.path.join(path1,filename)) startframe = 1 skipframe = 1 while cap: # 以帧率的形式进行抽帧 cap.set(cv2.CAP_PROP_POS_FRAMES, startframe) ret, frame = cap.read() if ret: cv2.imwrite(os.path.join(newmakedir,'{}.jpg'.format(startframe)), frame) startframe += skipframe else: close_VideoCapture(cap) break # except: # print('errorfile',filename) if __name__ == '__main__': # avi文件目录 path_ = r'' #截图的图片目录 savepath_ = r'' search_avi_and_get_frame(path_,savepath_)
将图片分割出后,需要进行排序处理,如果数据集不够好,先进行筛选处理
import os class BatchRename(): def __init__(self): self.path = r'' # 表示需要命名处理的文件夹 self.save_path = r'' # 保存重命名后的图片地址 def rename(self): filelist = os.listdir(self.path) # 获取文件路径 total_num = len(filelist) # 获取文件长度(个数) i = 9051 # 表示文件的命名是从200000开始的 for item in filelist: print(item) if item.endswith('.jpg'): # 初始的图片的格式为jpg格式的(或者源文件是png格式及其他格式,后面的转换格式就可以调整为自己需要的格式即可) src = os.path.join(os.path.abspath(self.path), item) # 当前文件中图片的地址 dst = os.path.join(os.path.abspath(self.save_path), '' + str(i) + '.jpg') # 处理后文件的地址和名称,可以自己按照自己的要求改进 try: os.rename(src, dst) print('converting %s to %s ...' % (src, dst)) i = i + 1 except: continue print('total %d to rename & converted %d jpgs' % (total_num, i)) if __name__ == '__main__': demo = BatchRename() demo.rename()
这样就可以对数据及进行很好的第一步处理,YOLO作为一个快速检测的模型,需要.txt文本数据集
-
接下来就是对数据集进行打标签,labelimg https://github.com/tzutalin/labelImg
从这里下载工具,放在项目里或者其他目录都可以
我就放在了这里,个人喜好
打开虚拟终端,进入项目环境或者自己配置一个环境
我是自己配置了一个环境,将下面的命令直接复制进去
conda install pyqt=5
conda install -c anaconda lxml
pyrcc5 -o libs/resources.py resources.qrc
第三个尤其重要!!!
如果出现这样的就一条一条安装吧
成功后会出现三个done.
然后我们用pycharm运行labelimg
这两个错误不用管,可以直接运行,我第一次以为不能运行,各种改环境,库的版本,还有python的版本都降低了,直接怀疑人生,偶然shift+F10居然运行出来了,我那个气啊
接下来,我们打开labelimg的data文件
继续打开
改成自己的标签
这里也就自动变更了
新建一个文件夹,放置你的txt文本,我是放在了桌面上,等下面划分的时候方便
第一个只是打开一个图片
第二个我们打开一个文件夹
第三个是我们要存取的位置
记得要点击保存的格式,这里为YOLO!!重新打开有时候会变,要注意,血的教训
点击上面的查看,选择自动保存和显示类别
快捷键在帮助里面查看,就不多介绍了
如何打开,终端返回一连串的数字和英文,说明你的显存不够,关闭一些应用就可以,要不就等一下让它缓一缓,或者重启
标签处理就介绍到这里
- 下面开始配置文件
- 数据集放置
按照我的这个格式,我没有利用测试集,训练集:验证集=9:1 ,如果加测试集就是8:1:1的划分。
- 修改文件
data文件下的V0C复制,粘贴在同目录下,我改成violence
只保留训练和验证的图片路径,nc是类别,names是标签
然后是model文件的修改
和data类似,我用的yolov5s网络结构,复制一个在同目录下,这里我的名字就是那个yolov5s-VF
只需要将nc改成你自己的种类数就行,其他的不用管
- 接下来就是train
--cfg:default=model/你自己在model加的文件路径
--data:就是在data中加的文件路径
还有根据自己的电脑配置修改bantch和workers,
我用的台式机,i5处理器,而且没有GPU,不怎么好,一开始bantch是8,workers是4,训练到第七轮,无法训练,显示分配的字节太多,就降低了,
- 训练结束
在目录下生成一个train文件,里面包含各种参数和评价指标,两个权重,last和best
best:表示最好的模型,识别某一个目标是最好的,但是泛化性不强
last:与best相反
data的image加入一些图片
运行detect.py,识别的结果在
总的来说,数据集差点儿火候,毕竟是从视频中划分下来的,像素点差点儿意思,最近还在看UI,做出一个界面,可以识别视频的和实时的,第一次搞这个也没少走弯路,出现各种各样没见过的错误,熟能生巧吧
大佬们请教了