Làm cách nào để trích xuất siêu dữ liệu hình ảnh trong Python?

Điện thoại thông minh và máy ảnh kỹ thuật số hiện đại nhúng nhiều thông tin (chẳng hạn như kiểu máy ảnh, thời gian và thậm chí cả tọa độ GPS) trong mỗi bức ảnh họ chụp

Bạn có thể tìm thấy những thông tin này bằng cách nhấp chuột phải vào hình ảnh và chọn “Properties” (trong Windows và…

Siêu dữ liệu là “dữ liệu cung cấp thông tin về dữ liệu khác”. Nói một cách đơn giản Dữ liệu về dữ liệu là Siêu dữ liệu. Siêu dữ liệu có nhiều mục đích khác nhau. Nó giúp người dùng tìm thông tin liên quan và khám phá tài nguyên

“Bất kỳ hệ thống nào cũng chỉ tốt khi siêu dữ liệu mà nó nhập vào. ”
- Chris Bulock

Tôi hy vọng thuật ngữ siêu dữ liệu hiện đã rõ ràng, Bây giờ đến phần Siêu dữ liệu hình ảnh…Một lượng đáng kể dữ liệu ẩn được ghi lại bất cứ khi nào bạn chụp ảnh bằng máy ảnh kỹ thuật số hoặc điện thoại thông minh

Siêu dữ liệu ảnh là một tập hợp dữ liệu mô tả và cung cấp thông tin về quyền và việc quản lý ảnh. Dữ liệu này còn được gọi là siêu dữ liệu EXIF

Đây là một ví dụ về siêu dữ liệu hình ảnh trông như thế nào

Phần hộp màu đỏ là siêu dữ liệu hình ảnh

Trước tiên, chúng tôi sẽ phải cài đặt Thư viện hình ảnh gối Python. thêm hỗ trợ để mở, thao tác và lưu nhiều định dạng tệp hình ảnh khác nhau. Bạn có thể tải xuống bằng cách sử dụng “pip install gối” hoặc bằng cách kiểm tra nó trong tài liệu dựa trên hệ điều hành của bạn

Trong hướng dẫn này, bạn sẽ tìm hiểu cách trích xuất một số siêu dữ liệu hữu ích trong hình ảnh bằng thư viện Gối trong Python

Các thiết bị như máy ảnh kỹ thuật số, điện thoại thông minh và máy quét sử dụng tiêu chuẩn EXIF ​​để lưu hình ảnh hoặc tệp âm thanh. Tiêu chuẩn này chứa nhiều thẻ hữu ích để trích xuất có thể hữu ích cho điều tra pháp y, chẳng hạn như kiểu dáng, kiểu thiết bị, ngày và giờ chính xác tạo hình ảnh và thậm chí cả thông tin GPS trên một số thiết bị

Xin lưu ý rằng có các công cụ miễn phí để trích xuất siêu dữ liệu như ImageMagick hoặc ExifTool trên Linux, mục tiêu của hướng dẫn này là trích xuất siêu dữ liệu bằng ngôn ngữ lập trình Python

Để bắt đầu, bạn cần cài đặt thư viện Gối

pip3 install Pillow

Mở một tệp Python mới và làm theo

from PIL import Image
from PIL.ExifTags import TAGS

Bây giờ điều này sẽ chỉ hoạt động trên các tệp hình ảnh JPEG, lấy bất kỳ hình ảnh nào bạn đã chụp và kiểm tra nó cho hướng dẫn này

# path to the image or video
imagename = "image.jpg"
# read the image data using PIL
image = Image.open(imagename)

Chúng tôi đã tải hình ảnh bằng phương pháp Image.open(). Trước khi gọi hàm getexif(), thư viện Gối có một số thuộc tính trên đối tượng hình ảnh, hãy in chúng ra

# extract other basic metadata
info_dict = {
"Filename": image.filename,
"Image Size": image.size,
"Image Height": image.height,
"Image Width": image.width,
"Image Format": image.format,
"Image Mode": image.mode,
"Image is Animated": getattr(image, "is_animated", False),
"Frames in Image": getattr(image, "n_frames", 1)
}
for label,value in info_dict.items():
print(f"{label:25}: {value}")

Bây giờ, hãy gọi phương thức getexif() trên hình ảnh để trả về siêu dữ liệu hình ảnh

# extract EXIF data
exifdata = image.getexif()

Vấn đề với biến

from PIL import Image
from PIL.ExifTags import TAGS
0 bây giờ là tên trường chỉ là ID, không phải tên trường mà con người có thể đọc được, đó là lý do tại sao chúng ta sẽ cần từ điển TAGS từ PIL. Mô-đun ExifTags ánh xạ từng ID thẻ thành văn bản mà con người có thể đọc được

Đối với mỗi bức ảnh, có nhiều thứ hơn là bắt mắt. Hình ảnh được chụp bằng máy ảnh kỹ thuật số và điện thoại thông minh chứa thông tin phong phú (được gọi là siêu dữ liệu) ngoài các pixel có thể nhìn thấy

Siêu dữ liệu này có thể hữu ích trong nhiều trường hợp kinh doanh. Chẳng hạn, các hệ thống phát hiện gian lận cho yêu cầu bảo hiểm phân tích siêu dữ liệu của các bức ảnh đã gửi để kiểm tra xem người yêu cầu có chụp chúng trước khi xảy ra tai nạn hay không.

Trong bài viết này, chúng tôi khám phá cách sử dụng thư viện exif để đọc và chỉnh sửa siêu dữ liệu của hình ảnh kỹ thuật số

nội dung

(1)
(2)
(3)
(4)
(5)

Vui lòng kiểm tra tất cả các mã trong repo GitHub đi kèm

Siêu dữ liệu và Exif là gì?

Siêu dữ liệu đề cập đến tập hợp dữ liệu mô tả dữ liệu và bạn có thể coi nó là dữ liệu về dữ liệu. Siêu dữ liệu của ảnh bao gồm các thông tin như kiểu máy ảnh và ngày chụp

Siêu dữ liệu này được lưu trữ ở Exif (Định dạng tệp hình ảnh có thể trao đổi), một tiêu chuẩn định dạng cho các loại phương tiện khác nhau (e. g. hình ảnh, video, âm thanh) được chụp bởi các thiết bị như máy ảnh kỹ thuật số và điện thoại thông minh

Thư viện Python được sử dụng trong dự án này là exif, trùng tên với định dạng Exif

Đọc siêu dữ liệu hình ảnh

Chúng tôi bắt đầu bằng cách cài đặt exif với lệnh này

pip install exif

Đối với bản demo này, đây là bức ảnh mà chúng tôi sẽ thực hiện

Hình ảnh của tác giả

Chúng tôi khởi tạo một lớp exif Image bằng cách đọc hình ảnh ở định dạng nhị phân trước khi kiểm tra xem nó có chứa bất kỳ siêu dữ liệu nào không. Nếu vậy, phương thức has_exif sẽ trả về True

Các ảnh khác nhau có các thuộc tính siêu dữ liệu khác nhau (còn gọi là thẻ Exif) do các thiết bị khác nhau được sử dụng để chụp chúng. Chúng ta có thể xem các thuộc tính hiện có cho một hình ảnh bằng phương pháp list_all()

Một tập hợp con của danh sách thuộc tính. Hình ảnh của tác giả

Để đọc giá trị của các thuộc tính cụ thể, chúng ta có thể sử dụng phương thức get(). Trong khi có các phương pháp khác, tôi thích get() hơn vì nó xử lý khéo léo các trường hợp thuộc tính không tồn tại bằng cách trả về Không (thay vì đưa ra lỗi)

Đầu ra của phương thức get(). Hình ảnh của tác giả

P. S. Kiểm tra Image_Metadata_Extraction_EXIF. sổ ghi chép ipynb cho chức năng trích xuất tất cả siêu dữ liệu của hình ảnh vào Khung dữ liệu Pandas

Ảnh của Mylene Tremoyet trên Bapt

Sửa đổi siêu dữ liệu hình ảnh

Bên cạnh việc đọc siêu dữ liệu, chúng ta có thể thực hiện một loạt các sửa đổi như thêm, cập nhật và xóa các thuộc tính

(i) Thêm siêu dữ liệu

Các thuộc tính mới hiện không có có thể được thêm vào để làm phong phú thêm siêu dữ liệu

Một điều quan trọng cần lưu ý là thuộc tính được thêm vào phải là thẻ EXIF ​​​​được công nhận. Nếu không, việc bổ sung sẽ không diễn ra. Bạn có thể tìm thấy danh sách đầy đủ các thuộc tính hình ảnh được công nhận

Ví dụ: chúng ta có thể thêm thuộc tính bản quyền được công nhận. Sau khi gán một giá trị (Kenneth Leung 2021) cho thuộc tính bản quyền, phương thức get() sẽ cung cấp cho chúng ta giá trị mới này thay vì Không có

Tham gia Medium với liên kết giới thiệu của tôi - Kenneth Leung

Truy cập tất cả nội dung của tôi (và tất cả các bài báo trên Phương tiện) với giá chỉ bằng một ly cà phê

kennethleungty. trung bình. com

(ii) Cập nhật siêu dữ liệu

Chúng tôi cũng có thể cập nhật các giá trị hiện có của các thuộc tính siêu dữ liệu hình ảnh

Đầu ra sau khi cập nhật siêu dữ liệu. Hình ảnh của tác giả

(iii) Xóa siêu dữ liệu

Nếu chúng tôi muốn xóa các thuộc tính cụ thể thay vì cập nhật chúng, chúng tôi có thể làm như vậy với .delete()

Đầu ra sau khi xóa siêu dữ liệu. Hình ảnh của tác giả

Lưu siêu dữ liệu hình ảnh đã sửa đổi

Sau tất cả các sửa đổi, bước cuối cùng là lưu hình ảnh với siêu dữ liệu đã sửa đổi thành một tệp mới

Với cách trên, chúng tôi đã lưu hình ảnh đã sửa đổi bằng tên tệp có tiền tố là 'modified_' để hình ảnh gốc không bị ghi đè

gói nó lên

  • Có nhiều thuộc tính thú vị khác để khám phá và bạn có thể tìm thêm chi tiết trên trang tài liệu exif
  • Những gì chúng tôi đã làm cho đến nay là xử lý một hình ảnh duy nhất. Giá trị của gói exif được hiện thực hóa thông qua xử lý hàng loạt, trong đó việc trích xuất và sửa đổi siêu dữ liệu được thực hiện trên một tập hợp lớn các hình ảnh. Để xem quá trình xử lý hàng loạt đang hoạt động, hãy xem tập lệnh batch_process_metadata.py trong repo GitHub
  • Một điều quan trọng cần lưu ý là sao lưu ảnh của bạn trước khi sử dụng thư viện này để tránh mất dữ liệu bất ngờ
Trước khi bạn đi

Tôi hoan nghênh bạn tham gia cùng tôi trên hành trình học tập khoa học dữ liệu. Theo dõi trang Phương tiện này và xem GitHub của tôi để cập nhật nội dung khoa học dữ liệu thú vị hơn. Trong khi đó, hãy vui vẻ đọc và sửa đổi siêu dữ liệu hình ảnh