QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3593|回复: 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

    + i. S4 V  _& K深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
    % j" O& s* |0 u( y; H. X$ s图像标注主要用于创建数据集进行图片的标注。本篇博客将推荐一款非常实用的图片标注工具LabelImg,重点介绍其安装使用过程。如果想简单点,请直接下载打包版(下载地址见结尾),无需编译,直接打开即可!1 k# p. S9 f& O% u% H+ _
    % N2 y, f8 p% u/ G

    ) f4 q0 e: X! v3 x: Y感谢原作者对Github的贡献,博主发现软件已经更新,可以关注最新版本。这个工具是一个用 Python 和 Qt 编写的完整的图形界面。最有意思的是,它的标注信息可以直接转换成XML文件,这和PASCAL VOC和ImageNet使用的XML是一样的。
    1 c7 e  s! d3 j9 Y' D* m+ i8 Y* \( ~+ g0 e( k# M9 b3 X
    3 O% {* `) i& a- I% A  q% A( ?
    附注。作者在5月份更新了代码,现在最新版本号是1.3.0,博主亲测,源码在Windows 10和Ubuntu 16.04上正常运行。
    , e& S  @' `+ P- B/ \0 A3 C( G2 j$ ]

    $ g, l- v( n# w; U4 }' D具体的安装查看Github教程:https://github.com/wkentaro/labelme/#installation# F) s0 a4 c5 j2 S3 T+ Z) n
    ) d) Y2 U) m) w9 q; a

    % c/ L# _, O( |在原作者的github下载源码:https://github.com/tzutalin/labelImg
    5 c% O7 n- m+ \- `7 m。解压名为labelImg-master的文件夹,进入当前目录的命令行窗口,输入如下语句依次打开软件。% Y, T/ K: e/ M) a6 L8 [

    ! \0 t1 c- ~% b
    # \. L$ Q5 x: V; d; o9 m
    python labelImg.py5 }" x6 t' G% Q) y4 R
    1
    3 }6 f0 H5 d0 b/ [; V. A8 q9 c. Q4 M3 p+ Q. g( _- L5 d  s0 Q

    : r: i0 {% t2 C8 v# w8 X6 }6 }# z& w5 s  [

    " k) }+ O; K$ N具体使用
    5 t2 {( _0 _2 Y: Z. T% V修改默认的XML文件保存位置,使用快捷键“Ctrl+R”,更改为自定义位置,这里的路径一定不能包含中文,否则不会保存。
    " I" u' z  a' W% ]5 b- W* k% K6 n# y3 @% ]& X  ^& s

    ' r* i/ b5 s5 O. C9 O1 R- g使用notepad++打开源文件夹中的data/predefined_classes.txt,修改默认分类,如person、car、motorcycle这三个分类。
    4 b! g* Y# ~  g* i' h
    : Z/ W0 A# v: I$ s) j
    0 q+ |8 I$ c3 o
    “打开目录”打开图片文件夹,选择第一张图片开始标注,用“创建矩形框”或“Ctrl+N”启动框,点击结束框,双击选择类别。完成一张图片点击“保存”保存后,XML文件已经保存到本地了。单击“下一张图片”转到下一张图片。
    ; P( F" ?. y) }5 e" m; m$ {
    2 ^. j' |) |# E8 j
    0 t& D. B+ b8 n/ P+ z% L4 C- I% r
    贴标过程可以随时返回修改,保存的文件会覆盖上一个。8 O* V9 B- L  `9 ~& G% J) M

    % j! R1 {2 {3 _* s

    + T* ^, |7 ~( S$ Y, j完成注解后,打开XML文件,发现和PASCAL VOC格式一样。
    ) y4 ^) H0 y+ X/ U3 j4 d+ C! y1 @; V; s) E$ F

    ! p6 e! s! t/ z将xml文件提取图像信息/ t5 B% N8 }3 }/ X
    下面列举如何将xml文件提取图像信息,图片保存到image文件夹,xml保存标注内容。图片和标注的文件名字一样的。, S. |5 f, o. C3 o0 r2 O8 x

    - C6 x' r( X0 c5 {8 g
    ! y1 i  O3 r2 g: \& J0 s

    - ]$ q! D1 Y/ [% i% C% o6 m

    / l$ w7 i" `. U, |3 X下面是images图片中的一个。. b: P- z5 O; b( c$ u5 t5 F
    ( @! c+ A' n5 R0 d  b" {
    7 K" K- K. r1 k- u! i
    下面是对应的xml文件。" ^' R' h) G) X- P

    1 b  A( D, r' V$ _, `  l+ z, G; |
    + @7 m6 j9 _) B& a0 o
    <annotation>
    9 N  A5 U, ]+ j% ~; V        <folder>train</folder>+ H& `; I) O; {2 B
            <filename>apple_30.jpg</filename>5 N4 f3 m: a* y7 o8 D! U, @
            <path>C:\tensorflow1\models\research\object_detection\images\train\apple_30.jpg</path>
    * s" X6 C. Q& R" \2 A7 j7 N        <source># h( O/ h0 }! g3 Q
                    <database>Unknown</database>" p, f* G" A. R) @* K; K
            </source>+ c* [2 M% V3 ?4 t$ P6 T' e
            <size>/ R' U' \6 b( `- ~
                    <width>800</width>) H! A; H5 l) ?; S5 z/ |! A
                    <height>800</height>6 t4 a$ ?  c( [$ t9 R: `; \- a
                    <depth>3</depth>+ P" q* E5 c+ a0 y; ^" z- y
            </size>
    : c3 A( A& i: Z! A        <segmented>0</segmented>
    + Z1 Y; a# H3 s5 y5 l        <object>
    , Y1 n; o! {! J1 B3 G" l6 G                <name>apple</name>* S5 C: u) `; P6 f
                    <pose>Unspecified</pose>) f# P1 J8 |& T3 [
                    <truncated>0</truncated>. k3 d& a* [2 y8 }+ C1 e$ O9 w
                    <difficult>0</difficult>3 a. v, f5 N+ n$ l
                    <bndbox>9 O" ^( D' \/ t) C8 n3 r' G
                            <xmin>254</xmin>
    4 k. a3 [9 o5 Q+ t2 x7 M4 b                        <ymin>163</ymin>
    7 C& d8 Q( v& i( g1 T( N+ j! U                        <xmax>582</xmax>
    ' R8 \3 v1 q/ A5 a                        <ymax>487</ymax>6 u& D% q4 C3 }/ T% L
                    </bndbox>' U" ^' D* S0 g( A/ v+ @
            </object>. p: _0 z! H, C
            <object>! C+ E1 f; ^/ d* d4 M' C3 ~
                    <name>apple</name>
    - D; J- f' Q3 p3 X1 C" b                <pose>Unspecified</pose>
    * c- Q, N& J9 H1 w% }                <truncated>0</truncated>0 i9 s6 N* ?2 h/ j. q
                    <difficult>0</difficult>
    9 m; J; P; o, E/ {. t8 ^                <bndbox>; j4 {' l2 x4 @8 d! @+ U
                            <xmin>217</xmin>
    * Q; O! N9 R! F# ^, ?( r9 _+ D- {5 Y                        <ymin>448</ymin>
    + Z, Z$ d2 u3 ~6 `, R: m) M8 i                        <xmax>535</xmax>  }- q+ P( f* C# o' Q
                            <ymax>713</ymax>
    2 Z1 I2 q+ k- N2 v+ ]6 {) r( f7 G                </bndbox>
    ; A  w  `* e7 D( `3 |% T" [        </object>2 s6 c6 U$ S1 |1 T2 {' v6 ]
            <object>
    & j5 _& T/ L0 O9 L                <name>apple</name>, g! F# \' Q6 e/ ^$ z$ B2 F
                    <pose>Unspecified</pose>
    ! }9 Y! Q. J4 d                <truncated>1</truncated>3 Y( f, e( r3 ~9 R8 _4 K/ l
                    <difficult>0</difficult>$ b8 }, A6 x; P; @9 ]
                    <bndbox>
    8 g$ |# {! k# i5 `                        <xmin>603</xmin>$ R" W9 K& e' j
                            <ymin>470</ymin>% t% D5 T. T4 m6 m
                            <xmax>800</xmax>
    % a7 t( l' F2 `  S7 J                        <ymax>716</ymax>( F9 W, L+ U( T2 A& V
                    </bndbox>; G: ~: Y! z" V
            </object>. g: h( m2 X' L3 Q4 q
            <object>
    $ k& K) U+ E6 J2 B( D3 R1 R( ~4 |                <name>apple</name>" n8 ^# _  n+ f
                    <pose>Unspecified</pose>
    9 D/ X3 |; d. K                <truncated>0</truncated>
    / K2 ]) r: ^& X4 [6 O. k                <difficult>0</difficult>
    4 J: T5 K" _' ?                <bndbox>
    9 [0 [& T; R6 w$ U' c/ l                        <xmin>468</xmin>3 S7 x4 Y- o( l8 Y5 I, v
                            <ymin>179</ymin>$ {# [- S: p1 B7 Z# o9 X# [: @
                            <xmax>727</xmax>
    3 W: t. P0 h  G( Y( m* l                        <ymax>467</ymax>
    0 V" ~4 z- [2 S2 t                </bndbox>
    & q5 _" x/ v- L7 W0 X" A2 V        </object>5 `' V8 y+ Y4 c  I. X
            <object>* D9 L) g/ a0 c# {/ y) S
                    <name>apple</name>
    6 G  K9 |; G6 A  _0 g2 f0 w7 u7 R                <pose>Unspecified</pose>
    " O, P$ b9 A5 Y4 m6 O                <truncated>1</truncated>
    ( Y4 R( S/ h& S9 J$ z                <difficult>0</difficult>
    0 R6 P8 g+ p6 }3 H# E: u0 Z! [+ I                <bndbox>
    : i  e3 [) K9 \/ @" `                        <xmin>1</xmin>: O0 `9 K0 g& [$ @' O; l
                            <ymin>63</ymin>7 w& S8 \! z$ r4 e/ M
                            <xmax>308</xmax>2 v7 ]3 R$ R7 o2 N7 ~* F
                            <ymax>414</ymax>: F  u" y  d! j  E
                    </bndbox>$ B3 g4 s) `3 k. ^! P' v
            </object>% ?% }4 d8 }0 v. @' a
    </annotation>
    8 v* ?& b* y  U+ b3 L+ x4 q1
    ; a/ C# \& ^/ U$ j3 E2
    3 O) Q0 x6 X" e# j. g3+ H8 x/ U, ^# s( }" B8 q
    4
    2 p' U5 f1 p# o5
    ; s5 J/ N) t2 f; z7 N6
    / k7 [/ f  H/ {9 M# M2 U# |$ Q73 z( t# B9 V4 Z7 p& T; b
    81 M& S: O* F% O0 ]3 e
    9
    $ z- i) t! Z5 t0 h) C10, f2 j& I) k, k5 ]! _8 q
    11- d% t' k$ p) Y
    12
    % [, Z; y6 x- ]. h5 P0 Q: Q  Z137 d+ `: V! Z( y
    14+ a, r% r# g3 L
    155 L3 u+ V# n2 v! G2 m
    16% C+ R$ T% h4 C* I$ [4 @
    17- X2 ~5 u( x! @3 l- |' X6 v
    18
    8 e( x! T& [' B6 w: @( _' t/ O19. r# i: o4 [, T4 D1 v. g
    20" D9 p. I& H) Z/ }0 G1 L+ [
    21
    8 U7 \2 i3 Y0 ~3 \22. G& j! f; t8 @% R) M
    23
    $ h$ p# X2 F  m% h" @: N4 Q8 L24- R' A3 c" @: ~
    25
    : B% A' Z" f6 h( E8 Q26
    ; k9 I' m2 I7 }  D27) e2 `& y5 }$ Q8 Y" T( a
    28. a9 _7 n& F+ Z! F1 z2 }# J
    293 I6 y* ?8 y/ j, ~1 E* V& ~% O9 m
    30! {% a5 C1 U0 D) n' ?  {( e
    31
    ! m: \! H( M) i3 _) H7 u32, {5 ?- s+ Z- ?
    33
    5 {, j+ a' N2 {2 a" Y4 }0 E34
    " W0 a/ u: o! b# ^  v% I0 [35
    ! l6 h) ~6 b/ Y3 O+ Y36
    ( Q! G. g8 F( Q9 \# r) t371 A( Z* @9 N& C# q/ b
    38
    9 o6 d+ J& J/ {/ j39! }/ _* E. K3 j+ Q  G" y
    40
    + ~; q- }1 r" s+ V% }41$ l/ W5 G* g8 Y, R& @& |: P$ A
    42
    ' C  D. Y* [9 n2 a* t6 M43* t+ M4 @: Y0 V! N
    44% ]: k! C9 @* q& Q- p
    45" B% s& c- p8 K) H) A
    46* H0 Z! Y  _! S- T( E  C/ ?# `
    47! a9 Z1 g8 R4 `' f8 Q4 W
    48
    1 N  o* F& O0 k+ Z49
    : T4 p4 f* v% ~" x50+ _) i, ?1 Q4 u) G
    51! b8 h2 D, Z# V$ K6 C3 u
    522 i3 e5 V4 u2 `- ~  w
    53% ]4 L, }0 ^- `- X7 X& F
    54
    3 q' g) S& r6 `. i( i55$ l. w4 O4 F6 m3 g
    56* v+ o- w* L/ u! \+ K. E
    57
    - I/ e9 D3 t* t1 D# R58
    ) ~+ a: b. Z% n, M  o59( v4 e% x9 J- G3 `1 x
    60
    - ~5 w' e( a; U, k61* I2 V  n! F8 ]0 P$ O: j
    62
    - w+ ]7 j0 k! t0 R0 R8 v6 ]/ d' T63
    ; I) C6 P+ P5 |! r# t64
    9 D! c$ g$ v2 P. w65
    ( u3 P. u4 N0 J66
    6 j1 @: i5 [, |; Z1 G' u5 G% S1 ~- W67& _- w7 s+ d' M
    68- Z- w0 _: b+ N8 y& P
    69" x& S: x! M! `/ D  i& i0 u
    70; d: U0 \; P# p
    718 `4 `# E% J5 c- f
    72
    " T8 t! d; C. b  K" K6 ]735 _# }$ g: c4 w# Q% T+ D
    74- f1 \0 o6 C! u8 h1 V9 y/ ^
    将xml文件提取图像信息,主要使用xml和opencv,基于torch提取,代码比较凌乱。$ ]% `) R# G+ T
    $ d) R( O- w$ }. F, _
    0 U2 o* @2 b! @7 \4 I0 ^
    import os7 z: y' S. l! c; }; d: M2 t
    import numpy as np
    / u4 ~1 j9 b: W& Fimport cv2* U" n5 {) P2 }+ \, H6 W
    import torch8 d3 I7 n! b( \/ _5 M
    import matplotlib.patches as patches
    3 S4 x$ H4 C2 q. ~7 L% Cimport albumentations as A1 E) Y' Z4 g$ k. P
    from albumentations.pytorch.transforms import ToTensorV26 v" d3 Z5 L- P! v) u& h- J
    from matplotlib import pyplot as plt' P7 H; |' B1 \9 d% |- i# B1 }' M
    from torch.utils.data import Dataset1 Z& g/ ^9 u4 H: M2 q
    from xml.etree import ElementTree as et
    7 \: x! B8 O& R& Nfrom torchvision import transforms as torchtrans
    ' m0 P: {- I+ y2 E
    6 G4 a9 d; F. i8 e. k3 {4 b2 _

    / {  K: V$ l# ~2 h5 e) L# defining the files directory and testing directory
    - {- r: H8 ]6 i, F( |8 m; @* Mtrain_image_dir = 'train/train/image'% I' R3 ]3 b8 D: \
    train_xml_dir = 'train/train/xml'
    0 L, A  @) |) A7 e" x% d0 z# test_image_dir = 'test/test/image'" W8 L: K* O7 {3 A
    # test_xml_dir = 'test/test/xml'. G5 p$ L6 Z0 x  U" H' U
    ; n2 F, h( M6 b+ I
    0 T4 V% R  a% w1 [! A/ ?6 w
    class FruitImagesDataset(Dataset):6 t  L' i1 y5 ^/ l; Y4 y/ V

    7 g$ J1 ]1 C4 p+ {; z4 w5 J. p

    " S* E6 |& j4 ^! }3 O1 w    def __init__(self, image_dir, xml_dir, width, height, transforms=None):/ O1 ~( U' ^$ Q* q, h; H7 Z: r
            self.transforms = transforms
    : ]1 a/ j& Q4 _" n# x        self.image_dir = image_dir/ |5 e9 S1 L+ S& c0 c9 Z
            self.xml_dir = xml_dir
    $ P% M1 G8 x2 M& O        self.height = height
    3 b& }$ G: `8 C        self.width = width
    " F! b/ A: p! e9 R2 A( a
    . [% ?9 i  `3 b3 D" i
    . U# {/ h* k7 Q  F
            # sorting the images for consistency
    , n1 R5 f& [$ B$ F1 \- c# x3 {( v7 B        # To get images, the extension of the filename is checked to be jpg- V# B& y! P8 L  a4 f7 F
            self.imgs = [image for image in os.listdir(self.image_dir)
    3 w8 O2 f4 K! T$ Q5 f: v1 q                     if image[-4:] == '.jpg']
    ( |" a& \! G. R' e6 @& j. ~        self.xmls = [xml for xml in os.listdir(self.xml_dir)
    7 Q. K; @# P9 c% B. Y! \                     if xml[-4:] == '.xml']
    ! K; L3 {9 h& j4 j, M1 Q0 o- }" r4 J/ w3 G" O7 [& o& H0 b6 d+ R$ [

    # [# r4 t5 d! w: V7 m& P, ?1 G5 h7 h        # classes: 0 index is reserved for background
    ) N+ q& c  Q) m5 u7 |' ^        self.classes = ['apple', 'banana', 'orange']
    ( _3 |* B+ {/ N0 w% ^+ e: E% W: F  W9 F3 v0 l

    0 n4 x  A$ J9 X    def __getitem__(self, idx):, g( r# F3 c+ w) `
    6 E5 g6 u  ~: N% w2 X% z
    ) W$ `4 ~4 H$ {
            img_name = self.imgs[idx]1 S+ |! {9 n3 T4 B2 w' \
            image_path = os.path.join(self.image_dir, img_name)
    . w; p. O( @: A& T
    1 Q- [9 ]& J; s9 g0 O' I
    1 p8 `1 _# {. {' N7 Y4 Q/ e% l
            # reading the images and converting them to correct size and color
    . Q: m' s- R  ]        img = cv2.imread(image_path)5 I# l8 u+ i8 z) `& T, q9 {7 J
            img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32)
    * z6 J$ Q0 G; F9 M3 m. D* N4 m        img_res = cv2.resize(img_rgb, (self.width, self.height), cv2.INTER_AREA)
    8 d6 J9 i* o2 t5 k: Z        # diving by 255, ]$ F+ w/ a5 X8 U; E
            img_res /= 255.0
      U8 G- v0 p+ U! m" e9 v$ C
    8 `! K# s- L* E( f

    + L1 b0 X; i( D% D! N        # annotation file: T  a4 N0 C. x3 ]7 f
            annot_filename = img_name[:-4] + '.xml'
    8 J" u- e  }+ R  S0 @9 Q        annot_file_path = os.path.join(self.xml_dir, annot_filename)
      l5 v0 h7 c+ C; `; B" @! f( o, z4 `- X8 o: j/ N: }

    3 ^- N) C# R* o3 ^3 @        boxes = []  L9 k8 t4 z3 E" b/ m8 ^: p$ Q: d) P
            labels = []
      ~  Q, t, s5 U        tree = et.parse(annot_file_path)) k- @( Q* D; j
            root = tree.getroot()
    : E8 b4 [, Z. ]/ ^( p' g+ C3 G) I' T* P: O; D' X- [. {7 A
    # T6 E% |# z/ W8 O; J- O+ g
            # cv2 image gives size as height x width0 m' E) b1 J# |4 L; c# [! Z/ b& ]9 ?
            wt = img.shape[1]
    5 c- U1 G" v' T. {! a        ht = img.shape[0]. n, w( r1 T0 ?! K1 S. Q. K

    # y' R% D9 s6 D8 i5 R6 b4 `

    " N, @) Q: o3 D$ T" G$ L        # box coordinates for xml files are extracted and corrected for image size given+ v4 a+ Y# s: ]: G, X
            for member in root.findall('object'):. E% I2 T# x# N, ~  q: F
                labels.append(self.classes.index(member.find('name').text)), N, @( ~6 A9 D0 R. W: [
    0 E8 U% N) ?  Y/ U

    & X* v: T$ F8 c2 h2 [            # bounding box
    ' v+ C/ Q* V6 S( y5 m1 B            xmin = int(member.find('bndbox').find('xmin').text)
    $ G& s! [6 s! K5 }            xmax = int(member.find('bndbox').find('xmax').text)
      ^( A- B" ]& v0 y
    8 Q* y+ l( E* O8 M# K
    . c- O/ j9 B2 @- m: h/ Y4 w& M
                ymin = int(member.find('bndbox').find('ymin').text)% v! Q# c1 y2 s* y1 Y( E' _' F( C) }
                ymax = int(member.find('bndbox').find('ymax').text)
    ! t2 S5 B' w6 W8 [4 g6 N9 G
    . {5 ~3 J4 I# i1 k& k- T
    + {! q( Z; |) v# U3 w
                xmin_corr = (xmin / wt) * self.width/ r# o" n# D; j, f& b
                xmax_corr = (xmax / wt) * self.width8 f; C2 G" Q5 r0 \: K+ o
                ymin_corr = (ymin / ht) * self.height
    1 ?) R+ j/ _6 u8 i2 c8 c            ymax_corr = (ymax / ht) * self.height; O' l/ v/ J4 `5 E5 t
                boxes.append([xmin_corr, ymin_corr, xmax_corr, ymax_corr])1 j+ n: Z7 u* M
    7 f% I; h! _2 y7 Y5 T% G+ x1 x1 u0 t

    9 b$ u7 ^8 F$ J! e        # convert boxes into a torch.Tensor1 p  O6 X1 v( t4 ]; S( r9 T' d* L
            boxes = torch.as_tensor(boxes, dtype=torch.float32)6 c( M( G- P. m8 d

      b) q  i) f- d; t" q) J

    7 S' o$ N: V/ n0 K$ D. E        # getting the areas of the boxes  p6 k- ~( b8 r3 K* Q# a" f2 z
            area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0])
    5 Q" O1 w7 O, h2 F0 }4 e8 P
    3 C' h" I& a: h" f/ G4 ?1 k* \1 S
    $ B; k* b8 k* U: ]
            # suppose all instances are not crowd
    8 h# [8 z5 m! _7 s, \        iscrowd = torch.zeros((boxes.shape[0],), dtype=torch.int64)9 J. t7 ?1 v+ y; w9 L( ?
    2 I' c# ~1 g# _$ T8 }
    ' I0 X7 U& l+ L; _( W3 y& V
            labels = torch.as_tensor(labels, dtype=torch.int64)
    . X7 p4 f- M4 w' o( g* k6 ^5 v  ~0 z) K

    % F7 z- l1 ^- y/ e% u* {1 @4 ~        target = {}
    & F) [) s& a4 p9 |        target["boxes"] = boxes0 R9 }3 d  G, }
            target["labels"] = labels* }5 ~0 K' d0 F6 L) F5 ?) _6 w
            target["area"] = area$ k" @$ u% m* g
            target["iscrowd"] = iscrowd
    $ Q: T4 [' U7 }: b( |. ^        # image_id
    3 n' J& J0 n1 r. ~; L        image_id = torch.tensor([idx])  e$ v7 _. Q' |3 h
            target["image_id"] = image_id& _1 N: ^' x2 r& {; ^( _
    0 n; ]) u$ g- |& v8 t

    $ J7 ]- k) R$ ?: k, a4 S        if self.transforms:9 t7 ~/ F5 `0 V4 d! ?& U
                sample = self.transforms(image=img_res,3 T" h6 c! J* C. U& ?' @
                                         bboxes=target['boxes'],
    / Q+ D7 @' B) i, V) G& j                                     labels=labels)' U$ u  D# A; P( e% F2 a. Y

    1 p) I# p% z: ^  I- d8 K! J

    0 J- J8 T# g0 F# r% h; N            img_res = sample['image']# }0 O3 n) J3 R3 S# S7 |
                target['boxes'] = torch.Tensor(sample['bboxes'])
    ( Z, ~, n# R- I3 K+ g, }+ m4 q' g4 @6 M; L$ r- X8 B( Q, S7 l" M
    ( ^) V: d- ?# B
            return img_res, target
    * A( P' `+ N  j8 L
    * S9 {7 ?% d* f  _$ W

    - i& A1 V2 c8 [- c    def __len__(self):+ U& w& f  S+ s# ?
            return len(self.imgs)( o# ?" O; ]3 P; e& {% O, j+ s* V

    ' X* F7 T0 ?' E
    5 ~2 X3 X4 t7 V8 j, V
    # function to convert a torchtensor back to PIL image
    ! ]+ m% Y7 N: m+ _5 sdef torch_to_pil(img):0 [% R- ?: K& e" B0 d, q
        return torchtrans.ToPILImage()(img).convert('RGB')
    + v5 w1 d7 ^  N( {/ z! \* r" `
    5 H$ @3 d6 @. ?3 e
    5 h7 P4 h1 b, E" m
    + g1 G) A$ U8 {* |
    & T7 l6 j1 ^% f( n* A( I  T3 h
    def plot_img_bbox(img, target):  ]5 ~0 c9 ^. X3 h
        # plot the image and bboxes, v2 ~* ?" j# W& f# g
        fig, a = plt.subplots(1, 1); s8 c% e& ?; u$ g3 v" Z7 B
        fig.set_size_inches(5, 5). j9 Z9 I( {4 f) L
        a.imshow(img)
    $ R3 Z' r' v' c    for box in (target['boxes']):
    $ J: r$ B( X  N/ n! F* K6 U. W        x, y, width, height = box[0], box[1], box[2] - box[0], box[3] - box[1]
    4 w  d4 h. k+ @% k        rect = patches.Rectangle((x, y),
      z/ d8 e6 w% I                                 width, height,% d; Z* x3 X7 V( G: v1 L' g
                                     linewidth=2,
    + X# M' [6 p( [+ w                                 edgecolor='r',  _! O* _5 m/ ], `* u
                                     facecolor='none')
    " }7 }4 i: Q0 K7 Z3 y+ {& B
    # r5 {* f# B/ ]
    $ X, W' _0 Q& b
            # Draw the bounding box on top of the image8 W  h% l* V1 s% U  b. l
            a.add_patch(rect)% t0 R7 b2 I* S
        plt.show()
    1 L# r! o, D! G: c+ x4 a7 M( x1 ~! c1 Z

      T4 a7 V/ ~; N: \& h; ]# D% n( N, m6 A/ |3 d7 p5 I  a8 P

    0 C* f2 j( C5 E6 ]% ddef get_transform(train):& a: K$ g2 M4 _! o7 o  D. r6 b
        if train:
    - d! \  f0 z% M9 b! C& `        return A.Compose([
    ' M( i. X/ b5 C% t2 j6 W            A.HorizontalFlip(0.5),
    4 A& j7 h/ T, V6 W' `            # ToTensorV2 converts image to pytorch tensor without div by 255
    2 c& \) k' D4 c; b9 V0 l4 c8 x            ToTensorV2(p=1.0)
    6 w6 f$ P7 @+ Y/ m        ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})/ r/ X& Y# G0 [$ w
        else:+ X2 s) ]; j0 K1 g$ t$ l4 x
            return A.Compose([
    ! |9 z, a4 l, z8 c& g: K+ K+ b            ToTensorV2(p=1.0)4 C' b' D8 b0 h6 A* Q1 \
            ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})
    % n, ]- ^$ ~& d* u' U  O
    0 p- n. W# b* g9 d- |
    / e0 j3 {% V/ d0 [( o/ h$ t
    ! }( N) ]; I3 [2 C. t
    2 q; ]/ [7 S- Y% o

    & e) o. D$ T1 v- I' y0 E7 R, y

    ( n- i4 u. t# R2 v; V6 edataset = FruitImagesDataset(train_image_dir,train_xml_dir, 480, 480, transforms= get_transform(train=True))
    ( d6 A' u& R4 Y1 ^' s. D
    + l+ n( u* e. ~* l- P
    ! t& O' h# ^8 l2 f( S9 Q
    print(len(dataset))/ Y) v: H. E  g- e. l7 t
    # getting the image and target for a test index.  Feel free to change the index.9 Q  G* `3 K: X  v
    img, target = dataset[29]; G7 P) Q- S, |* r
    print(img.shape, '\n', target)
    ) |4 V5 \8 e1 R) _plot_img_bbox(torch_to_pil(img), target)0 w4 Y- I' d. a* o8 L8 P9 r2 H
    1/ u0 ]: P- d0 e: ?4 {# Y2 `
    2
    6 e" ^3 B% X; L9 m: g' A* K3
    ' m, D9 l" K0 v! @& s* U4
    # U3 `# d7 x+ t' t" y# E5
    # @; e% H: D7 c6: |/ M8 S0 k6 E- o/ ?% p6 U
    7
    7 {* Y( r6 ]! F% ^8% u4 p) S! s. U. J/ E! P/ y
    94 g& b! c4 l1 V7 r; o
    10- p' h' K6 x3 o+ ~: M
    11: {$ d3 t4 T4 n4 z; x
    122 X+ d6 {! b! t6 g+ H( {
    137 K% R# ^  R6 T  Y+ P
    14. ]! s# N! l0 p% t9 Q
    15! h3 ?8 ]: F, [1 M- Q
    16' |5 }" k* C8 q
    170 Q  h& Y, @3 w- l! G1 w9 j( n* r( i1 {
    18
    # P) \  W* h& n7 l+ r19
    . [- R1 R* `" Q( N( {( d20; l/ b' _4 i3 K- M* p$ x
    21# A: q8 P5 O+ a
    22/ X& q' G7 f2 @( _) [. k3 s
    23
    ; D1 b2 u+ Q& p; x1 {6 W( f24
    & W. C2 I$ T5 |/ z" }" P# Z25
    . k) V3 C' X! N7 c/ Z8 g" e( k" m26
    ) W* t, k0 V" x, p! ~# C274 x- C8 }8 ^) M4 T( v% ^; I
    28
    ( W# `% z3 a/ `( r3 U# g4 a1 z- }* d29
    & Z: @  @! v- N8 @5 d0 r; C( J30
    2 L: h8 W( e3 R31
    - y- u) q# Z; z* _' d32
    " R- R, ~% h& F; q9 J% U! n33
    # m" _6 l9 ]+ C! X/ N+ h34$ C# @) S: a8 Y. ?7 R& Q6 B2 K
    353 Z( Z: |8 w7 r; W( g" t
    36& R* w( u2 i, t. i
    372 `) u" Z$ z9 N* H
    38. q4 E5 z6 l3 z3 }; e9 F
    39/ K  `- h1 j2 }7 G0 G
    40, x. l; N1 g. q4 ^2 Z/ [
    41
    ! u* ?' e( ~: }( i0 u( l42
    ( E2 P8 S; R6 U  i5 i( |43( t0 \- V9 j4 |; r
    441 C  D0 Z5 ?5 \3 o' N
    45. B8 P  G9 w4 G8 t0 \
    46
    6 G" [: V$ A6 e: J8 b  d/ Q47# H$ l' ?. K9 H6 ?, ]! P5 j
    48& u* B% }! J5 y
    49$ l1 M6 G5 q* I" P' d8 c" }
    50$ T" A- X, ~$ O' t9 d+ y
    513 D* t- t* m' s
    52
    9 Y+ F1 C/ h2 @6 }53
      |& g$ w" c; J! r54, i/ }! v3 w3 H- ]8 W) t
    554 V; i7 V4 Z- e2 \7 l6 U
    56
    ! r/ q2 w- O5 _* P2 [' m! H57% _4 R% O% k8 P4 U
    586 D( ?, Q% `0 B, v/ e4 m
    59
    . [* G# R. M. U7 a" [8 V6 p60& k& T, `2 [& f  A3 r+ H, B: u
    61- s) w* \- o0 F" K8 P5 r' f
    621 _/ n! ~- |# ?; K2 o9 j+ M
    63
    $ k: ?8 A4 M  W  f7 P' r64; {% [' M# N0 x/ m* S
    650 D- i2 g1 I% {7 s) l* Z! G6 k
    66
    4 f1 \5 P; X* T1 t+ b* S1 l; ?' D1 x67. K9 N* r- l; L( @1 X! ^
    68" c- _8 |: N& o3 ]
    69
    3 q/ R- h# \* B; U70: L8 H, Q0 k! g$ o3 E* j
    71
    : b2 J) b3 E3 T4 q  u( o6 b$ w726 J  L0 S- F6 s- X
    730 X9 |3 ~% r' v  Y
    74( G" ^+ \: v  e7 ~( ~, h
    75
    0 a( V. C+ z0 o' R: V5 g/ {- I761 s) J  V9 H+ m; f
    773 _5 R% W9 q1 k
    78
    # E, j$ S2 j2 `8 p& H, C, ?796 z. m% H' e/ _6 q0 N7 Q7 B* }8 k& N
    80
    - w' ^+ J$ i6 W81+ ~  S' S' n( B
    82. w9 ?$ A) Q$ `" j
    83# P# \- X4 Q1 r* W8 x! w
    84) k  w( a! R+ o% G% [0 s* |* W
    851 |9 M" \) a- o* o0 N
    865 L! A' o+ l% e* r+ U& m
    871 S0 F' P% X& Z+ P& R
    88/ \, V! B; R/ Z  `
    89( {' ]' f6 U: B1 U& o7 @2 I+ u1 a3 K
    904 o6 X! R/ P$ b! c) s. s; q! [2 |
    91
    ( O8 z% r- ^7 W5 J92
    2 X. K" f5 e2 R' p& o93
    * X: G0 K% p& x4 Z" c# T* m94& S: v- D1 p1 [" C+ g
    95. I0 G6 n7 F0 y! l- e) Z- T
    96
    $ M8 i/ U8 g3 a0 {" C97
    0 p5 L  G: A! k8 o) \# g/ K98. e! ^  c" K/ v9 {/ q
    996 l: Q$ i& ]  z/ M0 ]1 ^1 X
    1001 C0 s* Q5 u6 `5 i8 e
    101! f( w: `' c& O* j& F3 C
    102. j( ]% k9 @+ c
    103
    1 z+ J  s- W  B2 i104
    1 R9 ^6 P* ], g4 i- }105! b6 |. c+ `/ D6 [: n0 L1 O
    106) @- b4 s4 l, ~& D3 j7 L8 Y7 X5 c
    1075 I# Y/ E" r4 e. c$ M+ M3 E9 k
    108( e6 W: v3 b2 `( r5 c/ {
    109( Z8 F- e1 _" m0 S
    110: F- C3 }! i1 a4 u( @; i
    111" E( J) |: h8 n$ D. r
    112. P' x1 N( n* z& R3 p
    1132 x. b- I0 N7 y1 o
    114; H- ]$ _6 b5 A0 b. M: e7 R! p- C
    115: b9 f6 M) U# L& h% t+ {
    116" U5 Q# |+ t+ _+ P6 r2 [$ |/ S
    117) i' Z% Q4 b; j( t* f
    118
    ! M+ C7 ^% \( s( K- e- h119) }  l: t  P1 w3 B6 F
    1203 |, |* y% z6 x5 d6 G7 Z) ^2 ^( q
    121
    5 d2 ]' w6 D, w2 O/ l# S+ Z122
    * V& h9 B* d" l5 R5 [9 |' A! R123
    * Z6 Y7 U. Y  m124
    ) N' T# W& u, `3 N; y: j2 D125
    2 ^/ Q4 B+ u; d! B( W% w  g126
    / C" |# Y& P: z3 ^8 s3 c3 i+ ^* s127
    8 N" W8 }/ ?# c. T3 V128
    % U4 H: Z, O# W. U4 i! ~' d- e129
    6 ]) x* p7 z; d+ m( z130
    1 N4 w! q+ A5 _2 M7 L131
    : e: K. r5 C, F/ }132
      {" s  g/ S' u1 P4 Z3 Q, ]% ]133
      q9 v& v2 [( O8 f  l2 S2 ~1340 F: [6 T% Y) J) Z1 I# ~
    135
    " b' a7 p7 C" f136
    * z- P$ k8 f8 H5 E* h137
      P& R- V  E: S% `3 F) Y" u/ {2 P138) Y0 }; D) @% T4 _
    139
    % }5 d' Y" v9 g" H% x140- H1 y2 ^. J! ]' P  F& U* `
    1415 e* @3 |3 j/ v7 M/ `
    142
    + E% ]. b6 t4 M9 \2 d1436 l2 l0 |1 F* T0 k% J/ l
    144
    1 D+ r" E# F0 b& c( n3 K5 \1455 y  c, f9 `# F" [8 T
    146. C0 S# D* T* a1 n
    147
    * W6 p" E7 K. n9 P' ]1 U148
    . {! K5 u3 M% ~% p/ p149
    / O$ B- B9 ^2 r150; ]& L. N/ l; n4 T
    151
    3 j% }7 M3 y; M) k1 @8 l% ]$ J152
    4 @  e4 b3 ]) |, b* ~. K8 \153; W' \' e6 |/ a9 N& T9 P
    154
    - p, n( `( ?0 ]8 E" ~6 c155! n2 ^% |" g5 L( m" ?2 _" m; K
    156
    9 q; ]( g8 ^/ W! [) N' m输出如下:$ x5 I7 `8 u* |& w
    8 }$ t0 u5 e3 I& j; C5 r7 v

    : U! {3 @$ ~4 q; [3 a, _" \torch.Size([3, 480, 480])
    5 H+ a* [% v* _ {'boxes': tensor([[130.8000,  97.8000, 327.6000, 292.2000],& j& \( u+ @& ]2 @4 ~& `! r
            [159.0000, 268.8000, 349.8000, 427.8000],8 ~8 @; J  c( @
            [  0.0000, 282.0000, 118.2000, 429.6000],
    1 ?  R; O" U( C3 k' L, e$ q3 P        [ 43.8000, 107.4000, 199.2000, 280.2000],
    / K) W2 P# o  R: P$ {        [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])}: {: B9 e  ]7 z$ ]
    12 `" f; x3 ^+ y1 n& b" ^) `, c
    27 r* `) J1 b3 H' q0 q
    3
    & R; C& ~6 }1 g4 M$ X4% S! K, O$ Z. D$ F3 C# l
    5
    1 ]3 H, F' B9 _! d. O6
    ' C: F' V2 @+ p7 v* h- G$ l0 K2 \8 n) p7 {$ N+ \
    1 h, y) l+ h5 M8 t8 {0 k' j
    & ~6 ], U+ w9 u4 b

    ( F# s" ]) n; k3 s* a% Z下载地址. j0 q+ b2 ~! H0 ]# X! l5 x
    链接:https://pan.baidu.com/s/1QZDgeYTHyAlD2xhtJqZ-Yw2 R  V" m; G; e5 i8 A2 h$ I1 A8 V  F
    提取码:srjn
    3 W. S, q0 U0 S. x2 _- _————————————————
    0 ]; {- _8 P5 x, p' {7 y版权声明:本文为CSDN博主「刘润森!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    3 `9 L3 r# O- J! ^原文链接:https://blog.csdn.net/weixin_44510615/article/details/1184962732 \; r5 G8 i8 W9 J3 ?

    / V! O. ?( d  @' g" h% w
    : D1 ]8 o$ l+ V; U: R8 y3 O" p7 ?0 K
    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-9-27 18:07 , Processed in 1.111355 second(s), 51 queries .

    回顶部