第一次用YOLOV5训练自己的数据集,独立完成,爽歪歪

首次利用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,做出一个界面,可以识别视频的和实时的,第一次搞这个也没少走弯路,出现各种各样没见过的错误,熟能生巧吧

大佬们请教了

猜你喜欢

转载自blog.csdn.net/weixin_47037450/article/details/130365241
今日推荐