Python:当和上一个附加项的差异很小时,从列表中删除该项

Python:当和上一个附加项的差异很小时,从列表中删除该项,python,artificial-intelligence,Python,Artificial Intelligence,我正在创建一个图像流行算法,将视频%.mp4剪切成帧。在人工智能的帮助下,程序检查哪些帧可能显示最漂亮的图像;结果以“分数”表示 这是可行的,但我遇到了一个问题。因为视频中的某些帧非常相似,所以我有许多(几乎)相同分数的帧 在最终结果中,将生成一个带有[分数,帧编号]的列表。例如,我想,如果列表中的3个项目几乎相同的帧编号,因此(几乎)相同的分数,我只保留列表中分数最高的帧编号,以便删除重复项 它与此行有关:result.append((predict(pil_image,model),name

我正在创建一个图像流行算法,将视频%.mp4剪切成帧。在人工智能的帮助下,程序检查哪些帧可能显示最漂亮的图像;结果以“分数”表示

这是可行的,但我遇到了一个问题。因为视频中的某些帧非常相似,所以我有许多(几乎)相同分数的帧

在最终结果中,将生成一个带有[分数,帧编号]的列表。例如,我想,如果列表中的3个项目几乎相同的帧编号,因此(几乎)相同的分数,我只保留列表中分数最高的帧编号,以便删除重复项

它与此行有关:
result.append((predict(pil_image,model),name))

代码如下:

import os
import torch
import torchvision.models
import torchvision.transforms as transforms
from PIL import Image
import json
import cv2


def prepare_image(image):
    if image.mode != 'RGB':
        image = image.convert("RGB")
    Transform = transforms.Compose([
        transforms.Resize([224, 224]),
        transforms.ToTensor(),
    ])
    image = Transform(image)
    image = image.unsqueeze(0)
    return image


def predict(image, model):
    image = prepare_image(image)
    with torch.no_grad():
        preds = model(image)
    score = preds.detach().numpy().item()
    print("Picture score: " + str(round(score, 2)) + "  |  frames left: " +str(framesToDo))
    return str(round(score, 2))

if __name__ == '__main__':
    model = torchvision.models.resnet50()
    model.fc = torch.nn.Linear(in_features=2048, out_features=1)
    model.load_state_dict(torch.load('model/model-resnet50.pth', map_location=torch.device('cpu')))
    model.eval()

    result = []

    # In de folder videos are videos saved with the name of 1 until 23
    for i in range(1, 23):
        vidcap = cv2.VideoCapture('./video/' + str(i) + '.mp4')
        succes, vidcap_image = vidcap.read()
        count = 0
        framestep = 500 #for Stackoverflow example
        framesToDo = vidcap.get(cv2.CAP_PROP_FRAME_COUNT)


        # while succes and count < max_frames
        while succes and count < int(vidcap.get(cv2.CAP_PROP_FRAME_COUNT)): #maximum amount of frames in video
            name = str(i) + '_' + str(count)
            cv2.imwrite("./frames_saved/" + 'vid' + '_' + name + ".jpg", vidcap_image)  # save frame as jpg image
            count += framestep # 500 frames further
            framesToDo = framesToDo - framestep

            cv2_image = cv2.cvtColor(vidcap_image, cv2.COLOR_BGR2RGB)
            pil_image = Image.fromarray(cv2_image)
            result.append((predict(pil_image, model), name))
            succes, vidcap_image = vidcap.read()
    result.sort(reverse=False)
    print(result)

    with open('result.json', 'w') as filehandle:
        filehandle.write(json.dumps(result))````



导入操作系统
进口火炬
导入torchvision.models
导入torchvision.transforms作为变换
从PIL导入图像
导入json
进口cv2
def准备_图像(图像):
如果image.mode!='RGB':
image=image.convert(“RGB”)
Transform=transforms.Compose([
transforms.Resize([224224,224]),
transforms.ToTensor(),
])
图像=变换(图像)
image=image.unsqueze(0)
返回图像
def预测(图像、模型):
图像=准备图像(图像)
使用手电筒。无梯度()
preds=模型(图)
分数=preds.detach().numpy().item()
打印(“图片分数:+str(圆形(分数,2))+”|左边框:+str(框斯托多))
返回str(第二轮(得分2))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
model=torchvision.models.resnet50()
model.fc=torch.nn.Linear(输入特性=2048,输出特性=1)
model.load\u state\u dict(torch.load('model/model-resnet50.pth',map\u location=torch.device('cpu'))
model.eval()
结果=[]
#de文件夹中的视频是以名称1保存到23的视频
对于范围(1,23)内的i:
vidcap=cv2.VideoCapture('./video/'+str(i)+'.mp4')
成功,vidcap_image=vidcap.read()
计数=0
framestep=500#用于堆栈溢出示例
framesToDo=vidcap.get(cv2.CAP\u PROP\u FRAME\u COUNT)
#而成功和计数<最大帧数
而成功和计数
由于没有可复制的示例,您可以对此进行调整以解决问题,这将分析每个帧数据并跳过不必要的帧数据,更新最佳值并附加新值

MAX\u FRAME\u NUMBER\u DIFF=60
最大得分差异=0.5
当前帧=计数
当前_分数=预测(pil_图像,模型)
数据=(当前_分数,当前_帧)
如果没有结果:
结果。追加(数据)
其他:
最后一个分数,最后一帧=结果[-1]
_相似_帧=当前_帧-最后一个_帧最后一个_分数

_score_way_better=当前_分数-最后一个_分数几乎相同的帧数和分数的阈值是多少?假设帧数不同,最大值为60,最大值为0.50欢迎使用StackOverflow。看见您的请求仅处理列表中的清理数据,但您发布的代码需要
torch
json
csv
和图像处理。