QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3424|回复: 0
打印 上一主题 下一主题

深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提...

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-7-14 15:18 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    6 l" }, M. A) X2 q
    深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
    , H" E: G- O: T# m5 K7 p图像标注主要用于创建数据集进行图片的标注。本篇博客将推荐一款非常实用的图片标注工具LabelImg,重点介绍其安装使用过程。如果想简单点,请直接下载打包版(下载地址见结尾),无需编译,直接打开即可!; @& K6 }' [* P- u9 ~

    , O4 u8 d" @8 f1 ]; S
    2 A6 e2 `: V5 T- G1 r5 n
    感谢原作者对Github的贡献,博主发现软件已经更新,可以关注最新版本。这个工具是一个用 Python 和 Qt 编写的完整的图形界面。最有意思的是,它的标注信息可以直接转换成XML文件,这和PASCAL VOC和ImageNet使用的XML是一样的。- J. ~5 K# I4 Z$ ]
    . I3 q' E$ D9 g2 a
    . y8 t2 T( V; J9 b5 v
    附注。作者在5月份更新了代码,现在最新版本号是1.3.0,博主亲测,源码在Windows 10和Ubuntu 16.04上正常运行。
    7 u* R1 E+ t- {* J2 l/ x' R: J* G/ }" x) w: N/ x9 F

    # P" c1 y3 I: ?$ {! j6 C具体的安装查看Github教程:https://github.com/wkentaro/labelme/#installation# ~0 K  r8 i. S
    $ J, j. i$ R! V# x# A

    0 E# Z  @( c, u在原作者的github下载源码:https://github.com/tzutalin/labelImg
    - r! x0 k) z& m5 M3 T! m% X1 A。解压名为labelImg-master的文件夹,进入当前目录的命令行窗口,输入如下语句依次打开软件。
    9 H7 `$ @' }6 \- }$ ]1 N- S2 Z$ B1 K1 B  I3 e0 S

    2 p7 q- Y' _* a& c: zpython labelImg.py
    3 J  b' _6 p, N# c. U' M; k1& c& y0 n2 l! o& Z, O. I0 i
    ; u0 H7 R& Y8 \1 ~

    0 _. \( s% Z4 @4 _* n/ `( ?9 W% R  t* B- y5 G- j

    ( J2 S; w: g+ t3 z具体使用! l5 C, _% G3 b( T" V/ B
    修改默认的XML文件保存位置,使用快捷键“Ctrl+R”,更改为自定义位置,这里的路径一定不能包含中文,否则不会保存。' c1 K1 q% K; H' t
    / e- C/ Z; b* n+ g; w* F

    % ]/ }6 w% y3 s  B$ I使用notepad++打开源文件夹中的data/predefined_classes.txt,修改默认分类,如person、car、motorcycle这三个分类。
    9 ^( r& w; h5 ]1 G, L  H) q$ L! L, e3 v# i
    8 r8 d1 _& f1 q. V0 I' v! F6 h4 D
    “打开目录”打开图片文件夹,选择第一张图片开始标注,用“创建矩形框”或“Ctrl+N”启动框,点击结束框,双击选择类别。完成一张图片点击“保存”保存后,XML文件已经保存到本地了。单击“下一张图片”转到下一张图片。
    ; z! ~/ ?4 l4 N/ E: K0 \  y- C3 F# I- R/ k6 |( y
    $ ?9 L5 j) B0 u
    贴标过程可以随时返回修改,保存的文件会覆盖上一个。: [- p3 q- {; u- u; M0 ?& J: u

    " Q0 o! @. s: Q5 v% Y+ B5 Y4 X3 m

    # x" O2 Z: u; k0 c完成注解后,打开XML文件,发现和PASCAL VOC格式一样。) F% m  C4 h2 D1 }1 n& C' m/ n
    9 }& T' }9 w& |4 C7 X9 [# \$ |

    ' ^6 Z0 o* i2 E" r. Y- ^- I将xml文件提取图像信息2 {) X4 J4 f6 l1 d! b3 F( {
    下面列举如何将xml文件提取图像信息,图片保存到image文件夹,xml保存标注内容。图片和标注的文件名字一样的。
    * t: w, X# [9 f8 B/ Z8 P& T
    6 o/ M6 k2 d: t% o5 y( T; x
    # b% H1 m9 [! U
    / Q  `% E) ~! A  |+ o0 |& ^
    3 K/ i4 ^7 v( N
    下面是images图片中的一个。; s! i" ?: U  d3 n5 v
    ' Q- d/ e' s0 k' t4 T
    " n! L, C* l5 O& }' g! F
    下面是对应的xml文件。8 T1 I8 p7 O) Q/ s! j( d
    9 U& o! E4 ~3 n. T
    ! w  q+ y# ?  @* ^( D- o# z
    <annotation>' {9 [$ o0 c0 `2 R4 E% H
            <folder>train</folder>5 Y& }& H/ K4 M/ O8 ?
            <filename>apple_30.jpg</filename>2 J' p; x( j: C$ ?& f1 [
            <path>C:\tensorflow1\models\research\object_detection\images\train\apple_30.jpg</path>" d/ `; F" f% y# [* [
            <source>! D5 ]" {2 s0 F: M
                    <database>Unknown</database>
    , q$ D! `" W) b2 d: n        </source>
    % S' J" s+ X/ i/ r. T        <size>, I7 Y+ V, u, o6 ^& q
                    <width>800</width>0 l4 t( l. |- S$ S! a( p
                    <height>800</height>
    ; \" ]' v7 v- T, r$ N6 J                <depth>3</depth>
    * J/ X$ Z& c2 F. |' u        </size>
    0 ^$ |+ L1 P( j" g2 x: Y$ b3 n        <segmented>0</segmented>: @9 v9 B/ m9 U' H6 E
            <object>( s* ~2 d0 ?* @' S/ z1 ^" h
                    <name>apple</name>- g; {! k1 `% x  ]' ?) W1 r
                    <pose>Unspecified</pose>' R/ n- w4 S5 L% g7 p) i/ `7 x' @" W% k
                    <truncated>0</truncated>: ]: X* ~9 Z3 `, L2 C
                    <difficult>0</difficult>
    1 W7 x! E4 ]* j                <bndbox>
    # d  G  t: U3 E, b' v2 U                        <xmin>254</xmin>( f' G- F. `  r# ~# x
                            <ymin>163</ymin>
    4 L7 g4 u- N& u1 j' l                        <xmax>582</xmax>
    7 A; o' I. F/ z. |; O  _2 h, G                        <ymax>487</ymax>* o2 m- |" `' ]% ]2 h0 \: ]
                    </bndbox>
    % \" J! U2 x: A) l' T        </object>. n& T4 N" J& Z) L3 C
            <object>
    % o4 y0 h+ m! [. |" ~5 r1 y2 h                <name>apple</name>
    0 |* V0 N7 h- c8 I0 W( }% Q$ D7 A                <pose>Unspecified</pose>
    # m9 F& W6 u6 `3 ?, U                <truncated>0</truncated>
    0 }  f  j$ B7 C  c: Z7 ~' d: ]                <difficult>0</difficult>
    , U3 Y, r7 c. d7 o! I6 c5 {$ w: H                <bndbox>4 c9 v! Z+ w# K5 Z6 g! f4 c# j
                            <xmin>217</xmin>) Y( v" b3 b' }) W' |, l2 C9 A
                            <ymin>448</ymin>
      H/ w6 |2 i% d                        <xmax>535</xmax>
    4 G" U, c( j: y1 S3 Y) k- Y                        <ymax>713</ymax>
    ) e4 Y3 }9 z/ r' G7 O1 i                </bndbox>" a2 \: i$ g, U- ~8 @
            </object>  h) {" {4 {1 k  B& o; Y
            <object>
    7 ]; G4 {5 B: C* e. J- {! |3 m                <name>apple</name>
    - L/ [6 K# X2 m+ L! o2 g; |9 O2 {                <pose>Unspecified</pose>$ w1 S% h9 p0 i  J/ d# t; K
                    <truncated>1</truncated>
    3 _( _4 U% r/ H                <difficult>0</difficult>) z3 f" M' X: D6 i; B6 G
                    <bndbox>
    5 s' g7 O5 _8 z. d; X  W( `3 n                        <xmin>603</xmin>
    9 m, C3 |; U& Q2 y  O                        <ymin>470</ymin>
    & m$ k8 G" N+ V$ ]                        <xmax>800</xmax>& u( V5 ^% J$ p% q2 L( ^. i
                            <ymax>716</ymax>
      p7 \. Y$ v5 g3 L* J+ }                </bndbox>. p5 [8 f/ {* M9 _
            </object>
    1 ~7 r. h8 z, U& J% {$ \0 z, l5 m        <object>
    % ~0 @, ^4 X5 G* Y- Z& L$ ]* l: R8 @                <name>apple</name>: P- z1 J) @( A$ L6 A
                    <pose>Unspecified</pose>2 g; `7 m: r9 ^
                    <truncated>0</truncated>
    # S) ]7 ~8 |2 h4 Q" f                <difficult>0</difficult>8 b1 q+ @: W# L; y9 F
                    <bndbox>: s) m6 e# d# v% Z% C0 F2 Q+ b. b+ J4 I
                            <xmin>468</xmin>! p8 U7 M  ~6 y! U/ J8 T" ]  y$ L
                            <ymin>179</ymin>
    8 F- v6 i* ?: f6 L' Y9 }0 o                        <xmax>727</xmax>
    - N9 y8 q9 V: t$ m( l0 b9 w, v                        <ymax>467</ymax>8 X0 B9 i& Q5 P4 d" ^
                    </bndbox>3 N! }  a6 Q- M
            </object>2 g/ f4 i( H% n  i/ M( d
            <object>' k1 a3 R8 g/ u* j# Y! d7 n: E
                    <name>apple</name>
    + Y# u1 K0 h# k1 U0 J+ i5 V                <pose>Unspecified</pose>
    0 C1 l# ~  q' g) \& w5 f- F* U) }                <truncated>1</truncated>
    / U) U- \; H, o* K! ]7 {                <difficult>0</difficult>5 m3 K4 _! j) Z5 |5 E9 n
                    <bndbox>6 X- `) I: c" y$ Q) ^# S1 p
                            <xmin>1</xmin>- {& z( L0 @8 v6 x: w
                            <ymin>63</ymin>4 f2 c1 q- A$ Y4 @% m; \
                            <xmax>308</xmax>
    + y# |& \+ o$ b$ z                        <ymax>414</ymax>- V5 [: g/ d" Y' d% r
                    </bndbox>
    / e7 H3 j& T1 g4 [; a        </object>7 h; ^" ~8 {/ V: O. E) I3 o
    </annotation>: r0 J! L- Z7 F" z( x
    1; ^4 H- ]5 F. I, w
    2
    : B5 [) U) O4 h( `/ u, R% J- z1 s% m3
    - V3 m% }0 |+ ~4 [9 r9 ~* @+ h4
    + U5 w0 M* J- L( q+ a5. W6 I6 ?" A4 x& [
    6: M; `9 y" I# `$ u! _2 G& N! A
    7
    9 [8 r& M( G2 @( M& j8
    % w# G& V# c, L' _7 F/ ~# @* [9* G% R; ]# K. g$ L. }
    10
    % R2 o- v% Y) b" A' A117 r% i5 G9 {, {( h6 }
    12
    ' I! y  @  y; u6 ]+ I- e8 r& q13; j6 y7 `/ e1 i, R& I5 N. G
    140 Z" {3 W" ^- t; ^5 K: Z. S
    15
    , P  T. ?5 `) o* d162 X- R9 g3 F. P# g% K
    172 t0 t3 L. S+ @- s# i/ v
    18" {9 ?, }; C; U7 Q; B
    19+ l8 u' e5 O4 d8 O" z% m$ y
    20( Q( v( @  i2 S- S2 c
    21
    7 P9 Q0 Y- L# \7 k' {$ f22
    8 E" d+ x1 Y0 u* Q23
    ; r6 @' a- q# x% P, M) F. M7 `, C24' \) k6 f. _6 [3 A- f
    25
    & A; o; l5 z: r2 Y0 H1 k/ a26
    $ J) d, V4 ~! t" k1 Y! J27. Z, R3 h/ U2 s
    288 l: J9 e* ^, J) Z' ]- v" @
    29) N# v8 s" G& \6 a$ j$ L$ V
    30
    # p6 K! G, t0 j- F2 E! Q312 Q$ j2 z5 n. |
    32# x1 J, M; S% c
    33
    9 G- R' R: @) A( _5 q# g34! X7 r8 c( p! a0 o0 o: q, Y0 E
    35
    . k& X; J6 Y! B; X36: K2 z8 D  [; f- m; E6 Q; f3 U
    37
    & Y. Q5 t% Y& M5 Z( }388 F: @0 H; J3 V, E
    39. s# X+ Z0 s  R* |
    40
    5 G2 [/ @5 e& A* I41$ U1 g/ t8 x$ L% p- K
    42& r" l* @5 |2 g8 c0 e% H, B
    432 h, T# m' Q3 q8 C+ b/ q
    44; [/ H' p3 r* g
    457 \# H+ x9 x0 A0 Q
    463 n% Q1 z( s9 N8 W
    472 V) o4 ]6 D# W: T1 n2 j! I% \7 D0 P
    48! m4 P2 g# f8 q$ s; Z9 T! H
    49
    : A7 W% Q* W9 L1 _* i50& o) \8 b/ @( ?5 ~4 O) k
    51, _5 R3 W$ Y3 x& `; }# {8 `
    52: O( c$ I- k' N2 E. [
    53
    8 b# L5 l* _4 l- s7 P- H541 a; z% X8 Z; k6 ^+ ^, B- H7 N# t
    55
    2 e7 f6 u  y# G+ Y. q. Q& o56
    2 J3 K& ?2 l; ?6 C" P. n' i57
    : c/ q  K  d4 M) {6 l' l58
    3 v% B8 Q" L: Q7 x59. t: t) P4 S1 Q$ B9 [0 ?
    60, R/ F( v: Z$ R! k. J! U
    61! Z4 H7 U, e/ g5 Z
    62
    , N' G- Q+ ]- @4 o; O63( ]& [" w1 C# w' V$ P# z  T6 n
    64
    5 L5 j: o0 V* V# R% ~' T  ^; P65
    , s( a6 u5 w. y: L2 [$ `66, b  l" \# W) m' Q7 ~- v/ R: G
    67( N+ t' }% y, f, S' h8 F  \
    68' K# `% A& b* j8 ?
    69( I6 _; y( S) A3 e; f6 n( M: @
    707 J5 x- Q6 p7 x5 x
    711 H6 ^. S- n8 F1 M6 H# y
    72
    - X8 s$ h/ o! Y" t' }" _, ?) R73$ S! _+ r! O- R! R
    748 q! O5 ], `' _8 e
    将xml文件提取图像信息,主要使用xml和opencv,基于torch提取,代码比较凌乱。$ O& _! a0 B- l' J  G
    " }7 D0 ], y; ?

    $ h1 z: {$ z3 |/ D( Mimport os  V, k7 B) P& |5 z6 }
    import numpy as np
    9 N0 E* q' V+ T4 ?/ L/ ^import cv2
    8 p7 S+ Y/ ~5 U; y+ L. Oimport torch! w# G, l! }0 k' V" n2 d: B
    import matplotlib.patches as patches: m6 O7 A9 c) G* o# K0 \8 U4 o, p0 K
    import albumentations as A
    , D7 U. C( ^1 X  ^( T6 h( [5 Jfrom albumentations.pytorch.transforms import ToTensorV2
    " e2 J# D% Q8 R. p# H. i, u2 bfrom matplotlib import pyplot as plt
    2 Z1 ]4 {8 ~4 ~# x; Yfrom torch.utils.data import Dataset
    ! D( u7 m% ^6 Y7 l4 Ifrom xml.etree import ElementTree as et
    : e( K+ y" B  a( H" Gfrom torchvision import transforms as torchtrans
    2 X, B! V- w3 |8 R
    7 }6 ^7 Z% ?' Z1 T% s

    ' A# k5 W# t- T9 ]+ V& H- j& `' r# defining the files directory and testing directory1 I& J, Q3 k9 {: C
    train_image_dir = 'train/train/image') w# U4 T# X# p) O" x- h( y
    train_xml_dir = 'train/train/xml'' k; i! e3 L$ g& x  b; e, d% E
    # test_image_dir = 'test/test/image'3 I  i) P4 I. J+ Y% y0 f
    # test_xml_dir = 'test/test/xml'
    9 N8 `' N2 i' D$ D
    9 x) J  G' K9 h: k' e

    / z6 s) S( R) y9 q( V6 x; ^: Hclass FruitImagesDataset(Dataset):' S7 G0 ?8 s8 N# C7 E  H
    5 s6 ^1 f* {- O/ u* \) G
    4 ^/ \( N7 k; D4 ~
        def __init__(self, image_dir, xml_dir, width, height, transforms=None):  K; F; M: O7 H0 l& B8 H2 ~2 |
            self.transforms = transforms4 e; D5 P9 U( w9 `$ g+ _$ Y' c
            self.image_dir = image_dir3 F( D' o2 P: p+ D* n
            self.xml_dir = xml_dir; ?# {6 v8 A4 t" W- m& h9 z
            self.height = height# s8 q/ Q. [3 [1 W- L$ ^1 t8 V3 _4 o
            self.width = width) Q5 |, I. r* D( t; g1 q4 R, B
    2 e1 |, o$ m9 L1 Z- U  y4 j

    ; y% I2 w' B  a0 n        # sorting the images for consistency
    9 F6 u$ ^4 l8 Q+ [' X' {9 }        # To get images, the extension of the filename is checked to be jpg: B  P* B; w  p' B
            self.imgs = [image for image in os.listdir(self.image_dir), s" U" r- V2 Z. k
                         if image[-4:] == '.jpg']5 F, `1 E* E0 m* `+ Y
            self.xmls = [xml for xml in os.listdir(self.xml_dir)0 B( {- U) t/ X, y  N, J  z  y: n
                         if xml[-4:] == '.xml']8 z9 u& K5 p* T2 m1 u
    5 ?7 i+ U3 B! H: v

    ) e5 {) F  X7 L        # classes: 0 index is reserved for background3 y9 x/ V& Z% n, a  ?( Q1 q
            self.classes = ['apple', 'banana', 'orange']
    3 W, }5 Y# s, M2 _
    : l$ r* b5 c7 R9 G1 e% X6 R
    0 p) x( @+ Y& @9 p
        def __getitem__(self, idx):
    ' c5 E( s# W% z& O/ N2 l* v. [0 H

    / j6 N' r& b$ h' N        img_name = self.imgs[idx]
    4 w* n! \4 [( V& R: ^        image_path = os.path.join(self.image_dir, img_name)
    ( p" r5 ^% `+ P9 |, R
    - I2 I( }; F" g9 \

    * f3 l+ S! D2 p, v% Y        # reading the images and converting them to correct size and color
    ! w" E) ^1 V0 B$ W        img = cv2.imread(image_path)
    $ b  E* e5 c. T; \7 R% s! e  s        img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32)
      l8 L8 Z8 r" W6 X( Z3 i4 }        img_res = cv2.resize(img_rgb, (self.width, self.height), cv2.INTER_AREA)
    * K" h% P2 r% }        # diving by 255
    3 U6 f# V% x& I% ^( ?        img_res /= 255.0/ y# p9 v( w% g" F+ `  Z
    / T# Z$ ^; M, R+ b1 [- b

    ( H# N* Q: _! ~, C        # annotation file1 h! l3 ~( a. c3 E% E) g
            annot_filename = img_name[:-4] + '.xml'
    + N- F4 ~/ ]* y9 V+ a- {" \0 f: E. X        annot_file_path = os.path.join(self.xml_dir, annot_filename)
    ' Z! p* L, L. p7 D% X# T2 u( @1 N3 r  x+ J( A

    - ^' g& n' _% @        boxes = []5 o7 _% H- I. t9 j
            labels = []
    # `1 j$ g$ ]6 f) M$ T& O" `        tree = et.parse(annot_file_path)
    , K; a3 E! G" r! o4 r3 T        root = tree.getroot()) k% E1 J! N) m8 s' H$ w

    9 Z7 H9 w5 D3 y: v5 x- G2 l

    % A) \) ^: o' N& _        # cv2 image gives size as height x width
    2 T5 B; P1 |( d: ^! ~' X        wt = img.shape[1]
    : T% X; F: }4 j! q5 O$ Z        ht = img.shape[0], c; H- X, q+ {  z. C4 k

    ! J" t- [% D  s$ H2 J) Q( U
    4 _. l; _" h7 j: t: I. T! E0 h) h
            # box coordinates for xml files are extracted and corrected for image size given
    3 J+ ]0 A" u4 m  a        for member in root.findall('object'):7 b1 u; \7 F. T
                labels.append(self.classes.index(member.find('name').text))! o4 H6 o# J' |# w

    ( k# K& S; D: Q9 g9 U3 r( L

    % S; e5 @5 ?0 ^            # bounding box+ [* ?* E* K- Q# r9 c6 h' X* x
                xmin = int(member.find('bndbox').find('xmin').text)* o; [2 j6 ]8 T* e$ ]( _
                xmax = int(member.find('bndbox').find('xmax').text)
    " N4 E! ~- q, Z6 K( s0 |: t9 o$ e; M1 O3 w) J
    . ~! U" z" i1 F- [$ {& n
                ymin = int(member.find('bndbox').find('ymin').text)( u9 ?% D* H2 \- e& S* U( x- {
                ymax = int(member.find('bndbox').find('ymax').text)
    0 A: O* B- L) M3 `! v
    ( p5 \& ]9 x7 q# p

    7 a; z8 x. z& }/ c$ q( Y            xmin_corr = (xmin / wt) * self.width
    0 w1 b1 o$ K4 H# m: G/ q            xmax_corr = (xmax / wt) * self.width
    , n3 e5 O6 u# Y* Z2 B! l* l5 {            ymin_corr = (ymin / ht) * self.height
    % e$ o3 E* S9 R' |/ F            ymax_corr = (ymax / ht) * self.height
    . K4 R+ V0 j" @- E: M            boxes.append([xmin_corr, ymin_corr, xmax_corr, ymax_corr])# T& z6 O0 m5 ]/ t( H

    5 N# y2 y/ o8 C# }* {" e$ e

    & I4 ~! ?0 b6 p        # convert boxes into a torch.Tensor6 A6 b4 S& D  n3 B; ^- t3 N
            boxes = torch.as_tensor(boxes, dtype=torch.float32)
    . ?% g1 Z2 _: [8 q- E; Q& C; j+ `4 E$ ~& c  G! a  |& }

    , g2 h2 C" V2 H' y( n        # getting the areas of the boxes
    ; X4 Z6 T( C; U9 ~' a. T( A        area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0]). _6 c. T2 v7 T: \
    + b. q6 x! U8 I+ R+ n

    2 G+ T+ F  ]+ e* T' @' N7 E; f  E        # suppose all instances are not crowd
    8 K' T" i6 Y4 W3 X' ?        iscrowd = torch.zeros((boxes.shape[0],), dtype=torch.int64)
    / J" B1 N8 x& C: {0 p% w$ {/ e( z% t, r/ R% t( D% @, [* D$ ~

    4 K; ~9 J! U; z' `4 I6 N. w        labels = torch.as_tensor(labels, dtype=torch.int64)
    & n) T  p+ H% P& w7 J% |& M  w0 x) ]; y1 }. O

    8 D' A' C9 q5 E- t9 q        target = {}
    . r7 z2 ~7 L" R* P1 I1 j# J        target["boxes"] = boxes% n; e6 W' `( c; i( x* a9 }
            target["labels"] = labels! n, `" U! J4 c: z4 \' o# K% g
            target["area"] = area4 S# o# A! m7 g' w7 ~- G
            target["iscrowd"] = iscrowd
    0 V, k8 |% k& [+ P' k$ |0 e        # image_id2 h" p; z7 O1 G$ g% |/ u# N7 j# g
            image_id = torch.tensor([idx])
    - h( `4 S# s+ }+ R        target["image_id"] = image_id) o+ ?! I5 P3 D7 Y! k

    2 G. t# j' L; \9 I  U" R

    % G" [) P! o- `, u3 ]5 N        if self.transforms:" z/ j% x# u9 V: v& F
                sample = self.transforms(image=img_res,5 G6 ]" q9 V) s# r: m
                                         bboxes=target['boxes'],
    5 Y8 q* v; u9 _; t7 r9 v6 s                                     labels=labels)
    , s" P2 J. N3 W4 K; S; u3 ?) F2 N/ u

    0 Q% `6 Q8 \, L! k0 O$ Y/ \. }% ^            img_res = sample['image']
    - H8 \! A" _3 @5 f* v, S: R6 t4 o! w            target['boxes'] = torch.Tensor(sample['bboxes'])1 ~( o! t; A% b! J9 {) {

    + l# P4 M- s; y0 h+ x! Q
    7 [* r7 M) F8 d" Z% s+ K
            return img_res, target
    - @. `; N* a- I2 f; Q/ s; Y4 \$ l/ S2 O

    7 v, q  ~5 @! O3 B; Z/ X    def __len__(self):9 ?$ p5 [. z8 i7 [  @1 Y$ H
            return len(self.imgs)
    ) e. [! m5 k' D6 M) ^& b4 X0 C! N9 X( G* }
    $ B% A/ s8 g& I" C3 D
    # function to convert a torchtensor back to PIL image
    2 ]: Y6 K* P- Ldef torch_to_pil(img):
    5 \& _  g, b7 l2 \. l5 ?$ I$ T    return torchtrans.ToPILImage()(img).convert('RGB')
    2 i# U( R# S, s; ^' Z0 o0 D0 D1 i+ [9 ^2 @( |/ `1 i
    # S' J8 ^& z/ z! C) N. S

    % P& Q1 G6 |- C5 m
    8 r" Z% Z( y; K0 o/ z2 S/ p$ ~5 C' z- X
    def plot_img_bbox(img, target):6 g7 w7 Y9 Y, N. ~
        # plot the image and bboxes# a' a2 J# Q' n, a' w
        fig, a = plt.subplots(1, 1)+ P& j/ `! Y" P  J6 c$ J+ C
        fig.set_size_inches(5, 5)% Y$ o/ A% z  C6 ^
        a.imshow(img)
    # L) F; m& [6 Y( P    for box in (target['boxes']):! d- W# w  ^1 T/ D& y2 i
            x, y, width, height = box[0], box[1], box[2] - box[0], box[3] - box[1]
    $ |, ~3 x; H: e% y; r2 R        rect = patches.Rectangle((x, y),
    3 G! a* Q3 V# {* ?6 G' R) ~5 t) d; i4 h                                 width, height,* t, l! y5 n- e& s
                                     linewidth=2,, }6 \- U8 b! I7 X3 f  r; E
                                     edgecolor='r',# c# V/ D6 @: }; d
                                     facecolor='none')0 c5 P7 t, \- W/ V9 M' G; w
    " Z8 f0 A6 j  g! j! f

    # H! A- F: z, l7 Z1 V( p& G        # Draw the bounding box on top of the image
    " T: @6 t+ S/ M4 j- t) Z1 V* ~9 s        a.add_patch(rect)8 H# [0 q( g* Q$ v/ j
        plt.show()
    7 K4 Q3 X- \6 k% z
    & V2 a4 ~- }6 p/ d, V5 c
    % z& s1 i2 Z/ u& L0 p) d, x
    0 B5 T. [1 e, k% w+ S& S% {$ L6 v
    4 o+ k. r8 o! O. U& ^# d. Y
    def get_transform(train):, j3 M, M5 [, N  q
        if train:2 k$ \/ M5 `8 r( K- L: a  V9 c
            return A.Compose([( U5 b0 T0 |! N$ @. W
                A.HorizontalFlip(0.5),6 e# u& k( Q: q# q- H
                # ToTensorV2 converts image to pytorch tensor without div by 255
    ' d, x( c! T; r4 C% e: q3 `            ToTensorV2(p=1.0). c3 n% V. V/ r; m
            ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})
    * q- s; Z8 A( ^    else:8 f6 }9 P0 m" W+ {* L1 F- y1 J0 ]
            return A.Compose([. y9 T) T, s8 f. s  b6 Z" B8 T4 C
                ToTensorV2(p=1.0)+ h, H" ^4 }. K# H( J' G
            ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})0 ~( }" U8 W1 @
    : O2 z. D; l; [, v& G
    8 a% b7 I* D$ b& e, y  b

    ! d- ^+ {. H! h0 l6 ]" x2 n4 m
    # u+ r3 z' f% s# r% ?5 U

    8 v  l6 s9 [& X

    ) r; x. e( }* o9 Zdataset = FruitImagesDataset(train_image_dir,train_xml_dir, 480, 480, transforms= get_transform(train=True))
    6 Y4 A3 a2 w7 F3 r  h& s9 _/ |  [: n* [* f# n& z; F: z- h
    ; q5 e0 O* C1 ^+ {( _2 @! f% b
    print(len(dataset))
    ; J, p, }) h. @  z# getting the image and target for a test index.  Feel free to change the index.
      q) v, D) i$ M+ Nimg, target = dataset[29]3 u' u1 B6 f% Y$ U( m, z5 X
    print(img.shape, '\n', target)' ]6 e0 A# [7 t
    plot_img_bbox(torch_to_pil(img), target)# O& f5 }$ k% U# @
    1
    . J: r4 E$ ^3 T: j9 j; M4 u2
    ) D, R" I& q! {3- ~( H' B6 A( b* b
    4
    3 v$ x0 K( e) `# n5
    ' j# e: F6 l0 c, @- J+ H) k, Z+ U9 _6
    * p  L! G+ }/ V6 j4 V7% Q! f' z' q/ Z  E* K( [
    8
    $ Q. e: r4 A; o' `& C) U95 C5 Y8 K: D! c5 A3 I
    10
    $ ]! R' K( J* i115 J+ f+ s6 w" n
    12+ z  T! b; ^, t0 q. i- z& r" c
    139 o. t' k8 ]; i7 B! B& D
    14. M! ?6 E4 P* a) E7 b8 i
    15- }9 R4 ]6 O( G4 `" O# \
    16
    : w( Q# t! U; t1 ~176 \3 j7 @6 M# @4 w. ^. _4 q2 K8 z0 @: [& o6 B
    18
    $ C5 c. j3 a! N% t4 M3 H6 i  J199 d: I0 P# E. B! B+ c4 J' U
    20
    " J5 Q1 K) R' B* O21
    2 B' ]5 b$ G. r- R22
    7 R! s6 g' B) v, E- o  e' W% w4 E23& @( N* X+ w' |* j9 ?" \
    24. y' W; e) y; b
    25
    9 o; Y7 L5 T! ]26
    ( |# q( _- g, X  [+ C* x27! ~7 C7 B# O4 o9 y7 D
    28
    5 D4 B) q  V. J0 ~0 Y. s. |# O) Y2 O9 z29, l1 v9 v& Y) H
    307 G% I* o2 _5 q) w* `- P
    31
      V" H. z! S3 ]  v, T4 G32
    4 y! Q9 U5 L& y: O4 w) d: C33- h: G/ j. Z) f$ q4 s, V
    34
    9 Z/ a( z" {7 V% F/ v5 k35
    , `/ v1 T5 G! B; c! S  F; |+ O366 N& R  w% V! [5 @6 D
    37
    8 \. S% v* Y6 t: A: V  v7 L: w38
    5 N$ L6 X: g. @$ D/ n8 q: A. g) l39
    ' _7 D- a" G& N; x% t2 A; r% d40
    . b; M4 K4 A" i; @41
    & N* g$ G: i5 R0 O5 U8 T42
    ' E, v8 T% ?) c; x43
    6 B! t/ F2 \) T  Y, r  t6 {3 M444 Y" z1 @( E. N  c) u; `" p
    458 t1 ?- L" v' }- m
    46# T! T; n3 y$ h0 Z5 N" H; x- N
    47/ u0 k% {$ q$ }+ Q7 ]! |, J, U
    48
    / v+ y3 P# `% {- J$ K* r495 j+ Q: A, T2 h7 i* U
    50; \- C' h$ r# x$ S
    51" S9 E; \5 v+ W7 W/ ~8 r* [
    52
    + Q6 _! j6 y+ c! H, c53
    ! M7 b4 L7 q# p2 R! m549 a7 s6 E& s& a0 C
    551 T# S; Y) U$ x2 m, v- O* s
    56
    8 D. H5 q# {& _! |' T. m. O0 c57
    9 k1 s2 Q  ^# J2 n9 m' y* G58( Y. ]  d0 i; R
    59: v. l6 k. g2 b; q- p: \! g7 B4 L
    60  {3 T7 I/ k2 v
    617 q# L5 W  m: s; r
    628 I' b% }: e* i( Q. T2 x3 o
    63
    " a& ^7 Z1 `% r. {64) _. r: ]4 m" R% r  {: K
    65; X; A5 G* u& S: d
    66
    + m! a. Z- C5 U: X# ~67
    / p; V8 K$ u; |6 P! W6 C5 u9 {/ W68+ _# s" ]+ [  ]  Q9 c; q
    69
    5 C( Z: a8 h* w3 O; u# P7 q, W70
    2 n8 r2 q  [' I- M  T: Z! b71- x& J7 Q" r) _6 P' d
    72
    ) ~- T" c: s# R& b. A' A6 ~73
    & g7 @, a" ^0 P! e+ U8 f  P74
    6 d2 S2 t/ _  u$ G7 f9 Y1 U! J75
    ( f: i; G4 j- z" [5 X/ d( K! ~76
    $ r/ ^6 q+ f6 h4 x' w77
    2 g' A4 J* f- m% `& V$ Z789 L% e7 u4 J$ i" i  W
    79
    ; b9 ^8 f6 N- S, [; P/ d80
    - d' ]7 y6 K, S" Z7 F- d1 X; @81
    - ?/ D2 M& G/ o: P826 ?" M* [7 z. Z  W3 S
    83
    & p5 N4 ]9 X6 z8 M7 s. }84- K8 e8 `: x; c
    85
    4 }& d  U  I5 c/ p! N( g1 v86: i$ |) f. U, c" E& O
    871 L. r  }6 r) j! _
    88
    & w' L" u* d" Y: `- D89+ F5 o* w% N6 M1 [
    90
    & n2 J- m( i0 [$ L; ~91
    $ }* i. I6 n  z922 @& z% Q6 O  Z% F9 @+ n
    93
    + H8 d1 ]4 _( f" Y943 g. b: j+ K3 j
    95# b0 a/ H. i  {' y$ _
    964 M7 b' g6 E" _' L
    97
    9 U9 _& J+ m+ ^8 k983 z" [0 b, {' G9 k3 y$ s. X
    996 Z7 I6 O4 O( F! ~7 W
    1002 i4 b! M. a6 `
    101
    , d% X/ T7 E7 K+ G* k102
    6 g! s& n- q2 y! i1036 A7 k/ P! P; w$ c
    1040 T2 X/ ^- e$ P/ o4 [
    105
    2 h, T9 i' r1 R8 E% u- w: `106
    + n3 u2 l9 b( f& e1071 d( C$ p% s5 I% \6 q7 p1 H* Q: s
    1089 F9 J/ M" B! n% R/ X. h1 u) s% S
    109
    % Q) _  D' I" V7 t0 c110
    * S0 @9 @1 [" G( q* ?/ _- j4 j111
    ; [) U' X9 Y/ O7 }112
    ( y4 v# s: q/ }9 H$ @5 k7 q" B113- ?3 w( [  A5 {
    114" I3 T4 o$ x! `) r3 c  b4 k) Q
    1156 n+ B/ h* S9 t
    116
    $ |  @: E( i: ^3 @* T117
    9 t% |0 I# }0 e& Q3 l' U118* Q8 W4 m; V! q5 U& G5 F
    119
    3 e  h2 s9 Z* f# t120
    * C7 Q3 t: l, a2 B) j121& ?: `2 @3 ?/ @+ r  a' @8 R% E( l
    122
    - u/ ~3 H. j9 R" K* ~7 b) |% v( {; Q123  _( |/ H5 G: j6 b8 j
    124" y, M0 w9 j& C9 M
    125
    4 K/ J& m$ m) p+ o- @5 e126
    8 U! @8 C" z+ _1 q% |127
    " C* A4 E/ n( V128
      L% j+ j8 ~. U* ~6 m7 |- B3 i+ g$ j129" h2 ]  D; d3 C7 j. b
    130
    $ B* M9 n. d& ?% d& G131( `% S: ^# a8 c/ e; |
    132
    ! Y5 s2 U# p- c" a$ t8 U7 V133
    , C9 Y0 y( u! T134
    ' ~. {* q( {* d2 p135( }4 ~& s1 f' p/ C
    136' @& H( c% y1 d! c7 P
    137
    2 \2 l: u1 F  v, e+ p" d, Y! K138, P& B* b' ~1 S- Z3 v5 X) O
    139
    6 S; S9 U2 \* L; @' i, ]140: {# P9 R3 m* f5 R8 h( K6 D
    141" O, L1 h* X# ~' N/ o) x
    142
    / H% j' ~: i7 {! H! v( V143
    * o/ f: N7 J; q2 ]$ I/ D144
    % Q$ M" A6 S& _145
    ( k0 l+ u) C8 h146
    8 V- ~6 E! I( w  `: Q* ?147
    - e4 ?1 H1 Q( b* w6 c1481 Q& e+ s5 C' L0 p
    149
    9 U2 l+ w- g( q150
    4 _" Q, }( B& D. b1 s# U8 s151% m$ Z) o3 }% M" [( U; {
    152! q, m8 i0 Z! v1 b- N- X0 N
    153
    ' a: |6 ^; d6 M154& Q3 I  j' A" [9 f$ Q
    155, m, z- C  f9 K5 }
    156
    6 m. a" S& T( ~: m( a; g' S) ]输出如下:
    : b% {" v+ B+ O2 k2 y
    & x5 ]; w$ G2 c3 l

    ; K9 ?$ O) J/ L5 {7 p9 Storch.Size([3, 480, 480]) 5 n7 g% `' U! Q* H5 Z* S9 s
    {'boxes': tensor([[130.8000,  97.8000, 327.6000, 292.2000],
    0 Q+ P" a) T& J- B        [159.0000, 268.8000, 349.8000, 427.8000],& V+ r( x( q8 ~0 T
            [  0.0000, 282.0000, 118.2000, 429.6000],1 ~. p8 [* T$ u8 R( M, Y  e1 A
            [ 43.8000, 107.4000, 199.2000, 280.2000],: m/ ?' U4 V5 w. [! K; ]) F2 }/ g
            [295.2000,  37.8000, 479.4000, 248.4000]]), 'labels': tensor([0, 0, 0, 0, 0]), 'area': tensor([38257.9258, 30337.2012, 17446.3223, 26853.1270, 38792.5195]), 'iscrowd': tensor([0, 0, 0, 0, 0]), 'image_id': tensor([29])}
    ) O% ~  l+ g- n1
    - k% b% T/ O' i% I: ?. a2
    ; L4 g1 m0 m+ q' w+ z3
    ) c/ Z* l* l& H+ e1 t0 z44 d, f. V' z0 f$ Y/ c4 ]
    5
    4 y, K  }, F: o8 g6
    4 A' j3 M) I! \% Z) }' C: `- q! p) e9 o# a  D; B* x  @
    : y3 s& m* n4 {& l: Q7 Y

    * v% I+ J. k0 f; Y- D: n
    + \; ]# t( p* Y, r( p; ^; m3 I  o
    下载地址: t$ N' C7 T0 Q6 T
    链接:https://pan.baidu.com/s/1QZDgeYTHyAlD2xhtJqZ-Yw9 _( N6 t; O2 }7 [& C
    提取码:srjn
    * O/ N3 Y3 h- v2 i% h( ?————————————————
    + N  Y9 T: b8 y! b, S+ R版权声明:本文为CSDN博主「刘润森!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    , |3 x6 |6 q& R- t4 q- H, h原文链接:https://blog.csdn.net/weixin_44510615/article/details/118496273$ N- I# j. e6 I- G4 @

    $ [% Q+ w3 R1 T+ A6 s, ~. U/ h& }# m# w6 _, h8 z
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-13 23:11 , Processed in 0.489683 second(s), 51 queries .

    回顶部