From 39173f831a31dbd4358460fb8707e17b2c4740af Mon Sep 17 00:00:00 2001 From: iulusoy Date: Wed, 12 Jun 2024 07:54:34 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20ssciwr/A?= =?UTF-8?q?MMICO@894ad0938b6b95ebca8ecf0c5487adbfc94fbe84=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/doctrees/ammico.doctree | Bin 514830 -> 521828 bytes build/doctrees/environment.pickle | Bin 1175128 -> 1193552 bytes .../notebooks/DemoNotebook_ammico.ipynb | 40 +++++++++++++--- .../notebooks/DemoNotebook_ammico.doctree | Bin 170162 -> 176368 bytes .../notebooks/DemoNotebook_ammico.ipynb.txt | 40 +++++++++++++--- build/html/ammico.html | 14 +++++- build/html/genindex.html | 2 + build/html/modules.html | 1 + build/html/notebooks/DemoNotebook_ammico.html | 44 ++++++++++++++---- .../html/notebooks/DemoNotebook_ammico.ipynb | 40 +++++++++++++--- build/html/objects.inv | Bin 4433 -> 4485 bytes build/html/searchindex.js | 2 +- source/notebooks/DemoNotebook_ammico.ipynb | 40 +++++++++++++--- 13 files changed, 184 insertions(+), 39 deletions(-) diff --git a/build/doctrees/ammico.doctree b/build/doctrees/ammico.doctree index 029dc39d9b9ee26880920775000d82d77be633fa..fd64ab6b1e658826d3d48df5a349081d5af0b0ab 100644 GIT binary patch delta 31912 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 CW^GLX delta 29662 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 Iaa6|t0r++|EdT%j diff --git a/build/doctrees/environment.pickle b/build/doctrees/environment.pickle index 62d6798c5b7dcb8d8fa5cb28bbd476b6cef31010..578d7ae4dbdc6a56b23247a5c770b8fc0f5d0a13 100644 GIT binary patch delta 149375 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 delta 140556 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 UVql9)NAS%!K3Fe=YL}k)e~lnzEdT%j diff --git a/build/doctrees/nbsphinx/notebooks/DemoNotebook_ammico.ipynb b/build/doctrees/nbsphinx/notebooks/DemoNotebook_ammico.ipynb index 292a93d..f6a53da 100644 --- a/build/doctrees/nbsphinx/notebooks/DemoNotebook_ammico.ipynb +++ b/build/doctrees/nbsphinx/notebooks/DemoNotebook_ammico.ipynb @@ -166,7 +166,7 @@ "source": [ "image_dict = ammico.find_files(\n", " # path=\"/content/drive/MyDrive/misinformation-data/\",\n", - " path=data_path.as_posix(),\n", + " path=str(data_path),\n", " limit=15,\n", ")" ] @@ -177,7 +177,30 @@ "source": [ "## Step 2: Inspect the input files using the graphical user interface\n", "A Dash user interface is to select the most suitable options for the analysis, before running a complete analysis on the whole data set. The options for each detector module are explained below in the corresponding sections; for example, different models can be selected that will provide slightly different results. This way, the user can interactively explore which settings provide the most accurate results. In the interface, the nested `image_dict` is passed through the `AnalysisExplorer` class. The interface is run on a specific port which is passed using the `port` keyword; if a port is already in use, it will return an error message, in which case the user should select a different port number. \n", - "The interface opens a dash app inside the Jupyter Notebook and allows selection of the input file in the top left dropdown menu, as well as selection of the detector type in the top right, with options for each detector type as explained below. The output of the detector is shown directly on the right next to the image. This way, the user can directly inspect how updating the options for each detector changes the computed results, and find the best settings for a production run." + "The interface opens a dash app inside the Jupyter Notebook and allows selection of the input file in the top left dropdown menu, as well as selection of the detector type in the top right, with options for each detector type as explained below. The output of the detector is shown directly on the right next to the image. This way, the user can directly inspect how updating the options for each detector changes the computed results, and find the best settings for a production run.\n", + "\n", + "### Ethical disclosure statement\n", + "\n", + "If you want to run an analysis using the EmotionDetector detector type, you have first have to respond to an ethical disclosure statement. This disclosure statement ensures that you only use the full capabilities of the EmotionDetector after you have been made aware of its shortcomings.\n", + "\n", + "For this, answer \"yes\" or \"no\" to the below prompt. This will set an environment variable with the name given as in `accept_disclosure`. To re-run the disclosure prompt, unset the variable by uncommenting the line `os.environ.pop(accept_disclosure, None)`. To permanently set this envorinment variable, add it to your shell via your `.profile` or `.bashr` file.\n", + "\n", + "If the disclosure statement is accepted, the EmotionDetector will perform age, gender and race/ethnicity classification dependend on the provided thresholds. If the disclosure is rejected, only the presence of faces and emotion (if not wearing a mask) is detected." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# respond to the disclosure statement\n", + "# this will set an environment variable for you\n", + "# if you do not want to re-accept the disclosure every time, you can set this environment variable in your shell\n", + "# to re-set the environment variable, uncomment the below line\n", + "accept_disclosure = \"DISCLOSURE_AMMICO\"\n", + "# os.environ.pop(accept_disclosure, None)\n", + "_ = ammico.ethical_disclosure(accept_disclosure=accept_disclosure)" ] }, { @@ -822,7 +845,7 @@ "metadata": {}, "source": [ "## Detection of faces and facial expression analysis\n", - "Faces and facial expressions are detected and analyzed using the `EmotionDetector` class from the `faces` module. Initially, it is detected if faces are present on the image using RetinaFace, followed by analysis if face masks are worn (Face-Mask-Detection). The detection of age, gender, race, and emotions is carried out with deepface.\n", + "Faces and facial expressions are detected and analyzed using the `EmotionDetector` class from the `faces` module. Initially, it is detected if faces are present on the image using RetinaFace, followed by analysis if face masks are worn (Face-Mask-Detection). The detection of age, gender, race, and emotions is carried out with deepface, but only if the disclosure statement has been accepted (see above).\n", "\n", "\n", "\n", @@ -832,10 +855,11 @@ "\n", "From the seven facial expressions, an overall dominating emotion category is identified: negative, positive, or neutral emotion. These are defined with the facial expressions angry, disgust, fear and sad for the negative category, happy for the positive category, and surprise and neutral for the neutral category.\n", "\n", - "A similar threshold as for the emotion recognition is set for the race detection, `race_threshold`, with the default set to 50% so that a confidence for the race above 0.5 only will return a value in the analysis. \n", + "A similar threshold as for the emotion recognition is set for the race/ethnicity, gender and age detection, `race_threshold`, `gender_threshold`, `age_threshold`, with the default set to 50% so that a confidence for the race above 0.5 only will return a value in the analysis. \n", "\n", - "Summarizing, the face detection is carried out using the following method call and keywords, where `emotion_threshold` and \n", - "`race_threshold` are optional:" + "You may also pass the name of the environment variable that determines if you accept or reject the ethical disclosure statement. By default, the variable is named `DISCLOSURE_AMMICO`.\n", + "\n", + "Summarizing, the face detection is carried out using the following method call and keywords, where `emotion_threshold`, `race_threshold`, `gender_threshold`, `age_threshold` are optional:" ] }, { @@ -845,7 +869,9 @@ "outputs": [], "source": [ "for key in image_dict.keys():\n", - " image_dict[key] = ammico.EmotionDetector(image_dict[key], emotion_threshold=50, race_threshold=50).analyse_image()" + " image_dict[key] = ammico.EmotionDetector(image_dict[key], emotion_threshold=50, race_threshold=50,\n", + " gender_threshold=50, age_threshold=50, \n", + " accept_disclosure=\"DISCLOSURE_AMMICO\").analyse_image()" ] }, { diff --git a/build/doctrees/notebooks/DemoNotebook_ammico.doctree b/build/doctrees/notebooks/DemoNotebook_ammico.doctree index 20ea49835b5b72905b4ebb1afbdb1d421c52ca55..46d16f2b52a79062cb1a4e2042c62cb75e01569b 100644 GIT binary patch delta 21579 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 aNv^ckXXKNdQLWF)r?dICr(eQ*;Qs-%$$Lux diff --git a/build/html/_sources/notebooks/DemoNotebook_ammico.ipynb.txt b/build/html/_sources/notebooks/DemoNotebook_ammico.ipynb.txt index 292a93d..f6a53da 100644 --- a/build/html/_sources/notebooks/DemoNotebook_ammico.ipynb.txt +++ b/build/html/_sources/notebooks/DemoNotebook_ammico.ipynb.txt @@ -166,7 +166,7 @@ "source": [ "image_dict = ammico.find_files(\n", " # path=\"/content/drive/MyDrive/misinformation-data/\",\n", - " path=data_path.as_posix(),\n", + " path=str(data_path),\n", " limit=15,\n", ")" ] @@ -177,7 +177,30 @@ "source": [ "## Step 2: Inspect the input files using the graphical user interface\n", "A Dash user interface is to select the most suitable options for the analysis, before running a complete analysis on the whole data set. The options for each detector module are explained below in the corresponding sections; for example, different models can be selected that will provide slightly different results. This way, the user can interactively explore which settings provide the most accurate results. In the interface, the nested `image_dict` is passed through the `AnalysisExplorer` class. The interface is run on a specific port which is passed using the `port` keyword; if a port is already in use, it will return an error message, in which case the user should select a different port number. \n", - "The interface opens a dash app inside the Jupyter Notebook and allows selection of the input file in the top left dropdown menu, as well as selection of the detector type in the top right, with options for each detector type as explained below. The output of the detector is shown directly on the right next to the image. This way, the user can directly inspect how updating the options for each detector changes the computed results, and find the best settings for a production run." + "The interface opens a dash app inside the Jupyter Notebook and allows selection of the input file in the top left dropdown menu, as well as selection of the detector type in the top right, with options for each detector type as explained below. The output of the detector is shown directly on the right next to the image. This way, the user can directly inspect how updating the options for each detector changes the computed results, and find the best settings for a production run.\n", + "\n", + "### Ethical disclosure statement\n", + "\n", + "If you want to run an analysis using the EmotionDetector detector type, you have first have to respond to an ethical disclosure statement. This disclosure statement ensures that you only use the full capabilities of the EmotionDetector after you have been made aware of its shortcomings.\n", + "\n", + "For this, answer \"yes\" or \"no\" to the below prompt. This will set an environment variable with the name given as in `accept_disclosure`. To re-run the disclosure prompt, unset the variable by uncommenting the line `os.environ.pop(accept_disclosure, None)`. To permanently set this envorinment variable, add it to your shell via your `.profile` or `.bashr` file.\n", + "\n", + "If the disclosure statement is accepted, the EmotionDetector will perform age, gender and race/ethnicity classification dependend on the provided thresholds. If the disclosure is rejected, only the presence of faces and emotion (if not wearing a mask) is detected." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# respond to the disclosure statement\n", + "# this will set an environment variable for you\n", + "# if you do not want to re-accept the disclosure every time, you can set this environment variable in your shell\n", + "# to re-set the environment variable, uncomment the below line\n", + "accept_disclosure = \"DISCLOSURE_AMMICO\"\n", + "# os.environ.pop(accept_disclosure, None)\n", + "_ = ammico.ethical_disclosure(accept_disclosure=accept_disclosure)" ] }, { @@ -822,7 +845,7 @@ "metadata": {}, "source": [ "## Detection of faces and facial expression analysis\n", - "Faces and facial expressions are detected and analyzed using the `EmotionDetector` class from the `faces` module. Initially, it is detected if faces are present on the image using RetinaFace, followed by analysis if face masks are worn (Face-Mask-Detection). The detection of age, gender, race, and emotions is carried out with deepface.\n", + "Faces and facial expressions are detected and analyzed using the `EmotionDetector` class from the `faces` module. Initially, it is detected if faces are present on the image using RetinaFace, followed by analysis if face masks are worn (Face-Mask-Detection). The detection of age, gender, race, and emotions is carried out with deepface, but only if the disclosure statement has been accepted (see above).\n", "\n", "\n", "\n", @@ -832,10 +855,11 @@ "\n", "From the seven facial expressions, an overall dominating emotion category is identified: negative, positive, or neutral emotion. These are defined with the facial expressions angry, disgust, fear and sad for the negative category, happy for the positive category, and surprise and neutral for the neutral category.\n", "\n", - "A similar threshold as for the emotion recognition is set for the race detection, `race_threshold`, with the default set to 50% so that a confidence for the race above 0.5 only will return a value in the analysis. \n", + "A similar threshold as for the emotion recognition is set for the race/ethnicity, gender and age detection, `race_threshold`, `gender_threshold`, `age_threshold`, with the default set to 50% so that a confidence for the race above 0.5 only will return a value in the analysis. \n", "\n", - "Summarizing, the face detection is carried out using the following method call and keywords, where `emotion_threshold` and \n", - "`race_threshold` are optional:" + "You may also pass the name of the environment variable that determines if you accept or reject the ethical disclosure statement. By default, the variable is named `DISCLOSURE_AMMICO`.\n", + "\n", + "Summarizing, the face detection is carried out using the following method call and keywords, where `emotion_threshold`, `race_threshold`, `gender_threshold`, `age_threshold` are optional:" ] }, { @@ -845,7 +869,9 @@ "outputs": [], "source": [ "for key in image_dict.keys():\n", - " image_dict[key] = ammico.EmotionDetector(image_dict[key], emotion_threshold=50, race_threshold=50).analyse_image()" + " image_dict[key] = ammico.EmotionDetector(image_dict[key], emotion_threshold=50, race_threshold=50,\n", + " gender_threshold=50, age_threshold=50, \n", + " accept_disclosure=\"DISCLOSURE_AMMICO\").analyse_image()" ] }, { diff --git a/build/html/ammico.html b/build/html/ammico.html index af6f9aa..a9d88fa 100644 --- a/build/html/ammico.html +++ b/build/html/ammico.html @@ -153,6 +153,7 @@
  • deepface_symlink_processor()
  • +
  • ethical_disclosure()
  • color_analysis module
      @@ -1187,7 +1188,7 @@

      faces module

      -class faces.EmotionDetector(subdict: dict, emotion_threshold: float = 50.0, race_threshold: float = 50.0)
      +class faces.EmotionDetector(subdict: dict, emotion_threshold: float = 50.0, race_threshold: float = 50.0, gender_threshold: float = 50.0, age_threshold: float = 50.0, accept_disclosure: str = 'DISCLOSURE_AMMICO')

      Bases: AnalysisMethod

      @@ -1271,6 +1272,17 @@ faces.deepface_symlink_processor(name)
      +
      +
      +faces.ethical_disclosure(accept_disclosure: str = 'DISCLOSURE_AMMICO')
      +

      Asks the user to accept the ethical disclosure.

      +
      +
      Parameters:
      +

      accept_disclosure (str) – The name of the disclosure variable (default: “DISCLOSURE_AMMICO”).

      +
      +
      +
      +

      color_analysis module

      diff --git a/build/html/genindex.html b/build/html/genindex.html index 0fd54ad..fbd88b2 100644 --- a/build/html/genindex.html +++ b/build/html/genindex.html @@ -218,6 +218,8 @@
    • deepface_symlink_processor()
    • +
    • ethical_disclosure()
    • color_analysis module
        diff --git a/build/html/notebooks/DemoNotebook_ammico.html b/build/html/notebooks/DemoNotebook_ammico.html index 5bd14b0..2b55316 100644 --- a/build/html/notebooks/DemoNotebook_ammico.html +++ b/build/html/notebooks/DemoNotebook_ammico.html @@ -60,7 +60,10 @@
      • Step 0: Create and set a Google Cloud Vision Key
      • Step 1: Read your data into AMMICO
          -
        • Step 2: Inspect the input files using the graphical user interface
        • +
        • Step 2: Inspect the input files using the graphical user interface +
        • Step 3: Analyze all images
        • Step 4: Convert analysis output to pandas dataframe and write csv
        • Read in a csv file containing text and translating/analysing the text
        • @@ -257,7 +260,7 @@ tf.ones([2, 2])
          image_dict = ammico.find_files(
               # path="/content/drive/MyDrive/misinformation-data/",
          -    path=data_path.as_posix(),
          +    path=str(data_path),
               limit=15,
           )
           
          @@ -268,6 +271,25 @@ tf.ones([2, 2])

          A Dash user interface is to select the most suitable options for the analysis, before running a complete analysis on the whole data set. The options for each detector module are explained below in the corresponding sections; for example, different models can be selected that will provide slightly different results. This way, the user can interactively explore which settings provide the most accurate results. In the interface, the nested image_dict is passed through the AnalysisExplorer class. The interface is run on a specific port which is passed using the port keyword; if a port is already in use, it will return an error message, in which case the user should select a different port number. The interface opens a dash app inside the Jupyter Notebook and allows selection of the input file in the top left dropdown menu, as well as selection of the detector type in the top right, with options for each detector type as explained below. The output of the detector is shown directly on the right next to the image. This way, the user can directly inspect how updating the options for each detector changes the computed results, and find the best settings for a production run.

          +
          +

          Ethical disclosure statement

          +

          If you want to run an analysis using the EmotionDetector detector type, you have first have to respond to an ethical disclosure statement. This disclosure statement ensures that you only use the full capabilities of the EmotionDetector after you have been made aware of its shortcomings.

          +

          For this, answer “yes” or “no” to the below prompt. This will set an environment variable with the name given as in accept_disclosure. To re-run the disclosure prompt, unset the variable by uncommenting the line os.environ.pop(accept_disclosure, None). To permanently set this envorinment variable, add it to your shell via your .profile or .bashr file.

          +

          If the disclosure statement is accepted, the EmotionDetector will perform age, gender and race/ethnicity classification dependend on the provided thresholds. If the disclosure is rejected, only the presence of faces and emotion (if not wearing a mask) is detected.

          +
          +
          [ ]:
          +
          +
          +
          # respond to the disclosure statement
          +# this will set an environment variable for you
          +# if you do not want to re-accept the disclosure every time, you can set this environment variable in your shell
          +# to re-set the environment variable, uncomment the below line
          +accept_disclosure = "DISCLOSURE_AMMICO"
          +# os.environ.pop(accept_disclosure, None)
          +_ = ammico.ethical_disclosure(accept_disclosure=accept_disclosure)
          +
          +
          +
          [ ]:
           
          @@ -278,6 +300,7 @@ directly on the right next to the image. This way, the user can directly inspect
          +

          Step 3: Analyze all images

          The analysis can be run in production on all images in the data set. Depending on the size of the data set and the computing resources available, this can take some time.

          @@ -470,7 +493,7 @@ directly on the right next to the image. This way, the user can directly inspect

          The detector modules

          The different detector modules with their options are explained in more detail in this section. ## Text detector Text on the images can be extracted using the TextDetector class (text module). The text is initally extracted using the Google Cloud Vision API and then translated into English with googletrans. The translated text is cleaned of whitespace, linebreaks, and numbers using Python syntax and spaCy.

          -

          0c75cc0bcb7d4081982b65bb456f1ab4

          +

          f1c211721e034ae7ac3eadfd8c20e9c6

          The user can set if the text should be further summarized, and analyzed for sentiment and named entity recognition, by setting the keyword analyse_text to True (the default is False). If set, the transformers pipeline is used for each of these tasks, with the default models as of 03/2023. Other models can be selected by setting the optional keyword model_names to a list of selected models, on for each task: model_names=["sshleifer/distilbart-cnn-12-6", "distilbert-base-uncased-finetuned-sst-2-english", "dbmdz/bert-large-cased-finetuned-conll03-english"] for summary, sentiment, and ner. To be even more specific, revision numbers can also be selected by specifying the optional keyword revision_numbers to a list of revision numbers for each model, for example revision_numbers=["a4f8f3e", "af0f99b", "f2482bf"].

          Please note that for the Google Cloud Vision API (the TextDetector class) you need to set a key in order to process the images. This key is ideally set as an environment variable using for example

          @@ -552,7 +575,7 @@ directly on the right next to the image. This way, the user can directly inspect

          Image summary and query

          The SummaryDetector can be used to generate image captions (summary) as well as visual question answering (VQA).

          -

          df3e5d6617b3447eb877e276342bc93b

          +

          7b53d91a7e9d46169d6f7b53c3c99fda

          This module is based on the LAVIS library. Since the models can be quite large, an initial object is created which will load the necessary models into RAM/VRAM and then use them in the analysis. The user can specify the type of analysis to be performed using the analysis_type keyword. Setting it to summary will generate a caption (summary), questions will prepare answers (VQA) to a list of questions as set by the user, summary_and_questions will do both. Note that the desired analysis type needs to be set here in the initialization of the detector object, and not when running the analysis for each image; the same holds true for the selected model.

          The implemented models are listed below.

          @@ -804,22 +827,25 @@ directly on the right next to the image. This way, the user can directly inspect

          Detection of faces and facial expression analysis

          -

          Faces and facial expressions are detected and analyzed using the EmotionDetector class from the faces module. Initially, it is detected if faces are present on the image using RetinaFace, followed by analysis if face masks are worn (Face-Mask-Detection). The detection of age, gender, race, and emotions is carried out with deepface.

          -

          e4ff58bce9a849e1b3cd5e3b9b08a5ba

          +

          Faces and facial expressions are detected and analyzed using the EmotionDetector class from the faces module. Initially, it is detected if faces are present on the image using RetinaFace, followed by analysis if face masks are worn (Face-Mask-Detection). The detection of age, gender, race, and emotions is carried out with deepface, but only if the disclosure statement has been accepted (see above).

          +

          01966d367ad4488991e78ad7c9af8c4f

          Depending on the features found on the image, the face detection module returns a different analysis content: If no faces are found on the image, all further steps are skipped and the result "face": "No", "multiple_faces": "No", "no_faces": 0, "wears_mask": ["No"], "age": [None], "gender": [None], "race": [None], "emotion": [None], "emotion (category)": [None] is returned. If one or several faces are found, up to three faces are analyzed if they are partially concealed by a face mask. If yes, only age and gender are detected; if no, also race, emotion, and dominant emotion are detected. In case of the latter, the output could look like this: "face": "Yes", "multiple_faces": "Yes", "no_faces": 2, "wears_mask": ["No", "No"], "age": [27, 28], "gender": ["Man", "Man"], "race": ["asian", None], "emotion": ["angry", "neutral"], "emotion (category)": ["Negative", "Neutral"], where for the two faces that are detected (given by no_faces), some of the values are returned as a list with the first item for the first (largest) face and the second item for the second (smaller) face (for example, "emotion" returns a list ["angry", "neutral"] signifying the first face expressing anger, and the second face having a neutral expression).

          The emotion detection reports the seven facial expressions angry, fear, neutral, sad, disgust, happy and surprise. These emotions are assigned based on the returned confidence of the model (between 0 and 1), with a high confidence signifying a high likelihood of the detected emotion being correct. Emotion recognition is not an easy task, even for a human; therefore, we have added a keyword emotion_threshold signifying the % value above which an emotion is counted as being detected. The default is set to 50%, so that a confidence above 0.5 results in an emotion being assigned. If the confidence is lower, no emotion is assigned.

          From the seven facial expressions, an overall dominating emotion category is identified: negative, positive, or neutral emotion. These are defined with the facial expressions angry, disgust, fear and sad for the negative category, happy for the positive category, and surprise and neutral for the neutral category.

          -

          A similar threshold as for the emotion recognition is set for the race detection, race_threshold, with the default set to 50% so that a confidence for the race above 0.5 only will return a value in the analysis.

          -

          Summarizing, the face detection is carried out using the following method call and keywords, where emotion_threshold and race_threshold are optional:

          +

          A similar threshold as for the emotion recognition is set for the race/ethnicity, gender and age detection, race_threshold, gender_threshold, age_threshold, with the default set to 50% so that a confidence for the race above 0.5 only will return a value in the analysis.

          +

          You may also pass the name of the environment variable that determines if you accept or reject the ethical disclosure statement. By default, the variable is named DISCLOSURE_AMMICO.

          +

          Summarizing, the face detection is carried out using the following method call and keywords, where emotion_threshold, race_threshold, gender_threshold, age_threshold are optional:

          [ ]:
           
          for key in image_dict.keys():
          -    image_dict[key] = ammico.EmotionDetector(image_dict[key], emotion_threshold=50, race_threshold=50).analyse_image()
          +    image_dict[key] = ammico.EmotionDetector(image_dict[key], emotion_threshold=50, race_threshold=50,
          +                                             gender_threshold=50, age_threshold=50,
          +                                             accept_disclosure="DISCLOSURE_AMMICO").analyse_image()
           
          diff --git a/build/html/notebooks/DemoNotebook_ammico.ipynb b/build/html/notebooks/DemoNotebook_ammico.ipynb index 292a93d..f6a53da 100644 --- a/build/html/notebooks/DemoNotebook_ammico.ipynb +++ b/build/html/notebooks/DemoNotebook_ammico.ipynb @@ -166,7 +166,7 @@ "source": [ "image_dict = ammico.find_files(\n", " # path=\"/content/drive/MyDrive/misinformation-data/\",\n", - " path=data_path.as_posix(),\n", + " path=str(data_path),\n", " limit=15,\n", ")" ] @@ -177,7 +177,30 @@ "source": [ "## Step 2: Inspect the input files using the graphical user interface\n", "A Dash user interface is to select the most suitable options for the analysis, before running a complete analysis on the whole data set. The options for each detector module are explained below in the corresponding sections; for example, different models can be selected that will provide slightly different results. This way, the user can interactively explore which settings provide the most accurate results. In the interface, the nested `image_dict` is passed through the `AnalysisExplorer` class. The interface is run on a specific port which is passed using the `port` keyword; if a port is already in use, it will return an error message, in which case the user should select a different port number. \n", - "The interface opens a dash app inside the Jupyter Notebook and allows selection of the input file in the top left dropdown menu, as well as selection of the detector type in the top right, with options for each detector type as explained below. The output of the detector is shown directly on the right next to the image. This way, the user can directly inspect how updating the options for each detector changes the computed results, and find the best settings for a production run." + "The interface opens a dash app inside the Jupyter Notebook and allows selection of the input file in the top left dropdown menu, as well as selection of the detector type in the top right, with options for each detector type as explained below. The output of the detector is shown directly on the right next to the image. This way, the user can directly inspect how updating the options for each detector changes the computed results, and find the best settings for a production run.\n", + "\n", + "### Ethical disclosure statement\n", + "\n", + "If you want to run an analysis using the EmotionDetector detector type, you have first have to respond to an ethical disclosure statement. This disclosure statement ensures that you only use the full capabilities of the EmotionDetector after you have been made aware of its shortcomings.\n", + "\n", + "For this, answer \"yes\" or \"no\" to the below prompt. This will set an environment variable with the name given as in `accept_disclosure`. To re-run the disclosure prompt, unset the variable by uncommenting the line `os.environ.pop(accept_disclosure, None)`. To permanently set this envorinment variable, add it to your shell via your `.profile` or `.bashr` file.\n", + "\n", + "If the disclosure statement is accepted, the EmotionDetector will perform age, gender and race/ethnicity classification dependend on the provided thresholds. If the disclosure is rejected, only the presence of faces and emotion (if not wearing a mask) is detected." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# respond to the disclosure statement\n", + "# this will set an environment variable for you\n", + "# if you do not want to re-accept the disclosure every time, you can set this environment variable in your shell\n", + "# to re-set the environment variable, uncomment the below line\n", + "accept_disclosure = \"DISCLOSURE_AMMICO\"\n", + "# os.environ.pop(accept_disclosure, None)\n", + "_ = ammico.ethical_disclosure(accept_disclosure=accept_disclosure)" ] }, { @@ -822,7 +845,7 @@ "metadata": {}, "source": [ "## Detection of faces and facial expression analysis\n", - "Faces and facial expressions are detected and analyzed using the `EmotionDetector` class from the `faces` module. Initially, it is detected if faces are present on the image using RetinaFace, followed by analysis if face masks are worn (Face-Mask-Detection). The detection of age, gender, race, and emotions is carried out with deepface.\n", + "Faces and facial expressions are detected and analyzed using the `EmotionDetector` class from the `faces` module. Initially, it is detected if faces are present on the image using RetinaFace, followed by analysis if face masks are worn (Face-Mask-Detection). The detection of age, gender, race, and emotions is carried out with deepface, but only if the disclosure statement has been accepted (see above).\n", "\n", "\n", "\n", @@ -832,10 +855,11 @@ "\n", "From the seven facial expressions, an overall dominating emotion category is identified: negative, positive, or neutral emotion. These are defined with the facial expressions angry, disgust, fear and sad for the negative category, happy for the positive category, and surprise and neutral for the neutral category.\n", "\n", - "A similar threshold as for the emotion recognition is set for the race detection, `race_threshold`, with the default set to 50% so that a confidence for the race above 0.5 only will return a value in the analysis. \n", + "A similar threshold as for the emotion recognition is set for the race/ethnicity, gender and age detection, `race_threshold`, `gender_threshold`, `age_threshold`, with the default set to 50% so that a confidence for the race above 0.5 only will return a value in the analysis. \n", "\n", - "Summarizing, the face detection is carried out using the following method call and keywords, where `emotion_threshold` and \n", - "`race_threshold` are optional:" + "You may also pass the name of the environment variable that determines if you accept or reject the ethical disclosure statement. By default, the variable is named `DISCLOSURE_AMMICO`.\n", + "\n", + "Summarizing, the face detection is carried out using the following method call and keywords, where `emotion_threshold`, `race_threshold`, `gender_threshold`, `age_threshold` are optional:" ] }, { @@ -845,7 +869,9 @@ "outputs": [], "source": [ "for key in image_dict.keys():\n", - " image_dict[key] = ammico.EmotionDetector(image_dict[key], emotion_threshold=50, race_threshold=50).analyse_image()" + " image_dict[key] = ammico.EmotionDetector(image_dict[key], emotion_threshold=50, race_threshold=50,\n", + " gender_threshold=50, age_threshold=50, \n", + " accept_disclosure=\"DISCLOSURE_AMMICO\").analyse_image()" ] }, { diff --git a/build/html/objects.inv b/build/html/objects.inv index e5b7eaaed8a041eb759aa62c29d1c8647b9116f7..37ebcdd6ea5cdec249f28376da5aad714f80ac32 100644 GIT binary patch delta 4142 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 delta 4068 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 W?Rb6UBfQ?s`>Zb8nf(tQXi;NJ4gJsn diff --git a/build/html/searchindex.js b/build/html/searchindex.js index 39e7acb..4f3508b 100644 --- a/build/html/searchindex.js +++ b/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"1. First, install tensorflow (https://www.tensorflow.org/install/pip)": [[7, "first-install-tensorflow-https-www-tensorflow-org-install-pip"]], "2. Second, install pytorch": [[7, "second-install-pytorch"]], "3. After we prepared right environment we can install the ammico package": [[7, "after-we-prepared-right-environment-we-can-install-the-ammico-package"]], "AMMICO - AI Media and Misinformation Content Analysis Tool": [[7, "ammico-ai-media-and-misinformation-content-analysis-tool"]], "AMMICO Demonstration Notebook": [[5, "AMMICO-Demonstration-Notebook"]], "AMMICO package modules": [[4, "ammico-package-modules"]], "BLIP2 models": [[5, "BLIP2-models"]], "Color analysis of pictures": [[5, "Color-analysis-of-pictures"]], "Color/hue detection": [[7, "color-hue-detection"]], "Compatibility problems solving": [[7, "compatibility-problems-solving"]], "Content extraction": [[7, "content-extraction"]], "Contents:": [[2, null]], "Crop posts module": [[6, "Crop-posts-module"]], "Cropping of posts": [[7, "cropping-of-posts"]], "Detection of faces and facial expression analysis": [[5, "Detection-of-faces-and-facial-expression-analysis"]], "Emotion recognition": [[7, "emotion-recognition"]], "FAQ": [[7, "faq"]], "Features": [[7, "features"]], "Formulate your search queries": [[5, "Formulate-your-search-queries"]], "Further detector modules": [[5, "Further-detector-modules"]], "Image Multimodal Search": [[5, "Image-Multimodal-Search"]], "Image summary and query": [[5, "Image-summary-and-query"]], "Import the ammico package.": [[5, "Import-the-ammico-package."]], "Improve the search results": [[5, "Improve-the-search-results"]], "Indexing and extracting features from images in selected folder": [[5, "Indexing-and-extracting-features-from-images-in-selected-folder"]], "Indices and tables": [[2, "indices-and-tables"]], "Installation": [[7, "installation"]], "Instructions how to generate and enable a google Cloud Vision API key": [[1, "instructions-how-to-generate-and-enable-a-google-cloud-vision-api-key"], [8, "instructions-how-to-generate-and-enable-a-google-cloud-vision-api-key"]], "License": [[3, "license"]], "Micromamba": [[7, "micromamba"]], "Read in a csv file containing text and translating/analysing the text": [[5, "Read-in-a-csv-file-containing-text-and-translating/analysing-the-text"]], "Save search results to csv": [[5, "Save-search-results-to-csv"]], "Step 0: Create and set a Google Cloud Vision Key": [[5, "Step-0:-Create-and-set-a-Google-Cloud-Vision-Key"]], "Step 1: Read your data into AMMICO": [[5, "Step-1:-Read-your-data-into-AMMICO"]], "Step 2: Inspect the input files using the graphical user interface": [[5, "Step-2:-Inspect-the-input-files-using-the-graphical-user-interface"]], "Step 3: Analyze all images": [[5, "Step-3:-Analyze-all-images"]], "Step 4: Convert analysis output to pandas dataframe and write csv": [[5, "Step-4:-Convert-analysis-output-to-pandas-dataframe-and-write-csv"]], "Text extraction": [[7, "text-extraction"]], "The detector modules": [[5, "The-detector-modules"]], "Usage": [[7, "usage"]], "Use a test dataset": [[5, "Use-a-test-dataset"]], "Welcome to AMMICO\u2019s documentation!": [[2, "welcome-to-ammico-s-documentation"]], "What happens if I don\u2019t have internet access - can I still use ammico?": [[7, "what-happens-if-i-don-t-have-internet-access-can-i-still-use-ammico"]], "What happens to the images that are sent to google Cloud Vision?": [[7, "what-happens-to-the-images-that-are-sent-to-google-cloud-vision"]], "What happens to the text that is sent to google Translate?": [[7, "what-happens-to-the-text-that-is-sent-to-google-translate"]], "Windows": [[7, "windows"]], "color_analysis module": [[0, "module-colors"]], "cropposts module": [[0, "module-cropposts"]], "display module": [[0, "module-display"]], "faces module": [[0, "module-faces"]], "multimodal search module": [[0, "module-multimodal_search"]], "summary module": [[0, "module-summary"]], "text module": [[0, "module-text"]], "utils module": [[0, "module-utils"]]}, "docnames": ["ammico", "create_API_key_link", "index", "license_link", "modules", "notebooks/DemoNotebook_ammico", "notebooks/Example cropposts", "readme_link", "set_up_credentials"], "envversion": {"nbsphinx": 4, "sphinx": 61, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["ammico.rst", "create_API_key_link.md", "index.rst", "license_link.md", "modules.rst", "notebooks/DemoNotebook_ammico.ipynb", "notebooks/Example cropposts.ipynb", "readme_link.md", "set_up_credentials.md"], "indexentries": {"all_allowed_model_types (summary.summarydetector attribute)": [[0, "summary.SummaryDetector.all_allowed_model_types", false]], "allowed_analysis_types (summary.summarydetector attribute)": [[0, "summary.SummaryDetector.allowed_analysis_types", false]], "allowed_model_types (summary.summarydetector attribute)": [[0, "summary.SummaryDetector.allowed_model_types", false]], "allowed_new_model_types (summary.summarydetector attribute)": [[0, "summary.SummaryDetector.allowed_new_model_types", false]], "ammico_prefetch_models() (in module utils)": [[0, "utils.ammico_prefetch_models", false]], "analyse_image() (colors.colordetector method)": [[0, "colors.ColorDetector.analyse_image", false]], "analyse_image() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.analyse_image", false]], "analyse_image() (summary.summarydetector method)": [[0, "summary.SummaryDetector.analyse_image", false]], "analyse_image() (text.textdetector method)": [[0, "text.TextDetector.analyse_image", false]], "analyse_image() (utils.analysismethod method)": [[0, "utils.AnalysisMethod.analyse_image", false]], "analyse_questions() (summary.summarydetector method)": [[0, "summary.SummaryDetector.analyse_questions", false]], "analyse_summary() (summary.summarydetector method)": [[0, "summary.SummaryDetector.analyse_summary", false]], "analyse_topic() (text.postprocesstext method)": [[0, "text.PostprocessText.analyse_topic", false]], "analysisexplorer (class in display)": [[0, "display.AnalysisExplorer", false]], "analysismethod (class in utils)": [[0, "utils.AnalysisMethod", false]], "analyze_single_face() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.analyze_single_face", false]], "append_data_to_dict() (in module utils)": [[0, "utils.append_data_to_dict", false]], "check_for_missing_keys() (in module utils)": [[0, "utils.check_for_missing_keys", false]], "check_model() (summary.summarydetector method)": [[0, "summary.SummaryDetector.check_model", false]], "clean_subdict() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.clean_subdict", false]], "clean_text() (text.textdetector method)": [[0, "text.TextDetector.clean_text", false]], "colordetector (class in colors)": [[0, "colors.ColorDetector", false]], "colors": [[0, "module-colors", false]], "compute_crop_corner() (in module cropposts)": [[0, "cropposts.compute_crop_corner", false]], "compute_gradcam_batch() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.compute_gradcam_batch", false]], "crop_image_from_post() (in module cropposts)": [[0, "cropposts.crop_image_from_post", false]], "crop_media_posts() (in module cropposts)": [[0, "cropposts.crop_media_posts", false]], "crop_posts_from_refs() (in module cropposts)": [[0, "cropposts.crop_posts_from_refs", false]], "crop_posts_image() (in module cropposts)": [[0, "cropposts.crop_posts_image", false]], "cropposts": [[0, "module-cropposts", false]], "deepface_symlink_processor() (in module faces)": [[0, "faces.deepface_symlink_processor", false]], "display": [[0, "module-display", false]], "downloadresource (class in utils)": [[0, "utils.DownloadResource", false]], "draw_matches() (in module cropposts)": [[0, "cropposts.draw_matches", false]], "dump_df() (in module utils)": [[0, "utils.dump_df", false]], "emotiondetector (class in faces)": [[0, "faces.EmotionDetector", false]], "extract_image_features_basic() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.extract_image_features_basic", false]], "extract_image_features_blip2() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.extract_image_features_blip2", false]], "extract_image_features_clip() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.extract_image_features_clip", false]], "extract_text_features() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.extract_text_features", false]], "faces": [[0, "module-faces", false]], "facial_expression_analysis() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.facial_expression_analysis", false]], "find_files() (in module utils)": [[0, "utils.find_files", false]], "get() (utils.downloadresource method)": [[0, "utils.DownloadResource.get", false]], "get_att_map() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.get_att_map", false]], "get_color_table() (in module utils)": [[0, "utils.get_color_table", false]], "get_dataframe() (in module utils)": [[0, "utils.get_dataframe", false]], "get_pathes_from_query() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.get_pathes_from_query", false]], "get_text_df() (text.postprocesstext method)": [[0, "text.PostprocessText.get_text_df", false]], "get_text_dict() (text.postprocesstext method)": [[0, "text.PostprocessText.get_text_dict", false]], "get_text_from_image() (text.textdetector method)": [[0, "text.TextDetector.get_text_from_image", false]], "image_text_match_reordering() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.image_text_match_reordering", false]], "initialize_dict() (in module utils)": [[0, "utils.initialize_dict", false]], "is_interactive() (in module utils)": [[0, "utils.is_interactive", false]], "iterable() (in module utils)": [[0, "utils.iterable", false]], "itm_text_precessing() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.itm_text_precessing", false]], "kp_from_matches() (in module cropposts)": [[0, "cropposts.kp_from_matches", false]], "load_feature_extractor_model_albef() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_albef", false]], "load_feature_extractor_model_blip() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_blip", false]], "load_feature_extractor_model_blip2() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_blip2", false]], "load_feature_extractor_model_clip_base() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_clip_base", false]], "load_feature_extractor_model_clip_vitl14() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_clip_vitl14", false]], "load_feature_extractor_model_clip_vitl14_336() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_clip_vitl14_336", false]], "load_model() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model", false]], "load_model_base() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_base", false]], "load_model_base_blip2_opt_caption_coco_opt67b() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_base_blip2_opt_caption_coco_opt67b", false]], "load_model_base_blip2_opt_pretrain_opt67b() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_base_blip2_opt_pretrain_opt67b", false]], "load_model_blip2_opt_caption_coco_opt27b() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_blip2_opt_caption_coco_opt27b", false]], "load_model_blip2_opt_pretrain_opt27b() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_blip2_opt_pretrain_opt27b", false]], "load_model_blip2_t5_caption_coco_flant5xl() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_blip2_t5_caption_coco_flant5xl", false]], "load_model_blip2_t5_pretrain_flant5xl() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_blip2_t5_pretrain_flant5xl", false]], "load_model_blip2_t5_pretrain_flant5xxl() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_blip2_t5_pretrain_flant5xxl", false]], "load_model_large() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_large", false]], "load_new_model() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_new_model", false]], "load_tensors() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_tensors", false]], "load_vqa_model() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_vqa_model", false]], "matching_points() (in module cropposts)": [[0, "cropposts.matching_points", false]], "module": [[0, "module-colors", false], [0, "module-cropposts", false], [0, "module-display", false], [0, "module-faces", false], [0, "module-multimodal_search", false], [0, "module-summary", false], [0, "module-text", false], [0, "module-utils", false]], "multimodal_device (multimodal_search.multimodalsearch attribute)": [[0, "multimodal_search.MultimodalSearch.multimodal_device", false]], "multimodal_search": [[0, "module-multimodal_search", false]], "multimodal_search() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.multimodal_search", false]], "multimodalsearch (class in multimodal_search)": [[0, "multimodal_search.MultimodalSearch", false]], "parsing_images() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.parsing_images", false]], "paste_image_and_comment() (in module cropposts)": [[0, "cropposts.paste_image_and_comment", false]], "postprocesstext (class in text)": [[0, "text.PostprocessText", false]], "querys_processing() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.querys_processing", false]], "read_and_process_images() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.read_and_process_images", false]], "read_and_process_images_itm() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.read_and_process_images_itm", false]], "read_csv() (text.textanalyzer method)": [[0, "text.TextAnalyzer.read_csv", false]], "read_img() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.read_img", false]], "remove_linebreaks() (text.textdetector method)": [[0, "text.TextDetector.remove_linebreaks", false]], "resize_img() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.resize_img", false]], "resources (utils.downloadresource attribute)": [[0, "utils.DownloadResource.resources", false]], "rgb2name() (colors.colordetector method)": [[0, "colors.ColorDetector.rgb2name", false]], "run_server() (display.analysisexplorer method)": [[0, "display.AnalysisExplorer.run_server", false]], "save_tensors() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.save_tensors", false]], "set_keys() (colors.colordetector method)": [[0, "colors.ColorDetector.set_keys", false]], "set_keys() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.set_keys", false]], "set_keys() (text.textdetector method)": [[0, "text.TextDetector.set_keys", false]], "set_keys() (utils.analysismethod method)": [[0, "utils.AnalysisMethod.set_keys", false]], "show_results() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.show_results", false]], "summary": [[0, "module-summary", false]], "summarydetector (class in summary)": [[0, "summary.SummaryDetector", false]], "text": [[0, "module-text", false]], "text_ner() (text.textdetector method)": [[0, "text.TextDetector.text_ner", false]], "text_sentiment_transformers() (text.textdetector method)": [[0, "text.TextDetector.text_sentiment_transformers", false]], "text_summary() (text.textdetector method)": [[0, "text.TextDetector.text_summary", false]], "textanalyzer (class in text)": [[0, "text.TextAnalyzer", false]], "textdetector (class in text)": [[0, "text.TextDetector", false]], "translate_text() (text.textdetector method)": [[0, "text.TextDetector.translate_text", false]], "update_picture() (display.analysisexplorer method)": [[0, "display.AnalysisExplorer.update_picture", false]], "upload_model_blip2_coco() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.upload_model_blip2_coco", false]], "upload_model_blip_base() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.upload_model_blip_base", false]], "upload_model_blip_large() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.upload_model_blip_large", false]], "utils": [[0, "module-utils", false]], "wears_mask() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.wears_mask", false]]}, "objects": {"": [[0, 0, 0, "-", "colors"], [0, 0, 0, "-", "cropposts"], [0, 0, 0, "-", "display"], [0, 0, 0, "-", "faces"], [0, 0, 0, "-", "multimodal_search"], [0, 0, 0, "-", "summary"], [0, 0, 0, "-", "text"], [0, 0, 0, "-", "utils"]], "colors": [[0, 1, 1, "", "ColorDetector"]], "colors.ColorDetector": [[0, 2, 1, "", "analyse_image"], [0, 2, 1, "", "rgb2name"], [0, 2, 1, "", "set_keys"]], "cropposts": [[0, 3, 1, "", "compute_crop_corner"], [0, 3, 1, "", "crop_image_from_post"], [0, 3, 1, "", "crop_media_posts"], [0, 3, 1, "", "crop_posts_from_refs"], [0, 3, 1, "", "crop_posts_image"], [0, 3, 1, "", "draw_matches"], [0, 3, 1, "", "kp_from_matches"], [0, 3, 1, "", "matching_points"], [0, 3, 1, "", "paste_image_and_comment"]], "display": [[0, 1, 1, "", "AnalysisExplorer"]], "display.AnalysisExplorer": [[0, 2, 1, "", "run_server"], [0, 2, 1, "", "update_picture"]], "faces": [[0, 1, 1, "", "EmotionDetector"], [0, 3, 1, "", "deepface_symlink_processor"]], "faces.EmotionDetector": [[0, 2, 1, "", "analyse_image"], [0, 2, 1, "", "analyze_single_face"], [0, 2, 1, "", "clean_subdict"], [0, 2, 1, "", "facial_expression_analysis"], [0, 2, 1, "", "set_keys"], [0, 2, 1, "", "wears_mask"]], "multimodal_search": [[0, 1, 1, "", "MultimodalSearch"]], "multimodal_search.MultimodalSearch": [[0, 2, 1, "", "compute_gradcam_batch"], [0, 2, 1, "", "extract_image_features_basic"], [0, 2, 1, "", "extract_image_features_blip2"], [0, 2, 1, "", "extract_image_features_clip"], [0, 2, 1, "", "extract_text_features"], [0, 2, 1, "", "get_att_map"], [0, 2, 1, "", "get_pathes_from_query"], [0, 2, 1, "", "image_text_match_reordering"], [0, 2, 1, "", "itm_text_precessing"], [0, 2, 1, "", "load_feature_extractor_model_albef"], [0, 2, 1, "", "load_feature_extractor_model_blip"], [0, 2, 1, "", "load_feature_extractor_model_blip2"], [0, 2, 1, "", "load_feature_extractor_model_clip_base"], [0, 2, 1, "", "load_feature_extractor_model_clip_vitl14"], [0, 2, 1, "", "load_feature_extractor_model_clip_vitl14_336"], [0, 2, 1, "", "load_tensors"], [0, 4, 1, "", "multimodal_device"], [0, 2, 1, "", "multimodal_search"], [0, 2, 1, "", "parsing_images"], [0, 2, 1, "", "querys_processing"], [0, 2, 1, "", "read_and_process_images"], [0, 2, 1, "", "read_and_process_images_itm"], [0, 2, 1, "", "read_img"], [0, 2, 1, "", "resize_img"], [0, 2, 1, "", "save_tensors"], [0, 2, 1, "", "show_results"], [0, 2, 1, "", "upload_model_blip2_coco"], [0, 2, 1, "", "upload_model_blip_base"], [0, 2, 1, "", "upload_model_blip_large"]], "summary": [[0, 1, 1, "", "SummaryDetector"]], "summary.SummaryDetector": [[0, 4, 1, "", "all_allowed_model_types"], [0, 4, 1, "", "allowed_analysis_types"], [0, 4, 1, "", "allowed_model_types"], [0, 4, 1, "", "allowed_new_model_types"], [0, 2, 1, "", "analyse_image"], [0, 2, 1, "", "analyse_questions"], [0, 2, 1, "", "analyse_summary"], [0, 2, 1, "", "check_model"], [0, 2, 1, "", "load_model"], [0, 2, 1, "", "load_model_base"], [0, 2, 1, "", "load_model_base_blip2_opt_caption_coco_opt67b"], [0, 2, 1, "", "load_model_base_blip2_opt_pretrain_opt67b"], [0, 2, 1, "", "load_model_blip2_opt_caption_coco_opt27b"], [0, 2, 1, "", "load_model_blip2_opt_pretrain_opt27b"], [0, 2, 1, "", "load_model_blip2_t5_caption_coco_flant5xl"], [0, 2, 1, "", "load_model_blip2_t5_pretrain_flant5xl"], [0, 2, 1, "", "load_model_blip2_t5_pretrain_flant5xxl"], [0, 2, 1, "", "load_model_large"], [0, 2, 1, "", "load_new_model"], [0, 2, 1, "", "load_vqa_model"]], "text": [[0, 1, 1, "", "PostprocessText"], [0, 1, 1, "", "TextAnalyzer"], [0, 1, 1, "", "TextDetector"]], "text.PostprocessText": [[0, 2, 1, "", "analyse_topic"], [0, 2, 1, "", "get_text_df"], [0, 2, 1, "", "get_text_dict"]], "text.TextAnalyzer": [[0, 2, 1, "", "read_csv"]], "text.TextDetector": [[0, 2, 1, "", "analyse_image"], [0, 2, 1, "", "clean_text"], [0, 2, 1, "", "get_text_from_image"], [0, 2, 1, "", "remove_linebreaks"], [0, 2, 1, "", "set_keys"], [0, 2, 1, "", "text_ner"], [0, 2, 1, "", "text_sentiment_transformers"], [0, 2, 1, "", "text_summary"], [0, 2, 1, "", "translate_text"]], "utils": [[0, 1, 1, "", "AnalysisMethod"], [0, 1, 1, "", "DownloadResource"], [0, 3, 1, "", "ammico_prefetch_models"], [0, 3, 1, "", "append_data_to_dict"], [0, 3, 1, "", "check_for_missing_keys"], [0, 3, 1, "", "dump_df"], [0, 3, 1, "", "find_files"], [0, 3, 1, "", "get_color_table"], [0, 3, 1, "", "get_dataframe"], [0, 3, 1, "", "initialize_dict"], [0, 3, 1, "", "is_interactive"], [0, 3, 1, "", "iterable"]], "utils.AnalysisMethod": [[0, 2, 1, "", "analyse_image"], [0, 2, 1, "", "set_keys"]], "utils.DownloadResource": [[0, 2, 1, "", "get"], [0, 4, 1, "", "resources"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"], "4": ["py", "attribute", "Python attribute"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function", "4": "py:attribute"}, "terms": {"": 5, "0": [0, 2, 7], "00": 6, "03": 5, "1": [0, 1, 2, 8], "10": [5, 6, 7], "100": [0, 5, 6], "1000": [1, 8], "11": 7, "12": [5, 7], "14": 0, "15": [5, 6], "16": 5, "163": 7, "19": 0, "1976": 0, "2": [0, 2], "20": [0, 5], "2022": [3, 7], "2023": 5, "20gb": 5, "23": 7, "240": 0, "240p": 0, "27": 5, "28": 5, "3": [0, 2], "30": [0, 5], "336": 0, "35": 5, "3_non": 5, "4": [2, 7], "5": [0, 5], "50": [0, 1, 5, 8], "5_clip_base_saved_features_imag": 5, "6": [0, 5, 7], "60gb": 5, "61": [5, 6], "7": 7, "7b": [0, 5], "8": [0, 7], "8050": 0, "8055": 5, "8057": 5, "9": 0, "981aa55a3b13": 5, "A": [0, 3, 5], "AND": 3, "AS": 3, "And": 5, "BE": 3, "BUT": 3, "Be": 7, "But": 5, "FOR": 3, "For": [5, 7], "IN": 3, "If": [0, 5, 6, 7], "In": [1, 5, 7, 8], "It": [1, 5, 6, 7, 8], "NO": 3, "NOT": 3, "No": 5, "OF": 3, "OR": 3, "One": 0, "Or": [1, 5, 8], "THE": 3, "TO": 3, "That": 5, "The": [0, 1, 2, 3, 6, 7, 8], "Then": 5, "There": 7, "These": [0, 5, 7], "To": [0, 5, 7], "WITH": 3, "With": 5, "_": 5, "__file__": 7, "_saved_features_imag": 5, "a100": 5, "a4f8f3": 5, "ab": 5, "about": [0, 5, 7], "abov": [3, 5, 7], "abus": 7, "access": 2, "accord": 7, "account": [1, 7, 8], "accur": [5, 7], "action": 3, "activ": 7, "ad": 5, "adapt": 5, "add": [5, 7], "addendum": 7, "addit": 0, "advanc": 5, "af0f99b": 5, "after": [1, 5, 8], "ag": [5, 7], "again": 5, "ai": 2, "albef": 5, "albef_feature_extractor": 0, "algorithm": [0, 5], "all": [0, 2, 3], "all_allowed_model_typ": [0, 4], "allow": [0, 5, 7], "allowed_analysis_typ": [0, 4], "allowed_model_typ": [0, 4], "allowed_new_model_typ": [0, 4], "along": 5, "alreadi": 5, "also": [0, 5, 7], "altern": 5, "american": 5, "ammico": [0, 1, 6, 8], "ammico_data_hom": 5, "ammico_env": 7, "ammico_prefetch_model": [0, 4], "among": 5, "an": [0, 3, 5, 6, 7], "analis": 0, "analys": [0, 2, 7], "analyse_imag": [0, 4, 5], "analyse_quest": [0, 4], "analyse_summari": [0, 4], "analyse_text": [0, 5, 7], "analyse_top": [0, 4], "analysi": [0, 2], "analysis_explor": 5, "analysis_typ": [0, 5], "analysisexplor": [0, 4, 5], "analysismethod": [0, 4], "analyz": [0, 2, 7], "analyze_single_fac": [0, 4], "analyze_text": 0, "anger": 5, "angri": 5, "ani": [0, 1, 3, 5, 7, 8], "anoth": 7, "answer": [0, 5, 7], "api": [0, 2, 5, 7], "app": 5, "append": 0, "append_data_to_dict": [0, 4, 5], "appli": 5, "applic": 6, "approach": 5, "appropri": 0, "approxim": 5, "ar": [0, 2, 5, 6], "architectur": 0, "archiv": 6, "area": 0, "arg": 0, "argument": 5, "aris": 3, "around": [0, 7], "arrai": 0, "art": 7, "as_posix": [5, 6], "asian": 5, "ask": [0, 5], "assign": 5, "associ": [3, 5], "asyncbatchannotatefil": 7, "asyncbatchannotateimag": 7, "asynchron": 7, "att_map": 0, "attent": 0, "author": 3, "automat": [5, 7], "avail": [5, 7], "avif": [0, 5], "avoid": 7, "b": 5, "back": [0, 1, 8], "background": 5, "bar": 5, "base": [0, 5, 7], "base_coco": 0, "batch": [0, 6, 7], "batch_siz": [0, 5], "batchannotatefil": 7, "batchannotateimag": 7, "becaus": [0, 5], "bee": 0, "been": [1, 5, 8], "befor": [0, 5, 7], "being": 5, "below": [0, 5, 6, 7], "bert": 5, "bertop": 0, "best": [5, 7], "best_simularity_value_in_current_search": 5, "better": 5, "between": [0, 5, 7], "beyond": 0, "bigger": 5, "bill": [1, 8], "binari": 0, "bit": 5, "black": [0, 7], "blank": [1, 8], "blip": 5, "blip2": 0, "blip2_coco": [0, 5], "blip2_feature_extractor": 0, "blip2_image_text_match": 0, "blip2_opt_caption_coco_opt2": [0, 5], "blip2_opt_caption_coco_opt6": [0, 5], "blip2_opt_pretrain_opt2": [0, 5], "blip2_opt_pretrain_opt6": [0, 5], "blip2_t5_caption_coco_flant5xl": [0, 5], "blip2_t5_pretrain_flant5xl": [0, 5], "blip2_t5_pretrain_flant5xxl": [0, 5], "blip_bas": 5, "blip_capt": 0, "blip_feature_extractor": 0, "blip_image_text_match": 0, "blip_larg": 5, "blip_vqa": 0, "block": 0, "block_num": 0, "blue": [0, 7], "blur": 0, "bool": [0, 5], "both": [5, 7], "briefli": 7, "bring": [1, 8], "brown": [0, 7], "browser": [1, 8], "build": 7, "c": [0, 3, 7], "calcul": 5, "call": [5, 7], "callback": 0, "campaign": 5, "can": [0, 1, 2, 5, 6, 8], "capabl": 5, "caption": [0, 5, 7], "caption_coco_": 5, "caption_coco_flant5xl": 0, "caption_coco_opt2": 0, "caption_coco_opt6": 0, "card": 5, "care": 7, "carri": [5, 6, 7], "case": 5, "categor": [0, 6], "categori": 5, "cell": [5, 6], "chang": 5, "channel": 7, "charg": [1, 3, 8], "check": [0, 5, 6, 7], "check_for_missing_kei": [0, 4], "check_model": [0, 4], "checkpoint": 5, "choos": [5, 7], "chosen": 0, "cie": 0, "citi": 5, "claim": 3, "class": [0, 5], "classif": 0, "classifi": 7, "clean": [0, 5, 7], "clean_subdict": [0, 4], "clean_text": [0, 4], "cli": [0, 5], "click": [1, 5, 8], "clip_bas": 5, "clip_feature_extractor": 0, "clip_vitl14": 5, "clip_vitl14_336": 5, "closest": 0, "cloud": [0, 2], "cnn": 5, "coco": [0, 5], "code": [5, 6], "colab": [5, 6, 7], "colaboratori": [1, 8], "collect": 7, "color": [0, 2], "color_analysi": [2, 4], "color_bgr2rgb": 6, "colordetector": [0, 4, 5], "colorgram": [0, 5, 7], "colour": [5, 7], "column": [0, 5, 7], "column_kei": [0, 5], "com": [5, 6, 7], "combat": 7, "combin": 5, "come": 5, "command": 7, "comment": [0, 6, 7], "common": 0, "compat": 2, "complet": 5, "compli": 7, "compon": 7, "comput": [0, 1, 5, 8], "computation": 5, "compute_crop_corn": [0, 4], "compute_gradcam_batch": [0, 4], "conceal": 5, "conda": [5, 7], "conda_prefix": 7, "condit": 3, "confer": 5, "confid": 5, "conll03": 5, "connect": [3, 5, 7], "consequenti": 0, "consequential_quest": [0, 5], "consid": [0, 5], "consist": 5, "consol": [1, 8], "const_image_summari": 5, "constant": [0, 5], "contain": [0, 2, 7], "content": [5, 6], "context": 5, "contract": 3, "contrib": 6, "conveni": 5, "convert": [0, 2], "coordin": 0, "copi": 3, "copyright": 3, "corner": [0, 1, 8], "correct": [5, 7], "correspond": 5, "cosequential_quest": 5, "could": 5, "count": 5, "countri": 5, "cover": 5, "cpp": 7, "cpu": [0, 5], "creat": [0, 1, 2, 7, 8], "creation": 5, "crop": [0, 2, 5], "crop_dir": 6, "crop_image_from_post": [0, 4], "crop_media_post": [0, 4, 6], "crop_post": 0, "crop_posts_from_ref": [0, 4, 6], "crop_posts_imag": [0, 4], "crop_view": [0, 6], "croppost": [2, 4, 6, 7], "crpo": 6, "css3": 0, "csv": [0, 2, 7], "csv_encod": 0, "csv_path": [0, 5], "cu11": 7, "cu118": 7, "cuda": [0, 5, 7], "cudatoolkit": 7, "cudnn": 7, "cudnn_path": 7, "current": [0, 1, 7, 8], "current_simularity_valu": 5, "cut": 0, "cv2": [0, 6], "cvtcolor": 6, "cyan": [0, 7], "d": [6, 7], "damag": 3, "dash": [0, 5], "dashboard": [1, 8], "data": [0, 2, 6, 7], "data_out": 5, "data_path": 5, "databas": 7, "datafram": [0, 2], "dataset": 2, "dbmdz": 5, "deactiv": 7, "deal": 3, "deepfac": [5, 7], "deepface_symlink_processor": [0, 4], "default": [0, 5], "defin": 5, "delet": 7, "delta": 0, "delta_e_method": 0, "demand": [0, 5], "demonstr": [2, 7], "depend": [5, 7], "depth": 7, "describ": 7, "descript": [5, 7], "descriptor": 0, "desir": 5, "detail": 5, "detect": [0, 2], "detector": [2, 7], "determin": 0, "determinist": 0, "deterministic_summari": 5, "develop": [5, 7], "devic": 0, "device_typ": [0, 5], "df": 5, "dict": [0, 5], "dictionari": [0, 5], "differ": [5, 6], "directli": [1, 5, 8], "directori": [0, 5], "dirnam": 7, "discard": 5, "disgust": 5, "disk": 7, "displai": [2, 4, 5], "distanc": 7, "distilbart": 5, "distilbert": 5, "distribut": 3, "dmatch": 0, "do": [3, 5, 7], "document": 3, "doe": [0, 5, 7], "doesn": 6, "dog": 5, "domin": 5, "don": 2, "done": [1, 5, 6, 7, 8], "dopamin": 5, "dot": [1, 8], "down": [1, 8], "download": [0, 1, 5, 7, 8], "downloadresourc": [0, 4], "draw_match": [0, 4], "drive": [1, 5, 6, 7, 8], "drop": [1, 8], "dropdown": 5, "due": [5, 6], "dump": [0, 5], "dump_df": [0, 4, 5], "dump_everi": 5, "dump_fil": 5, "e": [0, 7], "each": [0, 5], "easi": 5, "easier": 6, "easili": 5, "echo": 7, "either": [0, 5], "element": [5, 7], "emot": 5, "emotion_threshold": [0, 5], "emotiondetector": [0, 4, 5], "emotitiondetector": 5, "empti": [0, 5], "enabl": [2, 5, 7], "english": [0, 5, 7], "enter": [1, 8], "entiti": [0, 5, 7], "entity_typ": 5, "entri": [0, 5], "enumer": 5, "env_var": 7, "environ": [0, 5], "equip": 5, "error": [0, 5, 7], "estim": 0, "etc": 7, "even": 5, "event": 3, "everi": 5, "everyth": 6, "ex": 7, "exampl": [5, 6], "exclud": 0, "execut": [5, 6], "exist": 5, "exist_ok": 5, "experiment": [5, 7], "explain": 5, "explicitli": 5, "explor": [0, 5], "export": [5, 7], "express": [0, 2, 3, 7], "ext": 0, "extens": [5, 7], "extra": 6, "extrac": 7, "extract": 0, "extract_image_features_bas": [0, 4], "extract_image_features_blip2": [0, 4], "extract_image_features_clip": [0, 4], "extract_text_featur": [0, 4], "f": 6, "f2482bf": 5, "face": [2, 4, 7], "facial": [0, 2, 7], "facial_expression_analysi": [0, 4], "failsaf": 7, "fals": [0, 5, 6], "faq": 2, "fast": 5, "fear": 5, "featur": [0, 2], "feature_extractor": 0, "features_image_stack": [0, 5], "features_text": 0, "few": [5, 7], "field": 0, "figsiz": 6, "figur": 6, "file": [0, 1, 2, 3, 6, 7, 8], "filelist": 0, "filenam": [0, 5], "filepath": 0, "fill": 5, "filter": [0, 5], "filter_number_of_imag": [0, 5], "filter_rel_error": [0, 5], "filter_val_limit": [0, 5], "final_h": 0, "find": [0, 5, 6, 7], "find_fil": [0, 4, 5, 6], "fine": [5, 6], "finetun": 5, "first": [0, 1, 5, 6, 8], "fit": 3, "flag": 5, "flake8": [5, 6], "flan": 0, "flant5": 5, "flant5xl": 5, "flant5xxl": 5, "flex": 5, "float": [0, 5], "folder": [1, 6, 7, 8], "follow": [1, 3, 5, 7, 8], "forg": 7, "form": [0, 5], "format": [0, 5], "found": [0, 5, 6, 7], "fraction": 5, "frame": 0, "framework": 7, "frankfurt": 5, "free": [0, 1, 3, 8], "frequent": 0, "from": [0, 1, 3, 6, 7, 8], "function": [0, 5], "furnish": 3, "further": [2, 7], "g": 7, "gate": 5, "gb": [5, 7], "gbq": 5, "gender": [5, 7], "gener": [0, 2, 5, 7], "get": [0, 1, 4, 5, 7, 8], "get_att_map": [0, 4], "get_color_t": [0, 4], "get_datafram": [0, 4, 5], "get_ipython": [5, 6], "get_pathes_from_queri": [0, 4], "get_text_df": [0, 4], "get_text_dict": [0, 4], "get_text_from_imag": [0, 4], "gif": [0, 5], "git": [5, 6], "github": [5, 6], "give": 5, "given": [0, 5, 6], "global": 0, "go": [1, 8], "googl": [0, 2, 6], "google_application_credenti": [5, 7], "googletran": [5, 7], "gpu": [5, 7], "gradcam": 0, "grant": 3, "graphic": 2, "green": [0, 7], "grei": [0, 7], "h_margin": 0, "ha": [1, 5, 8], "happen": 2, "happi": 5, "have": [2, 5], "head": [5, 6], "heat": 5, "heavi": 5, "held": 7, "here": [1, 5, 7, 8], "herebi": 3, "high": 5, "hold": 5, "holder": 3, "horizont": 0, "hostedtoolcach": 0, "hour": 7, "how": [2, 5], "howev": 5, "hpc": 5, "http": [5, 6], "hug": 7, "huggingfac": 5, "human": 5, "i": [0, 1, 2, 3, 5, 6, 8], "id": [0, 1, 5, 8], "ideal": 5, "identifi": 5, "ignor": [0, 6], "imag": [0, 1, 2, 6, 8], "image_df": 5, "image_dict": 5, "image_example_path": 5, "image_example_queri": 5, "image_gradcam_with_itm": [0, 5], "image_kei": [0, 5], "image_nam": [0, 5], "image_path": 0, "image_summary_detector": 5, "image_summary_vqa_detector": 5, "image_text_match_reord": [0, 4, 5], "images_tensor": 0, "img": [0, 5], "img1": 0, "img2": 0, "img_path": 0, "immedi": 7, "imperfect": 6, "implement": 5, "impli": 3, "import": [2, 6, 7], "importlib_resourc": [5, 6], "improp": 6, "improv": 7, "imread": 6, "imshow": 6, "includ": [0, 3, 5], "incompat": 5, "increment": 5, "index": [0, 2, 7], "indic": 0, "inform": [1, 6, 7, 8], "inherit": 0, "iniati": 5, "init": 5, "initi": [0, 5, 7], "initialize_dict": [0, 4], "input": [0, 2, 7], "insid": 5, "inspect": 2, "instal": [2, 5, 6], "instanc": 5, "instead": 5, "instruct": [2, 5, 7], "int": [0, 5], "intellig": 7, "intens": 5, "interact": [0, 5], "interfac": 2, "internet": 2, "ipynb": 7, "is_interact": [0, 4], "isdir": 6, "item": [5, 6], "iter": [0, 4], "itm": [0, 5], "itm_model": [0, 5], "itm_model_typ": 0, "itm_scor": 5, "itm_scores2": 0, "itm_text_precess": [0, 4], "its": [5, 7], "iulusoi": 5, "jpeg": [0, 5], "jpg": [0, 5], "json": [1, 5, 7, 8], "jupyt": [1, 5, 8], "just": [0, 5, 7], "k": 5, "keep": 6, "kei": [0, 2, 7], "keypoint": 0, "keyword": [5, 7], "kind": 3, "kp1": 0, "kp2": 0, "kp_from_match": [0, 4], "kwarg": 0, "l": [0, 5], "languag": [0, 5, 7], "larg": [0, 5, 7], "large_coco": 0, "largest": 5, "later": 0, "latest": 6, "latter": [5, 7], "launch": 5, "lavi": [0, 5, 7], "ld_library_path": 7, "left": [1, 5, 8], "lemma": 7, "len": 5, "length": 0, "less": 5, "liabil": 3, "liabl": 3, "lib": [0, 7], "librari": [0, 5, 6, 7], "licens": 2, "lida": 5, "like": [1, 5, 8], "likelihood": 5, "limit": [0, 3, 5, 6], "line": 6, "linebreak": [0, 5], "list": [0, 1, 5, 8], "list_of_quest": [0, 5], "live": 7, "llm": 5, "load": [0, 5, 6], "load_dataset": 5, "load_feature_extractor_model_albef": [0, 4], "load_feature_extractor_model_blip": [0, 4], "load_feature_extractor_model_blip2": [0, 4], "load_feature_extractor_model_clip_bas": [0, 4], "load_feature_extractor_model_clip_vitl14": [0, 4], "load_feature_extractor_model_clip_vitl14_336": [0, 4], "load_model": [0, 4], "load_model_bas": [0, 4], "load_model_base_blip2_opt_caption_coco_opt67b": [0, 4], "load_model_base_blip2_opt_pretrain_opt67b": [0, 4], "load_model_blip2_opt_caption_coco_opt27b": [0, 4], "load_model_blip2_opt_pretrain_opt27b": [0, 4], "load_model_blip2_t5_caption_coco_flant5xl": [0, 4], "load_model_blip2_t5_pretrain_flant5xl": [0, 4], "load_model_blip2_t5_pretrain_flant5xxl": [0, 4], "load_model_larg": [0, 4], "load_new_model": [0, 4], "load_tensor": [0, 4], "load_vqa_model": [0, 4], "local": [5, 7], "locat": [5, 7], "log": 7, "login": 5, "look": [0, 1, 5, 6, 8], "loop": 5, "lower": 5, "m": 7, "machin": [5, 7], "made": 7, "mai": [5, 7], "main": [5, 7], "make": [1, 5, 7, 8], "man": 5, "manag": [1, 8], "mani": 5, "manual": 6, "map": [0, 5], "margin": 0, "mask": [0, 5, 7], "match": [0, 5, 6, 7], "matching_point": [0, 4], "matplotlib": 6, "maximum": [0, 5], "mean": 5, "media": [0, 2, 5, 6], "medicin": 5, "memori": [5, 7], "menu": [1, 5, 8], "merchant": 3, "merg": [0, 3], "merge_color": 0, "messag": 5, "metadata": 7, "method": [0, 5], "metric": [0, 7], "microsoft": 7, "might": 0, "min_match": 0, "minimum": [0, 5], "misinform": [2, 5], "miss": 0, "mit": 3, "mkdir": [5, 7], "model": [0, 7], "model_nam": [0, 5], "model_old": 0, "model_typ": [0, 5], "modifi": 3, "modul": [2, 7], "moment": 5, "month": [1, 8], "moral": 6, "more": [1, 5, 7, 8], "most": [0, 5], "mount": [5, 6], "msvc": 7, "much": 5, "multi_features_stack": 0, "multimod": [2, 4, 7], "multimodal_devic": [0, 4], "multimodal_search": [0, 4, 5, 7], "multimodalsearch": [0, 4, 5], "multipl": 5, "multiple_fac": 5, "must": 7, "mv": 6, "my_obj": 5, "mydict": [0, 5], "mydriv": 5, "n": [0, 5, 7], "n_color": 0, "name": [0, 1, 5, 6, 7, 8], "natur": 0, "ndarrai": 0, "necessari": [5, 7], "need": [0, 5, 7], "need_grad_cam": [0, 5], "neg": 5, "ner": 5, "nest": [0, 5], "neutral": 5, "new": [0, 1, 5, 7, 8], "next": 5, "nn": 0, "no_fac": 5, "non": 0, "nondeterministic_summari": 0, "none": [0, 5], "noninfring": 3, "noqa": [5, 6], "note": 5, "notebook": [1, 2, 6, 7, 8], "notic": 3, "now": [1, 5, 6, 8], "np": 0, "num": 5, "number": [0, 5, 7], "number_of_imag": 5, "numer": 5, "numpi": [0, 7], "nvidia": 7, "o": [5, 6, 7], "obj": 5, "object": [0, 5], "obtain": 3, "occur": 0, "off": 0, "offlin": 7, "old": 0, "onc": 5, "one": [0, 5, 7], "ones": 5, "onli": [0, 5, 6, 7], "onlin": 7, "open": 5, "opencv": 6, "oper": 7, "opt": [0, 5], "optim": 5, "option": [0, 5, 7], "orang": [0, 7], "orbax": 5, "order": [5, 7], "origin": [0, 5, 6], "other": [0, 3, 5, 7], "otherwis": [0, 3, 5], "our": [5, 7], "out": [1, 3, 5, 6, 7, 8], "outdict": 5, "output": [0, 2], "outsid": 5, "overal": 5, "overlap": 0, "own": 5, "p": [0, 7], "packag": [0, 2, 6], "page": [1, 2, 7, 8], "paid": 5, "panda": 2, "paper": 7, "paramet": [0, 5], "parent": 5, "pars": 0, "parsing_imag": [0, 4, 5], "part": [0, 6, 7], "parti": 7, "partial": 5, "particular": 3, "pass": 5, "past": 0, "paste_image_and_com": [0, 4], "path": [0, 5, 6], "path_post": 6, "path_ref": 6, "path_to_load_tensor": [0, 5], "path_to_save_tensor": [0, 5], "pathlib": 5, "patient": 5, "pattern": [0, 5], "peopl": 5, "per": [1, 8], "percentag": [0, 5, 7], "perform": [0, 5, 7], "period": 7, "permiss": 3, "permit": 3, "persist": 7, "person": [3, 5, 7], "pick": [1, 8], "pictur": [0, 2], "pil": 0, "pin": 6, "pink": [0, 7], "pip": [5, 6], "pipelin": [0, 5, 7], "pkg": [5, 6], "place": [1, 5, 7, 8], "pleas": [5, 6, 7], "plot": 6, "plt": 6, "plt_crop": [0, 6], "plt_imag": [0, 6], "plt_match": [0, 6], "png": [0, 5, 6], "pngimageplugin": 0, "point": 0, "polar": 7, "politician": 5, "pooch": 0, "pop": [1, 8], "port": [0, 5], "portion": 3, "posit": [0, 5], "possibl": [5, 7], "post": [0, 2, 5], "postprocesstext": [0, 4], "pre": [5, 7], "predict": [5, 7], "prefetch": 0, "prefix": 0, "prepar": 5, "preprocessor": 0, "presenc": 7, "present": [0, 5], "preserv": 5, "press": 5, "pretrain": [0, 5], "pretrain_": 5, "pretrain_opt2": 0, "pretrain_opt6": 0, "prevent": [6, 7], "previou": 5, "primari": 5, "print": [6, 7], "prioriti": 7, "privat": [1, 5, 8], "probabl": 5, "problem": [0, 2], "process": [0, 1, 5, 7, 8], "product": 5, "progress": 5, "project": [1, 7, 8], "prompt": [1, 5, 8], "proper": 7, "proport": 0, "provid": [0, 3, 5, 6, 7], "pt": [0, 5], "public": 7, "publish": 3, "purpl": [0, 7], "purpos": [3, 5], "put": [0, 7], "py": [0, 7], "pycocotool": 7, "pyplot": 6, "python": [0, 1, 5, 6, 7, 8], "python3": 0, "q": 6, "qq": 6, "qqq": [5, 6], "queri": [0, 2, 7], "querys_process": [0, 4], "question": [0, 5, 7], "quit": 5, "race": [5, 7], "race_threshold": [0, 5], "ram": 5, "random": [0, 5], "random_se": [0, 5], "rank": 5, "raw_imag": 0, "raw_img": 0, "re": [5, 6, 7], "read": [0, 2], "read_and_process_imag": [0, 4], "read_and_process_images_itm": [0, 4], "read_csv": [0, 4, 5], "read_img": [0, 4], "receiv": 7, "recogn": 7, "recognit": [0, 5], "recurs": [0, 5], "red": [0, 7], "reduc": [0, 5], "ref": [5, 6], "ref_dir": 6, "ref_fil": [0, 6], "ref_view": [0, 6], "refer": [0, 1, 5, 6, 8], "region": [0, 6], "regist": 0, "rel": 0, "relev": 5, "rememb": 5, "remot": 0, "remov": [0, 6, 7], "remove_linebreak": [0, 4], "reorder": 0, "report": 5, "repositori": 5, "represent": 5, "request": 7, "requir": [0, 5, 7], "rerun": 5, "resiz": 0, "resize_img": [0, 4], "resized_imag": 0, "resourc": [0, 4, 5], "respect": 5, "respons": 7, "restart": 5, "restrict": [3, 7], "result": [0, 7], "retinafac": [5, 7], "return": [0, 5, 7], "return_top": 0, "revis": 5, "revision_numb": [0, 5], "rf": 6, "rgb": 0, "rgb2name": [0, 4], "rgb_ref_view": 6, "rgb_view": 6, "right": [1, 3, 5, 8], "rl": 5, "rm": 6, "row": 5, "run": [0, 1, 5, 6, 7, 8], "run_serv": [0, 4, 5], "runtim": 5, "sad": 5, "same": [5, 6, 7], "sampl": [6, 7], "save": [0, 6], "save_crop_dir": [0, 6], "save_tensor": [0, 4], "saved_features_imag": 0, "saved_tensor": 0, "score": 0, "screen": [1, 8], "screenshot": [1, 8], "script": 7, "sdk": 7, "search": [1, 2, 4, 7, 8], "search_queri": [0, 5], "second": [0, 5], "section": 5, "see": [1, 5, 7, 8], "seed": [0, 5], "seem": 6, "select": [0, 1, 8], "self": 0, "sell": 3, "send": 7, "sent": 2, "sentiment": [0, 5, 7], "sentiment_scor": 5, "separ": 5, "sequenti": 5, "server": [0, 5], "servic": [1, 7, 8], "session": 5, "set": [0, 1, 2, 6, 7, 8], "set_kei": [0, 4], "setuptool": [5, 6], "seven": 5, "sever": [5, 7], "sh": 7, "shade": 0, "shall": 3, "share": 7, "short": 7, "shot": 5, "should": [0, 1, 5, 8], "show": [0, 1, 5, 6, 8], "show_result": [0, 4, 5], "showcas": 5, "shown": 5, "shuffel": 0, "shuffl": [0, 5], "sidebar": 5, "sift": 0, "sign": [1, 8], "signifi": [0, 5], "similar": [0, 5, 7], "simultan": 5, "sinc": 5, "singl": [0, 5], "site": 0, "size": [0, 5, 7], "skip": 5, "skip_extract": [0, 5], "slightli": 5, "slower": 5, "small": 0, "smaller": [0, 5], "so": [0, 3, 5, 7], "social": [0, 5, 6, 7], "softwar": 3, "solv": 2, "some": [5, 6, 7], "someth": [1, 5, 6, 8], "sometim": [0, 5, 6, 7], "sort": 0, "sorted_list": [0, 5], "sourc": [5, 7], "space": 7, "spaci": [5, 7], "special": 5, "specif": [0, 5], "specifi": 5, "speech": 7, "spell": 7, "ssc": 3, "ssciwr": [5, 6], "sshleifer": 5, "sst": 5, "stack": 0, "start": 0, "state": 7, "step": [2, 6, 7], "still": 2, "store": [5, 7], "str": [0, 5, 6], "string": 5, "studio": 7, "style": 5, "subdict": [0, 5], "subdirectori": [0, 5], "subfold": 5, "subject": [3, 7], "sublicens": 3, "subsequ": 5, "substanti": 3, "substitut": 6, "subtract": 0, "suffix": 0, "suitabl": 5, "summar": 5, "summari": [2, 4, 7], "summary_and_quest": [0, 5], "summary_model": 0, "summary_vis_processor": 0, "summary_vqa_model": 0, "summary_vqa_model_new": 0, "summary_vqa_txt_processor": 0, "summary_vqa_txt_processors_new": 0, "summary_vqa_vis_processor": 0, "summary_vqa_vis_processors_new": 0, "summarydetector": [0, 4, 5], "sure": [1, 5, 8], "surpris": 5, "syntax": 5, "system": 0, "t": [2, 6], "t5": 0, "ta": 5, "tab": 5, "tabl": 5, "take": [0, 5], "taken": [0, 5], "task": [5, 7], "tell": 5, "temporarili": 7, "ten": 0, "tensor": [0, 5], "tensorflow": 5, "tesor": 0, "test": [2, 6], "text": [2, 4, 6], "text_clean": [5, 7], "text_df": 5, "text_dict": 5, "text_english": [0, 5, 7], "text_english_correct": 7, "text_input": [0, 5], "text_languag": [5, 7], "text_ner": [0, 4], "text_query_index": 0, "text_sentiment_transform": [0, 4], "text_summari": [0, 4, 5], "textanalyz": [0, 4, 5], "textblob": 7, "textdetector": [0, 4, 5], "textual": 7, "tf": 5, "than": [1, 5, 8], "thei": [0, 5, 7], "them": 5, "therefor": 5, "thi": [0, 1, 3, 5, 6, 7, 8], "third": 7, "three": [1, 5, 8], "threshold": 5, "through": [0, 5], "thrown": 5, "thu": 5, "tiff": [0, 5], "time": [5, 7], "to_csv": 5, "togeth": 0, "toggl": 5, "token": [0, 7], "tokenized_text": 0, "tool": 2, "top": [1, 5, 8], "top1": 5, "topic": [0, 5, 7], "torch": [0, 7], "torchaudio": [5, 7], "torchdata": 5, "torchtext": 5, "torchvis": 7, "tort": 3, "total": 5, "tpu": 5, "tqdm": 5, "train": [0, 5], "transform": [0, 5, 7], "translat": [0, 2], "translate_text": [0, 4], "true": [0, 5, 6, 7], "try": 5, "ttl": 7, "tune": 5, "tupl": 0, "two": [0, 5, 7], "txt_processor": [0, 5], "type": [0, 5, 6], "typic": 7, "ummary_and_quest": 5, "uncas": 5, "uncom": 5, "under": 7, "unecessari": 0, "uninstal": [5, 6], "union": 0, "unrecogn": [0, 7], "unrecogniz": 5, "unzip": 6, "up": [0, 1, 5, 7, 8], "updat": [0, 5], "update_pictur": [0, 4], "upload": [1, 7, 8], "upload_model_blip2_coco": [0, 4], "upload_model_blip_bas": [0, 4], "upload_model_blip_larg": [0, 4], "upon": 5, "url": 7, "us": [0, 1, 2, 3, 8], "usa": 5, "usag": 2, "use_csv": 0, "user": [2, 7], "utf": 0, "util": [2, 4, 6], "v": 7, "v143": 7, "v2": 5, "v_margin": 0, "valu": [0, 5], "variabl": [5, 7], "veri": [5, 7], "version": [5, 6, 7], "vertic": [0, 1, 8], "via": 5, "video": 5, "view": [0, 6], "vis_processor": [0, 5], "vision": [0, 2], "visual": [0, 5, 7], "visual_input": 0, "visualstudio": 7, "vit": [0, 5], "vqa": [0, 5], "vram": 5, "vs_buildtool": 7, "wa": [0, 5, 7], "wai": [5, 6], "want": [5, 7], "warranti": 3, "we": [0, 5, 6], "wear": [0, 5, 7], "wears_mask": [0, 4, 5], "webp": [0, 5], "websit": 7, "well": 5, "wget": 6, "what": [2, 5], "when": [1, 5, 6, 7, 8], "where": [0, 1, 5, 7, 8], "whether": [0, 3], "which": [0, 5, 6, 7], "while": [0, 5], "white": [0, 7], "whitespac": 5, "whl": 7, "whole": 5, "whom": 3, "why": 5, "width": 0, "window": [1, 8], "wish": [1, 8], "without": [0, 3, 5, 7], "won": 7, "word": [0, 5, 7], "work": [0, 5, 6, 7], "world": 5, "worn": 5, "wrapper": 0, "write": [0, 2], "written": [0, 5], "wrong": 6, "x64": [0, 7], "x86": 7, "xl": 0, "xxl": 0, "y": [5, 6], "ye": 5, "yellow": [0, 7], "yet": 0, "you": [1, 5, 6, 7, 8], "your": [1, 2, 6, 7, 8], "zero": 5, "zip": 6}, "titles": ["text module", "Instructions how to generate and enable a google Cloud Vision API key", "Welcome to AMMICO\u2019s documentation!", "License", "AMMICO package modules", "AMMICO Demonstration Notebook", "Crop posts module", "AMMICO - AI Media and Misinformation Content Analysis Tool", "Instructions how to generate and enable a google Cloud Vision API key"], "titleterms": {"": 2, "0": 5, "1": [5, 7], "2": [5, 7], "3": [5, 7], "4": 5, "The": 5, "access": 7, "after": 7, "ai": 7, "all": 5, "ammico": [2, 4, 5, 7], "analys": 5, "analysi": [5, 7], "analyz": 5, "api": [1, 8], "ar": 7, "blip2": 5, "can": 7, "cloud": [1, 5, 7, 8], "color": [5, 7], "color_analysi": 0, "compat": 7, "contain": 5, "content": [2, 7], "convert": 5, "creat": 5, "crop": [6, 7], "croppost": 0, "csv": 5, "data": 5, "datafram": 5, "dataset": 5, "demonstr": 5, "detect": [5, 7], "detector": 5, "displai": 0, "document": 2, "don": 7, "emot": 7, "enabl": [1, 8], "environ": 7, "express": 5, "extract": [5, 7], "face": [0, 5], "facial": 5, "faq": 7, "featur": [5, 7], "file": 5, "first": 7, "folder": 5, "formul": 5, "from": 5, "further": 5, "gener": [1, 8], "googl": [1, 5, 7, 8], "graphic": 5, "happen": 7, "have": 7, "how": [1, 8], "http": 7, "hue": 7, "i": 7, "imag": [5, 7], "import": 5, "improv": 5, "index": 5, "indic": 2, "input": 5, "inspect": 5, "instal": 7, "instruct": [1, 8], "interfac": 5, "internet": 7, "kei": [1, 5, 8], "licens": 3, "media": 7, "micromamba": 7, "misinform": 7, "model": 5, "modul": [0, 4, 5, 6], "multimod": [0, 5], "notebook": 5, "org": 7, "output": 5, "packag": [4, 5, 7], "panda": 5, "pictur": 5, "pip": 7, "post": [6, 7], "prepar": 7, "problem": 7, "pytorch": 7, "queri": 5, "read": 5, "recognit": 7, "result": 5, "right": 7, "save": 5, "search": [0, 5], "second": 7, "select": 5, "sent": 7, "set": 5, "solv": 7, "step": 5, "still": 7, "summari": [0, 5], "t": 7, "tabl": 2, "tensorflow": 7, "test": 5, "text": [0, 5, 7], "tool": 7, "translat": [5, 7], "us": [5, 7], "usag": 7, "user": 5, "util": 0, "vision": [1, 5, 7, 8], "we": 7, "welcom": 2, "what": 7, "window": 7, "write": 5, "www": 7, "your": 5}}) \ No newline at end of file +Search.setIndex({"alltitles": {"1. First, install tensorflow (https://www.tensorflow.org/install/pip)": [[7, "first-install-tensorflow-https-www-tensorflow-org-install-pip"]], "2. Second, install pytorch": [[7, "second-install-pytorch"]], "3. After we prepared right environment we can install the ammico package": [[7, "after-we-prepared-right-environment-we-can-install-the-ammico-package"]], "AMMICO - AI Media and Misinformation Content Analysis Tool": [[7, "ammico-ai-media-and-misinformation-content-analysis-tool"]], "AMMICO Demonstration Notebook": [[5, "AMMICO-Demonstration-Notebook"]], "AMMICO package modules": [[4, "ammico-package-modules"]], "BLIP2 models": [[5, "BLIP2-models"]], "Color analysis of pictures": [[5, "Color-analysis-of-pictures"]], "Color/hue detection": [[7, "color-hue-detection"]], "Compatibility problems solving": [[7, "compatibility-problems-solving"]], "Content extraction": [[7, "content-extraction"]], "Contents:": [[2, null]], "Crop posts module": [[6, "Crop-posts-module"]], "Cropping of posts": [[7, "cropping-of-posts"]], "Detection of faces and facial expression analysis": [[5, "Detection-of-faces-and-facial-expression-analysis"]], "Emotion recognition": [[7, "emotion-recognition"]], "Ethical disclosure statement": [[5, "Ethical-disclosure-statement"]], "FAQ": [[7, "faq"]], "Features": [[7, "features"]], "Formulate your search queries": [[5, "Formulate-your-search-queries"]], "Further detector modules": [[5, "Further-detector-modules"]], "Image Multimodal Search": [[5, "Image-Multimodal-Search"]], "Image summary and query": [[5, "Image-summary-and-query"]], "Import the ammico package.": [[5, "Import-the-ammico-package."]], "Improve the search results": [[5, "Improve-the-search-results"]], "Indexing and extracting features from images in selected folder": [[5, "Indexing-and-extracting-features-from-images-in-selected-folder"]], "Indices and tables": [[2, "indices-and-tables"]], "Installation": [[7, "installation"]], "Instructions how to generate and enable a google Cloud Vision API key": [[1, "instructions-how-to-generate-and-enable-a-google-cloud-vision-api-key"], [8, "instructions-how-to-generate-and-enable-a-google-cloud-vision-api-key"]], "License": [[3, "license"]], "Micromamba": [[7, "micromamba"]], "Read in a csv file containing text and translating/analysing the text": [[5, "Read-in-a-csv-file-containing-text-and-translating/analysing-the-text"]], "Save search results to csv": [[5, "Save-search-results-to-csv"]], "Step 0: Create and set a Google Cloud Vision Key": [[5, "Step-0:-Create-and-set-a-Google-Cloud-Vision-Key"]], "Step 1: Read your data into AMMICO": [[5, "Step-1:-Read-your-data-into-AMMICO"]], "Step 2: Inspect the input files using the graphical user interface": [[5, "Step-2:-Inspect-the-input-files-using-the-graphical-user-interface"]], "Step 3: Analyze all images": [[5, "Step-3:-Analyze-all-images"]], "Step 4: Convert analysis output to pandas dataframe and write csv": [[5, "Step-4:-Convert-analysis-output-to-pandas-dataframe-and-write-csv"]], "Text extraction": [[7, "text-extraction"]], "The detector modules": [[5, "The-detector-modules"]], "Usage": [[7, "usage"]], "Use a test dataset": [[5, "Use-a-test-dataset"]], "Welcome to AMMICO\u2019s documentation!": [[2, "welcome-to-ammico-s-documentation"]], "What happens if I don\u2019t have internet access - can I still use ammico?": [[7, "what-happens-if-i-don-t-have-internet-access-can-i-still-use-ammico"]], "What happens to the images that are sent to google Cloud Vision?": [[7, "what-happens-to-the-images-that-are-sent-to-google-cloud-vision"]], "What happens to the text that is sent to google Translate?": [[7, "what-happens-to-the-text-that-is-sent-to-google-translate"]], "Windows": [[7, "windows"]], "color_analysis module": [[0, "module-colors"]], "cropposts module": [[0, "module-cropposts"]], "display module": [[0, "module-display"]], "faces module": [[0, "module-faces"]], "multimodal search module": [[0, "module-multimodal_search"]], "summary module": [[0, "module-summary"]], "text module": [[0, "module-text"]], "utils module": [[0, "module-utils"]]}, "docnames": ["ammico", "create_API_key_link", "index", "license_link", "modules", "notebooks/DemoNotebook_ammico", "notebooks/Example cropposts", "readme_link", "set_up_credentials"], "envversion": {"nbsphinx": 4, "sphinx": 61, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["ammico.rst", "create_API_key_link.md", "index.rst", "license_link.md", "modules.rst", "notebooks/DemoNotebook_ammico.ipynb", "notebooks/Example cropposts.ipynb", "readme_link.md", "set_up_credentials.md"], "indexentries": {"all_allowed_model_types (summary.summarydetector attribute)": [[0, "summary.SummaryDetector.all_allowed_model_types", false]], "allowed_analysis_types (summary.summarydetector attribute)": [[0, "summary.SummaryDetector.allowed_analysis_types", false]], "allowed_model_types (summary.summarydetector attribute)": [[0, "summary.SummaryDetector.allowed_model_types", false]], "allowed_new_model_types (summary.summarydetector attribute)": [[0, "summary.SummaryDetector.allowed_new_model_types", false]], "ammico_prefetch_models() (in module utils)": [[0, "utils.ammico_prefetch_models", false]], "analyse_image() (colors.colordetector method)": [[0, "colors.ColorDetector.analyse_image", false]], "analyse_image() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.analyse_image", false]], "analyse_image() (summary.summarydetector method)": [[0, "summary.SummaryDetector.analyse_image", false]], "analyse_image() (text.textdetector method)": [[0, "text.TextDetector.analyse_image", false]], "analyse_image() (utils.analysismethod method)": [[0, "utils.AnalysisMethod.analyse_image", false]], "analyse_questions() (summary.summarydetector method)": [[0, "summary.SummaryDetector.analyse_questions", false]], "analyse_summary() (summary.summarydetector method)": [[0, "summary.SummaryDetector.analyse_summary", false]], "analyse_topic() (text.postprocesstext method)": [[0, "text.PostprocessText.analyse_topic", false]], "analysisexplorer (class in display)": [[0, "display.AnalysisExplorer", false]], "analysismethod (class in utils)": [[0, "utils.AnalysisMethod", false]], "analyze_single_face() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.analyze_single_face", false]], "append_data_to_dict() (in module utils)": [[0, "utils.append_data_to_dict", false]], "check_for_missing_keys() (in module utils)": [[0, "utils.check_for_missing_keys", false]], "check_model() (summary.summarydetector method)": [[0, "summary.SummaryDetector.check_model", false]], "clean_subdict() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.clean_subdict", false]], "clean_text() (text.textdetector method)": [[0, "text.TextDetector.clean_text", false]], "colordetector (class in colors)": [[0, "colors.ColorDetector", false]], "colors": [[0, "module-colors", false]], "compute_crop_corner() (in module cropposts)": [[0, "cropposts.compute_crop_corner", false]], "compute_gradcam_batch() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.compute_gradcam_batch", false]], "crop_image_from_post() (in module cropposts)": [[0, "cropposts.crop_image_from_post", false]], "crop_media_posts() (in module cropposts)": [[0, "cropposts.crop_media_posts", false]], "crop_posts_from_refs() (in module cropposts)": [[0, "cropposts.crop_posts_from_refs", false]], "crop_posts_image() (in module cropposts)": [[0, "cropposts.crop_posts_image", false]], "cropposts": [[0, "module-cropposts", false]], "deepface_symlink_processor() (in module faces)": [[0, "faces.deepface_symlink_processor", false]], "display": [[0, "module-display", false]], "downloadresource (class in utils)": [[0, "utils.DownloadResource", false]], "draw_matches() (in module cropposts)": [[0, "cropposts.draw_matches", false]], "dump_df() (in module utils)": [[0, "utils.dump_df", false]], "emotiondetector (class in faces)": [[0, "faces.EmotionDetector", false]], "ethical_disclosure() (in module faces)": [[0, "faces.ethical_disclosure", false]], "extract_image_features_basic() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.extract_image_features_basic", false]], "extract_image_features_blip2() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.extract_image_features_blip2", false]], "extract_image_features_clip() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.extract_image_features_clip", false]], "extract_text_features() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.extract_text_features", false]], "faces": [[0, "module-faces", false]], "facial_expression_analysis() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.facial_expression_analysis", false]], "find_files() (in module utils)": [[0, "utils.find_files", false]], "get() (utils.downloadresource method)": [[0, "utils.DownloadResource.get", false]], "get_att_map() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.get_att_map", false]], "get_color_table() (in module utils)": [[0, "utils.get_color_table", false]], "get_dataframe() (in module utils)": [[0, "utils.get_dataframe", false]], "get_pathes_from_query() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.get_pathes_from_query", false]], "get_text_df() (text.postprocesstext method)": [[0, "text.PostprocessText.get_text_df", false]], "get_text_dict() (text.postprocesstext method)": [[0, "text.PostprocessText.get_text_dict", false]], "get_text_from_image() (text.textdetector method)": [[0, "text.TextDetector.get_text_from_image", false]], "image_text_match_reordering() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.image_text_match_reordering", false]], "initialize_dict() (in module utils)": [[0, "utils.initialize_dict", false]], "is_interactive() (in module utils)": [[0, "utils.is_interactive", false]], "iterable() (in module utils)": [[0, "utils.iterable", false]], "itm_text_precessing() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.itm_text_precessing", false]], "kp_from_matches() (in module cropposts)": [[0, "cropposts.kp_from_matches", false]], "load_feature_extractor_model_albef() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_albef", false]], "load_feature_extractor_model_blip() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_blip", false]], "load_feature_extractor_model_blip2() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_blip2", false]], "load_feature_extractor_model_clip_base() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_clip_base", false]], "load_feature_extractor_model_clip_vitl14() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_clip_vitl14", false]], "load_feature_extractor_model_clip_vitl14_336() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_feature_extractor_model_clip_vitl14_336", false]], "load_model() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model", false]], "load_model_base() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_base", false]], "load_model_base_blip2_opt_caption_coco_opt67b() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_base_blip2_opt_caption_coco_opt67b", false]], "load_model_base_blip2_opt_pretrain_opt67b() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_base_blip2_opt_pretrain_opt67b", false]], "load_model_blip2_opt_caption_coco_opt27b() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_blip2_opt_caption_coco_opt27b", false]], "load_model_blip2_opt_pretrain_opt27b() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_blip2_opt_pretrain_opt27b", false]], "load_model_blip2_t5_caption_coco_flant5xl() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_blip2_t5_caption_coco_flant5xl", false]], "load_model_blip2_t5_pretrain_flant5xl() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_blip2_t5_pretrain_flant5xl", false]], "load_model_blip2_t5_pretrain_flant5xxl() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_blip2_t5_pretrain_flant5xxl", false]], "load_model_large() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_model_large", false]], "load_new_model() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_new_model", false]], "load_tensors() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.load_tensors", false]], "load_vqa_model() (summary.summarydetector method)": [[0, "summary.SummaryDetector.load_vqa_model", false]], "matching_points() (in module cropposts)": [[0, "cropposts.matching_points", false]], "module": [[0, "module-colors", false], [0, "module-cropposts", false], [0, "module-display", false], [0, "module-faces", false], [0, "module-multimodal_search", false], [0, "module-summary", false], [0, "module-text", false], [0, "module-utils", false]], "multimodal_device (multimodal_search.multimodalsearch attribute)": [[0, "multimodal_search.MultimodalSearch.multimodal_device", false]], "multimodal_search": [[0, "module-multimodal_search", false]], "multimodal_search() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.multimodal_search", false]], "multimodalsearch (class in multimodal_search)": [[0, "multimodal_search.MultimodalSearch", false]], "parsing_images() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.parsing_images", false]], "paste_image_and_comment() (in module cropposts)": [[0, "cropposts.paste_image_and_comment", false]], "postprocesstext (class in text)": [[0, "text.PostprocessText", false]], "querys_processing() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.querys_processing", false]], "read_and_process_images() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.read_and_process_images", false]], "read_and_process_images_itm() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.read_and_process_images_itm", false]], "read_csv() (text.textanalyzer method)": [[0, "text.TextAnalyzer.read_csv", false]], "read_img() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.read_img", false]], "remove_linebreaks() (text.textdetector method)": [[0, "text.TextDetector.remove_linebreaks", false]], "resize_img() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.resize_img", false]], "resources (utils.downloadresource attribute)": [[0, "utils.DownloadResource.resources", false]], "rgb2name() (colors.colordetector method)": [[0, "colors.ColorDetector.rgb2name", false]], "run_server() (display.analysisexplorer method)": [[0, "display.AnalysisExplorer.run_server", false]], "save_tensors() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.save_tensors", false]], "set_keys() (colors.colordetector method)": [[0, "colors.ColorDetector.set_keys", false]], "set_keys() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.set_keys", false]], "set_keys() (text.textdetector method)": [[0, "text.TextDetector.set_keys", false]], "set_keys() (utils.analysismethod method)": [[0, "utils.AnalysisMethod.set_keys", false]], "show_results() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.show_results", false]], "summary": [[0, "module-summary", false]], "summarydetector (class in summary)": [[0, "summary.SummaryDetector", false]], "text": [[0, "module-text", false]], "text_ner() (text.textdetector method)": [[0, "text.TextDetector.text_ner", false]], "text_sentiment_transformers() (text.textdetector method)": [[0, "text.TextDetector.text_sentiment_transformers", false]], "text_summary() (text.textdetector method)": [[0, "text.TextDetector.text_summary", false]], "textanalyzer (class in text)": [[0, "text.TextAnalyzer", false]], "textdetector (class in text)": [[0, "text.TextDetector", false]], "translate_text() (text.textdetector method)": [[0, "text.TextDetector.translate_text", false]], "update_picture() (display.analysisexplorer method)": [[0, "display.AnalysisExplorer.update_picture", false]], "upload_model_blip2_coco() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.upload_model_blip2_coco", false]], "upload_model_blip_base() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.upload_model_blip_base", false]], "upload_model_blip_large() (multimodal_search.multimodalsearch method)": [[0, "multimodal_search.MultimodalSearch.upload_model_blip_large", false]], "utils": [[0, "module-utils", false]], "wears_mask() (faces.emotiondetector method)": [[0, "faces.EmotionDetector.wears_mask", false]]}, "objects": {"": [[0, 0, 0, "-", "colors"], [0, 0, 0, "-", "cropposts"], [0, 0, 0, "-", "display"], [0, 0, 0, "-", "faces"], [0, 0, 0, "-", "multimodal_search"], [0, 0, 0, "-", "summary"], [0, 0, 0, "-", "text"], [0, 0, 0, "-", "utils"]], "colors": [[0, 1, 1, "", "ColorDetector"]], "colors.ColorDetector": [[0, 2, 1, "", "analyse_image"], [0, 2, 1, "", "rgb2name"], [0, 2, 1, "", "set_keys"]], "cropposts": [[0, 3, 1, "", "compute_crop_corner"], [0, 3, 1, "", "crop_image_from_post"], [0, 3, 1, "", "crop_media_posts"], [0, 3, 1, "", "crop_posts_from_refs"], [0, 3, 1, "", "crop_posts_image"], [0, 3, 1, "", "draw_matches"], [0, 3, 1, "", "kp_from_matches"], [0, 3, 1, "", "matching_points"], [0, 3, 1, "", "paste_image_and_comment"]], "display": [[0, 1, 1, "", "AnalysisExplorer"]], "display.AnalysisExplorer": [[0, 2, 1, "", "run_server"], [0, 2, 1, "", "update_picture"]], "faces": [[0, 1, 1, "", "EmotionDetector"], [0, 3, 1, "", "deepface_symlink_processor"], [0, 3, 1, "", "ethical_disclosure"]], "faces.EmotionDetector": [[0, 2, 1, "", "analyse_image"], [0, 2, 1, "", "analyze_single_face"], [0, 2, 1, "", "clean_subdict"], [0, 2, 1, "", "facial_expression_analysis"], [0, 2, 1, "", "set_keys"], [0, 2, 1, "", "wears_mask"]], "multimodal_search": [[0, 1, 1, "", "MultimodalSearch"]], "multimodal_search.MultimodalSearch": [[0, 2, 1, "", "compute_gradcam_batch"], [0, 2, 1, "", "extract_image_features_basic"], [0, 2, 1, "", "extract_image_features_blip2"], [0, 2, 1, "", "extract_image_features_clip"], [0, 2, 1, "", "extract_text_features"], [0, 2, 1, "", "get_att_map"], [0, 2, 1, "", "get_pathes_from_query"], [0, 2, 1, "", "image_text_match_reordering"], [0, 2, 1, "", "itm_text_precessing"], [0, 2, 1, "", "load_feature_extractor_model_albef"], [0, 2, 1, "", "load_feature_extractor_model_blip"], [0, 2, 1, "", "load_feature_extractor_model_blip2"], [0, 2, 1, "", "load_feature_extractor_model_clip_base"], [0, 2, 1, "", "load_feature_extractor_model_clip_vitl14"], [0, 2, 1, "", "load_feature_extractor_model_clip_vitl14_336"], [0, 2, 1, "", "load_tensors"], [0, 4, 1, "", "multimodal_device"], [0, 2, 1, "", "multimodal_search"], [0, 2, 1, "", "parsing_images"], [0, 2, 1, "", "querys_processing"], [0, 2, 1, "", "read_and_process_images"], [0, 2, 1, "", "read_and_process_images_itm"], [0, 2, 1, "", "read_img"], [0, 2, 1, "", "resize_img"], [0, 2, 1, "", "save_tensors"], [0, 2, 1, "", "show_results"], [0, 2, 1, "", "upload_model_blip2_coco"], [0, 2, 1, "", "upload_model_blip_base"], [0, 2, 1, "", "upload_model_blip_large"]], "summary": [[0, 1, 1, "", "SummaryDetector"]], "summary.SummaryDetector": [[0, 4, 1, "", "all_allowed_model_types"], [0, 4, 1, "", "allowed_analysis_types"], [0, 4, 1, "", "allowed_model_types"], [0, 4, 1, "", "allowed_new_model_types"], [0, 2, 1, "", "analyse_image"], [0, 2, 1, "", "analyse_questions"], [0, 2, 1, "", "analyse_summary"], [0, 2, 1, "", "check_model"], [0, 2, 1, "", "load_model"], [0, 2, 1, "", "load_model_base"], [0, 2, 1, "", "load_model_base_blip2_opt_caption_coco_opt67b"], [0, 2, 1, "", "load_model_base_blip2_opt_pretrain_opt67b"], [0, 2, 1, "", "load_model_blip2_opt_caption_coco_opt27b"], [0, 2, 1, "", "load_model_blip2_opt_pretrain_opt27b"], [0, 2, 1, "", "load_model_blip2_t5_caption_coco_flant5xl"], [0, 2, 1, "", "load_model_blip2_t5_pretrain_flant5xl"], [0, 2, 1, "", "load_model_blip2_t5_pretrain_flant5xxl"], [0, 2, 1, "", "load_model_large"], [0, 2, 1, "", "load_new_model"], [0, 2, 1, "", "load_vqa_model"]], "text": [[0, 1, 1, "", "PostprocessText"], [0, 1, 1, "", "TextAnalyzer"], [0, 1, 1, "", "TextDetector"]], "text.PostprocessText": [[0, 2, 1, "", "analyse_topic"], [0, 2, 1, "", "get_text_df"], [0, 2, 1, "", "get_text_dict"]], "text.TextAnalyzer": [[0, 2, 1, "", "read_csv"]], "text.TextDetector": [[0, 2, 1, "", "analyse_image"], [0, 2, 1, "", "clean_text"], [0, 2, 1, "", "get_text_from_image"], [0, 2, 1, "", "remove_linebreaks"], [0, 2, 1, "", "set_keys"], [0, 2, 1, "", "text_ner"], [0, 2, 1, "", "text_sentiment_transformers"], [0, 2, 1, "", "text_summary"], [0, 2, 1, "", "translate_text"]], "utils": [[0, 1, 1, "", "AnalysisMethod"], [0, 1, 1, "", "DownloadResource"], [0, 3, 1, "", "ammico_prefetch_models"], [0, 3, 1, "", "append_data_to_dict"], [0, 3, 1, "", "check_for_missing_keys"], [0, 3, 1, "", "dump_df"], [0, 3, 1, "", "find_files"], [0, 3, 1, "", "get_color_table"], [0, 3, 1, "", "get_dataframe"], [0, 3, 1, "", "initialize_dict"], [0, 3, 1, "", "is_interactive"], [0, 3, 1, "", "iterable"]], "utils.AnalysisMethod": [[0, 2, 1, "", "analyse_image"], [0, 2, 1, "", "set_keys"]], "utils.DownloadResource": [[0, 2, 1, "", "get"], [0, 4, 1, "", "resources"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"], "4": ["py", "attribute", "Python attribute"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function", "4": "py:attribute"}, "terms": {"": 5, "0": [0, 2, 7], "00": 6, "03": 5, "1": [0, 1, 2, 8], "10": [5, 6, 7], "100": [0, 5, 6], "1000": [1, 8], "11": 7, "12": [5, 7], "14": 0, "15": [5, 6], "16": 5, "163": 7, "19": 0, "1976": 0, "2": [0, 2], "20": [0, 5], "2022": [3, 7], "2023": 5, "20gb": 5, "23": 7, "240": 0, "240p": 0, "27": 5, "28": 5, "3": [0, 2], "30": [0, 5], "336": 0, "35": 5, "3_non": 5, "4": [2, 7], "5": [0, 5], "50": [0, 1, 5, 8], "5_clip_base_saved_features_imag": 5, "6": [0, 5, 7], "60gb": 5, "61": [5, 6], "7": 7, "7b": [0, 5], "8": [0, 7], "8050": 0, "8055": 5, "8057": 5, "9": 0, "981aa55a3b13": 5, "A": [0, 3, 5], "AND": 3, "AS": 3, "And": 5, "BE": 3, "BUT": 3, "Be": 7, "But": 5, "By": 5, "FOR": 3, "For": [5, 7], "IN": 3, "If": [0, 5, 6, 7], "In": [1, 5, 7, 8], "It": [1, 5, 6, 7, 8], "NO": 3, "NOT": 3, "No": 5, "OF": 3, "OR": 3, "One": 0, "Or": [1, 5, 8], "THE": 3, "TO": 3, "That": 5, "The": [0, 1, 2, 3, 6, 7, 8], "Then": 5, "There": 7, "These": [0, 5, 7], "To": [0, 5, 7], "WITH": 3, "With": 5, "_": 5, "__file__": 7, "_saved_features_imag": 5, "a100": 5, "a4f8f3": 5, "ab": 5, "about": [0, 5, 7], "abov": [3, 5, 7], "abus": 7, "accept": [0, 5], "accept_disclosur": [0, 5], "access": 2, "accord": 7, "account": [1, 7, 8], "accur": [5, 7], "action": 3, "activ": 7, "ad": 5, "adapt": 5, "add": [5, 7], "addendum": 7, "addit": 0, "advanc": 5, "af0f99b": 5, "after": [1, 5, 8], "ag": [5, 7], "again": 5, "age_threshold": [0, 5], "ai": 2, "albef": 5, "albef_feature_extractor": 0, "algorithm": [0, 5], "all": [0, 2, 3], "all_allowed_model_typ": [0, 4], "allow": [0, 5, 7], "allowed_analysis_typ": [0, 4], "allowed_model_typ": [0, 4], "allowed_new_model_typ": [0, 4], "along": 5, "alreadi": 5, "also": [0, 5, 7], "altern": 5, "american": 5, "ammico": [0, 1, 6, 8], "ammico_data_hom": 5, "ammico_env": 7, "ammico_prefetch_model": [0, 4], "among": 5, "an": [0, 3, 5, 6, 7], "analis": 0, "analys": [0, 2, 7], "analyse_imag": [0, 4, 5], "analyse_quest": [0, 4], "analyse_summari": [0, 4], "analyse_text": [0, 5, 7], "analyse_top": [0, 4], "analysi": [0, 2], "analysis_explor": 5, "analysis_typ": [0, 5], "analysisexplor": [0, 4, 5], "analysismethod": [0, 4], "analyz": [0, 2, 7], "analyze_single_fac": [0, 4], "analyze_text": 0, "anger": 5, "angri": 5, "ani": [0, 1, 3, 5, 7, 8], "anoth": 7, "answer": [0, 5, 7], "api": [0, 2, 5, 7], "app": 5, "append": 0, "append_data_to_dict": [0, 4, 5], "appli": 5, "applic": 6, "approach": 5, "appropri": 0, "approxim": 5, "ar": [0, 2, 5, 6], "architectur": 0, "archiv": 6, "area": 0, "arg": 0, "argument": 5, "aris": 3, "around": [0, 7], "arrai": 0, "art": 7, "as_posix": 6, "asian": 5, "ask": [0, 5], "assign": 5, "associ": [3, 5], "asyncbatchannotatefil": 7, "asyncbatchannotateimag": 7, "asynchron": 7, "att_map": 0, "attent": 0, "author": 3, "automat": [5, 7], "avail": [5, 7], "avif": [0, 5], "avoid": 7, "awar": 5, "b": 5, "back": [0, 1, 8], "background": 5, "bar": 5, "base": [0, 5, 7], "base_coco": 0, "bashr": 5, "batch": [0, 6, 7], "batch_siz": [0, 5], "batchannotatefil": 7, "batchannotateimag": 7, "becaus": [0, 5], "bee": 0, "been": [1, 5, 8], "befor": [0, 5, 7], "being": 5, "below": [0, 5, 6, 7], "bert": 5, "bertop": 0, "best": [5, 7], "best_simularity_value_in_current_search": 5, "better": 5, "between": [0, 5, 7], "beyond": 0, "bigger": 5, "bill": [1, 8], "binari": 0, "bit": 5, "black": [0, 7], "blank": [1, 8], "blip": 5, "blip2": 0, "blip2_coco": [0, 5], "blip2_feature_extractor": 0, "blip2_image_text_match": 0, "blip2_opt_caption_coco_opt2": [0, 5], "blip2_opt_caption_coco_opt6": [0, 5], "blip2_opt_pretrain_opt2": [0, 5], "blip2_opt_pretrain_opt6": [0, 5], "blip2_t5_caption_coco_flant5xl": [0, 5], "blip2_t5_pretrain_flant5xl": [0, 5], "blip2_t5_pretrain_flant5xxl": [0, 5], "blip_bas": 5, "blip_capt": 0, "blip_feature_extractor": 0, "blip_image_text_match": 0, "blip_larg": 5, "blip_vqa": 0, "block": 0, "block_num": 0, "blue": [0, 7], "blur": 0, "bool": [0, 5], "both": [5, 7], "briefli": 7, "bring": [1, 8], "brown": [0, 7], "browser": [1, 8], "build": 7, "c": [0, 3, 7], "calcul": 5, "call": [5, 7], "callback": 0, "campaign": 5, "can": [0, 1, 2, 5, 6, 8], "capabl": 5, "caption": [0, 5, 7], "caption_coco_": 5, "caption_coco_flant5xl": 0, "caption_coco_opt2": 0, "caption_coco_opt6": 0, "card": 5, "care": 7, "carri": [5, 6, 7], "case": 5, "categor": [0, 6], "categori": 5, "cell": [5, 6], "chang": 5, "channel": 7, "charg": [1, 3, 8], "check": [0, 5, 6, 7], "check_for_missing_kei": [0, 4], "check_model": [0, 4], "checkpoint": 5, "choos": [5, 7], "chosen": 0, "cie": 0, "citi": 5, "claim": 3, "class": [0, 5], "classif": [0, 5], "classifi": 7, "clean": [0, 5, 7], "clean_subdict": [0, 4], "clean_text": [0, 4], "cli": [0, 5], "click": [1, 5, 8], "clip_bas": 5, "clip_feature_extractor": 0, "clip_vitl14": 5, "clip_vitl14_336": 5, "closest": 0, "cloud": [0, 2], "cnn": 5, "coco": [0, 5], "code": [5, 6], "colab": [5, 6, 7], "colaboratori": [1, 8], "collect": 7, "color": [0, 2], "color_analysi": [2, 4], "color_bgr2rgb": 6, "colordetector": [0, 4, 5], "colorgram": [0, 5, 7], "colour": [5, 7], "column": [0, 5, 7], "column_kei": [0, 5], "com": [5, 6, 7], "combat": 7, "combin": 5, "come": 5, "command": 7, "comment": [0, 6, 7], "common": 0, "compat": 2, "complet": 5, "compli": 7, "compon": 7, "comput": [0, 1, 5, 8], "computation": 5, "compute_crop_corn": [0, 4], "compute_gradcam_batch": [0, 4], "conceal": 5, "conda": [5, 7], "conda_prefix": 7, "condit": 3, "confer": 5, "confid": 5, "conll03": 5, "connect": [3, 5, 7], "consequenti": 0, "consequential_quest": [0, 5], "consid": [0, 5], "consist": 5, "consol": [1, 8], "const_image_summari": 5, "constant": [0, 5], "contain": [0, 2, 7], "content": [5, 6], "context": 5, "contract": 3, "contrib": 6, "conveni": 5, "convert": [0, 2], "coordin": 0, "copi": 3, "copyright": 3, "corner": [0, 1, 8], "correct": [5, 7], "correspond": 5, "cosequential_quest": 5, "could": 5, "count": 5, "countri": 5, "cover": 5, "cpp": 7, "cpu": [0, 5], "creat": [0, 1, 2, 7, 8], "creation": 5, "crop": [0, 2, 5], "crop_dir": 6, "crop_image_from_post": [0, 4], "crop_media_post": [0, 4, 6], "crop_post": 0, "crop_posts_from_ref": [0, 4, 6], "crop_posts_imag": [0, 4], "crop_view": [0, 6], "croppost": [2, 4, 6, 7], "crpo": 6, "css3": 0, "csv": [0, 2, 7], "csv_encod": 0, "csv_path": [0, 5], "cu11": 7, "cu118": 7, "cuda": [0, 5, 7], "cudatoolkit": 7, "cudnn": 7, "cudnn_path": 7, "current": [0, 1, 7, 8], "current_simularity_valu": 5, "cut": 0, "cv2": [0, 6], "cvtcolor": 6, "cyan": [0, 7], "d": [6, 7], "damag": 3, "dash": [0, 5], "dashboard": [1, 8], "data": [0, 2, 6, 7], "data_out": 5, "data_path": 5, "databas": 7, "datafram": [0, 2], "dataset": 2, "dbmdz": 5, "deactiv": 7, "deal": 3, "deepfac": [5, 7], "deepface_symlink_processor": [0, 4], "default": [0, 5], "defin": 5, "delet": 7, "delta": 0, "delta_e_method": 0, "demand": [0, 5], "demonstr": [2, 7], "depend": [5, 7], "dependend": 5, "depth": 7, "describ": 7, "descript": [5, 7], "descriptor": 0, "desir": 5, "detail": 5, "detect": [0, 2], "detector": [2, 7], "determin": [0, 5], "determinist": 0, "deterministic_summari": 5, "develop": [5, 7], "devic": 0, "device_typ": [0, 5], "df": 5, "dict": [0, 5], "dictionari": [0, 5], "differ": [5, 6], "directli": [1, 5, 8], "directori": [0, 5], "dirnam": 7, "discard": 5, "disclosur": 0, "disclosure_ammico": [0, 5], "disgust": 5, "disk": 7, "displai": [2, 4, 5], "distanc": 7, "distilbart": 5, "distilbert": 5, "distribut": 3, "dmatch": 0, "do": [3, 5, 7], "document": 3, "doe": [0, 5, 7], "doesn": 6, "dog": 5, "domin": 5, "don": 2, "done": [1, 5, 6, 7, 8], "dopamin": 5, "dot": [1, 8], "down": [1, 8], "download": [0, 1, 5, 7, 8], "downloadresourc": [0, 4], "draw_match": [0, 4], "drive": [1, 5, 6, 7, 8], "drop": [1, 8], "dropdown": 5, "due": [5, 6], "dump": [0, 5], "dump_df": [0, 4, 5], "dump_everi": 5, "dump_fil": 5, "e": [0, 7], "each": [0, 5], "easi": 5, "easier": 6, "easili": 5, "echo": 7, "either": [0, 5], "element": [5, 7], "emot": 5, "emotion_threshold": [0, 5], "emotiondetector": [0, 4, 5], "emotitiondetector": 5, "empti": [0, 5], "enabl": [2, 5, 7], "english": [0, 5, 7], "ensur": 5, "enter": [1, 8], "entiti": [0, 5, 7], "entity_typ": 5, "entri": [0, 5], "enumer": 5, "env_var": 7, "environ": [0, 5], "envorin": 5, "equip": 5, "error": [0, 5, 7], "estim": 0, "etc": 7, "ethic": 0, "ethical_disclosur": [0, 4, 5], "ethnic": 5, "even": 5, "event": 3, "everi": 5, "everyth": 6, "ex": 7, "exampl": [5, 6], "exclud": 0, "execut": [5, 6], "exist": 5, "exist_ok": 5, "experiment": [5, 7], "explain": 5, "explicitli": 5, "explor": [0, 5], "export": [5, 7], "express": [0, 2, 3, 7], "ext": 0, "extens": [5, 7], "extra": 6, "extrac": 7, "extract": 0, "extract_image_features_bas": [0, 4], "extract_image_features_blip2": [0, 4], "extract_image_features_clip": [0, 4], "extract_text_featur": [0, 4], "f": 6, "f2482bf": 5, "face": [2, 4, 7], "facial": [0, 2, 7], "facial_expression_analysi": [0, 4], "failsaf": 7, "fals": [0, 5, 6], "faq": 2, "fast": 5, "fear": 5, "featur": [0, 2], "feature_extractor": 0, "features_image_stack": [0, 5], "features_text": 0, "few": [5, 7], "field": 0, "figsiz": 6, "figur": 6, "file": [0, 1, 2, 3, 6, 7, 8], "filelist": 0, "filenam": [0, 5], "filepath": 0, "fill": 5, "filter": [0, 5], "filter_number_of_imag": [0, 5], "filter_rel_error": [0, 5], "filter_val_limit": [0, 5], "final_h": 0, "find": [0, 5, 6, 7], "find_fil": [0, 4, 5, 6], "fine": [5, 6], "finetun": 5, "first": [0, 1, 5, 6, 8], "fit": 3, "flag": 5, "flake8": [5, 6], "flan": 0, "flant5": 5, "flant5xl": 5, "flant5xxl": 5, "flex": 5, "float": [0, 5], "folder": [1, 6, 7, 8], "follow": [1, 3, 5, 7, 8], "forg": 7, "form": [0, 5], "format": [0, 5], "found": [0, 5, 6, 7], "fraction": 5, "frame": 0, "framework": 7, "frankfurt": 5, "free": [0, 1, 3, 8], "frequent": 0, "from": [0, 1, 3, 6, 7, 8], "full": 5, "function": [0, 5], "furnish": 3, "further": [2, 7], "g": 7, "gate": 5, "gb": [5, 7], "gbq": 5, "gender": [5, 7], "gender_threshold": [0, 5], "gener": [0, 2, 5, 7], "get": [0, 1, 4, 5, 7, 8], "get_att_map": [0, 4], "get_color_t": [0, 4], "get_datafram": [0, 4, 5], "get_ipython": [5, 6], "get_pathes_from_queri": [0, 4], "get_text_df": [0, 4], "get_text_dict": [0, 4], "get_text_from_imag": [0, 4], "gif": [0, 5], "git": [5, 6], "github": [5, 6], "give": 5, "given": [0, 5, 6], "global": 0, "go": [1, 8], "googl": [0, 2, 6], "google_application_credenti": [5, 7], "googletran": [5, 7], "gpu": [5, 7], "gradcam": 0, "grant": 3, "graphic": 2, "green": [0, 7], "grei": [0, 7], "h_margin": 0, "ha": [1, 5, 8], "happen": 2, "happi": 5, "have": [2, 5], "head": [5, 6], "heat": 5, "heavi": 5, "held": 7, "here": [1, 5, 7, 8], "herebi": 3, "high": 5, "hold": 5, "holder": 3, "horizont": 0, "hostedtoolcach": 0, "hour": 7, "how": [2, 5], "howev": 5, "hpc": 5, "http": [5, 6], "hug": 7, "huggingfac": 5, "human": 5, "i": [0, 1, 2, 3, 5, 6, 8], "id": [0, 1, 5, 8], "ideal": 5, "identifi": 5, "ignor": [0, 6], "imag": [0, 1, 2, 6, 8], "image_df": 5, "image_dict": 5, "image_example_path": 5, "image_example_queri": 5, "image_gradcam_with_itm": [0, 5], "image_kei": [0, 5], "image_nam": [0, 5], "image_path": 0, "image_summary_detector": 5, "image_summary_vqa_detector": 5, "image_text_match_reord": [0, 4, 5], "images_tensor": 0, "img": [0, 5], "img1": 0, "img2": 0, "img_path": 0, "immedi": 7, "imperfect": 6, "implement": 5, "impli": 3, "import": [2, 6, 7], "importlib_resourc": [5, 6], "improp": 6, "improv": 7, "imread": 6, "imshow": 6, "includ": [0, 3, 5], "incompat": 5, "increment": 5, "index": [0, 2, 7], "indic": 0, "inform": [1, 6, 7, 8], "inherit": 0, "iniati": 5, "init": 5, "initi": [0, 5, 7], "initialize_dict": [0, 4], "input": [0, 2, 7], "insid": 5, "inspect": 2, "instal": [2, 5, 6], "instanc": 5, "instead": 5, "instruct": [2, 5, 7], "int": [0, 5], "intellig": 7, "intens": 5, "interact": [0, 5], "interfac": 2, "internet": 2, "ipynb": 7, "is_interact": [0, 4], "isdir": 6, "item": [5, 6], "iter": [0, 4], "itm": [0, 5], "itm_model": [0, 5], "itm_model_typ": 0, "itm_scor": 5, "itm_scores2": 0, "itm_text_precess": [0, 4], "its": [5, 7], "iulusoi": 5, "jpeg": [0, 5], "jpg": [0, 5], "json": [1, 5, 7, 8], "jupyt": [1, 5, 8], "just": [0, 5, 7], "k": 5, "keep": 6, "kei": [0, 2, 7], "keypoint": 0, "keyword": [5, 7], "kind": 3, "kp1": 0, "kp2": 0, "kp_from_match": [0, 4], "kwarg": 0, "l": [0, 5], "languag": [0, 5, 7], "larg": [0, 5, 7], "large_coco": 0, "largest": 5, "later": 0, "latest": 6, "latter": [5, 7], "launch": 5, "lavi": [0, 5, 7], "ld_library_path": 7, "left": [1, 5, 8], "lemma": 7, "len": 5, "length": 0, "less": 5, "liabil": 3, "liabl": 3, "lib": [0, 7], "librari": [0, 5, 6, 7], "licens": 2, "lida": 5, "like": [1, 5, 8], "likelihood": 5, "limit": [0, 3, 5, 6], "line": [5, 6], "linebreak": [0, 5], "list": [0, 1, 5, 8], "list_of_quest": [0, 5], "live": 7, "llm": 5, "load": [0, 5, 6], "load_dataset": 5, "load_feature_extractor_model_albef": [0, 4], "load_feature_extractor_model_blip": [0, 4], "load_feature_extractor_model_blip2": [0, 4], "load_feature_extractor_model_clip_bas": [0, 4], "load_feature_extractor_model_clip_vitl14": [0, 4], "load_feature_extractor_model_clip_vitl14_336": [0, 4], "load_model": [0, 4], "load_model_bas": [0, 4], "load_model_base_blip2_opt_caption_coco_opt67b": [0, 4], "load_model_base_blip2_opt_pretrain_opt67b": [0, 4], "load_model_blip2_opt_caption_coco_opt27b": [0, 4], "load_model_blip2_opt_pretrain_opt27b": [0, 4], "load_model_blip2_t5_caption_coco_flant5xl": [0, 4], "load_model_blip2_t5_pretrain_flant5xl": [0, 4], "load_model_blip2_t5_pretrain_flant5xxl": [0, 4], "load_model_larg": [0, 4], "load_new_model": [0, 4], "load_tensor": [0, 4], "load_vqa_model": [0, 4], "local": [5, 7], "locat": [5, 7], "log": 7, "login": 5, "look": [0, 1, 5, 6, 8], "loop": 5, "lower": 5, "m": 7, "machin": [5, 7], "made": [5, 7], "mai": [5, 7], "main": [5, 7], "make": [1, 5, 7, 8], "man": 5, "manag": [1, 8], "mani": 5, "manual": 6, "map": [0, 5], "margin": 0, "mask": [0, 5, 7], "match": [0, 5, 6, 7], "matching_point": [0, 4], "matplotlib": 6, "maximum": [0, 5], "mean": 5, "media": [0, 2, 5, 6], "medicin": 5, "memori": [5, 7], "menu": [1, 5, 8], "merchant": 3, "merg": [0, 3], "merge_color": 0, "messag": 5, "metadata": 7, "method": [0, 5], "metric": [0, 7], "microsoft": 7, "might": 0, "min_match": 0, "minimum": [0, 5], "misinform": [2, 5], "miss": 0, "mit": 3, "mkdir": [5, 7], "model": [0, 7], "model_nam": [0, 5], "model_old": 0, "model_typ": [0, 5], "modifi": 3, "modul": [2, 7], "moment": 5, "month": [1, 8], "moral": 6, "more": [1, 5, 7, 8], "most": [0, 5], "mount": [5, 6], "msvc": 7, "much": 5, "multi_features_stack": 0, "multimod": [2, 4, 7], "multimodal_devic": [0, 4], "multimodal_search": [0, 4, 5, 7], "multimodalsearch": [0, 4, 5], "multipl": 5, "multiple_fac": 5, "must": 7, "mv": 6, "my_obj": 5, "mydict": [0, 5], "mydriv": 5, "n": [0, 5, 7], "n_color": 0, "name": [0, 1, 5, 6, 7, 8], "natur": 0, "ndarrai": 0, "necessari": [5, 7], "need": [0, 5, 7], "need_grad_cam": [0, 5], "neg": 5, "ner": 5, "nest": [0, 5], "neutral": 5, "new": [0, 1, 5, 7, 8], "next": 5, "nn": 0, "no_fac": 5, "non": 0, "nondeterministic_summari": 0, "none": [0, 5], "noninfring": 3, "noqa": [5, 6], "note": 5, "notebook": [1, 2, 6, 7, 8], "notic": 3, "now": [1, 5, 6, 8], "np": 0, "num": 5, "number": [0, 5, 7], "number_of_imag": 5, "numer": 5, "numpi": [0, 7], "nvidia": 7, "o": [5, 6, 7], "obj": 5, "object": [0, 5], "obtain": 3, "occur": 0, "off": 0, "offlin": 7, "old": 0, "onc": 5, "one": [0, 5, 7], "ones": 5, "onli": [0, 5, 6, 7], "onlin": 7, "open": 5, "opencv": 6, "oper": 7, "opt": [0, 5], "optim": 5, "option": [0, 5, 7], "orang": [0, 7], "orbax": 5, "order": [5, 7], "origin": [0, 5, 6], "other": [0, 3, 5, 7], "otherwis": [0, 3, 5], "our": [5, 7], "out": [1, 3, 5, 6, 7, 8], "outdict": 5, "output": [0, 2], "outsid": 5, "overal": 5, "overlap": 0, "own": 5, "p": [0, 7], "packag": [0, 2, 6], "page": [1, 2, 7, 8], "paid": 5, "panda": 2, "paper": 7, "paramet": [0, 5], "parent": 5, "pars": 0, "parsing_imag": [0, 4, 5], "part": [0, 6, 7], "parti": 7, "partial": 5, "particular": 3, "pass": 5, "past": 0, "paste_image_and_com": [0, 4], "path": [0, 5, 6], "path_post": 6, "path_ref": 6, "path_to_load_tensor": [0, 5], "path_to_save_tensor": [0, 5], "pathlib": 5, "patient": 5, "pattern": [0, 5], "peopl": 5, "per": [1, 8], "percentag": [0, 5, 7], "perform": [0, 5, 7], "period": 7, "perman": 5, "permiss": 3, "permit": 3, "persist": 7, "person": [3, 5, 7], "pick": [1, 8], "pictur": [0, 2], "pil": 0, "pin": 6, "pink": [0, 7], "pip": [5, 6], "pipelin": [0, 5, 7], "pkg": [5, 6], "place": [1, 5, 7, 8], "pleas": [5, 6, 7], "plot": 6, "plt": 6, "plt_crop": [0, 6], "plt_imag": [0, 6], "plt_match": [0, 6], "png": [0, 5, 6], "pngimageplugin": 0, "point": 0, "polar": 7, "politician": 5, "pooch": 0, "pop": [1, 5, 8], "port": [0, 5], "portion": 3, "posit": [0, 5], "possibl": [5, 7], "post": [0, 2, 5], "postprocesstext": [0, 4], "pre": [5, 7], "predict": [5, 7], "prefetch": 0, "prefix": 0, "prepar": 5, "preprocessor": 0, "presenc": [5, 7], "present": [0, 5], "preserv": 5, "press": 5, "pretrain": [0, 5], "pretrain_": 5, "pretrain_opt2": 0, "pretrain_opt6": 0, "prevent": [6, 7], "previou": 5, "primari": 5, "print": [6, 7], "prioriti": 7, "privat": [1, 5, 8], "probabl": 5, "problem": [0, 2], "process": [0, 1, 5, 7, 8], "product": 5, "profil": 5, "progress": 5, "project": [1, 7, 8], "prompt": [1, 5, 8], "proper": 7, "proport": 0, "provid": [0, 3, 5, 6, 7], "pt": [0, 5], "public": 7, "publish": 3, "purpl": [0, 7], "purpos": [3, 5], "put": [0, 7], "py": [0, 7], "pycocotool": 7, "pyplot": 6, "python": [0, 1, 5, 6, 7, 8], "python3": 0, "q": 6, "qq": 6, "qqq": [5, 6], "queri": [0, 2, 7], "querys_process": [0, 4], "question": [0, 5, 7], "quit": 5, "race": [5, 7], "race_threshold": [0, 5], "ram": 5, "random": [0, 5], "random_se": [0, 5], "rank": 5, "raw_imag": 0, "raw_img": 0, "re": [5, 6, 7], "read": [0, 2], "read_and_process_imag": [0, 4], "read_and_process_images_itm": [0, 4], "read_csv": [0, 4, 5], "read_img": [0, 4], "receiv": 7, "recogn": 7, "recognit": [0, 5], "recurs": [0, 5], "red": [0, 7], "reduc": [0, 5], "ref": [5, 6], "ref_dir": 6, "ref_fil": [0, 6], "ref_view": [0, 6], "refer": [0, 1, 5, 6, 8], "region": [0, 6], "regist": 0, "reject": 5, "rel": 0, "relev": 5, "rememb": 5, "remot": 0, "remov": [0, 6, 7], "remove_linebreak": [0, 4], "reorder": 0, "report": 5, "repositori": 5, "represent": 5, "request": 7, "requir": [0, 5, 7], "rerun": 5, "resiz": 0, "resize_img": [0, 4], "resized_imag": 0, "resourc": [0, 4, 5], "respect": 5, "respond": 5, "respons": 7, "restart": 5, "restrict": [3, 7], "result": [0, 7], "retinafac": [5, 7], "return": [0, 5, 7], "return_top": 0, "revis": 5, "revision_numb": [0, 5], "rf": 6, "rgb": 0, "rgb2name": [0, 4], "rgb_ref_view": 6, "rgb_view": 6, "right": [1, 3, 5, 8], "rl": 5, "rm": 6, "row": 5, "run": [0, 1, 5, 6, 7, 8], "run_serv": [0, 4, 5], "runtim": 5, "sad": 5, "same": [5, 6, 7], "sampl": [6, 7], "save": [0, 6], "save_crop_dir": [0, 6], "save_tensor": [0, 4], "saved_features_imag": 0, "saved_tensor": 0, "score": 0, "screen": [1, 8], "screenshot": [1, 8], "script": 7, "sdk": 7, "search": [1, 2, 4, 7, 8], "search_queri": [0, 5], "second": [0, 5], "section": 5, "see": [1, 5, 7, 8], "seed": [0, 5], "seem": 6, "select": [0, 1, 8], "self": 0, "sell": 3, "send": 7, "sent": 2, "sentiment": [0, 5, 7], "sentiment_scor": 5, "separ": 5, "sequenti": 5, "server": [0, 5], "servic": [1, 7, 8], "session": 5, "set": [0, 1, 2, 6, 7, 8], "set_kei": [0, 4], "setuptool": [5, 6], "seven": 5, "sever": [5, 7], "sh": 7, "shade": 0, "shall": 3, "share": 7, "shell": 5, "short": 7, "shortcom": 5, "shot": 5, "should": [0, 1, 5, 8], "show": [0, 1, 5, 6, 8], "show_result": [0, 4, 5], "showcas": 5, "shown": 5, "shuffel": 0, "shuffl": [0, 5], "sidebar": 5, "sift": 0, "sign": [1, 8], "signifi": [0, 5], "similar": [0, 5, 7], "simultan": 5, "sinc": 5, "singl": [0, 5], "site": 0, "size": [0, 5, 7], "skip": 5, "skip_extract": [0, 5], "slightli": 5, "slower": 5, "small": 0, "smaller": [0, 5], "so": [0, 3, 5, 7], "social": [0, 5, 6, 7], "softwar": 3, "solv": 2, "some": [5, 6, 7], "someth": [1, 5, 6, 8], "sometim": [0, 5, 6, 7], "sort": 0, "sorted_list": [0, 5], "sourc": [5, 7], "space": 7, "spaci": [5, 7], "special": 5, "specif": [0, 5], "specifi": 5, "speech": 7, "spell": 7, "ssc": 3, "ssciwr": [5, 6], "sshleifer": 5, "sst": 5, "stack": 0, "start": 0, "state": 7, "step": [2, 6, 7], "still": 2, "store": [5, 7], "str": [0, 5, 6], "string": 5, "studio": 7, "style": 5, "subdict": [0, 5], "subdirectori": [0, 5], "subfold": 5, "subject": [3, 7], "sublicens": 3, "subsequ": 5, "substanti": 3, "substitut": 6, "subtract": 0, "suffix": 0, "suitabl": 5, "summar": 5, "summari": [2, 4, 7], "summary_and_quest": [0, 5], "summary_model": 0, "summary_vis_processor": 0, "summary_vqa_model": 0, "summary_vqa_model_new": 0, "summary_vqa_txt_processor": 0, "summary_vqa_txt_processors_new": 0, "summary_vqa_vis_processor": 0, "summary_vqa_vis_processors_new": 0, "summarydetector": [0, 4, 5], "sure": [1, 5, 8], "surpris": 5, "syntax": 5, "system": 0, "t": [2, 6], "t5": 0, "ta": 5, "tab": 5, "tabl": 5, "take": [0, 5], "taken": [0, 5], "task": [5, 7], "tell": 5, "temporarili": 7, "ten": 0, "tensor": [0, 5], "tensorflow": 5, "tesor": 0, "test": [2, 6], "text": [2, 4, 6], "text_clean": [5, 7], "text_df": 5, "text_dict": 5, "text_english": [0, 5, 7], "text_english_correct": 7, "text_input": [0, 5], "text_languag": [5, 7], "text_ner": [0, 4], "text_query_index": 0, "text_sentiment_transform": [0, 4], "text_summari": [0, 4, 5], "textanalyz": [0, 4, 5], "textblob": 7, "textdetector": [0, 4, 5], "textual": 7, "tf": 5, "than": [1, 5, 8], "thei": [0, 5, 7], "them": 5, "therefor": 5, "thi": [0, 1, 3, 5, 6, 7, 8], "third": 7, "three": [1, 5, 8], "threshold": 5, "through": [0, 5], "thrown": 5, "thu": 5, "tiff": [0, 5], "time": [5, 7], "to_csv": 5, "togeth": 0, "toggl": 5, "token": [0, 7], "tokenized_text": 0, "tool": 2, "top": [1, 5, 8], "top1": 5, "topic": [0, 5, 7], "torch": [0, 7], "torchaudio": [5, 7], "torchdata": 5, "torchtext": 5, "torchvis": 7, "tort": 3, "total": 5, "tpu": 5, "tqdm": 5, "train": [0, 5], "transform": [0, 5, 7], "translat": [0, 2], "translate_text": [0, 4], "true": [0, 5, 6, 7], "try": 5, "ttl": 7, "tune": 5, "tupl": 0, "two": [0, 5, 7], "txt_processor": [0, 5], "type": [0, 5, 6], "typic": 7, "ummary_and_quest": 5, "uncas": 5, "uncom": 5, "under": 7, "unecessari": 0, "uninstal": [5, 6], "union": 0, "unrecogn": [0, 7], "unrecogniz": 5, "unset": 5, "unzip": 6, "up": [0, 1, 5, 7, 8], "updat": [0, 5], "update_pictur": [0, 4], "upload": [1, 7, 8], "upload_model_blip2_coco": [0, 4], "upload_model_blip_bas": [0, 4], "upload_model_blip_larg": [0, 4], "upon": 5, "url": 7, "us": [0, 1, 2, 3, 8], "usa": 5, "usag": 2, "use_csv": 0, "user": [0, 2, 7], "utf": 0, "util": [2, 4, 6], "v": 7, "v143": 7, "v2": 5, "v_margin": 0, "valu": [0, 5], "variabl": [0, 5, 7], "veri": [5, 7], "version": [5, 6, 7], "vertic": [0, 1, 8], "via": 5, "video": 5, "view": [0, 6], "vis_processor": [0, 5], "vision": [0, 2], "visual": [0, 5, 7], "visual_input": 0, "visualstudio": 7, "vit": [0, 5], "vqa": [0, 5], "vram": 5, "vs_buildtool": 7, "wa": [0, 5, 7], "wai": [5, 6], "want": [5, 7], "warranti": 3, "we": [0, 5, 6], "wear": [0, 5, 7], "wears_mask": [0, 4, 5], "webp": [0, 5], "websit": 7, "well": 5, "wget": 6, "what": [2, 5], "when": [1, 5, 6, 7, 8], "where": [0, 1, 5, 7, 8], "whether": [0, 3], "which": [0, 5, 6, 7], "while": [0, 5], "white": [0, 7], "whitespac": 5, "whl": 7, "whole": 5, "whom": 3, "why": 5, "width": 0, "window": [1, 8], "wish": [1, 8], "without": [0, 3, 5, 7], "won": 7, "word": [0, 5, 7], "work": [0, 5, 6, 7], "world": 5, "worn": 5, "wrapper": 0, "write": [0, 2], "written": [0, 5], "wrong": 6, "x64": [0, 7], "x86": 7, "xl": 0, "xxl": 0, "y": [5, 6], "ye": 5, "yellow": [0, 7], "yet": 0, "you": [1, 5, 6, 7, 8], "your": [1, 2, 6, 7, 8], "zero": 5, "zip": 6}, "titles": ["text module", "Instructions how to generate and enable a google Cloud Vision API key", "Welcome to AMMICO\u2019s documentation!", "License", "AMMICO package modules", "AMMICO Demonstration Notebook", "Crop posts module", "AMMICO - AI Media and Misinformation Content Analysis Tool", "Instructions how to generate and enable a google Cloud Vision API key"], "titleterms": {"": 2, "0": 5, "1": [5, 7], "2": [5, 7], "3": [5, 7], "4": 5, "The": 5, "access": 7, "after": 7, "ai": 7, "all": 5, "ammico": [2, 4, 5, 7], "analys": 5, "analysi": [5, 7], "analyz": 5, "api": [1, 8], "ar": 7, "blip2": 5, "can": 7, "cloud": [1, 5, 7, 8], "color": [5, 7], "color_analysi": 0, "compat": 7, "contain": 5, "content": [2, 7], "convert": 5, "creat": 5, "crop": [6, 7], "croppost": 0, "csv": 5, "data": 5, "datafram": 5, "dataset": 5, "demonstr": 5, "detect": [5, 7], "detector": 5, "disclosur": 5, "displai": 0, "document": 2, "don": 7, "emot": 7, "enabl": [1, 8], "environ": 7, "ethic": 5, "express": 5, "extract": [5, 7], "face": [0, 5], "facial": 5, "faq": 7, "featur": [5, 7], "file": 5, "first": 7, "folder": 5, "formul": 5, "from": 5, "further": 5, "gener": [1, 8], "googl": [1, 5, 7, 8], "graphic": 5, "happen": 7, "have": 7, "how": [1, 8], "http": 7, "hue": 7, "i": 7, "imag": [5, 7], "import": 5, "improv": 5, "index": 5, "indic": 2, "input": 5, "inspect": 5, "instal": 7, "instruct": [1, 8], "interfac": 5, "internet": 7, "kei": [1, 5, 8], "licens": 3, "media": 7, "micromamba": 7, "misinform": 7, "model": 5, "modul": [0, 4, 5, 6], "multimod": [0, 5], "notebook": 5, "org": 7, "output": 5, "packag": [4, 5, 7], "panda": 5, "pictur": 5, "pip": 7, "post": [6, 7], "prepar": 7, "problem": 7, "pytorch": 7, "queri": 5, "read": 5, "recognit": 7, "result": 5, "right": 7, "save": 5, "search": [0, 5], "second": 7, "select": 5, "sent": 7, "set": 5, "solv": 7, "statement": 5, "step": 5, "still": 7, "summari": [0, 5], "t": 7, "tabl": 2, "tensorflow": 7, "test": 5, "text": [0, 5, 7], "tool": 7, "translat": [5, 7], "us": [5, 7], "usag": 7, "user": 5, "util": 0, "vision": [1, 5, 7, 8], "we": 7, "welcom": 2, "what": 7, "window": 7, "write": 5, "www": 7, "your": 5}}) \ No newline at end of file diff --git a/source/notebooks/DemoNotebook_ammico.ipynb b/source/notebooks/DemoNotebook_ammico.ipynb index 292a93d..f6a53da 100644 --- a/source/notebooks/DemoNotebook_ammico.ipynb +++ b/source/notebooks/DemoNotebook_ammico.ipynb @@ -166,7 +166,7 @@ "source": [ "image_dict = ammico.find_files(\n", " # path=\"/content/drive/MyDrive/misinformation-data/\",\n", - " path=data_path.as_posix(),\n", + " path=str(data_path),\n", " limit=15,\n", ")" ] @@ -177,7 +177,30 @@ "source": [ "## Step 2: Inspect the input files using the graphical user interface\n", "A Dash user interface is to select the most suitable options for the analysis, before running a complete analysis on the whole data set. The options for each detector module are explained below in the corresponding sections; for example, different models can be selected that will provide slightly different results. This way, the user can interactively explore which settings provide the most accurate results. In the interface, the nested `image_dict` is passed through the `AnalysisExplorer` class. The interface is run on a specific port which is passed using the `port` keyword; if a port is already in use, it will return an error message, in which case the user should select a different port number. \n", - "The interface opens a dash app inside the Jupyter Notebook and allows selection of the input file in the top left dropdown menu, as well as selection of the detector type in the top right, with options for each detector type as explained below. The output of the detector is shown directly on the right next to the image. This way, the user can directly inspect how updating the options for each detector changes the computed results, and find the best settings for a production run." + "The interface opens a dash app inside the Jupyter Notebook and allows selection of the input file in the top left dropdown menu, as well as selection of the detector type in the top right, with options for each detector type as explained below. The output of the detector is shown directly on the right next to the image. This way, the user can directly inspect how updating the options for each detector changes the computed results, and find the best settings for a production run.\n", + "\n", + "### Ethical disclosure statement\n", + "\n", + "If you want to run an analysis using the EmotionDetector detector type, you have first have to respond to an ethical disclosure statement. This disclosure statement ensures that you only use the full capabilities of the EmotionDetector after you have been made aware of its shortcomings.\n", + "\n", + "For this, answer \"yes\" or \"no\" to the below prompt. This will set an environment variable with the name given as in `accept_disclosure`. To re-run the disclosure prompt, unset the variable by uncommenting the line `os.environ.pop(accept_disclosure, None)`. To permanently set this envorinment variable, add it to your shell via your `.profile` or `.bashr` file.\n", + "\n", + "If the disclosure statement is accepted, the EmotionDetector will perform age, gender and race/ethnicity classification dependend on the provided thresholds. If the disclosure is rejected, only the presence of faces and emotion (if not wearing a mask) is detected." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# respond to the disclosure statement\n", + "# this will set an environment variable for you\n", + "# if you do not want to re-accept the disclosure every time, you can set this environment variable in your shell\n", + "# to re-set the environment variable, uncomment the below line\n", + "accept_disclosure = \"DISCLOSURE_AMMICO\"\n", + "# os.environ.pop(accept_disclosure, None)\n", + "_ = ammico.ethical_disclosure(accept_disclosure=accept_disclosure)" ] }, { @@ -822,7 +845,7 @@ "metadata": {}, "source": [ "## Detection of faces and facial expression analysis\n", - "Faces and facial expressions are detected and analyzed using the `EmotionDetector` class from the `faces` module. Initially, it is detected if faces are present on the image using RetinaFace, followed by analysis if face masks are worn (Face-Mask-Detection). The detection of age, gender, race, and emotions is carried out with deepface.\n", + "Faces and facial expressions are detected and analyzed using the `EmotionDetector` class from the `faces` module. Initially, it is detected if faces are present on the image using RetinaFace, followed by analysis if face masks are worn (Face-Mask-Detection). The detection of age, gender, race, and emotions is carried out with deepface, but only if the disclosure statement has been accepted (see above).\n", "\n", "\n", "\n", @@ -832,10 +855,11 @@ "\n", "From the seven facial expressions, an overall dominating emotion category is identified: negative, positive, or neutral emotion. These are defined with the facial expressions angry, disgust, fear and sad for the negative category, happy for the positive category, and surprise and neutral for the neutral category.\n", "\n", - "A similar threshold as for the emotion recognition is set for the race detection, `race_threshold`, with the default set to 50% so that a confidence for the race above 0.5 only will return a value in the analysis. \n", + "A similar threshold as for the emotion recognition is set for the race/ethnicity, gender and age detection, `race_threshold`, `gender_threshold`, `age_threshold`, with the default set to 50% so that a confidence for the race above 0.5 only will return a value in the analysis. \n", "\n", - "Summarizing, the face detection is carried out using the following method call and keywords, where `emotion_threshold` and \n", - "`race_threshold` are optional:" + "You may also pass the name of the environment variable that determines if you accept or reject the ethical disclosure statement. By default, the variable is named `DISCLOSURE_AMMICO`.\n", + "\n", + "Summarizing, the face detection is carried out using the following method call and keywords, where `emotion_threshold`, `race_threshold`, `gender_threshold`, `age_threshold` are optional:" ] }, { @@ -845,7 +869,9 @@ "outputs": [], "source": [ "for key in image_dict.keys():\n", - " image_dict[key] = ammico.EmotionDetector(image_dict[key], emotion_threshold=50, race_threshold=50).analyse_image()" + " image_dict[key] = ammico.EmotionDetector(image_dict[key], emotion_threshold=50, race_threshold=50,\n", + " gender_threshold=50, age_threshold=50, \n", + " accept_disclosure=\"DISCLOSURE_AMMICO\").analyse_image()" ] }, {