Cách kiểm tra hướng hình ảnh trong python

Kiểm tra định hướng

Các mô hình để kiểm tra xem hình ảnh có bị xoay 0, 90, 180, 270 độ không

Cài đặt

pip install -U check_orientation

Ví dụ suy luận

Sổ tay Colab với ví dụ.

Tập huấn

Xác định cấu hình

Ví dụ tại check_orientation/configs

Xác định biến môi trường TRAIN_IMAGE_PATH trỏ đến thư mục có tập dữ liệu tàu

Thí dụ

export TRAIN_IMAGE_PATH=

Xác định biến môi trường VAL_IMAGE_PATH trỏ đến thư mục có tập dữ liệu xác thực

Thí dụ

export VAL_IMAGE_PATH=

Tập huấn

python -m check_orientation.train -c 

Sự suy luận

python -m torch.distributed.launch --nproc_per_node= check_orientation/inference.py \
                                   -i  \
                                   -c  \
                                   -w  \
                                   -o  \
                                   --fp16

Người mẫu được đào tạo trước

Các mô hình đã được đào tạo trước trên bộ dữ liệu OpenImages

Mô hình Độ chính xác của xác thựcTệp cấu hìnhWeightsswsl_resnext50_32x4d0. 9128Liên kếtLiên kết

Các ứng dụng sử dụng Amazon Rekognition Image thường cần hiển thị các hình ảnh được phát hiện bởi các hoạt động của Amazon Rekognition Image và các hộp xung quanh các khuôn mặt được phát hiện. Để hiển thị hình ảnh chính xác trong ứng dụng của bạn, bạn cần biết hướng của hình ảnh. Bạn có thể cần phải sửa hướng này. Đối với một số. jpg, hướng của hình ảnh được chứa trong siêu dữ liệu định dạng tệp hình ảnh có thể trao đổi [Exif] của hình ảnh

Để hiển thị một hộp xung quanh một mặt, bạn cần tọa độ cho hộp giới hạn của mặt. Nếu hộp không được định hướng chính xác, bạn có thể cần điều chỉnh các tọa độ đó. Amazon Rekognition Image hoạt động phát hiện khuôn mặt trả về tọa độ hộp giới hạn cho từng khuôn mặt được phát hiện nhưng không ước tính tọa độ cho. jpg không có siêu dữ liệu Exif

Các ví dụ sau đây cho biết cách lấy tọa độ hộp giới hạn cho các khuôn mặt được phát hiện trong ảnh

Sử dụng thông tin trong ví dụ này để đảm bảo rằng hình ảnh của bạn được định hướng chính xác và các hộp giới hạn được hiển thị ở đúng vị trí trong ứng dụng của bạn

Do mã được sử dụng để xoay và hiển thị hình ảnh cũng như hộp giới hạn phụ thuộc vào ngôn ngữ và môi trường mà bạn sử dụng nên chúng tôi không giải thích cách hiển thị hình ảnh và hộp giới hạn trong mã của bạn hoặc cách nhận thông tin hướng từ siêu dữ liệu Exif

Tìm hướng của một hình ảnh

Để hiển thị hình ảnh chính xác trong ứng dụng của bạn, bạn có thể cần phải xoay hình ảnh đó. Hình ảnh sau đây được định hướng 0 độ và được hiển thị chính xác

Tuy nhiên hình sau bị xoay 90 độ ngược chiều kim đồng hồ. Để hiển thị chính xác, bạn cần tìm hướng của hình ảnh và sử dụng thông tin đó trong mã của bạn để xoay hình ảnh về 0 độ

Một số hình ảnh trong. định dạng jpg chứa thông tin định hướng trong siêu dữ liệu Exif. Nếu có, siêu dữ liệu Exif cho hình ảnh chứa hướng. Trong siêu dữ liệu Exif, bạn có thể tìm thấy hướng của hình ảnh trong trường orientation. Mặc dù Amazon Rekognition Image xác định sự hiện diện của thông tin định hướng hình ảnh trong siêu dữ liệu Exif, nhưng nó không cung cấp quyền truy cập vào thông tin đó. Để truy cập siêu dữ liệu Exif trong một hình ảnh, hãy sử dụng thư viện của bên thứ ba hoặc viết mã của riêng bạn. Để biết thêm thông tin, hãy xem Exif Phiên bản 2. 32

Khi bạn biết hướng của hình ảnh, bạn có thể viết mã để xoay và hiển thị chính xác hình ảnh đó

Hiển thị hộp giới hạn

Các thao tác Amazon Rekognition Image phân tích các khuôn mặt trong một hình ảnh cũng trả về tọa độ của các hộp giới hạn bao quanh các khuôn mặt. Để biết thêm thông tin, xem BoundingBox

Để hiển thị hộp giới hạn xung quanh một mặt, tương tự như hộp được hiển thị trong hình ảnh sau đây, trong ứng dụng của bạn, hãy sử dụng tọa độ hộp giới hạn trong mã của bạn. Tọa độ hộp giới hạn được trả về bởi một thao tác phản ánh hướng của hình ảnh. Nếu bạn phải xoay hình ảnh để hiển thị chính xác, bạn có thể cần dịch tọa độ hộp giới hạn

Nếu hướng của hình ảnh được bao gồm trong siêu dữ liệu Exif, thì các thao tác của Amazon Rekognition Image sẽ thực hiện như sau

  • Trả về null trong trường hiệu chỉnh hướng trong phản hồi của thao tác. Để xoay hình ảnh, hãy sử dụng hướng được cung cấp trong siêu dữ liệu Exif trong mã của bạn

  • Trả về tọa độ hộp giới hạn đã được định hướng về 0 độ. Để hiển thị hộp giới hạn ở đúng vị trí, hãy sử dụng tọa độ đã được trả về. Bạn không cần phải dịch chúng

Thí dụ. Nhận định hướng hình ảnh và tọa độ hộp giới hạn cho một hình ảnh

Các ví dụ sau đây cho biết cách sử dụng SDK AWS để lấy dữ liệu định hướng ảnh Exif và tọa độ hộp giới hạn cho những người nổi tiếng được phát hiện bởi thao tác

export VAL_IMAGE_PATH=
0

Hỗ trợ ước tính hướng hình ảnh bằng trường

export VAL_IMAGE_PATH=
1 đã ngừng kể từ tháng 8 năm 2021. Mọi giá trị được trả về cho trường này được bao gồm trong phản hồi API sẽ luôn là NULL

Java

Ví dụ này tải một hình ảnh từ hệ thống tệp cục bộ, gọi thao tác

export VAL_IMAGE_PATH=
0, xác định chiều cao và chiều rộng của hình ảnh và tính toán tọa độ hộp giới hạn của khuôn mặt cho hình ảnh được xoay. Ví dụ này không hiển thị cách xử lý thông tin định hướng được lưu trữ trong siêu dữ liệu Exif

Trong hàm

export VAL_IMAGE_PATH=
3, thay thế giá trị của
export VAL_IMAGE_PATH=
4 bằng tên và đường dẫn của hình ảnh được lưu trữ cục bộ trong một trong hai. png hoặc. định dạng jpg

//Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//PDX-License-Identifier: MIT-0 [For details, see //github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.]

package com.amazonaws.samples;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.List;
import javax.imageio.ImageIO;
import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder;
import com.amazonaws.services.rekognition.model.Image;
import com.amazonaws.services.rekognition.model.RecognizeCelebritiesRequest;
import com.amazonaws.services.rekognition.model.RecognizeCelebritiesResult;
import com.amazonaws.util.IOUtils;
import com.amazonaws.services.rekognition.model.AmazonRekognitionException;
import com.amazonaws.services.rekognition.model.BoundingBox;
import com.amazonaws.services.rekognition.model.Celebrity;
import com.amazonaws.services.rekognition.model.ComparedFace;

public class RotateImage {

public static void main[String[] args] throws Exception {

  String photo = "photo.png";

  //Get Rekognition client
 AmazonRekognition amazonRekognition = AmazonRekognitionClientBuilder.defaultClient[];


  // Load image
  ByteBuffer imageBytes=null;
  BufferedImage image = null;

  try [InputStream inputStream = new FileInputStream[new File[photo]]] {
     imageBytes = ByteBuffer.wrap[IOUtils.toByteArray[inputStream]];

  }
  catch[Exception e]
  {
      System.out.println["Failed to load file " + photo];
      System.exit[1];
  }

  //Get image width and height
  InputStream imageBytesStream;
  imageBytesStream = new ByteArrayInputStream[imageBytes.array[]];

  ByteArrayOutputStream baos = new ByteArrayOutputStream[];
  image=ImageIO.read[imageBytesStream];
  ImageIO.write[image, "jpg", baos];

  int height = image.getHeight[];
  int width = image.getWidth[];

  System.out.println["Image Information:"];
  System.out.println[photo];
  System.out.println["Image Height: " + Integer.toString[height]];
  System.out.println["Image Width: " + Integer.toString[width]];

  //Call GetCelebrities

  try{
    RecognizeCelebritiesRequest request = new RecognizeCelebritiesRequest[]
           .withImage[new Image[]
              .withBytes[[imageBytes]]];


      RecognizeCelebritiesResult result = amazonRekognition.recognizeCelebrities[request];
      // The returned value of OrientationCorrection will always be null
      System.out.println["Orientation: " + result.getOrientationCorrection[] + "\n"];
      List  celebs = result.getCelebrityFaces[];

      for [Celebrity celebrity: celebs] {
          System.out.println["Celebrity recognized: " + celebrity.getName[]];
          System.out.println["Celebrity ID: " + celebrity.getId[]];
          ComparedFace  face = celebrity.getFace[]
;             ShowBoundingBoxPositions[height,
                  width,
                  face.getBoundingBox[],
                  result.getOrientationCorrection[]];
                 
            System.out.println[];
       }

   } catch [AmazonRekognitionException e] {
      e.printStackTrace[];
   }

}


public static void ShowBoundingBoxPositions[int imageHeight, int imageWidth, BoundingBox box, String rotation] {

  float left = 0;
  float top = 0;
   
  if[rotation==null]{
      System.out.println["No estimated estimated orientation. Check Exif data."];
      return;
  }
  //Calculate face position based on image orientation.
  switch [rotation] {
     case "ROTATE_0":
        left = imageWidth * box.getLeft[];
        top = imageHeight * box.getTop[];
        break;
     case "ROTATE_90":
        left = imageHeight * [1 - [box.getTop[] + box.getHeight[]]];
        top = imageWidth * box.getLeft[];
        break;
     case "ROTATE_180":
        left = imageWidth - [imageWidth * [box.getLeft[] + box.getWidth[]]];
        top = imageHeight * [1 - [box.getTop[] + box.getHeight[]]];
        break;
     case "ROTATE_270":
        left = imageHeight * box.getTop[];
        top = imageWidth * [1 - box.getLeft[] - box.getWidth[]];
        break;
     default:
        System.out.println["No estimated orientation information. Check Exif data."];
        return;
  }

  //Display face location information.
  System.out.println["Left: " + String.valueOf[[int] left]];
  System.out.println["Top: " + String.valueOf[[int] top]];
  System.out.println["Face Width: " + String.valueOf[[int][imageWidth * box.getWidth[]]]];
  System.out.println["Face Height: " + String.valueOf[[int][imageHeight * box.getHeight[]]]];

  }
}
 
Trăn

Ví dụ này sử dụng thư viện hình ảnh PIL/Gối ​​để lấy chiều rộng và chiều cao của hình ảnh. Để biết thêm thông tin, xem Gối. Ví dụ này bảo tồn siêu dữ liệu exif mà bạn có thể cần ở nơi khác trong ứng dụng của mình

Trong hàm

export VAL_IMAGE_PATH=
3, thay thế giá trị của
export VAL_IMAGE_PATH=
4 bằng tên và đường dẫn của hình ảnh được lưu trữ cục bộ trong một trong hai. png hoặc. định dạng jpg

#Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#PDX-License-Identifier: MIT-0 [For details, see //github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.]

import boto3
import io
from PIL import Image


# Calculate positions from from estimated rotation
def show_bounding_box_positions[imageHeight, imageWidth, box]:
    left = 0
    top = 0

    print['Left: ' + '{0:.0f}'.format[left]]
    print['Top: ' + '{0:.0f}'.format[top]]
    print['Face Width: ' + "{0:.0f}".format[imageWidth * box['Width']]]
    print['Face Height: ' + "{0:.0f}".format[imageHeight * box['Height']]]


def celebrity_image_information[photo]:
    client = boto3.client['rekognition']

    # Get image width and height
    image = Image.open[open[photo, 'rb']]
    width, height = image.size

    print['Image information: ']
    print[photo]
    print['Image Height: ' + str[height]]
    print['Image Width: ' + str[width]]

    # call detect faces and show face age and placement
    # if found, preserve exif info
    stream = io.BytesIO[]
    if 'exif' in image.info:
        exif = image.info['exif']
        image.save[stream, format=image.format, exif=exif]
    else:
        image.save[stream, format=image.format]
    image_binary = stream.getvalue[]

    response = client.recognize_celebrities[Image={'Bytes': image_binary}]

    print[]
    print['Detected celebrities for ' + photo]

    for celebrity in response['CelebrityFaces']:
        print['Name: ' + celebrity['Name']]
        print['Id: ' + celebrity['Id']]

        # Value of "orientation correction" will always be null
        if 'OrientationCorrection' in response:
            show_bounding_box_positions[height, width, celebrity['Face']['BoundingBox']]

        print[]
    return len[response['CelebrityFaces']]


def main[]:
    photo = 'photo'

    celebrity_count = celebrity_image_information[photo]
    print["celebrities detected: " + str[celebrity_count]]


if __name__ == "__main__":
    main[]
Java V2

Mã này được lấy từ kho lưu trữ GitHub ví dụ về Tài liệu SDK AWS. Xem ví dụ đầy đủ tại đây

Hình ảnh định hướng là gì?

Hai loại hướng phổ biến nhất là dọc và ngang . Thuật ngữ "định hướng chân dung" xuất phát từ thuật ngữ nghệ thuật thị giác và mô tả các kích thước được sử dụng để chụp khuôn mặt và phần thân trên của một người trong ảnh; .

Các lệnh xoay hình ảnh là gì?

Xoay hình ảnh trong 2 bước. .
Với hình ảnh của bạn đang mở trong Photoshop, hãy vào Image > Image Rotation
Chọn từ các tùy chọn xoay ảnh — 90 độ theo chiều kim đồng hồ, 90 độ ngược chiều kim đồng hồ hoặc 180 độ

Chủ Đề