QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3071|回复: 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
    3 f* Y- P# {- V4 g
    深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
    . }* P7 S; _2 H图像标注主要用于创建数据集进行图片的标注。本篇博客将推荐一款非常实用的图片标注工具LabelImg,重点介绍其安装使用过程。如果想简单点,请直接下载打包版(下载地址见结尾),无需编译,直接打开即可!6 p( H% P/ v( D) r1 i' G$ v: A' A
    . ]0 ]; o" Z4 Y6 r2 b

    - _1 N. R6 a  _9 ]# T$ y感谢原作者对Github的贡献,博主发现软件已经更新,可以关注最新版本。这个工具是一个用 Python 和 Qt 编写的完整的图形界面。最有意思的是,它的标注信息可以直接转换成XML文件,这和PASCAL VOC和ImageNet使用的XML是一样的。- m" o: x" M  ]9 x; |, D% G

    . A3 |) j0 R. P& \( l( H2 {, H5 i9 ^# y
    $ U) C: P9 c6 T$ T4 _: {
    附注。作者在5月份更新了代码,现在最新版本号是1.3.0,博主亲测,源码在Windows 10和Ubuntu 16.04上正常运行。  q+ x! A) b& r) q/ E. F
    : s) {# P1 ]; \& B% u2 \% Z: T! B

    ) T# j* l& [" P( s具体的安装查看Github教程:https://github.com/wkentaro/labelme/#installation
    4 k5 {( ]- [1 u2 O1 E* n: D% v; `. x0 A5 R. d* y
    ) L9 U$ }2 _) P. }& X
    在原作者的github下载源码:https://github.com/tzutalin/labelImg& k) I# D8 A5 G+ u2 U. F, H
    。解压名为labelImg-master的文件夹,进入当前目录的命令行窗口,输入如下语句依次打开软件。& Q* S0 p: p! E! ^" S; ^( U. V

    6 F3 g) i1 }3 I. O
    ; K( a% e3 _7 {
    python labelImg.py
    ) n; w% b$ U7 L, `1
    2 F1 t- z/ j+ u5 m2 t- _
    2 d1 X" ]6 s, ]: Z+ j

    8 f; X1 x& s0 d) _+ d" F0 \7 \' _. F1 @( K; i# u
    . w. |( E$ i3 z8 k, Q; [
    具体使用1 j# U. J- N  ]2 \/ T1 E
    修改默认的XML文件保存位置,使用快捷键“Ctrl+R”,更改为自定义位置,这里的路径一定不能包含中文,否则不会保存。  T8 W3 t" p# a- M; q

    # X# `. e( e: U. X, b: c

    8 w' o" I/ {+ ]+ |使用notepad++打开源文件夹中的data/predefined_classes.txt,修改默认分类,如person、car、motorcycle这三个分类。
    . v' Z2 [" T7 H. I6 i6 d2 @; O1 L: |# l7 i
    3 H, ^+ i5 d5 T. C
    “打开目录”打开图片文件夹,选择第一张图片开始标注,用“创建矩形框”或“Ctrl+N”启动框,点击结束框,双击选择类别。完成一张图片点击“保存”保存后,XML文件已经保存到本地了。单击“下一张图片”转到下一张图片。6 D% k; w5 X# S: T* c. O
    6 X* ?9 o8 x9 J5 K2 T

    0 E: d, @# p) V3 a- d4 x贴标过程可以随时返回修改,保存的文件会覆盖上一个。
    5 o; ?9 Z1 V. }' z! y" ]
    7 b( K8 T& _; F9 j/ `- f/ Y

    4 V+ W/ j1 O# e+ o$ P- k# m" c& u完成注解后,打开XML文件,发现和PASCAL VOC格式一样。" i5 P* J$ y9 P! p. s
    $ w6 T4 \6 N5 Q) J4 X" U2 @$ P

    - r8 v5 l, O! e9 o! o& h$ T/ Z1 _, W; c将xml文件提取图像信息
    # A7 _) U& j2 d; K# [; a下面列举如何将xml文件提取图像信息,图片保存到image文件夹,xml保存标注内容。图片和标注的文件名字一样的。/ N& p9 z) \2 N

    8 [2 c: S6 d7 m7 V5 ]8 m" M

    9 P, E5 F* v  Z
    - A. n9 V3 m1 ?3 j, S
    3 ?/ {  h2 t$ M! X
    下面是images图片中的一个。4 A) A" X$ {8 P$ K8 }4 I
    1 F# K+ j  x- c: n

    * w2 A$ c7 U5 Y% {2 X3 u下面是对应的xml文件。
    0 J* N) J2 a! C" s2 u) |* `% W
    3 }: F* D; N5 g7 P+ j0 Y6 f

    & v- t9 D2 W7 B# _( b2 e0 }<annotation>$ H! r" }4 x& ~" F
            <folder>train</folder>& D& E5 |0 [! D' {
            <filename>apple_30.jpg</filename>
      P5 ]- z( o* u  b/ n0 U: ~, @8 X        <path>C:\tensorflow1\models\research\object_detection\images\train\apple_30.jpg</path>
    - a& ^7 F8 o" n        <source>
    / U! N0 e  Q% z                <database>Unknown</database>
    & ^& D. X3 g; u# f9 D5 A7 T        </source>& X* G- S  w' r+ }
            <size>: C+ Q  \( ]4 e! w+ R# p: N/ u
                    <width>800</width>
    * ~4 ^2 @! c3 b, W2 P                <height>800</height>
    1 Q- e! d% e, f5 j/ i0 M" t                <depth>3</depth>4 f* S; u) g! w/ O$ ~9 ^) c
            </size>) B" c% Q% r3 V  ^3 o
            <segmented>0</segmented># I$ Q1 Q3 L! u% c
            <object>; @0 T2 P. [0 C) M2 m1 z
                    <name>apple</name>
    . d9 a0 D/ h$ P' k! D6 r2 V( l                <pose>Unspecified</pose>
    ! ^$ g) d% k! u$ L/ ]                <truncated>0</truncated>
    ( I2 u4 |2 k# u, }$ X/ A' r' T5 O5 Q# T                <difficult>0</difficult>* C1 g& \: j) M0 P% a; T
                    <bndbox>" {# J; ?* y% J0 e2 v+ W
                            <xmin>254</xmin>. c# `- t& J6 T
                            <ymin>163</ymin>1 W- m/ [: F4 z9 D( N
                            <xmax>582</xmax>6 M; q; W: Y2 R
                            <ymax>487</ymax>4 x" p9 h! N. i% f. |+ K
                    </bndbox>: H& Z  d$ h. M7 ]
            </object>4 q$ O. y$ n% t  R8 k  b
            <object>; ]& c# A2 h" o- I, T& @
                    <name>apple</name>, @; E0 q  R9 H1 `4 G2 Z+ ^' C9 j
                    <pose>Unspecified</pose>
    ; b9 ?0 }9 }0 d# k9 P; E                <truncated>0</truncated>
    7 s) j6 g9 O0 o: K$ ]7 H                <difficult>0</difficult>
    % _4 \$ Q. c7 J/ j: o& U4 V) w                <bndbox>  {: z7 d+ Z- _* `+ L% J* ]% \
                            <xmin>217</xmin>
    + e8 `( l6 U5 U/ ^( v/ e                        <ymin>448</ymin>9 _0 m) ?$ d; ^; K" i+ E+ \
                            <xmax>535</xmax>5 u% S0 D, T: }) M* h9 [, R
                            <ymax>713</ymax>
    # G& _# q  H; r! |                </bndbox>; I: q" T8 D; Y& ?. o' I
            </object>* u) R$ f' ?: e2 N& t; t
            <object>
    4 n2 n$ i5 S! b                <name>apple</name>
    / _& Z7 f' w! N. I$ Z                <pose>Unspecified</pose>5 E" G0 C' `7 @$ |" Y8 j0 ]
                    <truncated>1</truncated>
    + J% p/ C$ l+ ^& U' ~" M; q, j                <difficult>0</difficult>! C' R: B7 K" t/ |% ~
                    <bndbox>+ c/ |$ J6 B6 R0 s) ~
                            <xmin>603</xmin>+ `6 F& p+ g* S" ?3 U
                            <ymin>470</ymin>8 T4 p1 U0 @$ p
                            <xmax>800</xmax>
    9 w) [( [* ?: [9 |8 D) j                        <ymax>716</ymax>4 k* ]" D* n1 M- @# J4 R
                    </bndbox>; d2 S! p" t3 Q! F
            </object>
    - l! c. q/ B/ \/ s        <object>
    * D) T: S9 h% x, K+ m" s                <name>apple</name>
    ) a. r$ W$ M0 [. K$ o! I9 k6 A/ ^                <pose>Unspecified</pose>1 n9 s7 F% |2 L
                    <truncated>0</truncated>
    6 v9 E: Z: C; X6 W% m; C( S- B                <difficult>0</difficult>' ]+ v  x; F3 l  O( n+ V: x# s
                    <bndbox>1 d; R4 O2 Y$ x
                            <xmin>468</xmin>
    1 I4 L  l( G4 u% `3 G2 z" E7 S                        <ymin>179</ymin>
    % I% T  }- k& s4 ^                        <xmax>727</xmax># b# ]9 L* w# a
                            <ymax>467</ymax>& `- v( ~6 Z5 S- W# E
                    </bndbox>; T9 B0 S3 J/ K7 B0 u6 K/ f
            </object>% N, z" D: C0 v0 o; p/ c
            <object>' B9 X/ m* l+ E( r/ _5 g7 n
                    <name>apple</name>
      j  `1 t7 q; ?  N! @$ V$ A9 a                <pose>Unspecified</pose>
      H* c+ ]+ z  t. R                <truncated>1</truncated>
    $ h# ], s; O6 s1 D+ X' v+ a! l; P                <difficult>0</difficult>2 t7 N/ D7 a" r
                    <bndbox>- U' u; B! k- a  K7 Y/ I9 @4 _6 q
                            <xmin>1</xmin>
    0 g! m: D( ?3 J                        <ymin>63</ymin>
    ! z/ ]8 S1 t. S                        <xmax>308</xmax>
    7 u4 i7 D; B% e$ q                        <ymax>414</ymax>' N# q7 T$ E5 m9 v2 e' W
                    </bndbox>
    7 `: _0 c  L: o" l6 s; V; m        </object>
    4 Z4 E' F' P# }. z1 ~0 T6 ]</annotation>
    9 P" b& ?7 K: b$ S2 q8 Q5 J! T! ]% F1
    % |8 y2 A' p5 s9 N0 f20 F7 Y0 e* k/ @( i
    3
    - H9 n7 R# W, n9 N% t1 i/ P4
    & [' X; ~0 Q8 |4 }! C5$ b0 c- n0 q! y& _* p' J
    6
    / G( S  J3 m3 U# `8 [( a7
      p, I! o; K5 t1 P/ X$ Z8( _  h7 b! w8 T5 s* g
    9
    4 g" L, ^% w# V$ h- @10; |% N! g" `+ f+ X) o
    11  I- t0 {0 w  u- v$ e
    12! L! Z" I/ e$ [  G2 ^
    13: D: [" F- O$ S; P
    14  W: k' J6 j$ R" m
    156 v/ h9 W/ K3 N1 s9 p
    16
    9 K! t, c5 G* E" x. k6 H17
    & K1 P) `' K2 l$ t8 i1 N: z3 B18
    7 w) j9 y: Z( N$ y1 v19: G9 d! R; {1 S" K, ^# k8 i: M9 k
    206 {  V1 R8 d% I- S  k
    21
    ! i$ {% @* R4 M* C22. }8 H9 p! T! Y' u% S4 l  u% c  y/ F
    23% Y+ _' I+ s/ z: T/ M- u/ |
    24# _2 ~+ d8 `3 p1 q& E
    25. x: x# h, v+ j. m7 k5 v2 i
    26$ I6 v7 H' [+ \9 D2 ?
    27
    4 {' x" s  t0 F8 C. q% p, o; ~28( |7 U4 z0 g/ q' p, d! Z; J
    29
    & Z( _0 W8 M( x% C9 J/ L* Z301 j( Y6 i* \5 ~+ r
    31
    ' n: o* k; s  l$ s4 ~' J  S% i32* ~1 I/ e. m, b0 @
    33- g/ \5 ]2 G. V: U
    34" i6 J; {& @# U% r: ]  d" C$ W5 [
    35
    0 \$ J/ X. L- r; L8 |, e365 m" r$ U, o# `% W# ?- }' `
    37# X4 i* e5 i  t1 Q/ X3 J1 L
    38
    # a6 C' J% p# J39
    " E3 A: w6 b! x& h+ h- l5 t40
    / T8 b  W9 d- {# Z: K41
    ; |8 a6 \$ k1 o42& H) B8 f' ^- i2 C% h. n
    43
    % M, E6 a3 y( R/ Y1 X44: t" A+ ?' m6 H$ d' E
    45
    0 \: ]5 a# A; C% Q( J46
    . P* a: p2 A7 Y) B5 L; d1 g7 l47! P  |( |7 g6 ]  d( ^: f
    48: }! E8 j& f5 p# z1 Y
    49
    6 u( {. t- j. y/ R1 Y3 P- T50; s1 w8 P) {/ F: B7 L9 Q1 [0 O4 l
    51
    0 [1 s9 L- }9 J0 F52
    8 u% D8 ~' y0 N3 S53
    5 y" B$ u' ?) i! x% p  |54
    & o2 d' \3 S$ w, D! q4 k- B- Z55
    ( l9 T0 q  y; S/ l% D3 q. L( j563 g8 D  j, Y1 q0 \5 l. ?, m3 R; v1 B
    57
    , e3 c' `8 m; o: c58( g2 m, t3 a& N9 y9 G3 k! _
    59' M5 X, u- T) z
    60
    7 Q: N; E: ^$ `3 i8 _- u  J61/ I9 |/ ]4 \( k2 m. q2 J
    62( e2 g0 Z1 M+ v( G% m5 T, {  F6 `
    63
    1 S% A" {5 b% d: \6 C64% k; v/ D; L1 }4 W4 d- o7 d
    65
    / ?3 z" Q1 Y- m0 w( T66; A9 P* S. h- U% i/ N+ k
    67
    7 g- s: J: ~  D) }/ K6 ^, Z68
      o# F/ C6 I8 W# M- b69! O3 U8 S! m% }& i
    70% ~( X& J5 \  H4 R- s) J3 z; b$ t/ W
    71
    & G0 P! E. y! Y2 v- [  k, T6 ?72
    4 y& }( y, b. c  n0 j5 I73
    6 O( V* P, D0 W$ a: `& y74. n8 @2 t0 O6 Y& G) C6 N1 w
    将xml文件提取图像信息,主要使用xml和opencv,基于torch提取,代码比较凌乱。
    0 I) D! t; A$ W, ~% a
    / ^3 s% [0 l' I

    ( K3 ?; M5 A% A) Jimport os+ i9 [% L5 \, Y# y) M9 j2 C, V
    import numpy as np5 d4 b5 ?' d  I. n3 p. T
    import cv20 A" t( x2 e8 N  K
    import torch. f: a# k) b( _7 T  w# ?
    import matplotlib.patches as patches/ i; P7 E5 Q' R. V3 A8 `( g
    import albumentations as A
    4 k7 P2 ^/ H" @from albumentations.pytorch.transforms import ToTensorV2
    : z5 _" A- Y) K' [from matplotlib import pyplot as plt
    ! I: D% f+ m/ r) tfrom torch.utils.data import Dataset
    * S+ R* g3 ~2 O& M1 K5 z7 kfrom xml.etree import ElementTree as et
    - O4 p8 [' C. v$ _from torchvision import transforms as torchtrans
    $ x( Y, n6 D( @4 h: |: g; Y3 ~4 a4 u- y* \- S. H& j3 q
    8 y6 M; K- u* M* [' N
    # defining the files directory and testing directory  J/ O2 T# S- X4 Q+ j" g0 j; b) ]6 h3 J
    train_image_dir = 'train/train/image'
    ; F1 ~' s6 @3 F, y! e4 Vtrain_xml_dir = 'train/train/xml'/ @3 H- U5 ~! j# Z! L
    # test_image_dir = 'test/test/image'
    8 r1 q1 }4 h1 ?+ T* x# test_xml_dir = 'test/test/xml'
    5 A2 s' g2 X" ^& r- }7 s0 R/ o- P* G  x

    : @" T1 S. F/ [/ H* Nclass FruitImagesDataset(Dataset):
    & t6 q* K& C4 L6 z8 B
    ) M+ Y! ]2 x' o/ Q2 m' n: F

    5 n. d/ N( C( w/ v4 u, y    def __init__(self, image_dir, xml_dir, width, height, transforms=None):0 v5 t+ J* J, h, e& _
            self.transforms = transforms0 H- t5 U; u" A/ r
            self.image_dir = image_dir
    - a6 q, I2 s7 C/ Q  M        self.xml_dir = xml_dir# U# T( q5 ?! y, t' F
            self.height = height
    ! }9 s, `" W3 f" N        self.width = width2 N: n: f0 c5 T  c

    5 K9 M2 z& V$ \. b, R& g( D2 b
    ( R  h8 P; ^% U, s2 c
            # sorting the images for consistency1 |' x3 `$ _. K/ s: |% `
            # To get images, the extension of the filename is checked to be jpg8 n6 B! d8 Y1 |
            self.imgs = [image for image in os.listdir(self.image_dir)
    + Q  [6 P( ~5 A! t0 I+ |                     if image[-4:] == '.jpg']. R) M4 u; z4 @+ J. c
            self.xmls = [xml for xml in os.listdir(self.xml_dir)6 G' W3 y6 c$ q$ m% y- j% I$ }
                         if xml[-4:] == '.xml']
    . s& D* p5 k" O
    1 Z& k0 J! I& Z8 T- m$ l

    % b3 W. ~3 Q  s7 u7 s8 j* u% o0 h1 R        # classes: 0 index is reserved for background
    ! `# ?* ^; h6 C% w5 \        self.classes = ['apple', 'banana', 'orange']
    # S: ~9 g4 L  ?* i& u5 v" t$ r0 s  ^  S! w" z# F% r# N
    6 E/ b' g9 |- D! v& J' x* B
        def __getitem__(self, idx):6 v- a+ m' ]7 G' L$ U- P" m( n: S5 @
    ' O) P  O6 V0 f) @
    3 h- s' t* p9 _% R$ Z$ J
            img_name = self.imgs[idx]
    ( ~; Z$ p0 L# ?7 y        image_path = os.path.join(self.image_dir, img_name)
    : ?2 W; r% A1 h) n: d* C* X% C2 T3 w" Q' K
    5 N7 g1 N9 f" `% B6 a; Q( |2 R2 _
            # reading the images and converting them to correct size and color5 i& P# p! W6 c; M' P
            img = cv2.imread(image_path)
    - G: E3 O7 F( \0 U5 j- H6 H        img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32)4 Q- \/ ^8 A: a$ R# O) t
            img_res = cv2.resize(img_rgb, (self.width, self.height), cv2.INTER_AREA)' `9 S, k) _$ C; b! [. m
            # diving by 255
    / h% L, T4 L6 L3 {        img_res /= 255.0
    , z, o5 c7 V1 ^! e$ p
      G& v- n! k: S# K8 {
    ( g4 O  C! C) z8 z& |  G
            # annotation file. x- P+ e0 D0 f  }" u8 g
            annot_filename = img_name[:-4] + '.xml', Z+ m6 {8 I3 w
            annot_file_path = os.path.join(self.xml_dir, annot_filename)6 u7 q: Y+ w" ?8 e
    7 u6 L! y" N1 m

    / X9 F8 `. q9 R3 f        boxes = []2 F1 Y; g: ]: I6 v" j
            labels = []7 b3 w7 E/ M9 v% A# P5 @2 ?
            tree = et.parse(annot_file_path)8 t0 M. h6 `- C# Q: D
            root = tree.getroot()
    7 ~" e& S  c) D7 b/ _/ ]
    # l; ?. V& T$ o5 f

    + q5 R; s1 }. N; U# }6 }9 ?        # cv2 image gives size as height x width
    9 v: g9 X5 Q0 f4 r/ {" D" ~- c( x        wt = img.shape[1]! O+ |' ^+ N  M( [4 {# M$ \
            ht = img.shape[0]+ Y+ ?6 {. E6 f/ F. A
    / N  S; L1 c$ S4 w. R

    " M& ^& y( S  {/ G        # box coordinates for xml files are extracted and corrected for image size given1 Y$ {5 p" [. s  n$ Y9 H% D
            for member in root.findall('object'):
    % e4 m  t2 G: ~            labels.append(self.classes.index(member.find('name').text))0 K" s% h" }. l+ o! w% o
    6 B9 T# [% G: L/ Y& i  \

    # p  x" V- T; B% J6 o0 b. F            # bounding box- C7 x4 f& j: }
                xmin = int(member.find('bndbox').find('xmin').text)5 e5 W% _. D. ~- `$ ^. j3 ?, o
                xmax = int(member.find('bndbox').find('xmax').text)
    0 q# Z% X( X6 K3 z5 @; p7 {8 |* m! f1 s9 e: S
    % \9 A9 o, h& U% J7 U* m; L
                ymin = int(member.find('bndbox').find('ymin').text)
    1 d  ^7 a- [  L            ymax = int(member.find('bndbox').find('ymax').text)
    ) C5 [! ?4 Z8 k- ^
    + Z2 I6 v# i9 ~- \" {
    % h6 P+ ^) O* k8 V+ T6 E0 v
                xmin_corr = (xmin / wt) * self.width+ @& _( ^# R- M/ ~7 Y7 \4 @8 n( P
                xmax_corr = (xmax / wt) * self.width
    ( `1 \$ M0 _1 N* Y' `            ymin_corr = (ymin / ht) * self.height4 }6 ?" K- `$ J+ Z/ E+ p% _$ l, s
                ymax_corr = (ymax / ht) * self.height
    ; q* f! J! P; R3 o' i' x            boxes.append([xmin_corr, ymin_corr, xmax_corr, ymax_corr])
    ! t, y1 n9 X) U! a' V& `5 O* `0 y3 H" Y, z
    % R$ X' v% t+ c0 r& Z  g
            # convert boxes into a torch.Tensor
    ' T- Y6 f! Q: z% ]# {        boxes = torch.as_tensor(boxes, dtype=torch.float32)
    5 c! ^1 U/ q( Z7 z; h0 k& m* O7 G: T( B% A8 L7 |
    ( W2 x  s( z* U  k/ ?
            # getting the areas of the boxes# f8 L/ P6 i- s) n  Q1 Z
            area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0])
    % }" A) h7 h+ Q* G* ~, M
    6 ]- k, L, C' z+ R: J+ j

    . `" J9 {, d9 P' f/ {9 l1 q2 a        # suppose all instances are not crowd
    9 }) N/ S7 C, \, Y' H+ |        iscrowd = torch.zeros((boxes.shape[0],), dtype=torch.int64)
    ; [4 r- @- d' Z$ V+ Y
    0 q  \% [4 I) ]8 p+ Y
    , Y  ?! D# W" v: \" L9 Y
            labels = torch.as_tensor(labels, dtype=torch.int64)* C- v$ Y: D) U3 o8 l

    # S. G- g/ P+ f

    6 u/ s; o7 h: F0 o$ ]+ L4 z6 @+ k6 Z        target = {}/ S1 M7 L- g2 Q( ]5 W$ Y3 M. g
            target["boxes"] = boxes
    & t) o6 |5 g4 U        target["labels"] = labels. V6 w/ o9 t+ L+ M" I
            target["area"] = area
    7 u, [  f9 \6 h        target["iscrowd"] = iscrowd' U( v' N4 x. K0 \( t0 e
            # image_id9 R% ?, a3 W# V5 ?# J) C
            image_id = torch.tensor([idx])/ Y) j5 F; H  D+ c4 ^& D
            target["image_id"] = image_id
    % o: O' H, f$ n: ?+ O: J
    ! K5 u: U! K' E3 a* f1 b* T" r9 V9 E( B
    9 e$ O9 A$ H9 G& X9 g: M$ n
            if self.transforms:0 `0 {2 ~- \. U$ n! X5 j
                sample = self.transforms(image=img_res,
    3 q$ S1 U5 j2 X* |                                     bboxes=target['boxes'],& S% d1 ~$ a3 y' F  ^8 h3 O% ?
                                         labels=labels)- `- g7 S0 c) N) A( x0 ^

    6 S8 G' z7 v' f0 p/ ^7 A$ }0 `; d
    5 ]! J# m: x% u1 c
                img_res = sample['image']( R7 _/ [1 H6 ~6 W6 p% d
                target['boxes'] = torch.Tensor(sample['bboxes'])
    5 e; J0 S# o( l3 W" L  L/ P* G0 x, D+ @" I; t

    - D0 j1 W: d$ c' P1 r% q7 g. N        return img_res, target% @- _$ h2 m  ]6 D- H5 \  Z& T( Y' o
    1 s+ x4 F  `% q: U# b/ \! b. P
    - _, [. r# o* E$ E
        def __len__(self):* o- p& a! o- L- J2 C- `3 D8 n
            return len(self.imgs)
    5 H0 j$ p+ d! R$ l& U5 b
    , L0 J& h6 U9 q) g6 C& K$ x, G

    ) }( n' ?" R' O& U! Q; v' k# function to convert a torchtensor back to PIL image
    7 ]3 E: G) U8 F5 H0 `def torch_to_pil(img):
    5 r. ~: J0 F, T7 k8 W+ I$ g& Q    return torchtrans.ToPILImage()(img).convert('RGB')
    ) e8 [( }5 b# q* C. x
    & Z# `& ]3 `6 K7 M
    . U# c' A) Q# b$ i

    # ~! w+ H) i  [/ P* P. J
    & t7 K3 k9 d, N3 I9 O7 y
    def plot_img_bbox(img, target):+ w1 D" W  h$ X$ C  h
        # plot the image and bboxes
    - C: X: ~, E% \  y5 n5 ]    fig, a = plt.subplots(1, 1)! w$ `4 K$ ?( k" Y
        fig.set_size_inches(5, 5)
    " o: B; m7 u' j4 m$ W    a.imshow(img)- U6 T' y, A0 L6 ^7 S
        for box in (target['boxes']):( |; {# `3 t, M! c4 f! `! Q& S7 L
            x, y, width, height = box[0], box[1], box[2] - box[0], box[3] - box[1]  c/ S  q% [. P1 x& E3 o
            rect = patches.Rectangle((x, y),: e2 g+ F/ b5 F# _
                                     width, height,! N! n  z8 j3 o6 T- J9 d
                                     linewidth=2,$ @' s& m+ l; [: Q3 @3 M! C
                                     edgecolor='r',6 o0 ?. t  f9 w+ a) Z
                                     facecolor='none')
    * t  N# k5 w; l2 T8 B3 H, v$ c7 F  z: Q! I) V! r
    & k* w. G# K/ {, z1 A
            # Draw the bounding box on top of the image
    " G* B3 Q- ?7 g) n        a.add_patch(rect)* @" T/ O* P& w8 a% H# X
        plt.show()
    2 {  _7 v5 u+ g% P7 v# e; x8 [: l6 p
    8 y4 j! C4 F  c7 Q1 `/ f# B7 M

    ; ~9 R% F/ N( ]) j- Z, e+ Z% |+ \! Q) R" y
    2 c: H8 v1 P5 Y. i0 ^
    def get_transform(train):
    0 q% [+ E) `, v6 l% {/ G+ |    if train:: A. n" C1 j4 y  Y. a# {0 b! }, B
            return A.Compose([4 q/ ~- B9 K% ?" D+ {0 p6 U9 k
                A.HorizontalFlip(0.5),& z( i; F, E: O
                # ToTensorV2 converts image to pytorch tensor without div by 2550 H) X, j6 b) I! @) r( `& v9 ]
                ToTensorV2(p=1.0)
    7 V2 h+ R5 d' f! w        ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})" q" o) k3 y9 [/ ]! L% F
        else:
    5 r; i% }, W3 Y% [2 o. K1 m6 N2 w        return A.Compose([  e; M0 n4 Q8 r9 {' r' x  G/ H. ?
                ToTensorV2(p=1.0)
    0 u" ?2 k% J  i        ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})
    , o, |' e6 u+ P  q
    2 c& F" z- W+ _1 O

    4 v7 D  P" b" B1 V8 o5 l& j) ~9 K. F6 i

    ( `% P; K( w/ {2 I, ?
    % M: O1 b" e8 z; u0 B& A% T
    1 Y( s) a6 g& Z1 Y. o5 }
    dataset = FruitImagesDataset(train_image_dir,train_xml_dir, 480, 480, transforms= get_transform(train=True))' [' V6 t3 S) ^
    5 }4 B- Z" g, I/ N9 l  B( _
    3 N' C) P' O' h, [. {" J( c  G
    print(len(dataset)), {9 I* [! i3 r6 H* N
    # getting the image and target for a test index.  Feel free to change the index.
    9 a0 _$ p& F8 N* n% n) Aimg, target = dataset[29]
      V2 J/ _5 \. G3 G' mprint(img.shape, '\n', target)
    ) O! @; [3 T# @3 e' X+ vplot_img_bbox(torch_to_pil(img), target)
    , V9 X  K7 \& a1" t+ b! _$ Z( M3 f% G3 G7 |. l
    27 n: b; c/ A$ ~3 Q  z
    34 |' X1 X& q* J. J
    4' q7 i4 x! C  {# Y: b
    5, z& R  @6 I1 a/ i
    6; o3 m3 K/ u8 u. Z# g' X) v, _4 z) j
    7, a( V3 Y8 I, r. T- X6 ~
    8
    ) n# Y/ k: G' E5 _" _$ O+ C99 ^: I  e# J7 Y' E; g8 {
    10: P  i* Z! |7 c0 F' w4 D3 ^
    115 F: ?8 C) U! Q6 j$ {& z0 w
    12
    7 C+ m! z7 \6 e! A" V4 K7 p* @13
    " o+ }) z& _2 @1 w8 O' c; b6 M8 h6 N5 s7 Y14, s: c, U: m; `* @* E( X1 M, ~' B
    15
    4 w. q8 q$ S, b: C& \1 S2 M16
    " M- v. U& s) Q/ D3 U  D$ d4 x17
    ( k* c, K1 h+ k  j  V9 ]18
    $ z9 V: W) H: E7 G- {19
    # V8 c! n. W- l$ D2 H203 r7 x( C: h3 ?9 P$ s
    21' o8 s) I5 |" a6 d9 p
    22
    9 |+ F1 k5 N- H5 a238 l0 v' Y3 u* y% e- m% _+ w
    24: k+ c. u) n0 T9 J, T% I
    25
    % {  ]: f9 r9 {& x. P5 z# E268 t9 H3 c! F1 I* x# R
    274 _; q4 o& B+ H3 j& z
    281 d$ }  \, @$ o
    299 ~; h1 l0 I. E
    30' Z1 {- x0 `, n) g
    31+ V6 g! W& ?4 V3 v8 J. _
    32+ a; W. Y! h& q4 o5 ~0 ?3 L
    337 G3 M* ~- S5 ~' T, O& |2 Q; N
    34+ o7 ^) r" J+ T5 N' n
    35
    $ w6 @) o2 ~9 ~4 P4 r8 u36/ ]- L  h: s5 Y% }5 T; D
    37$ W3 ^) X8 X, c5 ]/ X* Y
    38
    ) {" M/ q; T' p- z$ y4 z/ H9 t4 s39
    " E& Z* G& a6 U407 P$ p  _* q8 f' p& O: B! X& ~1 S
    41
    : W, R4 @3 L5 C. p' z42
    , s: d# ^( g0 N434 D0 H6 Y; U0 f1 H( S- ^0 J
    44- w  Q! `+ }) V; _* G$ v5 [% v
    45
    * p/ P" a5 n. _6 W46
    8 k( C2 N7 V8 f' i) {, R47
    - R6 [0 i  ^: o48
    2 u0 f# E; P8 b2 g  o3 S49+ Q- c8 h: Y; X* l8 {
    50, W$ }3 N5 f' J9 W4 K. x
    51& L, q0 N7 A2 h  m$ \/ k6 U
    52$ _; r* D# j* ?0 n& A5 A
    53
    5 r$ u8 F  v* G: e+ B1 G54
    1 l- h8 N5 H1 L, }2 }6 P; ]3 q55
      i8 A2 r* j+ F8 {5 W569 K) F3 z0 o  z( E' Z9 r% a5 J1 Q
    57) N; _* C  v+ K; Y( @
    58
    0 S5 b+ G* n" h/ [: e  f2 b591 _' I6 |; k1 v, W/ S
    60
    * k: \8 j; J, S$ V3 s5 d61
      E" c! C7 N* N/ d% K0 F& U62
    6 r0 O) Y, p9 s+ P. j  Y& U& D63, K' L% s$ Q8 T5 h! G
    64
    7 P" `! ]+ t- {" A7 U652 \! g8 F! [2 W
    66
    # H  ?2 O! m% H4 A% ~% ?' m9 {67
    7 p3 s/ s6 [0 o* t) x/ H5 e/ ~68
    0 j* ~: @/ g0 T  q% r69
    3 i* W, S6 a9 Z7 X  f; [! e8 ~0 {70( _# T) @, O! d# j( C( p6 e
    71
    ; O8 ]% ~9 r1 `9 C7 i2 a72
    7 C; |; s! f# _: J2 Y0 S736 t5 q; r# t! t
    74
    4 n9 L) U+ l% h75. ^5 r: }6 [3 i5 m4 W( a
    76
    9 [# ]; V7 U% w9 m2 ^5 `* Y0 u779 h6 U' T# n# s6 K& c( ^
    78
      A, J; q  J* I# m  ?0 l- J9 u79& v, ~% Y4 [* z. ]
    80" F6 L! p& v: j% V# H2 t
    81
    - W9 V6 E  z  n$ w* W% m" T& z82
    % \6 i( Z  O( A1 O; r83
    $ a) `4 W. ?  k; ~; W8 n$ e84# k; L$ b: b. @* N3 n7 v6 \. _
    85# t4 E9 v& S' b, D. v# D# `3 V
    86; t% ]' G# H3 L9 ]8 t: o
    87
    3 }) P. W, d& `$ C% a88
    . D5 H8 H; J! F5 C891 x- g1 v. D4 y* D; \
    90/ z& D6 h" m7 B, i; E7 ~: R) B
    91* \) N6 @# d7 O# I
    92
    2 W6 I, O$ D0 `93) ]) X! W* V8 Q2 t8 }
    94
    # _8 z9 Q( ~2 z8 O95
      e' ^* I; h+ j0 y8 A96/ V5 h# E& j* N- w, O! {1 X
    97* j5 ^- O6 |9 v- }& H
    98
    + l, T# r! F# D3 C99
    + c8 ^1 {' W, G* P8 P0 N& {& j4 M1006 U  q1 c( o, p
    101
    4 Y4 U$ N; {9 n" r  z; x102
    6 B( u1 i: Y2 q103* V2 ^" G9 p; d, b/ r
    104
    * g0 f6 Z2 q6 ~105
    9 n2 o3 |2 E# r- b% S$ [, G$ @6 j1069 g6 x3 L) G5 s7 j. i
    107
    , w1 s0 ~8 M! N108% Z/ B) y. C" R5 @* O
    109
    " W) U4 \8 r/ @- u% z" r1 `110
    4 }7 m. z6 |3 _  Y9 @: i2 f4 o$ `111
    0 Z' F3 M9 W7 \( }/ l112
    ! c* B" D5 c8 B' U, U+ n2 \1 `113. L. l5 r' S/ a6 V# j
    114
    % y4 i3 e0 w! n/ \9 o+ @: X+ u' e# b115/ y; I' p# X6 U. S, T, |0 U5 r$ @2 ?& S
    116% W, ~2 ?% i. j) z8 i
    117
    1 _1 V; x8 B* h+ J: i118
    4 N5 {1 Z7 @/ ^+ d1 C( K119( Z& D* Q- z$ P; h7 X) I4 ^
    1203 q( r2 n# @" X4 f3 K: Q2 C" C. q
    121
      T1 Z0 p+ ], B  O7 |9 U* o1 \; X1222 _4 {% ~  C1 j* ^5 R
    123* ^. p& s: Z% J( p! }% Y% I- A
    1247 Y8 d2 d6 _- r: Z
    1253 n) D  H% O. X$ O9 ~) a
    126
    4 i$ Y' t; _' A2 n& F1271 ^: I" g2 @+ B: \* z/ Q& i
    128
    & {6 [. Y; ~5 S- E129
    % d" H+ j7 B% G' r130, a" T2 s" N6 u
    131
    4 m/ B( p( T9 e8 v$ u. s, X- ~132) f# f5 [) H' J
    133
    ) T+ K+ p5 `0 p* l# G134! \" Q) x' t4 O  w4 ]$ N
    135
    6 [6 `6 \* j! l8 m% {8 p136
    # L, d. ]  M& U; U) G1378 F: x+ G! @. ]3 U' l# w
    138% X$ j! _% u: f" J  s8 v8 r5 m
    139- a: q- q$ D" I" q9 \
    140
    7 S& {' P& M' M3 O7 y3 k: u141' ^. H0 \' o! r0 q, W" x# w- D
    142
    , ?3 w6 b, ]/ d2 S4 i: d143
    " _! W8 N* c' `2 p! j. N144
    " h7 u$ |* ?, f. v3 {% q" u+ h1457 F/ P3 t6 `0 A8 l
    146
    0 y+ H& L. g/ G. B4 Y% Z+ P147
    ! ~1 d. ?, E( d% t, A' I/ Z2 [1487 F+ o% ^( G9 m; O+ S3 P8 X
    149
    3 D) s1 m. m$ h6 [7 x" J8 |0 X150" }9 Z) _) d1 N2 z4 e
    1512 \; M' ~, N0 j! r# b
    152
    # R" I: t" j4 O" ?) g8 i. p1530 u' B  W2 I' H" j. [$ J6 \& i' `
    154+ V4 b. W. ^* u2 a' z
    155
    ! \+ n1 e1 X' g1562 R; o* O! r* x) o5 F
    输出如下:3 q: N3 J/ e* c& B
    & ^+ G7 L2 g' C* r3 N

    9 e& ]/ _, A7 w, b1 Jtorch.Size([3, 480, 480])
    ( D& F) J4 w; n  D# w {'boxes': tensor([[130.8000,  97.8000, 327.6000, 292.2000],/ o7 B6 j3 b" @$ m( Y+ ]$ H) |
            [159.0000, 268.8000, 349.8000, 427.8000],/ U  f1 o7 B, P% z
            [  0.0000, 282.0000, 118.2000, 429.6000],
    " i0 O2 a9 l3 X7 n' `# C0 }        [ 43.8000, 107.4000, 199.2000, 280.2000],( r* X& A& w! n  R4 Z6 X
            [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])}
    # A+ u4 Q+ k+ A+ g, o" {* Q1$ W& Y7 P8 w- V. ?
    2# U7 |  s& `! v6 v0 F' M
    3( b* @; I2 O+ l
    4
    , c6 E2 G+ J5 Z3 U+ r" c! `56 z, y' W1 g: v
    6( O- S3 q1 O5 v. _# }7 [  U

    # F& }. T' v2 T6 P( _

    , G( H" i2 |0 g
    3 P. g8 [( Q0 ^/ c2 i2 m

    9 \1 m  z) z  ]% X% V" ]下载地址7 P( u* @2 ]3 D; Q+ r. G/ N
    链接:https://pan.baidu.com/s/1QZDgeYTHyAlD2xhtJqZ-Yw
    6 r: J3 b" q- `提取码:srjn8 J2 p: H7 Z/ s" ], V7 \
    ————————————————
    ( ^2 v2 ^- z/ k! ]- e+ f版权声明:本文为CSDN博主「刘润森!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 F* q. @6 q# w7 v4 y* [  O原文链接:https://blog.csdn.net/weixin_44510615/article/details/118496273; u& k! g& e+ S3 o7 X  f; ~  X
    3 I- ]5 F) {) R
    7 Z# j& {* C# I5 `$ {, U
    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, 2025-9-17 01:47 , Processed in 1.329233 second(s), 50 queries .

    回顶部