yolov8 pycharm en cours d'exécution (prédire, sans ligne de commande)

yolov8 ne le présentera pas, voir la page d'accueil

Parlons de courir avec pycharm ici. Page de segment
de référence de code

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n-seg.pt')  # load an official model

# Predict with the model
results = model('test_img.jpg')  # predict on an image

Sans la ligne de commande, le résultat n'affichera que l'heure de prédiction et quelques coordonnées.
L'image ne s'affiche pas et l'image de sortie n'est pas enregistrée.

insérez la description de l'image ici

Les données dans les résultats sont les suivantes :

insérez la description de l'image ici

Dois-je dessiner la boîte moi-même ?
Vous n'avez pas besoin d'écrire vous-même le post-traitement, il est fourni avec le modèle, découvrons-le maintenant.

Dans ultralytics/yolo/engine/predictor.pyle BasePredictor, vous pouvez voir le processus de prédiction.
Vous pouvez voir que si args.save ou args.show est True, le résultat sera enregistré, et si
args.show et self.plotted_img sont True en même temps, le résultat sera affiché.

S'il est exécuté avec la ligne de commande, show et save sont définis directement, alors où est défini pycharm ?
(Le réglage dans les paramètres de Run->Edit Configurations show=True save=Trueest inutile).

class BasePredictor:
    def stream_inference(self, source=None, model=None):
    ...
        for batch in self.dataset:
            ...
            # Preprocess
            with profilers[0]:
                im = self.preprocess(im0s)

            # Inference
            with profilers[1]:
                preds = self.model(im, augment=self.args.augment, visualize=visualize)

            # Postprocess
            with profilers[2]:
                self.results = self.postprocess(preds, im, im0s)
            self.run_callbacks('on_predict_postprocess_end')

            # Visualize, save, write results
           ...
                if self.args.verbose or self.args.save or self.args.save_txt or self.args.show:
                    s += self.write_results(i, self.results, (p, im, im0))

                if self.args.show and self.plotted_img is not None:
                    self.show(p)

                if self.args.save and self.plotted_img is not None:
                    self.save_preds(vid_cap, i, str(self.save_dir / p.name))

Regardez d'abord comment définir self.ploted_img,
vous pouvez voir que tant que show ou save est True, ce n'est pas None.Le
problème suivant est simplifié pour savoir où définir show et save.

    def write_results(self, idx, results, batch):
        if self.args.save or self.args.show:  # Add bbox to image
            ...
            self.plotted_img = result.plot(**plot_args)

Dans le get_cfg ci-dessous, un fichier cfg a été trouvé,

def get_cfg(cfg: Union[str, Path, Dict, SimpleNamespace] = DEFAULT_CFG_DICT, overrides: Dict = None):
    """
    Load and merge configuration data from a file or dictionary.

    Args:
        cfg (str) or (Path) or (Dict) or (SimpleNamespace): Configuration data.
        overrides (str) or (Dict), optional: Overrides in the form of a file name or a dictionary. Default is None.

    Returns:
        (SimpleNamespace): Training arguments namespace.
    """
    cfg = cfg2dict(cfg)

Localisez le fichier de paramètres en tant que ultralytics/yolo/cfg/default.yaml.
Changez le show à l'intérieur en True.
Il passera la fonction show.

    def show(self, p):
        """Display an image in a window using OpenCV imshow()."""
        im0 = self.plotted_img
        if platform.system() == 'Linux' and p not in self.windows:
            self.windows.append(p)
            cv2.namedWindow(str(p), cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)  # allow window resize (Linux)
            cv2.resizeWindow(str(p), im0.shape[1], im0.shape[0])
        cv2.imshow(str(p), im0)
        cv2.waitKey(500 if self.batch[3].startswith('image') else 1)  # 1 millisecond

Dans la fonction, l'image ne sera affichée que pendant 0,5 s et pour la vidéo, chaque image sera affichée pendant 1 ms, c'est-à-dire que
l'affichage disparaîtra en un instant.
Vous pouvez modifier l'heure dans la fonction d'affichage ou enregistrer l'image.
Mais maintenant, je ne veux pas changer la fonction show, je veux le résoudre via args.save.

default.yamlIl y a déjà enregistrer sous True, mais l'image n'est toujours pas enregistrée.
J'ai donc trouvé la variable cfg et j'ai vu que save est toujours False, elle a dû être écrasée quelque part.

class YOLO:
    def predict(self, source=None, stream=False, **kwargs):
        if not is_cli:
            overrides['save'] = kwargs.get('save', False)  # do not save by default if called in Python

Il est clair ici que s'il n'est pas exécuté par la ligne de commande, il ne sera pas enregistré, et si save est défini sur True, il sera également changé en False. Changez ceci ici, et il y aura un nouveau dossier exécuté
lorsque en cours d'exécution, avec des images enregistrées en elle.

Veuillez ajouter une description de l'image

Je suppose que tu aimes

Origine blog.csdn.net/level_code/article/details/130708147
conseillé
Classement