zoukankan      html  css  js  c++  java
  • paddle加载模型后使用模型报错

            深度学习paddle加载模型之后使用模型报错

      在使用paddle加载模型成功之后,只要运行到使用模型的语句就会报错。最开始我一直以为是这个语句本身的问题或是模型的问题,

      爆出问题是             无法读取某些图片 can not read the image file : D:Walker estv01zhenframe2.jpg

      但是我在百度之后很多的答案并不是我想的问题,大部分都在说是加载图片的问题,可能是虽然图片的格式看着是jpg或是其他,但是只是将图片的后缀修改jpg,没有转码,我尝试转码后并没有用。后来我通过来百度飞桨的群里询问,得到可能是路径不是存在中文的原因,上面我给出路径是已经修改成中文的,所以没有问题。windows中路径问题有很多,所以我们尽量进行英文命名,不用中文命名,有的  /   和  并存在一个路径上也可能会有问题,比如   D:Walker estv01zhen/frame2.jpg,尽量保持统一。

      可以读取图片之后我以为问题解决了,但是又出现了其他的问题,

      

      运行到使用模型的语句就是报出如下错误:

      Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hi

     

      这是在pycharm中运行的报出错误,如果使用jupyter notebook 甚至会直接运行到这句的时候,瞬间内核崩溃,但是这个问题简单,只需要添加两行代码:

      

      import os
      os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'

      问题就解决了

     

    所有的代码:

    import matplotlib
    import os
    os.environ['CUDA_VISIBLE_DEVICES'] = '0'
    import paddlex as pdx
    import cv2
    from random import shuffle, seed
    
    base = 'D:Filepascalvoc/VOCdevkit/VOC2012/'
    
    
    
    from paddlex.det import transforms
    train_transforms = transforms.Compose([
        transforms.MixupImage(mixup_epoch=250),
        transforms.RandomDistort(),
        transforms.RandomExpand(),
        transforms.RandomCrop(),
        transforms.Resize(target_size=512, interp='RANDOM'),
        transforms.RandomHorizontalFlip(),
        transforms.Normalize(),
    ])
    
    eval_transforms = transforms.Compose([
        transforms.Resize(target_size=512, interp='CUBIC'),
        transforms.Normalize(),
    ])
    
    #base = 'D:软件谷歌浏览器下载/pascalvoc/VOCdevkit/VOC2012/'
    
    train_dataset = pdx.datasets.VOCDetection(
        data_dir=base,
        file_list=os.path.join(base, 'train_list.txt'),
        label_list='labels.txt',
        transforms=train_transforms,
        shuffle=True)
    eval_dataset = pdx.datasets.VOCDetection(
        data_dir=base,
        file_list=os.path.join(base, 'val_list.txt'),
        label_list='labels.txt',
        transforms=eval_transforms)
    
    
    print("开始加载模型")
    model = pdx.load_model('YOLOv3/best_model')
    model.evaluate(eval_dataset, batch_size=1, epoch_id=None, metric=None, return_details=False)
    
    
    
    
    import cv2
    import time
    import numpy as np
    import matplotlib.pyplot as plt
    import paddlex as pdx
    import cv2
    
    
    
    def video2frame(videos_path, frames_save_path, time_interval):
        '''
        :param videos_path: 视频的存放路径
        :param frames_save_path: 视频切分成帧之后图片的保存路径
        :param time_interval: 保存间隔
        :return:
        '''
        vidcap = cv2.VideoCapture(videos_path)
        success, image = vidcap.read()
        count = 0
        a = 2
        while success:
            success, image = vidcap.read()
            count += 1
            if count % time_interval == 0:
                cv2.imencode('.jpg', image)[1].tofile(frames_save_path + "/frame%d.jpg" % count)
    
                image_name = 'D:/Walker/testv01/zhen/frame'+ str(a)+'.jpg'
                start = time.time()
                result = model.predict(image_name, eval_transforms)
                print('infer time:{:.6f}s'.format(time.time()-start))
                print('detected num:', len(result))
    
                im = cv2.imread(image_name)
                font = cv2.FONT_HERSHEY_SIMPLEX
                threshold = 0.01
    
                for value in result:
                    xmin, ymin, w, h = np.array(value['bbox']).astype(np.int)
                    cls = value['category']
                    score = value['score']
                    if score < threshold:
                            continue
                    cv2.rectangle(im, (xmin, ymin), (xmin+w, ymin+h), (0, 255, 0), 4)
                    cv2.putText(im, '{:s} {:.3f}'.format(cls, score),
                                    (xmin, ymin), font, 0.5, (255, 0, 0), thickness=2)
    
                    cv2.imwrite(image_name, im)
                    plt.figure(figsize=(15,12))
                    plt.imshow(im[:, :, [2,1,0]])
                a = a + 2
    
    
    
            # if count == 20:
            #   break
        print(count)
    
    
    if __name__ == '__main__':
        videos_path = 'qq01.mp4'
        frames_save_path = 'D:/Walker/testv01/zhen/'
        time_interval = 2  # 隔一帧保存一次
        video2frame(videos_path, frames_save_path, time_interval)

    import cv2
    import os
    import numpy as np
    from PIL import Image


    def frame2video(im_dir, video_dir, fps):
    im_list = os.listdir(im_dir)
    im_list.sort(key=lambda x: int(x.replace("frame", "").split('.')[0])) # 最好再看看图片顺序对不
    img = Image.open(os.path.join(im_dir, im_list[0]))
    img_size = img.size # 获得图片分辨率,im_dir文件夹下的图片分辨率需要一致

    # fourcc = cv2.cv.CV_FOURCC('M','J','P','G') #opencv版本是2
    fourcc = cv2.VideoWriter_fourcc(*'XVID') # opencv版本是3
    videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
    # count = 1
    for i in im_list:
    im_name = os.path.join(im_dir + i)
    frame = cv2.imdecode(np.fromfile(im_name, dtype=np.uint8), -1)
    videoWriter.write(frame)
    # count+=1
    # if (count == 200):
    # print(im_name)
    # break
    videoWriter.release()
    print('finish')


    if __name__ == '__main__':
    im_dir = 'D:/Walker/testv01/zhen/' # 帧存放路径
    video_dir = 'D:/Walker/testv01/video/suc.avi' # 合成视频存放的路径
    fps = 20 # 帧率,每秒钟帧数越多,所显示的动作就会越流畅
    frame2video(im_dir, video_dir, fps)

    这样就能分割视频成指定的帧,然后进行每个帧中的行人以及其他物品的识别了。

     最后再将每一帧的图片进行组合就成为视频了。

     

     

  • 相关阅读:
    高仿中国银行ATM系统
    第二次冲刺2
    第二轮冲刺1
    本日进度7
    本日进度6
    本日进度5
    本日进度4
    本日进度3
    本日进度2
    本日进度
  • 原文地址:https://www.cnblogs.com/2940500426yingxin/p/14822860.html
Copyright © 2011-2022 走看看